pax_global_header00006660000000000000000000000064133556647460014535gustar00rootroot0000000000000052 comment=b9012f1ade6a533c4101ac01d24fa048e11c57d4 .gitignore000066400000000000000000000007501335566474600130730ustar00rootroot00000000000000*.class # Package Files and binary distributables # *.jar *.war *.ear *.exe *.zip *.gz # Back and log files # *.bak *~ *.log # Build and doc directories # build/ apidoc/ javadoc/ **/build/ **/apidoc/ **/javadoc/ # Directories with intermediate files # i18n/fromLaunchpad/properties/ i18n/toLaunchpad/po/ netbeans/ # No redistributable Java bootstrap files # lib/bootstrap/*/rt.jar # Netbeans private and build directories # /nbeans/nbproject/private/ /nbeans/dist/ /nbeans/build/ CHANGES.md000066400000000000000000000435021335566474600124770ustar00rootroot00000000000000## Release notes for JClic (https://projectestac.github.io/jclic) ================================================================= ###Changes in 0.3.2.10 (05-Oct-2018) --------------------------------------------------------------------------------------- - Check core components in delayed event handlers - Process HTTP redirects also when protocol changes (from HTTP to HTTPS) - Linux: Avoid incorrect keyboard layout settings caused by the 'LANGUAGE' environment variable - Updated "launchApplet" script ###Changes in 0.3.2.9 (03-Aug-2018) --------------------------------------------------------------------------------------- - Check ZIP file integrity when saving projects - Write license tags to `project.json` in HTML5 export - Enable 'level' in URL media type (opens in _BLANK) - HTML5 export includes information about number of activities, media objects and size - Updated Catalan translation - Updated Java code formatting criteria ###Changes in 0.3.2.8 (12-Mar-2018) --------------------------------------------------------------------------------------- - New license chooser in JClic Author. Allows to choose between different Creative Commons models, or set it to "other" (to be detailed in `decription`) - JClic Author allows now to set custom icons for HTML export in three sizes: 16x16 (favicon), 72x72 and 192x192 - New fields in jclic files: `license`, `icon16`, `icon72` and `icon192` (see jclic.xsd) ###Changes in 0.3.2.7 (01-Feb-2018) --------------------------------------------------------------------------------------- - JClic Author "refresh media" button will not act on elements where the original file does not exist - The maximum recording time in "record audio" media elements has been increased to 3' (180") ###Changes in 0.3.2.6 (29-Oct-2017) --------------------------------------------------------------------------------------- - Corrected an error found when parsing the new area and level descriptors - Corrected an error found in JClic Author blocking exit without saving changes ###Changes in 0.3.2.4 (09-Oct-2017) --------------------------------------------------------------------------------------- - Java 7 required - New fields in jclic files (see jclic.xsd): - `meta-langs`: Language codes for wich a "description" is available. In packages published on the ClicZone, descriptions are usually provided in English (en), Catalan (ca) and Spanish (es). - `descriptions`: Since now, there was an unique "description" field. Now there is a collection of descriptions in several languages. - `cover` and `thumb`: Cover and thumbnail images, used to display the project in JClic libraries. - JClic Author can now import files previously exported to ".scorm.zip". - When opening a project, both in JClic player and author, meta-data is loaded from file "project.json" (if available). - Export to HTML5 has been optimized, looking for files with same name but different content placed in different jclic.zip files on same folder. - Re-organization of menus in JClic Author: now "Export to HTML5" has been moved fo "File" (from they old location in "Tools") ###Changes in 0.3.2.1 (05-Sep-2016) --------------------------------------------------------------------------------------- - Reverted the change of the URL of jclic.min.js in HTML5 export, now pointing again to clic.xtec.cat ###Changes in 0.3.2.0 (15-Jul-2016) --------------------------------------------------------------------------------------- - Add CORS headers in JClic Reports Server to allow direct communication with JClic.js running on browsers - A SCORM package can be created in HTML5 export. This kind of files will be used in the new version of the [JClic module for Moodle](https://moodle.org/plugins/mod_jclic). ###Changes in 0.3.1.1 (28-Apr-2016) --------------------------------------------------------------------------------------- - Write `animated` flag in MediaBag elements (needed for JClic.js in order to optimize the detection of animated GIFs) - Changed the URL of jclic.min.js in HTML5 export, now pointing to the [JClic project in JSDelivr](http://www.jsdelivr.com/projects/jclic.js). The new URL is now: `https://cdn.jsdelivr.net/jclic.js/latest/jclic.min.js` ###Changes in 0.3.1.0 (09-Dec-2015) --------------------------------------------------------------------------------------- - New option in JClicAuthor: Export to HTML5 using [jclic.js](http://projectestac.github.io/jclic.js). - _Export to HTML5_ generates also a `project.json` file suitable for activity repositories created with _JClic Repo_ (see [https://github.com/projectestac/jclic-repo]) - JClic needs now Java 1.6 or later - Correction of GitHub issue #5, related to URLs pointing to filenames containing whitespaces - Added `maxRecursion` and `maxFiles` to `FileSystem.exploreFiles` to prevent hangs in large file systems ###Changes in 0.2.3.4 PPA (13-16 Dec-2013) --------------------------------------------------------------------------------------- - Added a `dist/linux` directory, containing files needed to build PPA Debian packages: man files, bin launchers, desktop files, SVG icons and misc /debian control files. - No modifications have been made on the source code of JClic, but `build.xml` has been updated to indicate UTF-8 as default encoding in javac ant task. ###Changes in 0.2.3.4 (29-Oct-2013) --------------------------------------------------------------------------------------- - Correction of bugs affecting JClic Author: the program freezes when saving after making edits in the fields of the "Project" tab. - Correction of a bug of Windows uninstaller: the program was not completely uninstalled because one file (reports.ico) was not removed ###Changes in 0.2.3.3 (28-Oct-2013) --------------------------------------------------------------------------------------- - The official JClic JAR files released in http://clic.xtec.cat are now signed with a new certificate issued by the Catalan Agency of Certification "CATCert" (http://catcert.cat). This has no effect in the source code, but requires a small change in the version number to allow refreshing of Java Caché. ###Changes in 0.2.3.2 (07-Oct-2013) --------------------------------------------------------------------------------------- - Implementation of "JClic System Libraries": System admins can now define libraries of JClic projects as a “System setting” for all users of a specific computer. The system libraries can be managed by command line, invoking: `java -cp jclic.jar edu.xtec.jclic.project.LibraryManager -[option] [name] [path]` - JClic source code moved to [https://github.com/projectestac/jclic] ###Changes in 0.2.3.0 (23-Sep-2013) --------------------------------------------------------------------------------------- - JClic needs now Java 1.5 or later to run, because some accessibility functions are only available from - this version upwards. Previous JClic versions were targeted to Java 1.4. - Correction of bug 1249: Incorrect reporting of activity results when the maximum number of attempts is achieved. - Correction of bug 1414: Error in JClic applet with https protocol - Correction of bug 64: Help window of text activities display in disabled colours - Correction of bug 53: Saving existing activity with new name - Correction of bug 172: The deletion of all activities of a project blocks JClic author - Implementation of feature request #1591: Allow to replay the sound hosted in the initial message - Changes in ReportServerJDBCBridge to set default behavior to MySQL instead of MSAccess - Changed BrowserLauncher to BareBonesBrowserLauncher to solve a problem with browser detection in MacOS - Support for Venetian (vec) and improvements to other languages. - Image4j (BMP import) updated to version 0.7 - Catch unexpected exceptions when using PulseAudioClip in IcedTea - New "protocol" parameter allowing JClicReports to run in https - Changed logos and references of the Catalan Ministry of Education "Departament d'Educació" to "Departament d'Ensenyament" (main sponsor of the JClic project) - Initial integration into the source code of the "Fressa" accessibility features, developed by Jordi Lagares. Some of this features will be operational in the next major release of JClic. - Correction of bug: JClicAuthor hangs opening a file when an I/O error occurs - Updated `build.xml` - Event sounds converted to 16-bit PCM WAV format (instead of MP3) to avoid problems with OpenJDK - Custom fonts now are rendered when JClic runs on Java 1,6 or later - Java platform update: JClic requires Java 1.5 or later - Many source files updated to be compliant with Java Generics - Correction of bug: JClicReports hangs when activity or project name exceeds its maximum field length in database. ###Changes in 0.2.1.0 (25-Jan-2010) --------------------------------------------------------------------------------------- - New and updated translations - Windows installer: Added the parameter "-Xmx128m" into the command line of the JClic Author shortcut. - Java WebStart: Added the parameter "max-heap-size=128m" to the JClic Author JNLP script. - JClic AUthor: Memory management has been improved, specially in JClic AUthor, to avoid unexpected crashes. Now the java.awt.Image objects stored in the MediaBag are often cleaned, and reloaded only when needed. JClic player and Applet have also improved memory check and garbage collection. - Fixed bug 129-326: Arabic and other right-to-left writing languages are now rendered correctly. - JClic Author: Large images can be automatically scaled-down when imported into the media library. The maximum size is set by default to 800 x 600 pixels, but this setting can be changed in user's preferences. - JClic Author: The cell properties editor allows to directly import images and other files into the media library (improvement suggested by Camille Manoury) - JClic Author: When creating new activities, prompt again errors like empty or repeated name (improvement suggested by Camille Manoury) ###Changes in 0.2.0.6 (25-Feb-2009) --------------------------------------------------------------------------------------- - New and upgraded translations - Support for ISO-639-2 three-letter language codes, like Asturian (ast). Now this languages can be declared in src/utilities/edu/xtec/util/Messages.java in order to be listed in JClic settings dialog. - Initial implementation of new accessibility features that make use of java.awt.Robot - New button "Clear text styles" in JClic Author, to facilitate the cleaning of manually applied character attributes - Unified base domain of external URLs to "clic.xtec.cat" instead of "clic.xtec.net". In the past, we have a merge of both. - Changed the behavior of links of type "Go to activity". Now this links will preserve the user's navigation history, allowing to return and go back. - Development tools: Forms are now edited with NetBeans 6.5 - ReportServer uses now the server's date and time to store session data, instead of the one reported by clients. - Windows installer: now in 14 languages, built with NSIS-Unicode ###Changes in 0.2.0.5 (16-Jun-2008) --------------------------------------------------------------------------------------- - Updated Basque and Russian translations ###Changes in 0.2.0.4 (11-Jun-2008) --------------------------------------------------------------------------------------- This is a maintenance release. - Added translations to new languages: Italian (full) and Russian (not yet finished) - JClicAuthor can now run as an applet. Tha file dist/jclic/author.html contains an example of this modality. ###Changes in 0.2.0.3 (03-Apr-2008) --------------------------------------------------------------------------------------- - Support for QuickTime 6.0 has been suppressed in JClic. Users of Mac OSX can still make use of QuickTime for Java 6.1 or later. - JClic runs now on Java 1.4 or later. JRE 1.3.1 is no longer supported. This avoids the need of provide specific modules for the basic Java XML API (JAXP, DOM and Xalan), because they are already included in the Java 1.4 specification. JDOM 1.0 still remains as a external module needed by JClic. - Changes in the source code, in order to make it fully compilable without external non-free dependencies: The binary files QTJava.zip, jclicjmf.jar and servlet.jar are no longer distributed with the source code of JClic, because of licensing issues. In order to make possible the build process, empty and partial stub implementations of QuickTime for Java, Java Media Framework and JSR-154 (Servlet 2.4) APIs have been included in the "lib" directory. All this stub implementations of the libraries are used only at compile time, and are not included in the binary files obtained as a result of the build process of JClic. - ANT extensions are no longer needed to build JClic. The password for the key store file (needed to digitally sign the JAR files) is now provided through a include call to the file ~/.ant-global.properties. - JDOM is now compiled without X-Path functions. This features, not used by JClic, require binary JAR files at compile-time. - The file jmfhandlers.jar, used to avoid unnecessary http connections to the server during the initialization of Java Media Framework in applets, has been suppressed to avoid copyright conflicts. - The GIF Encoder library by Rana Bhattacharyya, and the BMP importer by J.Osbaldeston, have been removed. Now the graphics presented in JClic Reports are dynamically generated in PNG format by the Java ImageIO library (included in Java 1.4). The import of BMP files is done by means of the Image4j library (http://image4j.sourceforge.net). - Important changes have been done in the final packaging of JClic. Since this version, only three JAR files will be generated: * `jclic.jar` - Contains all the ingredients needed to run JClic Player and JClic Applet * `jclicauthor.jar` - To be used in conjunction with jclic.jar. Contains JClic Author. * `jclicreports.jar` - Also to be used with jclic.jar. Contains the stand-alone version of the JClic Reports Server. - In addition to this three files, `jclicreports.war` and `jclicreports.ear` provide the Servlet version of JClic Reports Server. - The build.xml file has been changed in many ways to reflect all this changes in the source code structure. - Added two new skins: "Mini", for embedding JClic projects in blogs and other web pages with small space available, and "Empty", without buttons, counters nor message boxes. - The cell marker is drawn only when there are more than one cell to solve. In multiple-answer mode, the first valid option is always displayed when the activity is finished, even if another valid option was entered (useful for natural spelling exercises). - Applets can now handle project installer scripts (files with extension ".jclic.inst"). This allows to perform "one-click" installations of remote JClic projects without using Java WebStart. To use this feature, edit your project with JClicAuthor, generate the installer script (Menu "Tools-Create project installer...") and generate the applet ("Tools - Create web page..."). Then edit the "index.htm" file created in the last step, find the line that starts with "writePlugin" and change the project's file name ("yourproject.jclic.zip") by the installer one ("yourproject.jclic.inst"). - New translation system hosted in [Launchpad.net](https://translations.launchpad.net/jclic) and new translations: Basque, Greek, Danish and Turkish. ###Changes in 0.1.2.2 (23-Feb-2007) --------------------------------------------------------------------------------------- - Corrected bug #41: "Conditional jumps between sequence elements are not always working as expected". Conditional jumps now are working also in the test window of JClic Author. This will simplify the design and testing of projects that make use of this feature. - Corrected a bug in the algorithm that computes the global score. - Corrected some minor mistakes detected in the German translation of JClic. ###Changes in 0.1.2.1 (23-Oct-2006) --------------------------------------------------------------------------------------- Three main changes have been done: - Feature request #68: In the reports system, the 'content-type' header of the HTTP responses is now "text/xml". This facilitates the integration with PHP-based applications, like Moodle. See http://projectes.lafarga.cat/projects/jclicmoodle for more information about a project that makes use of this feature. - A new automation module, called "TagReplace", has been created. This module allows to substitute designed tags written in text elements by its associated values, indicated by means of an external text file or URL. - Feature request #45: JClic Author can now transfer activities between different JClic projects. The "Import activities" feature allows to add to the current project activities taken from another one. ###Changes in 0.1.2.0 (22-May-2006) --------------------------------------------------------------------------------------- This is primarily a bug fix release. The following bugs have been fixed: - 38: Data lost when editing crosswords. Was caused by a cleanup of excessive cells, incorrectly applied to Crossword activities. - 51: No way to set dragCells property - 52: No way to set UseOrder property. Now it's possible to set/unset this boolean properties from JClic author. The check boxes are in the "Options" tab of the Activity editor. - 42: Changes to the parameters of conditional jumps are not retained. Now the edition of this properties, located in the "Sequences" tab of JClic author, work as expected. - 83: Custom event sounds ignored in media dependency check. Now custom event sounds are correctly handled by JClic author, both when specified for the whole project or for a specific activity. In addition, changes to the project global skin are also shown in the test activity window. - 103: User's password not saved in JClic reports. The "edit user" and "create user" forms have been modified, so now the password can be set in JClic Reports when creating a new user, and modified or erased later. - 46: Windows installer create icons only for the current user. Now the installer defaults to create shortcuts and icons for all users. CREDITS.txt000066400000000000000000000075341335566474600127500ustar00rootroot00000000000000JClic: Authoring and playing system for educational activities Generalitat de Catalunya - Departament d'Ensenyament Main site: https://clic.xtec.cat Development: https://projectestac.github.io/jclic New HTML5 player: https://clic.xtec.cat/repo Contact: clic@xtec.cat Developers: Francesc Busquets (project leader) Albert Llastarri With the support of: Sara Arjona Fernando Cuartero Community support: Monica Grau Imma Palahí Isabel Oussedik Translations: Deustch: EDUCATION HIGHWAY Innovationszentrum für Schule und Neue Technologie GmbH Linz/Austria, http://www.eduhi.at Gemeinsam mit: Astrid Leeb Ingeborg Kanz Monika Andraschko Caroline Weigner Galego: Edugaliza (http://www.edugaliza.org) Français: Gilles Parenna Português: Alexandre R. Soares Português (Brasil): Hugo Sunayama JClic uses code from the following projects: JDom The JDOM Project (http://www.jdom.org) Apache-like license Browser Launcher Eric Albert, Markus Gebhard and Jeff Chapman (http://browserlauncher2.sourceforge.net) GNU Lesser General Public License (LGPL) JavaLayer and MP3 JavaSound SPI JavaZOOM (http://www.javazoom.net) GNU Lesser General Public License (LGPL) JOrbis ymnk - JCraft (http://www.jcraft.com/jorbis) GNU Lesser General Public License (LGPL) Tritonus Tritonus project (http://www.tritonus.org) GNU Lesser General Public License (LGPL) Image4j Ian McDonagh (http://image4j.sourceforge.net) GNU Lesser General Public License (LGPL) Special Thanks: Dina Abizanda Ismail Alí Jaume Bartrolí David Beltran Blanca Besga Tona Castell Jordi Castells Fina Dènia Margarita Fortuny Galego21.org Miren Garralda Eva Gea Juanjo Gómez Luz González Alexander Herzfeld Santiago Manrique Moncho Marín Juan José Mateo Toni Miquel Orixe Taldea Imma Palahí Manolo Paz Josep Pi Antoni Prim Jordi Quintana Pedro Reina Luis Rodero Rafael Rodríguez Ferran Ruiz Joan A. Solano Sun Microsystems Susi Tello Núria Torrents Montse Vega Martí Vergés Jordi Vivancos Caroline Weigner Jordi Mas ----------------------------------------------------------------------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program (in a file called COPYING); if not, go to http://www.gnu.org/copyleft/gpl.html or write to Free Software Foundation, Inc. 59 Temple Place - Suite 330 Boston, MA 02111-1307 USA ----------------------------------------------------------------------------- Source code to this program is always available in: https://github.com/projectestac/jclic JClic is built upon other free libraries. Most of these libraries are not distributed under the terms of the GPL, but rather some other free, GPL-compatible license. Specifically: JLayer: LGPL JOrbis: LGPL JavaZoom MP3SPI: LGPL Tritonus: LGPL JDom: BSD/Apache style Crimson: Apache 2.0 license For more information, see the documentation inside each library's source code directory. ----------------------------------------------------------------------------- See INSTALL.txt for compilation instructions, and HACKING.txt for information about the internal structure of JClic and the organization of the source code. ChangeLog000066400000000000000000002126751335566474600126700ustar00rootroot000000000000002018-10-05 Francesc Busquets * src/core/edu/xtec/jclic/Player.java: Check core components in delayed event handlers * src/core/edu/xtec/jclic/fileSystem/FileSystem.java: Process HTTP redirects also when protocol changes (from HTTP to HTTPS) * dist/linux/bin/jclic * dist/linux/bin/jclicauthor * dist/linux/bin/jclic * dist/linux/bin/jclicreports: Avoid incorrect keyboard layout settings caused by the 'LANGUAGE' environment variable * dist/jclic/launchApplet.js: Updated launchApplet script 2018-08-03 Francesc Busquets * src/author/edu/xtec/jclic/AppletHtmlCreator.java * src/author/edu/xtec/jclic/AuthorSettings.java * src/author/edu/xtec/jclic/bags/MediaBagEditor.java * src/author/edu/xtec/jclic/bags/MediaBagElementEditorPanel.java * src/author/edu/xtec/jclic/project/ProjectInstallerEditPanel.java * src/author/edu/xtec/util/JDomTreePanel.java * src/core/edu/xtec/jclic/PlayerSettings.java * src/core/edu/xtec/jclic/fileSystem/FileSystem.java * src/core/edu/xtec/jclic/project/JClicProject.java * src/core/edu/xtec/jclic/project/ProjectLibrary.java: Check ZIP file integrity when saving projects 2018-06-11 Francesc Busquets * i18n/fromLaunchpad/po/jclic-activities/listactivities_ca.po * i18n/fromLaunchpad/po/jclic-author/AuthorMessages_ca.po * i18n/fromLaunchpad/po/jclic-core/JClicMessages_ca.po * i18n/fromLaunchpad/po/jclic-installer/installer_ca.po * i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_ca.po * i18n/fromLaunchpad/po/jclic-player/PlayerMessages_ca.po * i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_ca.po * i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_ca.po * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties * src/core/edu/xtec/resources/activities/listactivities_ca.properties * src/core/edu/xtec/resources/messages/JClicMessages_ca.properties * src/core/edu/xtec/resources/messages/PersistentPathsMessages_ca.properties * src/core/edu/xtec/resources/messages/PlayerMessages_ca.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_ca.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_ca.properties: Updated Catalan translation (issue #25) 2018-03-13 Francesc Busquets * src/core/edu/xtec/jclic/project/ProjectSettings.java: Write license tags to project.json in HTML5 export 2018-03-12 Francesc Busquets * xml/jclic.xsd * src/author/edu/xtec/jclic/project/ExportTaskDlg.java * src/author/edu/xtec/jclic/project/ProjectSettingsEditorPanel.form * src/author/edu/xtec/jclic/project/ProjectSettingsEditorPanel.java * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties * src/author/edu/xtec/resources/messages/AuthorMessages_es.properties * src/author/edu/xtec/resources/messages/AuthorMessages.properties * src/core/edu/xtec/jclic/bags/ActivityBag.java * src/core/edu/xtec/jclic/project/ProjectSettings.java: New "license", "icon16", "icon72" and "icon192" fields 2018-01-01 Francesc Busquets * src/author/edu/xtec/jclic/bags/MediaBagEditor.java * src/author/edu/xtec/jclic/bags/MediaBagElementEditor.java * src/author/edu/xtec/jclic/bags/MediaBagElementEditorPanel.form * src/author/edu/xtec/jclic/bags/MediaBagElementEditorPanel.java * src/author/edu/xtec/jclic/media/MediaContentEditor.form * src/author/edu/xtec/jclic/media/MediaContentEditor.java * src/core/edu/xtec/jclic/fileSystem/FileSystem.java * src/core/edu/xtec/jclic/fileSystem/ZipFileSystem.java * src/core/edu/xtec/jclic/media/AudioBuffer.java: Increased max time in record audio and optimized "refresh media" action 2017-10-29 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSingleFrame.java: Corrected an error found in CheckSaveChanges 2017-10-26 Francesc Busquets * src/core/edu/xtec/util/StrUtils.java: Corrected an error found when parsing the new area and level descriptors 2017-10-09 Francesc Busquets * src/core/edu/xtec/jclic/project/JClicProject.java * src/core/edu/xtec/jclic/project/ProjectSettings.java: Ability to import ".scorm.zip" files 2017-09-13 Francesc Busquets * src/*: The tree of 'src' has been simplified, now with only 3 directories: core, author and report * src/*, dist/jclic/jclicplugin-applet.js, dist/jnlp/*.jnlp: Java 1.7 required * src/*: Type member declarations added to many classes and methods, thus avoiding compiler warnings * src/*: New fields added to ".jclic" files to make it more consistent with project.json, generated at HTML5 export * src/author/edu/xtec/jclic/project/ProjectFileUtils.java: HTML5 export: Avoid overriding of files with same name in multiple zips 2016-09-05 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSettings.java: Revert JS codebase to clic.xtec.cat 2016-07-15 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSettings.java * src/author/edu/xtec/jclic/AuthorSingleFrame.java * src/author/edu/xtec/jclic/project/ExportTaskDlg.java * src/author/edu/xtec/jclic/project/ExportToJSDlg.form * src/author/edu/xtec/jclic/project/ExportToJSDlg.java: Generate SCORM file in HTML5 export * instal/build.xml * instal/setup.nsi: Windows installer updated 2016-06-12 Francesc Busquets * src/report/reportServer/edu/xtec/jclic/report/HTTPReportServer.java * src/report/reportServlets/edu/xtec/jclic/report/rp/JClicReportService.java: Adding CORS response headers and allowing OPTIONS method in Reports Server (needed for JClic.js when running in different server/port) 2015-04-28 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSettings.java * src/author/edu/xtec/jclic/AuthorSettingsDlg.form * src/author/edu/xtec/jclic/AuthorSettingsDlg.java * src/author/edu/xtec/jclic/AuthorSingleFrame.java * src/author/edu/xtec/jclic/project/ExportTaskDlg.java * src/author/edu/xtec/resources/messages/AuthorMessages.properties * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties * src/author/edu/xtec/resources/messages/AuthorMessages_es.properties: Changing codebase of jclic.min.js to JSDelivr.net * src/core/edu/xtec/jclic/bags/MediaBagElement.java: Writting 'animated' flag in media elements 2015-12-09 Francesc Busquets * build.xml * extensions/dbconn/build.xml * extensions/img/image4j/build.xml * extensions/json/build.xml * extensions/soundspi/build.xml * extensions/websrv/build.xml * extensions/xml/build.xml * project.properties: Update to JRE 1.6. Preparing for release 0.3.1.0 * extensions/websrv/license.txt * extensions/websrv/src/org/jibble/simplewebserver/RequestThread.java * extensions/websrv/src/org/jibble/simplewebserver/SimpleWebServer.java * src/author/JClicAuthor.java * src/author/edu/xtec/jclic/AuthorSingleFrame.java * src/author/edu/xtec/jclic/project/ExportTaskDlg.form * src/author/edu/xtec/jclic/project/ExportTaskDlg.java * src/author/edu/xtec/jclic/project/ExportToJSDlg.form * src/author/edu/xtec/jclic/project/ExportToJSDlg.java * src/author/edu/xtec/jclic/project/ProjectFileUtils.java * src/author/edu/xtec/resources/icons/cover-base.jpg * src/author/edu/xtec/resources/icons/favicon.ico * src/author/edu/xtec/resources/icons/icon-192.png * src/author/edu/xtec/resources/icons/icon-72.png * src/author/edu/xtec/resources/icons/thumb-base.jpg * src/core/edu/xtec/jclic/project/ProjectSettings.java * src/author/edu/xtec/resources/messages/AuthorMessages.properties: Implementing "Export to HTM5" * HACKING.txt * README.md * dist/jclic/jclic-google.xml * dist/jclic/jclicpluginssl.js * dist/reports/jclicReports.properties * src/report/webApp/WEB-INF/web.xml * src/activities/edu/xtec/jclic/activities/associations/SimpleAssociation.java * src/activities/edu/xtec/jclic/activities/textGrid/WordSearch.java * src/author/edu/xtec/jclic/beans/TextListEditor.java * src/author/edu/xtec/jclic/project/ProjectInstallerEditPanel.java * src/core/edu/xtec/jclic/Activity.java * src/core/edu/xtec/jclic/Player.java * src/core/edu/xtec/jclic/automation/ActiveBagContentKit.java * src/core/edu/xtec/jclic/bags/ActivityBagElement.java * src/core/edu/xtec/jclic/bags/ActivitySequenceJump.java * src/core/edu/xtec/jclic/bags/ConditionalJumpInfo.java * src/core/edu/xtec/jclic/bags/MediaBagElement.java * src/core/edu/xtec/jclic/boxes/ActiveBox.java * src/core/edu/xtec/jclic/boxes/BoxConnector.java * src/core/edu/xtec/jclic/boxes/JPanelActiveBox.java * src/core/edu/xtec/jclic/boxes/SimpleBox.java * src/core/edu/xtec/jclic/boxes/TextGrid.java * src/core/edu/xtec/jclic/boxes/TextGridContent.java * src/core/edu/xtec/jclic/boxes/ThumbsExplorerPanel.java * src/core/edu/xtec/jclic/fileSystem/FileSystem.java * src/core/edu/xtec/jclic/fileSystem/FileZip.java * src/core/edu/xtec/jclic/fileSystem/ZipFileSystem.java * src/core/edu/xtec/jclic/project/JClicProject.java * src/interface/edu/xtec/jclic/Constants.java * src/interface/edu/xtec/jclic/PlayStation.java * src/utilities/edu/xtec/util/BrowserLauncher.java * src/utilities/edu/xtec/util/CtrlPanel.java * src/utilities/edu/xtec/util/FontCheck.java * src/utilities/edu/xtec/util/LFUtil.java * src/utilities/edu/xtec/util/Messages.java * src/utilities/edu/xtec/util/StrUtils.java: Miscellaneous improvements 2014-08-04 Francesc Busquets * src/core/edu/xtec/jclic/fileSystem/FileSystem.java * src/player/edu/xtec/jclic/project/LibraryManagerElement.java: Corrected GitHub issue #5 2013-12-17 Francesc Busquets * dist/linux/bin/jclic-libmanager * dist/linux/debian/changelog * dist/linux/debian/jclic.install * dist/linux/debian/jclic.manpages * dist/linux/debian/jclic.postinst * dist/linux/man/jclic.1 * dist/linux/man/jclicauthor.1 * dist/linux/man/jclic-libmanager.1: Added "jclic-libmanager" command to set/unset JClic project libraries at system level. 2013-12-13 Francesc Busquets * build.xml: Added "encoding" param to "javac" ant task to force UTF-8 2013-11-13 Francesc Busquets * dist/linux/bin/jclic * dist/linux/bin/jclicauthor * dist/linux/bin/jclicreports: Added binary launchers for Linux * dist/linux/man/jclicreports.1 * dist/linux/man/jclicauthor.1 * dist/linux/man/jclic.1: Added "man" files for Linux * dist/linux/applications/jclicauthor.desktop * dist/linux/applications/jclicreports.desktop * dist/linux/applications/jclic.desktop: Added ".desktop" files for Linux * dist/linux/pixmaps/jclicreports.png * dist/linux/pixmaps/jclicauthor.png * dist/linux/pixmaps/jclicauthor.svg * dist/linux/pixmaps/jclic.svg * dist/linux/pixmaps/jclic.png * dist/linux/pixmaps/jclicreports.svg: Added icon files for Linux * dist/linux/debian/jclic-reports.manpages * dist/linux/debian/copyright * dist/linux/debian/compat * dist/linux/debian/jclic-reports.docs * dist/linux/debian/jclic-reports.menu * dist/linux/debian/control * dist/linux/debian/jclic-reports.install * dist/linux/debian/jclic.install * dist/linux/debian/jclic.menu * dist/linux/debian/source * dist/linux/debian/source/format * dist/linux/debian/jclic.manpages * dist/linux/debian/rules * dist/linux/debian/jclic.links * dist/linux/debian/jclic.docs * dist/linux/debian/jclic-reports.links * dist/linux/debian/changelog: Added "/debian" config files for packaging. 2013-10-29 Francesc Busquets * src/author/edu/xtec/jclic/beans/TextListEditor.java * src/author/edu/xtec/jclic/project/ProjectSettingsEditorPanel.java * src/author/edu/xtec/jclic/project/RevisionEditPanel.java * src/utilities/edu/xtec/util/Messages.java: Solved bugs related to "Arrays.asList" * instal/setup.nsi: Solved bug: Windows uninstaller not deleting file "reports.ico" * CHANGES.txt * project.properties: Preparing for release 0.2.3.4 2013-10-28 Francesc Busquets * dist/jclic/jclicplugin.js * dist/jnlp/author.jnlp * dist/jnlp/install.jnlp * dist/jnlp/player.jnlp * dist/jnlp/reportServer.jnlp * build.xml * CHANGES.txt * project.properties: Preparing for release 0.2.3.3 2013-10-08 Francesc Busquets * dist/jclic/jclicplugin.js * dist/jnlp/author.jnlp * dist/jnlp/install.jnlp * dist/jnlp/player.jnlp * dist/jnlp/reportServer.jnlp * CHANGES.txt * project.properties: Preparing for release 0.2.3.2 * src/core/edu/xtec/jclic/report/TCPReporter.java: Check for strings exceeding max field size * src/core/edu/xtec/resources/about/credits.html * src/core/edu/xtec/resources/about/otherCredits.html * src/interface/edu/xtec/jclic/Constants.java * src/jclicApplet/JClicApplet.java to: Added parameter "myurl" to avoid Java 1.7 bug with local applets * src/player/edu/xtec/jclic/project/LibraryManager.java * src/player/edu/xtec/jclic/project/LibraryManagerElement.java * src/utilities/edu/xtec/util/Messages.java * src/utilities/edu/xtec/util/PersistentSettings.java: New feature: "System libraries of JClic projects" * build.xml * ext/json: Added JSON-java extensions 2013-09-23 Francesc Busquets * Many files changed! See CHANGES.txt 2011-02-04 Francesc Busquets * extensions/img/image4j/src/net/sf/image4j/codec/bmp/BMPDecoder.java * extensions/img/image4j/src/net/sf/image4j/codec/bmp/BMPEncoder.java: Image4j updated to version 0.7 * src/activities/edu/xtec/jclic/activities/text/TextActivityBase.java: Correction of bug #64 * build.xml * src/core/edu/xtec/jclic/Activity.java * src/core/edu/xtec/jclic/Player.java * src/interface/edu/xtec/jclic/PlayStation.java * src/activities/edu/xtec/jclic/activities/puzzles/DoublePuzzle.java * src/activities/edu/xtec/jclic/activities/text/Complete.java * src/activities/edu/xtec/jclic/activities/text/FillInBlanks.java * src/activities/edu/xtec/jclic/activities/textGrid/CrossWord.java * src/activities/edu/xtec/jclic/activities/text/WrittenAnswer.java: * src/player/edu/xtec/jclic/ExtendedPlayer.java * src/player/edu/xtec/jclic/PlayerSettings.java * src/player/edu/xtec/jclic/accessibility/FressaFunctions.java * src/player/edu/xtec/jclic/accessibility/TFormExchange.java * src/player/edu/xtec/jclic/accessibility/TFormKeyboard.java: Pre-implementation of "Fressa" accessibility functions * src/core/edu/xtec/jclic/edit/Editor.java * src/author/edu/xtec/jclic/bags/ActivitySequenceEditor.java: Correction of bug #172 * src/jclicApplet/JClicApplet.java * src/core/edu/xtec/jclic/report/TCPReporter.java * src/core/edu/xtec/jclic/fileSystem/FileSystem.java * src/player/edu/xtec/jclic/project/LibraryManagerElement.java * src/utilities/edu/xtec/util/CompoundObject.java * src/author/edu/xtec/jclic/AuthorSingleFrame.java: Correction of bugs #53 and #1414 * src/core/edu/xtec/jclic/media/JavaSoundAudioPlayer.java: Catch unexpected exceptions thrown by org.classpath.icedtea.pulseaudio.PulseAudioClip.close * src/core/edu/xtec/jclic/skins/Skin.java: Implementation of feature request #1591 * src/core/edu/xtec/resources/about/credits.html * src/core/edu/xtec/resources/about/gencat.png * src/core/edu/xtec/resources/about/otherCredits.html: New logos and names of the Catalan Ministry of Education * src/report/reportServlets/edu/xtec/jclic/report/ReportServerJDBCBridge.java: Set default behavior to MySQL * src/utilities/edu/xtec/util/BrowserLauncher.java: Changed BrowserLauncher to BareBonesBrowserLauncher * dist/jclic/jclicplugin.js * CHANGES.txt * project.properties: Preparing version 0.2.2.0 * i18n/fromLaunchpad/build.xml * i18n/toLaunchpad/build.xml: Adding jclic-accessibility text messages * i18n: New and updated translations 2010-08-02 Francesc Busquets * i18n: New and updated translations 2010-05-28 Francesc Busquets * instal/build.xml: Create windows installers from Linux using wine * i18n: New and improved translations 2010-05-14 Francesc Busquets * project.properties: Preparing version 0.2.1.1 * extensions/dbconn/build.xml: Updated build script * src/report/webApp/META-INF/context.xml * src/report/webApp/WEB-INF/sun-web.xml * src/core/edu/xtec/jclic/Player.java: Correction of bug 1249: Incorrect reporting of activity results when the aximum number of attempts is achieved 2010-01-25 Francesc Busquets * i18n/fromLaunchpad/build.xml: Corrected a bug in translations. Colons (":") were often replaced by slash-colon sequences ("/:"). * src/author/edu/xtec/jclic/AuthorSingleFrame.java * src/core/edu/xtec/jclic/project/JClicProject.java: More improvements in memory management. 2010-01-15 Francesc Busquets * CHANGES.txt * src/author/edu/xtec/jclic/ActivityEditorPanel.form * src/author/edu/xtec/jclic/ActivityEditorPanel.java * src/author/edu/xtec/jclic/bags/ActivityBagEditor.java * src/author/edu/xtec/jclic/bags/MediaBagEditor.java * src/author/edu/xtec/jclic/bags/MediaBagElementEditorPanel.form * src/author/edu/xtec/jclic/bags/MediaBagElementEditorPanel.java * src/author/edu/xtec/jclic/bags/MediaBagSelector.form * src/author/edu/xtec/jclic/bags/MediaBagSelector.java * src/author/edu/xtec/jclic/bags/MediaPreviewPanel.java * src/core/edu/xtec/jclic/bags/MediaBagElement.java * src/core/edu/xtec/jclic/misc/Utils.java * src/core/edu/xtec/jclic/Player.java * src/utilities/edu/xtec/util/Messages.java * src/utilities/edu/xtec/util/StreamIO.java: Miscellaneous improvements like the ability to import media files when editing a cell. 2010-01-13 Francesc Busquets * CHANGES.txt * dist/jclic/jclicplugin.js * dist/jclic/readme.txt * dist/jclic/llegiume.txt * dist/jclic/leeme.txt * project.properties: Preparing version 0.2.1.0 * dist/jnlp/author.jnlp * dist/jnlp/install.jnlp * dist/jnlp/player.jnlp * dist/jnlp/reportServer.jnlp * instal/setup.nsi: Launch JClic Author with the parameter -Xmx256m * src/author/edu/xtec/jclic/ActivityEditorPanel.form * src/author/edu/xtec/jclic/ActivityEditorPanel.java * src/author/edu/xtec/jclic/AuthorSettingsDlg.form * src/author/edu/xtec/jclic/AuthorSettingsDlg.java * src/author/edu/xtec/jclic/AuthorSettings.java * src/author/edu/xtec/jclic/bags/MediaBagEditor.java * src/author/edu/xtec/jclic/bags/MediaBagElementEditor.java * src/author/edu/xtec/jclic/bags/MediaBagMultiEditorPanel.form * src/author/edu/xtec/jclic/bags/MediaBagMultiEditorPanel.java * src/author/edu/xtec/jclic/bags/MediaBagSelector.java * src/author/edu/xtec/jclic/project/JClicProjectEditor.java * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties * src/author/edu/xtec/resources/messages/AuthorMessages_es.properties * src/author/edu/xtec/resources/messages/AuthorMessages.properties * src/core/edu/xtec/jclic/bags/MediaBagElement.java * src/core/edu/xtec/jclic/bags/MediaBag.java * src/core/edu/xtec/jclic/misc/Utils.java * src/core/edu/xtec/jclic/Player.java * src/core/edu/xtec/jclic/project/JClicProject.java * src/utilities/edu/xtec/util/StrUtils.java: Improvements in memory management and garbage collection. Large images can be automatically resized when imported into the media library of JClic Author 2009-12-23 Francesc Busquets * lib/servlet-api/src/javax/servlet/ServletContextEvent.java * lib/servlet-api/src/javax/servlet/ServletContextListener.java * extensions/dbconn/src/edu/xtec/util/db/ConnectionBeanProvider.java: * src/report/reportServlets/edu/xtec/jclic/report/rp/ReportsRequestProcessor.java * src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/ContextParamsReader.java * src/report/webApp/WEB-INF/web.xml: New methods for passing settings to servlets: by "context-param" entries in web.xml, and by key-value fields in the database * src/core/edu/xtec/jclic/boxes/ActiveBox.java: Corrected bug 321 - Bad rendring in right-to-left (arabic, hebrew...) texts * src/utilities/edu/xtec/util/Options.java * src/core/edu/xtec/jclic/media/CheckMediaSystem.java: Correction for Mac OS-X SnowLeopard - Avoid QuickTime with 64-bit java * project.properties: Preparing for new version 0.2.1.0 2009-03-03 Francesc Busquets * dist/jnlp/install.jnlp * dist/jnlp/author.jnlp: Preparing new version 0.2.0.6 * src/core/edu/xtec/resources/messages/JClicMessages_pt.properties * src/author/edu/xtec/resources/messages/AuthorMessages_it.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt.properties: Updated translations. 2009-02-25 Francesc Busquets * dist/jclic/jclicplugin.js * dist/jnlp/player.jnlp * dist/jnlp/install.jnlp * dist/jnlp/author.jnlp * dist/jnlp/reportServer.jnlp: * instal/build.xml * instal/setup.nsi: Preparing new version 0.2.0.6 * src/author/edu/xtec/jclic/activities/text/TextActivityBaseEditor.java * src/activities/edu/xtec/jclic/activities/text/TextActivityBase.java * src/activities/edu/xtec/jclic/activities/text/TextActivityDocument.java * src/author/edu/xtec/jclic/activities/text/TextActivityEditorTextPanel.form * src/author/edu/xtec/jclic/activities/text/TextActivityEditorTextPanel.java * src/author/edu/xtec/resources/icons/doc_styles_clear.gif * src/author/edu/xtec/resources/icons/doc_styles.gif: New button "Clear text style" in JClic Author * src/author/edu/xtec/resources/messages/AuthorMessages_ar.properties * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties * src/author/edu/xtec/resources/messages/AuthorMessages_de.properties * src/author/edu/xtec/resources/messages/AuthorMessages_el.properties * src/author/edu/xtec/resources/messages/AuthorMessages_es.properties * src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties * src/author/edu/xtec/resources/messages/AuthorMessages_fr.properties * src/author/edu/xtec/resources/messages/AuthorMessages_gl.properties * src/author/edu/xtec/resources/messages/AuthorMessages_it.properties * src/author/edu/xtec/resources/messages/AuthorMessages_nl.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt_BR.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt.properties * src/author/edu/xtec/resources/messages/AuthorMessages.properties * src/core/edu/xtec/resources/messages/JClicMessages_eu.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt_BR.properties * src/extra/edu/xtec/resources/activities/listactivities_eu.properties * src/player/edu/xtec/resources/messages/PlayerMessages_eu.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_eu.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_pt_BR.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_eu.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_eu.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_pt_BR.properties: New and updated translations * src/author/edu/xtec/jclic/AuthorSettings.java * src/core/edu/xtec/resources/about/about.html * src/core/edu/xtec/resources/messages/checkmedia_ca.html * src/core/edu/xtec/resources/messages/checkmedia_de.html * src/core/edu/xtec/resources/messages/checkmedia_es.html * src/core/edu/xtec/resources/messages/checkmedia_gl.html * src/core/edu/xtec/resources/messages/checkmedia_pt_BR.html * src/core/edu/xtec/resources/messages/checkmedia_pt.html * src/core/edu/xtec/resources/messages/checkmedia.html * src/jclicApplet/JClicApplet.html * src/utilities/edu/xtec/resources/messages/checksignature_ca.html * src/utilities/edu/xtec/resources/messages/checksignature_de.html * src/utilities/edu/xtec/resources/messages/checksignature_es.html * src/utilities/edu/xtec/resources/messages/checksignature_gl.html * src/utilities/edu/xtec/resources/messages/checksignature_pt_BR.html * src/utilities/edu/xtec/resources/messages/checksignature_pt.html * src/utilities/edu/xtec/resources/messages/checksignature.html: Unifying domain references to clic.xtec.cat * src/core/edu/xtec/jclic/Player.java: Changed the behavior of internal links between activities * src/player/edu/xtec/jclic/report/BasicJDBCBridge.java * src/report/reportServlets/edu/xtec/jclic/jclicReports.properties * src/report/reportServlets/edu/xtec/jclic/report/rp/JClicReportService.java: Save server date and time in reports, instead of the client one. 2009-02-15 Francesc Busquets * dist/jnlp/player.jnlp * dist/jnlp/author.jnlp * dist/jnlp/reportServer.jnlp * dist/jclic/jclicplugin.js: Preparing new version 0.2.6 * dist/jclic/icons/favicon.ico * dist/jclic/author.html: Improved author applet * src/author/edu/xtec/resources/messages/AuthorMessages_ar.properties * src/author/edu/xtec/resources/messages/AuthorMessages_de.properties * src/author/edu/xtec/resources/messages/AuthorMessages_el.properties * src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties * src/author/edu/xtec/resources/messages/AuthorMessages_fr.properties * src/author/edu/xtec/resources/messages/AuthorMessages_gl.properties * src/author/edu/xtec/resources/messages/AuthorMessages_nl.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt_BR.properties * src/core/edu/xtec/resources/messages/JClicMessages_ast.properties * src/core/edu/xtec/resources/messages/JClicMessages_ca.properties * src/core/edu/xtec/resources/messages/JClicMessages_da.properties * src/core/edu/xtec/resources/messages/JClicMessages_de.properties * src/core/edu/xtec/resources/messages/JClicMessages_el.properties * src/core/edu/xtec/resources/messages/JClicMessages_es.properties * src/core/edu/xtec/resources/messages/JClicMessages_fr.properties * src/core/edu/xtec/resources/messages/JClicMessages_he.properties * src/core/edu/xtec/resources/messages/JClicMessages_it.properties * src/core/edu/xtec/resources/messages/JClicMessages_nl.properties * src/core/edu/xtec/resources/messages/JClicMessages_wo.properties * src/extra/edu/xtec/resources/activities/listactivities_nl.properties * src/extra/edu/xtec/resources/shapers/listshapers_fr.properties * src/extra/edu/xtec/resources/shapers/listshapers_nl.properties * src/player/edu/xtec/resources/messages/PlayerMessages_ast.properties * src/player/edu/xtec/resources/messages/PlayerMessages_de.properties * src/player/edu/xtec/resources/messages/PlayerMessages_el.properties * src/player/edu/xtec/resources/messages/PlayerMessages_eu.properties * src/player/edu/xtec/resources/messages/PlayerMessages_nl.properties * src/player/edu/xtec/resources/messages/PlayerMessages_ru.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_de.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_eu.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_nl.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_pt_BR.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_eu.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_nl.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_pt_BR.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_de.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_nl.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_pt_BR.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_el.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_nl.properties: New and improved translations * src/utilities/edu/xtec/util/Messages.java: Added support for ISO-639-2 three-letter language codes, for languages not in ISO-639-1 like Asturian (ast). * src/activities/edu/xtec/jclic/activities/puzzles/DoublePuzzle.java * src/core/edu/xtec/jclic/boxes/BoxBag.java * src/core/edu/xtec/jclic/Player.java * src/interface/edu/xtec/jclic/PlayStation.java * src/core/edu/xtec/jclic/Activity.java * src/core/edu/xtec/jclic/boxes/AbstractBox.java: Initial implementation of new accessibility features that make use of java.awt.Robot * src/player/edu/xtec/jclic/PlayerSettings.java: Changed default llok and feel to "default", instead of "System". * src/report/webApp/META-INF/context.xml * src/report/webApp/WEB-INF/sun-web.xml: new files created for compatibility with GlassFish 2008-06-16 Francesc Busquets * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_eu.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_eu.properties * src/core/edu/xtec/resources/messages/JClicMessages_eu.properties * src/core/edu/xtec/resources/messages/JClicMessages_ru.properties * src/extra/edu/xtec/resources/activities/listactivities_eu.properties * src/extra/edu/xtec/resources/shapers/listshapers_eu.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_eu.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_eu.properties * src/player/edu/xtec/resources/messages/PlayerMessages_eu.properties * src/player/edu/xtec/resources/messages/PlayerMessages_el.properties * src/author/edu/xtec/resources/messages/AuthorMessages_el.properties * src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties * dist/jclic/jclicplugin.js * dist/jnlp/player.jnlp * dist/jnlp/install.jnlp * dist/jnlp/author.jnlp * dist/jnlp/reportServer.jnlp: Updated translations 2008-06-11 Francesc Busquets * src/activities/edu/xtec/jclic/automation/tagreplace/TagReplace.java * src/author/edu/xtec/jclic/AuthorSingleFrame.java * src/core/edu/xtec/jclic/Activity.java * src/core/edu/xtec/jclic/automation/AutoContentProvider.java: Modifications to solve bug 509 * src/author/edu/xtec/resources/messages/AuthorMessages_el.properties * src/core/edu/xtec/resources/messages/JClicMessages_eu.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_eu.properties * src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties: Updated translations 2008-06-06 Francesc Busquets * instal/setup.nsi * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_eu.properties * src/player/edu/xtec/resources/messages/PlayerMessages_eu.properties * src/author/edu/xtec/resources/messages/AuthorMessages_it.properties * src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_ru.properties: New and updated translations 2008-05-29 Francesc Busquets * i18n/fromLaunchpad/build.xml: Adapted to new launchpad directory names * multiple po files: updated translations 2008-05-28 Francesc Busquets * build.xml: Corrected a dependency error in Ant targets "core" and "qt61" * dist/jclic/jclicplugin.js * dist/jclic/author.html * src/author/JClicAuthorApplet.java: New JClicAuthor applet * src/extra/edu/xtec/resources/shapers/listshapers_it.properties * src/player/edu/xtec/resources/messages/PlayerMessages_it.properties * src/author/edu/xtec/resources/messages/AuthorMessages_it.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_it.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_it.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_it.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_it.properties * src/core/edu/xtec/resources/messages/JClicMessages_it.properties * src/extra/edu/xtec/resources/activities/listactivities_it.properties * src/core/edu/xtec/resources/messages/JClicMessages_ru.properties * src/player/edu/xtec/resources/messages/PlayerMessages_ru.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_ru.properties * src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_eu.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_eu.properties * src/player/edu/xtec/resources/messages/PlayerMessages_eu.properties * src/core/edu/xtec/resources/messages/JClicMessages_eu.properties * src/author/edu/xtec/resources/messages/AuthorMessages_el.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_el.properties * src/extra/edu/xtec/resources/activities/listactivities_el.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_pt.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_pt.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_gl.properties * src/core/edu/xtec/resources/messages/JClicMessages_da.properties: Updated and new translations 2008-04-02 Francesc Busquets * dist/jclic/jclicplugin.js * dist/jnlp/player.jnlp * dist/jnlp/author.jnlp * dist/jnlp/manager.jnlp * dist/jnlp/install.jnlp * dist/jnlp/reportServer.jnlp * project.properties: Preparing new version 0.2.0.3 2008-04-02 Francesc Busquets * src/utilities/edu/xtec/util/FileChooserForFiles.java * src/utilities/edu/xtec/util/FontCheck.java * src/core/edu/xtec/jclic/media/ByteDataSource.java * src/core/edu/xtec/jclic/media/CheckMediaSystem.java * build.xml: Corrected a problem with non catcheable exceptions in applets 2008-04-02 Francesc Busquets * src/core/edu/xtec/resources/messages/JClicMessages_tr.properties * src/core/edu/xtec/resources/messages/JClicMessages_da.properties * src/core/edu/xtec/resources/messages/JClicMessages_eu.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages_fr.properties: Updated translations 2008-04-01 Francesc Busquets * src/core/edu/xtec/resources/about/credits.html * src/core/edu/xtec/resources/about/about.html * src/core/edu/xtec/jclic/skins/AboutWindow.java * src/core/edu/xtec/resources/messages/JClicMessages_fr.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt_BR.properties * src/core/edu/xtec/resources/messages/JClicMessages_tr.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages_gl.properties * src/core/edu/xtec/resources/messages/JClicMessages_da.properties * src/core/edu/xtec/resources/messages/JClicMessages_el.properties * src/core/edu/xtec/resources/messages/JClicMessages_eu.properties * src/core/edu/xtec/resources/messages/JClicMessages_es.properties * src/core/edu/xtec/resources/messages/JClicMessages.properties * src/core/edu/xtec/resources/messages/JClicMessages_de.properties * src/core/edu/xtec/resources/messages/JClicMessages_ca.properties * src/author/edu/xtec/resources/messages/AuthorMessages_el.properties: Updated translations 2008-03-26 Francesc Busquets * instal/build.xml * instal/setup.nsi * build.xml * src/jclicApplet/JClicApplet.java * src/author/edu/xtec/resources/messages/AuthorMessages_el.properties * src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties * src/author/edu/xtec/resources/messages/AuthorMessages_fr.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages_da.properties * src/core/edu/xtec/resources/messages/JClicMessages_eu.properties * src/core/edu/xtec/resources/messages/JClicMessages_fr.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages_tr.properties * src/extra/edu/xtec/resources/activities/listactivities_el.properties * src/extra/edu/xtec/resources/activities/listactivities_pt.properties * src/extra/edu/xtec/resources/shapers/listshapers_el.properties * src/extra/edu/xtec/resources/shapers/listshapers_pt.properties * src/player/edu/xtec/resources/messages/PlayerMessages_el.properties * src/player/edu/xtec/resources/messages/PlayerMessages_eu.properties * src/player/edu/xtec/resources/messages/PlayerMessages_tr.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_eu.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_pt.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_fr.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_pt.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_tr.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_ar.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_eu.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_pt.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_tr.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_eu.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_pt.properties: Updated translations, and a new applet feature: now they can handle also project installers (files ".jclic.inst"). 2008-03-07 Francesc Busquets * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_eu.properties * src/core/edu/xtec/resources/messages/JClicMessages_eu.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_eu.properties * src/player/edu/xtec/resources/messages/PlayerMessages_eu.properties * src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_eu.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_eu.properties: New Basque translation, and small changes in other languages. 2008-02-29 Francesc Busquets * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties * src/author/edu/xtec/resources/messages/AuthorMessages_de.properties * src/author/edu/xtec/resources/messages/AuthorMessages_el.properties * src/author/edu/xtec/resources/messages/AuthorMessages_es.properties * src/author/edu/xtec/resources/messages/AuthorMessages_fr.properties * src/author/edu/xtec/resources/messages/AuthorMessages_gl.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt_BR.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages_ca.properties * src/core/edu/xtec/resources/messages/JClicMessages_da.properties * src/core/edu/xtec/resources/messages/JClicMessages_de.properties * src/core/edu/xtec/resources/messages/JClicMessages_el.properties * src/core/edu/xtec/resources/messages/JClicMessages_es.properties * src/core/edu/xtec/resources/messages/JClicMessages_fr.properties * src/core/edu/xtec/resources/messages/JClicMessages_gl.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt_BR.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt.properties * src/extra/edu/xtec/resources/activities/listactivities_ca.properties * src/extra/edu/xtec/resources/activities/listactivities_de.properties * src/extra/edu/xtec/resources/activities/listactivities_el.properties * src/extra/edu/xtec/resources/activities/listactivities_fr.properties * src/extra/edu/xtec/resources/activities/listactivities_gl.properties * src/extra/edu/xtec/resources/activities/listactivities_pt_BR.properties * src/extra/edu/xtec/resources/shapers/listshapers_de.properties * src/extra/edu/xtec/resources/shapers/listshapers_el.properties * src/extra/edu/xtec/resources/shapers/listshapers_gl.properties * src/extra/edu/xtec/resources/shapers/listshapers_pt_BR.properties * src/player/edu/xtec/resources/messages/PlayerMessages_ca.properties * src/player/edu/xtec/resources/messages/PlayerMessages_de.properties * src/player/edu/xtec/resources/messages/PlayerMessages_el.properties * src/player/edu/xtec/resources/messages/PlayerMessages_es.properties * src/player/edu/xtec/resources/messages/PlayerMessages_fr.properties * src/player/edu/xtec/resources/messages/PlayerMessages_gl.properties * src/player/edu/xtec/resources/messages/PlayerMessages_pt_BR.properties * src/player/edu/xtec/resources/messages/PlayerMessages_pt.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_ca.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_de.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_el.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_es.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_fr.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_gl.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_de.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_el.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_es.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_fr.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_gl.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_ca.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_de.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_el.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_es.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_fr.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_gl.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_pt_BR.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_pt.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_ca.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_da.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_de.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_el.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_fr.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_gl.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_pt_BR.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_pt.properties * i18n/README * i18n/customAntTasks/src/edu/xtec/ant/Prop2Po.java * i18n/customAntTasks/src/edu/xtec/ant/Po2Prop.java * i18n/customAntTasks/build.xml * i18n/toLaunchpad/build.xml * i18n/fromLaunchpad/build.xml * ... and a lot of i18n/fromLaunchpad/po/*_*.po files not listed here: Implemented a new system in i18n/ to synchronize the .properties files with the .po files used in the Launchpad translation service. 2008-02-06 Francesc Busquets * src/author/edu/xtec/resources/messages/AuthorMessages.properties * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties * src/author/edu/xtec/resources/messages/AuthorMessages_de.properties * src/author/edu/xtec/resources/messages/AuthorMessages_es.properties * src/author/edu/xtec/resources/messages/AuthorMessages_fr.properties * src/author/edu/xtec/resources/messages/AuthorMessages_gl.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt_BR.properties * src/author/edu/xtec/resources/messages/AuthorMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages.properties * src/core/edu/xtec/resources/messages/JClicMessages_de.properties * src/core/edu/xtec/resources/messages/JClicMessages_es.properties * src/core/edu/xtec/resources/messages/JClicMessages_fr.properties * src/core/edu/xtec/resources/messages/JClicMessages_gl.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt_BR.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages_ca.properties * src/extra/edu/xtec/resources/activities/listactivities.properties * src/extra/edu/xtec/resources/activities/listactivities_ca.properties * src/extra/edu/xtec/resources/activities/listactivities_de.properties * src/extra/edu/xtec/resources/activities/listactivities_es.properties * src/extra/edu/xtec/resources/activities/listactivities_fr.properties * src/extra/edu/xtec/resources/activities/listactivities_gl.properties * src/extra/edu/xtec/resources/activities/listactivities_pt_BR.properties * src/extra/edu/xtec/resources/automation/contentproviders.properties * src/extra/edu/xtec/resources/automation/contentproviders_ca.properties * src/extra/edu/xtec/resources/automation/contentproviders_de.properties * src/extra/edu/xtec/resources/automation/contentproviders_es.properties * src/extra/edu/xtec/resources/automation/contentproviders_gl.properties * src/extra/edu/xtec/resources/automation/contentproviders_pt_BR.properties * src/extra/edu/xtec/resources/shapers/listshapers.properties * src/extra/edu/xtec/resources/shapers/listshapers_ca.properties * src/extra/edu/xtec/resources/shapers/listshapers_de.properties * src/extra/edu/xtec/resources/shapers/listshapers_es.properties * src/extra/edu/xtec/resources/shapers/listshapers_gl.properties * src/extra/edu/xtec/resources/shapers/listshapers_pt_BR.properties * src/player/edu/xtec/resources/messages/PlayerMessages.properties * src/player/edu/xtec/resources/messages/PlayerMessages_ca.properties * src/player/edu/xtec/resources/messages/PlayerMessages_de.properties * src/player/edu/xtec/resources/messages/PlayerMessages_es.properties * src/player/edu/xtec/resources/messages/PlayerMessages_fr.properties * src/player/edu/xtec/resources/messages/PlayerMessages_gl.properties * src/player/edu/xtec/resources/messages/PlayerMessages_pt_BR.properties * src/player/edu/xtec/resources/messages/PlayerMessages_pt.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_ca.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_de.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_es.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_fr.properties * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages_gl.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_ca.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_de.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_es.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_fr.properties * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_gl.properties * src/utilities/edu/xtec/resources/messages/BasicMessages.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_ca.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_de.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_es.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_fr.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_gl.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_pt_BR.properties * src/utilities/edu/xtec/resources/messages/BasicMessages_pt.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_ca.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_de.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_es.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_fr.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_gl.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_pt_BR.properties * src/utilities/edu/xtec/resources/messages/PersistentPathsMessages_pt.properties * src/author/edu/xtec/jclic/AuthorSingleFrame.java * src/interface/edu/xtec/jclic/Constants.java * src/core/edu/xtec/jclic/Player.java * src/jclicApplet/JClicApplet.java * src/jclicPlayer/JClicInstaller.java * src/player/edu/xtec/jclic/SingleInstanceJFrame.java * src/report/reportServer/ReportServer.form * src/report/reportServer/ReportServer.java * src/core/edu/xtec/resources/commonSettings.properties: The encoding of all .properties files unified with the "native2ascii" tool, in order to make if compatible with "prop2po". Also, config expressions (like internal paths to resources or version numbers) have been removed from language files and placed in the new file commonSettings.properties.  2008-01-26 Francesc Busquets * src/core/edu/xtec/jclic/Player.java * removed file src/extra/edu/xtec/resources/fonts/arial2.ttf: Removed clone of arial font, not needed. 2008-01-23 Francesc Busquets * dist/jclic/jclicplugin.js * dist/jclic/leeme.txt * dist/jclic/readme.txt * dist/jclic/llegiume.txt * dist/jnlp/reportServer.jnlp * dist/jnlp/player.jnlp * dist/jnlp/author.jnlp * dist/jnlp/install.jnlp * instal/setup.nsi * instal/build.xml * deploy/reports/xml/application.xml * CHANGES.txt * HACKING.txt * INSTALL.txt * build.xml: The packaging of JClic has been simplified. Now only three JAR files are created: jclic.jar, jclicauthor.jar and jclicreports.jar 2008-01-23 Francesc Busquets * src/report/reportServlets/edu/xtec/jclic/report/rp/Img.java * removed directory src/report/reportServlets/edu/xtec/util/ranab: The GIF Encoder library, by Rana Bhattacharyya, has been suppressed. The graphics of reports are nou generated by means of the ImageIO API. 2008-01-23 Francesc Busquets * added directory extensions/img/image4j * src/core/edu/xtec/jclic/misc/Bmp.java * src/core/edu/xtec/resources/messages/JClicMessages_pt_BR.properties * src/core/edu/xtec/jclic/bags/MediaBagElement.java * src/core/edu/xtec/resources/messages/JClicMessages_gl.properties * src/core/edu/xtec/resources/messages/JClicMessages_es.properties * src/core/edu/xtec/resources/messages/JClicMessages_de.properties * src/core/edu/xtec/resources/messages/JClicMessages.properties * src/core/edu/xtec/resources/messages/JClicMessages_pt.properties * src/core/edu/xtec/resources/messages/JClicMessages_ca.properties * src/core/edu/xtec/resources/messages/JClicMessages_fr.properties * src/core/edu/xtec/resources/about/otherCredits.html * src/core/edu/xtec/jclic/misc/Utils.java * CREDITS.txt: The class used to import BMP files, by J.Osbaldeston, has been replaced by the LGPL library image4j (http://image4j.sourceforge.net). Now ICO files are also recognized by JClic. 2008-01-23 Francesc Busquets * added directory extensions/img/image4j * src/core/edu/xtec/jclic/misc/Bmp.java: The class used to import BMP files, by J.Osbaldeston, has been replaced by the LGPL library image4j (http://image4j.sourceforge.net) 2008-01-14 Francesc Busquets * removed dir lib/servlet-api * added new directory tree lib/servlet-api: The implementation of JSR-154 (Servlet 2.4) taked from the GlassFish project has been substitued by a partial, empty stub implementation of the classes and interfaces needed at compile-time by JClic reports server. 2008-01-14 Francesc Busquets * removed dir extensions/jmf * dist/jclic/jclicplugin.js * dist/jnlp/reportServer.jnlp * dist/jnlp/jclic.jnlp * dist/jnlp/install.jnlp * dist/jnlp/author.jnlp * dist/jnlp/player.jnlp * instal/setup.nsi * instal/build.xml * CREDITS.txt * HACKING.txt * CHANGES.txt * src/core/edu/xtec/resources/about/otherCredits.html * build.xml: The stub implementations of some JMF codecs in extensions/jmf has been removed to avoid copyright conflicts. 2007-12-29 Francesc Busquets * added file testcert-gkr.keystore * added file testcert-gkr.cer * build.xml: The GCJ compiler and tools use keystores in GKR format, different from Sun's JKS format. The Ant script build script dinamically loads the appropiate keystore for the compiler currently used (Sun JDK or GNU gcj) 2007-12-27 Francesc Busquets * removed dir extensions/xml/jdom-1.0/lib * build.xml: Suppressed the binary JAR files in the jdom-1.0/lib directory. JDOM is now compiled without the X-Path functions, not needed by JClic. 2007-12-10 Francesc Busquets * src/core/edu/xtec/jclic/media/JMFActiveMediaPlayer.java * src/qt61/edu/xtec/jclic/media/QT61AudioPlayer.java * src/core/edu/xtec/jclic/media/JMFAudioPlayer.java * src/qt61/edu/xtec/jclic/media/QT61ActiveMediaPlayer.java * src/qt61/edu/xtec/jclic/media/QT61AudioBuffer.java * src/qt61/edu/xtec/jclic/media/QT61Tools.java * src/core/edu/xtec/jclic/media/ByteDataSource.java: Minor changes in the source code, replacing "include" statements with full qualified names. 2007-12-10 Francesc Busquets * removed file lib/QTJava.zip * added directory tree lib/qtjava-api * removed file lib/jclicjmf.jar * added directory tree lib/jmf-api * removed file lib/servlet.jar * added dirctory tree lib/servlet-api: Changes made in order to have a clean and full-compilable source code without external non-free dependencies. 2007-12-10 Francesc Busquets * extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TClip.java: Added the getLongFramePosition method in order to make it compliant with javax.sound.sampled.DataLine 2007-11-28 Francesc Busquets * extensions/dbconn/build.xml * build.xml: File extensions/dbconn/lib/javax-sql-classes.zip is no longer needed since JClic compiles against Java 1.4 2007-11-27 Francesc Busquets * dist/jclic/jclicplugin.js * dist/jnlp/reportServer.jnlp * dist/jnlp/player.jnlp * dist/jnlp/author.jnlp * dist/jnlp/install.jnlp * dist/jnlp/jclic.jnlp * instal/build.xml * instal/setup.nsi * src/core/edu/xtec/jclic/media/CheckMediaSystem.java * src/core/edu/xtec/jclic/media/ActiveMediaPlayer.java * src/core/edu/xtec/jclic/media/EventSoundsElement.java * src/core/edu/xtec/jclic/skins/AboutWindow.java * build.xml * HACKING.txt: Support for QuickTime 6.0 has been supressed in JClic. Mac users can still make use of QuickTime for Java 6.1. 2007-11-27 Francesc Busquets * dist/jclic/jclicplugin.js * dist/jnlp/reportServer.jnlp * dist/jnlp/player.jnlp * dist/jnlp/author.jnlp * dist/jnlp/install.jnlp * dist/jnlp/jclic.jnlp * instal/build.xml * instal/setup.nsi * build.xml * HACKING.txt: The extension "intl.jar" has been supressed from JClic. This extension was a workaround for having the texts of the common Java dialog boxes translated to Catalan. Since Java is a free platform, this must be done in the Java source code. 2007-11-26 Francesc Busquets * src/extra/edu/xtec/resources/skins/mini.xml * src/extra/edu/xtec/resources/skins/mini.png * src/extra/edu/xtec/resources/skins/listskins.properties: Added a new skin called "Mini", suitable for embedding JClic projects in blogs and other web pages with small space available. 2007-11-23 Francesc Busquets * extensions/dbconn/build.xml * dist/jclic/jclicplugin.js * dist/jnlp/reportServer.jnlp * dist/jnlp/player.jnlp * dist/jnlp/author.jnlp * dist/jnlp/install.jnlp * dist/jnlp/jclic.jnlp * instal/build.xml * instal/setup.nsi * ant/customAntTasks/customAntTasks.jar * build.xml * HACKING.txt * INSTALL.txt * project.properties: The Java virtual machine required by JClic has been updated from 1.3.1 to 1.4. This allows to use JAXP and other XML libraries provided by the platform, so it's no longer necessary to build jclicxml.jar. JDOM 1.0, still necessary, is built now within the new file "jdom.jar". The directories extensions/xml/jaxp and extensions/xml/crimson have been deleted. 2007-04-30 Francesc Busquets * src/activities/edu/xtec/jclic/beans/ColorButton.java: * src/activities/edu/xtec/jclic/beans/AlphaColorChooserPanel.java: * src/activities/edu/xtec/jclic/beans/AlphaColorChooserPanel.form: Corrected an irregular behavior of colorButton, that returns a new color even when the dialog window is closed. 2007-04-29 Francesc Busquets * src/activities/edu/xtec/jclic/activities/text/WrittenAnswer.java: The marker is drawed only when there are more than one cell to solve. In multiple-answer mode, the first valid option is always displayed when the activity is finished, even if another valid option was entered (useful for natural spelling exercises). 2007-03-30 Francesc Busquets * src/extra/edu/xtec/resources/skins/listskins.properties * src/extra/edu/xtec/resources/skins/empty.png * src/extra/edu/xtec/resources/skins/empty.xml: Added a new skin, named "Empty", without buttons, counters nor message boxes. 2007-02-23 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSingleFrame.java * src/core/edu/xtec/jclic/PlayerHistory.java: Corrections and improvements to the reports system, in order to solve bug #41 (conditional jumps between sequence elements are not always working as expected) 2007-02-21 Francesc Busquets * src/core/edu/xtec/jclic/report/SessionReg.java: Corrected an error in the algorithm that computes the global score for a session 2006-12-18 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSingleFrame.java: Corrected a problem with the scrolling of JList when importing activities 2006-10-24 Francesc Busquets * src/core/edu/xtec/jclic/automation/AutoContentProvider.java: Corrected a bug that caused recursive calls into "init(ResourceBridge,FileSystem)" 2006-10-23 Francesc Busquets * src/interface/edu/xtec/jclic/Constants.java * src/core/edu/xtec/jclic/Activity.java * src/core/edu/xtec/jclic/automation/AutoContentProvider.java * src/core/edu/xtec/jclic/misc/Utils.java * src/core/edu/xtec/resources/messages/JClicMessages.properties * src/core/edu/xtec/resources/messages/JClicMessages_ca.properties * src/core/edu/xtec/resources/messages/JClicMessages_es.properties * src/activities/edu/xtec/jclic/automation/tagreplace/TagReplace.java * src/activities/edu/xtec/jclic/automation/TextActivityContentKit.java * src/activities/edu/xtec/jclic/activities/text/TextActivityBase.java * src/activities/edu/xtec/jclic/activities/text/TextTarget.java * src/activities/edu/xtec/jclic/activities/textGrid/WordSearch.java * src/activities/edu/xtec/jclic/activities/textGrid/CrossWord.java: * src/extra/edu/xtec/resources/automation/contentproviders.properties * src/extra/edu/xtec/resources/automation/contentproviders_ca.properties * src/extra/edu/xtec/resources/automation/contentproviders_es.properties * src/author/edu/xtec/jclic/automation/AutoContentProviderEditor.java * src/author/edu/xtec/jclic/automation/tagreplace/TagReplaceEditor.java * src/author/edu/xtec/jclic/automation/tagreplace/TagReplaceEditorPanel.java * src/author/edu/xtec/jclic/automation/tagreplace/TagReplaceEditorPanel.form * src/author/edu/xtec/resources/messages/AuthorMessages.properties * src/author/edu/xtec/resources/messages/AuthorMessages_es.properties * src/author/edu/xtec/resources/messages/AuthorMessages_fr.properties * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties: Implementation of TagReplace, a new automation module that allows to substitute tags with expressions indicated on text files or URLs. 2006-10-23 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSingleFrame.java * src/author/edu/xtec/resources/icons/import_act.png: Customized icon and messages for import activities. 2006-09-27 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSingleFrame.java: * src/core/edu/xtec/jclic/fileSystem/FileSystem.java: Create parent directories for new files if they don't exists. 2006-07-28 Francesc Busquets * build.xml: Converted CR+LF to LF. 2006-07-28 Francesc Busquets * src/author/edu/xtec/jclic/AuthorSingleFrame.java: * src/author/edu/xtec/jclic/bags/MediaBagEditor.java: * src/author/edu/xtec/resources/messages/AuthorMessages.properties * src/core/edu/xtec/jclic/project/JClicProject.java: Added the ability to import activities from another project. 2006-07-28 Francesc Busquets * src/core/edu/xtec/jclic/fileSystem/FileSystem.java: Simplified and corrected the file name character conversion tables. 2006-07-28 Francesc Busquets * src/core/edu/xtec/jclic/report/TCPReporter.java: * src/report/reportServer/edu/xtec/jclic/report/HTTPReportServer.java: * src/report/reportServer/edu/xtec/jclic/report/HTTPRequest.java: Modified the 'content-type' header of report requests. 2006-07-28 Francesc Busquets * src/player/edu/xtec/jclic/PlayerSettingsDlg.java: * src/player/edu/xtec/jclic/PlayerSettingsDlg.form: Added 'country' and 'variant' options to language selection. 2006-07-28 Francesc Busquets * src/shapers/edu/xtec/jclic/shapers/EditableLine2D.java: * src/shapers/edu/xtec/jclic/shapers/PolygonDrawPanel.java: * src/shapers/edu/xtec/jclic/shapers/EditableShape.java: * src/shapers/edu/xtec/jclic/shapers/EditableShapeConstants.java: * src/shapers/edu/xtec/jclic/shapers/EditableEllipse2D.java: * src/core/edu/xtec/jclic/shapers/Holes.java: * src/report/reportServlets/edu/xtec/jclic/report/rp/JClicReportService.java: * src/report/reportServlets/edu/xtec/jclic/report/rp/Basic.java: * src/report/reportServlets/edu/xtec/jclic/report/ReportServerJDBCBridge.java: * src/author/edu/xtec/jclic/bags/ActivityBagEditorPanel.java: * src/core/edu/xtec/jclic/clic3/Clic3.java: * src/utilities/edu/xtec/util/JDomUtility.java: * src/utilities/edu/xtec/util/Html.java: * src/activities/edu/xtec/jclic/activities/panels/Explore.java: * src/author/edu/xtec/jclic/boxes/ActiveBagContentControlPanel.java: Cleaning of commented code and translation of some Catalan comments to English. 2006-07-03 Francesc Busquets * build.xml: * HACKING.txt: Corrected some mistakes in build.xml that make it inoperable. Also added some explanations about how to prepare the filesystems in order to open the project with NetBeans. 2006-05-24 Francesc Busquets * instal/setup.nsi: Solved bug #46 (Windows installer create icons only for the current user). Added "SetShellVarContext all" to the installer script, so the installer defaults to create shortcuts and icons for all users. 2006-05-24 Francesc Busquets * build.xml: * instal/build.xml: * instal/setup.nsi: * src/author/edu/xtec/resources/messages/AuthorMessages.properties: * src/core/edu/xtec/resources/messages/JClicMessages.properties: * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages.properties: * CHANGES.txt: * COPYING.txt: * CREDITS.txt: * HACKING.txt: * INSTALL.txt: * project.properties: Attending feature request #69 (split readme.txt), five files have been created (CHANGES.txt, COPYING.txt, CREDITS.txt, HACKING.txt and INSTALL.txt). Also, the "version" strings displayed in credits has been moved to the external file "project.properties". 2006-05-22 Francesc Busquets * src/core/edu/xtec/jclic/report/Reporter.java: * src/report/reportServer/edu/xtec/resources/messages/ReportServerMessages.properties: * src/report/reportServlets/edu/xtec/jclic/report/ReportServerJDBCBridge.java: * src/report/reportServlets/edu/xtec/jclic/report/rp/UserAdmin.java: * src/report/reportServlets/edu/xtec/resources/messages/reportMessages.properties: * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_ca.properties: * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_de.properties: * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_es.properties: * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_fr.properties: * src/report/reportServlets/edu/xtec/resources/messages/reportMessages_gl.properties: Solved bug #103. The "edit user" and "create user" forms have been modified, so now the password can be set in JClic Reports when creating a new user, and modified or erased later. 2006-05-19 Francesc Busquets * src/report/reportServer/ReportServerSettingsDlg.java: * src/report/reportServer/ReportServerSettingsDlg.java: Solved a problem with unitialized settings that cause null pointer exception. 2006-04-20 Francesc Busquets * src/author/edu/xtec/jclic/bags/ActivityBagElementEditor.java: * src/author/edu/xtec/jclic/project/JclicProjectEditor.java: * src/core/edu/xtec/jclic/bags/ActivityBag.java: * src/core/edu/xtec/jclic/media/EventSounds.java: * src/interface/edu/xtec/jclic/Constants.java: Bug #83 solved. Now custom event sounds are correctly handled by JClic author, both when specified for the whole project or for a specific activity. In addition, changes to the project global skin are also shown in the test activity window. 2006-04-13 Francesc Busquets * src/author/edu/xtec/resources/messages/AuthorMessages.properties: * src/author/edu/xtec/resources/messages/AuthorMessages_pt.properties: * src/author/edu/xtec/resources/messages/AuthorMessages_pt_BR.properties: * src/author/edu/xtec/resources/messages/AuthorMessages_gl.properties: * src/author/edu/xtec/resources/messages/AuthorMessages_fr.properties: * src/author/edu/xtec/resources/messages/AuthorMessages_es.properties: * src/author/edu/xtec/resources/messages/AuthorMessages_de.properties: * src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties: * src/author/edu/xtec/jclic/boxes/ActiveBagContentEditor.form: * src/author/edu/xtec/jclic/bags/ConditionalJumpPanel.java: * src/author/edu/xtec/jclic/bags/ConditionalJumpPanel.form: * src/author/edu/xtec/jclic/ActivityEditorOptionsPanel.java: * src/author/edu/xtec/jclic/ActivityEditorOptionsPanel.form: Bugs #51, #52 and #42 solved. Now it's possible to set/unset the boolean properties dragCells and useOrder from JClic author. The check boxes are in the "Options" tab of the Activity editor. Changes in the parameters of conditional jumps (in "sequences" tab of JClic author) are now retained. 2006-04-10 Francesc Busquets * src/author/edu/xtec/jclic/boxes/ActiveBagContentControlPanel.java: Bug #38 solved. Data loss when editing crosswords. It was caused by a cleanup of excessive cells, incorrectly applied to CrossWord activities. HACKING.txt000066400000000000000000000154131335566474600127120ustar00rootroot00000000000000JClic: Authoring and playing system for educational activities ----------------------------------------------------------------------------- This file contains information about the internal structure of JClic and the organization of the source code. For compilation instructions, see INSTALL.txt ----------------------------------------------------------------------------- Directories The source code of JClic is organized into the following directories: * src Contains the source code of the JClic modules. It is organized in several sub-directories: - core Main classes of JClic, including JClic Player - author Code specific of the JClic author module - report/reportServer The stand-alone JClic reports server - report/webApp The J2EE application release of the reports server - report/reportServlets Code common to both versions of the reports server * extensions Contains the code of several libraries and external tools needed to run JClic: - dbconn Implementation of three types of JDBC connections, used by JClic reports: single, pooled and JNDI-defined. - soundspi Classes used to play audio compressed in MP3 and OGG formats. Code from four external projects are used: ** JLayer (http://www.javazoom.net/javalayer/javalayer.html) ** JOrbis (http://www.jcraft.com/jorbis/) ** MP3SPI (http://www.javazoom.net/mp3spi/mp3spi.html) ** Tritonus (http://www.tritonus.org/) - xml Classes used to write, read and parse XML files: ** JDom (http://www.jdom.org) without XPath features. ** CustomJDom - Special XML outputter - img Libraries for graphics processing ** image4j (http://image4j.sourceforge.net) - json The JSON-java library ** json (http://json.org) * lib External libraries needed to compile JClic: - jmf-api Java Media Framework API empty implementation, to be used only at compile time. (http://java.sun.com/products/java-media/jmf/) - qtjava-api QuickTime for Java empty implementation, to be used only at compile time. (http://developer.apple.com/quicktime/qtjava/) - servlet-api Needed to compile the J2EE version of JClic reports. Empty implementation, to be used only at compile time. (http://java.sun.com/products/servlet/reference/api) * deploy Contains the "applicaton.xml" file, used in the J2EE web application of JClic reports * dist This is the directory where the JAR files obtained as result of the build process are stored. It contains also some scripts, icons and JNLP (Java Network Launching Protocol) files. * instal This directory contains a script that generates the Windows installer of JClic using the Nullsoft Scriptable Install System (http://nsis.sourceforge.net). It contains also an Ant script that launches NSIS and creates a ZIP with all the files needed to run JClic in any Java-enabled system. * i18n Contains utilities used to translate JClic into different languages. JClic uses Launchpad (https://translations.launchpad.net/jclic) as a translation platform. * keystore This folder contains a key store with a test certificate, that can be used to sign the JAR files for test purposes. Please use your own certificate if you plan to distribute your own versions of the program. * xml XML Schema (XSD) and Document Type Definitions (DTD) corresponding to the documents used by JClic to store skins and projects. ----------------------------------------------------------------------------- Edit instructions: JClic was made using NetBeans, currently version 8.2 You can download this IDE from: https://netbeans.org/downloads/ Build the extensions by launching "ant" from the "extensions" directory. This will also make a copy of the generated JAR files into the "lib" directory: > cd extensions > ant Launch NetBeans and open the project located in the "nbeans" folder. The three last source folders, marked with an asterisk, contain fake (empty) skeletons of "Java Media Framework", "QuickTime for Java" and the Servlet API. This is because JMF and QuickTime are non-free software, and the servlet API is available only with the full package of J2EE (not really needed for JClic). To test the real behavior of JMF and QTJava you must obtain valid implementations of the files "jmf.jar" and "QTJava61.zip" (see the URLs indicated above) and replace its 'skeleton' source folder with a reference to a valid file in the "Libraries" folder of the netBeans project. To test the WebApp, you must replace the 'servlet-api/src' folder with a reference to a fully implemented J2EE library (available in the stock of Netbeans libraries) The main JClic classes are organized into the following Java packages: / Main classes (JClicApplet, JClicPlayer, JClicInstaller, JClicAuthor and ReportServer) /edu/xtec/jclic Main JClic core classes and interfaces /edu/xtec/jclic/activities The JClic activities. Each group of similar activities has its own package: associations, memory, panels, puzzles, text and textGrid /edu/xtec/jclic/automation The classes that provide automatic contents to activities. One package is included here: "arith", for automatic mental arithmetics. /edu/xtec/jclic/bags Classes dealing with collections of objects like activities, media, and sequence elements. /edu/xtec/jclic/boxes Graphic and multimedia elements: cells, counters, grids, buttons... /edu/xtec/jclic/clic3 Classes used to import Clic 3.0 activities /edu/xtec/jclic/edit Base for "editors", special classes used to modify complex objects. /edu/xtec/jclic/fileSystem Filesystems are objects used to read and write to files under different protocols and formats. /edu/xtec/jclic/media Classes that deal with sound, video... /edu/xtec/jclic/misc Miscellaneous utilities specific to JClic /edu/xtec/jclic/project Components of the JClic project structure /edu/xtec/jclic/report Activity results reporting system /edu/xtec/jclic/shapers Classes that deal with cell and grid shapes /edu/xtec/jclic/skins Support to JClic visual aspects /edu/xtec/jclic/beans Visual controls used in JClic Author. /edu/xtec/resources Different sub-packages containing messages, icons, graphics, sounds, etc. /edu/xtec/util Utility classes not specific to JClic INSTALL.txt000066400000000000000000000044141335566474600127530ustar00rootroot00000000000000JClic: Authoring and playing system for educational activities ----------------------------------------------------------------------------- This document is for people who want to hack and compile JClic from the source code. If you just want to download and install JClic, please go to: http://clic.xtec.cat/en/jclic/download.htm Compilation instructions: ------------------------- The current version of JClic compiles with version 1.7 or later of the Java Development Toolkit (JDK) Compilation is done with Apache Ant (http://ant.apache.org/), version 1.6.5 or later. If your Java version is 1.7 or later, it's advisable to obtain the "rt.jar" file of Java 1.6 and place it into the directory "lib/bootstrap/1.6". This file is not provided with JClic because it's a not redistributable binary, but can be downloaded from the Oracle Java Archive: http://www.oracle.com/technetwork/java/javase/archive-139210.html If you don't have the file "lib/bootstrap/1.6/rt.jar", the "rt.jar" file of your current JVM will be used as a bootstrap class path. This will generate a lot of warnings during compilation, but usually no errors. Just ignore this warnings. To compile JClic, just open a console, go to the root directory of the JClic source code (where the build.xml file is located) and invoke "ant". The JAR files must be signed to be used in applets. A test certificate key is provided in "keystore/testcert.keystore". Please don't use code signed with this key in production releases: always sign it using your own certificate. For more information, see the document "keystore/readme.txt" At the end of the build process, the resulting JAR files will appear into the "dist/jclic" directory. To start the programs, copy all the contents of the "dist/jclic" directory to an appropiate place and enter the following commands: - To launch JClic: java -jar jclic.jar - To launch JClic author: java -jar jclicauthor.jar - To launch JClic reports: java -jar jclicreports.jar - To setup the J2EE version of JClic reports, see: http://clic.xtec.cat/es/jclic/reports/ The JClic modules can also be launched as a Java webstart applications. For more information about this option, see: http://clic.xtec.cat/en/jclic/download.htm LICENSE000066400000000000000000000434061335566474600121150ustar00rootroot00000000000000GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. JClic is a set of cross-platform Java applications useful for creating and carrying out different types of educational activities like puzzles, associations, text exercises or crosswords. Copyright (C) 2013 projectestac This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. {signature of Ty Coon}, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. README.md000066400000000000000000000042511335566474600123620ustar00rootroot00000000000000[JClic](http://clic.xtec.cat) - Player and authoring tool for educational activities ==================================================================================== JClic is a set of cross-platform Java applications useful for creating and carrying out different types of educational activities like puzzles, associations, text exercises or crosswords. JClic is an open source project of the Department of Education of the Government of Catalonia. Teachers from different countries have contributed since 1995 to create a big repository of educational activities, shared under Creative Commons licenses in the project's main site: [http://clic.xtec.cat](http://clic.xtec.cat) The current components of JClic are: - **JClic Player**: Allows students to play with the activities and, optionally, track reports of their work in a local or remote database. The activities are organized into “projects” (files with extension .jclic.zip), and projects can be grouped into “Libraries”. - **JClic Applet**: Variant of JClic Player that can run embedded in HTML documents. Currently not used because lack of Java Applet support in modern browsers. - **JClic Author**: Visual tool used by teachers and authors to create or modify activities and projects. - **JClic Reports**: Reporting tool designed to collect and display the results (time, tries, guesses, success...) achieved by the students while playing JClic activities. - **JClic module for Moodle**: Is a parallel project specifically designed for embedding JClic activities into the Moodle Virtual Learning Environment. This project is available in: [https://github.com/projectestac/moodle-mod_jclic](https://github.com/projectestac/moodle-mod_jclic) See INSTALL.txt for compilation instructions, and HACKING.txt if you want to set-up your own JClic development project with [Netbeans](http://netbeans.org). JClic needs Java 1.7 or later (currently supported only in GNU/Linux, Windows and Mac OS X) The new project **[JClic.js](http://projectestac.github.io/jclic.js/)** allows to play JClic activities in GNU/Linux, Mac, Windows, ChromeOS, Android, iOS... and any operating system with a web browser supporting HTML5, without the need of Java. build.xml000066400000000000000000000671571335566474600127420ustar00rootroot00000000000000 Copyright © ${year} Francesc Busquets (fbusquets@xtec.cat) & Departament d'Educació de la Generalitat de Catalunya (info@xtec.cat)
Licensed under the terms of the GNU General Public License.

]]>
deploy/000077500000000000000000000000001335566474600123755ustar00rootroot00000000000000deploy/reports/000077500000000000000000000000001335566474600140735ustar00rootroot00000000000000deploy/reports/xml/000077500000000000000000000000001335566474600146735ustar00rootroot00000000000000deploy/reports/xml/application.xml000066400000000000000000000005711335566474600177230ustar00rootroot00000000000000 JClic reports jclicreports.war /reports dist/000077500000000000000000000000001335566474600120445ustar00rootroot00000000000000dist/jclic/000077500000000000000000000000001335566474600131305ustar00rootroot00000000000000dist/jclic/ALL_ALL.xml000066400000000000000000000034151335566474600147550ustar00rootroot00000000000000 Embed JClic projects into Google Sites or iGoogle URL pointing to the JClic project: Language: ar - Arabic ast - Asturianu ca - Catalan cn - Chinese Traditional da - Danish de - German el - Greek en - English es - Spanish eu - Basque fr - French gl - Galician he - Hebrew it - Italian nl - Dutch oc - Occitan pt - Portuguese pt_BR - Brazilian Portuguese ru - Russian tr - Turkish vec - Venetian wo - Wolof en Skin: Default Orange Green Blue Simple Minimal None (without buttons nor messages) Exit URL: Play event sounds: dist/jclic/author.html000066400000000000000000000010551335566474600153210ustar00rootroot00000000000000 JClic Author dist/jclic/ca_ALL.xml000066400000000000000000000034701335566474600147310ustar00rootroot00000000000000 Inserció de projectes JClic a Google Sites o iGoogle URL absolut del projecte JClic: Idioma: ar - àrab ast - asturià ca - català cn - xinès tradicional da - danès de - alemany el - grec en - anglès es - espanyol eu - basc fr - francès gl - gallec he - hebreu it - italià nl - holandès oc - occità (aranès) pt - portuguès pt_BR - portuguès del Brasil ru - rus tr - turc vec - venecià wo - wolof ca Entorn visual: Per defecte Taronja Verd Blau Simple Minimalista Cap (sense botons ni missatges) URL de sortida (opcional): Interpreta els sons d'event: dist/jclic/es_ALL.xml000066400000000000000000000035151335566474600147550ustar00rootroot00000000000000 Inserción de proyectos JClic en Google Sites o iGoogle URL absoluto del proyecto JClic: Idioma: ar - árabe ast - asturianu ca - catalán cn - chino tradicional da - danés de - alemán el - griego en - inglés es - español eu - vasco fr - francés gl - gallego he - hebreo it - italiano nl - holandés oc - occitano (aranés) pt - portugués pt_BR - portugués de Brasil ru - ruso tr - turco vec - veneciano wo - wolof es Entorno visual: Por defecto Naranja Verde Azul Simple Minimalista Ninguno (sin botones ni mensajes) URL de salida (opcional): Interpreta los sonidos de evento: dist/jclic/icons/000077500000000000000000000000001335566474600142435ustar00rootroot00000000000000dist/jclic/icons/author.ico000066400000000000000000000611761335566474600162540ustar00rootroot00000000000000 00h ( 00 h^"00 %'  nM h^(0`3333333333333333333333333333333333333333333;3333;3333;3333333;333333333;33;3;3330;33;3;3330;33;3;3330;33;3;3330;33;3;3333;33;3;333;33;3;3333333333333;3;33333;3333;33;;33;33;3;3;333;33;333333303;33033303;33;333;333;333;33333333330333330333030?` ( @3333333333333;;;3333;0;;;0;;;0;;;0;;;;333;;;30;;0;;;;;03030;303?( ;33;338s3838x(0` ~Y?` ( @_?( fM0ѠZypLߟ&փ py                  (0` %Y{YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY]^dgggggggggggggggggggggggggggggggggg_YY"Y`mgYY#Y`rgYYY`mgYY!Y`ogYYYaogYY"Y`m}sssssssssssswgYYY`rj[\]]]]]]]]]]_vgYY!Y`mzaZYY]Y]Y]Y]Y]Y]Y]Y]Y]qgYYY`qzd[YSYYQ^qgYY)Yaq|d[Y^YQ^qgYY&Y`pzc[YCYQ^qgYY,Yas|d[Y^YYQ^qgYY'Y`mzb[YSYQ^qgYY)Y`tzd[YVYYQ^qgYY$Yan|d[YZYQ^qgYY&Y`qzd[YMYT^qgYY+Yap|d[Y]qgYY'Y`ozbZ\qgYY+Yas{aZigYY$Y`nsangYh-iugY~~!~X~~gY~~~I~z~ӳgY~~1~k~~ϰԴgY~!ǩ߽gY~/׶gY~~ƨgY~ڹܻrgY~uƨhtgY~=q`ogY~ ~ɫY`ugY~Ѳ߾~d2Y`ogY~b~/Y*Y`tgY~(~`Y2YbqgY~~Ѳ~Y,Y`qfY~ϰ~~ Y4Ya_Y~]Ҳ~Y*Y\Y~"~ٸƨ~~m~ Y(YY~~߾ܻȪ~~~b~*~YY~ί~~~t~<~~O~~{~B~~ ~~~~T~@@ ( @ YYYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYvYY7_s|||||||||||||||||||||||nYvY?]|YvY'`|YvY8d|YvY,\rwwwwwwww|YvY(c`\YkYkYkYkYkYkYy|YvY-\h_fYY{z|YvYbb`bY{z|YvY*cj_jY{z|YvY]e]Y{z|YvY bi^vY{z|YvY\{j^~Y~z|YvY^}g[z|YvY]vm||Yv~ s|Yv~UҲɫ|Yv~F~ͮ}YoĦ|Ytۺ||Yt~VԴw|Yt~_s|Yt~'\o|Yt~yԴŧ~aY \o|Yt~AڹY \o{Yt~ \dYxƨY \Y~lĦƨ~q~0~#~~{~8~~~@?(  @MMMM0Ѡ&փfffy pffffpMߠffffffffZyLߟdist/jclic/icons/author.png000066400000000000000000000033371335566474600162610ustar00rootroot00000000000000PNG  IHDR00WIDATx]W{|w7l+i즁J/H< Y'^"C UP^Jm’$m>M6z㏙0^uYgmCe4s#0# k@v.ˍA%«!DXw*CIJo+%k#JT]⺔]u&\_߾,X( ?4lHauP.AJӱ?:Kx>eitceHdP>W0 E詴"@4ՂjPRd*pq84K,m~ TZsaA*f@$ ēt\BY!]\%]0S.4Ĥ5HS!`.,ГJ{Rn~ge824$mQnK|BaTJ˛cex ^O c} f!*6,0x/L$1OBr7aџFp b;_ >7œ H~|&O7P MMJ- 310y!`f_C5**肧I< m~"0W@L07fbvK xF 7LPU^*a {i-y'bo ufcNDQw+؝Зa`Z c|(A6ouQ;}`<2:NTA9lޟ~SuK(!3c04.Jиu@{Wwpynp ėaxL:ã`n/Ct8><,.,.Xafα* S"~&pql*9;f{߷-mqal܆" f={o݄eBfs# ^|mhC{ &0&w&l[p9ObsNn-q2|a 4ڙۂ<:HOB>+c cqHy o9)M ZH ~ L^J8 WJuޖ_۷v~;&x>mt&Y\QY_f{} h_}|86N37Rk[l[@`u1sR4tFR%q{:ۂ /7Xt^m^ӆ7i䡃+~G;;{<*']1ɴ*G" JK͋vN; n5 pIs.:)IENDB`dist/jclic/icons/author.svg000066400000000000000000000053621335566474600162740ustar00rootroot00000000000000 JClic Authorimage/svg+xmlJClic AuthorFrancesc Busquetshttp://clic.xtec.catdist/jclic/icons/author_aqua.ico000066400000000000000000000353561335566474600172640ustar00rootroot0000000000000000 %6  % h6(0` %33. <<7,334+33334+337,<<. 3333  #+!6 ?$F%"K$M$M%"K$F ?!6#+  33%",$?("R)!c)#t)#,%,%.&.&,%,%*$*#s'!b("R$?",%* '%0%"J(#e+%|;2 jb4TߕW젓]][YXUN|Kha3=5 -%{(!d%"J%0'* $$3$*( F(#f.&tl?W媝dYQJFCA@@BCFKR~Iog:.&(#f$!E+)3$$3 '%6(Y,$}tm@e_SH@62.,**+,.24:CJMme9-%{%X%6'3 3 "" ?$hTN%cꯠeSF80*Ū&ʪ$ή"ϯ!Ѱ Ѱ Я ή!̫$ǧ$(*/5>I|JTL$( e ?""3  "D"pskDj\J9.ŧ'ͭ"ӲطܺݻڹӴή"ŧ%*/6AJha:#mC"  @pcڭnWD2'Ǩ!ϯ׵ܺ޼ضѲȪ!$*1:~IwmIoA  8ig٬pW?,#äʫЯԳֵطععڹڹڹعط׶մѲͮħ $+w5vFpgHj 8 + ]}eϩw]B- x!q)}m4qFg`F[+ JZWDgI(^k ]o#^j"]h \fZf Zf [f [f [f [f [f [f [f [f [f [f [f [f [f [f ZgXeWfVgSiAY=xfwf(yh8~nKPM9I5,* }sX;>g[Rswwwwwwwwwwwwwwwwwwwwwwf*MDk[sc"wf1wg@wjO+){5"P{ڢgG3#RtL[m$FB`Sn^ td-wh;xhHf_QO"5CCAvX@,!ʫVxHVmCAZNl\wg-yg9wgDwiS=;75Km}N9*!ӰѳTwHUmB@XLk[xg-yg7ufApcJc[QJ +555}exH{4(!մ`DZXSUVWWYYYomB@VKiZ xg3xhm2})$Ȩ"ڹݾX{G]f LsOMp^t gy3 `m?CNF`U&oc7tfBq`Dn\En\KfZNG"&&&izmxhPtb>~f3s,륈)统%ϰ#޾^}DVk NucV n i|4^m=DIAZP*j^:paDo_FnZEo[In^O$$$i" *eeeuhsbMo\5WMBgVFnYDrW=oV>jT@\PF2 /ٙwyk]s^IlP8jJ0jM0lR6pZ=wfD{kHȁrI|GD=5-'yR[V]Wm 3M0,&C<4XK?hUCqXAuX=nS:kT?[OE/ *̛z{m`t^KlQ8kM2iJ.kO3mU:nZBrbHuhKxoN~tMxHwDt9yo2sg*i]#GW' Z]u~zsm 2M0+&D:3XJmM1lK.lL0oR8nV@mZEn_LneQnfQjfLf^DUY=3_DoUiqϩݵm1L1*%C:0[G7kR:wYoO3nL,nM-oO2nT:oYCr`MqeUWjZ2tcs zϬm3K1*"F8+^G4nQ5tT6oO2iM5gR>PLH777SvlueSqXBsR5qM-tO.}Z=fKkUnYn_:o v7P4) I9)`G0pP5pO0lM0fL4gR@111S +떑|swiZq[FpS7dEoOpRoUtZu^webo' Ͱ/NdOC7R@,eH-nM/nL-iI.eL5_PA+ |{nbq^Lt]{a{]y[}_}b}gjm;...---,,,,,,*u+***)>ZmcTFtaNnR7jH+jI,fH/eO9VNHQQQ[ulzkzpljjkmqsU>>==<<<;;;:;Dp:9988OiypaS~kWs[pQ3hF*eJ2gR>FCC["Ӗ~w{wwywyzPϹMMLLLKKJJJJï]}s[wKHHG_v~o`ud|gkRdF-dL6]PD"eeegf]]]\\\[[[ZZdwnm[XXq~mqtwaaG1gR@OOOgŖ©ê|òonnnmmmlllkn~mi}~ndM8^UK KKKDľ²ıƲɴʴʴò~~~}}}}ɼ|{iVbPB???D vvvrÿɾ˽̼ϽѾѽĵǽĴ²aN>UUStɽǻǹɹɻɿ·Ƽɼ̾Ϳ̿ɽƽraR]YTĻyiYbYTq_Og`Y{zjjZNige{jjjJ͏ɿ}oo_Pmf\```Jx猆|ſwgWrbTrg]rppx v~wwo}qf~r~|{}m]teTufWviZyl_sohvvtv 444'gͅ}x}u{rwowm}sk|to~yvyyvg444'  ??( @  mqcZK"SC1VH8\J:\J:VH8SC1ZK"qcmj \U!RE;pd'mPXۚU䚌Q嚌P喋R䓉UۊLmd%mRE;\U!j fQO>=O\짗TF?74468?KO}IO>=fQUU C<&si7w_䨘S@.'ħ#ɫ ͮ ή ̭"Ũ$',4CNqi5wC<&UU ?71)}S^F."ǨѲڹݼ޼ۻӴʬ")6~H{sH71)?#$}yVa?$¤ȪˬͭήϮήˬȪĦ"x.sCpjH#$pjUm|~O>`PEdCFd>Fd]Ckh(|k.|mFgfJ##G{UgqCQbiiiiiiiiiiiiii\*OIrc"wg5xlQ$$FzȒl}@%}-I|l$IDn_sf3sfFlg[ 666U{[u5"}- Zy|{z{{{l!FDk]sd0ob@qfU666U ||zvxkKk0$ɪع+O}sG Ip Jr NrOrM~~l EEi\rd4l_@k\L_]Y-}tjm^Cwb.~($غ޼*TydJ\aX r ZfwlDF_V"l_9hYBfWEk^T-HHHbtk`eT=lU-q+ꮒ,ͯ$ܾ턋+U~aJexj Zgwl@JVM(f[=fVDeUCl]OCCCb]]]oeYbN:eO.{b1薀4߳1ͱ(۽ۻބ*Hz_N\mcTiwl4è*]n4K{[DyZl7RA;3WL@cO=fN8fSBWTPxxw}l`TaM9^C(gI-lT;tbF}oMŅxMF;y.rg +K=Z_jl5R>83WI;dL8hO8fR@XTQ]]]mbW_L9`D*fE*mP5pYCrcMofQccL}3NOէMաL2lZ;pf??ZK"t3}U簞A/**.;G~r3{WH#??7,wl5||^jt=jq.px*u|)w|(t{*lt0fl6}q8bX+$>7Jp M{QWVVVVVN(FDh_=30Ota6Yupfefkh>CWP.idT-~U*&O{m[ Ei(F7N}hAAAb-wog|kZpZC/е-,,+*)G\;0$QD8-`]\\ҿ[Xh~ZOFFB>AĽŽhbYPEEEg)))|HHHc}@@@g $FFFeoomnmklihggeDDDe$ dist/jclic/icons/author_aqua.png000066400000000000000000000111221335566474600172570ustar00rootroot00000000000000PNG  IHDR00WIDATxieuᆳWe992#RX,j !Dr+`8R@bFXAÈ$ ȋٖHjDI6əjD6o3={.Uu὞}hҷo~WuNթS-&J;z. @ GHl{YF?XTuEo H;HDWLP?ݧ~_ۂy°wS#Z EY3jڝn!jD=`EVH%Վvf?z@p~l`Fۏ7nd pzn7}Wfػa$V{Ox;~ݓܳe wnބ#0@>Ez.U8x0,ro|+_yc {~jݽ.6nU%HfuBDQ]ը fUtEP;u?c9p_◀eqE7X?/?|7sA Q 4YGSB9הcur4bv*S4}KN *~_/ۤFJ+`&:i6kRkGQeF]gDF``SV3׿E0_Oq%>y0==ɮW~ϻn9={pn"}Cܻ/5tڵ,, zeM H#UP:P@p2@)iA0~Uuǖ9~,("eYSϰ&X/e1( 20=vwΉMr4>ԅSklOsD`v,MͰi򠢬$??wR`]w+AA_WPFcAXD#D|iu$.|ܳCVfFn0 ܿ>Wz eY~p+ |~ykAY&{XVh d|O6/|}Ta-}_#)@or1kNpLso_OHWٶmǫS5fnvOs&X4$R4Xڙ\>;=` LmqAY8PVS]idc!H"ǁL*@ tS5=UGNLlV5$ 3u8x.KAUW_0XIuwJ:c1%.ɉ <t Oc۶mLWՀ>DbVnzj)Ī:ޞG:%I|H\29Se]Jb>~fYm2bQ iLoٲeݻO}p|S8J zu*-DffFe=wsO;Og*L{fuk)A#JX>70}U@5ѠHԥkE%Y{{ Y6:uG|C$* }0@Z[H,Taԑse}d]/X7Ս,u؛oǮ 0YAv5-c J&P*Q:8p5nOOU 1PUE48l#hjːB>{NJj|o\oؿV~W!% 7́E4hHLlZh$@4HP 1ƠX ֊M;H\͆F(<i JC,JuH׾_ {^- P F u_TD Fb FŃ aF8uTh '˼fY ֲ2UkV+))]jg^;k|ӣuc4(υ1"(VԈDgHTDdu( X#aD$&, Vun'e%eF'Y%g7>qPGxjGMrd⭯"h$+"("UD0f5¬(ˢ4;9`EP(b4Qۑ86nxZumӲٖ:mP+(kwM^퇧g󏜺/$1uU#&@V ր졍݉w9+8k0Vj 1V[b{̆DZMەٖ:ko׷[-$eYQ{ݏīnH/'Z9 oR &(.bŊJjpk!FKKǝ38g`E\ķ;6vSj6q[vW[y2G\Om?[2>I+&Ԅ4Әhn(q_ fPرc59a&&4r['UUy'F o>x'7{/axDԆLdb2'o2j4VKMHSxcQ#F`;a e133( i4!I N5Lh6Mjwy4^wO>vk.v[`҆`b4D11&&IJH U@LXػww`(壇߫4MH$&$[m4MhzH>2<.r}Hʟ-i\Ws*tNߢmjCj0 `8$BX9A\۷oŦFF&)j+6UNcDbBQػ?&򝞋}w i`a8*p䯂DcLZ5aBlb8xpH@,K6ړ7j% $Aho%./ZUAb@M,Kv޽s={ꩧ˳v16S &I#`Dq"&p#3i`S_ ??~~v6z0_)d)$qJ̪;pll|ak3;2XFZI;#MsQ1"1!h^Y#)Jfm??8.`vuqVO sY&'?hXdq ]~͝ɫECT*}Lx<9$6ڱS [(b މ淧*p<&Z lLLyB^NSpU`ٿ4m&G8DGw^ˌD|n%<jr*$G0\V(*h5(gCĕ@k[˰3 C29dIE%8Ы, —mW밮c60p 6fr \Fw< ϩeAL9E!Ռek H$M8;-/] ڠva6hOxl96+wo(K@$FOi هB35_Xǡ2sUPq{bI`P[3l&̈́Ͷ;4s/29FL)dƪ$ʋ ߺADQQ#1HC5ojXڽ;ml%F&QC眡$yUJ\/L Gձ=?{lmwCYKN 8UxHJ&"PŋGPluw29$ a[Lg7 Vْl'۹~( |w}5= p1!K$\fx*`Buo~qHyd&}^,Iz!ρ.ّ0T5勒+ r0lp0V<+K0t, t{d!6:>bͼoZոYn oZe;"twyar&B(Ǔ0h"~P{H!ۭ60_A0yuy( ߓ%sv| x{N6ޅ <ofS|f90+.ӆKwan /!x)VP(b\| is$XzrVxW^^/[pNqMњNByn52c sA~fa@ E¥f:L >/r4ԎFy!9FH @8)>.p@ڋؚWЫ:y^& ()0mNmJCD3l.ά xӴ@"| is|N o[ضE!1J:? rho,j\Y׃S)~:lQ(bL \lĺΰsa_Y 4. +fW<|+t4wi1+\~߳آPĞNqYȆg&-5B]=lA L^O1<~aPN6IENDB`dist/jclic/icons/install.svg000066400000000000000000000050261335566474600164350ustar00rootroot00000000000000 JClic Installerimage/svg+xmlJClic InstallerFrancesc Busquetshttp://clic.xtec.catdist/jclic/icons/install_aqua.ico000066400000000000000000000353561335566474600174300ustar00rootroot0000000000000000 %6  % h6(0` %3333 35*1'4+4+1'5*333 33  "")#3"H}MUM$'"h#A    F&r{rJƮo[I9.ħ'ͭ"Ӳ׶ۺ޼޼ۺִϯȫĦ $)/6@Mph>&p F D!scڮnWE3æ(ή!ֵݻ׶ήŧåħħ %+3;JzpI!qD >okୡoV@/Ǩ$Ӳݻγ\jz:Ǫ˭ǧ#)0:IyoKl = 3ejתtZB/Ȫ$ֵ R}aZssq ͭϰǪ$*2}:xHohKc2 % Uwsaħ}bG3Ħ%Գ]yppL|fbw ͭίæ&-4w=tMc]I T% @IHxfBn^FqaPGFF6F瘓ssUo?w0("Գ"Jvs KtDO%m^wi'zl4yi>tbBm[Do^LeZQF#&&&j}m{kO|g;p1($̬"ܼ%`wutLx@N2g[%m`4ob>n^CmZDkYGo_P$$$j# ,bbbvgwfKwc;g0w,ꪌ)罠&ѳ"0Kemmmm{vmmmnbHDR>f[8k]AlZCkYDkWDn]MKGF, 4zzz|~qdq_HqZ9x_0l.蛀.㮕+æ(Ӷ#匙5W{HZzDQqAKl@Fg=1[JVP@D!D?&IC,OE*ON*OUATJg]>i[EkZFjWCmWDlZHTNI4:ݗv|m]o[EnU9pY3}f0t3ߠ3۳/ê)Զ#ݽܻӲȪ }$ZR4=TI gYsf"wk/sj;pfCmbIm`JkZGlYCmVBmYF\QK:=|swiZmYDkR9mU0tZ3j4ސy8֞6Ѯ3-̱%չܾۺֶұɫ }'ZQ1:QGg[vk/}r?|rKukQpeRobOn\HmVAoXBkVCfUH=?zpwiYlWBjO6kP2nU2w`8ނl=Տ{=Λ<ǧ5ñ.( ¥ pw$[P)4"IB`W)sj>}tP}tXwnZsiWpaPp]InW@pV?iT>kYI?=zpvgVnXDiM5iK1kO2pY9wc={jA΂r@džw<Š{4~-$~{Rz,%}E{YWP$0$@:VQ2jeGtnUxn\ujZsfWr`Or]GqX?pThYzX8rQ3jM3hP:ULF#qqq~rgsaNqV?tS5pL+;cG`0>>===<=zN--51Cu衒Y4"۹YndY:]B ˮ$0{A~uV62Bqi?%Ӳ˴,ebjP8Y? Ī(7qInjY EEEgU0 ݻ͵ZmfY>Z9 %4~nAwjUFFFf !ҊnrD}*ɲ*bde~O3U?{"2{l=n`Hf_Z!333T~t`wf;w)!ܺݻ"^ieP7U:{k}o0se=i[DpdW111SpnnthVnZ5k*%в!ʶ#`ke|S3QGi^0i\=cVCi[LYWVҀ{tm^OeR2y`-,罡)ָ!*b`O} U R~ QnSL}NNF}YW:cW@`R@fUF_ZR'|tmhXJ^K1nU,p2⦏4+Զ"˴޽⮛枋6\DfJ~FG_Zfc.icբ9̳/Ƚ#Ǽȷʫ 5[CgI~EDk_'wn@wmPmdPhWIcO=fR?k[M-/umfeRD^E.`E*lT8tc?{m@ˀq8Áu+rt&Aw6~MxdgG;<"_X9pkRwm]ofVjWGfO:dN:iYI/-wogbRC]D-_D)dI1^M6=XCkUgi̧qjG24)TPCfcVof[l]NjTAfM4aL7iXG-'{sldTF`H0_@$mTj|ܴpF+30NJCc[TnaSnYFlRSP7Ŭ+Ǯ)(.>K\J:fU;28fٷEȭ'ܽ'ZrAgKw4UK<3eU§)²[wlH:M,t@{V BB6UBĪ Wzl}P;J+nf,ypR>>2Qrrot};"ꎕ3 Ty^seG8F7e\F^^Yщoyg;}*t<*ZX(RJVi =Y@OCK>`WHc[X"܁yniW=^X.Ki7&uFfgi3DHD,b[IfXK^WQс{s6ePi}šƤ~k3IC@5]REfTEVPJrrrVk]./.-,,+=\qdZS`N>[H8OLJ777Se^]\\_cuws]N=444SyxxROJ(qmh((~~~ffb(777SmmmwtpҌ㊇bb_444Sdist/jclic/icons/install_aqua.png000066400000000000000000000111411335566474600174240ustar00rootroot00000000000000PNG  IHDR00W(IDATxݙk]Wuk}9O;886@Qx6"PTUUjORUK!B- ("7P qpG&όg뜳^ı-ݫ}=gk׃7 5ݣ@{лs ^{cя/>C (!y яۻwI*wqǟ7@<2qb-4AvGÒ00*yjA~qM?)VƉXf| jqL9_9!8Rrt5@uoqۮf244믹 ;%gE _q>r$=6EV?UTuZǻox'V\EЮx*gY>ڛX* .I~KY]b u>r5Ć^C"(} f3 D8#xh B!)èp`]:/ą/}\xuBTB69Y"/"`{3+5193tOPU[Y}.ٟ>+f3|w[|ݵBA(\@<02j6A։TP1 ꁀڥBwPHE၇~m~&s:@`;tRbH2#VOcbkSȁv X#t: "4)ڭdy l#G c@lμ@׬T@}״Bwèҽ>o5'\Xs@oee7<lvz,,6=: g5.:+"f%5I$ {<6 H?'=3'^`>~J@cvNhgAZsb~eDIYL11@LB8 0"BPqP/zS{A ݲe;`aG+rGHӰ=_כM5d14NalWx%K&&cKIJx=,C;,Q򱉉>|}z뭷vq(`{[;9_"L[+_<>wC\GTP2Q0\xq Dd*+w^{Ç>@~mYQKfcpqǁz.rˤi)1 'I*"@O-40;=mS ,@z 7lKEC2q @ J94\73ǀM-]Y޼Ih,"2R ru\ә3e€X Ĕ7ڵk۳>; 믿ydEqF ݗv|&cS4=i@W--hi䘍z/FM;l!&b1"^DNc+<R?*n{A>^ 9Q~p`ʬذDD{0A xŪpm\˶PV@EXCCZ5J(g*eA!@""TWo a:W^> v]R,"C#U@LB 3aBsRB@AP @7NV 'j6ʓ tvUTNA1 -`6ZR&"e p2„r%* 83*Da@, &[|vJ +UW94bxnj^] ټR@/z%NlF5$Pq0޳vl 06.p.d-ITI@ę&"뜵i}5<2^5ҊQ9Y߆F.JPDqbXG&8Z` $ d-[x0QI/h*jjyJEl\R&OzxQ:k Gkb"-N\NTB).*HB*jPf583"J .CReV'MLڰU-(wEǘzB ӸҤed< P8PU!UeV]^ '8l2albV"cZ)W F~hA-C(8 |0YG `LRXPWϩ$ 0}uUk6 cPhRP#T+اYث鐺s\kΒz(@XŹԞq(A4Њ]'D`2)IȦ!YtlfffrE&20I ؔRP2`|WVlb㒁䝿|(}jR`M[*3[f'X5 Q5́E ;Xy'xn|Ǔ(BİQA "*Kee\>)%V;oaǰqB/oIJNLw6a )0I ^ɰ0 j<^}ՃLGqM#$eR#I$B\BblZ56D~.,og{^)w̍AFHʬ6EȵgHoyfSSYh^Wj*U2k5 qdH}:/㡁ꥭW^awaqUtxiX"v 6ѢxG{1Yc/fo7i$ R$EHR80 l`=DgSXNcy4WVqmhy5פ611y0Qֱzvzgp L<w$萡 m D15;%PYM0:09񏿅Uix&^| Q(VPrF+VjR҄YdiKh]P)9T>ԑW\qx`pb4xBtxBP<AYʪ 뾷}Lk[1(Alƪ"K\n7̠xӯ7 l$v/ k5A6<#C kW#;v`_()2e`|HqS6jjA8~GnԩYt}7EGWZS['֯6T(O 2EEN(`Llց3,u(dm*uZ\4Z.KWy=pe~hWxkd Jvid|rk\j*, ^e d$xC*)`:ܱɽOǏPIűl?x9o*%cÆyTCc0v- u޵jĖت2 0tg VX" >y|kcOh(?G').&nh00jVxexp;vn_9<220i^:ƒh.οpjzi !Bf1-[J=NQahkj*9R*D"B;,2&/,a`+X|ƍóϾe%}_SצOIENDB`dist/jclic/icons/jclic.ico000066400000000000000000000611761335566474600160360ustar00rootroot00000000000000 00h ( 00 h^"00 %'  nM h^(0`333033333333333033303;33333;3033;3;303;3333333330;0;0;3;333;33333;3333333303333330333303033330303333303;33333;3;3333;3;33;3;33;3330;3330;3033330;0333303033333030333303333;3;3;333;333333333333030????????@@@`?c????( @3330;0;30;00;;;;0;0;0;3;330333;3;3;0;;0000;00;30;;30;30030;303???( 333333333(0` ~Y????????@@@`?c????( @_???( fsL3ٌsMߠy3 pfZ @f                              (0` %YYYYYYYYYYYrY4YYY3Y[_begggec_[YYNYYYk[`go{ti`[YY Y"Y\fv{h_YY>YY'Y]ir`[YOYY`qsa[Y3Y Y]nwbYYYK[gq_YY Y Ya{h[YSY=[k~cYYYayn]Y]YYgcYY Y7]mj[Y=Yb`tv`Y}Ya{eYY YeiZY,Yeq^Y`Ye}bYYeeYY Ycxmb`wj[Y2Ya{}rje`\Y[lr_YdYf_txmgc_[YYYBYYgbYY:\frkea\YYY^Y(~8~<~YceYY Y Y_^[YYYAY~~R~~xYm_ui[Y8YHYyY`Y'~6~k~~~Y9[ms^Yp~~#~X~~˭~%YgaY~%~p~~ڹ~QYccYY~̭ˬ~Yh_ti[YC~ŧ~Y2[lu^Yy~˭~'YfbY~P~SYc~p`Y~ͮ~Yb_sxlfb^ZY~ݼ~Y,[k~rje`\YYYjY'Y~ɫ'Yd{xmgc^[YYYFY~I~ZY_a`\YYYbY(Y~~ͮ~YDYYY{YAY~ۺ~~~|Ȫ~%~?ٸŧ~N~~ϰ~~3~ںط¥~~~u~6~ ~˭~~~T~~Q~~~j~5~ ~ ~~~~H~???????( @ YY"Y+Y YY YHYYlrkkYYkYYY>YpwjY~YYk`pYY YbpyYYY?e|YY YqY`YMl`YqYxYYYYY!ljY>YAr}YYJtYYYEshY$Y2pxgYYvYZYY}pYYYvY(YYYYolYYwYLYl,lll YcyYYY?YIYl$lclllY$llY,ll[ll׷lYyYallӳlYYlllTYTvnYlԴlYinYCly¥lYvmYYY*l<l*Y{|{lYYY^Y l llmY?kYYYnY,lֶԴlYYDY lhlll'ϰl<llֶlllTlllll[llNllpl3l ????(  @3@ fZff2f3ssf3ٌffy@3ٌffff ?sffffsfLffffMߠ pyrdist/jclic/icons/jclic.png000066400000000000000000000040051335566474600160340ustar00rootroot00000000000000PNG  IHDR00WIDATxMlgwk!65q&5@Ji "E(dnB˕>UH\APBTJBB8|֍~;a6N/Ka}}ws|x$R/3?s{Z8!dg}DŽwMy) ]rޅ3xJՈLNI*3Zas\K~)e_ [{K1|`fUG.IU GMa)&ppi9z~KYR3=iǁzVV,R-* rM Ljbw6PHO"j-f&xNQ$D"`MMCq BQTXEpuzzkL_PUWK43]@@Jog39{$5Ucl(w::4b*/Wm:"Α[nxBPۜ~UDzC0'\b9(<ʾzv;%pXQIP)1;>cgQda h28DDK-M9vvEnndr8 ,e9 ITUb\GPO2#h<p MbC0+\].?; EhQE%xw:P#T}jhhf| eSi_2MEEI ¦4XFӉpf̌$6%0% 0>qY"SFc(6qir=G7*У1Har }Jpe'mAl5b`ZrR"~&)EEӓ0& Df> @x>,g z)LGmZDD`Ha#P Vb٠6kw"pgxXSƙkm,3*l^p$B4hiYb,Կ$J HʱN\!?r  6DŽ7&"Ed灯2 *K?;P7Ax Ja0ɖ ]Z/;[gX#?FŚ`j^UeFO|ʠT"txnl b: eA\#1+[@Ve?'LLJ\ ~h2Lj"oIW MY ;$1S& GͮD4CW"0LIdl@|:q<]:pA$$ M q5`v٬&3GwClkl{D|JfAb"ϵLm\Fzڂer7x'Y|f,D@TF˂Ky[leNu: yr@.~$I p(1"'={~Pzm(4b@ML[@I<$q,*3D,w{>c.5Rr}.29M.r8< L) &={nIENDB`dist/jclic/icons/jclic.svg000066400000000000000000000053211335566474600160510ustar00rootroot00000000000000 JClic Playerimage/svg+xmlJClic PlayerFrancesc Busquetshttp://clic.xtec.catdist/jclic/icons/jclic_aqua.ico000066400000000000000000000353561335566474600170460ustar00rootroot0000000000000000 %6  % h6(0` %33. <<7,334+33334+337,<<. 3333  #+!6 ?$F%"K$M$M%"K$F ?!6#+  33%",$?("R)!c)#t)#,%,%.&.&,%,%*$*#s'!b("R$?",%* '%0%"J(#e+%|;2 jb4TߕW젓]][YXUN|Kha3=5 -%{(!d%"J%0'* $$3$*( F(#f.&tl?W媝dYQJFCA@@BCFKR~Iog:.&(#f$!E+)3$$3 '%6(Y,$}tm@e_SH@62.,**+,.24:CJMme9-%{%X%6'3 3 "" ?$hTN%cꯠeSF80*ħ&ǧ#ɪ!ǨǨǧĥĦä"#'*/5>I|JTL$( e ?""3  "D"pskDj\J9.ŧ'ˬ"έа̫ͭǧ夥å $)/6AJha:#mC"  @pcڮoXF4¦)ͭ"ӳֵӳέ¤" æĦ %+3sCxeDo]FqdS111|+ :xxx›yu[pCu3)#ﰞ#XNRNqbv!~2{>qEweDn\Fo_PUPM:Gs|nU|i>m2})$~5\`(D5^Ssf"r3tB}nGtcGn\En\KfZNG"&&&izmxhPtb>~f3s,룇(\rDduGrND`V qf4xlDyiIqbHnZEo[In^O$$$i" *eeeuhsbMo\bTDmXDoW@pWAlVC]QH42ژvzk]p[GkP9kM2lN3nV7[XCMygPDFu@C0@$MBTGQKJG!*.63+KC9]O@jUAqVjT@\PF2 /ٙwyk]s^IlP8jJ0jM0kR6hU: K{GI|B[#9583<54=K)\= eDG? FkuZ.B3-'F<3ZJ:jR-89(#B0R?lUy_tß~g)7:G^s>l-)#B6,WD4gN6oS7mQ8hRmM1lK.iJ.bL4CN;"RB iUs]rٱ<+*(KE*& >3%UA-iN5lO4kN6hQoO3nL,?T: r[pرϬ eS))#LO*1<.!Q<'bG-hJ.hL4gR>PLH777SvlueSqXBsR5qM-MS6r~l652Nr~ j6P@.R<'^C(dG,eK3gR@111S +떑|swiZq[FpS7dEmO-y"""!! :OJ6PamL~H5!U<$]A&`D+bJ4_PA+ |{nbq^Lt]{ay\Lu1ؼ000//...---Ī%^B&_E,dN8VNHQQQ[ulzkzpkwtE@???>>>==<<@c^ZAw;::::;yDuSm~gll{n^q]r\s\kN1aC'aG0fQ=FCC["Ӗ~wzzTOONNNMMMLLLMnmh^yKKN_}p{zo|mmoonlkmTaF,bK6]PD"eeegf`__^^^]]]\\]s|}t~}~~}{{y|ebH1gR@OOOgŖqqppooonnnmm{qfO:^UK KKKDľ~ïŰƱƱǰƯî¬mZdRC???D vvvrÿĽĹ²ƶ̹ϼѽѼмм͹ʷƶôhSBYYWrǾ¸ƾ˿Ϳ´ĵŵƶǶǶƶŵĴô²Ϳ˿øzgVc]XƼ|l\f]Vr`Pib[{zjjZNige{jjjJ͎ɿ}oo_Pmf\```Jx猆|ſwgWrbTrg]rppx v~wwo}qf~r~|{}m]teTufWviZyl_sohvvtv 444'gͅ}x}u{rwowm}sk|to~yvyyvg444'  ??( @  mqcZK"SC1VH8\J:\J:VH8SC1ZK"qcmj \U!RE;pd'mPXۚU䚌Q嚌P喋R䓉UۊLmd%mRE;\U!j fQO>=O\짗TF?74468?KO}IO>=fQUU C<&si7w_䨘S@.&!!%+4CNqi5wC<&UU ?71)}S`G0#ħæ")8J}uJ93(?#$}yVeD*ȨήVsAWwPS RVu:^E{(5}HwoK$#pjUnI*ȪԳ)Ibz{d U~Zf%*8wLjdM##G{V1Ѳw4 [{wO7Y? #0w=|oU$$FzȒl}@'Ǩ" X|UR_%-y;xjIlg[ 666U{[u5#å&^bly Nyp -y:ufCqfU666U ||zvxkKk0$#L[@S-w,v?qdCk\L_]Y-}tjm^Cwb.{'er<[u Jpm_~q.}oBl^DfWEk^T-HHHbtk`eT=lU-m*EaKeJGI$g^0odCiYDeUCl]OCCCb]]]oeYbN:eO.w_/7WRiW s76668z}3NOէMաL2lZ;pf??ZK"w3|X涣D.%$)6Gވ{5x\U!??7,wl5|[4m~<XuP~P}QXgg!&E{p6v7,>7Jp<[yHTzi Ksf]|+퐄TB>Eta7 UiG[i\~sDxq_-~UPhGcGDCf_ӝnII$%jn'p? AF@!h-ǝİaw rlE+"$RSS,\ugܫ-(SK/kswo2 (rtwHl}h04/?\!{,Nt6 (z'? :Y /h4ZMU8? `EV%> 9Yf`F|nmv9F_W:RwNWR屧NO?s/Ј._W\l4a>?NްJ_e}C {W2AayuƷxn7/ٗmqU◾q/>|xTUN镲?<$ sy$[|xEN?/|ObSGgVEYT,><$"«5(#*t`xEz_A _pqzA^TdEEf P}( G1e% ZĘ!WgHա SUsf7` y&gz(,\'i hOصGM XZn%yUQy^P#Kb(>=YV2becn>:774x_:(S 66ܓPZa'\k++-W5kjX HQ2R/Q_`bzzs7ˣ0 A\֡B/P_=S^&⯸tA8w6`]˄zƢq".AU:/+ mr}|;se(] wyo )~FgCZf\'Ba~^X]h/;̚HY].ں &l$ƅ8ރzf+bȥW|ӟ>&ou 2K'BQYMJyPVW`c^1U=T]Y!+U9vR%\LXI2qHQA.J&>~ᇿ(t{$M Y&:j:wUU~6Ξ geZ )LXh)+ /qcYY6:g4{y>SVղTuh6 ~Dx*.(ˋ/[,LaԾ뢲 r+%-OR¨&bAM0ywzEfѣGK)RUtKM0ϐԯyweXXIoo_M~;UA*yaۨ+ΉXx7 EEQQe𾬌jߞ<{(?wjN`b`jƛwbg "f_@_zHpJ%-+`Q6 16 qYQkWĀs Wx|rW Z &h76<>z`X^-/M0>+s_,6Fo _[(ABFZU1F1g>KA V"F %Ip~ЎCphaYO̯\{Yi8a-RbèRZ? k@(; 5ƩZOzCLݞ\iQOomsr=Ϥ 6N*gxc^1yF~3(638g`8RMR66b{Mw` [+i6zjuHbQ@(baRvG}59a[[nМ¾Vt4YmV[o IMP+F`N=ΰe:;;{&M0taN'bSjݦ?(ˁBN[W+%cƌ2hgBnTbPL;N:3( Ç!/̝0 X(CC='n},7lߝu3xv.FRF60F@+h9 C?Cazb8V>Llھ8[gXG0>i5a޴5㍱ pqCHd~ꩧ-qDDAd5V]`V,><xJ{;1i9.ĉ-"օb`ǟՎ2\$ IZ-( c͟-zbW Tݬiqca נּ1IH.2Z^ X?4J='9c") !\Wc?,vWQ=> BߕemQjc|F?0|.ۛ-HhӜ8Db%,y.~i\"JcEAmy߉X"**J2czmNa-u8!4ƻ$lS2qoӌemHg{5dbZpaxׯ}ƛ*auEϢa7WTyl-Rŗk0.D ZBgY_$iόэ/??/N1X_ኖBP*tN~2lԣ}{9cRėb =+ufchGӸz nhPkD1s!D@޶I]:Z@fꛉ+!Dz0gW>S,w:[fffƒV[JlUb+'Pqƨ3'Y"{0QJ$6gƪO|'.U=B{23p$fw~pדZRqji,XG-:A1U)0U.aUJ"_`[ |G<=M\BRTn 5 6wc>,7 wsÁS!)*T UVHhI͕ͥK*?/⣋ mNz wcc⪅\ؽ;]o;xA%0AU]fݭ*l-Ο?_u:(%D%Y&[l^o"&&bjP"tPich 4061}r(T}6鐗kn_f}}G5opŐIhh uMH@1vZeF!BӣuJpd_αcn^;Ƒ#EͭNTOE$s 畭}Aαc%*73IENDB`dist/jclic/icons/reports.ico000066400000000000000000000611761335566474600164500ustar00rootroot00000000000000 00h ( 00 h^"00 %'  nM h^(0`3333333333333333333333333333333333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;333;3;3333333;3;3333333;3;3;3;333;3;33333;3;33333;30;3;33333;0;3;3333;0;3;33;0;3;33333333;33333333;333;3330;33;0;3;0;3;3;333;333;333333333;3033333;30;3330;333333333333333                             ??( @333333333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;333;;;;;;3;;3;;3;0;;;0333;0;;0;;;;;;;3330030;303( 833833833338(0` ~Y                             ??( @lY( fs@ܖy&փ                                            (0` %YQYYYYYYYYYYYFY'YYYYYYYYYYY_Y YYYYYYYYYYYY_dhhhhhhc^YY[^aggggggd_YY$]`fffffff_YYe{aYYlavdYY3]mgYYe{aYYlavdYY3]mgYYe{aYYlavdYY3]mgYYe{aYYlavdYY3]mgYYe{aYYlaveYY3]mgYYe{aYYlaveYY3]mgYYe{aYYlavdYY3]mgYYe{aYYlavdYY3]mgYYe{aYYlavdYY3]mhYYe{aYYlavdYY3]mhYYe{aYYlavdYY3]mgYYe{aYYlavdYY3]mgYYe{aYYlavdYY3]mgYYe{aYYjbvdYY3]mgYYe{aYYjavdYY2^mgYYc}w`YYlaudYY2^mgYY]cggggggc^Y}YlaudYY4]mgYYYYYYYYYYYYYEYlaudYY4]mgYYlaudYY4]mgY~ ~9~o~~~{~ YlaudYY4]mgY~~&~e~~~7YlaudYY4]mgY~~X~~åٸ~mYlaudYY4]mgY~~M~~~Ӵٸ~YlaudYY4]mgY~F~~Ȫ~~YlaudYY4]mgY~ƨ޽~EYlaudYY4]mgY~ѱȪ~|Y]biiiiiig`YY4]mgY~sħ߾~^fYYYYYYYYYYYiY4]mgY~4-Y YYYYYYYYYYY4]mgY~~~]Y4]mgY~ͮϰ~Y4]mgY~_~~Y4]mgY~!~<Y4]mgY~޼¥~oY4]mgY~Ȫڹ~Y4]mgY~G~~YA[_iiiiiii`Y~~~QY-YYYYYYYYYYY~յί~KYY YYYYYYYYYY~nӳ~~s~~3ظŧ~~~_~$~~ ~ˬȪ~~~i~+~~~~~v~:~~j~~~{~@~( @ _deee__eggg__eggg_fhgfgffhgfgffhgfgffhgfgffhgfgffhgfgffhgfgffhgfgffhgfgfeggfgf`efff_gfgfgfgf~~O~1gfgf~~@gfgf~~(~nӳ~ gfgf~ɫ~@eegf~Qа~w_ffff_gf~gf~~ gfҲ~Hgf~Vбgf~ee~_ffff_~{Ȫ~d~8ɪ~ Դ~w~9~ ~D~~G~T~(  @@ܖy&փffff@ܖffffsffff@ܖffff&փyydist/jclic/icons/reports.png000066400000000000000000000025561335566474600164570ustar00rootroot00000000000000PNG  IHDR00W5IDATxoU?3v؉,*jSDBM)RiE9ȡs7B$ĉ".! [ԦJU%i6ql̛8!Mbv|3o~t7 +3G&EڢO57T ( %d \gR,Pl0|O14ׁr5lˤb *¤" -`IaXNW@Qa(ao,aQrlS^&i&hpP 6CmC_ Qʓ40)u!X\,_eRzi`BՈ &[4R 1ӀR=^*0e0fJH<2t <ct$0n5Az ~@kgwhd  M' Dֿ!O9) +P5V~7 X*s`ۙlV ~myϮ>l@^ U#>8Ա́-e@:!I栮Nwߡ-G%kKJ,=}żR)5pZU b[a2@:K8j%Ga1A }y[N$axL ,r͵y"Jn\1pN Hw.wW8 |]+M/w3抁Sp\MroYLP%mrS Uj6 8r 8$G`pB^j¢} C glfoaU c5 2"wt"0ahͧXel˿nEul p)eT `UUF DЯ EcHfqPK<?ͤeBP&,Er@ zcp41M/G_4/gmfz2) ts9l3 NV+/W\$9{~f4Dy֒Ia7t\ /ҶdRԀ_eh@<6`5&/=:y񰆪7ieP $N ̇5O5_@ iFĀ-xA"M$.JXC)-:/yuI2]|'=߻p8]Hkt<.Ot< [.{vNFBf7` !@Ewf|Q쁾P-Nw,,{uT PX6X6KUeXx,]\j XIENDB`dist/jclic/icons/reports.svg000066400000000000000000000064311335566474600164660ustar00rootroot00000000000000 JClic Reportsimage/svg+xmlJClic ReportsFrancesc Busquetshttp://clic.xtec.catdist/jclic/icons/reports_aqua.ico000066400000000000000000000353561335566474600174600ustar00rootroot0000000000000000 %6  % h6(0` %3333 35*1'4+4+1'5*333 33  "")#3"H}MUM$'"h#A    F&r{rJƮo[I9.ħ'ͭ"Ӳ׶ۺ޼޼ܺطӴή"Ħ%*/6@Mph>&p F D!scڮnWE3æ(ή!ֵݻ׷ϯ"å&+3;JzpI!qD >okୡoV@/Ǩ$Ѱڹطί"(.~8|GxmJm = 3ejתtZB/Ȫ$մܻ޼۹׶ֶڹܺݻڹ׶عܻݽݻԵʬ$},u6sElfJd2 % Uwsaħ}bG3Ħ%Գݻа¤ ĦˬаˬĦ å ʫˬ¤~y#r-m9pJc]I T% @IHkYI?=zpvgVnXDiM5iK1kO2pY9wc=~kB΂s@ǁt:}p1uh#j^bU_RfX q_ _k_CK>5 Vm\=X3/'F@5ZODhWFp[FqX?pTiZ>f]9bY4QV.6[3kEqMMGYM\k_?O3,Um\;X1.(E>6ZMBiVCqXBrV:oS9hQ:iVE:4{rwiYr\FlP5hJ.eF+bG/\G1SH5tW9nP6hP:cRB4 ,ؘ~uyk\s]InR6fI.ML30W?rYm{رL:.+Uk_>Y+)Tm\:W2,&F<2]K:mT>>Chb]slgzs퍅|딊ꙍ뚏얉~@:9998TpsdUnYu\|^BkI*gI1eO:UOM %%%7zqhQPPPOOONNMMOotm~wnx򥖉󦖈OIIHHHf}rayf~i}efF+bK5bPB 7 ~ea```___^^^_ͼtx`ZYYXXwpsvybH.eO;[UP $铎vƸrrrqqpppooo}|{zaK6cSD$ iiicʾ̿ðDzʵ˶ʴDzįqgTDUUUcɾĶʸϼѾҾӿҿѽϼ͹ʸǶĴ²jXF]ZUøǿöĶŷƷɸɸʸɷɷǷƶŵĵ²̿ʿøwgUd[TŽ|l[g]Ur`Pib[sn_PkhddddLڌɿ}oo_PmdZfffK x狆|ü~wgWrbTrg]rppx  vwwo~rh{m`}queTueVugXwi[yl_tojvvtv 555&ğ{چ~v{rypwo{to}xs{yvyyvg555&  ??( @   xiUE!SC1SB=UFERDGUFESB=SC1UE!ximjUND4l`(jPXۙUWSSN쒅Qۈ~Ll`(jND4jUm_OU?0uj3|[ۧXH?51/037@LOvk3{U?0_O\EZPO\Ʃ[E2(Ħ#ɫ ίϯί̬!ŧ$'.9FN[UN\EU<TKUi꩙R6'˭طۺϰ &/=OOISU<--B?PkꨗQ3¥"Ӳۺ޼޽ͯ!*:yNC=O--51Cu衒Y4"ִۺаŧ å ̭ӴѱʬǩˬӲа¤|*s=}rU62Bqi?%Ӳ"p ^ _Zay9;tf\]Yd|:o;\ _Z+fjro0|mFnjY EEEgU0 ݻ bi{S?eFg|`zXBgGMrHZzd\|yhp)yj>wjUFFFf !ҊnrD}* aqV6ZEbzh]8^FFjF_kYzo`~n+wh;o`Hf_Z!333T~t`wf;w)!ܺݼ bqV5ZFbzh^8]EFjF_kX{k\{m/ug=j\EpdW111SpnnthVnZ5k*%в!ֵ `qV5ZFbzh^8]EDhD_kW}bUrg3pcAfYDi[LYWVҀ{tm^OeR2y`-,罡)Ū _qV2WD`xh^4ZD?fF_k U~VM"j_:k^EeUCfUF_ZR'|tmhXJ^K1nU,p2⦏4۱(]lU4[F`zh^-UD8`I_k RJD'`X@gZFcSAeRB`WN'-wogeTE[E.eL-yf8x>՗6VOSL3]K_}h^'PG/YL_kPC=,YPBeVFdP>fR?k[M-/umfeRD^E._D*lU6tc?ykAti3h[!ZQCYcU ]g^HN!PU_kN=80ULCfRDfO:dN:iYI/-wogbRC\C,[A']E.[H5GQ=']E sZik/Y3 Wh^BTG\_kM:5/UH=fO=fM4aL7iXG-'{sldTF\F.6N5fNgņE3Rb|[C_Hg_kM;4,UE6fM8hL3bK6\PD'ҀzsgXJOG3l˦ Ѱm]^]b]*Xy,Zz lp N=3'WC0kM3dG-`K6XRJpnn~k`USG5n &%%$##&SPNa_\khfqmkqnjHp {*iWH9_E-eF+`E,bN9ROM666TtkbgXIU;;::998:bke{tm舁z咊㑈~c554@xteSjTdG+_F.gTD333T!Ҁysy{UʶRRQQPPQ˷i~x󦙊򧗉zLKJYuf}i}fO_I4YRJ! KKKfp´lkkjjiitjjiy{}lhTDAAAf zyyʾµðʵ˵Ʋ®teZTP=¿ɾžͿòIJIJðѿͽʻŸĸj_V= Di^WD  F~|{浱nfZD  ?rpo~pba]Y= KKKfzywҁ{sureXgb\FFFf !666Tkjjwspuqm~ul{pgzpgmf^lhfcbb333T! '-/-'?(  @xifP#dU3YL9dU3fP#xiuN aQ/}o'nMSݧO楙NܜHr(kfU-uN fUVE>SP7Ŭ+ɯ)ǭ)4CK\J:fU;28fٷEè&Ū˭вȪ"3zJ<37eU§)Hk[^u7\Z,ecW$`mkb.smL BB6UBĪ *tOj6%xmfG%Se5kZ#Mে'{ @O;O ?#;W~CO5ȣUM`"1F,$}ȑ#Wh~R@n x_7?\s,kl؇f]TNo{~|O 8 d'w&u;aϞ=w^ݽwm}Ƙ.py~qx4 wYgl`7u#o|3gKV|y`L7WTo t2|'g~/?~ޅYg"ЮN0bݝ]"\_~dO~ktfu[7:I;?pm  fS)T7فh(O_|N˿Lj[l ??/>{YZ]gR_i{sם`,@~^!KׯXR,M$C1{ GA'fnVci ~X%)Χ82I;?՗a}}z.M >я~UƤثH{ қ_o>7WVۈw%6\"H]Z<5[7 g .^Y\Bb?ӧO M޻ʺf\Ls'sė;0׍Sz%J㝴16!Krsi4&Fljzhe)mJl,W\]1FcUje _#0I'^"^:c-&/791TU3qMb!ozW3rgKvcu"m2/'Z$Ç?/^JOe>MKYםMG|{)#Gɧo\ .x\dzl̊J' =vbUݵnW3Q/^ӘݥŰyjBQhs? /63bqq6mj#m`H๿ w]F +|<\:˫꾻/ܻjz5[>ҬŚ^1HNB"ќ4(vѢ#Z$H P5` !`E{ۿ&Rss gZ]. w2r{J=Ҋ;4t,J-o^TQSs nȋ^IEtPֻ붹Z[yG'U|Kgfl8;M{ecvv66tѥE,Xt5Hq!tHLz&$ D3b f1F'K|^i23\w6NM]\-|\6~5}`=MU'ϧ!v EhUD̄(BD!iApM/qkAR1hEJ/}1mF&=맯>ц q>K-Kgu>MO674L4JTũXK (NDG/( ѢJ'E˲@я /\׏/8?Mj7Χ$q0,Ld\$3U!(fT0  `@lܩT9^fCfFx.Q?v!8 @&'SQM# '3ڦdZ5|Ny% \o \(I xgW!f$4$$y/*qGMRBARDs.J0S'1ќSq"N;D=wd^q^!q\bf0`\^KQBSDm;EKYmL(ט^TAհ bPeZCR|I8RHOD\ۢ^Ϸ٤)YiDVTTQ \L2$6>VCyo+'FIN4OŷeR.fY.!-4Qn/>k$JbZZqJ$iƗO8qb@fX9 _O"{<MgibS蜻 i]*Jt朶4*❲q׀Q*g}PeEB_He%^^M3S|!"j+h83yUgu )@ A鯮ѣ*^˼S9 gB6 P[[K$o/E\y5TbJ6nuu]2Á.ǼOџź^AO '`c+P4:& xtvcҼz@}df_oMQLLj[gթM3g_CiAnjڪ4k ǯٕW)npziF{K* ~>j"hbQYgpn*c9u@b 񛿵] q!xq?˙9ހ.6ZX4ͅ4C |mU y4C DLʉxt}d#fuETJM-N8OQO\঺ЭQ=_}СŠHk"AD0AD$MoڟAsp303 Ez}$ q$M,IRK9RR PqnK}|fr/ `@iInG }{Ů#!DE'h Y\^ YaZL4L#7¼KMY$K@^O$oj7sx?^9/?Q?>o/||3-@⹅V"lq!"SSuY[]AĜ.M&eI:ސ\dj1'kW=iԯR7{;@Y6 { #QC<6 iDmkiЪFj\YV%17HFk$[_bDu={,3n2gn_4`@jV^:-g vОd:go&& o/,ps{P0g;w^ر;yo8 шS=Lb[գեKחV/D"]t86v-7܈RBNo y8Y 0#HjY$D1ֆMuB\[&e7-3RI&h'DaW@ v=ơO{4VXN 4BiC#%L1=ɘQ͝;x;@©S쾔yV@GcKuZr'h.s]\IENDB`dist/jclic/jclic-aqua-icons.sit000066400000000000000000000001171335566474600167720ustar00rootroot00000000000000StuffIt (c)1997-2002 Aladdin Systems, Inc., http://www.aladdinsys.com/StuffIt/ dist/jclic/jclic-google.xml000066400000000000000000000067171335566474600162230ustar00rootroot00000000000000 https://clic.xtec.cat/favicon.ico ]]> dist/jclic/jclicplugin-applet.js000066400000000000000000000226761335566474600172710ustar00rootroot00000000000000var player_files = "jclic.jar"; var player_versions = "0.3.2.6"; var author_files = "jclicauthor.jar"; var author_versions = "0.3.2.6"; var jar_cache_files = player_files; var jar_cache_versions = player_versions; var mainClass="JClicApplet"; var _info = navigator.userAgent; var _ns = false; var _mac = false; var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0); if(_info.indexOf("Opera")>=0){ _ie=false; _ns=true; } else if(_ie==false){ _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0) || (_info.indexOf("AIX") > 0) || (_info.indexOf("OS/2") > 0))); _mac = _info.indexOf("Mac_PowerPC") > 0; } var jarBase='http://clic.xtec.cat/dist/jclic'; function setJarBase(base){ jarBase=base; } var useLanguage=false; var language=''; var country=''; var variant=''; function setLanguage(l, c, v){ if(l!=null){ language=l.toString(); if(c!=null) country=c.toString(); if(v!=null) variant=v.toString(); useLanguage=true; } } var useReporter=false; var reporterClass=''; var reporterParams=''; function setReporter(rClass, rParams){ if(rClass!=null){ reporterClass=rClass.toString(); if(rParams!=null) reporterParams=rParams.toString(); useReporter=true; } } var useSkin=false; var skinName=''; function setSkin(skName){ if(skName!=null){ skinName=skName.toString(); useSkin=true; } } var useCookie=false; var cookie=''; function setCookie(text){ if(text!=null){ cookie=text.toString(); useCookie=true; } } var useExitUrl=false; var exitUrl=''; function setExitUrl(text){ if(text!=null){ exitUrl=text.toString(); useExitUrl=true; } } var useInfoUrlFrame=false; var infoUrlFrame=''; function setInfoUrlFrame(text){ if(text!=null){ infoUrlFrame=text.toString(); useInfoUrlFrame=true; } } var useSequence=false; var sequence=''; function setSequence(text){ if(text!=null){ sequence=text.toString(); useSequence=true; } } var useSystemSounds=false; var systemSounds=false; function setSystemSounds(value){ if(value!=null){ systemSounds=value.toString(); useSystemSounds=true; } } var useCompressImages=false; var compressImages=true; function setCompressImages(value){ if(value!=null){ compressImages=value.toString(); useCompressImages=true; } } var useTrace=false; var trace=false; function setTrace(value){ if(value!=null){ trace=value.toString(); useTrace=true; } } var useMyURL=true; var myURL=window.location.href; var isFile=false; if(myURL.indexOf("file:")==0){ isFile=true; } var authorApplet=false; function setAuthorApplet(value){ if(value!=null){ authorApplet=value; if(authorApplet==true){ jar_cache_files = player_files+","+author_files; jar_cache_versions = player_versions+","+author_versions; mainClass="JClicAuthorApplet"; } else { jar_cache_files = player_files; jar_cache_versions = player_versions; mainClass="JClicApplet"; } } } function writePlugin(project, width, height, rWidth, rHeight){ document.writeln(getPlugin(project, width, height, rWidth, rHeight)); } function writeCacheInfo(p){ document.writeln(getCacheInfo(p)); } function writeDownloadPageInfo(){ document.writeln(getDownloadPageInfo()); } function writeParams(project, p){ document.writeln(getParams(project, p)); } function writeTable(w, h, nsw, nsh, s){ document.write(getTable(w, h, nsw, nsh, s)); } function getPlugin(project, width, height, rWidth, rHeight){ var w=width.toString(); var h=height.toString(); var nsw=w; var nsh=h; if(rWidth!=null) w=rWidth.toString(); if(rHeight!=null) h=rHeight.toString(); var htmlcode = ''; if (_ie == true){ htmlcode = '' + '' + '' + getCacheInfo(true) + '' + '' + getParams(project, true) + getDownloadPageInfo() + ''; } else if (_ns == true){ htmlcode = '' + '' + getDownloadPageInfo() + '' + ''; } else{ htmlcode = '' + '' + '' + getParams(project, true) + ''; } return htmlcode; } function getCacheInfo(p){ var htmlcode = ''; if(p){ htmlcode = '' + ''; if(!isFile){ htmlcode += ''; } }else{ htmlcode = ' cache_option="Plugin"' + ' cache_archive="' +jar_cache_files+ '"'; if(!isFile){ htmlcode += ' cache_version="' +jar_cache_versions+ '"'; } } return htmlcode; } function getParams(project, p){ var htmlcode = ''; if(p) htmlcode += ''; else htmlcode += ' activityPack="' +project+ '"'; if(useSequence){ if(p) htmlcode += ''; else htmlcode += ' sequence="' +sequence+ '" '; } if(useLanguage){ if(p){ htmlcode += '' + '' + ''; } else htmlcode += ' language="' +language+ '" country="' +country+ '" variant="' +variant+ '" '; } if(useSkin){ if(p) htmlcode += ''; else htmlcode += ' skin="' +skinName+ '" '; } if(useExitUrl){ if(p) htmlcode += ''; else htmlcode += ' exitUrl="' +exitUrl+ '" '; } if(useInfoUrlFrame){ if(p) htmlcode += ''; else htmlcode += ' infoUrlFrame="' +infoUrlFrame+ '" '; } if(useReporter){ if(p){ htmlcode += '' + ''; } else htmlcode += ' reporter="' +reporterClass+ '" reporterParams="' +reporterParams+ '" '; } if(useCookie){ if(p) htmlcode += ''; else htmlcode += ' cookie="' +cookie+ '" '; } if(useSystemSounds){ if(p) htmlcode += ''; else htmlcode += ' systemSounds="' +systemSounds+ '" '; } if(useCompressImages){ if(p) htmlcode += ''; else htmlcode += ' compressImages="' +compressImages+ '" '; } if(useTrace){ if(p) htmlcode += ''; else htmlcode += ' trace="' +trace+ '" '; } if(useMyURL){ if(p) htmlcode += ''; else htmlcode += ' myurl="' +myURL+ '" '; } return htmlcode; } function getDownloadPageInfo(){ var htmlcode = ''; var pluginBase="http://clic.xtec.cat/"; var pluginCat=pluginBase+"ca/jclic/instjava.htm"; var pluginEsp=pluginBase+"es/jclic/instjava.htm"; var pluginEng=pluginBase+"en/jclic/instjava.htm"; htmlcode += ''+ 'Per utilitzar aquesta aplicació cal instal·lar un plug-in Java™ actualitzat
Feu clic aquí per descarregar-lo
 
'+ 'Para utilizar esta aplicación es necesario un plug-in Java™ actualizado
Haga clic aquí para descargarlo
 
'+ 'In order to run this program you need an updated Java™ plug-in
Click here to download it
'+ '
'; return htmlcode; } function getTable(w, h, nsw, nsh, s){ var htmlcode = ''; htmlcode += ''; } function getParams(project, w, h) { var options = ''; if (w) options = options + ',"width":"' + w + '"'; if (h) options = options + ',"height":"' + h + '"'; if (useSequence) options = options + ',"sequence":"' + sequence + '"'; if (useLanguage) { var l = language; if (country !== '') l = l + '_' + country; if (variant !== '') l = l + '@' + variant; options = options + ',"lang":"' + l + '"'; } if (useSkin) options = options + ',"skin":"' + skinName + '"'; if (useExitUrl) options = options + ',"exitUrl":"' + exitUrl + '"'; if (useInfoUrlFrame) options = options + ',"infoUrlFrame":"' + infoUrlFrame + '"'; if (useReporter) { options = options + ',"reporter":"' + reporterClass + '"'; if (reporterParams !== '') { reporterParams.split(';').forEach(function (s) { if (s.indexOf('=') > 0) { var kv = s.split('='); options = options + ',"' + kv[0] + '":"' + kv[1] + '"'; } }); } } if (useCookie) options = options + ',"cookie":"' + cookie + '"'; if (useSystemSounds) options = options + ',"systemSounds":"' + systemSounds + '"'; if (useCompressImages) options = options + ',"compressImages":"' + compressImages + '"'; if (useTrace) options = options + ',"logLevel":"trace"'; if (useMyURL) options = options + ',"myURL":"' + myURL + '"'; // Check if equivalent project of type 'jclic.js' exists if (project.match(/^http.?:\/\/clic.xtec.cat\/.*\/jclic\/.*\.jclic\.zip$/)) { project = project //.replace(/^http:\/\//, 'https://') .replace(/\/jclic\//, '/jclic.js/') .replace(/\.zip$/, ''); } var htmlcode = ' data-project="' + project + '"'; if (options.length > 0) htmlcode = htmlcode + ' data-options=\'{' + options.substring(1) + '}\''; return htmlcode; } function getTable(w, h, nsw, nsh, s) { var htmlcode = ''; htmlcode += '
0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0); if(_info.indexOf("Opera")>=0){ _ie=false; _ns=true; } else if(_ie==false){ _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0) || (_info.indexOf("AIX") > 0) || (_info.indexOf("OS/2") > 0))); _mac = _info.indexOf("Mac_PowerPC") > 0; } var jarBase='https://clic.xtec.cat/dist/jclic'; function setJarBase(base){ jarBase=base; } var useLanguage=false; var language=''; var country=''; var variant=''; function setLanguage(l, c, v){ if(l!=null){ language=l.toString(); if(c!=null) country=c.toString(); if(v!=null) variant=v.toString(); useLanguage=true; } } var useReporter=false; var reporterClass=''; var reporterParams=''; function setReporter(rClass, rParams){ if(rClass!=null){ reporterClass=rClass.toString(); if(rParams!=null) reporterParams=rParams.toString(); useReporter=true; } } var useSkin=false; var skinName=''; function setSkin(skName){ if(skName!=null){ skinName=skName.toString(); useSkin=true; } } var useCookie=false; var cookie=''; function setCookie(text){ if(text!=null){ cookie=text.toString(); useCookie=true; } } var useExitUrl=false; var exitUrl=''; function setExitUrl(text){ if(text!=null){ exitUrl=text.toString(); useExitUrl=true; } } var useInfoUrlFrame=false; var infoUrlFrame=''; function setInfoUrlFrame(text){ if(text!=null){ infoUrlFrame=text.toString(); useInfoUrlFrame=true; } } var useSequence=false; var sequence=''; function setSequence(text){ if(text!=null){ sequence=text.toString(); useSequence=true; } } var useSystemSounds=false; var systemSounds=false; function setSystemSounds(value){ if(value!=null){ systemSounds=value.toString(); useSystemSounds=true; } } var useCompressImages=false; var compressImages=true; function setCompressImages(value){ if(value!=null){ compressImages=value.toString(); useCompressImages=true; } } var useTrace=false; var trace=false; function setTrace(value){ if(value!=null){ trace=value.toString(); useTrace=true; } } var useMyURL=true; var myURL=window.location.href; var isFile=false; if(myURL.indexOf("file:")==0){ isFile=true; } var authorApplet=false; function setAuthorApplet(value){ if(value!=null){ authorApplet=value; if(authorApplet==true){ jar_cache_files = player_files+","+author_files; jar_cache_versions = player_versions+","+author_versions; mainClass="JClicAuthorApplet"; } else { jar_cache_files = player_files; jar_cache_versions = player_versions; mainClass="JClicApplet"; } } } function writePlugin(project, width, height, rWidth, rHeight){ document.writeln(getPlugin(project, width, height, rWidth, rHeight)); } function writeCacheInfo(p){ document.writeln(getCacheInfo(p)); } function writeDownloadPageInfo(){ document.writeln(getDownloadPageInfo()); } function writeParams(project, p){ document.writeln(getParams(project, p)); } function writeTable(w, h, nsw, nsh, s){ document.write(getTable(w, h, nsw, nsh, s)); } function getPlugin(project, width, height, rWidth, rHeight){ var w=width.toString(); var h=height.toString(); var nsw=w; var nsh=h; if(rWidth!=null) w=rWidth.toString(); if(rHeight!=null) h=rHeight.toString(); var htmlcode = ''; if (_ie == true){ htmlcode = '' + '' + '' + getCacheInfo(true) + '' + '' + getParams(project, true) + getDownloadPageInfo() + ''; } else if (_ns == true){ htmlcode = '' + '' + getDownloadPageInfo() + '' + ''; } else{ htmlcode = '' + '' + '' + getParams(project, true) + ''; } return htmlcode; } function getCacheInfo(p){ var htmlcode = ''; if(p){ htmlcode = '' + ''; if(!isFile){ htmlcode += ''; } }else{ htmlcode = ' cache_option="Plugin"' + ' cache_archive="' +jar_cache_files+ '"'; if(!isFile){ htmlcode += ' cache_version="' +jar_cache_versions+ '"'; } } return htmlcode; } function getParams(project, p){ var htmlcode = ''; if(p) htmlcode += ''; else htmlcode += ' activityPack="' +project+ '"'; if(useSequence){ if(p) htmlcode += ''; else htmlcode += ' sequence="' +sequence+ '" '; } if(useLanguage){ if(p){ htmlcode += '' + '' + ''; } else htmlcode += ' language="' +language+ '" country="' +country+ '" variant="' +variant+ '" '; } if(useSkin){ if(p) htmlcode += ''; else htmlcode += ' skin="' +skinName+ '" '; } if(useExitUrl){ if(p) htmlcode += ''; else htmlcode += ' exitUrl="' +exitUrl+ '" '; } if(useInfoUrlFrame){ if(p) htmlcode += ''; else htmlcode += ' infoUrlFrame="' +infoUrlFrame+ '" '; } if(useReporter){ if(p){ htmlcode += '' + ''; } else htmlcode += ' reporter="' +reporterClass+ '" reporterParams="' +reporterParams+ '" '; } if(useCookie){ if(p) htmlcode += ''; else htmlcode += ' cookie="' +cookie+ '" '; } if(useSystemSounds){ if(p) htmlcode += ''; else htmlcode += ' systemSounds="' +systemSounds+ '" '; } if(useCompressImages){ if(p) htmlcode += ''; else htmlcode += ' compressImages="' +compressImages+ '" '; } if(useTrace){ if(p) htmlcode += ''; else htmlcode += ' trace="' +trace+ '" '; } if(useMyURL){ if(p) htmlcode += ''; else htmlcode += ' myurl="' +myURL+ '" '; } return htmlcode; } function getDownloadPageInfo(){ var htmlcode = ''; var pluginBase="https://clic.xtec.cat/"; var pluginCat=pluginBase+"ca/jclic/instjava.htm"; var pluginEsp=pluginBase+"es/jclic/instjava.htm"; var pluginEng=pluginBase+"en/jclic/instjava.htm"; htmlcode += ''+ 'Per utilitzar aquesta aplicació cal instal·lar un plug-in Java™ actualitzat
Feu clic aquí per descarregar-lo
 
'+ 'Para utilizar esta aplicación es necesario un plug-in Java™ actualizado
Haga clic aquí para descargarlo
 
'+ 'In order to run this program you need an updated Java™ plug-in
Click here to download it
'+ '
'; return htmlcode; } function getTable(w, h, nsw, nsh, s){ var htmlcode = ''; htmlcode += '
'; } function getParams(project, w, h) { var options = ''; if (w) options = options + ',"width":"' + w + '"'; if (h) options = options + ',"height":"' + h + '"'; if (useSequence) options = options + ',"sequence":"' + sequence + '"'; if (useLanguage) { var l = language; if (country !== '') l = l + '_' + country; if (variant !== '') l = l + '@' + variant; options = options + ',"lang":"' + l + '"'; } if (useSkin) options = options + ',"skin":"' + skinName + '"'; if (useExitUrl) options = options + ',"exitUrl":"' + exitUrl + '"'; if (useInfoUrlFrame) options = options + ',"infoUrlFrame":"' + infoUrlFrame + '"'; if (useReporter) { options = options + ',"reporter":"' + reporterClass + '"'; if (reporterParams !== '') { reporterParams.split(';').forEach(function (s) { if (s.indexOf('=') > 0) { var kv = s.split('='); options = options + ',"' + kv[0] + '":"' + kv[1] + '"'; } }); } } if (useCookie) options = options + ',"cookie":"' + cookie + '"'; if (useSystemSounds) options = options + ',"systemSounds":"' + systemSounds + '"'; if (useCompressImages) options = options + ',"compressImages":"' + compressImages + '"'; if (useTrace) options = options + ',"logLevel":"trace"'; if (useMyURL) options = options + ',"myURL":"' + myURL + '"'; // Check if equivalent project of type 'jclic.js' exists if (project.indexOf('clic.xtec.cat/projects') > 0 && project.indexOf('/jclic/') > 0 && project.match(/\.jclic\.zip$/)) { project = project.replace(/^http:\/\//, 'https://').replace(/\/jclic\//, '/jclic.js/').replace(/\.zip$/, ''); } var htmlcode = ' data-project="' + project + '"'; if (options.length > 0) htmlcode = htmlcode + ' data-options=\'{' + options.substring(1) + '}\''; return htmlcode; } function getTable(w, h, nsw, nsh, s) { var htmlcode = ''; htmlcode += '
0 && p < url.length) { var search = url.substr(p + 1).split('&'); var searchObj = {}; for (var i = 0; i < search.length; i++) { var k = search[i].indexOf('='); if (k >= 0) searchObj[search[i].substring(0, k)] = search[i].substring(k + 1); } if (searchObj.project && searchObj.project.indexOf('//clic.xtec.cat/projects/') > 0) url = searchObj.project.replace(/^http:\/\//, 'https://').replace(/\/jclic\/[\w\/]*\.jclic\.zip$/, '/jclic.js/index.html'); // TODO: Process additional params } launchAppletWH_legacy(url, popW || 840, popH || 620); } function launchAppletWH(url, popW, popH) { launchApplet(url, popW, popH); } function launchApplet_legacy(url) { launchAppletWH(url, 788, 540); } function launchAppletWH_legacy(url, popW, popH) { var w = window.screen.availWidth || 840, h = screen.availHeight || 720, x0 = 0, y0 = 0; if (popW > (w - 12)) popW = w - 12; if (popH > (h - 28)) popH = h - 28; var leftPos = 0, topPos = 0; if (w > 800 && h > 600) { leftPos = (w - popW) / 2; topPos = (h - popH) / 2; } var params = 'scrollbars=no,resizable=yes,width=' + popW + ',height=' + popH + ',top=' + topPos + ',left=' + leftPos + ',screenY=' + topPos + ',screenX=' + leftPos; window.open(url, 'JClicAppletWindow', params); } dist/jclic/leeme.txt000066400000000000000000000006421335566474600147620ustar00rootroot00000000000000 Instrucciones para la instalacin de JClic: - Descomprimir el contenido del zip en una carpeta - Crear un acceso directo o lanzador para cada aplicacin, con los comandos: JClic: java -jar jclic.jar JClic author: java -Xmx256m -jar jclicauthor.jar JClic reports: java -jar jclicreports.jar En la carpeta "icons" hay algunos archivos PNG que pueden resultar tiles para crear los accesos directos. dist/jclic/llegiume.txt000066400000000000000000000006421335566474600154760ustar00rootroot00000000000000Instruccions per a la installaci del JClic: - Descomprimir el contingut del zip en una carpeta - Crear un accs directe o una llenadora per a cada aplicaci, amb les lnies d'ordre: JClic: java -jar jclic.jar JClic author: java -Xmx256m -jar jclicauthor.jar JClic reports: java -jar jclicreports.jar A la carpeta "icons" hi ha alguns fitxers PNG que poden resultar tils per a crear les dreceres dist/jclic/readme.txt000066400000000000000000000005621335566474600151310ustar00rootroot00000000000000Steps to follow in order to install JClic: - Expand the content of this zip file in a folder - Create shorcuts for each application, with the following commands: JClic: java -jar jclic.jar JClic author: java -Xmx256m -jar jclicauthor.jar JClic reports: java -jar jclicreports.jar There are some PNG files, useful for launchers, in the "icons" folder dist/jnlp/000077500000000000000000000000001335566474600130075ustar00rootroot00000000000000dist/jnlp/author.jnlp000066400000000000000000000021071335566474600151760ustar00rootroot00000000000000 JClic author XTEC JClic author JClic authoring and editing tool JClic authoring and editing tool dist/jnlp/author_32x32.gif000066400000000000000000000003641335566474600156440ustar00rootroot00000000000000GIF89a eyYm~npziv!, I8뭋'\8AbWi a%8 0'+b#An7Pg\قa{*&zb4!4K{!ͳz szjr0K{cQk@y8{Kcl9)IzX/8s^{;dist/jnlp/author_32x32.png000066400000000000000000000015451335566474600156650ustar00rootroot00000000000000PNG  IHDR DsBITOPLTE~Y~Y~Y~Y~~_Y~_Y\Y~\Yc_Yc\s_{kmigc_\ɗ܄؂~{v|rmc$ZtRNS""33DDUfffwwwQ pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time09/05/04:IDATxV@`RL卲2-1nvQzph?ߙu?Y9.̉fSIE[Fͪ\tTK槧/+1jkmweGAq{+v!R (`ka߯+VOC`1 _8 `B^5OW=rf=b>?^eB.m9Gp ҏ9ܾ71 @'l0 S5N!=xg:n1-N厜"ћx5&P}7ηPAL Jd~tS[jkIENDB`dist/jnlp/author_48x48.gif000066400000000000000000000005121335566474600156550ustar00rootroot00000000000000GIF89a00~Y!,00H0 8m\|h neV00*7(҉IҐ26!ڤ]ϔk[Kn`>+j&׳︜n]pq}vxbcLido~Z"<n83U&3?"O|~m}8|~$`7˺xμ@ Ԧ׽ο5-PPSEГ LvL rЀ/ yL6U ޟ&^bO$:4X*,L轒C5`Uh6hs^J 8$X_S 3(0+R> H =l' Le&ms YHu fc* x^C=ry-!`tF @wh9ߎA|h|g:}!khB<:㠧vntWA0.g'`)23DL,$1S$GzxH!'0t9%<8mb:z!aҬt+:kL_#v5E-bЎkW[~MY ا$J-% A፫ZYU.^XUX > k2s o(?H{`dA S96BkK݄kU02Sxȋ{%/5U ESǗ߆fZ370ݙ| o<ղ9 I8Iǭ6Pj3y g?yj[5q~(BB>##{GN W<eϸJ4#;[+yo;Ƿo^T֝v{zdquG} h]}PS96n37eon}c`]),VKK8,eϸo $q{臺݄ /Yq~?L0##E^ܓ ~Rh-WԊ58!ͽKs1cix. 0.+@z|qzgFFLc ǧR$ ѥ몘ZQ%T۠B$b+#= 02bp*p"ygnB!0vКS1LĽ.nLC{#2(+ '&Gf 姁}*ڼS8ּ#]vO6 ; v1p2y; aS 򵦃U7/~:hI;T{v|1#/?TJGIENDB`dist/jnlp/author_64x64.gif000066400000000000000000000034551335566474600156620ustar00rootroot00000000000000GIF89a@@^͓Y8l&϶Bs؂̯d\tӖCr'uҺgܫ{4ތŸl:Rȩ{͖mÛδji <ݭе{r#oRij)ϋ+dp݄ؐKõR٣ťt¤L}8ӹb ߳rcε`Bphjv)x͆mRƨޙy֜ԫx,@n.1ŵ{fԽˁ׵ZḔ!_֘nǨkёc!,@@{H*\ȰÇȐ:3j$x# J2 iƓ ҆̕ZeE8 a!O($Tq !vs%D~JR "X0JM!^`b(X"\Ph+4%\"l3`Z097 Y Q#`c؝CqIF`#cbl$j GBCpEu2y uS3ͷAu[;!E%`@XСyS Z@K7;E<{4b33k½o p MU !"w$8ȰzTaOx#=!$D!E"+FNW4b5l 9T2F Ad:b20NQd-8*e:fT #$ gnidF3ı-\AF`AhQgiIid-@ L)V AA).AkZ>0!Đ0UuLYX=0+N E9xCl)w<!#;s(wh/001erAsQqAL`M amc ͲysS!47 d7M2BÊ}f B}IÍC 5Fg>: >/CDκokNFST0|scB7|FoqkCM/ICTٟ9CeP2<rQ! 7)o<]BwE< .'^,A c@0 gBLdL <@@l HF"9 ;dist/jnlp/author_64x64.png000066400000000000000000000025221335566474600156730ustar00rootroot00000000000000PNG  IHDR@@sBITODPLTE~Y~Y~Y~Y~Y~cY~Y~cY~Y~Y~\Y~\Yn_\Yxfc_\Y͖݄֘؂{wur|lqifc_\4ltRNS""33DDUUfffwwߕu pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time09/05/04IDATxՕ_@&_$qUYSPLL 68vK=r B$~[dXx֪u.}ߝVbVW!HDS;gVđJIcakx s;MZCφOtcℊ 0/Qa7G()Я34@ ?רa3"w #V u2,SS+F~?0 p jγ_ @4H~ ˚1 @HS,DALO$r?X~YKNp+U4#W.c;}W" ~tR*jiR\HLXBEXTI";@)p,s0'mF CF^~j!ГWv:'eakw`29} `j6 _5|m9G,F~ <eXh+,_7,{(? 3dfOQc@(),\֬|gpP=߶8 % =kͻMky8+_nzOS{7 ;g'8C?S8 zwkl3N^UyLR끔IENDB`dist/jnlp/install.jnlp000066400000000000000000000017431335566474600153470ustar00rootroot00000000000000 JClic project installer XTEC JClic project installer Application that downloads and installs JClic projects JClic project installer $$argument dist/jnlp/install_32x32.gif000066400000000000000000000003431335566474600160050ustar00rootroot00000000000000GIF89a eyYm~pzniv!, IxM@ ng"ykt."Bҍ`HSJf3L.OXymD(P.Ob>ɡ>w~zvqiBJB{'9&QvػpP.t! EurRƩ-|DuvCm{Ǿ?ygC|IJ"cj,SI&KΕVէb4Z2k\t-ԜiA T'>r3F[lq2E%)v)gS{%Lg\wIENDB`dist/jnlp/install_48x48.gif000066400000000000000000000004441335566474600160250ustar00rootroot00000000000000GIF89a00~Y!,00H0J*8C˯Rth*Vuf*s>3^*CϸB&DE`垊]w<^;zޚ;6-9 czm|~xuRZ/-g2-CU[ zs/dc^ \'ɜk̾ϿկIOʸڸ]m H ;dist/jnlp/install_48x48.png000066400000000000000000000035331335566474600160460ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time09/05/04IDATxKl\Wgycm'iI[%#S,5+%$@BW]E7aU Q*QnTbTX hFBj%AIӔ$vIc=}+I3y"fQ& m_n36f m#Q&cqsDZ)>K4piP> H ⏽L>7lxKQIs@>c(-oF"$S}06"k+9JEpl,axsM!p1Ta tz+D08Ri9Ek<:>x.b73tMFF;JS 6D'kF]ce`cH4F4ۜ3!+Yi Kw=סm{6!aol']}9p0׾۴)=Br`}y7!@*/?5j>-aX-׊HY93QFh Z駞:]l"Xᣏwҫ\ 0j?H"\ r%sRUe1;%Zk9z\> yÿĬ :%h;}ZC~x~ywcBS ;/; {C ;dist/jnlp/jclic_32x32.png000066400000000000000000000014331335566474600154430ustar00rootroot00000000000000PNG  IHDR DsBITOPLTElYlYlYlYlYlYlYlYlYlYlYlYlYޅق{wvrllhe``3?tRNS""33DDUUffwwm@ pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$\IDATx[0'(80%**[Vc5#&POO˽lC_2a0Y9&QvػpP.t! EurRƩ-|DuvCm{Ǿ?ygC|IJ"cj,SI&KΕVէb4Z2k\t-ԜiA T'>r3F[lq2E%)v)gS{%Lg\wIENDB`dist/jnlp/jclic_48x48.gif000066400000000000000000000004671335566474600154500ustar00rootroot00000000000000GIF89a00~Y!,000I m\|$(n٠yJ*/ Ր."[Ѩ 8%3>O>) @z !V+EܕZ9vsuw yy{6tRdxj-m\oz`-bnh( 4_i `U_´֮ͧqޚ!½AA_9+ vL!\VS%ŋ ;dist/jnlp/jclic_48x48.png000066400000000000000000000042141335566474600154610ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$IDATx՚Kl\Ws{'TDr<|rl\zR62 |LHO^-m֧tl什o׀LkY3Pb{b  i-ˡ]\G^nfr^w?)%!(VoGUcSh!QiC[0/l>յxF8]bd xx#{8jRpTJ L ek|UюO@CtN"2oX7-ߙbv1rx3p#K!IⰦX*pxLS26$Ql(-66O ~8j$c0A =uxHώ^hoװ[&ZF?j$FS }m0mL% *H`Ph׉U,/wmW**f4Aoj&w˂~ӊ3c~(uҕ6f9Z6߰lIb2MR,V~&dht5_aroe Mb&36TX7%NnP0"Iz (Üs;g!`ut/UZ`Z&ޫo49Te>29շ_j6 *@[Aɴm8bC=lG\zL rرZN `"P Rр#!d^gj3@D  71J Ah)`hj |PTpK!D~A{s|NRFr[ 0 QGK= PF(Xp3D2@ƒ@;X+h!^ a@%y@0q-{~1H``>1`3 4 o 1B]谄X 12nT!Qj_m,ZH4+Hy Kn5yȜgxL^+|/y=;D6 u!܊OjRŻYQ (4ls$C!S[(=nS$DOkr]>8 J>_zJY_ \%)~ 0`1ay+_Վ&_B3`N%Qxf@م``TX<HX|˂l0aC G*@p7PAd#cpfc,?!A XAlDt` Gx PE!mxR. DL2 X Yȣ PP6<aR: p( ІF  Br\;hОK ;dist/jnlp/jclic_64x64.png000066400000000000000000000025171335566474600154610ustar00rootroot00000000000000PNG  IHDR@@sBITOPLTE~Y~Y~Y~Y~Y~Y~Y~Y~Y~Y~\Y~\Y`\fc`\݄؂{xurlifc`٠PtRNS""33DDUUffwwM pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$LIDATxݖi{@q#F R2*h uI4j (ʒSh sQL}瞙!LjJ Wmch&Ij.K'BҠVSUDX<hRo"OTvT'"w![U#'"vqa.De &ub<U;# }!}٤!xD8Dgɳ&17xvEs3mYQ! 5HUf-A(xfC#E'u, )J}A曽<h!21+DaACcL̀=<vB! @ L1Ƞ {Q("#z@嚤 OHfACr 7w%.i7+9pyL!4hN!N7Q"`a#(WY'oKN!@@xc{'b{A`C,`S,zR )~jqP"iy{ț{z05ObڂOj/"H槯T)ؗ˝ lf i(4t9+ ! T rXeo;D\`PnqMͰ(#hfp1&α.0iځ&ԕw_O0( p$R 󣰰80GGD\sC(ő^a J#Yu'3Q$r> : dist/jnlp/player.jnlp000066400000000000000000000017561335566474600152010ustar00rootroot00000000000000 JClic XTEC JClic player End-user application that runs JClic projects JClic player dist/jnlp/reportServer.jnlp000066400000000000000000000022211335566474600163730ustar00rootroot00000000000000 JClic reports XTEC JClic report server Application that collects, manages and provides statistical information on the results of JClic activities made by users. JClic report server dist/jnlp/reports_32x32.gif000066400000000000000000000003261335566474600160360ustar00rootroot00000000000000GIF89a eyYm~n!, h0ʩ%4/-TtXVli`iL Ckax s*9[2o8Cǝ,8)Bhf:'SS/`6 nMv~{ttlTZe5b} ;dist/jnlp/reports_32x32.png000066400000000000000000000010671335566474600160600ustar00rootroot00000000000000PNG  IHDR DsBITO~PLTE~~~~~~~~hfd_4̛*tRNS"3DUfwAD pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time09/05/04IDATx `\Ps#70H\jaPaԶAFp^Eȳud$R4I hYxomg0TTbp:G-: T#: 5u+S(ȡہUvFX-%*,I nk r.-?+:i&-00ػ+2rE Lm,k\ `ZDߝG ICڙ%wp@TMx^$G `Zj'\c 髐ijz~^]|S>%Mxx9`vn/߃ p p&o:Ң0KDD6NB}#a~.O܂IENDB`dist/jnlp/splash_author.gif000066400000000000000000000205241335566474600163550ustar00rootroot00000000000000GIF89aZ33fzcĕ3ff{0v?omaʸ΢o)KbrdڵcD]֜ޅKyukާbǠC\s֓ {؂dɵmϘխV|4ЅŭvkӿLu' ߼_ٚfa vDz|輥K~3ըgԍ’ ߻)YkςᬗǬZeHrטϥοpǰz$6ݣϿxI1|ѓ㯛9QS}+$Ds޶۝lƗm i˷SkΌ8kRmr#ǚ±}BזRŵBs̙eZ|qB!,H*\ȰÇ#JHŋ3jx1Ǐ CIɓ(S\ɲ˗0cʜI͛0ɳϟ@ J4΢H*]ʴӧ&BJիXJʵׯ`n KٳhSM˶۷PK]rn޾ 7kBnj̸W 9ϙE` Er̹WUAiDlɘ͞c^ JMÆ 0Tqȓ=G.Ú @Aqûd %*O:0e,2UhEwZҝ Qj1C߃T)-|&"xg(r&!Su '# t]ܙ␁T$3L}0 F#Q0a ctTa")w8HsT!2lpa <)oXwZj 2&R` @42OƝeRoUKq*g&Twi@jSFчb:`vd:SJG P@W^Z {ց I ;Q2N[ݟ- PYHCv`.p}j܉;EzoP*LO& )喸^B C F?Bܱ negQLXъ$ ˜">Q @``M`hR$|Z`!6X}&=]≅0H؄<"qLp렀T+lM$<2'4Ygo)/݊"W 4 Ϥ}0b` 쳇`(~S)xlݨϙ.&AćkZHO}r rF}o;'YvTv%YNEg (K1,&wzW. L%60" A9LLp_.#0/%` `px(SUI.WB%|xu(X1Xbwb+g`X8OrNQ}E9FV =. ~&PQÐyd+Б"L@; ђh Rk4$4(h`qD#b1A, `2x\IJ]4e#)Uf8s*LV8C@:EH̃< Sr36lx5rgit2r&" yӞL>YҢ~$\#f)#A;І恞l&H`s]F5fH˅ԡTi7!96MN3 e T)PM6)IԢT-aPN?xJUUxQU`j8 Iz֩t*"Sp;(Yr*ȥ5a9;j־4`" 0Z@@ü%+ZYZ+A{.Y61OQچ^K[MR/jZf3wPFi>uLmoe$t<ꜙB4(Rַi.[7˔R`^.0E8L#yZ#.:[Bʶ^-{ԋM RpINxM2a@4H)tP6X~l`O{e!4qZ'FJEQ! =4aPBLn_(+I;?lLb2*?Y,Z#JnŬc;C!f9}5SJXe=:.=[aFO:FlLJҘFtPkXzN~\R~Kq}1fQNεU S<@.p嫧`[A<6Ǭ캘ش9聯Vm(fD9٫)*Ph|u@QG dD77ђ:ʃ{FQG]R]c$IrM-xAci^tbc<^9JQ07_*Wz<1* ixCБ Gy0F`]],3a V8ח<0ݻ}>'k@9{Wz|؂=@PЈ}(wu W_w 0؀n4`D,?Sr p E-c Uz Xp?dX}a^xçK1pF˗*NzwG{3q }RHWhXqp X@- |wz7'ufA{S{D w0~3P x|G&z{w/6 ا}3P58:g ~CXy|'}J17F&5XV`z`#b ȂeBWkx6|nx @ kxX\c} {)#\n PHlxWXW?#xyH~$7xwt-Yg x$ad L4 Gx؋x x#~Q~'RhTh(qe@n%%(OȎoG@ UPxmȏHXh 0  L[ YMcH"p M p0 D\2"9f7(FYH` 2鉣 [PW98c`?JYP`DI N_7dUiZaq)AAٖ gU%`;^94Ȑ!_[iyiscoBQ?A@p=P9ɘ\uCwy%W=p7`sɕuigƛ {yȩƜ͹i99]W *)ɩayI oz"C빜ɋI)c yty"bٟ  9Zy7NP ع:i)n Z9 : %jf@B*4ʟJ )K1zLơGڥ6row*u{zl~ʥ5_:3&4ӣWij&^*}KpKpOjCIT!*J4*PpȚZ*0A :*)*"=qʚp1*-a ʮ;uJg*[*H.kbh9עj : [[۱|afY :Bd6[Z/<;Փ*xc(IګC$1`t{ &ڵ0d\٭j&IڲD#Pu@y !i|;۶ +K k d:c+bek'Q >{ۺ#|ʹ #*JR`۳'(0K~:z+ỼzO&[?u"k {%IՋJkKAѽ\[K@"1Azj\ھU֫۴l[#UK lK@6éd3Q :-l#A󊭎;6{ѝKi)/;ę;#@[TRL#Ϲ; I{˲{Ldl4K VR@:&̾{xz 2 .q5UܷsdtŢ 1%8>5+!n¢ /Z\*p$䫁T9S_lc<:(̼Q<οK?ʬklu\ 06ʬq%*6[S!4ʽ7 a/Z "q MŹ`zJ}Ϧ+ͯLͅE ]<`?MKm5aѪ6C/kWB Qmӿ#PI=[ qM|\%[+5M7~lLN1Yv}L4rvԼ{RMJ V}t3 ZJ1\c-j=8јȬ"ӪA;H\lۄ։yɦݸ 5;Jګhyֵ}VT] ,=ߜ-m-Hڱm~|6P3⽷q'\;(&̂ ~/Ͼ]F{܁޳ ,%]՘ڍچ\8LmCN<>  ^`b>d amԬHJ,"5n{ 0YiZh|lF'@,JxY>^Ny=nx=$ įN_ B>^~p.,]o^f}:NU`%p~>.pMJ1 b )C?k~n3ON@yMw=!N nj02?4_62_ MG'O*+?QPR?T_R/> ZC?Ȩs;ͮh/Y/0`ogx?k]2A$0وL;~}y0Lv~ˬI.-._-#ML~ 7N(+S(F2ą30"\ @Ƞ1SOD/X"AA"|-p*24 SPNܵڳVZme$XUd+t\/NhMRZŷD <фH ~]pݔڥhSljCz'F^=8r̸Z(w2Tavt7%8f -n)[2Q3o><x$kU^e2u9NeZ8[ڹhH%+Nh6:aWNa$ J n离n;oo!b//.oƺ/?v5G{l>"0 H!tG'tOG=uWgu_]*?dUAl]V_Rz1 A9<z>{{1pα?xE_/| _6>>i@͟`8@ЀD`@ 8EgpjU} BvU$r߉TPjwpY`ya e8CІ7auCP O8   TA@>`\qPhex0F ьgDcոF6эoc85>(FtND-nB/ "Pt$,"B !$D9JRҔDe*UJVҕ)pBH!H&3K^V%TRbDf2Lf6әτf49MjVlA!nLnvӛ$9NrӜDgęNvӝOzӞ\wh@$@P&1hBņVԢKB"bԣE4."!EiJ:} UiLeN /=LuSժV*inJ_$>Q)L6թ) WA:v  A0"3%c%aY)rU}+(0:׹BQ][;<@/K售ZU2O]V EUy Qȸ"-"dUS"DY4A h#v;2I~@-U 0]mtZ5 $[!Gk]V!HrF<7! m:VTc.u[wBJ Rr3EBHu0~+6% @xGĥ+ tsF *ա%Dɶ {|/ zї~7}zշ>w} {׾}1{}QG~|7χ~?}W~}g? ;dist/jnlp/splash_author.png000066400000000000000000000121071335566474600163720ustar00rootroot00000000000000PNG  IHDR~j,sBITOPLTE~Z3ff~Z3ff~kZ3ff~Z3ff~Z3ff~Z3ff~kZ3ff~Z3ff~Z3ff~Z3ff~Z3ff~Z3ff~qZ3ff~eZ3ffטϘ̙Ɨޅ؂~{}xvroykqimqfkce_\Z3ffqqtRNS""""3333DDDUUUUffffwwww, pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time09/05/04|IDATxǝ83 b8 88q66I$|IʚҲPv[iҬk>Ntgd}*[&~?sr @ $՘Q oƦϝ>9Ʀ.\:wB&.-,z!+=7W.Lӳ~:عy{JGٽ.H)hj~zg|(E!o]qcqڽlfCwvo --^!!Tkq RIdoޠ` 0*0y N+kw!$ w,TCB[b]Rx [r~VT;*ȯ8hX?]>Raд~Ot]/o0{ly./CVEDbo{]yqv~%+CY҆k ;;Xf%ݼyI [_bsn=jscސDyonݎkHyܶZWl{6pTA˅ybv/`fJkyB_"Tqh $:jb3Sq`.C,h_mZZ'+a'l_mJw; GU:֏+:SPqQY~]mBn W,ɺ_*mE{Z]\qD&+'}/byX(Bf?9>ȷ~._e12Vlȶ~e҆SDb(6޷D}/m{@:Rw<ïmK-*6GsK-ov/b38q?'cWG}/}##fX8:H06~Nm/wVu}[y]BG78t^~7ff0!PO^šyw&N>wif>|Tq :9} T^|*͝OUC8PF(?lR8t^>Q~)߇ ć"PƈT@@ nnbWU$!a*X֯Pq]*x+]y=_GnT+81"pS-CGRT*^q+ ]J~t\6:ٵ~5(M{~/_ !jf?_?8::zɧ@CNECȧ?㧟#$P?BsC gO)[;Ͽz&Ypu~ GOg*t蕄}Z[?{~sҥt\" GrtD}Lߔ'l69'ҿ>wN1?u"~yoHYS9oHsf< )8R_Fmb}__ǧ,ݬ;O0>SUSQ;%q2(yBf$T[ r [kq!:~-ݓ8&<{J*ɡ~<JYh;Eb}J U ß+wUo9J *}Pa駄_~~J#yMY?XV*Zն?PSoq+N?+κH)7Xb_뙢ʀ{JMmq2nHÓe$Su1+bȺH(е]E+<~K̻Pf,~J=%\E 6bqjǶoT+rɥٷTO"n2s{\er`Lj8}%CS i ]KbFRA?qD4Ȣ.O:~!|O 2K?qTu3TU"y c8 7+i '$1?LT ??)EjY)atM*ᏥkccP 㧮4 ~'PMiTT59Yeh㧊N3 R}"JLGTKETknS5a/?O?fU4wE]_!oD7Q4wE]6^b*t~|qO *jdhfVm9w%כ2r]V.O(Oi^>&tHp=݊¿ʃ?d4U0tR!] /Uq?:L,egrlOWO<~\ShaxpxzTD~vB[4> M=x91^5_KNG%; yEs? zmߴLW< ?ZMo?cfEF_y2_y u Јgm?m͂vY~ѦQ}9~˲Jwe+V mU˨-Q} ~rb-Zf18&mQ Xofg^>nJy_0s55z侯o3RV.;i:BLWޞ5}tU"ƧܵjAȂGqн* PoO=1ܘC%{j2M_r\˩+ :I3djOJMkЗt<)PSoB4g̟]N=զl?RI/;ltPEv iW:PezUs|K'D-ڿ ~ ܉5mbQC\{21Qqgc EnDku6(ώSs{x9zEGϝuɉsʫSm2rK @ ]6hWdjk./?uyMJeh)''OdOj[@ -\ ШQ**Tvѩ#HSbՔo񵇂c VB' ʗjݟq_G-eo5l?9x@I?*Ud<\_Xp&(w#/#'³nƜЁ+DZ;φ_.m>b։L h=7o+jm-]"PD76M|Mi|PXw!  E3W--CuL:Q[8H t㯼]&j{p=jZ/D)㷘W=zW#H Ω/2{H xȹN̩߳g_1 VB/_[ղOO~? U96憋`N~9=jL_- 𳝜zL? ˷bu+{f-[#bw0'_ ނ-]qB#.odG׽{~XVAl  㠉Š:_"OџͲzߌO"^,SwWWsEbҲU^IH zAa|.oګK{Z(Bmbbh+,G)l 5fXIENDB`dist/jnlp/splash_install.png000066400000000000000000000136321335566474600165420ustar00rootroot00000000000000PNG  IHDR|isBITOPLTEmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffޅ؂{|xxuurrmlifc_\Y3fftńZtRNS"""333DDDUUUfffwwwCD pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$oIDATx]kCHE(((R ֶֶZZXG6H2$3@fΧ-{̽L9` ?"]\|a /xjyqal?yq3#ċ?4FFW,LCչq`c((06a}}5 #w8}) ߾}/}MIBh^~}bH2I0hKͯ+ЍQab|[ m|y*IBc? c Ѽ}ϓ(Ю@āH?@&@,`'& ~/T a:;n[mn }9i؏-I>->'CF||B(ЛIN.,\#7I>7ܘ NVT#@ɤ_NOp|/0%_-H/@7M ,;$?P @ނ%٤@v_4 l'.[`;kTG/U6f4A6ӲvDӕl67J,@_cNLMO%O[NZT$y H'j 3@coJ~vf` Ҝ@Ig =; G`V@l'=-50ll'O?Z|hfp0:>>Ȅÿ };y x1'^wowioab{wpxz޳h`BvϿo&w Ի*PʗTMKv-}'iOBëa'c?~g@&B[I>?N`( ]w;ۉ恐|8BJcV,e'Co|?b%qɤ|$_$t.5>"d- zboC2xe&%f'#A/C@\XJðg/@TR%2ZHR5 }܁_x ,/={o$M(ɺjXK-d'G%I3 W' dewgM~k)0/#ALv+CZvN%M(,-.m_j,i?=!JUDL4S$7G;G.aytoB$b?_>ET-J~-6Rs`-U-tϠ/B&onn.y[9(ѽW[H۩쫍7 p_d-O5M-Cm_D:Pv24${|%?0b|rvq57@BNCu0^LNϿ|ET {oK:H*]| vSd]OG.$tG@Q*oA{.{Hu*.c'LK+],S4y A^P:U'ˢ{"o! p}h;Y[-> Cԩja؇DF6 ;tpB#TMGo*hgbٹh Q Įh'[iPև9_UsB6@$i'k bo!} qCqC,R D,)`|ڔaƏINN ; 6eӺ$yBvu-:9'zԔڔxQCSTF:DTJ:VǞ˄W'Nxbn~lcB)s}i*U1[ڔuEW'NƢ:JC0NֲSY&;Ae~Gb*׮NNY8.@8/d'P7>}v1Ր~Ɏ0S S?3j0 [Sx`&Z5 das*d|D 誓^o!l(F~tk';k4xHsur#;9,PAY&^;mIəg~zK2ɓ^;98V'˖Մr1K N χ NZ?#/V2*$L~OB-Ҧ#vIʨ0Rvr(zyD9o!RpO?'u\MmȕO+Ddy6S~伅 s "JFB^66h@nbG{gEv{Ru sȗ,nb/m<+!\N&PԆ(XKϋBa@Nuȯr{vB|VgTu.&~-:|:W"+H,;(bY,1.O$9yuČ H/Į鱸%N~V3Rdvo6{nwkό|quNČ(U&("Hc31yn'$8_x:/("B2j.ެW>9%|JP:_jm*BCnbSN=EЕBr?CJ_3:jFב+ONki*˓)=НaO4)1X.7.#~Uy탢'\a8O~*?VǴWpaHӒ_V䇺E R3xi5V9%v J;3p#z˓Og!JU|.QM}gKօ/.\ӶkmgG4V'{E2Sh.3+zTv$S{]J?U|d F[쏉N=dgskd2ُ̥Il~oG[{}ؒȧɧLRx/2\it3Kr|3ʨɧL&زMCS҅5b/26:X/5p )A+.O^ kn30s39T7>/`tJs+ Cv : H ϰd{x_x|UX(mt;v Z]?n)'E;{ !l3%b)鷟/ $=8lxJ@,PjCN wjx-v|w hOnw1NTZu_掂:cYAz{qe{(ϱ]ْV-;t(PO珘L< 9'¸=_GDKo)ϩ_:$F;J=O6@7zG O_7u4ăaXy/~ZD8@q+Xӷ1y{'= sr @<0LW66pK7wȱJH's;8ÒZ 1)}#.ͳs3eB*D⤸S\ ;ߋwWpewFىv䷕?P?mb( 6I#%6Щ@#U+ Y,`ߞ+ߵ-VJPŠjs^3mO~ -*A>)rdQGz0*⃩Ӿ,tRA%z94_& eJ-3y,qP3*!;1&?@r#_]_ l69 )es_ 3Ke:Yl 6 <]p?0;gj?%u"E%%*GQD_̄aw_Cyп:;]16Pqdy0<^ؔ*grT1o׻8=w@}|&*V٤[}ouH܆qЏʏ=3{\ڼߒOV^IAZ~xwZ)R o&2s4ɆP!;1M< 煂'v+S a3akH'|Ngπ;1 ?1,ďG1E.p4wĠχVp#<$=2- _;^9z!jnFƦVWU!"S3QrUF7t' ټ=3s KKZmeeV[ZZy%Pm2ޮW&ZbTxgx]J߮RFz)Ae>"0^Y(?fgt?8j w.   ?ZUv|b aEɘ˹y#T!3E_^҉X踯w]45@-OnUp=7ō ӂ+x+n- I&n6UŌG>~y "5Vk I"Bp `𜅻Q ` ;ֳtǝ9qI%uQ? pm7&Nr)uP`\Tua!U2 IM_m|47C:RFd@HW!ҁ! Vu0EOw1li!L CRhET|r/1ݿ IvB;ATzK`H* ^U^| "=/1:38Ǫ6BHp4, N"#|nB bȹi ZQ0zJD[ U^We=\G~U~C|OYcA=) n [l *6)@N]Jh{k_|4 {&q%4؄?%_ 9]-?/D>C)?y{#H1&ɶsB-KURpRu˂KUw'JcaA~C.ڱtg R v\MfTu0{uA$9x1C6mq*Y6҉.vAI^o6ΒRT$, ^g(kRh;ޚO "f0_*3JӠnJ~XHhv+6Fs ,u$X'IENDB`dist/jnlp/splash_installer.gif000066400000000000000000000174011335566474600170500ustar00rootroot00000000000000GIF89aZ33fy~ʵ3ffӿ>om)canAϘʸraǕbDgԍJxtdbז\ٳkl{0ŭu]BwtmON բV|ǚ{d輄Ɨ; 9ݣlxe֮߅،)~3ςS~srېfƯx۝ܷKu'Kǖc淦$kZÔZ͢4u֒a xɳئٚˋ{Ѕ߻BޘLƵcmuD|+/{1l䳔hZiϾA֘ŔrQ΄ׂߧr#dž~itExź~ !,H*\ȰÇ#JHŋ3jx1Ǐ CIɓ(S\ɲ˗0cʜI͛0ɳϟ@ J4΢H*]ʴӧ&BJիXJʵׯ`n KٳhSM˶۷PK]rn޾ wÈN̸cKLdʘ3;<^hM*g^Dsf .M6/@"IR>eJqv'EСߺES1QwYzTȇdեKB;J=_)eTYz]dtZl`mD ]h b(yuQpArv=h"f ]Da8QD^$ّx⏍x",Т {PAmA@3jz" \ &IvQzESd!GcRrH `|eIzQ,28q&Gf2L9o֍"}f֟$Ey2aHN@\~HIQ~ũH?LGtEEĚ*@< sĕ"f_VkHvpp fmkap9m*u-H1 PyA9[uohí& ԻAʑ@Ʀڤ, p7v),N  WDRrǶ,١d{K%B r.' :jvx.Q }*-6t^!)aX ^(zH1ވj14,u r'8Iɘ*w䊢&2j|b/ӄJ.3x :+)*GĿR)+.*l̓m61'l93@pW/zP7Ov)K>GYG)֮ube-0(ɂ"@ǸM{2(H!C>B7Av]]~2P« *x"1"\'XÑ?D`)=p`MXN=:'g?d  ]kض8f)HXŘHƀ68 #kbqk{tY'Rd@P!8H@ 㔧lL F1V򕰌+HD4=bYc0 L2W8r#.li<4pb 8Ir3B$)?KMŢ>O~.bn;'P*ϓ D'Jш60P%?@XP|1xJ VҖ0uiDct4HeRp"hze2HMRԤV(-pS|I)L-7fj(XJֲd-V59Uv=!v4\ᯀ `Krlu[#$Am@$^'fPEa7Y6T]atEBn$κeTC+Z/UEP[ Axp֖=D#xW(n[i{ܾ(L tHH !uz7&$O;^4Q_mz^W/)%€R0_+0UsUi`:{5i)p3C¸DXn!/Iމzx ^E00~v$tx!x{ AH8ƒ9~rH.EI]0T&uRŭZثn-c] ]jH{ܖ8[Vnyc&N~1-揔67VVK{6~: \SUY Y83WY(A \_k,)Fp* @ *۰n6['CExQ`<;DO*tSYhY!H@h%.E}o|;^8G@&pk}'561lp2b@8,z0t4%nQ^ Pg4Mp=K~rsEH? 3 |E/|s ^OM~(Lq E.s ;C=@'l»wӨ%R0 1xk3(m3~oi/"owWZW> NڧwJFiӈn'24zj|=_}L27=~3=/xϣN>̾y xgVsҶqmz'y|'tKt05R}7|-D{V|dgvhGxG}RpxP&x'~A|W ;PWxnp" (`$x|9OQ7yH"52%ǀ 6&Nx<W{*0 )O'zVp]XxO8LI ׂk >oL8tHv|Gv@(M pOK}XqSw~Px_؄P7o hxbrHC1SQ(}kH(8F_qXȍ^hkH7QOȎ=Nd8Ѹ؏\)I CYѐ )y:(yC)/U` `wP%^ C0!䩣)?HDzFoNPs,P:*\PtYJPU -ꟹaމ&BYqjsjK}'PDzOЫWjwj%uO@e)=:lZ#qwpb`zOšUDVQO}ڝ:j G ڙuJP n@*抮ڰŮ*[Jj[I ⚰O -Qy $ J˳![Z(ʰ*+0!IlJ0:Pk"ѱɭE]ኰD{G+,ɴM{#kJIٳ^!%[F{; &ᴞ -z;k{iJB,vZ{ C;Vk[1II j"+k}zc+K6!)p @>k@w'K_+{@{v+0< ꥺK.3Q"乾4a9\ g9D(Hݩw+0Z̶7a A\.ÛI(l%;phUY2<q0Be,7Hp^&!5 溨sJf Vr|IU3< P; $`LLoɥO@g;X!ͼ<-ݝ/M<$۬EǷC%]'J p!q5}-[KzS\zL:qIK`H ָh| ZEIiHQfpvU؏ .<`m%Gٕ-RmY}H  `HMڥ}4ׅK-Fv=T}ۿ=AǮmܮ]M`ԣ%mjݲɽذgzށM `jf;L1ކ=w- ==:16gn>|9߅+m%.lpL,m0mު ]-0WnH\q-jUӻm&Q{ a䱚d8¼|6qʜ[1γ_n[! >ś0k<Թ..6al a稽V|s}.6ީ)eAzޛ]Aޙ+!EG]̙޵:,'ke}(1 ".ࣵ͠ᾷN 0(½7Q>ΙF9޸:~}*N뙎~iݿҩ>N  ?v)zЎ3޹\#+ٯ[U/ߍ] /Dzl;a\\.AD !n(_#M$!}i̎.}*o=։#? 0tO+oy`d+L*] &ۮ l>C?a_׵8akߙT/ytkߝp<aۤ%"@@B >萄 D\E4tC %IdJ-],(@L5my4ذ@P8"%҂-P>&BU#*#FFUt0ESfZmݺgPF$}I٧mRK6Ƒ]B< 0J>d5 nR/_^+NС1*CÅ+6pgi߾}ȢEF Re^ظ謪]\p6l}]{ޝn6Ť+/W0&bpc,]`pz_J8@3 $ӄh.-3NZ8"\&B$"AQk1$k S_0% z)\qŖFH#],h2xH,)njv& ~j&tH0th" Z ."[ʅ= OAo2sN5!gRQG[H&.?1u%M%?;}ILROE5UUW]UW_5#MV[DV!1^/[%0X0/feXi\K [6\q[<&n-q}wcu]xWz]h%)`6a=C'ӥM߇/I-Xv%(] 8 ,؊& T(.dQKc]`!dahP0dDq#"H4AW ij1gtK#A[or;TD ˂> lR{$*ŗs#b(#9l{!4Oo,J2 (/: ͢"'R\Ax uAJoF`+& j}om>խq"bzԜadޅDžucƱDJxtĬtʸ|({o̺կiތ]rk_M߻ǚQvܫ֭:mrɵV|0qܷ~͐Yulma yu'WkcأưyϥkfAkĕťxٳ؂L~3x֖Għy,8ῢ[ŀ$W˟¨nDz|ÔۨCx֟Ime{!νSޯkȲv֔|6C^[˷ŌД2c!,H*\ȰÇ#JHŋ3jx1Ǐ CIɓ(S\ɲ˗0cʜI͛0ɳϟ@ J4΢H*]ʴӧ&BJիXJʵׯ`n KٳhSM˶۷PK]rn޾ wÈͥK,$Lh*3ƏC%WM:,*M8QT ҸsGRO‰ZǶЇ ώO"Bq@CӜSу#GkT6lr {;p p|W{h!r&2T0| oug}`aA%YጸixZ\xxb5t "&8E1~G㓔h{lVXqE" pp|q_~m(R!p&%M,\|ot|Q \bx&w\TҜqF ל3]™PC}v'tPʈ))y1Jj[D :Ae@1dї1ۛ&koJ9 |p V`jžƃʰ*kU„@{Z+xƨDrljǪsT/}0)86%?eꛢkI.dwHZ̧0`"zk&׼.YJ)HK@kIl}><\P3K) npB-kwXpIh4Jyp 3~*fZd<%l+t'޵j-GaW~(x'oZ#zKPn"a~(1 hSgFn߬WI8#߮<p&( _Vb`\;)4!SoH,,yrJ`rv/%ξ"80"BuBrJ y6܁K gARAw'((4:zd]VÓF2 չ00&: P*dA! G2#ҭygځ *'EബH/;CD1] #`vd :Ca<I"`LB HH()Ap4+|AA ڃ,A'r@#4c$\XYG-$HX^f`Y8€80!p.st ` a^z3UHatR2AUc4%@%$ fӟe$@R:'Y W,ND >k^n׹g5[c 0ofh033cͯ~] &! 8gqC؛3xnX XkGo0s~D`b4!y{۴d@$I7)֫Rъa'dE1^ckڎ B!rX{;)k F=6v(hQ%@ 7]:9Y x޽;\ d4`'X +6CbNMHxDzh\Z6$}k]Ly mA$ ϊwm鎡zĎ^{>&,`k>.GC,L}{>1u7?'χIgWDz{pR_3͟_(#24z 6KF Kp>e7trG~/3{iF2f^eYpwQp(ruPl1-gF-}J5`xqh'O>q ~T>P~0Nؑp83EQTkrd@zFmpЄN(T ,@P&xqPedSm9ئmVg3@Ȇ>9,`0sQ o`xP  yȇ44MXooڕwmi,0xny;!@Tn9HF9q7r@iQUpb`~,  Jl8sxPW#ssK=wXc،Q7P=p@ Erz艉Cusu SGv|JtnAp X;9e0Ac}Xww(t,xW"y^@ {(؋ThH xKtbAX>iψGD8xhd06xR9oPw{5X[zssLp8C$h`0E,9& D] q]E| crC-'#K ZOyu Wi-u}}wR~4KKh:iJٍHɛ@`U)WA7*sƌi`yj6.h0wP+ syZ⇵dWy`83!0 ْhnUfpf ]i䊭 X[Lpf)qIɍMQYR8P `O?q66RPl82 ,9\^北(AmpQ9 ҅`X*`Xxq/+3V3@P^H_,yIɟB*cu J9azZCsZZFjt0s%h.$Y)Uo֓@ٜ1FfRYcՙKJutp^0XxXD5Rç-Br)WY9\0\J5yJwysbhj AwGlFn^q^P-A2"yHbu]܊`Vt;CQ%`aePtaDwvwKt˄%xC0U&l c;>2x7y۞7,N6Ǣ%GgH Nd '0NjX0fgMjPd)|Zt,r7C+ʶs6r3frf[TaRڇMHr׳>*V lVVc[g\`aCIw+zkȸY)ofƷYKM dMր ]+ri[K pNa[g.ڂFK B`uUW6PUa(}˭:{A! ߇hg 믖% HP+@Fi ۷LP6tڱة" i uHrxwtk5@`$g qciU @1ħï Up5<@A}'g<ǗenP\ J%M0g9t~ܸ@UȹZtCIik,k{3@,?a<˜.m?˴<9%w˨̻!,|X[j|<@,FKĽ٬ͯ y͹ [݌Θ y"P!L!P"@V" 3p?p/="!=]QE$} ~ǫ !:P;; ]qHJғ,0y;M.#`'HMf-d}CfUM,8H+q_|}?(A`ֆ@,` >u xDז}`!!;MMق@8nj v-ԓm= = %:g%,M@L|>̖7yzW\ p>-R~B,N.3L>R{z `w=@=@}!D;)Ĭrڜ~"PH%@nCa;]GS*,b-!@k"pN.00^Bp?mi3~MH4 * <o(DpANBwyE !Q^==n%!Nc.TMV֜ =`0aB@%7W۰]DpAD`0/J LBpVO>" ]utNgOgF^K/w2`cś[RvW`=퐿S np+?0?}` s&[H@ɿӪ4 Dgoڟ|l|C:iTDPB >Q"D - \T=~RȎ!D$*]$SL^-_1 7 a ' haD??* [^P jQ#=)GHJR,1(5؅6`KCe$B[aE@VRcJ3 $>aM C+3TUP 0v .k54+3\p7I PBTT7%vx GE[8uWN=8M 3 ֆQbº$bW>Uʷ$I"1>ϳDIZ`W$Zi]BMDKNkATZ3ۭh[ I:W8N;l@AE:ң #;&;ir2ol3d{Hf "nM +ry_IqZ4uSF'ʢˀR\̫ 0pݘ`IS&;wNb F<8`ɮBNٛJGw1<.)dV&hiO}N霑amJ+r"a44e<HnRh-</Ы' D r@ ۟G()P; apŨ0([`Ƞ(2)%`v7< QĈlpT|:L拉rz i1 xB> p%?!)UmAk i lTHÙksdr:yYbdȻY0RIWS([QHID еk%Br1@Pϙ"VG+vrHȓ\Jbh"jɠ.7yb!8Hh@$$#]4. 0ΐ$9G-t)إB"ҠOdyBvw,@B!>FNX؂i!".0#@'#vđI$eb@0QFGu$$=Q>L'p̓~(B9F5sڑ%||N9ƅ褨c)Į봖;ô$!za=Oa% L;d*Q>(,5(t Q!i/8&. . W+p@ t DL@K\ Qhr؀H ²nvZF0b֚׹.vg۩ڰ#,fB;C}Rg>3YBXS%xXm.Եs :w,Vg!["hA  0vO(J7ф:$ 4 ?"9w6Ek]i9#3JΉ˒B8^'CY RnB F7Hq9N4yֳSeiP8Ԭ泑F`O ,f=l) t陁!$'43{l㑭3G!:Hm-c 0?L ,=# DBb')0 =ԳJ9 !%Bj. (늮+0 pñpAK{9¾7YABӉoK0AHmÚXj\ZA?"kT#*iF"*4Akǫ*ZY@ ?o©xDH9s0(|C>xD8k Ac̘I8I >BL$F* AH(dɛLPdE~,'I,Wtɛb ( /= 򒨜ƧKI <RD z[ʮ,pʱDH .P!v2J.EL\AB !,bË HlJjTЬ;K4lL<%?LMMHD dXKr"ŝH5:lSUS ΞcDEMGTaJKLMGTO=AP%DN5jDU?R}Ÿ<2[<+H轓$UWe@_eggi9jVk m[QoW q5htUuevuwxyz{|}~؀׀;dist/jnlp/splash_player.png000066400000000000000000000136321335566474600163700ustar00rootroot00000000000000PNG  IHDR|isBITOPLTEmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffޅ؂{|xxuurrmlifc_\Y3fftńZtRNS"""333DDDUUUfffwwwCD pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$oIDATx]kCHE(((R ֶֶZZXG6H2$3@fΧ-{̽L9` ?"]\|a /xjyqal?yq3#ċ?4FFW,LCչq`c((06a}}5 #w8}) ߾}/}MIBh^~}bH2I0hKͯ+ЍQab|[ m|y*IBc? c Ѽ}ϓ(Ю@āH?@&@,`'& ~/T a:;n[mn }9i؏-I>->'CF||B(ЛIN.,\#7I>7ܘ NVT#@ɤ_NOp|/0%_-H/@7M ,;$?P @ނ%٤@v_4 l'.[`;kTG/U6f4A6ӲvDӕl67J,@_cNLMO%O[NZT$y H'j 3@coJ~vf` Ҝ@Ig =; G`V@l'=-50ll'O?Z|hfp0:>>Ȅÿ };y x1'^wowioab{wpxz޳h`BvϿo&w Ի*PʗTMKv-}'iOBëa'c?~g@&B[I>?N`( ]w;ۉ恐|8BJcV,e'Co|?b%qɤ|$_$t.5>"d- zboC2xe&%f'#A/C@\XJðg/@TR%2ZHR5 }܁_x ,/={o$M(ɺjXK-d'G%I3 W' dewgM~k)0/#ALv+CZvN%M(,-.m_j,i?=!JUDL4S$7G;G.aytoB$b?_>ET-J~-6Rs`-U-tϠ/B&onn.y[9(ѽW[H۩쫍7 p_d-O5M-Cm_D:Pv24${|%?0b|rvq57@BNCu0^LNϿ|ET {oK:H*]| vSd]OG.$tG@Q*oA{.{Hu*.c'LK+],S4y A^P:U'ˢ{"o! p}h;Y[-> Cԩja؇DF6 ;tpB#TMGo*hgbٹh Q Įh'[iPև9_UsB6@$i'k bo!} qCqC,R D,)`|ڔaƏINN ; 6eӺ$yBvu-:9'zԔڔxQCSTF:DTJ:VǞ˄W'Nxbn~lcB)s}i*U1[ڔuEW'NƢ:JC0NֲSY&;Ae~Gb*׮NNY8.@8/d'P7>}v1Ր~Ɏ0S S?3j0 [Sx`&Z5 das*d|D 誓^o!l(F~tk';k4xHsur#;9,PAY&^;mIəg~zK2ɓ^;98V'˖Մr1K N χ NZ?#/V2*$L~OB-Ҧ#vIʨ0Rvr(zyD9o!RpO?'u\MmȕO+Ddy6S~伅 s "JFB^66h@nbG{gEv{Ru sȗ,nb/m<+!\N&PԆ(XKϋBa@Nuȯr{vB|VgTu.&~-:|:W"+H,;(bY,1.O$9yuČ H/Į鱸%N~V3Rdvo6{nwkό|quNČ(U&("Hc31yn'$8_x:/("B2j.ެW>9%|JP:_jm*BCnbSN=EЕBr?CJ_3:jFב+ONki*˓)=НaO4)1X.7.#~Uy탢'\a8O~*?VǴWpaHӒ_V䇺E R3xi5V9%v J;3p#z˓Og!JU|.QM}gKօ/.\ӶkmgG4V'{E2Sh.3+zTv$S{]J?U|d F[쏉N=dgskd2ُ̥Il~oG[{}ؒȧɧLRx/2\it3Kr|3ʨɧL&زMCS҅5b/26:X/5p )A+.O^ kn30s39T7>/`tJs+ Cv : H ϰd{x_x|UX(mt;v Z]?n)'E;{ !l3%b)鷟/ $=8lxJ@,PjCN wjx-v|w hOnw1NTZu_掂:cYAz{qe{(ϱ]ْV-;t(PO珘L< 9'¸=_GDKo)ϩ_:$F;J=O6@7zG O_7u4ăaXy/~ZD8@q+Xӷ1y{'= sr @<0LW66pK7wȱJH's;8ÒZ 1)}#.ͳs3eB*D⤸S\ ;ߋwWpewFىv䷕?P?mb( 6I#%6Щ@#U+ Y,`ߞ+ߵ-VJPŠjs^3mO~ -*A>)rdQGz0*⃩Ӿ,tRA%z94_& eJ-3y,qP3*!;1&?@r#_]_ l69 )es_ 3Ke:Yl 6 <]p?0;gj?%u"E%%*GQD_̄aw_Cyп:;]16Pqdy0<^ؔ*grT1o׻8=w@}|&*V٤[}ouH܆qЏʏ=3{\ڼߒOV^IAZ~xwZ)R o&2s4ɆP!;1M< 煂'v+S a3akH'|Ngπ;1 ?1,ďG1E.p4wĠχVp#<$=2- _;^9z!jnFƦVWU!"S3QrUF7t' ټ=3s KKZmeeV[ZZy%Pm2ޮW&ZbTxgx]J߮RFz)Ae>"0^Y(?fgt?8j w.   ?ZUv|b aEɘ˹y#T!3E_^҉X踯w]45@-OnUp=7ō ӂ+x+n- I&n6UŌG>~y "5Vk I"Bp `𜅻Q ` ;ֳtǝ9qI%uQ? pm7&Nr)uP`\Tua!U2 IM_m|47C:RFd@HW!ҁ! Vu0EOw1li!L CRhET|r/1ݿ IvB;ATzK`H* ^U^| "=/1:38Ǫ6BHp4, N"#|nB bȹi ZQ0zJD[ U^We=\G~U~C|OYcA=) n [l *6)@N]Jh{k_|4 {&q%4؄?%_ 9]-?/D>C)?y{#H1&ɶsB-KURpRu˂KUw'JcaA~C.ڱtg R v\MfTu0{uA$9x1C6mq*Y6҉.vAI^o6ΒRT$, ^g(kRh;ޚO "f0_*3JӠnJ~XHhv+6Fs ,u$X'IENDB`dist/jnlp/splash_reports.gif000066400000000000000000000216331335566474600165530ustar00rootroot00000000000000GIF89aZ33fzǚr3ffa9kjFr#ӿ_Μ1˷cSbׁbsխd|1]Kyuiٚ޺ᬚ\֟A{mҋkLΤÔ_y,mʸP|xŵlܷߧ$:{ זQa kJμmu'輨9淀ν~)˟jς\اP Dz|ݣٳcrֲu){0ΐ֓[DĬt۝fj5ʳIЅfek݄yABR?omV|ԍƯxɵ!,H*\ȰÇ#JHŋ3ja CIɓ(S\ɲ˗0cʜI͛8sϟ@ Jѣ!y"]ʴӧPJ)`իXj U)ׯ`Ê +ٳhӪ];,۷p-[g6V˷߿Il;Lde/ǐ#su;&*J!#BLiepk#F@eJ 9Zͻ70h"ڀװ(rtN}:lc8]@F 5*1v\]~2wg6GwgjR!8wxAGr#wԐDn!(W)Rj8W1D Z,wAP@*Ak5qELaF385p!qDz? 9"Ufe֨F !ǀ- uic3RhcxeƆwhtvGd6@e0jf1^x7b\$d%i&PJIsl}gfk $%ÃzVyҊm)"+湐 )shÐw 3$ l>UΉy-+(%1H_\@,!p,;;@"#ٝ8"EЛi]837mxЁ"BXFQd?!_ |poetvcqx37 IVM`3ތWDI9AA!SF3 C0>9хo:R+[bMlx#PQE1o'g"ʛw~ #U P},FFD/=u+!+1+%8 EYD@8P 'H F8'"W@ҙ RB 0 gHX ;(JE9JȸV#"‚P H*ZX"H$A\s,"{`$0B ZH:" /Hb⟸8ҪPD$'IJZzG?_)ԡEHƙ)H,gIZڲ8M@tғJČoWh0<4@jZؼft^!KbeC&t4IzRs$8)Ε s^:g:̊"JӞ&>}⯟).!c{HќfDW:QoҢLȅ,^Ї-(LcQXi@7aLO#o/܃@'P CHa"T`ғTSgU_zU E@dQʱ;#pRy5\k[UTTbأ)t_Mnt)V`"J,fZX DTW?pue5kd}ZZVLFE̋zf.Ŵ=k #9\rs?c!+U6յnİ+$$;+dwU dH$S;YVeFEj+rwe+"3{^N-4' KjU|=k!L/VbF ߱`X#1_4uNj Ha8JV`a4PNSԕp"~Gafc@x-"A j* +2g>H?\Jh8IܫF;h&>KhƂ!}ʙCOH-|=KhCҹv3jWD$FH*Ы4Yf_5q L1$E ppn{9WtiBww~sDJ~@$ٝ "M sAI~Ah{$@w G0RVp>ӆ89 Ї0,VwSp r9;"Nu*j4h4*Ptr*Tu(phDA1QvaW8,DRp!;<0C\ɿ_k@4`fx+{pě -gOlD3odX͝[kݝab|t ]=:@Aw+I"ܧ )B_+UTB 5}V3137]81++t3~tl`:tgև}Mwk(_Nsr 耦GHFD\w HY"8]]E5]+-.~ɷ|;j4^{{Em_ 0noc-)P%T__bǁ޷yGeVPT@M8FOh.uЀxhB #3\ȃхcY/x-L0@Ȃ€T8vj6؅=y{8FEjxphŲ |ds[H}`g!wH[rPlpg~CxPYSh^瘊{X"x j@o8 01$E戊5 8xs32f>&Y(i* (>lX1.-H~CThop@CIE)]IȔM!8Pt(N0Vs^HHBj91E i@N1+/Ȁb\W%h8CR>I@Hר8XpDٗ蘐ak AiH`TrH'k('\a S:KJYM:>1>ۆb:dZfzc H`BSuߩi\ڥIJV~:~q:s u:N @wG%x)I*Mq}vssRnVpS^@&E?phSzr3R'wZGQdǪʠْ4+CxGG:*m2@P{+; 9ݩXʙ11"D*Y@4\pdа˭˨R۱85D @A D19 HX$k*˲z?!B; 2p dB{ D .l[!!lk!)1;p);c+;E-;[ۡۨDb;t`;@+!dc|W+Y;0k2 Z>Ѹs*!@0+Dp빜+{z[b밥S5[{-j[)Akk.y.ڠEa;[/@;?{ F{ %۷;[K\뭢66ϻ;/ ; ۽ ?'`;/k۵꫸ۺLl%LL;L*_'0LK4Л :l@t ,| K Bku{ƅK"%\-z\ǕL]l|K|`˵ #&5ǫ Bŝ[L*ԛh O@@%a?"?0 _OaϤ??2]oOZ=L։ҋcҽ짮}O|f}/oz|ïV;"@DP 6C .)ĘQc  ^EB !4I0b)@SL53 `SgYvpaa  EE$ .\x(!%RLR]@"H~ΉB⪋#:EZX@$`͉.'(`dʕ\e•-WyY?ZSP"jVp%k Z&غmU.]4[ﴃR;5b=M>N4>MjBF;B˂@.R )̰0 iC`MH29g9\;F]e-I|WWӹSU/!ș v71(c@[&h oD*#ZNixYjGGK3f2ٙ(gμsrڱ $(Chl=pEXŅ%a4reP=;8sA'i vGf{a\]zƮiZP cU xnSdi_qE,~/M5(b-O޷<="2Xqh^W@.kN@LOM BÀR"of@mՈ߽GfE4"#'+qc+|t#4'7qx?v$^A=~Ao60hWGoq+\ 7u  ^MD!L2XwOo@#6oZ}`# -cwWpW)+@&VCfb*u|H@[o4 iHk>VwBPR%`rdϤ=xst'ȁKGH({oWT?HE?}gޥs?#@*:˿ Σ;C k@9@S 4C?S A& ;8 ivI@3( @t<3kÈ ,B@ q |3(D@ T8J9pˈk/l<;IPBeCA܌ aHȀS; Qlj,Dx5,2oȌ4E$2ȏ@*Hpܱ$ɉ4ICɔǕ̱tIdə,8SȘHI.ɟ ʡ4JÉTʥdʦtʧʨʩʪʫʬʭʮʯ˰K ;dist/jnlp/splash_reports.png000066400000000000000000000112221335566474600165630ustar00rootroot00000000000000PNG  IHDRm#sBITOPLTE~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ff~Y3ffׁ݄~~{wurlifc_\Y3ffVtRNS"""333DDDUUUfffwwwo pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time09/05/04wIDATxkC8@!)C ` B–]:4̴䇞L |1+]Krc̔Ϩ @›R 6w7W@Jxyx!NF7D ^#ejulCH~ vRC-VC(%l6W %b=\]\=tc)A!e̬量׷U);هk B H~:}q^!%oVpwk4TPF6fsEz7}q,{J9zBSF\kw4s~[ɿ{UȔ>3jG!D) 1J's.`!?2czWr|IBq$ow)? ! $i& $Y.i& $#RMJ $RӛTyI iCQCf_ zOB@LR); $q{jR DR"e;"6oR!JHdN"Bl" I%d`yK71O#@,R7$ DHR"'H7H7eBdzO9e1Y >oR! `yyQz R"%{B {E/!-.!22L-[AꝚXy[峷6 d`(N|hE-z&{EQ[J H ~C!EQd  !$;;h ί($o|qn/zB~$,Io7Wg_H {xA&}x7!C@R=; ) dxv^E2\d!e !0AhC&8 z-!e{}ZBF ¾  R0@H! EQdQɟd62*kE dkptHY4ys":( R!C =W'2DoqR9.2.iYu31(+!6]̶%xNU8/&%MWBRmu tiAHBM $O!嶁FSs~G@H~BzK $S!ݖmۮ愽_K(fԛ*7AHNB^;&[x!_`0G(DGH,bi⃯QīIf<| " Y8惐\4"iJ-Vwql?efˉjuK;}hqJ+ ]HլDǶS 28Rny]%ܴ5:]̅Hu 3BS;l*=2B:!S ԒDfP\H)tT˘ a~ms!̑Nn"DH\JpY $$eɘL,"dF\}@YuSd&IHʄV<(5'*2B<9z!li_f㟔p4o3EyEf-ړ2z%BB;Ğk7 E'ľ?!j!P Q aH(0a;뤮1t>3km a粘BdB0,1yK a msO@HBgvhedRxQm%@]'^:ATeN&&{ ?4j BҗMK1DZTBA?eFeG"gMFC_h!|F"{ʪlY! Ixj2 Bޗ|ƶYE cłH܌NHS!egNqZ$'i0JPźP8!LU'7tiR|Z!̕Hᄰ;6jɅbη-UwI0A_T Os71qM`_\| IP*gT-@6 nɅF 2M膮;dЍDU:Ydr6/@U=ֲ'1)BJι1y]>WfBCJ\P@!|LK BLV#d[A(Ĥ% 1T/d9ѐHZ oDOPvBJhK-'M:vDmPk: Iӏ yS}G-e>np5F2A~Tp#~%1d~lmCXE#_4].@07DBBHHeLij {aPW=/Vx%9ZvtiRpUl\x.wMf52%ポ`fpЍZ In(QdurIx"e3:N'T[F>?6cwp. %$b5 `Gg'5x%j&wp#Ewb;wҧ,G*wbvq1lCڬ5>DKmaP'ݵVF,^v_3>C1Ƈg' D)HH\dB,<N0*zeǁb@BJOp ~> r/g"lv? \RB(q| AO}f5'ꈠD!%ҭXH+Es&20DǨR"u“K,,x/ɧ ObR!@ ia(/e53ߧn_q1JA/ ]$2>n^ }n[޷&~+B/K -<9'ޡ"/l7+^ᕂG^6iuBo@2v)i{>LaZJr)&H|B Fri, 05 Oct 2018 12:00:00 +0100 jclic (0.3.2.9-1ppa1) trusty; urgency=low * Check ZIP file integrity when saving projects * Write license tags to 'project.json' in HTML5 export * Enable 'level' in URL media type (opens in _BLANK) * HTML5 export includes information about number of activities, media objects and size * Updated Catalan translation -- Francesc Busquets Fri, 03 Aug 2018 12:00:00 +0100 jclic (0.3.2.8-1ppa1) trusty; urgency=low * New fields 'license', 'icon16', 'icon72' and 'icon192' in JClicAuthor -- Francesc Busquets Mon, 12 Mar 2018 12:00:00 +0100 jclic (0.3.2.7-1ppa1) trusty; urgency=low * Increased max time when recording audio, optimized "refresh media" in JClic Author -- Francesc Busquets Thu, 01 Feb 2018 12:00:00 +0100 jclic (0.3.2.6-1ppa1) trusty; urgency=low * Corrected a bug found when exiting JClic Author without saving changes -- Francesc Busquets Sun, 29 Oct 2017 12:00:00 +0100 jclic (0.3.2.5-1ppa1) trusty; urgency=low * Corrected a bug found when parsing the new area and level descriptors -- Francesc Busquets Thu, 26 Oct 2017 12:00:00 +0100 jclic (0.3.2.4-1ppa1) trusty; urgency=low * New fields in jclic files, import scorm.zip files -- Francesc Busquets Mon, 09 Oct 2017 12:00:00 +0100 jclic (0.3.2.1-1ppa1) precise; urgency=low * Revert changes in the base URL of the script used in HTML5 export -- Francesc Busquets Mon, 05 Sep 2016 12:00:00 +0100 jclic (0.3.2.0-1ppa1) precise; urgency=low * Create SCORM file in HTML5 export -- Francesc Busquets Fri, 15 Jul 2016 12:00:00 +0100 jclic (0.3.1.1a-1ppa1) precise; urgency=low * Improvements in HTML5 export -- Francesc Busquets Fri, 29 Apr 2016 09:00:00 +0100 jclic (0.3.1.0a-1ppa1) precise; urgency=low * New feature "Export to HTML5" -- Francesc Busquets Wed, 09 Dec 2015 14:00:00 +0100 jclic (0.2.3.5a-1ppa1) precise; urgency=low * Corrected GitHub issue #5 -- Francesc Busquets Mon, 04 Aug 2014 14:00:00 +0100 jclic (0.2.3.4d-1ppa1) precise; urgency=low * Added "jclic-libmanager" command to set/unset system project libraries -- Francesc Busquets Mon, 16 Dec 2013 16:00:00 +0100 jclic (0.2.3.4c-1ppa1) precise; urgency=low * Corrected "Icon" field in ".desktop" launchers -- Francesc Busquets Sat, 14 Dec 2013 09:45:00 +0100 jclic (0.2.3.4b-1ppa2) precise; urgency=low * Corrected path for SVG icons -- Francesc Busquets Sat, 14 Dec 2013 00:17:00 +0100 jclic (0.2.3.4b-1ppa1) precise; urgency=low * build.xml updated to force UTF-8 encoding in javac ant task -- Francesc Busquets Tue, 10 Dec 2013 09:46:28 +0100 jclic (0.2.3.4-1ppa1) precise; urgency=low * Initial release of the JClic PPA package * Updated Standards-Version to 3.9.3 -- Francesc Busquets Tue, 10 Dec 2013 09:46:28 +0100 dist/linux/debian/compat000066400000000000000000000000021335566474600156230ustar00rootroot000000000000009 dist/linux/debian/control000066400000000000000000000024721335566474600160350ustar00rootroot00000000000000Source: jclic Section: education Priority: optional Maintainer: Francesc Busquets Build-Depends: debhelper (>= 9) Build-Depends-Indep: ant, default-jdk | openjdk-7-jdk | openjdk-8-jdk | openjdk-9-jdk | openjdk-10-jdk | openjdk-11-jdk Standards-Version: 3.9.7 Homepage: http://clic.xtec.cat #Vcs-Git: git://git.debian.org/collab-maint/jclic.git #Vcs-Browser: http://git.debian.org/?p=collab-maint/jclic.git;a=summary Package: jclic Architecture: all Depends: ${misc:Depends}, default-jre | openjdk-7-jre | openjdk-8-jre | openjdk-9-jdk | openjdk-10-jdk | openjdk-11-jdk Suggests: ttf-mscorefonts-installer Description: Authoring tool and player for multimedia educational activities JClic is formed by a set of computer applications that are used for carrying out different types of educational activities: puzzles, associations, text exercises, crosswords... Package: jclic-reports Architecture: all Depends: ${misc:Depends}, jclic (= ${source:Version}) Recommends: libmysql-java Description: Reporting system for JClic activities JClic Reports tracks JClic activities played by students, collecting and storing in a database information about time spended on activities, number of attempts and score. JClic Reports acts also as a tiny HTTP server to represent the collected data in HTML pages and diagrams. dist/linux/debian/copyright000066400000000000000000000112611335566474600163610ustar00rootroot00000000000000Format: http://dep.debian.net/deps/dep5 Upstream-Name: jclic Upstream-Contact: Francesc Busquets Source: https://github.com/projectestac/jclic Files: * Copyright: 2000-2017 Francesc Busquets & Departament d'Ensenyament de la Generalitat de Catalunya License: GPL-2.0+ Comment: With the collaboration of Mònica Grau, Sara Arjona, Fernando Cuartero, Albert Llastarri and Jordi Lagares. Files: extensions/xml/* Copyright: The JDOM Project (http://www.jdom.org) License: JDOM-Apache-like Files: src/utils/edu/xtec/util/BrowserLauncher.java Copyright: Dem Pilafian, enhanced by Williem van Engen (http://goo.gl/T3CFQ) License: public-domain Files: extensions/soundspi/javalayer/* extensions/spoundspi/MpegAudioSpi/* Copyright: JavaZOOM (http://www.javazoom.net) License: LGPL Files: extensions/soundspi/jorbis/* Copyright: ymnk - JCraft (http://www.jcraft.com/jorbis) License: LGPL Files: extensions/soundspi/tritonus/* Copyright: Tritonus project (http://www.tritonus.org) License: LGPL Files: extensions/img/image4j/* Copyright: Ian McDonagh (http://image4j.sourceforge.net) License: LGPL Files: src/player/edu/xtec/jclic/project/LibraryManager.java Copyright: The JSON Group (http://www.json.org/java) License: other License: GPL-2.0+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". License: JDOM-Apache-like Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. . Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: . 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. . 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. . 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. . THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. . This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . License: LGPL The full text of the LGPL version is available in https://www.gnu.org/licenses/lgpl.html License: public-domain These files are in the public domain. License: other Do not use it for evil dist/linux/debian/jclic-reports.docs000066400000000000000000000000421335566474600200530ustar00rootroot00000000000000CREDITS.txt HACKING.txt README.md dist/linux/debian/jclic-reports.install000066400000000000000000000003351335566474600205760ustar00rootroot00000000000000dist/jclic/jclicreports.jar usr/share/java dist/linux/applications/jclicreports.desktop usr/share/applications dist/linux/bin/jclicreports usr/bin dist/linux/pixmaps/jclicreports.svg usr/share/icons/hicolor/scalable/apps dist/linux/debian/jclic-reports.links000066400000000000000000000001361335566474600202470ustar00rootroot00000000000000/usr/share/icons/hicolor/scalable/apps/jclicreports.svg /usr/share/pixmaps/jclicreports.svg dist/linux/debian/jclic-reports.manpages000066400000000000000000000000371335566474600207220ustar00rootroot00000000000000dist/linux/man/jclicreports.1 dist/linux/debian/jclic.docs000066400000000000000000000000421335566474600163570ustar00rootroot00000000000000CREDITS.txt HACKING.txt README.md dist/linux/debian/jclic.install000066400000000000000000000007021335566474600171000ustar00rootroot00000000000000dist/jclic/jclic.jar usr/share/java dist/jclic/jclicauthor.jar usr/share/java dist/linux/applications/jclic.desktop usr/share/applications dist/linux/applications/jclicauthor.desktop usr/share/applications dist/linux/bin/jclic usr/bin dist/linux/bin/jclicauthor usr/bin dist/linux/bin/jclic-libmanager usr/bin dist/linux/pixmaps/jclic.svg usr/share/icons/hicolor/scalable/apps dist/linux/pixmaps/jclicauthor.svg usr/share/icons/hicolor/scalable/apps dist/linux/debian/jclic.links000066400000000000000000000002511335566474600165510ustar00rootroot00000000000000/usr/share/icons/hicolor/scalable/apps/jclic.svg /usr/share/pixmaps/jclic.svg /usr/share/icons/hicolor/scalable/apps/jclicauthor.svg /usr/share/pixmaps/jclicauthor.svg dist/linux/debian/jclic.manpages000066400000000000000000000001261335566474600172250ustar00rootroot00000000000000dist/linux/man/jclic.1 dist/linux/man/jclicauthor.1 dist/linux/man/jclic-libmanager.1 dist/linux/debian/jclic.postinst000077500000000000000000000020321335566474600173160ustar00rootroot00000000000000#!/bin/sh # postinst script for jclic # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `configure' # * `abort-upgrade' # * `abort-remove' `in-favour' # # * `abort-remove' # * `abort-deconfigure' `in-favour' # `removing' # # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in configure) # Initializing edu.xtec.jclic node in Java system preferences jclic-libmanager -list -silent ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 dist/linux/debian/rules000077500000000000000000000006721335566474600155120ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 %: dh $@ dist/linux/debian/source/000077500000000000000000000000001335566474600157255ustar00rootroot00000000000000dist/linux/debian/source/format000066400000000000000000000000141335566474600171330ustar00rootroot000000000000003.0 (quilt) dist/linux/man/000077500000000000000000000000001335566474600137565ustar00rootroot00000000000000dist/linux/man/jclic-libmanager.1000066400000000000000000000064051335566474600172300ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .TH "JClic Library Manager" 1 2013-12-04 "" "" .SH NAME jclic-libmanager \- Utility to manage JClic libraries at system level .SH SYNOPSIS .B jclic-libmanager .RI "[" OPTION "] [" NAME "] [" FILE "]" .SH DESCRIPTION This manual page describes briefly the .B jclic-library command. This manual page was written for the Debian GNU/Linux distribution. It only contains the description of the basic options. For full manuals and documentation please visit: .br http://clic.xtec.cat and https://github.com/projectestac/jclic/wiki .BR JClic is formed by a set of computer applications that are used for carrying out different types of educational \fBactivities\fP: puzzles, associations, text exercises, crosswords... .br If you want to check about how JClic projects are, you should take a look at: .br http://clic.xtec.cat/db/listact_en.jsp JClic activities are packed in \fBJClic projects\fP. Projects are sets of activities organized in one or more sequences, which indicate the order in which they have to be shown. .br Projects can be organized into \fBJClic Libraries\fP. Libraries are collections of \fBJClic projects\fP, often structured in folders and subfolders. When JClic starts, it can automatically show the main library. When more than one library is defined JClic shows a list, allowing users to select one. .br Each user can have its own JClic Library, usually placed in \fB~/JClic/projects\fP. JClic libraries are encapsulated into XML files. These files are named "library.jclic" by default. .br System-wide libraries can also be specified. These system-wide libraries are usually "read-only", and shown to everyone without the need of per-user settings. .BR JClic\ Library\ Manager is a tool intended to be used by admin users to list, add and remove references to JClic Libraries at system level. It should be called always as a superuser (e.g.: "sudo jclic-libmanager -list") .SH OPTIONS .TP .B \-list List the name and path of the current JClic libraries defined at system level. .TP .BI \-add \ name \ path Adds the "library.jclic" file pointed by "path" into the list of JClic system libraries. If "name" has blanks, please enclose it within double quotes. .TP .BI \-remove \ name Remove the specified library from the list of JClic libraries defined at system level. Please enter the exact name, as obtained by a call to "sudo jclic-libmanager -list", and enclose it within double quotes in case it has blanks. .TP .BI \-help Displays a short abstract of the options. .TP .SH AUTHORS JClic was written by Francesc Busquets for the Department of Education of the Government of Catalonia. .SH SEE ALSO .BR jclic (1), .BR jclicauthor (1), .BR jclicreports (1) dist/linux/man/jclic.1000066400000000000000000000121321335566474600151230ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .TH "JClic Player" 1 2015-12-09 "" "" .SH NAME jclic \- Standalone player of multimedia educational activities .SH SYNOPSIS .B jclic .RI "[" OPTION "]... [" FILE "]" .SH DESCRIPTION This manual page describes briefly the .B jclic command. This manual page was written for the Debian GNU/Linux distribution. It only contains the description of the basic options. .br For full manuals and documentation please visit: .br http://clic.xtec.cat and http://projectestac.github.io/jclic .BR JClic is formed by a set of computer applications that are used for carrying out different types of educational activities: puzzles, associations, text exercises, crosswords... These activities are packed in projects. A project is formed by a set of activities and one or more sequences, which indicate the order in which they have to be shown. .BR JClic is able to play JClic projects, that should have extension \fB*.jclic.zip\fP or \fB*.jclic\fP. It can also run installer macros of JClic projects, with extension \fB*.jclic.inst\fP and import packages of activities made with the old "Clic 3.0" software, that have extension \fB*.pcc\fP and \fB*.pac\fP. If you want to check about how JClic projects are, you should take a look at: .br http://clic.xtec.cat/db/listact_en.jsp .SH OPTIONS .TP .B \-trace=true Show in a terminal some debug information for the application. .TP .BI \-language= code ISO 639 code of the language used by JClic in system messages and menus, e. g.: "pt" to indicate Portuguese. .TP .BI \-country= code Optional ISO 3166-1 code specifying a local variant of the language, e.g.: "BR" to indicate Brazilian Portuguese. .TP .BI \-variant= name An optional variable that can be used in conjunction with the preceding two, e.g.: "-language=ca -country=ES -variant=valencia" for the Valencian variant of Catalan. .TP .BI \-skin= name Type of visual interface used by JClic at start. The stock skins provided by JClic are: .I @default.xml @blue.xml @orange.xml @green.xml @simple.xml @mini.xml. Note that stock skin names are always preceeded by "@". Otherwise, you must indicate a full or relative path to an XML file implementing the JClic Skin Schema. For more info see: .br https://github.com/projectestac/jclic/blob/master/xml/skin.xsd .TP .BI \-systemSounds= true|false This option indicates if JClic must play or not system sounds. .TP .BI \-compressImages= true|false This option decides if JClic will compress images in order to make it to fit into the cells. Default is \fItrue\fP. .TP .BI \-lookAndFeel= value Java Look&Feel to be used by JClic. Possible values are .I default system metal motif and .I windows. Default is "system". .TP .BI \-audioEnabled= true|false This option allows to enable or disable the sounds in JClic. .TP .BI \-mediaSystem= JMF|QT Preferred multimedia system: "JMF" for Java Media Framework or "QT" for QuickTime. .TP .BI \-reporter=class Name of the Java class used by the reports engine of JClic, e.g.: "TCPReporter". Classes belonging to "edu.xtec.jclic.report" can safely ommit the package name. .TP .BI \-reporterParams= parameters Parameters passed to the reports engine. This option can have multiple key-value pairs inside, separated by semi-colons. E.g.: .br .B jclic -reporter=TCPReporter -reporterParams="path=localhost:9000/reports;user=john" .br The main parameters used by the stock reporter classes are: .SS "Main parameters used in the stock reporter classes" .TP .B user User id in the reports system. .TP .B key A special key that will be saved in the database. This kind of keys are used in the Moodle module of JClic to store session values. .TP .B context Another special key that will be saved in the database. It can indicate, for example, the type of course where the activities are being done. .TP .B path In TCPReporter only, complete path to the reports server, e.g.: "localhost:9000/reports" .TP .B protocol In TCPReporter only, protocol to be used to communicate with the reports server. Possible values are "http" and "https" (since JClic 0.2.2.0) .TP .B lap In TCPReporter, number of seconds between successive calls to the reports server. Default is 20 seconds. .SH AUTHORS JClic was written by Francesc Busquets for the Department of Education of the Government of Catalonia. .PP This manual page was initially written by José L. Redrejo Rodríguez , for the Debian project, and continued by Francesc Busquets (but may be used by others). .SH SEE ALSO .BR jclicauthor (1), .BR jclicreports (1), .BR jclic-libmanager (1) dist/linux/man/jclicauthor.1000066400000000000000000000077261335566474600163630ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .TH "JClic Author" 1 2015-12-09 "" "" .SH NAME jclicauthor \- Editor of multimedia educational activities .SH SYNOPSIS .B jclicauthor .RI "[" OPTION "]... [" FILE "]" .SH DESCRIPTION This manual page describes briefly the .B jclicauthor command. This manual page was written for the Debian GNU/Linux distribution. It contains only the description of the basic options. .br For full manuals and documentation please visit: .br http://projectestac.github.io/jclic and http://clic.xtec.cat .BR JClic is formed by a set of computer applications that are used for carrying out different types of educational activities: puzzles, associations, text exercises, crosswords... These activities are packed in projects. A project is formed by a set of activities and one or more sequences, which indicate the order in which they have to be shown. If you want to check about how JClic projects are, you should take a look at: .br http://clic.xtec.cat/db/listact_en.jsp .BR JClic\ Author is an authoring tool used to create and edit JClic project files, that should have extension \fB*.jclic.zip\fP. It is used also to export JClic activities to HTML5, ready to be published on the Internet and used with any modern browser without the need of Java. JClic Author can also create JClic project installers (files with extension \fB*.jclic.inst\fP) and generate HTML pages containing JClic Java applets. .SH OPTIONS .TP .B \-trace=true Show in a terminal some debug information for the application. .TP .BI \-language= code ISO 639 code of the language used by JClic in system messages and menus, e. g.: "pt" to indicate Portuguese. .TP .BI \-country= code Optional ISO 3166-1 code specifying a local variant of the language, e.g.: "BR" to indicate Brazilian Portuguese. .TP .BI \-variant= name An optional variable that can be used in conjunction with the preceding two, e.g.: "-language=ca -country=ES -variant=valencia" for the Valencian variant of Catalan. .TP .BI \-systemSounds= true|false This option indicates if JClic must play or not system sounds. .TP .BI \-compressImages= true|false This option decides if JClic will compress images in order to make it to fit into the cells. Default is \fItrue\fP. .TP .BI \-lookAndFeel= value Java Look&Feel to be used by JClic. Possible values are .I default system metal motif and .I windows. Default is "system". .TP .BI \-audioEnabled= true|false This option allows to enable or disable the sounds in JClic. .TP .BI \-mediaSystem= JMF|QT Preferred multimedia system: "JMF" for Java Media Framework or "QT" for QuickTime. .TP .B \-processZip \fIfile\fP \fIoutFolder\fP Exports a single JClic project (\fIfile\fP with extension ".jclic.zip") into the specified output folder. Files on \fIoutFolder\fP may be overwritten. .TP .B \-processZipFolder \fIinFolder\fP \fIoutFolder\fP Exports all JClic project files (files with extension ".jclic.zip") located on \fIinFolder\fP (and its subdirectories) to \fIoutFolder\fP. Files on outFolder may be overwritten. .SH AUTHORS JClic was written by Francesc Busquets for the Department of Education of the Government of Catalonia. .PP This manual page was initially written by José L. Redrejo Rodríguez , for the Debian project, and continued by Francesc Busquets (but may be used by others). .SH SEE ALSO .BR jclic (1), .BR jclicreports (1), .BR jclic-libmanager (1) dist/linux/man/jclicreports.1000066400000000000000000000077701335566474600165560ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .TH "JClic Reports" 1 2015-12-09 "" "" .SH NAME jclicreports \- Management of a database to track students work and results on JClic activities. .SH SYNOPSIS .B jclicreports .RI [ "CONFFILE.properties" ] .SH DESCRIPTION This manual page describes briefly the .B jclicreports command. This manual page was written for the Debian GNU/Linux distribution. It contains only the description of the basic options. .br For full manuals and documentation please visit: .br http://clic.xtec.cat and http://projectestac.github.io/jclic .BR JClic is formed by a set of computer applications that are used for carrying out different types of educational activities: puzzles, associations, text exercises, crosswords... These activities are packed in projects. A project is formed by a set of activities and one or more sequences, which indicate the order in which they have to be shown. If you want to check about how JClic projects are, you should take a look at: .br http://clic.xtec.cat/db/listact_en.jsp .BR JClic\ Reports allows the management of a database to track students work and results after playing JClic activities. It also acts as a server to allow accesing to the data using a web browser. .SH OPTIONS .TP .B configuration file The only parameter allowed by jclicreports is the absolute path to a configuration file written in Java ".properties" format, containing specific settings for the different parametres used by the application. Default values can be found in the .BR JClicReports.properties file found on your .B ~/JClic directory after running .BR jclicreports for first time. .SS "Parameters used in JClicReports.properties" .B Parameters related to the general behavior of JClic Reports .TP .B verbose .TP .B browser .TP .B lookAndFeel .TP .B language .TP .B country .TP .B variant .TP .B trustClientDateTime .TP .B autostart .TP .B tooltips .B Parameters related to the HTTP server .TP .B http_port .TP .B session_lifetime .TP .B http_timeout .TP .B http_autostart .B Parameters related to database connection .TP .B dbMaxConns .TP .B createTables .TP .B dbServer jdbc\:mysql\://localhost/JClicReports .TP .B dbDriver com.mysql.jdbc.Driver .TP .B dbLogin root .TP .B dbMapStatements .TP .B tablePrefix JCLIC_ .TP .B dbPassword .TP .B dbMaxCheckoutSeconds .TP .B timeout .TP .B dbDebugLevel .TP .B dbMinConns .TP .B dbMaxConnDays .B Parametres related to the drawing of graphics .TP .B graph_color_header_bg .TP .B graph_width .TP .B graph_color_dist .TP .B graph_header_height .TP .B graph_font_size .TP .B graph_color_border .TP .B graph_margin_dist_y .TP .B graph_margin_dist_x .TP .B graph_dist_width .TP .B graph_max_cols .TP .B graph_stroke_width .TP .B graph_color_bg .TP .B graph_color_v2 .TP .B graph_color_text .TP .B graph_color_v1 .TP .B graph_height .TP .B graph_margin .TP .B graph_color_header_text .TP .B graph_margin_y .TP .B graph_font_family .TP .B graph_margin_x .TP .B graph_color_alert .TP .B graph_div_y .B Parameters related to the logging system .TP .B dbLogAppend .TP .B http_logFile .TP .B dbLogFile .SH AUTHORS JClic was written by Francesc Busquets for the Department of Education of the Government of Catalonia. .PP This manual page was initially written by José L. Redrejo Rodríguez , for the Debian project, and continued by Francesc Busquets (but may be used by others). .SH SEE ALSO .BR jclic (1), .BR jclicauthor (1) dist/linux/pixmaps/000077500000000000000000000000001335566474600146645ustar00rootroot00000000000000dist/linux/pixmaps/jclic.png000066400000000000000000000040051335566474600164550ustar00rootroot00000000000000PNG  IHDR00WIDATxMlgwk!65q&5@Ji "E(dnB˕>UH\APBTJBB8|֍~;a6N/Ka}}ws|x$R/3?s{Z8!dg}DŽwMy) ]rޅ3xJՈLNI*3Zas\K~)e_ [{K1|`fUG.IU GMa)&ppi9z~KYR3=iǁzVV,R-* rM Ljbw6PHO"j-f&xNQ$D"`MMCq BQTXEpuzzkL_PUWK43]@@Jog39{$5Ucl(w::4b*/Wm:"Α[nxBPۜ~UDzC0'\b9(<ʾzv;%pXQIP)1;>cgQda h28DDK-M9vvEnndr8 ,e9 ITUb\GPO2#h<p MbC0+\].?; EhQE%xw:P#T}jhhf| eSi_2MEEI ¦4XFӉpf̌$6%0% 0>qY"SFc(6qir=G7*У1Har }Jpe'mAl5b`ZrR"~&)EEӓ0& Df> @x>,g z)LGmZDD`Ha#P Vb٠6kw"pgxXSƙkm,3*l^p$B4hiYb,Կ$J HʱN\!?r  6DŽ7&"Ed灯2 *K?;P7Ax Ja0ɖ ]Z/;[gX#?FŚ`j^UeFO|ʠT"txnl b: eA\#1+[@Ve?'LLJ\ ~h2Lj"oIW MY ;$1S& GͮD4CW"0LIdl@|:q<]:pA$$ M q5`v٬&3GwClkl{D|JfAb"ϵLm\Fzڂer7x'Y|f,D@TF˂Ky[leNu: yr@.~$I p(1"'={~Pzm(4b@ML[@I<$q,*3D,w{>c.5Rr}.29M.r8< L) &={nIENDB`dist/linux/pixmaps/jclic.svg000066400000000000000000000053211335566474600164720ustar00rootroot00000000000000 JClic Playerimage/svg+xmlJClic PlayerFrancesc Busquetshttp://clic.xtec.catdist/linux/pixmaps/jclicauthor.png000066400000000000000000000033371335566474600177070ustar00rootroot00000000000000PNG  IHDR00WIDATx]W{|w7l+i즁J/H< Y'^"C UP^Jm’$m>M6z㏙0^uYgmCe4s#0# k@v.ˍA%«!DXw*CIJo+%k#JT]⺔]u&\_߾,X( ?4lHauP.AJӱ?:Kx>eitceHdP>W0 E詴"@4ՂjPRd*pq84K,m~ TZsaA*f@$ ēt\BY!]\%]0S.4Ĥ5HS!`.,ГJ{Rn~ge824$mQnK|BaTJ˛cex ^O c} f!*6,0x/L$1OBr7aџFp b;_ >7œ H~|&O7P MMJ- 310y!`f_C5**肧I< m~"0W@L07fbvK xF 7LPU^*a {i-y'bo ufcNDQw+؝Зa`Z c|(A6ouQ;}`<2:NTA9lޟ~SuK(!3c04.Jиu@{Wwpynp ėaxL:ã`n/Ct8><,.,.Xafα* S"~&pql*9;f{߷-mqal܆" f={o݄eBfs# ^|mhC{ &0&w&l[p9ObsNn-q2|a 4ڙۂ<:HOB>+c cqHy o9)M ZH ~ L^J8 WJuޖ_۷v~;&x>mt&Y\QY_f{} h_}|86N37Rk[l[@`u1sR4tFR%q{:ۂ /7Xt^m^ӆ7i䡃+~G;;{<*']1ɴ*G" JK͋vN; n5 pIs.:)IENDB`dist/linux/pixmaps/jclicauthor.svg000066400000000000000000000053621335566474600177220ustar00rootroot00000000000000 JClic Authorimage/svg+xmlJClic AuthorFrancesc Busquetshttp://clic.xtec.catdist/linux/pixmaps/jclicreports.png000066400000000000000000000025561335566474600201050ustar00rootroot00000000000000PNG  IHDR00W5IDATxoU?3v؉,*jSDBM)RiE9ȡs7B$ĉ".! [ԦJU%i6ql̛8!Mbv|3o~t7 +3G&EڢO57T ( %d \gR,Pl0|O14ׁr5lˤb *¤" -`IaXNW@Qa(ao,aQrlS^&i&hpP 6CmC_ Qʓ40)u!X\,_eRzi`BՈ &[4R 1ӀR=^*0e0fJH<2t <ct$0n5Az ~@kgwhd  M' Dֿ!O9) +P5V~7 X*s`ۙlV ~myϮ>l@^ U#>8Ա́-e@:!I栮Nwߡ-G%kKJ,=}żR)5pZU b[a2@:K8j%Ga1A }y[N$axL ,r͵y"Jn\1pN Hw.wW8 |]+M/w3抁Sp\MroYLP%mrS Uj6 8r 8$G`pB^j¢} C glfoaU c5 2"wt"0ahͧXel˿nEul p)eT `UUF DЯ EcHfqPK<?ͤeBP&,Er@ zcp41M/G_4/gmfz2) ts9l3 NV+/W\$9{~f4Dy֒Ia7t\ /ҶdRԀ_eh@<6`5&/=:y񰆪7ieP $N ̇5O5_@ iFĀ-xA"M$.JXC)-:/yuI2]|'=߻p8]Hkt<.Ot< [.{vNFBf7` !@Ewf|Q쁾P-Nw,,{uT PX6X6KUeXx,]\j XIENDB`dist/linux/pixmaps/jclicreports.svg000066400000000000000000000064311335566474600201140ustar00rootroot00000000000000 JClic Reportsimage/svg+xmlJClic ReportsFrancesc Busquetshttp://clic.xtec.catdist/reports/000077500000000000000000000000001335566474600135425ustar00rootroot00000000000000dist/reports/jclicReports.properties000066400000000000000000000114451335566474600203300ustar00rootroot00000000000000#-------------------------------------------------------------------------- # JCLIC REPORTS SERVER SETTINGS #-------------------------------------------------------------------------- #-------------------------------------------------------------------------- # Name of the JDBC driver #-------------------------------------------------------------------------- # Examples: ODBC: sun.jdbc.odbc.JdbcOdbcDriver # MySQL: com.mysql.jdbc.Driver # PointBase: com.pointbase.jdbc.jdbcUniversalDriver # Oracle: oracle.jdbc.driver.OracleDriver #-------------------------------------------------------------------------- dbDriver=com.mysql.jdbc.Driver #-------------------------------------------------------------------------- # URL of the the database #-------------------------------------------------------------------------- # Examples: ODBC: jdbc:odbc:JClic # MySQL: jdbc:mysql://localhost/JClicReports?relaxAutoCommit=true # PointBase: jdbc:pointbase:jclic # Oracle: jdbc:oracle:thin:@server.domain.com:1521:database #-------------------------------------------------------------------------- dbServer=jdbc:mysql://localhost/JClicReports?relaxAutoCommit=true #-------------------------------------------------------------------------- # DB system username and password (not mandatory in some DBMS) #-------------------------------------------------------------------------- dbLogin=jclic_user dbPassword=jclic_pwd #-------------------------------------------------------------------------- # If not exist, automatically create tables on first run #-------------------------------------------------------------------------- createTables=true #-------------------------------------------------------------------------- # String that will be used as prefix for table names #-------------------------------------------------------------------------- tablePrefix=JCLIC_ #-------------------------------------------------------------------------- # Automatically start services #-------------------------------------------------------------------------- autostart=true http_autostart=true #-------------------------------------------------------------------------- # Provide console/log info on each transaction #-------------------------------------------------------------------------- verbose=true #-------------------------------------------------------------------------- # Language to be used (ISO-639 two-letter language codes) #-------------------------------------------------------------------------- #language=ca #-------------------------------------------------------------------------- # If set, write logs to file #-------------------------------------------------------------------------- http_logFile= #-------------------------------------------------------------------------- # Maximum time to wait for idle connections (in milliseconds) #-------------------------------------------------------------------------- http_timeout=1200 timeout=1200 #-------------------------------------------------------------------------- # Parameters related to the pool of database connections #-------------------------------------------------------------------------- # Reuse preparedStatements dbMapStatements=true # Absolute path name for log file. e.g. 'c:/temp/mylog.log'. # Default is 'jclicReportsDBConnection.log' in user's home dir. dbLogFile=/var/lib/tomcat7/logs/jclicReportsDBConnection.log # Append to logfile. Default is true. dbLogAppend=true # Minimum number of connections to start with. default is 1 dbMinConns=1 # Maximum number of connections in dynamic pool. Default is 3 dbMaxConns=3 # Time in days between connection resets. (Reset does a basic cleanup). Default is 1.0 dbMaxConnDays=1.0 # Level of debug messages output to the log file. # 0 -> no messages, 1 -> Errors, 2 -> Warnings, 3 -> Information. # Default is 2. dbDebugLevel=2 # Max time a connection can be checked out before being recycled. # Zero value turns option off. Default is 60. dbMaxCheckoutSeconds=60 #-------------------------------------------------------------------------- # Parameters related to the drawing of graphics #-------------------------------------------------------------------------- graph_width=440 graph_dist_width=192 graph_height=155 graph_header_height=25 graph_margin=8 graph_color_bg=F0F8FF graph_color_text=000000 graph_color_border=FFFFFF graph_color_v1=D00000 graph_color_v2=00D000 graph_color_dist=0000D0 graph_color_alert=FF0000 graph_stroke_width=3.0 graph_font_family=Dialog graph_font_size=11 graph_margin_x=50 graph_margin_y=20 graph_div_y=4 graph_max_cols=10 graph_margin_dist_x=15 graph_margin_dist_y=20 graph_color_header_bg=ADD8E6 graph_color_header_text=000000 extensions/000077500000000000000000000000001335566474600133005ustar00rootroot00000000000000extensions/build.xml000066400000000000000000000044701335566474600151260ustar00rootroot00000000000000 extensions/dbconn/000077500000000000000000000000001335566474600145435ustar00rootroot00000000000000extensions/dbconn/build.xml000066400000000000000000000101131335566474600163600ustar00rootroot00000000000000 Copyright © ${year} Francesc Busquets (fbusquets@xtec.cat) & Departament d'Educació de la Generalitat de Catalunya (info@xtec.cat)
Licensed under the terms of the GNU General Public License

]]>
extensions/dbconn/config.properties000066400000000000000000000027061335566474600201330ustar00rootroot00000000000000#Name of the JDBC driver to use #ODBC: sun.jdbc.odbc.JdbcOdbcDriver #PointBase: com.pointbase.jdbc.jdbcUniversalDriver #Oracle: oracle.jdbc.driver.OracleDriver #MySQL: com.mysql.jdbc.Driver #JNDI datasource lookup: JNDI dbDriver=oracle.jdbc.driver.OracleDriver #Path to the database #ODBC: jdbc:odbc:JClicUserReports #PointBase: jdbc:pointbase:jclic #Oracle: jdbc:oracle:thin:@host:1521:db #MySQL: jdbc:mysql://localhost/clic #JNDI: jdbc/JClicPoolDS dbServer=jdbc:odbc:JClicUserReports #Context where to look for the JNDI datasource, used only in JNDI mode #Tomcat: java\:comp/env #Other systems: can be null dbContext= #DB system username and password dbLogin= dbPassword= #Save and reuse PreparedStatement objects dbMapStatements=true #Minimum number of connections to start with. default is 1 dbMinConns=1 #Maximum number of connections in dynamic pool. Default is 3 dbMaxConns=3 #Absolute path name for log file. e.g. 'c:/temp/mylog.log'. #Default is 'pooledConnectionBean.log' in user's home dir. dbLogFile=DBConnection.log #Time in days between connection resets. (Reset does a basic cleanup). Default is 1.0 dbMaxConnDays=1.0 #Append to logfile. Default is true. dbLogAppend=true #Max time a connection can be checked out before being recycled. #Zero value turns option off. Default is 60. dbMaxCheckoutSeconds=60 #Level of debug messages output to the log file. #0 -> no messages, 1 -> Errors, 2 -> Warnings, 3 -> Information. Default is 2. dbDebugLevel=2 extensions/dbconn/src/000077500000000000000000000000001335566474600153325ustar00rootroot00000000000000extensions/dbconn/src/edu/000077500000000000000000000000001335566474600161075ustar00rootroot00000000000000extensions/dbconn/src/edu/xtec/000077500000000000000000000000001335566474600170525ustar00rootroot00000000000000extensions/dbconn/src/edu/xtec/util/000077500000000000000000000000001335566474600200275ustar00rootroot00000000000000extensions/dbconn/src/edu/xtec/util/db/000077500000000000000000000000001335566474600204145ustar00rootroot00000000000000extensions/dbconn/src/edu/xtec/util/db/ConnectionBean.java000066400000000000000000000232561335566474600241540ustar00rootroot00000000000000/* * File : ConnectionBean.java * Created : 21-oct-2003 18:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util.db; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * This class stores an SQL {@link java.sql.Connection} and provides methods to * obtain {@link java.sql.PreparedStatement} objects from it. * ConnectionBean can also store a collection containing all the * PreparedStatement objects, allowing client applications to reuse them. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class ConnectionBean { private Connection con; private Map statements; private Date born; private Date lastUsed; private String lastStatement; private Date closed; /** * This field is used by {@link edu.xtec.util.db.ConnectionBeanProvider} to count * the number of times a ConectionBean has been used. */ public int usageCount; /** * Creates a new instance of ConnectionBean * @param con {@link java.sql.Connection} object in wich this ConnectionBean will be based. * @param mapStatements When set to true, PreparedStatement objects will be stored and reused. */ public ConnectionBean(Connection con, boolean mapStatements) { this.con=con; if(mapStatements) statements=new HashMap(); born=new Date(); } /** * Provides information about the current state of the ConnectionBean. * @return Information string, formatted in HTML. */ public String getInfo(){ StringBuilder sb=new StringBuilder(); sb.append("ConnectionBean ").append(hashCode()); if(statements!=null){ sb.append(" (").append(statements.size()).append(" statements)"); } sb.append("
\n"); sb.append("Created: ").append(born).append("
\n"); sb.append("Usage count: ").append(usageCount).append("
\n"); if(lastUsed==null) sb.append("Not yet used!
\n"); else{ sb.append("Last used: ").append(lastUsed).append("
\n"); sb.append("Last statement: ").append(lastStatement).append("
\n"); } if(closed!=null){ sb.append("Closed: ").append(closed).append("
\n"); } return sb.toString(); } /** * Provides direct access to the {@link java.sql.Connection} object. * @return The {@link java.sql.Connection} object used in this ConnectionBean. */ public Connection getConnection(){ lastUsed=new Date(); return con; } /** * Creates a PreparedStatement based on the current connection and the provided SQL expression.
* Important: Never call the close() method on Prepared statements obtained * from ConnectionBean objects created with the mapStatements option. * @param sql The SQL statement. * @throws SQLException If something goes wrong * @return The {@link java.sql.PreparedStatement} object.
*/ public PreparedStatement getPreparedStatement(String sql) throws SQLException{ if(closed!=null) throw new SQLException("Connection closed!"); lastUsed=new Date(); lastStatement=sql; PreparedStatement stmt=(statements==null) ? null : (PreparedStatement)statements.get(sql); if(stmt==null){ stmt=con.prepareStatement(sql); if(statements!=null) statements.put(sql, stmt); } else{ try{ // try - catch because // odbc.jdbc driver throws NullPoiterException on // PreparedStatement.clearParameters // stmt.clearParameters(); } catch(Exception ex){ // eat exception } } return stmt; } /** * Creates a PreparedStatement based on the current connection and the provided SQL expression.
* Important: Never call the close() method on Prepared statements obtained * from ConnectionBean objects created with the mapStatements option. * @return The {@link java.sql.PreparedStatement} object.
* @param resultSetType A resultSet type. See {@link java.sql.ResultSet}. * @param resultSetConcurrency A concurrency type. See {@link java.sql.ResultSet}. * @param sql The SQL sentence of the PreparedStatemnt. * @throws SQLException If something goes wrong */ public PreparedStatement getPreparedStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException{ if(closed!=null) throw new SQLException("Connection closed!"); lastUsed=new Date(); lastStatement=sql; PreparedStatement stmt=(statements==null) ? null : (PreparedStatement)statements.get(sql); if(stmt==null){ stmt=con.prepareStatement(sql, resultSetType, resultSetConcurrency); if(statements!=null) statements.put(sql, stmt); } else{ try{ // try - catch because // odbc.jdbc driver throws NullPoiterException on PreparedStatement.clearParameters // stmt.clearParameters(); } catch(Exception ex){ // eat exception } } return stmt; } /** * Closes a {@link java.sql.PreparedStatement} object supplied by a previous call * to getPreparedStatement(). Applications should always call this method * when the PreparedStatement is no longer needed, and never directly * call close() in the PreparedStatement. * @param stmt The PreparedStatement to be closed. */ public void closeStatement(PreparedStatement stmt){ closeStatement(stmt, false); } /** * ConnectionBeans created with the mapStatements tag set * to true can reuse {@link java.sql.PreparedStatement} objects between calls. * This method is functionally identical to closeStatement(PreparedStatement), but * has a param that allows to specify if the statement must be really closed. * @param stmt The PreparedStatement to be closed. * @param forceClose When true, the statement will be effectively closed. */ public void closeStatement(PreparedStatement stmt, boolean forceClose){ if(stmt!=null){ if(forceClose || statements==null){ try{ stmt.close(); } catch(Exception ex){ System.err.println("Error closing statement: "+stmt); } } if(statements!=null && forceClose){ for(String s : statements.keySet()){ PreparedStatement ps = statements.get(s); if(ps!=null && ps==stmt){ statements.remove(s); break; } } } } } /** * Clears all the stored {@link java.sql.PreparedStatement} objects (if any) and closes * the {@link java.sql.Connection}. * @throws SQLException If something goes wrong. */ public void closeConnection() throws SQLException{ if(closed==null){ closed=new Date(); if(statements!=null){ for(String s : statements.keySet()){ PreparedStatement stmt=statements.get(s); if (stmt != null) { try { stmt.close(); } catch (Exception ex) { // Eat Exception } } } statements.clear(); } con.close(); } } /** * Getter for property lastStatement. * @return Value of property lastStatement. */ public java.lang.String getLastStatement() { return lastStatement; } /** * Returns the number of {@link java.sql.PreparedStatement} objects stored by this * ConnectionBean. Used only in connection beans created with the mapStatements * param set to true. * @return The number of stored statements. */ public int getNumStatements(){ return statements==null ? 0 : statements.size(); } } extensions/dbconn/src/edu/xtec/util/db/ConnectionBeanProvider.java000066400000000000000000000357001335566474600256640ustar00rootroot00000000000000/* * File : ConnectionBeanProvider.java * Created : 21-oct-2003 18:18 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util.db; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.HashMap; import java.util.Map; /** * Classes that extended this abstract class provide {@link edu.xtec.util.db.ConnectionBean} * objects to clients. It also provides a static method to create ConnectionBeanProvider objects * based on different parameters, and stores a map containing all the created * objects, in order to reuse them between different instances or applications * sharing the same JVM. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public abstract class ConnectionBeanProvider { /** Tag used in properties to identify the JDBC driver used in the connections * to the database. */ public static final String DB_DRIVER="dbDriver"; /** Tag used in properties to identify the server used in connections */ public static final String DB_SERVER="dbServer"; /** Tag used in properties to identify the login name used in connections. */ public static final String DB_LOGIN="dbLogin"; /** Tag used in properties to identify the password used in connections. */ public static final String DB_PASSWORD="dbPassword"; /** * Tag used in properties to determine if the {@link edu.xtec.util.db.ConnectionBean} * objects created must store and reuse {@link java.sql.PreparedStatement} objects. */ public static final String MAP_STATEMENTS="dbMapStatements"; /** Tag used for true */ public static final String TRUE = "true"; /** Tag used for false */ public static final String FALSE="false"; /** * Name of the JDBC driver used in Connection objects */ protected String dbDriver; /** * Name of the JDBC url used in Connection objects */ protected String dbServer; /** Name of the user used in Connection objects. */ protected String dbLogin; /** * Password used in JDBC Connection objects. */ protected String dbPassword; /** * When true, the {@link edu.xtec.util.db.ConnectionBean} objects created will store and reuse * prepared statements. */ protected boolean mapStatements; private int useCount; private static Map cbProviders; /** * Main initialization function. Must be called immediatelly after constructor by * getConnectionBeanProvider functions. * @param map Collection of key - value pairs that must specify the driver, url, login and * password of the just created ConnectionBeanProvider. * @throws Exception Throwed if dbDriver does not contain a valid driver name, or if it can't be * instantiated. */ protected void setUp(Map map) throws Exception{ dbDriver = getValue(map, DB_DRIVER, null); dbServer = getValue(map, DB_SERVER, null); dbLogin = getValue(map, DB_LOGIN, null); dbPassword = getValue(map, DB_PASSWORD, null); mapStatements = !FALSE.equals(getValue(map, MAP_STATEMENTS, TRUE)); useCount=0; } /** This is the main function that all ConnectionbeanProvider objects must * implement.

* Important: You must ever call FreeConnectionBean after the use of the ConnectionBean * object. Typical inmplementation use a try - catch - finally statement block in * order to ensure that all ConnectionBean objects will be properly disposed after * use.

* Example:

*

     * ConectionBeanProvider cbp;
     * java.util.Properties prop=new Java.util.Properties();
     * // ...
     * // ... fill-up properties with values for dbDriver, dbServer, dbLogin, etc.
     * // ...
     * cbp=ConnectionBeanProvider.getConnectionBeanProvider(map);
     * ConnectionBean cb=cbp.getConnectionBean();
     * try {
     *  // ... use of the ConnectionBean object
     * } catch(Exception ex){
     *  // ... process possible exceptions done while database access
     * } finally {
     *  // Very important: free the ConnectionBean object:
     *  cbp.freeConnectionBean(cb);
     * }
     * 
* @return A ready-to-use ConnectionBean. Remember to return it by calling * FreeConnectionBean. */ public abstract ConnectionBean getConnectionBean(); /** This method must be called when the obtained ConnectionBean is no longer needed, * usualy inside the finally block of a try - catch statement. * @param conn The ConnectionBean object to be disposed * @return A descriptive String, useful only for debug purposes. */ public abstract String freeConnectionBean(ConnectionBean conn); /** * This method will be called before finalization. Implementations of * ConnectionBeanProvider must perform cleanup operations on all opened * connections. */ protected abstract void destroy(); /** * Provides information about the current state of this ConnectionBeanProvider. * @return Information string, formatted in HTML. */ public String getInfo(){ StringBuilder sb=new StringBuilder(); sb.append(DB_DRIVER).append(": ").append(dbDriver).append("
\n"); sb.append(DB_SERVER).append(": ").append(dbServer).append("
\n"); sb.append(DB_LOGIN).append(": ").append(dbLogin).append("
\n"); sb.append(MAP_STATEMENTS).append(": ").append(mapStatements).append("
\n"); sb.append("Use count:").append(useCount).append("
\n"); return sb.substring(0); } /** * Provides information about all the ConnectionBeanProvider objects currently * existing. * @return Information string, formatted in HTML. */ public static String getGlobalInfo(){ StringBuilder sb=new StringBuilder(); if(cbProviders==null) cbProviders=new HashMap(2); sb.append("").append(cbProviders.size()).append(" ConnectionBeanProviders created
\n"); for(String key : cbProviders.keySet()){ ConnectionBeanProvider cbp=cbProviders.get(key); sb.append("
\n"); sb.append(cbp.getInfo()); } return sb.substring(0); } /** * Method used to build a ConnectionBeanProvider. The current * implementations returns a {@link edu.xtec.util.db.SingleConnectionBeanProvider} if mapStatements * is false. Otherwise, it checks the value of dbDriverName to return a * {@link PooledConnectionBeanProvider} or a {@link * edu.xtec.util.db.JNDIConnectionBeanProvider}. * @param pooled Determines the type of ConnectionbeanProvider to be created: pooled or simple. * @param dbDriver Name of the JDBC driver to be used. When this param is "JNDI", a * {@link edu.xtec.util.db.JNDIConnectionBeanProvider} will be created. * @param dbServer Path to the JDBC source or JNDI datasource to be used. * @param dbLogin User name to be used in JDB connections. * @param dbPassword Password to be used in JDBC connections. * @param mapStatements When true, the created {@link edu.xtec.util.db.ConnectionBean} * objects will reuse PreparedStatements. * @throws Exception If something goes wrong. * @return The ConnectionBean object. */ public static ConnectionBeanProvider getConnectionBeanProvider(boolean pooled, String dbDriver, String dbServer, String dbLogin, String dbPassword, boolean mapStatements) throws Exception{ Map map=new HashMap(); map.put(DB_DRIVER, dbDriver); map.put(DB_SERVER, dbServer); map.put(DB_LOGIN, dbLogin); map.put(DB_PASSWORD, dbPassword); map.put(MAP_STATEMENTS, mapStatements ? TRUE : FALSE); return getConnectionBeanProvider(pooled, map); } /** * This method calls the many-params version of getConnectionBeanProvider(), * extracting the needed parameters from the map. * @param map Collection containing all the key - value pairs needed to create the * ConnectionBeanProvider object. * @param pooled Determines the type of ConnectionbeanProvider to be created: pooled or simple. * @throws Exception If something goes wrong. * @return The requested ConnectionBeanProvider object. */ public static ConnectionBeanProvider getConnectionBeanProvider(boolean pooled, Map map) throws Exception{ ConnectionBeanProvider result=null; String staticDbDriver=map.get(DB_DRIVER); String staticDbServer=map.get(DB_SERVER); String staticDbLogin=map.get(DB_LOGIN); StringBuilder kb=new StringBuilder(); kb.append(staticDbDriver).append("@"); kb.append(staticDbServer).append("@"); kb.append(staticDbLogin).append("@"); kb.append(pooled ? "POOLED" : "DIRECT"); String ks=kb.substring(0); if(cbProviders==null) cbProviders=new HashMap(2); else result = cbProviders.get(ks); /* Iterator it=cbProviders.keySet().iterator(); while(it.hasNext()){ Object o=it.next(); if(o!=null && o.equals(ks)){ result=(ConnectionBeanProvider)cbProviders.get(o); break; } } */ if(result==null){ if(JNDIConnectionBeanProvider.JNDI.equals(staticDbDriver)) result=new JNDIConnectionBeanProvider(); else if(pooled) result=new PooledConnectionBeanProvider(); else result=new SingleConnectionBeanProvider(); result.setUp(map); cbProviders.put(ks, result); } result.useCount++; result.readDBSettings(map); return result; } /** Use this method when a ConectionbeanProvider is no longer needed. * ConnectionBeanProvider objects are stored into a static collection, so they can * be reused when multiple classes (or multiple instances of the same class) need * them. The ConnectionBeanProvider object will be destroyed only when a internal * counter decreases to zero. * @param cbp The ConnectionBeanProvider to be released. */ public static void freeConnectionBeanProvider(ConnectionBeanProvider cbp){ if(cbp!=null && cbProviders!=null){ for (String s : cbProviders.keySet()) { ConnectionBeanProvider o=cbProviders.get(s); if(o!=null && o.equals(cbp) && --cbp.useCount<=0){ cbp.destroy(); cbProviders.remove(s); break; } } } } /** * Useful method used to retrieve a value from a Map using a default value when not * found, or when found with null value. * @param map The map where to search for * @param key The key to be searched * @param defaultValue Value returned when not found or null * @return The String associated with the specified key, or the defaultValue if not found. */ protected String getValue(Map map, String key, String defaultValue){ String result=map.get(key); if(result==null || result.trim().length()==0) result=defaultValue; return result; } /** * Key for the name of the database table that contains key-value pairs of settings */ public static final String SETTINGS_TABLE_KEY="SETTINGS_TABLE"; /** * Default name for the settings table */ public static final String DEFAULT_SETTINGS_TABLE = "SETTINGS"; /** * All the settings with this value will be read from the database */ public static final String READ_FROM_DATABASE="READ_FROM_DATABASE"; /** * This function looks inside a map for entries with the value "READ_FROM_DATABASE". * All settings with this text will be replaced with the value stored in a * table names "SETTINGS" (or with the name specified in the map with the key * "SETTINGS_TABLE"). This table must contain at least two fields: "SETTING_KEY" * and "SETTING_VALUE". * @param map The map to be processed * @throws Exception If the database is not accessible. */ public void readDBSettings(Map map) throws Exception{ Exception exception=null; String settingsTable=getValue(map, SETTINGS_TABLE_KEY, DEFAULT_SETTINGS_TABLE); if(settingsTable!=null && map.containsValue(READ_FROM_DATABASE)){ edu.xtec.util.db.ConnectionBean con=null; PreparedStatement stmt=null; ResultSet rs=null; try{ con=getConnectionBean(); String sql= "SELECT SETTING_VALUE"+ " FROM "+settingsTable+ " WHERE SETTING_KEY=?"; stmt=con.getPreparedStatement(sql); for (String key : map.keySet()) { String value=map.get(key); if(READ_FROM_DATABASE.equals(value)){ stmt.setString(1, key); rs=stmt.executeQuery(); if(rs.next()){ value=rs.getString(1); map.put(key, value); } } } } catch(Exception ex) { exception=ex; } finally { if(rs!=null) rs.close(); if(stmt!=null && con!=null) con.closeStatement(stmt); if(con!=null) freeConnectionBean(con); } } if(exception!=null) throw exception; } } extensions/dbconn/src/edu/xtec/util/db/JNDIConnectionBeanProvider.java000066400000000000000000000206031335566474600263250ustar00rootroot00000000000000/* * File : JNDIConnectionBeanProvider.java * Created : 10-nov-2005 19:28 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util.db; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.util.Date; import java.util.Map; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; /** * This class is a special {@link edu.xtec.util.db.ConnectionBeanProvider} that obtains * the {@link java.sql.Connection} objects from a JNDI datasource. In order to * obtain objects of this class, the static method getConnectionBeanProvider of * ConnectionBeanProvider must be called, passing the text JNDI as * value of the dbDriver parameter, and the JNDI name of the datasource * as the value of dbServer param. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class JNDIConnectionBeanProvider extends ConnectionBeanProvider{ /** * Key used for the dbContext property */ public static final String DB_CONTEXT="dbContext"; /** * String "JNDI", used to indicate ConnectionBeanProvider that an * object of this class is required. */ public static final String JNDI="JNDI"; /** * Object used to obtain valid {@link java.sql.Connection} objects. */ protected DataSource ds; /** * Context where to look for the indicated JNDI resource. In Apache Tomcat, this value should be * java:comp/env. */ protected String dbContext; private int totalCBRequests; private Date started; private Date lastUse; private String logFileString; private PrintWriter log; private int debugLevel; private int totalStatements; private String lastRequest; /** Creates a new instance of JNDIConnectionBeanProvider */ public JNDIConnectionBeanProvider() { } /** * Main initialization function, called immediatelly after constructor by * getConnectionBeanProvider functions. * @param map Collection of key - value pairs that must specify the JNDI Datasource name and * context params. * @throws Exception Throwed if the DataSource can't be * instantiated. */ @Override protected void setUp(Map map) throws Exception{ super.setUp(map); started=new Date(); dbDriver=JNDI; if(dbServer==null) throw new Exception("JNDI datasource name not specified!"); dbContext = getValue(map, DB_CONTEXT, null); debugLevel = Integer.parseInt(getValue(map, "dbDebugLevel", "2")); if(debugLevel>0){ try{ logFileString = getValue(map, "dbLogFile", null); if(logFileString!=null){ File f=new File(logFileString); if(!f.isAbsolute()){ f=new File(System.getProperty("user.home")); f=new File(f, logFileString); logFileString=f.getAbsolutePath(); } boolean logAppend = Boolean.valueOf(getValue(map, "dbLogAppend", "true")).booleanValue(); log = new PrintWriter(new FileOutputStream(logFileString, logAppend),true); } } catch(IOException ioex){ System.err.println(new Date().toString()+" - Error creating log file for JNDIConnectionProvider - "+ioex); } } Context ctx=new InitialContext(); if(dbContext!=null && dbContext.trim().length()>0) ctx=(Context)ctx.lookup(dbContext); ds=(DataSource)ctx.lookup(dbServer); if(log!=null){ log.println("-----------------------------------------"); log.println(started); log.println("Starting JNDIConnectionBeanProvider"); log.println("dbContext = " + dbContext); log.println("dbServer = " + dbServer); log.println("Context = " + ctx); log.println("Datasource = " + ds); log.println("-----------------------------------------"); } } /** Provides information about the current state of this ConnectionBeanProvider. * @return Information string, formatted in HTML. */ @Override public String getInfo(){ StringBuilder sb=new StringBuilder(); sb.append("JNDIConnectionBeanProvider ").append(hashCode()).append("
\n"); sb.append(super.getInfo()); sb.append("started: ").append(started).append("
\n"); sb.append("dbContext: ").append(dbContext).append("
\n"); sb.append("Total requests: ").append(totalCBRequests).append("
\n"); sb.append("Total statements: ").append(totalStatements).append("
\n"); sb.append("Last use: ").append(lastUse).append("
\n"); sb.append("Last request: ").append(lastRequest).append("
\n"); return sb.toString(); } /** * Performs cleanup */ protected void destroy() { } /** This method must be called when the obtained ConnectionBean is no longer needed, * usualy inside the finally block of a try - catch statement. * @param conn The ConnectionBean object to be disposed * @return A descriptive String, useful only for debug purposes. */ public String freeConnectionBean(ConnectionBean conn) { if(conn!=null){ try{ lastRequest=conn.getLastStatement(); totalStatements+=conn.getNumStatements(); conn.closeConnection(); } catch(Exception ex){ if(log!=null) log.println(new Date().toString() + " Unable to close DB connection: "+ex); } } return ""; } /** This is the main function that all ConnectionbeanProvider objects must * implement.

* Important: You must ever call FreeConnectionBean after the use of the ConnectionBean * object. Typical inmplementation use a try - catch - finally statement block in * order to ensure that all ConnectionBean objects will be properly disposed after * use.

* Example:

*

     * ConectionBeanProvider cbp;
     * java.util.Properties prop=new Java.util.Properties();
     * // ...
     * // ... fill-up properties with values for dbDriver, dbServer, dbLogin, etc.
     * // ...
     * cbp=ConnectionBeanProvider.getConnectionBeanProvider(map);
     * ConnectionBean cb=cbp.getConnectionBean();
     * try {
     *  // ... use of the ConnectionBean object
     * } catch(Exception ex){
     *  // ... process possible exceptions done while database access
     * } finally {
     *  // Very important: free the ConnectionBean object:
     *  cbp.freeConnectionBean(cb);
     * }
     * 
* @return A ready-to-use ConnectionBean. Remember to return it by calling * FreeConnectionBean. */ public ConnectionBean getConnectionBean() { ConnectionBean result=null; try{ if(ds!=null){ Connection con=ds.getConnection(); result=new ConnectionBean(con, mapStatements); totalCBRequests++; lastUse=new Date(); } if(log!=null && debugLevel>2) log.println(new Date().toString()+" - connection request"); } catch(Exception ex){ if(log!=null) log.println(new Date().toString() + " Unable to get DB connection: "+ex.getMessage()); } return result; } } extensions/dbconn/src/edu/xtec/util/db/PooledConnectionBeanProvider.java000066400000000000000000001002061335566474600270210ustar00rootroot00000000000000/* * File : PooledConnectionBeanProvider.java * Created : 21-oct-2003 20:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * Based on DbConnectionBeanBroker. * version 1.0.13 3/12/02 * by Marc A. Mnich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util.db; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; /** Implementation of {@link ConnectionBeanProvider} that uses a pool of * {@link edu.xtec.util.db.ConnectionBean} objects. * Based on DbConnectionBroker 1.0.13, by Marc A. Mnich * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class PooledConnectionBeanProvider extends ConnectionBeanProvider implements Runnable{ // Additional parameter names /** Key for minimum number of connections to start with. Default is 1. */ public static final String MIN_CONNS = "dbMinConns"; private static final String DEFAULT_MIN_CONNS = "1"; /** Key for maximum number of connections in dynamic pool. Default is 3 */ public static final String MAX_CONNS = "dbMaxConns"; private static final String DEFAULT_MAX_CONNS = "3"; /** Key for absolute path name for log file. e.g. 'c:/temp/mylog.log'. Default is 'pooledConnectionBean.log' in user's dir */ public static final String LOG_FILE="dbLogFile"; private static final String DEFAULT_LOG_FILE="connectionPool.log"; /** Key for time in days between connection resets. (Reset does a basic cleanup). Default is 1.0 */ public static final String MAX_CONN_TIME="dbMaxConnDays"; private static final String DEFAULT_MAX_CONN_TIME="1.0"; /** Key for append to logfile. Default is true.*/ public static final String LOG_APPEND="dbLogAppend"; private static final String DEFAULT_LOG_APPEND="true"; /** Key for max time a connection can be checked out before being recycled. Zero value turns option off. Default is 60.*/ public static final String MAX_CHECKOUT_SECONDS="dbMaxCheckoutSeconds"; private static final String DEFAULT_MAX_CHECKOUT_SECONDS="60"; /** Key for level of debug messages output to the log file. 0 -> no messages, 1 -> Errors, 2 -> Warnings, 3 -> Information. Default is 2. */ public static final String DEBUG_LEVEL="dbDebugLevel"; private static final String DEFAULT_DEBUG_LEVEL="2"; private Thread runner; private ConnectionBean[] connPool; private int[] connStatus; private long[] connLockTime, connCreateDate; private String[] connID; private String logFileString, logPIDFileString; private int currConnections, connLast, minConns, maxConns, maxConnMSec, maxCheckoutSeconds, debugLevel; //available: set to false on destroy, checked by getConnection() private boolean available=true; private PrintWriter log; private SQLWarning currSQLWarning; private String pid; /** * Number of times this ConnectionBean provider has been used since its creation. */ public int globalUsageCount; /** Main initialization function, called immediatelly after constructor by * getConnectionBeanProvider functions. * @param map Collection of key - value pairs that must specify the driver, url, login and * password of the just created ConnectionBeanProvider. * @throws Exception Throwed if dbDriver does not contain a valid driver name, or if it can't be * instantiated. */ @Override protected void setUp(Map map) throws Exception { super.setUp(map); if(dbDriver==null || dbDriver.length()==0) throw new Exception("Parameter dbDriver is null!"); Class.forName(dbDriver); if(dbServer==null || dbServer.length()==0) throw new Exception("Parameter dbServer is null!"); minConns = Math.max(1, Integer.parseInt(getValue(map, MIN_CONNS, DEFAULT_MIN_CONNS))); maxConns = Math.max(minConns, Math.min(15, Integer.parseInt(getValue(map, MAX_CONNS, DEFAULT_MAX_CONNS)))); logFileString = getValue(map, LOG_FILE, DEFAULT_LOG_FILE); double maxConnTime = new Double(getValue(map, MAX_CONN_TIME, DEFAULT_MAX_CONN_TIME)).doubleValue(); boolean logAppend = Boolean.valueOf(getValue(map, LOG_APPEND, DEFAULT_LOG_APPEND)).booleanValue(); maxCheckoutSeconds = Integer.parseInt(getValue(map, MAX_CHECKOUT_SECONDS, DEFAULT_MAX_CHECKOUT_SECONDS)); debugLevel = Integer.parseInt(getValue(map, DEBUG_LEVEL, DEFAULT_DEBUG_LEVEL)); connPool = new ConnectionBean[maxConns]; connStatus = new int[maxConns]; connLockTime = new long[maxConns]; connCreateDate = new long[maxConns]; connID = new String[maxConns]; currConnections = minConns; File f=new File(logFileString); if(!f.isAbsolute()){ f=new File(System.getProperty("user.home")); f=new File(f, logFileString); logFileString=f.getAbsolutePath(); } logPIDFileString=logFileString+".pid"; maxConnMSec = (int)(maxConnTime * 86400000.0); //86400 sec/day if(maxConnMSec < 30000) { // Recycle no less than 30 seconds. maxConnMSec = 30000; } if(debugLevel>0){ try { log = new PrintWriter(new FileOutputStream(logFileString, logAppend),true); // Can't open the requested file. Open the default file. } catch (IOException e1) { try { log = new PrintWriter(new FileOutputStream("DBConn_" + System.currentTimeMillis() + ".log", logAppend),true); } catch (IOException e2) { throw new IOException("Can't open any log file"); } } } // Write the pid file (used to clean up dead/broken connection) SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd G 'at' hh:mm:ss a zzz"); Date nowc = new Date(); pid = formatter.format(nowc); BufferedWriter pidout = new BufferedWriter(new FileWriter(logPIDFileString)); pidout.write(pid); pidout.close(); if(log!=null){ log.println("-----------------------------------------"); log.println(new Date()); log.println("Starting DbConnectionBeanBroker Version 1.0.13:"); log.println("dbDriver = " + dbDriver); log.println("dbServer = " + dbServer); log.println("dbLogin = " + dbLogin); log.println("log file = " + logFileString); log.println("minconnections = " + minConns); log.println("maxconnections = " + maxConns); log.println("Total refresh interval = " + maxConnTime + " days"); log.println("logAppend = " + logAppend); log.println("maxCheckoutSeconds = " + maxCheckoutSeconds); log.println("debugLevel = " + debugLevel); log.println("mapStatements = " + mapStatements); log.println("-----------------------------------------"); } // Initialize the pool of connections with the mininum connections: // Problems creating connections may be caused during reboot when the // servlet is started before the database is ready. Handle this // by waiting and trying again. The loop allows 5 minutes for // db reboot. boolean connectionsSucceeded=false; Exception sqlEx=null; //int dbLoop=20; int dbLoop=3; try { for(int i=1; i < dbLoop; i++) { try { for(int j=0; j < currConnections; j++) { createConn(j); } connectionsSucceeded=true; break; } catch (SQLException e){ sqlEx=e; if(log!=null && debugLevel > 0) { StringBuilder sb=new StringBuilder(); sb.append(new Date()).append(" ->Attempt (").append(i); sb.append(" of ").append(dbLoop).append(") failed to create new connections set at startup:\n"); sb.append(e).append("\n"); sb.append("Will try again in 15 seconds..."); log.println(sb.substring(0)); } try { Thread.sleep(15000); } catch(InterruptedException e1) {} } } if(!connectionsSucceeded) { // All attempts at connecting to db exhausted if(log!=null && debugLevel > 0) { log.println("\r\nAll attempts at connecting to Database exhausted"); } if(sqlEx==null) sqlEx=new IOException("Unable to connect to Database"); throw sqlEx; } } catch (Exception e) { throw e; //throw new IOException(); } // Fire up the background housekeeping thread runner = new Thread(this); runner.start(); }//End DbConnectionBeanBroker() /** * Housekeeping thread. Runs in the background with low CPU overhead. * Connections are checked for warnings and closure and are periodically * restarted. * This thread is a catchall for corrupted * connections and prevents the buildup of open cursors. (Open cursors * result when the application fails to close a Statement). * This method acts as fault tolerance for bad connection/statement programming. */ public void run() { boolean forever = true; Statement stmt=null; String currCatalog=null; long maxCheckoutMillis = maxCheckoutSeconds * 1000; while(forever) { /* * CHECK OF PID DISABLED * FileReader fr=null; BufferedReader in=null; // Make sure the log file is the one this instance opened // If not, clean it up! try { fr=new FileReader(logPIDFileString); in = new BufferedReader(fr); String curr_pid = in.readLine(); if(curr_pid.equals(pid)) { //log.println("They match = " + curr_pid); } else { //log.println("No match = " + curr_pid); if(log!=null) log.close(); // Close all connections silently - they are definitely dead. for(int i=0; i < currConnections; i++) { try { connPool[i].closeConnection(); } catch (SQLException e1) {} // ignore } // Returning from the run() method kills the thread return; } // moved to "finally" //in.close(); } catch (IOException e1) { if(log!=null){ log.print(new Date().toString() + "Can't read the file for pid info: " + logPIDFileString + " - "); log.println(e1.getMessage()); } } finally{ try{ if(in!=null) in.close(); if(fr!=null) fr.close(); in=null; fr=null; } catch(IOException ex){ // ignore exceptions on close } } */ // Get any Warnings on connections and print to event file for(int i=0; i < currConnections; i++) { try { currSQLWarning = connPool[i].getConnection().getWarnings(); if(currSQLWarning != null) { if(log!=null && debugLevel > 1) { log.println(new Date().toString()+" - Warnings on connection " + String.valueOf(i) + " " + currSQLWarning); } connPool[i].getConnection().clearWarnings(); } } catch(SQLException e) { if(log!=null && debugLevel > 1) { log.println("Cannot access Warnings: " + e); } } } for(int i=0; i < currConnections; i++) { // Do for each connection long age = System.currentTimeMillis() - connCreateDate[i]; try { // Test the connection with createStatement call synchronized(connStatus) { if(connStatus[i] > 0) { // In use, catch it next time! // Check the time it's been checked out and recycle long timeInUse = System.currentTimeMillis() - connLockTime[i]; if(log!=null && debugLevel > 2) { log.println(new Date().toString()+" - Warning. Connection " + i + " in use for " + timeInUse + " ms"); } if(maxCheckoutMillis != 0) { if(timeInUse > maxCheckoutMillis) { if(log!=null && debugLevel > 1) { log.println(new Date().toString()+" Warning. Connection " + i + " failed to be returned in time. Recycling..."); } throw new SQLException(); } } continue; } connStatus[i] = 2; // Take offline (2 indicates housekeeping lock) } if(age > maxConnMSec) { // Force a reset at the max conn time throw new SQLException(); } stmt = connPool[i].getConnection().createStatement(); connStatus[i] = 0; // Connection is O.K. //log.println("Connection confirmed for conn = " + // String.valueOf(i)); // Some DBs return an object even if DB is shut down if(connPool[i].getConnection().isClosed()) { throw new SQLException(); } // Connection has a problem, restart it } catch(SQLException e) { if(log!=null && debugLevel > 1) { log.println(new Date().toString() + " ***** Recycling connection " + String.valueOf(i) + ":"); } try { connPool[i].closeConnection(); } catch(SQLException e0) { if(log!=null && debugLevel > 0) { log.println(new Date().toString()+" - Error! Can't close connection! Might have been closed already. Trying to recycle anyway... (" + e0 + ")"); } } try { createConn(i); } catch(SQLException e1) { if(log!=null && debugLevel > 0) { log.println(new Date().toString()+" - Failed to create connection: " + e1); } connStatus[i] = 0; // Can't open, try again next time } } finally { try{ if(stmt != null) { stmt.close(); } } catch(SQLException e1){ System.err.println(e1.getMessage()); } } } try { Thread.sleep(20000); // Wait 20 seconds for next cycle } catch(InterruptedException e) { // Returning from the run method sets the internal // flag referenced by Thread.isAlive() to false. // This is required because we don't use stop() to // shutdown this thread. return; } } } // End run /** This method hands out the connections in round-robin order. * This prevents a faulty connection from locking * up an application entirely. A browser 'refresh' will * get the next connection while the faulty * connection is cleaned up by the housekeeping thread. * * If the min number of threads are ever exhausted, new * threads are added up the the max thread count. * Finally, if all threads are in use, this method waits * 2 seconds and tries again, up to ten times. After that, it * returns a null. * @return The ConnectionBean object, ready to be used. Remember to free it using * freeConnectionBean, as explained in {@link * ConnectionBeanProvider#freeConnectionBean} ConnectionBeanProvider. */ public ConnectionBean getConnectionBean() { ConnectionBean conn=null; if(available){ boolean gotOne = false; for(int outerloop=1; outerloop<=10; outerloop++) { try { int loop=0; int roundRobin = connLast + 1; if(roundRobin >= currConnections) roundRobin=0; do { synchronized(connStatus) { if((connStatus[roundRobin] < 1) && (!connPool[roundRobin].getConnection().isClosed())) { conn = connPool[roundRobin]; connStatus[roundRobin]=1; connLockTime[roundRobin] = System.currentTimeMillis(); connLast = roundRobin; gotOne = true; break; } else { loop++; roundRobin++; if(roundRobin >= currConnections) roundRobin=0; } } } while((gotOne==false)&&(loop < currConnections)); } catch (SQLException e1) { if(log!=null) log.println(new Date().toString()+" - Error: " + e1); } if(gotOne) { break; } else { synchronized(this) { // Add new connections to the pool if(currConnections < maxConns) { try { createConn(currConnections); currConnections++; } catch(SQLException e) { if(log!=null && debugLevel > 0) { log.println(new Date().toString()+" - Error: Unable to create new connection: " + e); } } } } try { Thread.sleep(2000); } catch(InterruptedException e) { } if(log!=null && debugLevel > 0) { log.println(new Date().toString()+" --> Connections Exhausted! Will wait and try again in loop " + String.valueOf(outerloop)); } } } // End of try 10 times loop } else { if(log!=null && debugLevel > 0) { log.println(new Date().toString()+" - Unsuccessful getConnection() request during destroy()"); } } // End if(available) if(log!=null && debugLevel > 2) { log.println(new Date().toString()+" - Handing out connection " + idOfConnection(conn)); } if(conn!=null) conn.usageCount++; return conn; } /** Returns the local JDBC ID for a connection. * @param conn The ConnectionBean owner if the Connection. * @return The JDBC ID. */ public int idOfConnection(ConnectionBean conn) { int match; String tag; try { tag = conn.getConnection().toString(); } catch (NullPointerException e1) { tag = "none"; } match=-1; for(int i=0; i< currConnections; i++) { if(connID[i].equals(tag)) { match = i; break; } } return match; } /** Frees a connection. Replaces connection back into the main pool for * reuse. * @param conn The ConnectionBean to be released. * @return A String useful only for debug purposes. */ public String freeConnectionBean(ConnectionBean conn) { StringBuilder res=new StringBuilder(); int thisconn = idOfConnection(conn); if(thisconn >= 0) { connStatus[thisconn]=0; res.append("freed ").append(conn.getConnection().toString()); //log.println("Freed connection " + String.valueOf(thisconn) + // " normal exit: "); } else { if(log!=null && debugLevel > 0) { log.println(new Date().toString()+" --> Error: Could not free connection!!!"); } } return res.substring(0); } /** Returns the age of a connection -- the time since it was handed out to * an application. * @param conn The ConnectionBean to be examined. * @return The age of the Connection, measured in milliseconds. */ public long getAge(ConnectionBean conn) { // Returns the age of the connection in millisec. int thisconn = idOfConnection(conn); return System.currentTimeMillis() - connLockTime[thisconn]; } private void createConn(int i) throws SQLException { if(connPool[i]!=null){ globalUsageCount+=connPool[i].usageCount; } Date now = new Date(); try { Class.forName(dbDriver); connPool[i] = new ConnectionBean(DriverManager.getConnection (dbServer,dbLogin,dbPassword), mapStatements); connStatus[i]=0; connID[i]=connPool[i].getConnection().toString(); connLockTime[i]=0; connCreateDate[i] = now.getTime(); } catch (ClassNotFoundException e2) { if(log!=null && debugLevel > 0) { log.println(now.toString()+" - Error creating connection: " + e2); } } if(log!=null) log.println(now.toString() + " Opening connection " + String.valueOf(i) + " " + connPool[i].getConnection().toString() + ":"); } /** * Shuts down the housekeeping thread and closes all connections * in the pool. Call this method from the destroy() method of the servlet. */ /** * Multi-phase shutdown. having following sequence: *
    *
  1. getConnection() will refuse to return connections. *
  2. The housekeeping thread is shut down.
    * Up to the time of millis milliseconds after shutdown of * the housekeeping thread, freeConnection() can still be * called to return used connections. *
  3. After millis milliseconds after the shutdown of the * housekeeping thread, all connections in the pool are closed. *
  4. If any connections were in use while being closed then a * SQLException is thrown. *
  5. The log is closed. *

* Call this method from a servlet destroy() method. * * @param millis the time to wait in milliseconds. * @exception SQLException if connections were in use after * millis. */ public void destroy(int millis) throws SQLException { // Checking for invalid negative arguments is not necessary, // Thread.join() does this already in runner.join(). // Stop issuing connections available=false; // Shut down the background housekeeping thread runner.interrupt(); // Wait until the housekeeping thread has died. try { runner.join(millis); } catch(InterruptedException e){} // ignore // The housekeeping thread could still be running // (e.g. if millis is too small). This case is ignored. // At worst, this method will throw an exception with the // clear indication that the timeout was too short. long startTime=System.currentTimeMillis(); // Wait for freeConnection() to return any connections // that are still used at this time. int useCount; while((useCount=getUseCount())>0 && System.currentTimeMillis() - startTime <= millis) { try { Thread.sleep(500); } catch(InterruptedException e) {} // ignore } // Close all connections, whether safe or not for(int i=0; i < currConnections; i++) { try { connPool[i].closeConnection(); } catch (SQLException e1) { if(log!=null && debugLevel > 0) { log.println(new Date().toString()+" - Cannot close connections on Destroy"); } } } if(useCount > 0) { //bt-test successful String msg=new Date().toString()+" - Unsafe shutdown: Had to close "+useCount+ " active DB connections after "+millis+"ms"; if(log!=null){ log.println(msg); // Close all open files log.close(); } // Throwing following Exception is essential because servlet authors // are likely to have their own error logging requirements. throw new SQLException(msg); } // Close all open files if(log!=null) log.close(); }//End destroy() /** * Less safe shutdown. Uses default timeout value. * This method simply calls the destroy() method * with a millis * value of 10000 (10 seconds) and ignores SQLException * thrown by that method. * @see #destroy(int) */ protected void destroy() { try { destroy(10000); } catch(SQLException e) {} } /** Returns the number of connections in use. * @return The nomber of ConnectionBean objects in use. */ // This method could be reduced to return a counter that is // maintained by all methods that update connStatus. // However, it is more efficient to do it this way because: // Updating the counter would put an additional burden on the most // frequently used methods; in comparison, this method is // rarely used (although essential). public int getUseCount() { int useCount=0; synchronized(connStatus) { for(int i=0; i < currConnections; i++) { if(connStatus[i] > 0) { // In use useCount++; } } } return useCount; } /** Returns the number of connections in the dynamic pool. * @return The number of ConnectionBean objects created. */ public int getSize() { return currConnections; } /** Provides information about the current state of this ConnectionBeanProvider. * @return Information string, formatted in HTML. */ @Override public String getInfo(){ int totalUsageCount=globalUsageCount; StringBuilder sb=new StringBuilder(); sb.append("PooledConnectionBeanProvider ").append(hashCode()).append("
\n") .append(super.getInfo()) .append("PID: ").append(pid).append("
\n") .append("LogFileString: ").append(logFileString).append("
\n") .append("currConnections: ").append(currConnections).append("
\n") .append("connLast: ").append(connLast).append("
\n") .append("minConns: ").append(minConns).append("
\n") .append("maxConns: ").append(maxConns).append("
\n") .append("maxConnMSec: ").append(maxConnMSec).append("
\n") .append("maxCheckoutSeconds: ").append(maxCheckoutSeconds).append("
\n") .append("debugLevel: ").append(debugLevel).append("
\n") .append("CURRENT CONNECTIONS:
\n") .append("
\n"); for(int i=0; i\n"); else{ sb.append("Id: ").append(connID[i]).append("
\n") .append("Status: ").append(connStatus[i]).append("
\n") .append("LockTime: ").append(connLockTime[i]).append("
\n") .append("CreateDate: ").append(new Date(connCreateDate[i])).append("
\n") .append("------------\n") .append(cb.getInfo()); totalUsageCount+=cb.usageCount; } sb.append("
\n"); } sb.append("TOTAL STATEMENTS USED: ").append(totalUsageCount).append("
\n"); return sb.substring(0); } } extensions/dbconn/src/edu/xtec/util/db/SingleConnectionBeanProvider.java000066400000000000000000000073361335566474600270320ustar00rootroot00000000000000/* * File : SingleConnectionBeanProvider.java * Created : 21-oct-2003 19:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util.db; import java.sql.Connection; import java.sql.DriverManager; import java.util.Map; /** A single ConnectionBeanProvider, that uses only one single connection to the * database, in a single ConnectionBean. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class SingleConnectionBeanProvider extends ConnectionBeanProvider{ private Connection con; private ConnectionBean conBean; /** Main initialization function, called immediatelly after constructor by * getConnectionBeanProvider functions. * @param map Collection of key - value pairs that must specify the driver, url, login and * password of the just created ConnectionBeanProvider. * @throws Exception Throwed if dbDriver does not contain a valid driver name, or if it can't be * instantiated. */ @Override protected void setUp(Map map) throws Exception{ super.setUp(map); if(dbDriver==null || dbDriver.length()==0) throw new Exception("Parameter dbDriver is null!"); Class.forName(dbDriver); if(dbServer==null || dbServer.length()==0) throw new Exception("Parameter dbServer is null!"); if(dbLogin!=null && dbLogin.length()>0){ con=DriverManager.getConnection(dbServer, dbLogin, dbPassword==null ? "":dbPassword); } else{ con=DriverManager.getConnection(dbServer); } conBean=new ConnectionBean(con, mapStatements); } /** Closes the jdbc connection and frees the unique ConnectionBean. */ protected void destroy() { if(conBean!=null) conBean=null; if(con!=null){ try{ con.close(); } catch(Exception ex){ } con=null; } } /** Provides information about the current state of this ConnectionBeanProvider. * @return Information string, formatted in HTML. */ @Override public String getInfo(){ StringBuilder sb=new StringBuilder(); sb.append("SingleConnectionBeanProvider ").append(hashCode()).append("
\n") .append(super.getInfo()) .append(conBean.getInfo()); return sb.toString(); } /** This method does nothing in this implementation of ConnectionBeanProvider, * because only one ConnectionBean is reused for all getConnectionBean * calls. * @param conn The Connectionbean to be released. * @return A zero-length string. */ public String freeConnectionBean(ConnectionBean conn) { // Do nothing return ""; } /** Returns the ConnectionBean object. * @return The ConnectionBean object. */ public ConnectionBean getConnectionBean() { return conBean; } } extensions/img/000077500000000000000000000000001335566474600140545ustar00rootroot00000000000000extensions/img/image4j/000077500000000000000000000000001335566474600153745ustar00rootroot00000000000000extensions/img/image4j/build.xml000066400000000000000000000024401335566474600172150ustar00rootroot00000000000000 extensions/img/image4j/license.txt000066400000000000000000000447401335566474600175700ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS extensions/img/image4j/src/000077500000000000000000000000001335566474600161635ustar00rootroot00000000000000extensions/img/image4j/src/net/000077500000000000000000000000001335566474600167515ustar00rootroot00000000000000extensions/img/image4j/src/net/sf/000077500000000000000000000000001335566474600173615ustar00rootroot00000000000000extensions/img/image4j/src/net/sf/image4j/000077500000000000000000000000001335566474600207015ustar00rootroot00000000000000extensions/img/image4j/src/net/sf/image4j/codec/000077500000000000000000000000001335566474600217565ustar00rootroot00000000000000extensions/img/image4j/src/net/sf/image4j/codec/bmp/000077500000000000000000000000001335566474600225345ustar00rootroot00000000000000extensions/img/image4j/src/net/sf/image4j/codec/bmp/BMPConstants.java000066400000000000000000000016761335566474600257240ustar00rootroot00000000000000/* * BMPConstants.java * * Created on 10 May 2006, 08:17 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.codec.bmp; /** * Provides constants used with BMP format. * @author Ian McDonagh */ public class BMPConstants { private BMPConstants() { } /** * The signature for the BMP format header "BM". */ public static final String FILE_HEADER = "BM"; /** * Specifies no compression. * @see InfoHeader#iCompression InfoHeader */ public static final int BI_RGB = 0; //no compression /** * Specifies 8-bit RLE compression. * @see InfoHeader#iCompression InfoHeader */ public static final int BI_RLE8 = 1; //8bit RLE compression /** * Specifies 4-bit RLE compression. * @see InfoHeader#iCompression InfoHeader */ public static final int BI_RLE4 = 2; //4bit RLE compression } extensions/img/image4j/src/net/sf/image4j/codec/bmp/BMPDecoder.java000066400000000000000000000457131335566474600253150ustar00rootroot00000000000000/* * Decodes a BMP image from an InputStream to a BufferedImage * * @author Ian McDonagh */ package net.sf.image4j.codec.bmp; import java.awt.image.BufferedImage; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import java.io.IOException; /** * Decodes images in BMP format. * @author Ian McDonagh */ public class BMPDecoder { private BufferedImage img; private InfoHeader infoHeader; /** Creates a new instance of BMPDecoder and reads the BMP data from the source. * @param in the source InputStream from which to read the BMP data * @throws java.io.IOException if an error occurs */ public BMPDecoder(java.io.InputStream in) throws IOException { net.sf.image4j.io.LittleEndianInputStream lis = new net.sf.image4j.io.LittleEndianInputStream(in); /* header [14] */ //signature "BM" [2] byte[] bsignature = new byte[2]; lis.read(bsignature); String signature = new String(bsignature, "UTF-8"); if (!signature.equals("BM")) { throw new IOException("Invalid signature '"+signature+"' for BMP format"); } //file size [4] int fileSize = lis.readIntLE(); //reserved = 0 [4] int reserved = lis.readIntLE(); //DataOffset [4] file offset to raster data int dataOffset = lis.readIntLE(); /* info header [40] */ infoHeader = readInfoHeader(lis); /* Color table and Raster data */ img = read(infoHeader, lis); } /** * Retrieves a bit from the lowest order byte of the given integer. * @param bits the source integer, treated as an unsigned byte * @param index the index of the bit to retrieve, which must be in the range 0..7. * @return the bit at the specified index, which will be either 0 or 1. */ private static int getBit(int bits, int index) { return (bits >> (7 - index)) & 1; } /** * Retrieves a nibble (4 bits) from the lowest order byte of the given integer. * @param nibbles the source integer, treated as an unsigned byte * @param index the index of the nibble to retrieve, which must be in the range 0..1. * @return the nibble at the specified index, as an unsigned byte. */ private static int getNibble(int nibbles, int index) { return (nibbles >> (4 * (1 - index))) & 0xF; } /** * The InfoHeader structure, which provides information about the BMP data. * @return the InfoHeader structure that was read from the source data when this BMPDecoder * was created. */ public InfoHeader getInfoHeader() { return infoHeader; } /** * The decoded image read from the source input. * @return the BufferedImage representing the BMP image. */ public BufferedImage getBufferedImage() { return img; } private static void getColorTable(ColorEntry[] colorTable, byte[] ar, byte[] ag, byte[] ab) { for (int i = 0; i < colorTable.length; i++) { ar[i] = (byte) colorTable[i].bRed; ag[i] = (byte) colorTable[i].bGreen; ab[i] = (byte) colorTable[i].bBlue; } } /** * Reads the BMP info header structure from the given InputStream. * @param lis the InputStream to read * @return the InfoHeader structure * @throws java.io.IOException if an error occurred */ public static InfoHeader readInfoHeader(net.sf.image4j.io.LittleEndianInputStream lis) throws IOException { InfoHeader infoHeader = new InfoHeader(lis); return infoHeader; } /** * @since 0.6 */ public static InfoHeader readInfoHeader(net.sf.image4j.io.LittleEndianInputStream lis, int infoSize) throws IOException { InfoHeader infoHeader = new InfoHeader(lis, infoSize); return infoHeader; } /** * Reads the BMP data from the given InputStream using the information * contained in the InfoHeader. * @param lis the source input * @param infoHeader an InfoHeader that was read by a call to * {@link #readInfoHeader(net.sf.image4j.io.LittleEndianInputStream) readInfoHeader()}. * @return the decoded image read from the source input * @throws java.io.IOException if an error occurs */ public static BufferedImage read(InfoHeader infoHeader, net.sf.image4j.io.LittleEndianInputStream lis) throws IOException { BufferedImage img; /* Color table (palette) */ ColorEntry[] colorTable = null; //color table is only present for 1, 4 or 8 bit (indexed) images if (infoHeader.sBitCount <= 8) { colorTable = readColorTable(infoHeader, lis); } img = read(infoHeader, lis, colorTable); return img; } /** * Reads the BMP data from the given InputStream using the information * contained in the InfoHeader. * @param colorTable ColorEntry array containing palette * @param infoHeader an InfoHeader that was read by a call to * {@link #readInfoHeader(net.sf.image4j.io.LittleEndianInputStream) readInfoHeader()}. * @param lis the source input * @return the decoded image read from the source input * @throws java.io.IOException if any error occurs */ public static BufferedImage read(InfoHeader infoHeader, net.sf.image4j.io.LittleEndianInputStream lis, ColorEntry[] colorTable) throws IOException { BufferedImage img = null; //1-bit (monochrome) uncompressed if (infoHeader.sBitCount == 1 && infoHeader.iCompression == BMPConstants.BI_RGB) { img = read1(infoHeader, lis, colorTable); } //4-bit uncompressed else if (infoHeader.sBitCount == 4 && infoHeader.iCompression == BMPConstants.BI_RGB) { img = read4(infoHeader, lis, colorTable); } //8-bit uncompressed else if (infoHeader.sBitCount == 8 && infoHeader.iCompression == BMPConstants.BI_RGB) { img = read8(infoHeader, lis, colorTable); } //24-bit uncompressed else if (infoHeader.sBitCount == 24 && infoHeader.iCompression == BMPConstants.BI_RGB) { img = read24(infoHeader, lis); } //32bit uncompressed else if (infoHeader.sBitCount == 32 && infoHeader.iCompression == BMPConstants.BI_RGB) { img = read32(infoHeader, lis); } else { throw new IOException("Unrecognized bitmap format: bit count="+infoHeader.sBitCount+", compression="+ infoHeader.iCompression); } return img; } /** * Reads the ColorEntry table from the given InputStream using * the information contained in the given infoHeader. * @param infoHeader the InfoHeader structure, which was read using * {@link #readInfoHeader(net.sf.image4j.io.LittleEndianInputStream) readInfoHeader()} * @param lis the InputStream to read * @throws java.io.IOException if an error occurs * @return the decoded image read from the source input */ public static ColorEntry[] readColorTable(InfoHeader infoHeader, net.sf.image4j.io.LittleEndianInputStream lis) throws IOException { ColorEntry[] colorTable = new ColorEntry[infoHeader.iNumColors]; for (int i = 0; i < infoHeader.iNumColors; i++) { ColorEntry ce = new ColorEntry(lis); colorTable[i] = ce; } return colorTable; } /** * Reads 1-bit uncompressed bitmap raster data, which may be monochrome depending on the * palette entries in colorTable. * @param infoHeader the InfoHeader structure, which was read using * {@link #readInfoHeader(net.sf.image4j.io.LittleEndianInputStream) readInfoHeader()} * @param lis the source input * @param colorTable ColorEntry array specifying the palette, which * must not be null. * @throws java.io.IOException if an error occurs * @return the decoded image read from the source input */ public static BufferedImage read1(InfoHeader infoHeader, net.sf.image4j.io.LittleEndianInputStream lis, ColorEntry[] colorTable) throws IOException { //1 bit per pixel or 8 pixels per byte //each pixel specifies the palette index byte[] ar = new byte[colorTable.length]; byte[] ag = new byte[colorTable.length]; byte[] ab = new byte[colorTable.length]; getColorTable(colorTable, ar, ag, ab); IndexColorModel icm = new IndexColorModel( 1, 2, ar, ag, ab ); // Create indexed image BufferedImage img = new BufferedImage( infoHeader.iWidth, infoHeader.iHeight, BufferedImage.TYPE_BYTE_BINARY, icm ); // We'll use the raster to set samples instead of RGB values. // The SampleModel of an indexed image interprets samples as // the index of the colour for a pixel, which is perfect for use here. WritableRaster raster = img.getRaster(); //padding int dataBitsPerLine = infoHeader.iWidth; int bitsPerLine = dataBitsPerLine; if (bitsPerLine % 32 != 0) { bitsPerLine = (bitsPerLine / 32 + 1) * 32; } int padBits = bitsPerLine - dataBitsPerLine; int padBytes = padBits / 8; int bytesPerLine = (int) (bitsPerLine / 8); int[] line = new int[bytesPerLine]; for (int y = infoHeader.iHeight - 1; y >= 0; y--) { for (int i = 0; i < bytesPerLine; i++) { line[i] = lis.readUnsignedByte(); } for (int x = 0; x < infoHeader.iWidth; x++) { int i = x / 8; int v = line[i]; int b = x % 8; int index = getBit(v, b); //int rgb = c[index]; //img.setRGB(x, y, rgb); //set the sample (colour index) for the pixel raster.setSample(x, y, 0, index); } } return img; } /** * Reads 4-bit uncompressed bitmap raster data, which is interpreted based on the colours * specified in the palette. * @param infoHeader the InfoHeader structure, which was read using * {@link #readInfoHeader(net.sf.image4j.io.LittleEndianInputStream) readInfoHeader()} * @param lis the source input * @param colorTable ColorEntry array specifying the palette, which * must not be null. * @throws java.io.IOException if an error occurs * @return the decoded image read from the source input */ public static BufferedImage read4(InfoHeader infoHeader, net.sf.image4j.io.LittleEndianInputStream lis, ColorEntry[] colorTable) throws IOException { //2 pixels per byte or 4 bits per pixel //colour for each pixel specified by the color index in the pallette byte[] ar = new byte[colorTable.length]; byte[] ag = new byte[colorTable.length]; byte[] ab = new byte[colorTable.length]; getColorTable(colorTable, ar, ag, ab); IndexColorModel icm = new IndexColorModel( 4, infoHeader.iNumColors, ar, ag, ab ); BufferedImage img = new BufferedImage( infoHeader.iWidth, infoHeader.iHeight, BufferedImage.TYPE_BYTE_BINARY, icm ); WritableRaster raster = img.getRaster(); //padding int bitsPerLine = infoHeader.iWidth * 4; if (bitsPerLine % 32 != 0) { bitsPerLine = (bitsPerLine / 32 + 1) * 32; } int bytesPerLine = (int) (bitsPerLine / 8); int[] line = new int[bytesPerLine]; for (int y = infoHeader.iHeight - 1; y >= 0; y--) { //scan line for (int i = 0; i < bytesPerLine; i++) { int b = lis.readUnsignedByte(); line[i] = b; } //get pixels for (int x = 0; x < infoHeader.iWidth; x++) { //get byte index for line int b = x / 2; // 2 pixels per byte int i = x % 2; int n = line[b]; int index = getNibble(n, i); raster.setSample(x, y, 0, index); } } return img; } /** * Reads 8-bit uncompressed bitmap raster data, which is interpreted based on the colours * specified in the palette. * @param infoHeader the InfoHeader structure, which was read using * {@link #readInfoHeader(net.sf.image4j.io.LittleEndianInputStream) readInfoHeader()} * @param lis the source input * @param colorTable ColorEntry array specifying the palette, which * must not be null. * @throws java.io.IOException if an error occurs * @return the decoded image read from the source input */ public static BufferedImage read8(InfoHeader infoHeader, net.sf.image4j.io.LittleEndianInputStream lis, ColorEntry[] colorTable) throws IOException { //1 byte per pixel // color index 1 (index of color in palette) //lines padded to nearest 32bits //no alpha byte[] ar = new byte[colorTable.length]; byte[] ag = new byte[colorTable.length]; byte[] ab = new byte[colorTable.length]; getColorTable(colorTable, ar, ag, ab); IndexColorModel icm = new IndexColorModel( 8, infoHeader.iNumColors, ar, ag, ab ); BufferedImage img = new BufferedImage( infoHeader.iWidth, infoHeader.iHeight, BufferedImage.TYPE_BYTE_INDEXED, icm ); WritableRaster raster = img.getRaster(); /* //create color pallette int[] c = new int[infoHeader.iNumColors]; for (int i = 0; i < c.length; i++) { int r = colorTable[i].bRed; int g = colorTable[i].bGreen; int b = colorTable[i].bBlue; c[i] = (r << 16) | (g << 8) | (b); } */ //padding int dataPerLine = infoHeader.iWidth; int bytesPerLine = dataPerLine; if (bytesPerLine % 4 != 0) { bytesPerLine = (bytesPerLine / 4 + 1) * 4; } int padBytesPerLine = bytesPerLine - dataPerLine; for (int y = infoHeader.iHeight - 1; y >= 0; y--) { for (int x = 0; x < infoHeader.iWidth; x++) { int b = lis.readUnsignedByte(); //int clr = c[b]; //img.setRGB(x, y, clr); //set sample (colour index) for pixel raster.setSample(x, y , 0, b); } lis.skipBytes(padBytesPerLine); } return img; } /** * Reads 24-bit uncompressed bitmap raster data. * @param lis the source input * @param infoHeader the InfoHeader structure, which was read using * {@link #readInfoHeader(net.sf.image4j.io.LittleEndianInputStream) readInfoHeader()} * @throws java.io.IOException if an error occurs * @return the decoded image read from the source input */ public static BufferedImage read24(InfoHeader infoHeader, net.sf.image4j.io.LittleEndianInputStream lis) throws IOException { //3 bytes per pixel // blue 1 // green 1 // red 1 // lines padded to nearest 32 bits // no alpha BufferedImage img = new BufferedImage( infoHeader.iWidth, infoHeader.iHeight, BufferedImage.TYPE_INT_RGB ); WritableRaster raster = img.getRaster(); //padding to nearest 32 bits int dataPerLine = infoHeader.iWidth * 3; int bytesPerLine = dataPerLine; if (bytesPerLine % 4 != 0) { bytesPerLine = (bytesPerLine / 4 + 1) * 4; } int padBytesPerLine = bytesPerLine - dataPerLine; for (int y = infoHeader.iHeight - 1; y >= 0; y--) { for (int x = 0; x < infoHeader.iWidth; x++) { int b = lis.readUnsignedByte(); int g = lis.readUnsignedByte(); int r = lis.readUnsignedByte(); //int c = 0x00000000 | (r << 16) | (g << 8) | (b); //System.out.println(x + ","+y+"="+Integer.toHexString(c)); //img.setRGB(x, y, c); raster.setSample(x, y, 0, r); raster.setSample(x, y, 1, g); raster.setSample(x, y, 2, b); } lis.skipBytes(padBytesPerLine); } return img; } /** * Reads 32-bit uncompressed bitmap raster data, with transparency. * @param lis the source input * @param infoHeader the InfoHeader structure, which was read using * {@link #readInfoHeader(net.sf.image4j.io.LittleEndianInputStream) readInfoHeader()} * @throws java.io.IOException if an error occurs * @return the decoded image read from the source input */ public static BufferedImage read32(InfoHeader infoHeader, net.sf.image4j.io.LittleEndianInputStream lis) throws IOException { //4 bytes per pixel // blue 1 // green 1 // red 1 // alpha 1 //No padding since each pixel = 32 bits BufferedImage img = new BufferedImage( infoHeader.iWidth, infoHeader.iHeight, BufferedImage.TYPE_INT_ARGB ); WritableRaster rgb = img.getRaster(); WritableRaster alpha = img.getAlphaRaster(); for (int y = infoHeader.iHeight - 1; y >= 0; y--) { for (int x = 0; x < infoHeader.iWidth; x++) { int b = lis.readUnsignedByte(); int g = lis.readUnsignedByte(); int r = lis.readUnsignedByte(); int a = lis.readUnsignedByte(); rgb.setSample(x, y, 0, r); rgb.setSample(x, y, 1, g); rgb.setSample(x, y, 2, b); alpha.setSample(x, y, 0, a); } } return img; } /** * Reads and decodes BMP data from the source file. * @param file the source file * @throws java.io.IOException if an error occurs * @return the decoded image read from the source file */ public static BufferedImage read(java.io.File file) throws IOException { return read(new java.io.FileInputStream(file)); } /** * Reads and decodes BMP data from the source input. * @param in the source input * @throws java.io.IOException if an error occurs * @return the decoded image read from the source file */ public static BufferedImage read(java.io.InputStream in) throws IOException { BMPDecoder d = new BMPDecoder(in); return d.getBufferedImage(); } /** * Reads and decodes BMP data from the source file, together with metadata. * @param file the source file * @throws java.io.IOException if an error occurs * @return the decoded image read from the source file * @since 0.7 */ public static BMPImage readExt(java.io.File file) throws IOException { return readExt(new java.io.FileInputStream(file)); } /** * Reads and decodes BMP data from the source input, together with metadata. * @param in the source input * @throws java.io.IOException if an error occurs * @return the decoded image read from the source file * @since 0.7 */ public static BMPImage readExt(java.io.InputStream in) throws IOException { BMPDecoder d = new BMPDecoder(in); BMPImage ret = new BMPImage(d.getBufferedImage(), d.getInfoHeader()); return ret; } } extensions/img/image4j/src/net/sf/image4j/codec/bmp/BMPEncoder.java000066400000000000000000000356311335566474600253250ustar00rootroot00000000000000/* * BMPEncoder.java * * Created on 11 May 2006, 04:19 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.codec.bmp; import java.awt.image.BufferedImage; import java.awt.image.IndexColorModel; import java.awt.image.Raster; import java.io.IOException; import net.sf.image4j.io.LittleEndianOutputStream; /** * Encodes images in BMP format. * @author Ian McDonagh */ public class BMPEncoder { /** Creates a new instance of BMPEncoder */ private BMPEncoder() { } /** * Encodes and writes BMP data the output file * @param img the image to encode * @param file the file to which encoded data will be written * @throws java.io.IOException if an error occurs */ public static void write(BufferedImage img, java.io.File file) throws IOException { write(img, new java.io.FileOutputStream(file)); } /** * Encodes and writes BMP data to the output * @param img the image to encode * @param os the output to which encoded data will be written * @throws java.io.IOException if an error occurs */ public static void write(BufferedImage img, java.io.OutputStream os) throws IOException { // create info header InfoHeader ih = createInfoHeader(img); // Create colour map if the image uses an indexed colour model. // Images with colour depth of 8 bits or less use an indexed colour model. int mapSize = 0; IndexColorModel icm = null; if (ih.sBitCount <= 8) { icm = (IndexColorModel) img.getColorModel(); mapSize = icm.getMapSize(); } // Calculate header size int headerSize = 14 //file header + ih.iSize //info header ; // Calculate map size int mapBytes = 4 * mapSize; // Calculate data offset int dataOffset = headerSize + mapBytes; // Calculate bytes per line int bytesPerLine = 0; switch (ih.sBitCount) { case 1: bytesPerLine = getBytesPerLine1(ih.iWidth); break; case 4: bytesPerLine = getBytesPerLine4(ih.iWidth); break; case 8: bytesPerLine = getBytesPerLine8(ih.iWidth); break; case 24: bytesPerLine = getBytesPerLine24(ih.iWidth); break; case 32: bytesPerLine = ih.iWidth * 4; break; } // calculate file size int fileSize = dataOffset + bytesPerLine * ih.iHeight; // output little endian byte order LittleEndianOutputStream out = new LittleEndianOutputStream(os); //write file header writeFileHeader(fileSize, dataOffset, out); //write info header ih.write(out); //write color map (bit count <= 8) if (ih.sBitCount <= 8) { writeColorMap(icm, out); } //write raster data switch (ih.sBitCount) { case 1: write1(img.getRaster(), out); break; case 4: write4(img.getRaster(), out); break; case 8: write8(img.getRaster(), out); break; case 24: write24(img.getRaster(), out); break; case 32: write32(img.getRaster(), img.getAlphaRaster(), out); break; } } /** * Creates an InfoHeader from the source image. * @param img the source image * @return the resultant InfoHeader structure */ public static InfoHeader createInfoHeader(BufferedImage img) { InfoHeader ret = new InfoHeader(); ret.iColorsImportant = 0; ret.iColorsUsed = 0; ret.iCompression = 0; ret.iHeight = img.getHeight(); ret.iWidth = img.getWidth(); ret.sBitCount = (short) img.getColorModel().getPixelSize(); ret.iNumColors = 1 << (ret.sBitCount == 32 ? 24 : ret.sBitCount); ret.iImageSize = 0; return ret; } /** * Writes the file header. * @param fileSize the calculated file size for the BMP data being written * @param dataOffset the calculated offset within the BMP data where the actual bitmap begins * @param out the output to which the file header will be written * @throws java.io.IOException if an error occurs */ public static void writeFileHeader(int fileSize, int dataOffset, net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { //signature byte[] signature = BMPConstants.FILE_HEADER.getBytes("UTF-8"); out.write(signature); //file size out.writeIntLE(fileSize); //reserved out.writeIntLE(0); //data offset out.writeIntLE(dataOffset); } /** * Writes the colour map resulting from the source IndexColorModel. * @param icm the source IndexColorModel * @param out the output to which the colour map will be written * @throws java.io.IOException if an error occurs */ public static void writeColorMap(IndexColorModel icm, net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { int mapSize = icm.getMapSize(); for (int i = 0; i < mapSize; i++) { int rgb = icm.getRGB(i); int r = (rgb >> 16) & 0xFF; int g = (rgb >> 8) & 0xFF; int b = (rgb) &0xFF; out.writeByte(b); out.writeByte(g); out.writeByte(r); out.writeByte(0); } } /** * Calculates the number of bytes per line required for the given width in pixels, * for a 1-bit bitmap. Lines are always padded to the next 4-byte boundary. * @param width the width in pixels * @return the number of bytes per line */ public static int getBytesPerLine1(int width) { int ret = (int) width / 8; if (ret % 4 != 0) { ret = (ret / 4 + 1) * 4; } return ret; } /** * Calculates the number of bytes per line required for the given with in pixels, * for a 4-bit bitmap. Lines are always padded to the next 4-byte boundary. * @param width the width in pixels * @return the number of bytes per line */ public static int getBytesPerLine4(int width) { int ret = (int) width / 2; if (ret % 4 != 0) { ret = (ret / 4 + 1) * 4; } return ret; } /** * Calculates the number of bytes per line required for the given with in pixels, * for a 8-bit bitmap. Lines are always padded to the next 4-byte boundary. * @param width the width in pixels * @return the number of bytes per line */ public static int getBytesPerLine8(int width) { int ret = width; if (ret % 4 != 0) { ret = (ret / 4 + 1) * 4; } return ret; } /** * Calculates the number of bytes per line required for the given with in pixels, * for a 24-bit bitmap. Lines are always padded to the next 4-byte boundary. * @param width the width in pixels * @return the number of bytes per line */ public static int getBytesPerLine24(int width) { int ret = width * 3; if (ret % 4 != 0) { ret = (ret / 4 + 1) * 4; } return ret; } /** * Calculates the size in bytes of a bitmap with the specified size and colour depth. * @param w the width in pixels * @param h the height in pixels * @param bpp the colour depth (bits per pixel) * @return the size of the bitmap in bytes */ public static int getBitmapSize(int w, int h, int bpp) { int bytesPerLine = 0; switch (bpp) { case 1: bytesPerLine = getBytesPerLine1(w); break; case 4: bytesPerLine = getBytesPerLine4(w); break; case 8: bytesPerLine = getBytesPerLine8(w); break; case 24: bytesPerLine = getBytesPerLine24(w); break; case 32: bytesPerLine = w * 4; break; } int ret = bytesPerLine * h; return ret; } /** * Encodes and writes raster data as a 1-bit bitmap. * @param raster the source raster data * @param out the output to which the bitmap will be written * @throws java.io.IOException if an error occurs */ public static void write1(Raster raster, net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { int bytesPerLine = getBytesPerLine1(raster.getWidth()); byte[] line = new byte[bytesPerLine]; for (int y = raster.getHeight() - 1; y >= 0; y--) { for (int i = 0; i < bytesPerLine; i++) { line[i] = 0; } for (int x = 0; x < raster.getWidth(); x++) { int bi = x / 8; int i = x % 8; int index = raster.getSample(x, y, 0); line[bi] = setBit(line[bi], i, index); } out.write(line); } } /** * Encodes and writes raster data as a 4-bit bitmap. * @param raster the source raster data * @param out the output to which the bitmap will be written * @throws java.io.IOException if an error occurs */ public static void write4(Raster raster, net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { // The approach taken here is to use a buffer to hold encoded raster data // one line at a time. // Perhaps we could just write directly to output instead // and avoid using a buffer altogether. Hypothetically speaking, // a very wide image would require a large line buffer here, but then again, // large 4 bit bitmaps are pretty uncommon, so using the line buffer approach // should be okay. int width = raster.getWidth(); int height = raster.getHeight(); // calculate bytes per line int bytesPerLine = getBytesPerLine4(width); // line buffer byte[] line = new byte[bytesPerLine]; // encode and write lines for (int y = height - 1; y >= 0; y--) { // clear line buffer for (int i = 0; i < bytesPerLine; i++) { line[i] = 0; } // encode raster data for line for (int x = 0; x < width; x++) { // calculate buffer index int bi = x / 2; // calculate nibble index (high order or low order) int i = x % 2; // get color index int index = raster.getSample(x, y, 0); // set color index in buffer line[bi] = setNibble(line[bi], i, index); } // write line data (padding bytes included) out.write(line); } } /** * Encodes and writes raster data as an 8-bit bitmap. * @param raster the source raster data * @param out the output to which the bitmap will be written * @throws java.io.IOException if an error occurs */ public static void write8(Raster raster, net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { int width = raster.getWidth(); int height = raster.getHeight(); // calculate bytes per line int bytesPerLine = getBytesPerLine8(width); // write lines for (int y = height - 1; y >= 0; y--) { // write raster data for each line for (int x = 0; x < width; x++) { // get color index for pixel int index = raster.getSample(x, y, 0); out.writeByte(index); } // write padding bytes at end of line for (int i = width; i < bytesPerLine; i++) { out.writeByte(0); } } } /** * Encodes and writes raster data as a 24-bit bitmap. * @param raster the source raster data * @param out the output to which the bitmap will be written * @throws java.io.IOException if an error occurs */ public static void write24(Raster raster, net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { int width = raster.getWidth(); int height = raster.getHeight(); // calculate bytes per line int bytesPerLine = getBytesPerLine24(width); // write lines for (int y = height - 1; y >= 0; y--) { // write pixel data for each line for (int x = 0; x < width; x++) { // get RGB values for pixel int r = raster.getSample(x, y, 0); int g = raster.getSample(x, y, 1); int b = raster.getSample(x, y, 2); // write RGB values out.writeByte(b); out.writeByte(g); out.writeByte(r); } // write padding bytes at end of line for (int i = width * 3; i < bytesPerLine; i++) { out.writeByte(0); } } } /** * Encodes and writes raster data, together with alpha (transparency) data, as a 32-bit bitmap. * @param raster the source raster data * @param alpha the source alpha data * @param out the output to which the bitmap will be written * @throws java.io.IOException if an error occurs */ public static void write32(Raster raster, Raster alpha, net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { int width = raster.getWidth(); int height = raster.getHeight(); // write lines for (int y = height - 1; y >= 0; y--) { // write pixel data for each line for (int x = 0; x < width; x++) { // get RGBA values int r = raster.getSample(x, y, 0); int g = raster.getSample(x, y, 1); int b = raster.getSample(x, y, 2); int a = alpha.getSample(x, y, 0); // write RGBA values out.writeByte(b); out.writeByte(g); out.writeByte(r); out.writeByte(a); } } } /** * Sets a particular bit in a byte. * @param bits the source byte * @param index the index of the bit to set * @param bit the value for the bit, which should be either 0 or 1. * @param the resultant byte */ private static byte setBit(byte bits, int index, int bit) { if (bit == 0) { bits &= ~(1 << (7 - index)); } else { bits |= 1 << (7 - index); } return bits; } /** * Sets a particular nibble (4 bits) in a byte. * @param nibbles the source byte * @param index the index of the nibble to set * @param the value for the nibble, which should be in the range 0x0..0xF. */ private static byte setNibble(byte nibbles, int index, int nibble) { nibbles |= (nibble << ((1 - index) * 4)); return nibbles; } /** * Calculates the size in bytes for a colour map with the specified bit count. * @param sBitCount the bit count, which represents the colour depth * @return the size of the colour map, in bytes if sBitCount is less than or equal to 8, * otherwise 0 as colour maps are only used for bitmaps with a colour depth of 8 bits or less. */ public static int getColorMapSize(short sBitCount) { int ret = 0; if (sBitCount <= 8) { ret = (1 << sBitCount) * 4; } return ret; } } extensions/img/image4j/src/net/sf/image4j/codec/bmp/BMPImage.java000066400000000000000000000053331335566474600247640ustar00rootroot00000000000000/* * BMPImage.java * * Created on February 19, 2007, 8:08 AM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.codec.bmp; /** * Contains a decoded BMP image, as well as information about the source encoded image. * @since 0.7 * @author Ian McDonagh */ public class BMPImage { protected InfoHeader infoHeader; protected java.awt.image.BufferedImage image; /** * Creates a new instance of BMPImage * @param image the decoded image * @param infoHeader the InfoHeader structure providing information about the source encoded image */ public BMPImage(java.awt.image.BufferedImage image, InfoHeader infoHeader) { this.image = image; this.infoHeader = infoHeader; } /** * The InfoHeader structure representing the encoded BMP image. */ public InfoHeader getInfoHeader() { return infoHeader; } /** * Sets the InfoHeader structure used for encoding the BMP image. */ public void setInfoHeader(InfoHeader infoHeader) { this.infoHeader = infoHeader; } /** * The decoded BMP image. */ public java.awt.image.BufferedImage getImage() { return image; } /** * Sets the image to be encoded. */ public void setImage(java.awt.image.BufferedImage image) { this.image = image; } /** * The width of the BMP image in pixels. * @return the width of the BMP image, or -1 if unknown * @since 0.7alpha2 */ public int getWidth() { return infoHeader == null ? -1 : infoHeader.iWidth; } /** * The height of the BMP image in pixels. * @return the height of the BMP image, or -1 if unknown. * @since 0.7alpha2 */ public int getHeight() { return infoHeader == null ? -1 : infoHeader.iHeight; } /** * The colour depth of the BMP image (bits per pixel). * @return the colour depth, or -1 if unknown. * @since 0.7alpha2 */ public int getColourDepth() { return infoHeader == null ? -1 : infoHeader.sBitCount; } /** * The number of possible colours for the BMP image. * @return the number of colours, or -1 if unknown. * @since 0.7alpha2 */ public int getColourCount() { int bpp = infoHeader.sBitCount == 32 ? 24 : infoHeader.sBitCount; return bpp == -1 ? -1 : (int) (1 << bpp); } /** * Specifies whether this BMP image is indexed, that is, the encoded bitmap uses a colour table. * If getColourDepth() returns -1, the return value has no meaning. * @return true if indexed, false if not. * @since 0.7alpha2 */ public boolean isIndexed() { return infoHeader == null ? false : infoHeader.sBitCount <= 8; } } extensions/img/image4j/src/net/sf/image4j/codec/bmp/ColorEntry.java000066400000000000000000000032641335566474600255040ustar00rootroot00000000000000/* * ColorEntry.java * * Created on 10 May 2006, 08:29 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.codec.bmp; import java.io.IOException; /** * Represents an RGB colour entry used in the palette of an indexed image (colour depth <= 8). * @author Ian McDonagh */ public class ColorEntry { /** * The red component, which should be in the range 0..255. */ public int bRed; /** * The green component, which should be in the range 0..255. */ public int bGreen; /** * The blue component, which should be in the range 0..255. */ public int bBlue; /** * Unused. */ public int bReserved; /** * Reads and creates a colour entry from the source input. * @param in the source input * @throws java.io.IOException if an error occurs */ public ColorEntry(net.sf.image4j.io.LittleEndianInputStream in) throws IOException { bBlue = in.readUnsignedByte(); bGreen = in.readUnsignedByte(); bRed = in.readUnsignedByte(); bReserved = in.readUnsignedByte(); } /** * Creates a colour entry with colour components initialized to 0. */ public ColorEntry() { bBlue = 0; bGreen = 0; bRed = 0; bReserved = 0; } /** * Creates a colour entry with the specified colour components. * @param r red component * @param g green component * @param b blue component * @param a unused */ public ColorEntry(int r, int g, int b, int a) { bBlue = b; bGreen = g; bRed = r; bReserved = a; } } extensions/img/image4j/src/net/sf/image4j/codec/bmp/InfoHeader.java000066400000000000000000000137601335566474600254120ustar00rootroot00000000000000/* * InfoHeader.java * * Created on 10 May 2006, 08:10 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.codec.bmp; import java.io.IOException; import net.sf.image4j.io.LittleEndianOutputStream; /** * Represents a bitmap InfoHeader structure, which provides header information. * @author Ian McDonagh */ public class InfoHeader { /** * The size of this InfoHeader structure in bytes. */ public int iSize; /** * The width in pixels of the bitmap represented by this InfoHeader. */ public int iWidth; /** * The height in pixels of the bitmap represented by this InfoHeader. */ public int iHeight; /** * The number of planes, which should always be 1. */ public short sPlanes; /** * The bit count, which represents the colour depth (bits per pixel). * This should be either 1, 4, 8, 24 or 32. */ public short sBitCount; /** * The compression type, which should be one of the following: *
    *
  • {@link BMPConstants#BI_RGB BI_RGB} - no compression
  • *
  • {@link BMPConstants#BI_RLE8 BI_RLE8} - 8-bit RLE compression
  • *
  • {@link BMPConstants#BI_RLE4 BI_RLE4} - 4-bit RLE compression
  • *
*/ public int iCompression; /** * The compressed size of the image in bytes, or 0 if iCompression is 0. */ public int iImageSize; /** * Horizontal resolution in pixels/m. */ public int iXpixelsPerM; /** * Vertical resolution in pixels/m. */ public int iYpixelsPerM; /** * Number of colours actually used in the bitmap. */ public int iColorsUsed; /** * Number of important colours (0 = all). */ public int iColorsImportant; /** * Calculated number of colours, based on the colour depth specified by {@link #sBitCount sBitCount}. */ public int iNumColors; /** * Creates an InfoHeader structure from the source input. * @param in the source input * @throws java.io.IOException if an error occurs */ public InfoHeader(net.sf.image4j.io.LittleEndianInputStream in) throws IOException { //Size of InfoHeader structure = 40 iSize = in.readIntLE(); init(in, iSize); } /** * @since 0.6 */ public InfoHeader(net.sf.image4j.io.LittleEndianInputStream in, int infoSize) throws IOException { init(in, infoSize); } /** * @since 0.6 */ protected void init(net.sf.image4j.io.LittleEndianInputStream in, int infoSize) throws IOException { this.iSize = infoSize; //Width iWidth = in.readIntLE(); //Height iHeight = in.readIntLE(); //Planes (=1) sPlanes = in.readShortLE(); //Bit count sBitCount = in.readShortLE(); //calculate NumColors iNumColors = (int) Math.pow(2, sBitCount); //Compression iCompression = in.readIntLE(); //Image size - compressed size of image or 0 if Compression = 0 iImageSize = in.readIntLE(); //horizontal resolution pixels/meter iXpixelsPerM = in.readIntLE(); //vertical resolution pixels/meter iYpixelsPerM = in.readIntLE(); //Colors used - number of colors actually used iColorsUsed = in.readIntLE(); //Colors important - number of important colors 0 = all iColorsImportant = in.readIntLE(); } /** * Creates an InfoHeader with default values. */ public InfoHeader() { //Size of InfoHeader structure = 40 iSize = 40; //Width iWidth = 0; //Height iHeight = 0; //Planes (=1) sPlanes = 1; //Bit count sBitCount = 0; //caculate NumColors iNumColors = 0; //Compression iCompression = BMPConstants.BI_RGB; //Image size - compressed size of image or 0 if Compression = 0 iImageSize = 0; //horizontal resolution pixels/meter iXpixelsPerM = 0; //vertical resolution pixels/meter iYpixelsPerM = 0; //Colors used - number of colors actually used iColorsUsed = 0; //Colors important - number of important colors 0 = all iColorsImportant = 0; } /** * Creates a copy of the source InfoHeader. * @param source the source to copy */ public InfoHeader(InfoHeader source) { iColorsImportant = source.iColorsImportant; iColorsUsed = source.iColorsUsed; iCompression = source.iCompression; iHeight = source.iHeight; iWidth = source.iWidth; iImageSize = source.iImageSize; iNumColors = source.iNumColors; iSize = source.iSize; iXpixelsPerM = source.iXpixelsPerM; iYpixelsPerM = source.iYpixelsPerM; sBitCount = source.sBitCount; sPlanes = source.sPlanes; } /** * Writes the InfoHeader structure to output * @param out the output to which the structure will be written * @throws java.io.IOException if an error occurs */ public void write(net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { //Size of InfoHeader structure = 40 out.writeIntLE(iSize); //Width out.writeIntLE(iWidth); //Height out.writeIntLE(iHeight); //Planes (=1) out.writeShortLE(sPlanes); //Bit count out.writeShortLE(sBitCount); //caculate NumColors //iNumColors = (int) Math.pow(2, sBitCount); //Compression out.writeIntLE(iCompression); //Image size - compressed size of image or 0 if Compression = 0 out.writeIntLE(iImageSize); //horizontal resolution pixels/meter out.writeIntLE(iXpixelsPerM); //vertical resolution pixels/meter out.writeIntLE(iYpixelsPerM); //Colors used - number of colors actually used out.writeIntLE(iColorsUsed); //Colors important - number of important colors 0 = all out.writeIntLE(iColorsImportant); } } extensions/img/image4j/src/net/sf/image4j/codec/bmp/package.html000066400000000000000000000003451335566474600250170ustar00rootroot00000000000000 BMP codec implementation, which allows encoding and decoding of MS BMP format. extensions/img/image4j/src/net/sf/image4j/codec/ico/000077500000000000000000000000001335566474600225305ustar00rootroot00000000000000extensions/img/image4j/src/net/sf/image4j/codec/ico/ICOConstants.java000066400000000000000000000010671335566474600257060ustar00rootroot00000000000000/* * ICOConstants.java * * Created on May 13, 2006, 8:07 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.codec.ico; /** * Provides constants used with ICO format. * @author Ian McDonagh */ public class ICOConstants { /** * Indicates that ICO data represents an icon (.ICO). */ public static final int TYPE_ICON = 1; /** * Indicates that ICO data represents a cursor (.CUR). */ public static final int TYPE_CURSOR = 2; } extensions/img/image4j/src/net/sf/image4j/codec/ico/ICODecoder.java000066400000000000000000000251651335566474600253040ustar00rootroot00000000000000/* * ICODecoder.java * * Created on May 9, 2006, 9:31 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. * * * */ package net.sf.image4j.codec.ico; import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.io.IOException; import net.sf.image4j.codec.bmp.BMPDecoder; import net.sf.image4j.codec.bmp.ColorEntry; import net.sf.image4j.codec.bmp.InfoHeader; /** * Decodes images in ICO format. * @author Ian McDonagh */ public class ICODecoder { private static final int PNG_MAGIC = 0x89504E47; private static final int PNG_MAGIC_LE = 0x474E5089; private static final int PNG_MAGIC2 = 0x0D0A1A0A; private static final int PNG_MAGIC2_LE = 0x0A1A0A0D; //private java.util.List img; private ICODecoder() { } /** * Reads and decodes the given ICO file. Convenience method equivalent to {@link #read(java.io.InputStream) read(new java.io.FileInputStream(file))}. * @param file the source file to read * @return the list of images decoded from the ICO data * @throws java.io.IOException if an error occurs */ public static java.util.List read(java.io.File file) throws IOException { return read(new java.io.FileInputStream(file)); } /** * Reads and decodes the given ICO file, together with all metadata. * Convenience method equivalent to {@link #readExt(java.io.InputStream) readExt(new java.io.FileInputStream(file))}. * @param file the source file to read * @return the list of images decoded from the ICO data * @throws java.io.IOException if an error occurs * @since 0.7 */ public static java.util.List readExt(java.io.File file) throws IOException { return readExt(new java.io.FileInputStream(file)); } /** * Reads and decodes ICO data from the given source. * The returned list of images is in the order in which they appear in the source ICO data. * @param is the source InputStream to read * @return the list of images decoded from the ICO data * @throws java.io.IOException if an error occurs */ public static java.util.List read(java.io.InputStream is) throws IOException { java.util.List list = readExt(is); java.util.List ret = new java.util.ArrayList(list.size()); for (int i = 0; i < list.size(); i++) { ICOImage icoImage = list.get(i); BufferedImage image = icoImage.getImage(); ret.add(image); } return ret; } /** * Reads and decodes ICO data from the given source, together with all metadata. * The returned list of images is in the order in which they appear in the source ICO data. * @param is the source InputStream to read * @return the list of images decoded from the ICO data * @throws java.io.IOException if an error occurs * @since 0.7 */ public static java.util.List readExt(java.io.InputStream is) throws IOException { //long t = System.currentTimeMillis(); net.sf.image4j.io.LittleEndianInputStream in = new net.sf.image4j.io.LittleEndianInputStream(is); //Reserved 2 byte =0 short sReserved = in.readShortLE(); //Type 2 byte =1 short sType = in.readShortLE(); //Count 2 byte Number of Icons in this file short sCount = in.readShortLE(); //Entries Count * 16 list of icons IconEntry[] entries = new IconEntry[sCount]; for (short s = 0; s < sCount; s++) { entries[s] = new IconEntry(in); } int i = 0; //images list of bitmap structures in BMP format java.util.List ret = new java.util.ArrayList(sCount); try { for (i = 0; i < sCount; i++) { int info = in.readIntLE(); if (info == 40) { //read XOR bitmap //BMPDecoder bmp = new BMPDecoder(is); InfoHeader infoHeader = BMPDecoder.readInfoHeader(in, info); InfoHeader andHeader = new InfoHeader(infoHeader); andHeader.iHeight = (int) (infoHeader.iHeight / 2); InfoHeader xorHeader = new InfoHeader(infoHeader); xorHeader.iHeight = andHeader.iHeight; andHeader.sBitCount = 1; andHeader.iNumColors = 2; //for now, just read all the raster data (xor + and) // and store as separate images BufferedImage xor = BMPDecoder.read(xorHeader, in); //img.add(xor); BufferedImage img = new BufferedImage( xorHeader.iWidth, xorHeader.iHeight, BufferedImage.TYPE_INT_ARGB ); ColorEntry[] andColorTable = new ColorEntry[] { new ColorEntry(255, 255, 255, 255), new ColorEntry(0, 0, 0, 0) }; if (infoHeader.sBitCount == 32) { //transparency from alpha //ignore bytes after XOR bitmap int size = entries[i].iSizeInBytes; int infoHeaderSize = infoHeader.iSize; // data size = w * h * 4 int dataSize = xorHeader.iWidth * xorHeader.iHeight * 4; int skip = size - infoHeaderSize - dataSize; //ignore AND bitmap since alpha channel stores transparency int skipped = in.skipBytes(skip); int s = skip; while (skipped < s) { if (skipped < 0) { throw new IOException("Failed to read [skip]"); } s = skip - skipped; skipped = in.skipBytes(s); } ////read AND bitmap //BufferedImage and = BMPDecoder.read(andHeader, in, andColorTable); //this.img.add(and); WritableRaster srgb = xor.getRaster(); WritableRaster salpha = xor.getAlphaRaster(); WritableRaster rgb = img.getRaster(); WritableRaster alpha = img.getAlphaRaster(); for (int y = xorHeader.iHeight - 1; y >= 0; y--) { for (int x = 0; x < xorHeader.iWidth; x++) { int r = srgb.getSample(x, y, 0); int g = srgb.getSample(x, y, 1); int b = srgb.getSample(x, y, 2); int a = salpha.getSample(x, y, 0); rgb.setSample(x, y, 0, r); rgb.setSample(x, y, 1, g); rgb.setSample(x, y, 2, b); alpha.setSample(x, y, 0, a); } } } else { BufferedImage and = BMPDecoder.read(andHeader, in, andColorTable); //img.add(and); //copy rgb WritableRaster srgb = xor.getRaster(); WritableRaster rgb = img.getRaster(); //copy alpha WritableRaster alpha = img.getAlphaRaster(); WritableRaster salpha = and.getRaster(); for (int y = 0; y < xorHeader.iHeight; y++) { for (int x = 0; x < xorHeader.iWidth; x++) { int r, g, b; int c = xor.getRGB(x, y); r = (c >> 16) & 0xFF; g = (c >> 8) & 0xFF; b = (c) & 0xFF; //red rgb.setSample(x, y, 0, r); //green rgb.setSample(x, y, 1, g); //blue rgb.setSample(x, y, 2, b); //System.out.println(x+","+y+"="+Integer.toHexString(c)); //img.setRGB(x, y, c); //alpha int a = and.getRGB(x, y); alpha.setSample(x, y, 0, a); } } } // create ICOImage IconEntry iconEntry = entries[i]; ICOImage icoImage = new ICOImage(img, infoHeader, iconEntry); icoImage.setPngCompressed(false); icoImage.setIconIndex(i); ret.add(icoImage); } //check for PNG magic header and that image height and width = 0 = 256 -> Vista format else if (info == PNG_MAGIC_LE) { int info2 = in.readIntLE(); if (info2 != PNG_MAGIC2_LE) { throw new IOException("Unrecognized icon format for image #"+i); } IconEntry e = entries[i]; byte[] pngData = new byte[e.iSizeInBytes - 8]; int count = in.read(pngData); if (count != pngData.length) { throw new IOException("Unable to read image #"+i+" - incomplete PNG compressed data"); } java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream(); java.io.DataOutputStream dout = new java.io.DataOutputStream(bout); dout.writeInt(PNG_MAGIC); dout.writeInt(PNG_MAGIC2); dout.write(pngData); byte[] pngData2 = bout.toByteArray(); java.io.ByteArrayInputStream bin = new java.io.ByteArrayInputStream(pngData2); javax.imageio.stream.ImageInputStream input = javax.imageio.ImageIO.createImageInputStream(bin); javax.imageio.ImageReader reader = getPNGImageReader(); reader.setInput(input); java.awt.image.BufferedImage img = reader.read(0); // create ICOImage IconEntry iconEntry = entries[i]; ICOImage icoImage = new ICOImage(img, null, iconEntry); icoImage.setPngCompressed(true); icoImage.setIconIndex(i); ret.add(icoImage); } else { throw new IOException("Unrecognized icon format for image #"+i); } /* InfoHeader andInfoHeader = new InfoHeader(); andInfoHeader.iColorsImportant = 0; andInfoHeader.iColorsUsed = 0; andInfoHeader.iCompression = BMPConstants.BI_RGB; andInfoHeader.iHeight = xorInfoHeader.iHeight / 2; andInfoHeader.iWidth = xorInfoHeader. */ } } catch (IOException ex) { throw new IOException("Failed to read image # "+i); } //long t2 = System.currentTimeMillis(); //System.out.println("Loaded ICO file in "+(t2 - t)+"ms"); return ret; } private static javax.imageio.ImageReader getPNGImageReader() { javax.imageio.ImageReader ret = null; java.util.Iterator itr = javax.imageio.ImageIO.getImageReadersByFormatName("png"); if (itr.hasNext()) { ret = (javax.imageio.ImageReader)itr.next(); } return ret; } } extensions/img/image4j/src/net/sf/image4j/codec/ico/ICOEncoder.java000066400000000000000000000427711335566474600253200ustar00rootroot00000000000000/* * ICOEncoder.java * * Created on 12 May 2006, 04:08 * * To change this template, choose Tools | Template Manager * and open the template in the editor. * * */ package net.sf.image4j.codec.ico; import java.awt.image.BufferedImage; import java.awt.image.IndexColorModel; import java.awt.image.Raster; import java.awt.image.WritableRaster; import java.io.IOException; import java.util.List; import javax.imageio.ImageWriter; import net.sf.image4j.codec.bmp.BMPEncoder; import net.sf.image4j.codec.bmp.InfoHeader; import net.sf.image4j.io.LittleEndianOutputStream; import net.sf.image4j.util.ConvertUtil; /** * Encodes images in ICO format. * @author Ian McDonagh */ public class ICOEncoder { /** Creates a new instance of ICOEncoder */ private ICOEncoder() { } /** * Encodes and writes a single image to file without colour depth conversion. * @param image the source image to encode * @param file the output file to which the encoded image will be written * @throws java.io.IOException if an exception occurs */ public static void write(BufferedImage image, java.io.File file) throws IOException { write(image, -1, file); } /** * Encodes and writes a single image without colour depth conversion. * @param image the source image to encode * @param os the output to which the encoded image will be written * @throws java.io.IOException if an exception occurs */ public static void write(BufferedImage image, java.io.OutputStream os) throws IOException { write(image, -1, os); } /** * Encodes and writes multiple images without colour depth conversion. * @param images the list of source images to be encoded * @param os the output to which the encoded image will be written * @throws java.io.IOException if an error occurs */ public static void write(List images, java.io.OutputStream os) throws IOException { write(images, null, null, os); } /** * Encodes and writes multiple images to file without colour depth conversion. * @param images the list of source images to encode * @param file the file to which the encoded images will be written * @throws java.io.IOException if an exception occurs */ public static void write(List images, java.io.File file) throws IOException { write(images, null, file); } /** * Encodes and writes multiple images to file with the colour depth conversion using the specified values. * @param images the list of source images to encode * @param bpp array containing desired colour depths for colour depth conversion * @param file the output file to which the encoded images will be written * @throws java.io.IOException if an error occurs */ public static void write(List images, int[] bpp, java.io.File file) throws IOException { write(images, bpp, new java.io.FileOutputStream(file)); } /** * Encodes and outputs a list of images in ICO format. The first image in the list will be at index #0 in the ICO file, the second at index #1, and so on. * @param images List of images to encode, which will be output in the order supplied in the list. * @param bpp Array containing the color depth (bits per pixel) for encoding the corresponding image at each index in the images list. If the array is null, no colour depth conversion will be performed. A colour depth value of -1 at a particular index indicates that no colour depth conversion should be performed for that image. * @param compress Array containing the compression flag for the corresponding image at each index in the images list. If the array is null, no compression will be peformed. A value of true specifies that compression should be performed, while a value of false specifies that no compression should be performed. * @param file the file to which the encoded images will be written. * @throws java.io.IOException if an error occurred. * @since 0.6 */ public static void write(List images, int[] bpp, boolean[] compress, java.io.File file) throws IOException { write(images, bpp, compress, new java.io.FileOutputStream(file)); } /** * Encodes and writes a single image to file with colour depth conversion using the specified value. * @param image the source image to encode * @param bpp the colour depth (bits per pixel) for the colour depth conversion, or -1 if no colour depth conversion should be performed * @param file the output file to which the encoded image will be written * @throws java.io.IOException if an error occurs */ public static void write(BufferedImage image, int bpp, java.io.File file) throws IOException { write(image, bpp, new java.io.FileOutputStream(file)); } /** * Encodes and outputs a single image in ICO format. * Convenience method, which calls {@link #write(java.util.List,int[],java.io.OutputStream) write(java.util.List,int[],java.io.OutputStream)}. * @param image The image to encode. * @param bpp Colour depth (in bits per pixel) for the colour depth conversion, or -1 if no colour depth conversion should be performed. * @param os The output to which the encoded image will be written. * @throws java.io.IOException if an error occurs when trying to write the output. */ public static void write(BufferedImage image, int bpp, java.io.OutputStream os) throws IOException { List list = new java.util.ArrayList(1); list.add(image); write(list, new int[] { bpp }, new boolean[] { false }, os); } /** * Encodes and outputs a list of images in ICO format. The first image in the list will be at index #0 in the ICO file, the second at index #1, and so on. * @param images List of images to encode, which will be output in the order supplied in the list. * @param bpp Array containing the color depth (bits per pixel) for encoding the corresponding image at each index in the images list. If the array is null, no colour depth conversion will be performed. A colour depth value of -1 at a particular index indicates that no colour depth conversion should be performed for that image. * @param os The output to which the encoded images will be written. * @throws java.io.IOException if an error occurred. */ public static void write(List images, int[] bpp, java.io.OutputStream os) throws IOException { write(images, bpp, null, os); } /** * Encodes and outputs a list of images in ICO format. The first image in the list will be at index #0 in the ICO file, the second at index #1, and so on. * @param images List of images to encode, which will be output in the order supplied in the list. * @param bpp Array containing the color depth (bits per pixel) for encoding the corresponding image at each index in the images list. If the array is null, no colour depth conversion will be performed. A colour depth value of -1 at a particular index indicates that no colour depth conversion should be performed for that image. * @param compress Array containing the compression flag for the corresponding image at each index in the images list. If the array is null, no compression will be peformed. A value of true specifies that compression should be performed, while a value of false specifies that no compression should be performed. * @param os The output to which the encoded images will be written. * @throws java.io.IOException if an error occurred. * @since 0.6 */ public static void write(List images, int[] bpp, boolean[] compress, java.io.OutputStream os) throws IOException { LittleEndianOutputStream out = new LittleEndianOutputStream(os); int count = images.size(); //file header 6 writeFileHeader(count, ICOConstants.TYPE_ICON, out); //file offset where images start int fileOffset = 6 + count * 16; List infoHeaders = new java.util.ArrayList(count); List converted = new java.util.ArrayList(count); List compressedImages = null; if (compress != null) { compressedImages = new java.util.ArrayList(count); } javax.imageio.ImageWriter pngWriter = null; //icon entries 16 * count for (int i = 0; i < count; i++) { BufferedImage img = (BufferedImage)images.get(i); int b = bpp == null ? -1 : bpp[i]; //convert image BufferedImage imgc = b == -1 ? img : convert(img, b); converted.add(imgc); //create info header InfoHeader ih = BMPEncoder.createInfoHeader(imgc); //create icon entry IconEntry e = createIconEntry(ih); if (compress != null && compressedImages!=null) { if (compress[i]) { if (pngWriter == null) { pngWriter = getPNGImageWriter(); } byte[] compressedImage = encodePNG(pngWriter, imgc); compressedImages.add(compressedImage); e.iSizeInBytes = compressedImage.length; } else { compressedImages.add(null); } } ih.iHeight *= 2; e.iFileOffset = fileOffset; fileOffset += e.iSizeInBytes; e.write(out); infoHeaders.add(ih); } //images for (int i = 0; i < count; i++) { BufferedImage img = (BufferedImage)images.get(i); BufferedImage imgc = (BufferedImage)converted.get(i); if (compress == null || !compress[i]) { //info header InfoHeader ih = (InfoHeader)infoHeaders.get(i); ih.write(out); //color map if (ih.sBitCount <= 8) { IndexColorModel icm = (IndexColorModel) imgc.getColorModel(); BMPEncoder.writeColorMap(icm, out); } //xor bitmap writeXorBitmap(imgc, ih, out); //and bitmap writeAndBitmap(img, out); } else if(compressedImages!=null){ byte[] compressedImage = compressedImages.get(i); out.write(compressedImage); } //javax.imageio.ImageIO.write(imgc, "png", new java.io.File("test_"+i+".png")); } } /** * Writes the ICO file header for an ICO containing the given number of images. * @param count the number of images in the ICO * @param type one of {@link net.sf.image4j.codec.ico.ICOConstants#TYPE_ICON TYPE_ICON} or * {@link net.sf.image4j.codec.ico.ICOConstants#TYPE_CURSOR TYPE_CURSOR} * @param out the output to which the file header will be written * @throws java.io.IOException if an error occurs */ public static void writeFileHeader(int count, int type, LittleEndianOutputStream out) throws IOException { //reserved 2 out.writeShortLE((short) 0); //type 2 out.writeShortLE((short) type); //count 2 out.writeShortLE((short) count); } /** * Constructs an IconEntry from the given InfoHeader * structure. * @param ih the InfoHeader structure from which to construct the IconEntry structure. * @return the IconEntry structure constructed from the IconEntry structure. */ public static IconEntry createIconEntry(InfoHeader ih) { IconEntry ret = new IconEntry(); //width 1 ret.bWidth = ih.iWidth == 256 ? 0 : ih.iWidth; //height 1 ret.bHeight = ih.iHeight == 256 ? 0 : ih.iHeight; //color count 1 ret.bColorCount = ih.iNumColors >= 256 ? 0 : ih.iNumColors; //reserved 1 ret.bReserved = 0; //planes 2 = 1 ret.sPlanes = 1; //bit count 2 ret.sBitCount = ih.sBitCount; //sizeInBytes 4 - size of infoHeader + xor bitmap + and bitbmap int cmapSize = BMPEncoder.getColorMapSize(ih.sBitCount); int xorSize = BMPEncoder.getBitmapSize(ih.iWidth, ih.iHeight, ih.sBitCount); int andSize = BMPEncoder.getBitmapSize(ih.iWidth, ih.iHeight, 1); int size = ih.iSize + cmapSize + xorSize + andSize; ret.iSizeInBytes = size; //fileOffset 4 ret.iFileOffset = 0; return ret; } /** * Encodes the AND bitmap for the given image according the its alpha channel (transparency) and writes it to the given output. * @param img the image to encode as the AND bitmap. * @param out the output to which the AND bitmap will be written * @throws java.io.IOException if an error occurs. */ public static void writeAndBitmap(BufferedImage img, net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { WritableRaster alpha = img.getAlphaRaster(); //indexed transparency (eg. GIF files) if (img.getColorModel() instanceof IndexColorModel && img.getColorModel().hasAlpha()) { int w = img.getWidth(); int h = img.getHeight(); int bytesPerLine = BMPEncoder.getBytesPerLine1(w); byte[] line = new byte[bytesPerLine]; IndexColorModel icm = (IndexColorModel) img.getColorModel(); Raster raster = img.getRaster(); for (int y = h - 1; y >= 0; y--) { for (int x = 0; x < w; x++) { int bi = x / 8; int i = x % 8; //int a = alpha.getSample(x, y, 0); int p = raster.getSample(x, y, 0); int a = icm.getAlpha(p); //invert bit since and mask is applied to xor mask int b = ~a & 1; line[bi] = setBit(line[bi], i, b); } out.write(line); } } //no transparency else if (alpha == null) { int h = img.getHeight(); int w = img.getWidth(); //calculate number of bytes per line, including 32-bit padding int bytesPerLine = BMPEncoder.getBytesPerLine1(w); byte[] line = new byte[bytesPerLine]; for (int i = 0; i < bytesPerLine; i++) { line[i] = (byte) 0; } for (int y = h - 1; y >= 0; y--) { out.write(line); } } //transparency (ARGB, etc. eg. PNG) else { //BMPEncoder.write1(alpha, cmap, out); int w = img.getWidth(); int h = img.getHeight(); int bytesPerLine = BMPEncoder.getBytesPerLine1(w); byte[] line = new byte[bytesPerLine]; for (int y = h - 1; y >= 0; y--) { for (int x = 0; x < w; x++) { int bi = x / 8; int i = x % 8; int a = alpha.getSample(x, y, 0); //invert bit since and mask is applied to xor mask int b = ~a & 1; line[bi] = setBit(line[bi], i, b); } out.write(line); } } } private static byte setBit(byte bits, int index, int bit) { int mask = 1 << (7 - index); bits &= ~mask; bits |= bit << (7 - index); return bits; } private static void writeXorBitmap(BufferedImage img, InfoHeader ih, LittleEndianOutputStream out) throws IOException { Raster raster = img.getRaster(); switch (ih.sBitCount) { case 1: BMPEncoder.write1(raster, out); break; case 4: BMPEncoder.write4(raster, out); break; case 8: BMPEncoder.write8(raster, out); break; case 24: BMPEncoder.write24(raster, out); break; case 32: Raster alpha = img.getAlphaRaster(); BMPEncoder.write32(raster, alpha, out); break; } } /** * Utility method, which converts the given image to the specified colour depth. * @param img the image to convert. * @param bpp the target colour depth (bits per pixel) for the conversion. * @return the given image converted to the specified colour depth. */ public static BufferedImage convert(BufferedImage img, int bpp) { BufferedImage ret = null; switch (bpp) { case 1: ret = ConvertUtil.convert1(img); break; case 4: ret = ConvertUtil.convert4(img); break; case 8: ret = ConvertUtil.convert8(img); break; case 24: int b = img.getColorModel().getPixelSize(); if (b == 24 || b == 32) { ret = img; } else { ret = ConvertUtil.convert24(img); } break; case 32: int b2 = img.getColorModel().getPixelSize(); if (b2 == 24 || b2 == 32) { ret = img; } else { ret = ConvertUtil.convert32(img); } break; } return ret; } /** * @since 0.6 */ private static javax.imageio.ImageWriter getPNGImageWriter() { javax.imageio.ImageWriter ret = null; java.util.Iterator itr = javax.imageio.ImageIO.getImageWritersByFormatName("png"); if (itr.hasNext()) { ret = (javax.imageio.ImageWriter)itr.next(); } return ret; } /** * @since 0.6 */ private static byte[] encodePNG(ImageWriter pngWriter, BufferedImage img) throws IOException { java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream(); javax.imageio.stream.ImageOutputStream output = javax.imageio.ImageIO.createImageOutputStream(bout); pngWriter.setOutput(output); pngWriter.write(img); bout.flush(); byte[] ret = bout.toByteArray(); return ret; } } extensions/img/image4j/src/net/sf/image4j/codec/ico/ICOImage.java000066400000000000000000000102461335566474600247530ustar00rootroot00000000000000/* * ICOImage.java * * Created on February 19, 2007, 8:11 AM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.codec.ico; import net.sf.image4j.codec.bmp.InfoHeader; /** * Contains a decoded ICO image, as well as information about the source encoded ICO image. * @since 0.7 * @author Ian McDonagh */ public class ICOImage extends net.sf.image4j.codec.bmp.BMPImage { protected IconEntry iconEntry; protected boolean pngCompressed = false; protected int iconIndex = -1; /** * Creates a new instance of ICOImage * @param image the BufferedImage decoded from the source ICO image * @param infoHeader the BMP InfoHeader structure for the BMP encoded ICO image * @param iconEntry the IconEntry structure describing the ICO image */ public ICOImage(java.awt.image.BufferedImage image, net.sf.image4j.codec.bmp.InfoHeader infoHeader, IconEntry iconEntry) { super(image, infoHeader); this.iconEntry = iconEntry; } /** * The IconEntry associated with this ICOImage, which provides information * about the image format and encoding. * @return the IconEntry structure */ public IconEntry getIconEntry() { return iconEntry; } /** * Sets the IconEntry associated with this ICOImage. * @param iconEntry the new IconEntry structure to set */ public void setIconEntry(IconEntry iconEntry) { this.iconEntry = iconEntry; } /** * Specifies whether the encoded image is PNG compressed. * @return true if the encoded image is PNG compressed, false if it is plain BMP encoded */ public boolean isPngCompressed() { return pngCompressed; } /** * Sets whether the encoded image is PNG compressed. * @param pngCompressed true if the encoded image is PNG compressed, false if it is plain BMP encoded */ public void setPngCompressed(boolean pngCompressed) { this.pngCompressed = pngCompressed; } /** * The InfoHeader structure representing the encoded ICO image. * @return the InfoHeader structure, or null if there is no InfoHeader structure, which is possible for PNG compressed icons. */ public InfoHeader getInfoHeader() { return super.getInfoHeader(); } /** * The zero-based index for this ICOImage in the source ICO file or resource. * @return the index in the source, or -1 if it is unknown. */ public int getIconIndex() { return iconIndex; } /** * Sets the icon index, which is zero-based. * @param iconIndex the zero-based icon index, or -1 if unknown. */ public void setIconIndex(int iconIndex) { this.iconIndex = iconIndex; } /** * The width of the ICO image in pixels. * @return the width of the ICO image, or -1 if unknown * @since 0.7alpha2 */ public int getWidth() { return iconEntry == null ? -1 : (iconEntry.bWidth == 0 ? 256 : iconEntry.bWidth); } /** * The height of the ICO image in pixels. * @return the height of the ICO image, or -1 if unknown. * @since 0.7alpha2 */ public int getHeight() { return iconEntry == null ? -1 : (iconEntry.bHeight == 0 ? 256 : iconEntry.bHeight); } /** * The colour depth of the ICO image (bits per pixel). * @return the colour depth, or -1 if unknown. * @since 0.7alpha2 */ public int getColourDepth() { return iconEntry == null ? -1 : iconEntry.sBitCount; } /** * The number of possible colours for the ICO image. * @return the number of colours, or -1 if unknown. * @since 0.7alpha2 */ public int getColourCount() { int bpp = iconEntry.sBitCount == 32 ? 24 : iconEntry.sBitCount; return bpp == -1 ? -1 : (int) (1 << bpp); } /** * Specifies whether this ICO image is indexed, that is, the encoded bitmap uses a colour table. * If getColourDepth() returns -1, the return value has no meaning. * @return true if indexed, false if not. * @since 0.7alpha2 */ public boolean isIndexed() { return iconEntry == null ? false : iconEntry.sBitCount <= 8; } } extensions/img/image4j/src/net/sf/image4j/codec/ico/IconEntry.java000066400000000000000000000073711335566474600253150ustar00rootroot00000000000000/* * 21-Jan-08 Modified by fbusquets: * Generic types removed to make the class compatible with Java 1.4 * * 13-Aug-13 Modified by fbusquets: * Substitute StringBuffer by StringBuilder * */ package net.sf.image4j.codec.ico; import java.io.IOException; import net.sf.image4j.io.LittleEndianInputStream; /** * Represents an IconEntry structure, which contains information about an ICO image. * @author Ian McDonagh */ public class IconEntry { /** * The width of the icon image in pixels. * 0 specifies a width of 256 pixels. */ public int bWidth; /** * The height of the icon image in pixels. * 0 specifies a height of 256 pixels. */ public int bHeight; /** * The number of colours, calculated from {@link #sBitCount sBitCount}. * 0 specifies a colour count of >= 256. */ public int bColorCount; /** * Unused. Should always be 0. */ public byte bReserved; /** * Number of planes, which should always be 1. */ public short sPlanes; /** * Colour depth in bits per pixel. */ public short sBitCount; /** * Size of ICO data, which should be the size of (InfoHeader + AND bitmap + XOR bitmap). */ public int iSizeInBytes; /** * Position in file where the InfoHeader starts. */ public int iFileOffset; /** * Creates an IconEntry structure from the source input * @param in the source input * @throws java.io.IOException if an error occurs */ public IconEntry(LittleEndianInputStream in) throws IOException { //Width 1 byte Cursor Width (16, 32, 64, 0 = 256) bWidth = in.readUnsignedByte(); //Height 1 byte Cursor Height (16, 32, 64, 0 = 256 , most commonly = Width) bHeight = in.readUnsignedByte(); //ColorCount 1 byte Number of Colors (2,16, 0=256) bColorCount = in.readUnsignedByte(); //Reserved 1 byte =0 bReserved = in.readByte(); //Planes 2 byte =1 sPlanes = in.readShortLE(); //BitCount 2 byte bits per pixel (1, 4, 8) sBitCount = in.readShortLE(); //SizeInBytes 4 byte Size of (InfoHeader + ANDbitmap + XORbitmap) iSizeInBytes = in.readIntLE(); //FileOffset 4 byte FilePos, where InfoHeader starts iFileOffset = in.readIntLE(); } /** * Creates and IconEntry structure with default values. */ public IconEntry() { bWidth = 0; bHeight = 0; bColorCount = 0; sPlanes = 1; bReserved = 0; sBitCount = 0; iSizeInBytes = 0; iFileOffset = 0; } /** * A string representation of this IconEntry structure. */ @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("width=").append(bWidth) .append(",height=").append(bHeight) .append(",bitCount=").append(sBitCount) .append(",colorCount=").append(bColorCount); return sb.toString(); } /** * Writes the IconEntry structure to output * @param out the output * @throws java.io.IOException if an error occurs */ public void write(net.sf.image4j.io.LittleEndianOutputStream out) throws IOException { //Width 1 byte Cursor Width (16, 32 or 64) out.writeByte(bWidth); //Height 1 byte Cursor Height (16, 32 or 64 , most commonly = Width) out.writeByte(bHeight); //ColorCount 1 byte Number of Colors (2,16, 0=256) out.writeByte(bColorCount); //Reserved 1 byte =0 out.writeByte(bReserved); //Planes 2 byte =1 out.writeShortLE(sPlanes); //BitCount 2 byte bits per pixel (1, 4, 8) out.writeShortLE(sBitCount); //SizeInBytes 4 byte Size of (InfoHeader + ANDbitmap + XORbitmap) out.writeIntLE(iSizeInBytes); //FileOffset 4 byte FilePos, where InfoHeader starts out.writeIntLE(iFileOffset); } } extensions/img/image4j/src/net/sf/image4j/codec/ico/package.html000066400000000000000000000010421335566474600250060ustar00rootroot00000000000000

ICO codec implementation, which allows encoding and decoding of MS ICO format.

ICO images typically contain multiple images of various sizes and colour depths. Thus, this codec implementation provides methods to decode an ICO image as a list of BufferedImage objects, and to encode a list of BufferedImage objects as an ICO image.

extensions/img/image4j/src/net/sf/image4j/codec/package.html000066400000000000000000000005121335566474600242350ustar00rootroot00000000000000 Provides functionality which implement encoding and decoding of image formats. By convension, classes pertaining to a particular image format are contained in a sub-package. extensions/img/image4j/src/net/sf/image4j/io/000077500000000000000000000000001335566474600213105ustar00rootroot00000000000000extensions/img/image4j/src/net/sf/image4j/io/EndianUtils.java000066400000000000000000000041551335566474600243770ustar00rootroot00000000000000package net.sf.image4j.io; /** * Provides utility methods for endian conversions [big-endian to little-endian; little-endian to big-endian]. * @author Ian McDonagh */ public class EndianUtils { /** * Reverses the byte order of the source short value * @param value the source value * @return the converted value */ public static short swapShort(short value) { return (short) ( ((value & 0xFF00) >> 8) | ((value & 0x00FF) << 8) ) ; } /** * Reverses the byte order of the source int value * @param value the source value * @return the converted value */ public static int swapInteger(int value) { return ((value & 0xFF000000) >> 24) | ((value & 0x00FF0000) >> 8) | ((value & 0x0000FF00) << 8) | ((value & 0x000000FF) << 24) ; } /** * Reverses the byte order of the source long value * @param value the source value * @return the converted value */ public static long swapLong(long value) { return ((value & 0xFF00000000000000L) >> 56) | ((value & 0x00FF000000000000L) >> 40) | ((value & 0x0000FF0000000000L) >> 24) | ((value & 0x000000FF00000000L) >> 8) | ((value & 0x00000000FF000000L) << 8) | ((value & 0x0000000000FF0000L) << 24) | ((value & 0x000000000000FF00L) << 40) | ((value & 0x00000000000000FFL) << 56) ; } /** * Reverses the byte order of the source float value * @param value the source value * @return the converted value */ public static float swapFloat(float value) { int i = Float.floatToIntBits(value); i = swapInteger(i); return Float.intBitsToFloat(i); } /** * Reverses the byte order of the source double value * @param value the source value * @return the converted value */ public static double swapDouble(double value) { long l = Double.doubleToLongBits(value); l = swapLong(l); return Double.longBitsToDouble(l); } }extensions/img/image4j/src/net/sf/image4j/io/LittleEndianInputStream.java000066400000000000000000000065171335566474600267340ustar00rootroot00000000000000/* * LittleEndianInputStream.java * * Created on 07 November 2006, 08:26 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.io; import java.io.EOFException; import java.io.IOException; /** * Reads little-endian data from a source InputStream by reversing byte ordering. * @author Ian McDonagh */ public class LittleEndianInputStream extends java.io.DataInputStream { /** * Creates a new instance of LittleEndianInputStream, which will read from the specified source. * @param in the source InputStream */ public LittleEndianInputStream(java.io.InputStream in) { super(in); } /** * Reads a little-endian short value * @throws java.io.IOException if an error occurs * @return short value with reversed byte order */ public short readShortLE() throws IOException { int b1 = read(); int b2 = read(); if (b1 < 0 || b2 < 0) { throw new EOFException(); } short ret = (short) ((b2 << 8) + (b1 << 0)); return ret; } /** * Reads a little-endian int value. * @throws java.io.IOException if an error occurs * @return int value with reversed byte order */ public int readIntLE() throws IOException { int b1 = read(); int b2 = read(); int b3 = read(); int b4 = read(); if (b1 < -1 || b2 < -1 || b3 < -1 || b4 < -1) { throw new EOFException(); } int ret = (b4 << 24) + (b3 << 16) + (b2 << 8) + (b1 << 0); return ret; } /** * Reads a little-endian float value. * @throws java.io.IOException if an error occurs * @return float value with reversed byte order */ public float readFloatLE() throws IOException { int i = readIntLE(); float ret = Float.intBitsToFloat(i); return ret; } /** * Reads a little-endian long value. * @throws java.io.IOException if an error occurs * @return long value with reversed byte order */ public long readLongLE() throws IOException { int i1 = readIntLE(); int i2 = readIntLE(); long ret = ((long)(i1) << 32) + (i2 & 0xFFFFFFFFL); return ret; } /** * Reads a little-endian double value. * @throws java.io.IOException if an error occurs * @return double value with reversed byte order */ public double readDoubleLE() throws IOException { long l = readLongLE(); double ret = Double.longBitsToDouble(l); return ret; } /** * @since 0.6 */ public long readUnsignedInt() throws IOException { long i1 = readUnsignedByte(); long i2 = readUnsignedByte(); long i3 = readUnsignedByte(); long i4 = readUnsignedByte(); long ret = ((i1 << 24) | (i2 << 16) | (i3 << 8) | i4); return ret; } /** * @since 0.6 */ public long readUnsignedIntLE() throws IOException { long i1 = readUnsignedByte(); long i2 = readUnsignedByte(); long i3 = readUnsignedByte(); long i4 = readUnsignedByte(); long ret = (i4 << 24) | (i3 << 16) | (i2 << 8) | i1; return ret; } } extensions/img/image4j/src/net/sf/image4j/io/LittleEndianOutputStream.java000066400000000000000000000055751335566474600271400ustar00rootroot00000000000000/* * LittleEndianOutputStream.java * * Created on 07 November 2006, 08:26 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.io; import java.io.DataOutputStream; import java.io.IOException; /** * Writes little-endian data to a target OutputStream by reversing byte ordering. * @author Ian McDonagh */ public class LittleEndianOutputStream extends DataOutputStream { /** * Creates a new instance of LittleEndianOutputStream, which will write to the specified target. * @param out the target OutputStream */ public LittleEndianOutputStream(java.io.OutputStream out) { super(out); } /** * Writes a little-endian short value * @param value the source value to convert * @throws java.io.IOException if an error occurs */ public void writeShortLE(short value) throws IOException { value = EndianUtils.swapShort(value); super.writeShort(value); } /** * Writes a little-endian int value * @param value the source value to convert * @throws java.io.IOException if an error occurs */ public void writeIntLE(int value) throws IOException { value = EndianUtils.swapInteger(value); super.writeInt(value); } /** * Writes a little-endian float value * @param value the source value to convert * @throws java.io.IOException if an error occurs */ public void writeFloatLE(float value) throws IOException { value = EndianUtils.swapFloat(value); super.writeFloat(value); } /** * Writes a little-endian long value * @param value the source value to convert * @throws java.io.IOException if an error occurs */ public void writeLongLE(long value) throws IOException { value = EndianUtils.swapLong(value); super.writeLong(value); } /** * Writes a little-endian double value * @param value the source value to convert * @throws java.io.IOException if an error occurs */ public void writeDoubleLE(double value) throws IOException { value = EndianUtils.swapDouble(value); super.writeDouble(value); } /** * @since 0.6 */ public void writeUnsignedInt(long value) throws IOException { int i1 = (int)(value >> 24); int i2 = (int)((value >> 16) & 0xFF); int i3 = (int)((value >> 8) & 0xFF); int i4 = (int)(value & 0xFF); write(i1); write(i2); write(i3); write(i4); } /** * @since 0.6 */ public void writeUnsignedIntLE(long value) throws IOException { int i1 = (int)(value >> 24); int i2 = (int)((value >> 16) & 0xFF); int i3 = (int)((value >> 8) & 0xFF); int i4 = (int)(value & 0xFF); write(i4); write(i3); write(i2); write(i1); } } extensions/img/image4j/src/net/sf/image4j/io/LittleEndianRandomAccessFile.java000066400000000000000000000044411335566474600276150ustar00rootroot00000000000000/* * LittleEndianRandomAccessFile.java * * Created on 07 November 2006, 03:04 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.io; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; /** * Provides endian conversions for input and output with a RandomAccessFile. * * This class is currently not in use and has not been tested. * * @author Ian McDonagh */ public class LittleEndianRandomAccessFile extends RandomAccessFile { public LittleEndianRandomAccessFile(java.io.File file, String mode) throws FileNotFoundException { super(file, mode); } public LittleEndianRandomAccessFile(String name, String mode) throws FileNotFoundException { super(name, mode); } public short readShortLE() throws IOException { short ret = super.readShort(); ret = EndianUtils.swapShort(ret); return ret; } public int readIntLE() throws IOException { int ret = super.readInt(); ret = EndianUtils.swapInteger(ret); return ret; } public float readFloatLE() throws IOException { float ret = super.readFloat(); ret = EndianUtils.swapFloat(ret); return ret; } public long readLongLE() throws IOException { long ret = super.readLong(); ret = EndianUtils.swapLong(ret); return ret; } public double readDoubleLE() throws IOException { double ret = super.readDouble(); ret = EndianUtils.swapDouble(ret); return ret; } public void writeShortLE(short value) throws IOException { value = EndianUtils.swapShort(value); super.writeShort(value); } public void writeIntLE(int value) throws IOException { value = EndianUtils.swapInteger(value); super.writeInt(value); } public void writeFloatLE(float value) throws IOException { value = EndianUtils.swapFloat(value); super.writeFloat(value); } public void writeLongLE(long value) throws IOException { value = EndianUtils.swapLong(value); super.writeLong(value); } public void writeDoubleLE(double value) throws IOException { value = EndianUtils.swapDouble(value); super.writeDouble(value); } } extensions/img/image4j/src/net/sf/image4j/io/package.html000066400000000000000000000006541335566474600235760ustar00rootroot00000000000000 Provides special classes for working with I/O, such as endian conversions. Java uses big-endian byte ordering, while some formats use little-endian byte ordering. Thus it is necessary to perform endian conversions when encoding and decoding data in these formats. extensions/img/image4j/src/net/sf/image4j/util/000077500000000000000000000000001335566474600216565ustar00rootroot00000000000000extensions/img/image4j/src/net/sf/image4j/util/ConvertUtil.java000066400000000000000000000121471335566474600250040ustar00rootroot00000000000000/* * ConvertUtil.java * * Created on 12 May 2006, 09:22 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.util; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.awt.image.ColorConvertOp; import java.awt.image.DataBuffer; import java.awt.image.IndexColorModel; /** * Provides useful methods for converting images from one colour depth to another. * @author Ian McDonagh */ public class ConvertUtil { /** * Converts the source to 1-bit colour depth (monochrome). * No transparency. * @param src the source image to convert * @return a copy of the source image with a 1-bit colour depth. */ public static BufferedImage convert1(BufferedImage src) { IndexColorModel icm = new IndexColorModel( 1, 2, new byte[] { (byte) 0, (byte) 0xFF }, new byte[] { (byte) 0, (byte) 0xFF }, new byte[] { (byte) 0, (byte) 0xFF } ); BufferedImage dest = new BufferedImage( src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_BINARY, icm ); ColorConvertOp cco = new ColorConvertOp( src.getColorModel().getColorSpace(), dest.getColorModel().getColorSpace(), null ); cco.filter(src, dest); return dest; } /** * Converts the source image to 4-bit colour * using the default 16-colour palette: *
    *
  • black
  • dark red
  • dark green
  • *
  • dark yellow
  • dark blue
  • dark magenta
  • *
  • dark cyan
  • dark grey
  • light grey
  • *
  • red
  • green
  • yellow
  • blue
  • *
  • magenta
  • cyan
  • white
  • *
* No transparency. * @param src the source image to convert * @return a copy of the source image with a 4-bit colour depth, with the default colour pallette */ public static BufferedImage convert4(BufferedImage src) { int[] cmap = new int[] { 0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, 0x008080, 0x808080, 0xC0C0C0, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF }; return convert4(src, cmap); } /** * Converts the source image to 4-bit colour * using the given colour map. No transparency. * @param src the source image to convert * @param cmap the colour map, which should contain no more than 16 entries * The entries are in the form RRGGBB (hex). * @return a copy of the source image with a 4-bit colour depth, with the custom colour pallette */ public static BufferedImage convert4(BufferedImage src, int[] cmap) { IndexColorModel icm = new IndexColorModel( 4, cmap.length, cmap, 0, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE ); BufferedImage dest = new BufferedImage( src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_BINARY, icm ); ColorConvertOp cco = new ColorConvertOp( src.getColorModel().getColorSpace(), dest.getColorModel().getColorSpace(), null ); cco.filter(src, dest); return dest; } /** * Converts the source image to 8-bit colour * using the default 256-colour palette. No transparency. * @param src the source image to convert * @return a copy of the source image with an 8-bit colour depth */ public static BufferedImage convert8(BufferedImage src) { BufferedImage dest = new BufferedImage( src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED ); ColorConvertOp cco = new ColorConvertOp( src.getColorModel().getColorSpace(), dest.getColorModel().getColorSpace(), null ); cco.filter(src, dest); return dest; } /** * Converts the source image to 24-bit colour (RGB). No transparency. * @param src the source image to convert * @return a copy of the source image with a 24-bit colour depth */ public static BufferedImage convert24(BufferedImage src) { BufferedImage dest = new BufferedImage( src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB ); ColorConvertOp cco = new ColorConvertOp( src.getColorModel().getColorSpace(), dest.getColorModel().getColorSpace(), null ); cco.filter(src, dest); return dest; } /** * Converts the source image to 32-bit colour with transparency (ARGB). * @param src the source image to convert * @return a copy of the source image with a 32-bit colour depth. */ public static BufferedImage convert32(BufferedImage src) { BufferedImage dest = new BufferedImage( src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_ARGB ); ColorConvertOp cco = new ColorConvertOp( src.getColorModel().getColorSpace(), dest.getColorModel().getColorSpace(), null ); cco.filter(src, dest); return dest; } } extensions/img/image4j/src/net/sf/image4j/util/ImageUtil.java000066400000000000000000000037141335566474600244060ustar00rootroot00000000000000/* * ImageUtil.java * * Created on 15 May 2006, 01:12 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package net.sf.image4j.util; import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.IndexColorModel; /** * Provides utility methods for handling images (java.awt.BufferedImage) * @author Ian McDonagh */ public class ImageUtil { /** * Creates a scaled copy of the source image. * @param src source image to be scaled * @param width the width for the new scaled image in pixels * @param height the height for the new scaled image in pixels * @return a copy of the source image scaled to width x height pixels. */ public static BufferedImage scaleImage(BufferedImage src, int width, int height) { Image scaled = src.getScaledInstance(width, height, 0); BufferedImage ret = null; /* ColorModel cm = src.getColorModel(); if (cm instanceof IndexColorModel) { ret = new BufferedImage( width, height, src.getType(), (IndexColorModel) cm ); } else { ret = new BufferedImage( src.getWidth(), src.getHeight(), src.getType() ); } Graphics2D g = ret.createGraphics(); //clear alpha channel Composite comp = g.getComposite(); g.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f)); Rectangle2D.Double d = new Rectangle2D.Double(0,0,ret.getWidth(),ret.getHeight()); g.fill(d); g.setComposite(comp); */ ret = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = ret.createGraphics(); //copy image g.drawImage(scaled, 0, 0, null); return ret; } } extensions/img/image4j/src/net/sf/image4j/util/package.html000066400000000000000000000003551335566474600241420ustar00rootroot00000000000000 Provides utilities for working with images, such as scaling and colour depth conversion. extensions/img/image4j/src/overview.html000066400000000000000000000020331335566474600207150ustar00rootroot00000000000000

The image4j library allows you to read and write certain image formats using only Java code.

All sub-packages under the codec package provide the implementation for a particular codec. The naming convension is as follows:

ElementDescription
package <codec>Package containing codec implementation
class <codec>DecoderDecoder class
class <codec>EncoderEncoder class

The Decoder and Encoder classes provide various static read and write methods respectively, which provide the functionality for decoding and encoding images.

extensions/json/000077500000000000000000000000001335566474600142515ustar00rootroot00000000000000extensions/json/README000066400000000000000000000011731335566474600151330ustar00rootroot00000000000000 09/Dec/2015 --------------------------------------------------------------------------------------------- Due to the "jsonevil" licensing issue reported by Lintian, the original JSON Java library by Douglas Crockford has been replaced in JClic by the Android Team's alternative implementation. See: - Original JSON Java library: * http://www.json.org/java/ - The "jsonevil" issue: * https://wiki.debian.org/qa.debian.org/jsonevil * https://en.wikipedia.org/wiki/Douglas_Crockford#.22Good.2C_not_Evil.22 - Android JSON library: * https://android.googlesource.com/platform/libcore/+/master/json/src/main/java/org/json extensions/json/build.xml000066400000000000000000000071371335566474600161020ustar00rootroot00000000000000 extensions/json/src/000077500000000000000000000000001335566474600150405ustar00rootroot00000000000000extensions/json/src/org/000077500000000000000000000000001335566474600156275ustar00rootroot00000000000000extensions/json/src/org/json/000077500000000000000000000000001335566474600166005ustar00rootroot00000000000000extensions/json/src/org/json/JSON.java000066400000000000000000000074541335566474600202260ustar00rootroot00000000000000/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.json; class JSON { /** * Returns the input if it is a JSON-permissible value; throws otherwise. */ static double checkDouble(double d) throws JSONException { if (Double.isInfinite(d) || Double.isNaN(d)) { throw new JSONException("Forbidden numeric value: " + d); } return d; } static Boolean toBoolean(Object value) { if (value instanceof Boolean) { return (Boolean) value; } else if (value instanceof String) { String stringValue = (String) value; if ("true".equalsIgnoreCase(stringValue)) { return true; } else if ("false".equalsIgnoreCase(stringValue)) { return false; } } return null; } static Double toDouble(Object value) { if (value instanceof Double) { return (Double) value; } else if (value instanceof Number) { return ((Number) value).doubleValue(); } else if (value instanceof String) { try { return Double.valueOf((String) value); } catch (NumberFormatException ignored) { } } return null; } static Integer toInteger(Object value) { if (value instanceof Integer) { return (Integer) value; } else if (value instanceof Number) { return ((Number) value).intValue(); } else if (value instanceof String) { try { return (int) Double.parseDouble((String) value); } catch (NumberFormatException ignored) { } } return null; } static Long toLong(Object value) { if (value instanceof Long) { return (Long) value; } else if (value instanceof Number) { return ((Number) value).longValue(); } else if (value instanceof String) { try { return (long) Double.parseDouble((String) value); } catch (NumberFormatException ignored) { } } return null; } static String toString(Object value) { if (value instanceof String) { return (String) value; } else if (value != null) { return String.valueOf(value); } return null; } public static JSONException typeMismatch(Object indexOrName, Object actual, String requiredType) throws JSONException { if (actual == null) { throw new JSONException("Value at " + indexOrName + " is null."); } else { throw new JSONException("Value " + actual + " at " + indexOrName + " of type " + actual.getClass().getName() + " cannot be converted to " + requiredType); } } public static JSONException typeMismatch(Object actual, String requiredType) throws JSONException { if (actual == null) { throw new JSONException("Value is null."); } else { throw new JSONException("Value " + actual + " of type " + actual.getClass().getName() + " cannot be converted to " + requiredType); } } } extensions/json/src/org/json/JSONArray.java000066400000000000000000000507031335566474600212200ustar00rootroot00000000000000/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.json; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; // Note: this class was written without inspecting the non-free org.json sourcecode. /** * A dense indexed sequence of values. Values may be any mix of * {@link JSONObject JSONObjects}, other {@link JSONArray JSONArrays}, Strings, * Booleans, Integers, Longs, Doubles, {@code null} or {@link JSONObject#NULL}. * Values may not be {@link Double#isNaN() NaNs}, {@link Double#isInfinite() * infinities}, or of any type not listed here. * *

{@code JSONArray} has the same type coercion behavior and * optional/mandatory accessors as {@link JSONObject}. See that class' * documentation for details. * *

Warning: this class represents null in two incompatible * ways: the standard Java {@code null} reference, and the sentinel value {@link * JSONObject#NULL}. In particular, {@code get} fails if the requested index * holds the null reference, but succeeds if it holds {@code JSONObject.NULL}. * *

Instances of this class are not thread safe. Although this class is * nonfinal, it was not designed for inheritance and should not be subclassed. * In particular, self-use by overridable methods is not specified. See * Effective Java Item 17, "Design and Document or inheritance or else * prohibit it" for further information. */ public class JSONArray { private final List values; /** * Creates a {@code JSONArray} with no values. */ public JSONArray() { values = new ArrayList(); } /** * Creates a new {@code JSONArray} by copying all values from the given * collection. * * @param copyFrom a collection whose values are of supported types. * Unsupported values are not permitted and will yield an array in an * inconsistent state. */ /* Accept a raw type for API compatibility */ public JSONArray(Collection copyFrom) { this(); if (copyFrom != null) { for (Iterator it = copyFrom.iterator(); it.hasNext();) { put(JSONObject.wrap(it.next())); } } } /** * Creates a new {@code JSONArray} with values from the next array in the * tokener. * * @param readFrom a tokener whose nextValue() method will yield a * {@code JSONArray}. * @throws JSONException if the parse fails or doesn't yield a * {@code JSONArray}. */ public JSONArray(JSONTokener readFrom) throws JSONException { /* * Getting the parser to populate this could get tricky. Instead, just * parse to temporary JSONArray and then steal the data from that. */ Object object = readFrom.nextValue(); if (object instanceof JSONArray) { values = ((JSONArray) object).values; } else { throw JSON.typeMismatch(object, "JSONArray"); } } /** * Creates a new {@code JSONArray} with values from the JSON string. * * @param json a JSON-encoded string containing an array. * @throws JSONException if the parse fails or doesn't yield a {@code * JSONArray}. */ public JSONArray(String json) throws JSONException { this(new JSONTokener(json)); } /** * Creates a new {@code JSONArray} with values from the given primitive array. */ public JSONArray(Object array) throws JSONException { if (!array.getClass().isArray()) { throw new JSONException("Not a primitive array: " + array.getClass()); } final int length = Array.getLength(array); values = new ArrayList(length); for (int i = 0; i < length; ++i) { put(JSONObject.wrap(Array.get(array, i))); } } /** * Returns the number of values in this array. */ public int length() { return values.size(); } /** * Appends {@code value} to the end of this array. * * @return this array. */ public JSONArray put(boolean value) { values.add(value); return this; } /** * Appends {@code value} to the end of this array. * * @param value a finite value. May not be {@link Double#isNaN() NaNs} or * {@link Double#isInfinite() infinities}. * @return this array. */ public JSONArray put(double value) throws JSONException { values.add(JSON.checkDouble(value)); return this; } /** * Appends {@code value} to the end of this array. * * @return this array. */ public JSONArray put(int value) { values.add(value); return this; } /** * Appends {@code value} to the end of this array. * * @return this array. */ public JSONArray put(long value) { values.add(value); return this; } /** * Appends {@code value} to the end of this array. * * @param value a {@link JSONObject}, {@link JSONArray}, {@link Collection}, String, Boolean, * Integer, Long, Double, {@link JSONObject#NULL}, or {@code null}. May * not be {@link Double#isNaN() NaNs} or {@link Double#isInfinite() * infinities}. Unsupported values are not permitted and will cause the * array to be in an inconsistent state. * @return this array. */ public JSONArray put(Object value) { // Modified 2015/12/10 by fbusquets // When 'value' is a Collection, add all its elements to 'values' if(value instanceof Collection){ Iterator it = ((Collection)value).iterator(); while(it.hasNext()){ values.add(it.next()); } } else { values.add(value); } return this; } /** * Same as {@link #put}, with added validity checks. */ void checkedPut(Object value) throws JSONException { if (value instanceof Number) { JSON.checkDouble(((Number) value).doubleValue()); } put(value); } /** * Sets the value at {@code index} to {@code value}, null padding this array * to the required length if necessary. If a value already exists at {@code * index}, it will be replaced. * * @return this array. */ public JSONArray put(int index, boolean value) throws JSONException { return put(index, (Boolean) value); } /** * Sets the value at {@code index} to {@code value}, null padding this array * to the required length if necessary. If a value already exists at {@code * index}, it will be replaced. * * @param value a finite value. May not be {@link Double#isNaN() NaNs} or * {@link Double#isInfinite() infinities}. * @return this array. */ public JSONArray put(int index, double value) throws JSONException { return put(index, (Double) value); } /** * Sets the value at {@code index} to {@code value}, null padding this array * to the required length if necessary. If a value already exists at {@code * index}, it will be replaced. * * @return this array. */ public JSONArray put(int index, int value) throws JSONException { return put(index, (Integer) value); } /** * Sets the value at {@code index} to {@code value}, null padding this array * to the required length if necessary. If a value already exists at {@code * index}, it will be replaced. * * @return this array. */ public JSONArray put(int index, long value) throws JSONException { return put(index, (Long) value); } /** * Sets the value at {@code index} to {@code value}, null padding this array * to the required length if necessary. If a value already exists at {@code * index}, it will be replaced. * * @param value a {@link JSONObject}, {@link JSONArray}, String, Boolean, * Integer, Long, Double, {@link JSONObject#NULL}, or {@code null}. May * not be {@link Double#isNaN() NaNs} or {@link Double#isInfinite() * infinities}. * @return this array. */ public JSONArray put(int index, Object value) throws JSONException { if (value instanceof Number) { // deviate from the original by checking all Numbers, not just floats & doubles JSON.checkDouble(((Number) value).doubleValue()); } while (values.size() <= index) { values.add(null); } values.set(index, value); return this; } /** * Returns true if this array has no value at {@code index}, or if its value * is the {@code null} reference or {@link JSONObject#NULL}. */ public boolean isNull(int index) { Object value = opt(index); return value == null || value == JSONObject.NULL; } /** * Returns the value at {@code index}. * * @throws JSONException if this array has no value at {@code index}, or if * that value is the {@code null} reference. This method returns * normally if the value is {@code JSONObject#NULL}. */ public Object get(int index) throws JSONException { try { Object value = values.get(index); if (value == null) { throw new JSONException("Value at " + index + " is null."); } return value; } catch (IndexOutOfBoundsException e) { throw new JSONException("Index " + index + " out of range [0.." + values.size() + ")"); } } /** * Returns the value at {@code index}, or null if the array has no value * at {@code index}. */ public Object opt(int index) { if (index < 0 || index >= values.size()) { return null; } return values.get(index); } /** * Removes and returns the value at {@code index}, or null if the array has no value * at {@code index}. */ public Object remove(int index) { if (index < 0 || index >= values.size()) { return null; } return values.remove(index); } /** * Returns the value at {@code index} if it exists and is a boolean or can * be coerced to a boolean. * * @throws JSONException if the value at {@code index} doesn't exist or * cannot be coerced to a boolean. */ public boolean getBoolean(int index) throws JSONException { Object object = get(index); Boolean result = JSON.toBoolean(object); if (result == null) { throw JSON.typeMismatch(index, object, "boolean"); } return result; } /** * Returns the value at {@code index} if it exists and is a boolean or can * be coerced to a boolean. Returns false otherwise. */ public boolean optBoolean(int index) { return optBoolean(index, false); } /** * Returns the value at {@code index} if it exists and is a boolean or can * be coerced to a boolean. Returns {@code fallback} otherwise. */ public boolean optBoolean(int index, boolean fallback) { Object object = opt(index); Boolean result = JSON.toBoolean(object); return result != null ? result : fallback; } /** * Returns the value at {@code index} if it exists and is a double or can * be coerced to a double. * * @throws JSONException if the value at {@code index} doesn't exist or * cannot be coerced to a double. */ public double getDouble(int index) throws JSONException { Object object = get(index); Double result = JSON.toDouble(object); if (result == null) { throw JSON.typeMismatch(index, object, "double"); } return result; } /** * Returns the value at {@code index} if it exists and is a double or can * be coerced to a double. Returns {@code NaN} otherwise. */ public double optDouble(int index) { return optDouble(index, Double.NaN); } /** * Returns the value at {@code index} if it exists and is a double or can * be coerced to a double. Returns {@code fallback} otherwise. */ public double optDouble(int index, double fallback) { Object object = opt(index); Double result = JSON.toDouble(object); return result != null ? result : fallback; } /** * Returns the value at {@code index} if it exists and is an int or * can be coerced to an int. * * @throws JSONException if the value at {@code index} doesn't exist or * cannot be coerced to a int. */ public int getInt(int index) throws JSONException { Object object = get(index); Integer result = JSON.toInteger(object); if (result == null) { throw JSON.typeMismatch(index, object, "int"); } return result; } /** * Returns the value at {@code index} if it exists and is an int or * can be coerced to an int. Returns 0 otherwise. */ public int optInt(int index) { return optInt(index, 0); } /** * Returns the value at {@code index} if it exists and is an int or * can be coerced to an int. Returns {@code fallback} otherwise. */ public int optInt(int index, int fallback) { Object object = opt(index); Integer result = JSON.toInteger(object); return result != null ? result : fallback; } /** * Returns the value at {@code index} if it exists and is a long or * can be coerced to a long. * * @throws JSONException if the value at {@code index} doesn't exist or * cannot be coerced to a long. */ public long getLong(int index) throws JSONException { Object object = get(index); Long result = JSON.toLong(object); if (result == null) { throw JSON.typeMismatch(index, object, "long"); } return result; } /** * Returns the value at {@code index} if it exists and is a long or * can be coerced to a long. Returns 0 otherwise. */ public long optLong(int index) { return optLong(index, 0L); } /** * Returns the value at {@code index} if it exists and is a long or * can be coerced to a long. Returns {@code fallback} otherwise. */ public long optLong(int index, long fallback) { Object object = opt(index); Long result = JSON.toLong(object); return result != null ? result : fallback; } /** * Returns the value at {@code index} if it exists, coercing it if * necessary. * * @throws JSONException if no such value exists. */ public String getString(int index) throws JSONException { Object object = get(index); String result = JSON.toString(object); if (result == null) { throw JSON.typeMismatch(index, object, "String"); } return result; } /** * Returns the value at {@code index} if it exists, coercing it if * necessary. Returns the empty string if no such value exists. */ public String optString(int index) { return optString(index, ""); } /** * Returns the value at {@code index} if it exists, coercing it if * necessary. Returns {@code fallback} if no such value exists. */ public String optString(int index, String fallback) { Object object = opt(index); String result = JSON.toString(object); return result != null ? result : fallback; } /** * Returns the value at {@code index} if it exists and is a {@code * JSONArray}. * * @throws JSONException if the value doesn't exist or is not a {@code * JSONArray}. */ public JSONArray getJSONArray(int index) throws JSONException { Object object = get(index); if (object instanceof JSONArray) { return (JSONArray) object; } else { throw JSON.typeMismatch(index, object, "JSONArray"); } } /** * Returns the value at {@code index} if it exists and is a {@code * JSONArray}. Returns null otherwise. */ public JSONArray optJSONArray(int index) { Object object = opt(index); return object instanceof JSONArray ? (JSONArray) object : null; } /** * Returns the value at {@code index} if it exists and is a {@code * JSONObject}. * * @throws JSONException if the value doesn't exist or is not a {@code * JSONObject}. */ public JSONObject getJSONObject(int index) throws JSONException { Object object = get(index); if (object instanceof JSONObject) { return (JSONObject) object; } else { throw JSON.typeMismatch(index, object, "JSONObject"); } } /** * Returns the value at {@code index} if it exists and is a {@code * JSONObject}. Returns null otherwise. */ public JSONObject optJSONObject(int index) { Object object = opt(index); return object instanceof JSONObject ? (JSONObject) object : null; } /** * Returns a new object whose values are the values in this array, and whose * names are the values in {@code names}. Names and values are paired up by * index from 0 through to the shorter array's length. Names that are not * strings will be coerced to strings. This method returns null if either * array is empty. */ public JSONObject toJSONObject(JSONArray names) throws JSONException { JSONObject result = new JSONObject(); int length = Math.min(names.length(), values.size()); if (length == 0) { return null; } for (int i = 0; i < length; i++) { String name = JSON.toString(names.opt(i)); result.put(name, opt(i)); } return result; } /** * Returns a new string by alternating this array's values with {@code * separator}. This array's string values are quoted and have their special * characters escaped. For example, the array containing the strings '12" * pizza', 'taco' and 'soda' joined on '+' returns this: *
"12\" pizza"+"taco"+"soda"
*/ public String join(String separator) throws JSONException { JSONStringer stringer = new JSONStringer(); stringer.open(JSONStringer.Scope.NULL, ""); for (int i = 0, size = values.size(); i < size; i++) { if (i > 0) { stringer.out.append(separator); } stringer.value(values.get(i)); } stringer.close(JSONStringer.Scope.NULL, JSONStringer.Scope.NULL, ""); return stringer.out.toString(); } /** * Encodes this array as a compact JSON string, such as: *
[94043,90210]
*/ @Override public String toString() { try { JSONStringer stringer = new JSONStringer(); writeTo(stringer); return stringer.toString(); } catch (JSONException e) { return null; } } /** * Encodes this array as a human readable JSON string for debugging, such * as: *
     * [
     *     94043,
     *     90210
     * ]
* * @param indentSpaces the number of spaces to indent for each level of * nesting. */ public String toString(int indentSpaces) throws JSONException { JSONStringer stringer = new JSONStringer(indentSpaces); writeTo(stringer); return stringer.toString(); } void writeTo(JSONStringer stringer) throws JSONException { stringer.array(); for (Object value : values) { stringer.value(value); } stringer.endArray(); } @Override public boolean equals(Object o) { return o instanceof JSONArray && ((JSONArray) o).values.equals(values); } @Override public int hashCode() { // diverge from the original, which doesn't implement hashCode return values.hashCode(); } } extensions/json/src/org/json/JSONException.java000066400000000000000000000031641335566474600220770ustar00rootroot00000000000000/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.json; // Note: this class was written without inspecting the non-free org.json sourcecode. /** * Thrown to indicate a problem with the JSON API. Such problems include: *
    *
  • Attempts to parse or construct malformed documents *
  • Use of null as a name *
  • Use of numeric types not available to JSON, such as {@link * Double#isNaN() NaNs} or {@link Double#isInfinite() infinities}. *
  • Lookups using an out of range index or nonexistent name *
  • Type mismatches on lookups *
* *

Although this is a checked exception, it is rarely recoverable. Most * callers should simply wrap this exception in an unchecked exception and * rethrow: *

  public JSONArray toJSONObject() {
 *     try {
 *         JSONObject result = new JSONObject();
 *         ...
 *     } catch (JSONException e) {
 *         throw new RuntimeException(e);
 *     }
 * }
*/ public class JSONException extends Exception { public JSONException(String s) { super(s); } } extensions/json/src/org/json/JSONObject.java000066400000000000000000000711301335566474600213450ustar00rootroot00000000000000/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.json; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; // Note: this class was written without inspecting the non-free org.json sourcecode. /** * A modifiable set of name/value mappings. Names are unique, non-null strings. * Values may be any mix of {@link JSONObject JSONObjects}, {@link JSONArray * JSONArrays}, Strings, Booleans, Integers, Longs, Doubles or {@link #NULL}. * Values may not be {@code null}, {@link Double#isNaN() NaNs}, {@link * Double#isInfinite() infinities}, or of any type not listed here. * *

This class can coerce values to another type when requested. *

* *

This class can look up both mandatory and optional values: *

    *
  • Use getType() to retrieve a mandatory value. This * fails with a {@code JSONException} if the requested name has no value * or if the value cannot be coerced to the requested type. *
  • Use optType() to retrieve an optional value. This * returns a system- or user-supplied default if the requested name has no * value or if the value cannot be coerced to the requested type. *
* *

Warning: this class represents null in two incompatible * ways: the standard Java {@code null} reference, and the sentinel value {@link * JSONObject#NULL}. In particular, calling {@code put(name, null)} removes the * named entry from the object but {@code put(name, JSONObject.NULL)} stores an * entry whose value is {@code JSONObject.NULL}. * *

Instances of this class are not thread safe. Although this class is * nonfinal, it was not designed for inheritance and should not be subclassed. * In particular, self-use by overrideable methods is not specified. See * Effective Java Item 17, "Design and Document or inheritance or else * prohibit it" for further information. */ public class JSONObject { private static final Double NEGATIVE_ZERO = -0d; /** * A sentinel value used to explicitly define a name with no value. Unlike * {@code null}, names with this value: *

    *
  • show up in the {@link #names} array *
  • show up in the {@link #keys} iterator *
  • return {@code true} for {@link #has(String)} *
  • do not throw on {@link #get(String)} *
  • are included in the encoded JSON string. *
* *

This value violates the general contract of {@link Object#equals} by * returning true when compared to {@code null}. Its {@link #toString} * method returns "null". */ public static final Object NULL = new Object() { @Override public boolean equals(Object o) { return o == this || o == null; // API specifies this broken equals implementation } @Override public String toString() { return "null"; } }; private final LinkedHashMap nameValuePairs; /** * Creates a {@code JSONObject} with no name/value mappings. */ public JSONObject() { nameValuePairs = new LinkedHashMap(); } /** * Creates a new {@code JSONObject} by copying all name/value mappings from * the given map. * * @param copyFrom a map whose keys are of type {@link String} and whose * values are of supported types. * @throws NullPointerException if any of the map's keys are null. */ /* (accept a raw type for API compatibility) */ public JSONObject(Map copyFrom) { this(); Map contentsTyped = (Map) copyFrom; for (Map.Entry entry : contentsTyped.entrySet()) { /* * Deviate from the original by checking that keys are non-null and * of the proper type. (We still defer validating the values). */ String key = (String) entry.getKey(); if (key == null) { throw new NullPointerException("key == null"); } nameValuePairs.put(key, wrap(entry.getValue())); } } /** * Creates a new {@code JSONObject} with name/value mappings from the next * object in the tokener. * * @param readFrom a tokener whose nextValue() method will yield a * {@code JSONObject}. * @throws JSONException if the parse fails or doesn't yield a * {@code JSONObject}. */ public JSONObject(JSONTokener readFrom) throws JSONException { /* * Getting the parser to populate this could get tricky. Instead, just * parse to temporary JSONObject and then steal the data from that. */ Object object = readFrom.nextValue(); if (object instanceof JSONObject) { this.nameValuePairs = ((JSONObject) object).nameValuePairs; } else { throw JSON.typeMismatch(object, "JSONObject"); } } /** * Creates a new {@code JSONObject} with name/value mappings from the JSON * string. * * @param json a JSON-encoded string containing an object. * @throws JSONException if the parse fails or doesn't yield a {@code * JSONObject}. */ public JSONObject(String json) throws JSONException { this(new JSONTokener(json)); } /** * Creates a new {@code JSONObject} by copying mappings for the listed names * from the given object. Names that aren't present in {@code copyFrom} will * be skipped. */ public JSONObject(JSONObject copyFrom, String[] names) throws JSONException { this(); for (String name : names) { Object value = copyFrom.opt(name); if (value != null) { nameValuePairs.put(name, value); } } } /** * Returns the number of name/value mappings in this object. */ public int length() { return nameValuePairs.size(); } /** * Maps {@code name} to {@code value}, clobbering any existing name/value * mapping with the same name. * * @return this object. */ public JSONObject put(String name, boolean value) throws JSONException { nameValuePairs.put(checkName(name), value); return this; } /** * Maps {@code name} to {@code value}, clobbering any existing name/value * mapping with the same name. * * @param value a finite value. May not be {@link Double#isNaN() NaNs} or * {@link Double#isInfinite() infinities}. * @return this object. */ public JSONObject put(String name, double value) throws JSONException { nameValuePairs.put(checkName(name), JSON.checkDouble(value)); return this; } /** * Maps {@code name} to {@code value}, clobbering any existing name/value * mapping with the same name. * * @return this object. */ public JSONObject put(String name, int value) throws JSONException { nameValuePairs.put(checkName(name), value); return this; } /** * Maps {@code name} to {@code value}, clobbering any existing name/value * mapping with the same name. * * @return this object. */ public JSONObject put(String name, long value) throws JSONException { nameValuePairs.put(checkName(name), value); return this; } /** * Maps {@code name} to {@code value}, clobbering any existing name/value * mapping with the same name. If the value is {@code null}, any existing * mapping for {@code name} is removed. * * @param value a {@link JSONObject}, {@link JSONArray}, String, Boolean, * Integer, Long, Double, {@link #NULL}, or {@code null}. May not be * {@link Double#isNaN() NaNs} or {@link Double#isInfinite() * infinities}. * @return this object. */ public JSONObject put(String name, Object value) throws JSONException { if (value == null) { nameValuePairs.remove(name); return this; } if (value instanceof Number) { // deviate from the original by checking all Numbers, not just floats & doubles JSON.checkDouble(((Number) value).doubleValue()); } nameValuePairs.put(checkName(name), value); return this; } /** * Equivalent to {@code put(name, value)} when both parameters are non-null; * does nothing otherwise. */ public JSONObject putOpt(String name, Object value) throws JSONException { if (name == null || value == null) { return this; } return put(name, value); } /** * Appends {@code value} to the array already mapped to {@code name}. If * this object has no mapping for {@code name}, this inserts a new mapping. * If the mapping exists but its value is not an array, the existing * and new values are inserted in order into a new array which is itself * mapped to {@code name}. In aggregate, this allows values to be added to a * mapping one at a time. * *

Note that {@code append(String, Object)} provides better semantics. * In particular, the mapping for {@code name} will always be a * {@link JSONArray}. Using {@code accumulate} will result in either a * {@link JSONArray} or a mapping whose type is the type of {@code value} * depending on the number of calls to it. * * @param value a {@link JSONObject}, {@link JSONArray}, String, Boolean, * Integer, Long, Double, {@link #NULL} or null. May not be {@link * Double#isNaN() NaNs} or {@link Double#isInfinite() infinities}. */ // TODO: Change {@code append) to {@link #append} when append is // unhidden. public JSONObject accumulate(String name, Object value) throws JSONException { Object current = nameValuePairs.get(checkName(name)); if (current == null) { return put(name, value); } if (current instanceof JSONArray) { JSONArray array = (JSONArray) current; array.checkedPut(value); } else { JSONArray array = new JSONArray(); array.checkedPut(current); array.checkedPut(value); nameValuePairs.put(name, array); } return this; } /** * Appends values to the array mapped to {@code name}. A new {@link JSONArray} * mapping for {@code name} will be inserted if no mapping exists. If the existing * mapping for {@code name} is not a {@link JSONArray}, a {@link JSONException} * will be thrown. * * @throws JSONException if {@code name} is {@code null} or if the mapping for * {@code name} is non-null and is not a {@link JSONArray}. * * @hide */ public JSONObject append(String name, Object value) throws JSONException { Object current = nameValuePairs.get(checkName(name)); final JSONArray array; if (current instanceof JSONArray) { array = (JSONArray) current; } else if (current == null) { JSONArray newArray = new JSONArray(); nameValuePairs.put(name, newArray); array = newArray; } else { throw new JSONException("Key " + name + " is not a JSONArray"); } array.checkedPut(value); return this; } String checkName(String name) throws JSONException { if (name == null) { throw new JSONException("Names must be non-null"); } return name; } /** * Removes the named mapping if it exists; does nothing otherwise. * * @return the value previously mapped by {@code name}, or null if there was * no such mapping. */ public Object remove(String name) { return nameValuePairs.remove(name); } /** * Returns true if this object has no mapping for {@code name} or if it has * a mapping whose value is {@link #NULL}. */ public boolean isNull(String name) { Object value = nameValuePairs.get(name); return value == null || value == NULL; } /** * Returns true if this object has a mapping for {@code name}. The mapping * may be {@link #NULL}. */ public boolean has(String name) { return nameValuePairs.containsKey(name); } /** * Returns the value mapped by {@code name}, or throws if no such mapping exists. * * @throws JSONException if no such mapping exists. */ public Object get(String name) throws JSONException { Object result = nameValuePairs.get(name); if (result == null) { throw new JSONException("No value for " + name); } return result; } /** * Returns the value mapped by {@code name}, or null if no such mapping * exists. */ public Object opt(String name) { return nameValuePairs.get(name); } /** * Returns the value mapped by {@code name} if it exists and is a boolean or * can be coerced to a boolean, or throws otherwise. * * @throws JSONException if the mapping doesn't exist or cannot be coerced * to a boolean. */ public boolean getBoolean(String name) throws JSONException { Object object = get(name); Boolean result = JSON.toBoolean(object); if (result == null) { throw JSON.typeMismatch(name, object, "boolean"); } return result; } /** * Returns the value mapped by {@code name} if it exists and is a boolean or * can be coerced to a boolean, or false otherwise. */ public boolean optBoolean(String name) { return optBoolean(name, false); } /** * Returns the value mapped by {@code name} if it exists and is a boolean or * can be coerced to a boolean, or {@code fallback} otherwise. */ public boolean optBoolean(String name, boolean fallback) { Object object = opt(name); Boolean result = JSON.toBoolean(object); return result != null ? result : fallback; } /** * Returns the value mapped by {@code name} if it exists and is a double or * can be coerced to a double, or throws otherwise. * * @throws JSONException if the mapping doesn't exist or cannot be coerced * to a double. */ public double getDouble(String name) throws JSONException { Object object = get(name); Double result = JSON.toDouble(object); if (result == null) { throw JSON.typeMismatch(name, object, "double"); } return result; } /** * Returns the value mapped by {@code name} if it exists and is a double or * can be coerced to a double, or {@code NaN} otherwise. */ public double optDouble(String name) { return optDouble(name, Double.NaN); } /** * Returns the value mapped by {@code name} if it exists and is a double or * can be coerced to a double, or {@code fallback} otherwise. */ public double optDouble(String name, double fallback) { Object object = opt(name); Double result = JSON.toDouble(object); return result != null ? result : fallback; } /** * Returns the value mapped by {@code name} if it exists and is an int or * can be coerced to an int, or throws otherwise. * * @throws JSONException if the mapping doesn't exist or cannot be coerced * to an int. */ public int getInt(String name) throws JSONException { Object object = get(name); Integer result = JSON.toInteger(object); if (result == null) { throw JSON.typeMismatch(name, object, "int"); } return result; } /** * Returns the value mapped by {@code name} if it exists and is an int or * can be coerced to an int, or 0 otherwise. */ public int optInt(String name) { return optInt(name, 0); } /** * Returns the value mapped by {@code name} if it exists and is an int or * can be coerced to an int, or {@code fallback} otherwise. */ public int optInt(String name, int fallback) { Object object = opt(name); Integer result = JSON.toInteger(object); return result != null ? result : fallback; } /** * Returns the value mapped by {@code name} if it exists and is a long or * can be coerced to a long, or throws otherwise. * Note that JSON represents numbers as doubles, * so this is lossy; use strings to transfer numbers via JSON. * * @throws JSONException if the mapping doesn't exist or cannot be coerced * to a long. */ public long getLong(String name) throws JSONException { Object object = get(name); Long result = JSON.toLong(object); if (result == null) { throw JSON.typeMismatch(name, object, "long"); } return result; } /** * Returns the value mapped by {@code name} if it exists and is a long or * can be coerced to a long, or 0 otherwise. Note that JSON represents numbers as doubles, * so this is lossy; use strings to transfer numbers via JSON. */ public long optLong(String name) { return optLong(name, 0L); } /** * Returns the value mapped by {@code name} if it exists and is a long or * can be coerced to a long, or {@code fallback} otherwise. Note that JSON represents * numbers as doubles, so this is lossy; use strings to transfer * numbers via JSON. */ public long optLong(String name, long fallback) { Object object = opt(name); Long result = JSON.toLong(object); return result != null ? result : fallback; } /** * Returns the value mapped by {@code name} if it exists, coercing it if * necessary, or throws if no such mapping exists. * * @throws JSONException if no such mapping exists. */ public String getString(String name) throws JSONException { Object object = get(name); String result = JSON.toString(object); if (result == null) { throw JSON.typeMismatch(name, object, "String"); } return result; } /** * Returns the value mapped by {@code name} if it exists, coercing it if * necessary, or the empty string if no such mapping exists. */ public String optString(String name) { return optString(name, ""); } /** * Returns the value mapped by {@code name} if it exists, coercing it if * necessary, or {@code fallback} if no such mapping exists. */ public String optString(String name, String fallback) { Object object = opt(name); String result = JSON.toString(object); return result != null ? result : fallback; } /** * Returns the value mapped by {@code name} if it exists and is a {@code * JSONArray}, or throws otherwise. * * @throws JSONException if the mapping doesn't exist or is not a {@code * JSONArray}. */ public JSONArray getJSONArray(String name) throws JSONException { Object object = get(name); if (object instanceof JSONArray) { return (JSONArray) object; } else { throw JSON.typeMismatch(name, object, "JSONArray"); } } /** * Returns the value mapped by {@code name} if it exists and is a {@code * JSONArray}, or null otherwise. */ public JSONArray optJSONArray(String name) { Object object = opt(name); return object instanceof JSONArray ? (JSONArray) object : null; } /** * Returns the value mapped by {@code name} if it exists and is a {@code * JSONObject}, or throws otherwise. * * @throws JSONException if the mapping doesn't exist or is not a {@code * JSONObject}. */ public JSONObject getJSONObject(String name) throws JSONException { Object object = get(name); if (object instanceof JSONObject) { return (JSONObject) object; } else { throw JSON.typeMismatch(name, object, "JSONObject"); } } /** * Returns the value mapped by {@code name} if it exists and is a {@code * JSONObject}, or null otherwise. */ public JSONObject optJSONObject(String name) { Object object = opt(name); return object instanceof JSONObject ? (JSONObject) object : null; } /** * Returns an array with the values corresponding to {@code names}. The * array contains null for names that aren't mapped. This method returns * null if {@code names} is either null or empty. */ public JSONArray toJSONArray(JSONArray names) throws JSONException { JSONArray result = new JSONArray(); if (names == null) { return null; } int length = names.length(); if (length == 0) { return null; } for (int i = 0; i < length; i++) { String name = JSON.toString(names.opt(i)); result.put(opt(name)); } return result; } /** * Returns an iterator of the {@code String} names in this object. The * returned iterator supports {@link Iterator#remove() remove}, which will * remove the corresponding mapping from this object. If this object is * modified after the iterator is returned, the iterator's behavior is * undefined. The order of the keys is undefined. */ public Iterator keys() { return nameValuePairs.keySet().iterator(); } /** * Returns the set of {@code String} names in this object. The returned set * is a view of the keys in this object. {@link Set#remove(Object)} will remove * the corresponding mapping from this object and set iterator behaviour * is undefined if this object is modified after it is returned. * * See {@link #keys()}. * * @hide. */ public Set keySet() { return nameValuePairs.keySet(); } /** * Returns an array containing the string names in this object. This method * returns null if this object contains no mappings. */ public JSONArray names() { return nameValuePairs.isEmpty() ? null : new JSONArray(new ArrayList(nameValuePairs.keySet())); } /** * Encodes this object as a compact JSON string, such as: *

{"query":"Pizza","locations":[94043,90210]}
*/ @Override public String toString() { try { JSONStringer stringer = new JSONStringer(); writeTo(stringer); return stringer.toString(); } catch (JSONException e) { return null; } } /** * Encodes this object as a human readable JSON string for debugging, such * as: *
     * {
     *     "query": "Pizza",
     *     "locations": [
     *         94043,
     *         90210
     *     ]
     * }
* * @param indentSpaces the number of spaces to indent for each level of * nesting. */ public String toString(int indentSpaces) throws JSONException { JSONStringer stringer = new JSONStringer(indentSpaces); writeTo(stringer); return stringer.toString(); } void writeTo(JSONStringer stringer) throws JSONException { stringer.object(); for (Map.Entry entry : nameValuePairs.entrySet()) { stringer.key(entry.getKey()).value(entry.getValue()); } stringer.endObject(); } /** * Encodes the number as a JSON string. * * @param number a finite value. May not be {@link Double#isNaN() NaNs} or * {@link Double#isInfinite() infinities}. */ public static String numberToString(Number number) throws JSONException { if (number == null) { throw new JSONException("Number must be non-null"); } double doubleValue = number.doubleValue(); JSON.checkDouble(doubleValue); // the original returns "-0" instead of "-0.0" for negative zero if (number.equals(NEGATIVE_ZERO)) { return "-0"; } long longValue = number.longValue(); if (doubleValue == (double) longValue) { return Long.toString(longValue); } return number.toString(); } /** * Encodes {@code data} as a JSON string. This applies quotes and any * necessary character escaping. * * @param data the string to encode. Null will be interpreted as an empty * string. */ public static String quote(String data) { if (data == null) { return "\"\""; } try { JSONStringer stringer = new JSONStringer(); stringer.open(JSONStringer.Scope.NULL, ""); stringer.value(data); stringer.close(JSONStringer.Scope.NULL, JSONStringer.Scope.NULL, ""); return stringer.toString(); } catch (JSONException e) { throw new AssertionError(); } } /** * Wraps the given object if necessary. * *

If the object is null or , returns {@link #NULL}. * If the object is a {@code JSONArray} or {@code JSONObject}, no wrapping is necessary. * If the object is {@code NULL}, no wrapping is necessary. * If the object is an array or {@code Collection}, returns an equivalent {@code JSONArray}. * If the object is a {@code Map}, returns an equivalent {@code JSONObject}. * If the object is a primitive wrapper type or {@code String}, returns the object. * Otherwise if the object is from a {@code java} package, returns the result of {@code toString}. * If wrapping fails, returns null. */ public static Object wrap(Object o) { if (o == null) { return NULL; } if (o instanceof JSONArray || o instanceof JSONObject) { return o; } if (o.equals(NULL)) { return o; } try { if (o instanceof Collection) { return new JSONArray((Collection) o); } else if (o.getClass().isArray()) { return new JSONArray(o); } if (o instanceof Map) { return new JSONObject((Map) o); } if (o instanceof Boolean || o instanceof Byte || o instanceof Character || o instanceof Double || o instanceof Float || o instanceof Integer || o instanceof Long || o instanceof Short || o instanceof String) { return o; } if (o.getClass().getPackage().getName().startsWith("java.")) { return o.toString(); } } catch (Exception ignored) { } return null; } } extensions/json/src/org/json/JSONStringer.java000066400000000000000000000324551335566474600217430ustar00rootroot00000000000000/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.json; import java.util.ArrayList; import java.util.Arrays; import java.util.List; // Note: this class was written without inspecting the non-free org.json sourcecode. /** * Implements {@link JSONObject#toString} and {@link JSONArray#toString}. Most * application developers should use those methods directly and disregard this * API. For example:

 * JSONObject object = ...
 * String json = object.toString();
* *

Stringers only encode well-formed JSON strings. In particular: *

    *
  • The stringer must have exactly one top-level array or object. *
  • Lexical scopes must be balanced: every call to {@link #array} must * have a matching call to {@link #endArray} and every call to {@link * #object} must have a matching call to {@link #endObject}. *
  • Arrays may not contain keys (property names). *
  • Objects must alternate keys (property names) and values. *
  • Values are inserted with either literal {@link #value(Object) value} * calls, or by nesting arrays or objects. *
* Calls that would result in a malformed JSON string will fail with a * {@link JSONException}. * *

This class provides no facility for pretty-printing (ie. indenting) * output. To encode indented output, use {@link JSONObject#toString(int)} or * {@link JSONArray#toString(int)}. * *

Some implementations of the API support at most 20 levels of nesting. * Attempts to create more than 20 levels of nesting may fail with a {@link * JSONException}. * *

Each stringer may be used to encode a single top level value. Instances of * this class are not thread safe. Although this class is nonfinal, it was not * designed for inheritance and should not be subclassed. In particular, * self-use by overrideable methods is not specified. See Effective Java * Item 17, "Design and Document or inheritance or else prohibit it" for further * information. */ public class JSONStringer { /** The output data, containing at most one top-level array or object. */ final StringBuilder out = new StringBuilder(); /** * Lexical scoping elements within this stringer, necessary to insert the * appropriate separator characters (ie. commas and colons) and to detect * nesting errors. */ enum Scope { /** * An array with no elements requires no separators or newlines before * it is closed. */ EMPTY_ARRAY, /** * A array with at least one value requires a comma and newline before * the next element. */ NONEMPTY_ARRAY, /** * An object with no keys or values requires no separators or newlines * before it is closed. */ EMPTY_OBJECT, /** * An object whose most recent element is a key. The next element must * be a value. */ DANGLING_KEY, /** * An object with at least one name/value pair requires a comma and * newline before the next element. */ NONEMPTY_OBJECT, /** * A special bracketless array needed by JSONStringer.join() and * JSONObject.quote() only. Not used for JSON encoding. */ NULL, } /** * Unlike the original implementation, this stack isn't limited to 20 * levels of nesting. */ private final List stack = new ArrayList(); /** * A string containing a full set of spaces for a single level of * indentation, or null for no pretty printing. */ private final String indent; public JSONStringer() { indent = null; } JSONStringer(int indentSpaces) { char[] indentChars = new char[indentSpaces]; Arrays.fill(indentChars, ' '); indent = new String(indentChars); } /** * Begins encoding a new array. Each call to this method must be paired with * a call to {@link #endArray}. * * @return this stringer. */ public JSONStringer array() throws JSONException { return open(Scope.EMPTY_ARRAY, "["); } /** * Ends encoding the current array. * * @return this stringer. */ public JSONStringer endArray() throws JSONException { return close(Scope.EMPTY_ARRAY, Scope.NONEMPTY_ARRAY, "]"); } /** * Begins encoding a new object. Each call to this method must be paired * with a call to {@link #endObject}. * * @return this stringer. */ public JSONStringer object() throws JSONException { return open(Scope.EMPTY_OBJECT, "{"); } /** * Ends encoding the current object. * * @return this stringer. */ public JSONStringer endObject() throws JSONException { return close(Scope.EMPTY_OBJECT, Scope.NONEMPTY_OBJECT, "}"); } /** * Enters a new scope by appending any necessary whitespace and the given * bracket. */ JSONStringer open(Scope empty, String openBracket) throws JSONException { if (stack.isEmpty() && out.length() > 0) { throw new JSONException("Nesting problem: multiple top-level roots"); } beforeValue(); stack.add(empty); out.append(openBracket); return this; } /** * Closes the current scope by appending any necessary whitespace and the * given bracket. */ JSONStringer close(Scope empty, Scope nonempty, String closeBracket) throws JSONException { Scope context = peek(); if (context != nonempty && context != empty) { throw new JSONException("Nesting problem"); } stack.remove(stack.size() - 1); if (context == nonempty) { newline(); } out.append(closeBracket); return this; } /** * Returns the value on the top of the stack. */ private Scope peek() throws JSONException { if (stack.isEmpty()) { throw new JSONException("Nesting problem"); } return stack.get(stack.size() - 1); } /** * Replace the value on the top of the stack with the given value. */ private void replaceTop(Scope topOfStack) { stack.set(stack.size() - 1, topOfStack); } /** * Encodes {@code value}. * * @param value a {@link JSONObject}, {@link JSONArray}, String, Boolean, * Integer, Long, Double or null. May not be {@link Double#isNaN() NaNs} * or {@link Double#isInfinite() infinities}. * @return this stringer. */ public JSONStringer value(Object value) throws JSONException { if (stack.isEmpty()) { throw new JSONException("Nesting problem"); } if (value instanceof JSONArray) { ((JSONArray) value).writeTo(this); return this; } else if (value instanceof JSONObject) { ((JSONObject) value).writeTo(this); return this; } beforeValue(); if (value == null || value instanceof Boolean || value == JSONObject.NULL) { out.append(value); } else if (value instanceof Number) { out.append(JSONObject.numberToString((Number) value)); } else { string(value.toString()); } return this; } /** * Encodes {@code value} to this stringer. * * @return this stringer. */ public JSONStringer value(boolean value) throws JSONException { if (stack.isEmpty()) { throw new JSONException("Nesting problem"); } beforeValue(); out.append(value); return this; } /** * Encodes {@code value} to this stringer. * * @param value a finite value. May not be {@link Double#isNaN() NaNs} or * {@link Double#isInfinite() infinities}. * @return this stringer. */ public JSONStringer value(double value) throws JSONException { if (stack.isEmpty()) { throw new JSONException("Nesting problem"); } beforeValue(); out.append(JSONObject.numberToString(value)); return this; } /** * Encodes {@code value} to this stringer. * * @return this stringer. */ public JSONStringer value(long value) throws JSONException { if (stack.isEmpty()) { throw new JSONException("Nesting problem"); } beforeValue(); out.append(value); return this; } private void string(String value) { out.append("\""); for (int i = 0, length = value.length(); i < length; i++) { char c = value.charAt(i); /* * From RFC 4627, "All Unicode characters may be placed within the * quotation marks except for the characters that must be escaped: * quotation mark, reverse solidus, and the control characters * (U+0000 through U+001F)." */ switch (c) { case '"': case '\\': out.append('\\').append(c); break; // Modified 2015/12/10 by fbusquets: // Avoid unnecessary escape of '/' // See: http://stackoverflow.com/questions/1580647/json-why-are-forward-slashes-escaped case '/': if(i>0 && value.charAt(i-1)=='<') out.append('\\'); out.append(c); break; case '\t': out.append("\\t"); break; case '\b': out.append("\\b"); break; case '\n': out.append("\\n"); break; case '\r': out.append("\\r"); break; case '\f': out.append("\\f"); break; default: if (c <= 0x1F) { out.append(String.format("\\u%04x", (int) c)); } else { out.append(c); } break; } } out.append("\""); } private void newline() { if (indent == null) { return; } out.append("\n"); for (int i = 0; i < stack.size(); i++) { out.append(indent); } } /** * Encodes the key (property name) to this stringer. * * @param name the name of the forthcoming value. May not be null. * @return this stringer. */ public JSONStringer key(String name) throws JSONException { if (name == null) { throw new JSONException("Names must be non-null"); } beforeKey(); string(name); return this; } /** * Inserts any necessary separators and whitespace before a name. Also * adjusts the stack to expect the key's value. */ private void beforeKey() throws JSONException { Scope context = peek(); if (context == Scope.NONEMPTY_OBJECT) { // first in object out.append(','); } else if (context != Scope.EMPTY_OBJECT) { // not in an object! throw new JSONException("Nesting problem"); } newline(); replaceTop(Scope.DANGLING_KEY); } /** * Inserts any necessary separators and whitespace before a literal value, * inline array, or inline object. Also adjusts the stack to expect either a * closing bracket or another element. */ private void beforeValue() throws JSONException { if (stack.isEmpty()) { return; } Scope context = peek(); if (context == Scope.EMPTY_ARRAY) { // first in array replaceTop(Scope.NONEMPTY_ARRAY); newline(); } else if (context == Scope.NONEMPTY_ARRAY) { // another in array out.append(','); newline(); } else if (context == Scope.DANGLING_KEY) { // value for key out.append(indent == null ? ":" : ": "); replaceTop(Scope.NONEMPTY_OBJECT); } else if (context != Scope.NULL) { throw new JSONException("Nesting problem"); } } /** * Returns the encoded JSON string. * *

If invoked with unterminated arrays or unclosed objects, this method's * return value is undefined. * *

Warning: although it contradicts the general contract * of {@link Object#toString}, this method returns null if the stringer * contains no data. */ @Override public String toString() { return out.length() == 0 ? null : out.toString(); } } extensions/json/src/org/json/JSONTokener.java000066400000000000000000000502131335566474600215450ustar00rootroot00000000000000/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.json; // Note: this class was written without inspecting the non-free org.json sourcecode. /** * Parses a JSON (RFC 4627) * encoded string into the corresponding object. Most clients of * this class will use only need the {@link #JSONTokener(String) constructor} * and {@link #nextValue} method. Example usage:

 * String json = "{"
 *         + "  \"query\": \"Pizza\", "
 *         + "  \"locations\": [ 94043, 90210 ] "
 *         + "}";
 *
 * JSONObject object = (JSONObject) new JSONTokener(json).nextValue();
 * String query = object.getString("query");
 * JSONArray locations = object.getJSONArray("locations");
* *

For best interoperability and performance use JSON that complies with * RFC 4627, such as that generated by {@link JSONStringer}. For legacy reasons * this parser is lenient, so a successful parse does not indicate that the * input string was valid JSON. All of the following syntax errors will be * ignored: *

    *
  • End of line comments starting with {@code //} or {@code #} and ending * with a newline character. *
  • C-style comments starting with {@code /*} and ending with * {@code *}{@code /}. Such comments may not be nested. *
  • Strings that are unquoted or {@code 'single quoted'}. *
  • Hexadecimal integers prefixed with {@code 0x} or {@code 0X}. *
  • Octal integers prefixed with {@code 0}. *
  • Array elements separated by {@code ;}. *
  • Unnecessary array separators. These are interpreted as if null was the * omitted value. *
  • Key-value pairs separated by {@code =} or {@code =>}. *
  • Key-value pairs separated by {@code ;}. *
* *

Each tokener may be used to parse a single JSON string. Instances of this * class are not thread safe. Although this class is nonfinal, it was not * designed for inheritance and should not be subclassed. In particular, * self-use by overrideable methods is not specified. See Effective Java * Item 17, "Design and Document or inheritance or else prohibit it" for further * information. */ public class JSONTokener { /** The input JSON. */ private final String in; /** * The index of the next character to be returned by {@link #next}. When * the input is exhausted, this equals the input's length. */ private int pos; /** * @param in JSON encoded string. Null is not permitted and will yield a * tokener that throws {@code NullPointerExceptions} when methods are * called. */ public JSONTokener(String in) { // consume an optional byte order mark (BOM) if it exists if (in != null && in.startsWith("\ufeff")) { in = in.substring(1); } this.in = in; } /** * Returns the next value from the input. * * @return a {@link JSONObject}, {@link JSONArray}, String, Boolean, * Integer, Long, Double or {@link JSONObject#NULL}. * @throws JSONException if the input is malformed. */ public Object nextValue() throws JSONException { int c = nextCleanInternal(); switch (c) { case -1: throw syntaxError("End of input"); case '{': return readObject(); case '[': return readArray(); case '\'': case '"': return nextString((char) c); default: pos--; return readLiteral(); } } private int nextCleanInternal() throws JSONException { while (pos < in.length()) { int c = in.charAt(pos++); switch (c) { case '\t': case ' ': case '\n': case '\r': continue; case '/': if (pos == in.length()) { return c; } char peek = in.charAt(pos); switch (peek) { case '*': // skip a /* c-style comment */ pos++; int commentEnd = in.indexOf("*/", pos); if (commentEnd == -1) { throw syntaxError("Unterminated comment"); } pos = commentEnd + 2; continue; case '/': // skip a // end-of-line comment pos++; skipToEndOfLine(); continue; default: return c; } case '#': /* * Skip a # hash end-of-line comment. The JSON RFC doesn't * specify this behavior, but it's required to parse * existing documents. See http://b/2571423. */ skipToEndOfLine(); continue; default: return c; } } return -1; } /** * Advances the position until after the next newline character. If the line * is terminated by "\r\n", the '\n' must be consumed as whitespace by the * caller. */ private void skipToEndOfLine() { for (; pos < in.length(); pos++) { char c = in.charAt(pos); if (c == '\r' || c == '\n') { pos++; break; } } } /** * Returns the string up to but not including {@code quote}, unescaping any * character escape sequences encountered along the way. The opening quote * should have already been read. This consumes the closing quote, but does * not include it in the returned string. * * @param quote either ' or ". */ public String nextString(char quote) throws JSONException { /* * For strings that are free of escape sequences, we can just extract * the result as a substring of the input. But if we encounter an escape * sequence, we need to use a StringBuilder to compose the result. */ StringBuilder builder = null; /* the index of the first character not yet appended to the builder. */ int start = pos; while (pos < in.length()) { int c = in.charAt(pos++); if (c == quote) { if (builder == null) { // a new string avoids leaking memory return new String(in.substring(start, pos - 1)); } else { builder.append(in, start, pos - 1); return builder.toString(); } } if (c == '\\') { if (pos == in.length()) { throw syntaxError("Unterminated escape sequence"); } if (builder == null) { builder = new StringBuilder(); } builder.append(in, start, pos - 1); builder.append(readEscapeCharacter()); start = pos; } } throw syntaxError("Unterminated string"); } /** * Unescapes the character identified by the character or characters that * immediately follow a backslash. The backslash '\' should have already * been read. This supports both unicode escapes "u000A" and two-character * escapes "\n". */ private char readEscapeCharacter() throws JSONException { char escaped = in.charAt(pos++); switch (escaped) { case 'u': if (pos + 4 > in.length()) { throw syntaxError("Unterminated escape sequence"); } String hex = in.substring(pos, pos + 4); pos += 4; try { return (char) Integer.parseInt(hex, 16); } catch (NumberFormatException nfe) { throw syntaxError("Invalid escape sequence: " + hex); } case 't': return '\t'; case 'b': return '\b'; case 'n': return '\n'; case 'r': return '\r'; case 'f': return '\f'; case '\'': case '"': case '\\': default: return escaped; } } /** * Reads a null, boolean, numeric or unquoted string literal value. Numeric * values will be returned as an Integer, Long, or Double, in that order of * preference. */ private Object readLiteral() throws JSONException { String literal = nextToInternal("{}[]/\\:,=;# \t\f"); if (literal.length() == 0) { throw syntaxError("Expected literal value"); } else if ("null".equalsIgnoreCase(literal)) { return JSONObject.NULL; } else if ("true".equalsIgnoreCase(literal)) { return Boolean.TRUE; } else if ("false".equalsIgnoreCase(literal)) { return Boolean.FALSE; } /* try to parse as an integral type... */ if (literal.indexOf('.') == -1) { int base = 10; String number = literal; if (number.startsWith("0x") || number.startsWith("0X")) { number = number.substring(2); base = 16; } else if (number.startsWith("0") && number.length() > 1) { number = number.substring(1); base = 8; } try { long longValue = Long.parseLong(number, base); if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) { return (int) longValue; } else { return longValue; } } catch (NumberFormatException e) { /* * This only happens for integral numbers greater than * Long.MAX_VALUE, numbers in exponential form (5e-10) and * unquoted strings. Fall through to try floating point. */ } } /* ...next try to parse as a floating point... */ try { return Double.valueOf(literal); } catch (NumberFormatException ignored) { } /* ... finally give up. We have an unquoted string */ return new String(literal); // a new string avoids leaking memory } /** * Returns the string up to but not including any of the given characters or * a newline character. This does not consume the excluded character. */ private String nextToInternal(String excluded) { int start = pos; for (; pos < in.length(); pos++) { char c = in.charAt(pos); if (c == '\r' || c == '\n' || excluded.indexOf(c) != -1) { return in.substring(start, pos); } } return in.substring(start); } /** * Reads a sequence of key/value pairs and the trailing closing brace '}' of * an object. The opening brace '{' should have already been read. */ private JSONObject readObject() throws JSONException { JSONObject result = new JSONObject(); /* Peek to see if this is the empty object. */ int first = nextCleanInternal(); if (first == '}') { return result; } else if (first != -1) { pos--; } while (true) { Object name = nextValue(); if (!(name instanceof String)) { if (name == null) { throw syntaxError("Names cannot be null"); } else { throw syntaxError("Names must be strings, but " + name + " is of type " + name.getClass().getName()); } } /* * Expect the name/value separator to be either a colon ':', an * equals sign '=', or an arrow "=>". The last two are bogus but we * include them because that's what the original implementation did. */ int separator = nextCleanInternal(); if (separator != ':' && separator != '=') { throw syntaxError("Expected ':' after " + name); } if (pos < in.length() && in.charAt(pos) == '>') { pos++; } result.put((String) name, nextValue()); switch (nextCleanInternal()) { case '}': return result; case ';': case ',': continue; default: throw syntaxError("Unterminated object"); } } } /** * Reads a sequence of values and the trailing closing brace ']' of an * array. The opening brace '[' should have already been read. Note that * "[]" yields an empty array, but "[,]" returns a two-element array * equivalent to "[null,null]". */ private JSONArray readArray() throws JSONException { JSONArray result = new JSONArray(); /* to cover input that ends with ",]". */ boolean hasTrailingSeparator = false; while (true) { switch (nextCleanInternal()) { case -1: throw syntaxError("Unterminated array"); case ']': if (hasTrailingSeparator) { result.put(null); } return result; case ',': case ';': /* A separator without a value first means "null". */ result.put(null); hasTrailingSeparator = true; continue; default: pos--; } result.put(nextValue()); switch (nextCleanInternal()) { case ']': return result; case ',': case ';': hasTrailingSeparator = true; continue; default: throw syntaxError("Unterminated array"); } } } /** * Returns an exception containing the given message plus the current * position and the entire input string. */ public JSONException syntaxError(String message) { return new JSONException(message + this); } /** * Returns the current position and the entire input string. */ @Override public String toString() { // consistent with the original implementation return " at character " + pos + " of " + in; } /* * Legacy APIs. * * None of the methods below are on the critical path of parsing JSON * documents. They exist only because they were exposed by the original * implementation and may be used by some clients. */ /** * Returns true until the input has been exhausted. */ public boolean more() { return pos < in.length(); } /** * Returns the next available character, or the null character '\0' if all * input has been exhausted. The return value of this method is ambiguous * for JSON strings that contain the character '\0'. */ public char next() { return pos < in.length() ? in.charAt(pos++) : '\0'; } /** * Returns the next available character if it equals {@code c}. Otherwise an * exception is thrown. */ public char next(char c) throws JSONException { char result = next(); if (result != c) { throw syntaxError("Expected " + c + " but was " + result); } return result; } /** * Returns the next character that is not whitespace and does not belong to * a comment. If the input is exhausted before such a character can be * found, the null character '\0' is returned. The return value of this * method is ambiguous for JSON strings that contain the character '\0'. */ public char nextClean() throws JSONException { int nextCleanInt = nextCleanInternal(); return nextCleanInt == -1 ? '\0' : (char) nextCleanInt; } /** * Returns the next {@code length} characters of the input. * *

The returned string shares its backing character array with this * tokener's input string. If a reference to the returned string may be held * indefinitely, you should use {@code new String(result)} to copy it first * to avoid memory leaks. * * @throws JSONException if the remaining input is not long enough to * satisfy this request. */ public String next(int length) throws JSONException { if (pos + length > in.length()) { throw syntaxError(length + " is out of bounds"); } String result = in.substring(pos, pos + length); pos += length; return result; } /** * Returns the {@link String#trim trimmed} string holding the characters up * to but not including the first of: *

    *
  • any character in {@code excluded} *
  • a newline character '\n' *
  • a carriage return '\r' *
* *

The returned string shares its backing character array with this * tokener's input string. If a reference to the returned string may be held * indefinitely, you should use {@code new String(result)} to copy it first * to avoid memory leaks. * * @return a possibly-empty string */ public String nextTo(String excluded) { if (excluded == null) { throw new NullPointerException("excluded == null"); } return nextToInternal(excluded).trim(); } /** * Equivalent to {@code nextTo(String.valueOf(excluded))}. */ public String nextTo(char excluded) { return nextToInternal(String.valueOf(excluded)).trim(); } /** * Advances past all input up to and including the next occurrence of * {@code thru}. If the remaining input doesn't contain {@code thru}, the * input is exhausted. */ public void skipPast(String thru) { int thruStart = in.indexOf(thru, pos); pos = thruStart == -1 ? in.length() : (thruStart + thru.length()); } /** * Advances past all input up to but not including the next occurrence of * {@code to}. If the remaining input doesn't contain {@code to}, the input * is unchanged. */ public char skipTo(char to) { int index = in.indexOf(to, pos); if (index != -1) { pos = index; return to; } else { return '\0'; } } /** * Unreads the most recent character of input. If no input characters have * been read, the input is unchanged. */ public void back() { if (--pos == -1) { pos = 0; } } /** * Returns the integer [0..15] value for the given hex character, or -1 * for non-hex input. * * @param hex a character in the ranges [0-9], [A-F] or [a-f]. Any other * character will yield a -1 result. */ public static int dehexchar(char hex) { if (hex >= '0' && hex <= '9') { return hex - '0'; } else if (hex >= 'A' && hex <= 'F') { return hex - 'A' + 10; } else if (hex >= 'a' && hex <= 'f') { return hex - 'a' + 10; } else { return -1; } } } extensions/soundspi/000077500000000000000000000000001335566474600151445ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/000077500000000000000000000000001335566474600173725ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/CHANGES.txt000066400000000000000000000112321335566474600212020ustar00rootroot00000000000000 MP3SPI 1.9.1 JavaZOOM 1999-2004 Project Homepage : http://www.javazoom.net/mp3spi/mp3spi.html JAVA and MP3 online Forums : http://www.javazoom.net/services/forums/index.jsp ----------------------------------------------------- 05/03/2004: MP3SPI 1.9.1 ------------------------ - Shoutcast stream meta-data (title, url) added. See DecodedMpegAudioInputStream : mp3.shoutcast.metadata.key [String], Shoutcast meta key with matching value. For instance : mp3.shoutcast.metadata.StreamTitle=Current song playing in stream. mp3.shoutcast.metadata.StreamUrl=Url info. - Icecast 2.0 icy-metaint support added. 04/05/2004: MP3SPI 1.9 ---------------------- - Shoutcast ICY meta-data support added. (jicylib classes included). - ID3v1 support added. - Audio parameters could be read through AudioFileFormat.properties() and AudioFormat.properties(). Here are all audio parameters provided by MP3 SPI : AudioFormat parameters : ~~~~~~~~~~~~~~~~~~~~~~ - bitrate : [Integer], bitrate in bits per seconds, average bitrate for VBR enabled stream. - vbr : [Boolean], VBR flag AudioFileFormat parameters : ~~~~~~~~~~~~~~~~~~~~~~~~~~ + Standard parameters : - duration : [Long], duration in microseconds. - title : [String], Title of the stream. - author : [String], Name of the artist of the stream. - album : [String], Name of the album of the stream. - date : [String], The date (year) of the recording or release of the stream. - copyright : [String], Copyright message of the stream. - comment : [String], Comment of the stream. + Extended MP3 parameters : - mp3.version.mpeg : [String], mpeg version : 1,2 or 2.5 - mp3.version.layer : [String], layer version 1, 2 or 3 - mp3.version.encoding : [String], mpeg encoding : MPEG1, MPEG2-LSF, MPEG2.5-LSF - mp3.channels : [Integer], number of channels 1 : mono, 2 : stereo. - mp3.frequency.hz : [Integer], sampling rate in hz. - mp3.bitrate.nominal.bps : [Integer], nominal bitrate in bps. - mp3.length.bytes : [Integer], length in bytes. - mp3.length.frames : [Integer], length in frames. - mp3.framesize.bytes : [Integer], framesize of the first frame. framesize is not constant for VBR streams. - mp3.framerate.fps : [Float], framerate in frames per seconds. - mp3.header.pos : [Integer], position of first audio header (or ID3v2 size). - mp3.vbr : [Boolean], vbr flag. - mp3.vbr.scale : [Integer], vbr scale. - mp3.crc : [Boolean], crc flag. - mp3.original : [Boolean], original flag. - mp3.copyright : [Boolean], copyright flag. - mp3.padding : [Boolean], padding flag. - mp3.mode : [Integer], mode 0:STEREO 1:JOINT_STEREO 2:DUAL_CHANNEL 3:SINGLE_CHANNEL - mp3.id3tag.genre : [String], ID3 tag (v1 or v2) genre. - mp3.id3tag.track : [String], ID3 tag (v1 or v2) track info. - mp3.id3tagv2 : [InputStream], ID3v2 frames. - mp3.shoutcast.metadata.key : [String], Shoutcast meta key with matching value. For instance : mp3.shoutcast.metadata.icy-irc=#shoutcast mp3.shoutcast.metadata.icy-metaint=8192 mp3.shoutcast.metadata.icy-genre=Trance Techno Dance mp3.shoutcast.metadata.icy-url=http://www.di.fm and so on ... DecodedMpegAudioInputStream parameters : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - mp3.frame : [Long], current frame position. - mp3.frame.bitrate : [Integer], bitrate of the current frame. - mp3.frame.size.bytes : [Integer], size in bytes of the current frame. - mp3.position.byte : [Long], current position in bytes in the stream. - mp3.position.microseconds : [Long], elapsed microseconds. - mp3.equalizer : float[32], interactive equalizer array, values could be in [-1.0, +1.0]. 02/01/2004: MP3SPI 1.8 ---------------------- Initial official release. It targets J2SE 1.3 and J2SE 1.4. It includes a workaround to get audio properties (duration, title, author, bitrate, vbr, ...) that will be available in JDK 1.5. It provides "static" MP3 format properties such as (mp3.version.mpeg, mp3.version.layer, mp3.id3tagv2, ...). The mp3.id3tagv2 property allows to get all ID3v2 frames. MP3SPI also provides "dynamic" MP3 properties for each frame played such as (mp3.frame , mp3.frame.bitrate, mp3.frame.size.bytes, mp3.equalizer, ...). The mp3.equalizer property allows to have equalizer feature. Notes : ----- MP3SPI needs JavaLayer and Tritonus libraries to work. extensions/soundspi/MpegAudioSPI/LICENSE.txt000066400000000000000000000634761335566474600212350ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! extensions/soundspi/MpegAudioSPI/README.txt000066400000000000000000000051321335566474600210710ustar00rootroot00000000000000 MP3SPI 1.9.1 JavaZOOM 1999-2004 Project Homepage : http://www.javazoom.net/mp3spi/mp3spi.html JAVA and MP3 online Forums : http://www.javazoom.net/services/forums/index.jsp ----------------------------------------------------- DESCRIPTION : ----------- MP3SPI is a SPI (Service Provider Interface) that adds MP3 support for JavaSound. It allows to play MPEG 1/2/2.5 Layer 1/2/3 files thanks to underlying JavaLayer and Tritonus libraries. This is a non-commercial project and anyone can add his contribution. MP3SPI is licensed under LGPL (see LICENSE.txt). FAQ : --- - How to install MP3SPI ? Before running MP3SPI you must set PATH and CLASSPATH for JAVA and you must add jl0.4.jar, tritonus_share.jar and mp3spi1.9.1.jar to the CLASSPATH. - Do I need JMF to run MP3SPI player ? No, JMF is not required. You just need a JVM JavaSound 1.0 compliant. (i.e. JVM1.3 or higher). However, MP3SPI is not JMF compliant. - Does MP3SPI support streaming ? Yes, it has been successfully tested with ShoutCast streaming server. - Does MP3SPI support MPEG 2.5 ? Yes, MP3SPI includes same features as JavaLayer. - Does MP3SPI support VBR ? Yes, It supports XING VBR header too. - How to get ID3v2 tags from MP3SPI API ? MP3SPI exposes many audio properties such as ID3v2 frames, VBR, bitrate ... See online examples from MP3SPI homepage to learn how to get them. - How to skip frames to have a seek feature ? Call skip(long bytes) on AudioInputStream. - How to run jUnit tests ? See ANT script included (ant test). You need to update test.mp3.properties file with the audio properties of the MP3 you want to use for testing. You could generate test.mp3.properties by uncommenting //out=System.out in jUnit test sources. - How much memory/CPU MP3SPI needs to run ? Here are our benchmark notes : - Heap use range : 1380KB to 1900KB - 370 classes loaded. - Footprint : ~8MB under WinNT4/Win2K + J2SE 1.3 (Hotspot). ~10MB under WinNT4/Win2K + J2SE 1.4.1 (Hotspot). - CPU usage : ~12% under PIII 800Mhz/WinNT4+J2SE 1.3 (Hotspot). ~8% under PIII 1Ghz/Win2K+J2SE 1.3.1 (Hotspot). ~12% under PIII 1Ghz/Win2K+J2SE 1.4.1 (Hotspot). - How to contact MP3SPI developers ? Try to post a thread on Java&MP3 online forums at : http://www.javazoom.net/services/forums/index.jsp You can also contact us at mp3spi@javazoom.net for contributions. KNOWN PROBLEMS : -------------- 99% of MP3 plays well with JavaLayer but some (1%) return an ArrayIndexOutOfBoundsException while playing. It's a bug (hard to fix) in the underlying JavaLayer decoder.extensions/soundspi/MpegAudioSPI/src/000077500000000000000000000000001335566474600201615ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/000077500000000000000000000000001335566474600220075ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/spi/000077500000000000000000000000001335566474600226025ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/spi/PropertiesContainer.java000066400000000000000000000021251335566474600274440ustar00rootroot00000000000000/* * PropertiesContainer. * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi; import java.util.Map; public interface PropertiesContainer { public Map properties(); } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/000077500000000000000000000000001335566474600235325ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/000077500000000000000000000000001335566474600251575ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/convert/000077500000000000000000000000001335566474600266375ustar00rootroot00000000000000DecodedMpegAudioInputStream.java000066400000000000000000000234031335566474600347430ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/convert/* * DecodedMpegAudioInputStream. * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *------------------------------------------------------------------------ */ package javazoom.spi.mpeg.sampled.convert; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.BitstreamException; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.DecoderException; import javazoom.jl.decoder.Equalizer; import javazoom.jl.decoder.Header; import javazoom.jl.decoder.Obuffer; import javazoom.spi.PropertiesContainer; import javazoom.spi.mpeg.sampled.file.IcyListener; import javazoom.spi.mpeg.sampled.file.tag.TagParseEvent; import javazoom.spi.mpeg.sampled.file.tag.TagParseListener; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.convert.TAsynchronousFilteredAudioInputStream; /** * Main decoder. */ public class DecodedMpegAudioInputStream extends TAsynchronousFilteredAudioInputStream implements PropertiesContainer, TagParseListener { private InputStream m_encodedStream; private Bitstream m_bitstream; private Decoder m_decoder; private Equalizer m_equalizer; private float[] m_equalizer_values; private Header m_header; private DMAISObuffer m_oBuffer; // Bytes info. private long byteslength = -1; private long currentByte = 0; // Frame info. private int frameslength = -1; private long currentFrame = 0; private int currentFramesize = 0; private int currentBitrate = -1; // Time info. private long currentMicrosecond = 0; // Shoutcast stream info private IcyListener shoutlst = null; private HashMap properties = null; public DecodedMpegAudioInputStream(AudioFormat outputFormat, AudioInputStream inputStream) { super(outputFormat, -1); if (TDebug.TraceAudioConverter) { TDebug.out(">DecodedMpegAudioInputStream(AudioFormat outputFormat, AudioInputStream inputStream)"); } try { // Try to find out inputstream length to allow skip. byteslength = inputStream.available(); } catch (IOException e) { TDebug.out("DecodedMpegAudioInputStream : Cannot run inputStream.available() : "+e.getMessage()); byteslength = -1; } m_encodedStream = inputStream; shoutlst = IcyListener.getInstance(); shoutlst.reset(); m_bitstream = new Bitstream(inputStream); m_decoder = new Decoder(null); m_equalizer = new Equalizer(); m_equalizer_values = new float[32]; for (int b=0;b 0)) frameslength = m_header.max_number_of_frames((int)byteslength); } catch (BitstreamException e) { TDebug.out("DecodedMpegAudioInputStream : Cannot read first frame : "+e.getMessage()); byteslength = -1; } properties = new HashMap(); } /** * Return dynamic properties. * *

    *
  • mp3.frame [Long], current frame position. *
  • mp3.frame.bitrate [Integer], bitrate of the current frame. *
  • mp3.frame.size.bytes [Integer], size in bytes of the current frame. *
  • mp3.position.byte [Long], current position in bytes in the stream. *
  • mp3.position.microseconds [Long], elapsed microseconds. *
  • mp3.equalizer float[32], interactive equalizer array, values could be in [-1.0, +1.0]. *
  • mp3.shoutcast.metadata.key [String], Shoutcast meta key with matching value. *
    For instance : *
    mp3.shoutcast.metadata.StreamTitle=Current song playing in stream. *
    mp3.shoutcast.metadata.StreamUrl=Url info. *
*/ public Map properties() { properties.put("mp3.frame",new Long(currentFrame)); properties.put("mp3.frame.bitrate",new Integer(currentBitrate)); properties.put("mp3.frame.size.bytes",new Integer(currentFramesize)); properties.put("mp3.position.byte",new Long(currentByte)); properties.put("mp3.position.microseconds",new Long(currentMicrosecond)); properties.put("mp3.equalizer",m_equalizer_values); // Optionnal shoutcast stream meta-data. if (shoutlst != null) { String surl = shoutlst.getStreamUrl(); String stitle = shoutlst.getStreamTitle(); if ((stitle != null) && (stitle.trim().length()>0)) properties.put("mp3.shoutcast.metadata.StreamTitle",stitle); if ((surl != null) && (surl.trim().length()>0)) properties.put("mp3.shoutcast.metadata.StreamUrl",surl); } return properties; } public void execute() { if (TDebug.TraceAudioConverter) TDebug.out("execute() : begin"); try { // Following line hangs when FrameSize is available in AudioFormat. Header header = null; if (m_header == null) header = m_bitstream.readFrame(); else header = m_header; if (TDebug.TraceAudioConverter) TDebug.out("execute() : header = "+header); if (header == null) { if (TDebug.TraceAudioConverter) { TDebug.out("header is null (end of mpeg stream)"); } getCircularBuffer().close(); return; } currentFrame++; currentBitrate = header.bitrate_instant(); currentFramesize = header.calculate_framesize(); currentByte = currentByte + currentFramesize; currentMicrosecond = (long) (currentFrame* header.ms_per_frame()*1000.0f); for (int b=0;b 0) && (frameslength > 0)) { float ratio = bytes*1.0f/byteslength*1.0f; long bytesread = skipFrames((long) (ratio*frameslength)); currentByte = currentByte + bytesread; return bytesread; } else return -1; } /** * Skip frames. * You don't need to call it severals times, it will exactly skip given frames number. * @param frames * @return bytes length skipped matching to frames skipped. */ public long skipFrames(long frames) { if (TDebug.TraceAudioConverter) TDebug.out("skip(long frames) : begin"); int framesRead = 0; int bytesReads = 0; try { for (int i=0;i>> 8) & 0xFF); bSecondByte = (byte) (sValue & 0xFF); } else // little endian { bFirstByte = (byte) (sValue & 0xFF); bSecondByte = (byte) ((sValue >>> 8) & 0xFF); } m_abBuffer[m_anBufferPointers[nChannel]] = bFirstByte; m_abBuffer[m_anBufferPointers[nChannel] + 1] = bSecondByte; m_anBufferPointers[nChannel] += m_nChannels * 2; } public void set_stop_flag() { } public void close() { } public void write_buffer(int nValue) { } public void clear_buffer() { } public byte[] getBuffer() { return m_abBuffer; } public int getCurrentBufferSize() { return m_anBufferPointers[0]; } public void reset() { for (int i = 0; i < m_nChannels; i++) { /* Points to byte location, * implicitely assuming 16 bit * samples. */ m_anBufferPointers[i] = i * 2; } } } public void tagParsed(TagParseEvent tpe) { System.out.println("TAG:"+tpe.getTag()); } } MpegFormatConversionProvider.java000066400000000000000000000075741335566474600352620ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/convert/* * MpegFormatConversionProvider. * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * * --------------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * -------------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.convert; import java.util.Arrays; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javazoom.spi.mpeg.sampled.file.MpegEncoding; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.sampled.convert.TEncodingFormatConversionProvider; /** * ConversionProvider for MPEG files. */ public class MpegFormatConversionProvider extends TEncodingFormatConversionProvider { private static final AudioFormat.Encoding MP3 = Encodings.getEncoding("MP3"); private static final AudioFormat.Encoding PCM_SIGNED = Encodings.getEncoding("PCM_SIGNED"); private static final AudioFormat[] INPUT_FORMATS = { // mono new AudioFormat(MP3, -1.0F, -1, 1, -1, -1.0F, false), new AudioFormat(MP3, -1.0F, -1, 1, -1, -1.0F, true), // stereo new AudioFormat(MP3, -1.0F, -1, 2, -1, -1.0F, false), new AudioFormat(MP3, -1.0F, -1, 2, -1, -1.0F, true), }; private static final AudioFormat[] OUTPUT_FORMATS = { // mono, 16 bit signed new AudioFormat(PCM_SIGNED, -1.0F, 16, 1, 2, -1.0F, false), new AudioFormat(PCM_SIGNED, -1.0F, 16, 1, 2, -1.0F, true), // stereo, 16 bit signed new AudioFormat(PCM_SIGNED, -1.0F, 16, 2, 4, -1.0F, false), new AudioFormat(PCM_SIGNED, -1.0F, 16, 2, 4, -1.0F, true), }; /** * Constructor. */ public MpegFormatConversionProvider() { super(Arrays.asList(INPUT_FORMATS), Arrays.asList(OUTPUT_FORMATS)); if (TDebug.TraceAudioConverter) { TDebug.out(">MpegFormatConversionProvider()"); } } public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream audioInputStream) { if (TDebug.TraceAudioConverter) { TDebug.out(">MpegFormatConversionProvider.getAudioInputStream(AudioFormat targetFormat, AudioInputStream audioInputStream):"); } return new DecodedMpegAudioInputStream(targetFormat, audioInputStream); } /** * Add conversion support for any MpegEncoding source with FrameRate or FrameSize not empty. * @param targetFormat * @param sourceFormat * @return */ public boolean isConversionSupported(AudioFormat targetFormat, AudioFormat sourceFormat) { if (TDebug.TraceAudioConverter) { TDebug.out(">MpegFormatConversionProvider.isConversionSupported(AudioFormat targetFormat, AudioFormat sourceFormat):"); TDebug.out("checking if conversion possible"); TDebug.out("from: " + sourceFormat); TDebug.out("to: " + targetFormat); } boolean conversion = super.isConversionSupported(targetFormat, sourceFormat); if (conversion == false) { AudioFormat.Encoding enc = sourceFormat.getEncoding(); if (enc instanceof MpegEncoding) { if ((sourceFormat.getFrameRate() != AudioSystem.NOT_SPECIFIED) || (sourceFormat.getFrameSize() != AudioSystem.NOT_SPECIFIED)) { conversion = true; } } } return conversion; } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/000077500000000000000000000000001335566474600260765ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/IcyListener.java000066400000000000000000000054621335566474600312020ustar00rootroot00000000000000/* * IcyListener. * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file; import javazoom.spi.mpeg.sampled.file.tag.MP3Tag; import javazoom.spi.mpeg.sampled.file.tag.TagParseEvent; import javazoom.spi.mpeg.sampled.file.tag.TagParseListener; /** * This class (singleton) allow to be notified on shoutcast meta data * while playing the stream (such as song title). */ public class IcyListener implements TagParseListener { private static IcyListener instance = null; private MP3Tag lastTag = null; private String streamTitle = null; private String streamUrl = null; private IcyListener() { super(); } public static synchronized IcyListener getInstance() { if (instance == null) { instance = new IcyListener(); } return instance; } /* (non-Javadoc) * @see javazoom.spi.mpeg.sampled.file.tag.TagParseListener#tagParsed(javazoom.spi.mpeg.sampled.file.tag.TagParseEvent) */ public void tagParsed(TagParseEvent tpe) { lastTag = tpe.getTag(); String name = lastTag.getName(); if ((name != null) && (name.equalsIgnoreCase("streamtitle"))) { streamTitle = (String) lastTag.getValue(); } else if ((name != null) && (name.equalsIgnoreCase("streamurl"))) { streamUrl = (String) lastTag.getValue(); } } /** * @return */ public MP3Tag getLastTag() { return lastTag; } /** * @param tag */ public void setLastTag(MP3Tag tag) { lastTag = tag; } /** * @return */ public String getStreamTitle() { return streamTitle; } /** * @return */ public String getStreamUrl() { return streamUrl; } /** * @param string */ public void setStreamTitle(String string) { streamTitle = string; } /** * @param string */ public void setStreamUrl(String string) { streamUrl = string; } /** * Reset all properties. */ public void reset() { lastTag = null; streamTitle = null; streamUrl = null; } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/MpegAudioFileFormat.java000066400000000000000000000100701335566474600325620ustar00rootroot00000000000000/* * MpegAudioFileFormat. * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file; import java.util.Map; import javax.sound.sampled.AudioFormat; import org.tritonus.share.sampled.file.TAudioFileFormat; /** * @author JavaZOOM */ public class MpegAudioFileFormat extends TAudioFileFormat { /** * Contructor. * @param type * @param audioFormat * @param nLengthInFrames * @param nLengthInBytes */ public MpegAudioFileFormat(Type type, AudioFormat audioFormat, int nLengthInFrames, int nLengthInBytes, Map properties) { super(type, audioFormat, nLengthInFrames, nLengthInBytes, properties); } /** * MP3 audio file format parameters. * Some parameters might be unavailable. So availability test is required before reading any parameter. * *
AudioFileFormat parameters. *
    *
  • duration [Long], duration in microseconds. *
  • title [String], Title of the stream. *
  • author [String], Name of the artist of the stream. *
  • album [String], Name of the album of the stream. *
  • date [String], The date (year) of the recording or release of the stream. *
  • copyright [String], Copyright message of the stream. *
  • comment [String], Comment of the stream. *
*
MP3 parameters. *
    *
  • mp3.version.mpeg [String], mpeg version : 1,2 or 2.5 *
  • mp3.version.layer [String], layer version 1, 2 or 3 *
  • mp3.version.encoding [String], mpeg encoding : MPEG1, MPEG2-LSF, MPEG2.5-LSF *
  • mp3.channels [Integer], number of channels 1 : mono, 2 : stereo. *
  • mp3.frequency.hz [Integer], sampling rate in hz. *
  • mp3.bitrate.nominal.bps [Integer], nominal bitrate in bps. *
  • mp3.length.bytes [Integer], length in bytes. *
  • mp3.length.frames [Integer], length in frames. *
  • mp3.framesize.bytes [Integer], framesize of the first frame. framesize is not constant for VBR streams. *
  • mp3.framerate.fps [Float], framerate in frames per seconds. *
  • mp3.header.pos [Integer], position of first audio header (or ID3v2 size). *
  • mp3.vbr [Boolean], vbr flag. *
  • mp3.vbr.scale [Integer], vbr scale. *
  • mp3.crc [Boolean], crc flag. *
  • mp3.original [Boolean], original flag. *
  • mp3.copyright [Boolean], copyright flag. *
  • mp3.padding [Boolean], padding flag. *
  • mp3.mode [Integer], mode 0:STEREO 1:JOINT_STEREO 2:DUAL_CHANNEL 3:SINGLE_CHANNEL *
  • mp3.id3tag.genre [String], ID3 tag (v1 or v2) genre. *
  • mp3.id3tag.track [String], ID3 tag (v1 or v2) track info. *
  • mp3.id3tagv2 [InputStream], ID3v2 frames. *
  • mp3.shoutcast.metadata.key [String], Shoutcast meta key with matching value. *
    For instance : *
    mp3.shoutcast.metadata.icy-irc=#shoutcast *
    mp3.shoutcast.metadata.icy-metaint=8192 *
    mp3.shoutcast.metadata.icy-genre=Trance Techno Dance *
    mp3.shoutcast.metadata.icy-url=http://www.di.fm *
    and so on ... *
*/ public Map properties() { return super.properties(); } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/MpegAudioFileReader.java000066400000000000000000000541771335566474600325540ustar00rootroot00000000000000/* * MpegAudioFileReader. * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.Header; import javazoom.spi.mpeg.sampled.file.tag.IcyInputStream; import javazoom.spi.mpeg.sampled.file.tag.MP3Tag; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.file.TAudioFileReader; /** * This class implements AudioFileReader for MP3 SPI. */ public class MpegAudioFileReader extends TAudioFileReader { private final int SYNC = 0xFFE00000; private final AudioFormat.Encoding[][] sm_aEncodings = { {MpegEncoding.MPEG2L1, MpegEncoding.MPEG2L2, MpegEncoding.MPEG2L3}, {MpegEncoding.MPEG1L1, MpegEncoding.MPEG1L2, MpegEncoding.MPEG1L3}, {MpegEncoding.MPEG2DOT5L1, MpegEncoding.MPEG2DOT5L2, MpegEncoding.MPEG2DOT5L3}, }; private static final int INITAL_READ_LENGTH = 64000; private static final int MARK_LIMIT = INITAL_READ_LENGTH + 1; private static final String[] id3v1genres = { "Blues" , "Classic Rock" , "Country" , "Dance" , "Disco" , "Funk" , "Grunge" , "Hip-Hop" , "Jazz" , "Metal" , "New Age" , "Oldies" , "Other" , "Pop" , "R&B" , "Rap" , "Reggae" , "Rock" , "Techno" , "Industrial" , "Alternative" , "Ska" , "Death Metal" , "Pranks" , "Soundtrack" , "Euro-Techno" , "Ambient" , "Trip-Hop" , "Vocal" , "Jazz+Funk" , "Fusion" , "Trance" , "Classical" , "Instrumental" , "Acid" , "House" , "Game" , "Sound Clip" , "Gospel" , "Noise" , "AlternRock" , "Bass" , "Soul" , "Punk" , "Space" , "Meditative" , "Instrumental Pop" , "Instrumental Rock" , "Ethnic" , "Gothic" , "Darkwave" , "Techno-Industrial" , "Electronic" , "Pop-Folk" , "Eurodance" , "Dream" , "Southern Rock" , "Comedy" , "Cult" , "Gangsta" , "Top 40" , "Christian Rap" , "Pop/Funk" , "Jungle" , "Native American" , "Cabaret" , "New Wave" , "Psychadelic" , "Rave" , "Showtunes" , "Trailer" , "Lo-Fi" , "Tribal" , "Acid Punk" , "Acid Jazz" , "Polka" , "Retro" , "Musical" , "Rock & Roll" , "Hard Rock" , "Folk" , "Folk-Rock" , "National Folk" , "Swing" , "Fast Fusion" , "Bebob" , "Latin" , "Revival" , "Celtic" , "Bluegrass" , "Avantgarde" , "Gothic Rock" , "Progressive Rock" , "Psychedelic Rock" , "Symphonic Rock" , "Slow Rock" , "Big Band" , "Chorus" , "Easy Listening" , "Acoustic" , "Humour" , "Speech" , "Chanson" , "Opera" , "Chamber Music" , "Sonata" , "Symphony" , "Booty Brass" , "Primus" , "Porn Groove" , "Satire" , "Slow Jam" , "Club" , "Tango" , "Samba" , "Folklore" , "Ballad" , "Power Ballad" , "Rhythmic Soul" , "Freestyle" , "Duet" , "Punk Rock" , "Drum Solo" , "A Capela" , "Euro-House" , "Dance Hall" , "Goa" , "Drum & Bass" , "Club-House" , "Hardcore" , "Terror" , "Indie" , "BritPop" , "Negerpunk" , "Polsk Punk" , "Beat" , "Christian Gangsta Rap" , "Heavy Metal" , "Black Metal" , "Crossover" , "Contemporary Christian" , "Christian Rock" , "Merengue" , "Salsa" , "Thrash Metal" , "Anime" , "JPop" , "SynthPop" }; public MpegAudioFileReader() { super(MARK_LIMIT, true); if (TDebug.TraceAudioFileReader) TDebug.out(">MpegAudioFileReader()"); } /** * Returns AudioFileFormat from File. */ @Override public AudioFileFormat getAudioFileFormat(File file) throws UnsupportedAudioFileException, IOException { return super.getAudioFileFormat(file); } /** * Returns AudioFileFormat from URL. */ @Override public AudioFileFormat getAudioFileFormat(URL url) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("MpegAudioFileReader.getAudioFileFormat(URL): begin"); } long lFileLengthInBytes = AudioSystem.NOT_SPECIFIED; URLConnection conn = url.openConnection(); // Tell shoucast server (if any) that SPI support shoutcast stream. conn.setRequestProperty ("Icy-Metadata", "1"); InputStream inputStream = conn.getInputStream(); AudioFileFormat audioFileFormat = null; try { audioFileFormat = getAudioFileFormat(inputStream, lFileLengthInBytes); } finally { inputStream.close(); } if (TDebug.TraceAudioFileReader) {TDebug.out("MpegAudioFileReader.getAudioFileFormat(URL): end"); } return audioFileFormat; } /** * Returns AudioFileFormat from inputstream and medialength. */ public AudioFileFormat getAudioFileFormat(InputStream inputStream, long mediaLength) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) TDebug.out(">MpegAudioFileReader.getAudioFileFormat(InputStream inputStream, long mediaLength): begin"); HashMap aff_properties = new HashMap(); HashMap af_properties = new HashMap(); int mLength = (int) mediaLength; int size = inputStream.available(); PushbackInputStream pis = new PushbackInputStream(inputStream, MARK_LIMIT); byte head[] = new byte[12]; pis.read(head); if (TDebug.TraceAudioFileReader) { TDebug.out("InputStream : "+inputStream + " =>" + new String(head)); } /* * Check for WAV, AU, and AIFF file formats. * * Next check for Shoutcast (supported) and OGG (unsupported) streams. * * Note -- the check for WAV files will reject Broadcast WAV files. * This may be incorrect as broadcast WAV files may contain MPEG data. * Need to investigate. * */ if ((head[0] == 'R') && (head[1] == 'I') && (head[2] == 'F') && (head[3] == 'F') && (head[8] == 'W') && (head[9] == 'A') && (head[10] == 'V') && (head[11] == 'E')) { if (TDebug.TraceAudioFileReader) TDebug.out("WAV stream found"); throw new UnsupportedAudioFileException("WAV stream found"); } else if ((head[0] == '.') && (head[1] == 's') && (head[2] == 'n') && (head[3] == 'd')) { if (TDebug.TraceAudioFileReader) TDebug.out("AU stream found"); throw new UnsupportedAudioFileException("AU stream found"); } else if ((head[0] == 'F') && (head[1] == 'O') && (head[2] == 'R') && (head[3] == 'M') && (head[8] == 'A') && (head[9] == 'I') && (head[10] == 'F') && (head[11] == 'F')) { if (TDebug.TraceAudioFileReader) TDebug.out("AIFF stream found"); throw new UnsupportedAudioFileException("AIFF stream found"); } // Shoutcast stream ? else if (((head[0] == 'I') | (head[0] == 'i')) && ((head[1] == 'C') | (head[1] == 'c')) && ((head[2] == 'Y') | (head[2] == 'y'))) { pis.unread(head); // Load shoutcast meta data. loadShoutcastInfo(pis, aff_properties); } // Ogg stream ? else if (((head[0] == 'O') | (head[0] == 'o')) && ((head[1] == 'G') | (head[1] == 'g')) && ((head[2] == 'G') | (head[2] == 'g'))) { if (TDebug.TraceAudioFileReader) TDebug.out("Ogg stream found"); throw new UnsupportedAudioFileException("Ogg stream found"); } // No, so pushback. else { pis.unread(head); } // MPEG header info. int nVersion; // = AudioSystem.NOT_SPECIFIED; int nLayer; // = AudioSystem.NOT_SPECIFIED; // int nSFIndex = AudioSystem.NOT_SPECIFIED; int nMode;// = AudioSystem.NOT_SPECIFIED; int FrameSize; // = AudioSystem.NOT_SPECIFIED; //int nFrameSize = AudioSystem.NOT_SPECIFIED; int nFrequency = AudioSystem.NOT_SPECIFIED; int nTotalFrames = AudioSystem.NOT_SPECIFIED; float FrameRate = AudioSystem.NOT_SPECIFIED; int BitRate; // = AudioSystem.NOT_SPECIFIED; int nChannels = AudioSystem.NOT_SPECIFIED; int nHeader = AudioSystem.NOT_SPECIFIED; int nTotalMS; // = AudioSystem.NOT_SPECIFIED; boolean nVBR; // = false; AudioFormat.Encoding encoding = null; try { Bitstream m_bitstream = new Bitstream(pis); aff_properties.put("mp3.header.pos",new Integer(m_bitstream.header_pos())); Header m_header = m_bitstream.readFrame(); // nVersion = 0 => MPEG2-LSF (Including MPEG2.5), nVersion = 1 => MPEG1 nVersion = m_header.version(); if (nVersion == 2) aff_properties.put("mp3.version.mpeg",Float.toString(2.5f)); else aff_properties.put("mp3.version.mpeg",Integer.toString(2-nVersion)); // nLayer = 1,2,3 nLayer = m_header.layer(); aff_properties.put("mp3.version.layer",Integer.toString(nLayer)); // nsFIndex is not used //nSFIndex = m_header.sample_frequency(); nMode = m_header.mode(); aff_properties.put("mp3.mode",new Integer(nMode)); nChannels = nMode == 3 ? 1 : 2; aff_properties.put("mp3.channels",new Integer(nChannels)); nVBR = m_header.vbr(); af_properties.put("vbr", nVBR); aff_properties.put("mp3.vbr", nVBR); aff_properties.put("mp3.vbr.scale",new Integer(m_header.vbr_scale())); FrameSize = m_header.calculate_framesize(); aff_properties.put("mp3.framesize.bytes",new Integer(FrameSize)); if (FrameSize < 0) throw new UnsupportedAudioFileException("Invalid FrameSize : " + FrameSize); nFrequency = m_header.frequency(); aff_properties.put("mp3.frequency.hz",new Integer(nFrequency)); FrameRate = (float) ((1.0 / (m_header.ms_per_frame())) * 1000.0); aff_properties.put("mp3.framerate.fps",new Float(FrameRate)); if (FrameRate < 0) throw new UnsupportedAudioFileException("Invalid FrameRate : " + FrameRate); if (mLength != AudioSystem.NOT_SPECIFIED) { aff_properties.put("mp3.length.bytes",new Integer(mLength)); nTotalFrames = m_header.max_number_of_frames(mLength); aff_properties.put("mp3.length.frames",new Integer(nTotalFrames)); } BitRate = m_header.bitrate(); af_properties.put("bitrate",new Integer(BitRate)); aff_properties.put("mp3.bitrate.nominal.bps",new Integer(BitRate)); nHeader = m_header.getSyncHeader(); encoding = sm_aEncodings[nVersion][nLayer - 1]; aff_properties.put("mp3.version.encoding",encoding.toString()); if (mLength != AudioSystem.NOT_SPECIFIED) { nTotalMS = Math.round(m_header.total_ms(mLength)); aff_properties.put("duration",new Long((long)nTotalMS*1000L)); } aff_properties.put("mp3.copyright", m_header.copyright()); aff_properties.put("mp3.original", m_header.original()); aff_properties.put("mp3.crc", m_header.checksums()); aff_properties.put("mp3.padding", m_header.padding()); InputStream id3v2 = m_bitstream.getRawID3v2(); if (id3v2 != null) { aff_properties.put("mp3.id3tag.v2",id3v2); parseID3v2Frames(id3v2,aff_properties); } if (TDebug.TraceAudioFileReader) TDebug.out(m_header.toString()); } catch (Exception e) { if (TDebug.TraceAudioFileReader) TDebug.out("not a MPEG stream:" + e.getMessage()); throw new UnsupportedAudioFileException("not a MPEG stream:" + e.getMessage()); } // Deeper checks ? int cVersion = (nHeader >> 19) & 0x3; if (cVersion == 1) { if (TDebug.TraceAudioFileReader) TDebug.out("not a MPEG stream: wrong version"); throw new UnsupportedAudioFileException("not a MPEG stream: wrong version"); } int cSFIndex = (nHeader >> 10) & 0x3; if (cSFIndex == 3) { if (TDebug.TraceAudioFileReader) TDebug.out("not a MPEG stream: wrong sampling rate"); throw new UnsupportedAudioFileException("not a MPEG stream: wrong sampling rate"); } // Look up for ID3v1 tag if ((size == mediaLength) && (mediaLength != AudioSystem.NOT_SPECIFIED)) { FileInputStream fis = (FileInputStream) inputStream; byte[] id3v1 = new byte[128]; long bytesSkipped = fis.skip(inputStream.available()-id3v1.length); int read = fis.read(id3v1,0,id3v1.length); if ((id3v1[0]=='T') && (id3v1[1]=='A') && (id3v1[2]=='G')) { parseID3v1Frames(id3v1, aff_properties); } } AudioFormat format = new MpegAudioFormat(encoding, (float) nFrequency, AudioSystem.NOT_SPECIFIED // SampleSizeInBits - The size of a sample , nChannels // Channels - The number of channels , -1 // The number of bytes in each frame , FrameRate // FrameRate - The number of frames played or recorded per second , true , af_properties); return new MpegAudioFileFormat(MpegFileFormatType.MP3, format, nTotalFrames, mLength,aff_properties); } /** * Returns AudioInputStream from file. */ @Override public AudioInputStream getAudioInputStream(File file) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) TDebug.out("getAudioInputStream(File file)"); InputStream inputStream = new FileInputStream(file); try { return getAudioInputStream(inputStream); } catch (UnsupportedAudioFileException e) { if (inputStream != null) inputStream.close(); throw e; } catch (IOException e) { if (inputStream != null) inputStream.close(); throw e; } } /** * Returns AudioInputStream from url. */ public AudioInputStream getAudioInputStream(URL url) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("MpegAudioFileReader.getAudioInputStream(URL): begin"); } long lFileLengthInBytes = AudioSystem.NOT_SPECIFIED; URLConnection conn = url.openConnection(); // Tell shoucast server (if any) that SPI support shoutcast stream. boolean isShout = false; int toRead=4; byte[] head = new byte[toRead]; conn.setRequestProperty ("Icy-Metadata", "1"); BufferedInputStream bInputStream = new BufferedInputStream(conn.getInputStream()); bInputStream.mark(toRead); int read = bInputStream.read(head,0,toRead); if ((read>2) && (((head[0] == 'I') | (head[0] == 'i')) && ((head[1] == 'C') | (head[1] == 'c')) && ((head[2] == 'Y') | (head[2] == 'y')))) isShout = true; bInputStream.reset(); InputStream inputStream = null; // Is is a shoutcast server ? if (isShout == true) { // Yes IcyInputStream icyStream = new IcyInputStream(bInputStream); icyStream.addTagParseListener(IcyListener.getInstance()); inputStream = icyStream; } else { // No, is Icecast 2 ? String metaint = conn.getHeaderField("icy-metaint"); if (metaint != null) { // Yes, it might be icecast 2 mp3 stream. IcyInputStream icyStream = new IcyInputStream(bInputStream,metaint); icyStream.addTagParseListener(IcyListener.getInstance()); inputStream = icyStream; } else { // No inputStream = bInputStream; } } AudioInputStream audioInputStream = null; try { audioInputStream = getAudioInputStream(inputStream, lFileLengthInBytes); } catch (UnsupportedAudioFileException e) { inputStream.close(); throw e; } catch (IOException e) { inputStream.close(); throw e; } if (TDebug.TraceAudioFileReader) {TDebug.out("MpegAudioFileReader.getAudioInputStream(URL): end"); } return audioInputStream; } /** * Return the AudioInputStream from the given InputStream. */ @Override public AudioInputStream getAudioInputStream(InputStream inputStream) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) TDebug.out("MpegAudioFileReader.getAudioInputStream(InputStream inputStream)"); if (!inputStream.markSupported()) inputStream = new BufferedInputStream(inputStream); return super.getAudioInputStream(inputStream); } /** * Parser ID3v1 frames * @param frames * @param props */ protected void parseID3v1Frames(byte[] frames, HashMap props) { String tag = new String(frames, 0, frames.length); int start = 3; String titlev1 = chopSubstring(tag, start, start += 30); String titlev2 = (String) props.get("title"); if (((titlev2==null) || (titlev2.length()==0)) && (titlev1 != null)) props.put("title",titlev1); String artistv1 = chopSubstring(tag, start, start += 30); String artistv2 = (String) props.get("author"); if (((artistv2==null) || (artistv2.length()==0)) && (artistv1 != null)) props.put("author",artistv1); String albumv1 = chopSubstring(tag, start, start += 30); String albumv2 = (String) props.get("album"); if (((albumv2==null) || (albumv2.length()==0)) && (albumv1 != null)) props.put("album",albumv1); String yearv1 = chopSubstring(tag, start, start += 4); String yearv2 = (String) props.get("year"); if (((yearv2==null) || (yearv2.length()==0)) && (yearv1 != null)) props.put("year",yearv1); String commentv1 = chopSubstring(tag, start, start += 28); String commentv2 = (String) props.get("comment"); if (((commentv2==null) || (commentv2.length()==0)) && (commentv1 != null)) props.put("comment",commentv1); String trackv1 = ""+((int) (frames[126] & 0xff)); String trackv2 = (String) props.get("mp3.id3tag.track"); if (((trackv2==null) || (trackv2.length()==0)) && (trackv1 != null)) props.put("mp3.id3tag.track",trackv1); int genrev1 = (int) (frames[127] & 0xff); if ((genrev1 >=0) && (genrev10)) { if (code.equals("TALB")) props.put("album",value); else if (code.equals("TIT2")) props.put("title",value); else if (code.equals("TYER")) props.put("date",value); else if (code.equals("TPE1")) props.put("author",value); else if (code.equals("TCOP")) props.put("copyright",value); else if (code.equals("COMM")) props.put("comment",value); else if (code.equals("TCON")) props.put("mp3.id3tag.genre",value); else if (code.equals("TRCK")) props.put("mp3.id3tag.track",value); } i=i+size-1; } } } catch (RuntimeException e) { // Ignore all parsing errors. if (TDebug.TraceAudioFileReader) TDebug.out("Cannot parse ID3v2 :"+e.getMessage()); } } /** * Parse Text Frames. * @param bframes * @param offset * @param size * @param skip * @return */ protected String parseText(byte[] bframes, int offset, int size, int skip) { String value = null; try { String[] ENC_TYPES = {"ISO-8859-1", "UTF16","UTF-16BE", "UTF-8"}; value = new String(bframes,offset+skip,size-skip,ENC_TYPES[bframes[offset]]); } catch (UnsupportedEncodingException e) { if (TDebug.TraceAudioFileReader) TDebug.out("ID3v2 Encoding error :"+e.getMessage()); } return value; } /** * Load shoutcast (ICY) info. * @param input * @param props * @throws IOException */ protected void loadShoutcastInfo(InputStream input, HashMap props) throws IOException { IcyInputStream icy = new IcyInputStream(new BufferedInputStream(input)); HashMap metadata = icy.getTagHash(); MP3Tag titleMP3Tag = icy.getTag("icy-name"); if (titleMP3Tag != null) props.put("title",((String) titleMP3Tag.getValue()).trim()); MP3Tag[] meta = icy.getTags(); if (meta != null) { // metaStr is not used //StringBuilder metaStr = new StringBuilder(); for (int i=0;iAudioFormat parameters. *
    *
  • bitrate [Integer], bitrate in bits per seconds, average bitrate for VBR enabled stream. *
  • vbr [Boolean], VBR flag. *
*/ public Map properties() { return super.properties(); } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/MpegEncoding.java000066400000000000000000000037201335566474600313020ustar00rootroot00000000000000/* * MpegEncoding. * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file; import javax.sound.sampled.AudioFormat; /** * Encodings used by the MPEG audio decoder. */ public class MpegEncoding extends AudioFormat.Encoding { public static final AudioFormat.Encoding MPEG1L1 = new MpegEncoding("MPEG1L1"); public static final AudioFormat.Encoding MPEG1L2 = new MpegEncoding("MPEG1L2"); public static final AudioFormat.Encoding MPEG1L3 = new MpegEncoding("MPEG1L3"); public static final AudioFormat.Encoding MPEG2L1 = new MpegEncoding("MPEG2L1"); public static final AudioFormat.Encoding MPEG2L2 = new MpegEncoding("MPEG2L2"); public static final AudioFormat.Encoding MPEG2L3 = new MpegEncoding("MPEG2L3"); public static final AudioFormat.Encoding MPEG2DOT5L1 = new MpegEncoding("MPEG2DOT5L1"); public static final AudioFormat.Encoding MPEG2DOT5L2 = new MpegEncoding("MPEG2DOT5L2"); public static final AudioFormat.Encoding MPEG2DOT5L3 = new MpegEncoding("MPEG2DOT5L3"); public MpegEncoding(String strName) { super(strName); } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/MpegFileFormatType.java000066400000000000000000000027161335566474600324520ustar00rootroot00000000000000/* * MpegFileFormatType. * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file; import javax.sound.sampled.AudioFileFormat; /** * FileFormatTypes used by the MPEG audio decoder. */ public class MpegFileFormatType extends AudioFileFormat.Type { public static final AudioFileFormat.Type MPEG = new MpegFileFormatType("MPEG", "mpeg"); public static final AudioFileFormat.Type MP3 = new MpegFileFormatType("MP3", "mp3"); public MpegFileFormatType(String strName, String strExtension) { super(strName, strExtension); } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/000077500000000000000000000000001335566474600266515ustar00rootroot00000000000000extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/IcyInputStream.java000066400000000000000000000331151335566474600324370ustar00rootroot00000000000000/* * IcyInputStream. * * jicyshout : http://sourceforge.net/projects/jicyshout/ * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file.tag; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.StringTokenizer; /** An BufferedInputStream that parses Shoutcast's "icy" metadata from the stream. Gets headers at the beginning and if the "icy-metaint" tag is found, it parses and strips in-stream metadata.

The deal with metaint: Icy streams don't try to put tags between MP3 frames the way that ID3 does. Instead, it requires the client to strip metadata from the stream before it hits the decoder. You get an icy-metaint name/val in the beginning of the stream iff you sent "Icy-Metadata" with value "1" in the request headers (SimpleMP3DataSource does this if the "parseStreamMetadata" boolean is true). If this is the case then the value of icy-metaint is the amount of real data between metadata blocks. Each block begins with an int indicating how much metadata there is -- the block is this value times 16 (it can be, and often is, 0).

Originally thought that "icy" implied Icecast, but this is completely wrong -- real Icecast servers, found through www.icecast.net and typified by URLs with a trailing directory (like CalArts School of Music - http://65.165.174.100:8000/som) do not have the "ICY 200 OK" magic string or any of the CRLF-separated headers. Apparently, "icy" means "Shoutcast". Yep, that's weird. @author Chris Adamson, invalidname@mac.com */ public class IcyInputStream extends BufferedInputStream implements MP3MetadataParser { public static boolean DEBUG = false; MP3TagParseSupport tagParseSupport; /** inline tags are delimited by ';', also filter out null bytes */ protected static final String INLINE_TAG_SEPARATORS = ";\u0000"; /* looks like icy streams start start with ICY 200 OK\r\n then the tags are like icy-notice1:
This stream requires Winamp
\r\n icy-notice2:SHOUTcast Distributed Network Audio Server/win32 v1.8.2
\r\n icy-name:Core-upt Radio\r\n icy-genre:Punk Ska Emo\r\n icy-url:http://www.core-uptrecords.com\r\n icy-pub:1\r\n icy-metaint:8192\r\n icy-br:56\r\n \r\n (signifies end of headers) we only get icy-metaint if the http request that created this stream sent the header "icy-metadata:1" // in in-line metadata, we read a byte that tells us how many 16-byte blocks there are (presumably, we still use \r\n for the separator... the block is padded out with 0x00's that we can ignore) // when server is full/down/etc, we get the following for // one of the notice lines: icy-notice2:This server has reached its user limit
or icy-notice2:The resource requested is currently unavailable
*/ /** Tags that have been discovered in the stream. */ HashMap tags; /** Buffer for readCRLF line... note this limits lines to 1024 chars (I've read that WinAmp barfs at 128, so this is generous) */ protected byte[] crlfBuffer = new byte[1024]; /** value of the "metaint" tag, which tells us how many bytes of real data are between the metadata tags. if -1, this stream does not have metadata after the header. */ protected int metaint = -1; /** how many bytes of real data remain before the next block of metadata. Only meaningful if metaint != -1. */ protected int bytesUntilNextMetadata = -1; // TODO: comment for constructor /** Reads the initial headers of the stream and adds tags appropriatly. Gets set up to find, read, and strip blocks of in-line metadata if the icy-metaint header is found. */ public IcyInputStream(InputStream in) throws IOException { super(in); tags = new HashMap(); tagParseSupport = new MP3TagParseSupport(); // read the initial tags here, including the metaint // and set the counter for how far we read until // the next metadata block (if any). readInitialHeaders(); IcyTag metaIntTag = (IcyTag) getTag("icy-metaint"); if (DEBUG) System.out.println("METATAG:"+metaIntTag); if (metaIntTag != null) { String metaIntString = metaIntTag.getValueAsString(); try { metaint = Integer.parseInt(metaIntString.trim()); if (DEBUG) System.out.println("METAINT:"+metaint); bytesUntilNextMetadata = metaint; } catch (NumberFormatException nfe) { } } } /** * IcyInputStream constructor for know meta-interval (Icecast 2) * @param in * @param metaint * @throws IOException */ public IcyInputStream(InputStream in, String metaIntString) throws IOException { super(in); tags = new HashMap(); tagParseSupport = new MP3TagParseSupport(); try { metaint = Integer.parseInt(metaIntString.trim()); if (DEBUG) System.out.println("METAINT:"+metaint); bytesUntilNextMetadata = metaint; } catch (NumberFormatException nfe) { } } /** Assuming we're at the top of the stream, read lines one by one until we hit a completely blank \r\n. Parse the data as IcyTags. */ protected void readInitialHeaders() throws IOException { String line = null; while (!((line = readCRLFLine()).equals(""))) { int colonIndex = line.indexOf(':'); // does it have a ':' separator if (colonIndex == -1) continue; IcyTag tag = new IcyTag( line.substring(0, colonIndex), line.substring(colonIndex + 1)); //System.out.println(tag); addTag(tag); } } /** Read everything up to the next CRLF, return it as a String. */ protected String readCRLFLine() throws IOException { int i = 0; for (; i < crlfBuffer.length; i++) { byte aByte = (byte) read(); if (aByte == '\r') { // possible end of line byte anotherByte = (byte) read(); i++; // since we read again if (anotherByte == '\n') { break; // break out of while } else { // oops, not end of line - put these in array crlfBuffer[i - 1] = aByte; crlfBuffer[i] = anotherByte; } } else { // if not \r crlfBuffer[i] = aByte; } } // for // get the string from the byte[]. i is 1 too high because of // read-ahead in crlf block return new String(crlfBuffer, 0, i - 1); } /** Reads and returns a single byte. If the next byte is a metadata block, then that block is read, stripped, and parsed before reading and returning the first byte after the metadata block. */ public int read() throws IOException { if (bytesUntilNextMetadata > 0) { bytesUntilNextMetadata--; return super.read(); } else if (bytesUntilNextMetadata == 0) { // we need to read next metadata block readMetadata(); bytesUntilNextMetadata = metaint - 1; // -1 because we read byte on next line return super.read(); } else { // no metadata in this stream return super.read(); } } /** Reads a block of bytes. If the next byte is known to be a block of metadata, then that is read, parsed, and stripped, and then a block of bytes is read and returned. Otherwise, it may read up to but not into the next metadata block if bytesUntilNextMetadata < length */ public int read(byte[] buf, int offset, int length) throws IOException { // if not on metadata, do the usual read so long as we // don't read past metadata if (bytesUntilNextMetadata > 0) { int adjLength = Math.min(length, bytesUntilNextMetadata); int got = super.read(buf, offset, adjLength); bytesUntilNextMetadata -= got; return got; } else if (bytesUntilNextMetadata == 0) { // read/parse the metadata readMetadata(); // now as above, except that we reset // bytesUntilNextMetadata differently //int adjLength = Math.min(length, bytesUntilNextMetadata); //int got = super.read(buf, offset, adjLength); //bytesUntilNextMetadata = metaint - got; // Chop Fix - JavaZOOM (3 lines above seem buggy) bytesUntilNextMetadata = metaint; int adjLength = Math.min(length, bytesUntilNextMetadata); int got = super.read(buf, offset, adjLength); bytesUntilNextMetadata -= got; // End fix - JavaZOOM return got; } else { // not even reading metadata return super.read(buf, offset, length); } } /** trivial return read (buf, 0, buf.length) */ public int read(byte[] buf) throws IOException { return read(buf, 0, buf.length); } /** Read the next segment of metadata. The stream must be right on the segment, ie, the next byte to read is the metadata block count. The metadata is parsed and new tags are added with addTag(), which fires events */ protected void readMetadata() throws IOException { int blockCount = super.read(); if (DEBUG) System.out.println("BLOCKCOUNT:"+blockCount); // System.out.println ("blocks to read: " + blockCount); int byteCount = (blockCount * 16); // 16 bytes per block if (byteCount < 0) return; // WTF?! byte[] metadataBlock = new byte[byteCount]; int index = 0; // build an array of this metadata while (byteCount > 0) { int bytesRead = super.read(metadataBlock, index, byteCount); index += bytesRead; byteCount -= bytesRead; } // now parse it if (blockCount > 0) parseInlineIcyTags(metadataBlock); } // readMetadata /** Parse metadata from an in-stream "block" of bytes, add a tag for each one.

Hilariously, the inline data format is totally different than the top-of-stream header. For example, here's a block I saw on "Final Fantasy Radio":

	StreamTitle='Final Fantasy 8 - Nobuo Uematsu - Blue Fields';StreamUrl='';
	
In other words:
  1. Tags are delimited by semicolons
  2. Keys/values are delimited by equals-signs
  3. Values are wrapped in single-quotes
  4. Key names are in SentenceCase, not lowercase-dashed
*/ protected void parseInlineIcyTags(byte[] tagBlock) { String blockString = new String(tagBlock); if (DEBUG) System.out.println("BLOCKSTR:"+blockString); StringTokenizer izer = new StringTokenizer(blockString, INLINE_TAG_SEPARATORS); int i = 0; while (izer.hasMoreTokens()) { String tagString = izer.nextToken(); int separatorIdx = tagString.indexOf('='); if (separatorIdx == -1) continue; // bogus tagString if no '=' // try to strip single-quotes around value, if present int valueStartIdx = (tagString.charAt(separatorIdx + 1) == '\'') ? separatorIdx + 2 : separatorIdx + 1; int valueEndIdx = (tagString.charAt(tagString.length() - 1)) == '\'' ? tagString.length() - 1 : tagString.length(); String name = tagString.substring(0, separatorIdx); String value = tagString.substring(valueStartIdx, valueEndIdx); // System.out.println (i++ + " " + name + ":" + value); IcyTag tag = new IcyTag(name, value); addTag(tag); } } /** adds the tag to the HashMap of tags we have encountered either in-stream or as headers, replacing any previous tag with this name. */ protected void addTag(IcyTag tag) { tags.put(tag.getName(), tag); // fire this as an event too tagParseSupport.fireTagParsed(this, tag); } /** Get the named tag from the HashMap of headers and in-line tags. Null if no such tag has been encountered. */ public MP3Tag getTag(String tagName) { return (MP3Tag) tags.get(tagName); } /** Get all tags (headers or in-stream) encountered thus far. */ public MP3Tag[] getTags() { return (MP3Tag[]) tags.values().toArray(new MP3Tag[0]); } /** Returns a HashMap of all headers and in-stream tags parsed so far. */ public HashMap getTagHash() { return tags; } /** Adds a TagParseListener to be notified when this stream parses MP3Tags. */ public void addTagParseListener(TagParseListener tpl) { tagParseSupport.addTagParseListener(tpl); } /** Removes a TagParseListener, so it won't be notified when this stream parses MP3Tags. */ public void removeTagParseListener(TagParseListener tpl) { tagParseSupport.removeTagParseListener(tpl); } /** Quickie unit-test. */ public static void main(String args[]) { byte[] chow = new byte[200]; if (args.length != 1) { //System.out.println("Usage: IcyInputStream "); return; } try { URL url = new URL(args[0]); URLConnection conn = url.openConnection(); conn.setRequestProperty("Icy-Metadata", "1"); IcyInputStream icy = new IcyInputStream( new BufferedInputStream(conn.getInputStream())); while (icy.available() > -1) { // icy.read(); icy.read(chow, 0, chow.length); } } catch (Exception e) { e.printStackTrace(); } } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/IcyTag.java000066400000000000000000000030311335566474600306710ustar00rootroot00000000000000/* * IcyTag. * * jicyshout : http://sourceforge.net/projects/jicyshout/ * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file.tag; /** * A tag parsed from an icecast tag. */ public class IcyTag extends MP3Tag implements StringableTag { /** Create a new tag, from the parsed name and (String) value. It looks like all Icecast tags are Strings (safe to assume this going forward?) */ public IcyTag(String name, String stringValue) { super(name, stringValue); } // so far as I know, all Icecast tags are strings public String getValueAsString() { return (String) getValue(); } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/MP3MetadataParser.java000066400000000000000000000040621335566474600327330ustar00rootroot00000000000000/* * MP3MetadataParser. * * jicyshout : http://sourceforge.net/projects/jicyshout/ * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file.tag; /** An object that fires off TagParseEvents as they are parsed from a stream, ServerSocket, or other metadata source */ public interface MP3MetadataParser { /** Adds a TagParseListener to be notified when this object parses MP3Tags. */ public void addTagParseListener(TagParseListener tpl); /** Removes a TagParseListener, so it won't be notified when this object parses MP3Tags. */ public void removeTagParseListener(TagParseListener tpl); /** Get all tags (headers or in-stream) encountered thusfar. This is included in this otherwise Listener-like scheme because most standards are a mix of start-of-stream metadata tags (like the http headers or the stuff at the top of an ice stream) and inline data. Implementations should hang onto all tags they parse and provide them with this call. Callers should first use this call to get initial tags, then subscribe for events as the stream continues. */ public MP3Tag[] getTags(); } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/MP3Tag.java000066400000000000000000000031671335566474600305560ustar00rootroot00000000000000/* * MP3Tag. * * jicyshout : http://sourceforge.net/projects/jicyshout/ * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file.tag; /** An individual piece of mp3 metadata, as a name/value pair. Abstract just so that subclasses will indicate their tagging scheme (Icy, ID3, etc.). */ public abstract class MP3Tag extends Object { protected String name; protected Object value; public MP3Tag(String name, Object value) { this.name = name; this.value = value; } public String getName() { return name; } public Object getValue() { return value; } public String toString() { return getClass().getName() + " -- " + getName() + ":" + getValue().toString(); } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/MP3TagParseSupport.java000066400000000000000000000040641335566474600331430ustar00rootroot00000000000000/* * MP3TagParseSupport. * * jicyshout : http://sourceforge.net/projects/jicyshout/ * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file.tag; import java.util.ArrayList; /** */ public class MP3TagParseSupport extends Object { ArrayList tagParseListeners; /** trivial constructor, sets up listeners list. */ public MP3TagParseSupport() { super(); tagParseListeners = new ArrayList(); } /** Adds a TagParseListener to be notified when a stream parses MP3Tags. */ public void addTagParseListener(TagParseListener tpl) { tagParseListeners.add(tpl); } /** Removes a TagParseListener, so it won't be notified when a stream parses MP3Tags. */ public void removeTagParseListener(TagParseListener tpl) { tagParseListeners.add(tpl); } /** Fires the given event to all registered listeners */ public void fireTagParseEvent(TagParseEvent tpe) { for (int i = 0; i < tagParseListeners.size(); i++) { TagParseListener l = (TagParseListener) tagParseListeners.get(i); l.tagParsed(tpe); } } public void fireTagParsed(Object source, MP3Tag tag) { fireTagParseEvent(new TagParseEvent(source, tag)); } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/StringableTag.java000066400000000000000000000025451335566474600322500ustar00rootroot00000000000000/* * StringableTag. * * jicyshout : http://sourceforge.net/projects/jicyshout/ * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file.tag; /** Indicates that the value of a tag is a string, and provides a getValueAsString() method to get it. Appropriate for tags like artist, title, etc. */ public interface StringableTag { /** Return the value of this tag as a string. */ public String getValueAsString(); } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/TagParseEvent.java000066400000000000000000000030031335566474600322200ustar00rootroot00000000000000/* * TagParseEvent. * * jicyshout : http://sourceforge.net/projects/jicyshout/ * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file.tag; import java.util.EventObject; /** Event to indicate that an MP3 tag was received through some means (parsed in stream, received via UDP, whatever) and converted into an MP3Tag object. */ public class TagParseEvent extends EventObject { protected MP3Tag tag; public TagParseEvent(Object source, MP3Tag tag) { super(source); this.tag = tag; } /** Get the tag that was parsed. */ public MP3Tag getTag() { return tag; } } extensions/soundspi/MpegAudioSPI/src/javazoom/spi/mpeg/sampled/file/tag/TagParseListener.java000066400000000000000000000026351335566474600327360ustar00rootroot00000000000000/* * TagParseListener. * * jicyshout : http://sourceforge.net/projects/jicyshout/ * * JavaZOOM : mp3spi@javazoom.net * http://www.javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.spi.mpeg.sampled.file.tag; import java.util.EventListener; /** EventListener to be implemented by objects that want to get callbacks when MP3 tags are received. */ public interface TagParseListener extends EventListener { /** Called when a tag is found (parsed from the stream, received via UDP, etc.) */ public void tagParsed(TagParseEvent tpe); } extensions/soundspi/build.xml000066400000000000000000000106171335566474600167720ustar00rootroot00000000000000 extensions/soundspi/catalog/000077500000000000000000000000001335566474600165565ustar00rootroot00000000000000extensions/soundspi/catalog/META-INF/000077500000000000000000000000001335566474600177165ustar00rootroot00000000000000extensions/soundspi/catalog/META-INF/services/000077500000000000000000000000001335566474600215415ustar00rootroot00000000000000extensions/soundspi/catalog/META-INF/services/javax.sound.sampled.spi.AudioFileReader000066400000000000000000000003261335566474600311260ustar00rootroot00000000000000# for the javalayer mp3 decoder javazoom.spi.mpeg.sampled.file.MpegAudioFileReader org.tritonus.sampled.file.mpeg.MpegAudioFileReader # for the vorbis codec org.tritonus.sampled.file.jorbis.JorbisAudioFileReader extensions/soundspi/catalog/META-INF/services/javax.sound.sampled.spi.AudioFileWriter000066400000000000000000000001171335566474600311760ustar00rootroot00000000000000# for the lame mp3 encoder org.tritonus.sampled.file.mpeg.MpegAudioFileWriter extensions/soundspi/catalog/META-INF/services/javax.sound.sampled.spi.FormatConversionProvider000066400000000000000000000005751335566474600331610ustar00rootroot00000000000000# for the javalayer mp3 decoder javazoom.spi.mpeg.sampled.convert.MpegFormatConversionProvider # for the javalayer mp3 decoder # and the lame mp3 encoder org.tritonus.sampled.convert.javalayer.MpegFormatConversionProvider org.tritonus.sampled.convert.lame.Mp3LameFormatConversionProvider # for the jorbis decoder org.tritonus.sampled.convert.jorbis.JorbisFormatConversionProvider extensions/soundspi/javalayer/000077500000000000000000000000001335566474600171225ustar00rootroot00000000000000extensions/soundspi/javalayer/CHANGES.txt000066400000000000000000000074571335566474600207500ustar00rootroot00000000000000 JLayer 1.0 JavaZOOM 1999-2005 Project Homepage : http://www.javazoom.net/javalayer/javalayer.html JAVA and MP3 online Forums : http://www.javazoom.net/services/forums/index.jsp ----------------------------------------------------- 11/28/2004: JLayer 1.0 ------------------------- - VBRI frame header (Fraunhofer VBR) support added in Header.java. - Frame controls improved. It fixes the following bugs : + ArrayIndexOutOfBound Exception in t_43[] array. + ArrayIndexOutOfBound Exception in huffman_decode() method. - Licensing moved from GPL to LGPL : It means that you can use JLayer in your own application without being restricted by GPL license issues. It's more business friendly. - JavaLayer renamed into JLayer to be compliant to SUN trademark rules. - Tested under JRE 1.5.0. CPU usage < 1%, RAM usage < 12MB under P4/2Ghz. 01/02/2004: JavaLayer 0.4 ------------------------- - XING VBR header frame support improved in Header.java : + public boolean vbr() added. + public int vbr_scale() added. + public byte[] vbr_toc() added. total_ms(), ms_per_frame(), min_number_of_frames(int), max_number_of_frames(int), bitrate_string(), bitrate() methods check for VBR status. - ID3v2 frames support improved : + public InputStream getRawID3v2() added in Bitstream.java - Misc : Bug fixed in the decoder for some +320kbps stream. Bug fixed : SYNC conflict with some ID3v2 frames. + public int bitrate() added. + public int bitrate_instant() added. jUnit tests added (see srctest/ folder) 08/04/2003: JavaLayer 0.3.0 --------------------------- - Advanced threaded player classes added. 04/01/2002: JavaLayer 0.2.0 --------------------------- - MPEG 2.5 support added. Encoded files with LAME are supported. - Bug fixes for ms time computation with free format. + Bench notes : + Heap use range : 1380KB to 1900KB - 370 classes loaded. + Footprint : ~8MB under WinNT4 + J2SE 1.3 (Hotspot). + CPU usage : ~12% under PIII 800Mhz/WinNT4+J2SE 1.3 (Hotspot). + CPU usage : ~11% under PIII 1Ghz/Win2K+J2SE 1.4 (Hotspot). 03/04/2002: JavaLayer 0.1.2 --------------------------- - API improved to let developers get MP3 bitrate, framelength and total time features. - Additionnal files added (CHANGES.txt and LICENSE.txt). 10/01/2001: JavaLayer 0.1.1 --------------------------- - Bugs fixes in the decoder (Layer III). 07/02/2001: JavaLayer 0.1.0 --------------------------- - Streaming support added to the simple player (jlp). - Bugs fixes in the simple player (too fast playback for low rate files). 06/04/2001: JavaLayer 0.0.9 --------------------------- - Bugs fixes in Layer I and Layer II decoder. - ANT build script added. - HTML page added to play MP3 through PlayerApplet in a JavaSound 1.0 (JDK 1.3) compliant browser. 04/16/2000: JavaLayer 0.0.8 --------------------------- A simple player have been added and you can now play MP3 in real time with JVM that supports JavaSound 1.0 (i.e JDK 1.3). - Bug fixes. - Decoder improvements. - Build Scripts have been added for Win32 and Unix platforms. 12/16/1999: JavaLayer 0.0.7 --------------------------- JavaLayer 0.0.7 contains significant improvements over version 0.0 : - API and documentation added. - The decoder is much more faster. Fast enough for real-time decoding. - Huffman/Layer3 tables serialization added. - New buffers management. - Exceptions + Utils added. - Bugs fixes. 02/28/1999: JavaLayer 0.0 ------------------------- JavaLayer V0.0 does not play any MP3 but it allows the MP3toWAV conversion. This is the first step in this project. We do it thanks to free mp3 ressources available on the net: - MAPlay for the OO MP3 decoder (C++). - WAV format description from Microsoft. The MP3 decoder works now but it is too slow to allow real time implementation. extensions/soundspi/javalayer/LICENSE.txt000066400000000000000000000634761335566474600207650ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! extensions/soundspi/javalayer/README.txt000066400000000000000000000060771335566474600206320ustar00rootroot00000000000000 JLayer 1.0 JavaZOOM 1999-2005 Project Homepage : http://www.javazoom.net/javalayer/javalayer.html JAVA and MP3 online Forums : http://www.javazoom.net/services/forums/index.jsp ----------------------------------------------------- DESCRIPTION : ----------- JLayer is a library that decodes/plays/converts MPEG 1/2/2.5 Layer 1/2/3 (i.e. MP3) in real time for the JAVA(tm) platform. This is a non-commercial project and anyone can add his contribution. JLayer is licensed under LGPL (see LICENSE.txt). FAQ : --- - How to install JLayer ? Before running JLayer you must set PATH and CLASSPATH for JAVA and you must add jl1.0.jar to the CLASSPATH. - Do I need JMF to run JLayer player ? No, JMF is not required. You just need a JVM JavaSound 1.0 compliant. (i.e. JVM1.3 or higher). - How to run the MP3TOWAV converter ? java javazoom.jl.converter.jlc -v -p output.wav yourfile.mp3 (Note : MP3TOWAV converter should work under jdk1.1.x or higher) - How to run the simple MP3 player ? java javazoom.jl.player.jlp localfile.mp3 or java javazoom.jl.player.jlp -url http://www.aserver.com/remotefile.mp3 Note : MP3 simple player only works under JVM that supports JavaSound 1.0 (i.e JDK1.3.x+) - How to run the advanced (threaded) MP3 player ? java javazoom.jl.player.advanced.jlap localfile.mp3 - Does simple MP3 player support streaming ? Yes, use the following command to play music from stream : java javazoom.jl.player.jlp -url http://www.shoutcastserver.com:8000 (If JLayer returns without playing SHOUTcast stream then it might mean that the server expect a winamp like "User-Agent" in HTTP request). - Does JLayer support MPEG 2.5 ? Yes, it works fine for all files generated with LAME. - Does JLayer support VBR ? Yes, It supports VBRI and XING VBR header too. - How to get ID3v1 or ID3v2 tags from JLayer API ? The API provides a getRawID3v2() method to get an InputStream on ID3v2 frames. - How to skip frames to have a seek feature ? See javazoom.jl.player.advanced.jlap source to learn how to skip frames. - How much memory/CPU JLayer needs to run ? Here are our benchmark notes : - Heap use range : 1380KB to 1900KB - 370 classes loaded. - Footprint : ~8MB under WinNT4/Win2K + J2SE 1.3 (Hotspot). ~10MB under WinNT4/Win2K + J2SE 1.4.1 (Hotspot). - CPU usage : ~12% under PIII 800Mhz/WinNT4+J2SE 1.3 (Hotspot). ~8% under PIII 1Ghz/Win2K+J2SE 1.3.1 (Hotspot). ~12% under PIII 1Ghz/Win2K+J2SE 1.4.1 (Hotspot). ~1% under PIII 1Ghz/Win2K+J2SE 1.5.0 (Hotspot). - How to contact JLayer developers ? Try to post a thread on Java&MP3 online forums at : http://www.javazoom.net/services/forums/index.jsp You can also contact us at jlayer@javazoom.net for contributions. KNOWN PROBLEMS : -------------- 99% of MP3 plays well with JLayer but some (1%) return an ArrayIndexOutOfBoundsException while playing. It might come from invalid audio frames. Workaround : Just try/catch ArrayIndexOutOfBoundsException in your code to skip non-detected invalid frames.extensions/soundspi/javalayer/src/000077500000000000000000000000001335566474600177115ustar00rootroot00000000000000extensions/soundspi/javalayer/src/javazoom/000077500000000000000000000000001335566474600215375ustar00rootroot00000000000000extensions/soundspi/javalayer/src/javazoom/jl/000077500000000000000000000000001335566474600221445ustar00rootroot00000000000000extensions/soundspi/javalayer/src/javazoom/jl/converter/000077500000000000000000000000001335566474600241535ustar00rootroot00000000000000extensions/soundspi/javalayer/src/javazoom/jl/converter/Converter.java000066400000000000000000000253441335566474600267750ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Original verion. mdm@techie.com. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.converter; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.Header; import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.decoder.Obuffer; /** * The Converter class implements the conversion of * an MPEG audio file to a .WAV file. To convert an MPEG audio stream, * just create an instance of this class and call the convert() * method, passing in the names of the input and output files. You can * pass in optional ProgressListener and * Decoder.Params objects also to customize the conversion. * * @author MDM 12/12/99 * @since 0.0.7 */ public class Converter { /** * Creates a new converter instance. */ public Converter() { } public synchronized void convert(String sourceName, String destName) throws JavaLayerException { convert(sourceName, destName, null, null); } public synchronized void convert(String sourceName, String destName, ProgressListener progressListener) throws JavaLayerException { convert(sourceName, destName, progressListener, null); } public void convert(String sourceName, String destName, ProgressListener progressListener, Decoder.Params decoderParams) throws JavaLayerException { if (destName.length()==0) destName = null; try { InputStream in = openInput(sourceName); convert(in, destName, progressListener, decoderParams); in.close(); } catch(IOException ioe) { throw new JavaLayerException(ioe.getLocalizedMessage(), ioe); } } public synchronized void convert(InputStream sourceStream, String destName, ProgressListener progressListener, Decoder.Params decoderParams) throws JavaLayerException { if (progressListener==null) progressListener = PrintWriterProgressListener.newStdOut( PrintWriterProgressListener.NO_DETAIL); try { if (!(sourceStream instanceof BufferedInputStream)) sourceStream = new BufferedInputStream(sourceStream); int frameCount = -1; if (sourceStream.markSupported()) { sourceStream.mark(-1); frameCount = countFrames(sourceStream); sourceStream.reset(); } progressListener.converterUpdate(ProgressListener.UPDATE_FRAME_COUNT, frameCount, 0); Obuffer output = null; Decoder decoder = new Decoder(decoderParams); Bitstream stream = new Bitstream(sourceStream); if (frameCount==-1) frameCount = Integer.MAX_VALUE; int frame = 0; long startTime = System.currentTimeMillis(); try { for (; frameupdateID parameter can take these values: * * UPDATE_FRAME_COUNT: param1 is the frame count, or -1 if not known. * UPDATE_CONVERT_COMPLETE: param1 is the conversion time, param2 * is the number of frames converted. */ public void converterUpdate(int updateID, int param1, int param2); /** * If the converter wishes to make a first pass over the * audio frames, this is called as each frame is parsed. */ public void parsedFrame(int frameNo, Header header); /** * This method is called after each frame has been read, * but before it has been decoded. * * @param frameNo The 0-based sequence number of the frame. * @param header The Header rerpesenting the frame just read. */ public void readFrame(int frameNo, Header header); /** * This method is called after a frame has been decoded. * * @param frameNo The 0-based sequence number of the frame. * @param header The Header rerpesenting the frame just read. * @param o The Obuffer the deocded data was written to. */ public void decodedFrame(int frameNo, Header header, Obuffer o); /** * Called when an exception is thrown during while converting * a frame. * * @param t The Throwable instance that * was thrown. * * @return true to continue processing, or false * to abort conversion. * * If this method returns false, the exception * is propagated to the caller of the convert() method. If * true is returned, the exception is silently * ignored and the converter moves onto the next frame. */ public boolean converterException(Throwable t); } /** * Implementation of ProgressListener that writes * notification text to a PrintWriter. */ // REVIEW: i18n of text and order required. static public class PrintWriterProgressListener implements ProgressListener { static public final int NO_DETAIL = 0; /** * Level of detail typically expected of expert * users. */ static public final int EXPERT_DETAIL = 1; /** * Verbose detail. */ static public final int VERBOSE_DETAIL = 2; /** * Debug detail. All frame read notifications are shown. */ static public final int DEBUG_DETAIL = 7; static public final int MAX_DETAIL = 10; private PrintWriter pw; private int detailLevel; static public PrintWriterProgressListener newStdOut(int detail) { return new PrintWriterProgressListener( new PrintWriter(System.out, true), detail); } public PrintWriterProgressListener(PrintWriter writer, int detailLevel) { this.pw = writer; this.detailLevel = detailLevel; } public boolean isDetail(int detail) { return (this.detailLevel >= detail); } public void converterUpdate(int updateID, int param1, int param2) { if (isDetail(VERBOSE_DETAIL)) { switch (updateID) { case UPDATE_CONVERT_COMPLETE: // catch divide by zero errors. if (param2==0) param2 = 1; pw.println(); pw.println("Converted "+param2+" frames in "+param1+" ms ("+ (param1/param2)+" ms per frame.)"); } } } public void parsedFrame(int frameNo, Header header) { if ((frameNo==0) && isDetail(VERBOSE_DETAIL)) { String headerString = header.toString(); pw.println("File is a "+headerString); } else if (isDetail(MAX_DETAIL)) { String headerString = header.toString(); pw.println("Prased frame "+frameNo+": "+headerString); } } public void readFrame(int frameNo, Header header) { if ((frameNo==0) && isDetail(VERBOSE_DETAIL)) { String headerString = header.toString(); pw.println("File is a "+headerString); } else if (isDetail(MAX_DETAIL)) { String headerString = header.toString(); pw.println("Read frame "+frameNo+": "+headerString); } } public void decodedFrame(int frameNo, Header header, Obuffer o) { if (isDetail(MAX_DETAIL)) { String headerString = header.toString(); pw.println("Decoded frame "+frameNo+": "+headerString); pw.println("Output: "+o); } else if (isDetail(VERBOSE_DETAIL)) { if (frameNo==0) { pw.print("Converting."); pw.flush(); } if ((frameNo % 10)==0) { pw.print('.'); pw.flush(); } } } public boolean converterException(Throwable t) { if (this.detailLevel>NO_DETAIL) { t.printStackTrace(pw); pw.flush(); } return false; } } }extensions/soundspi/javalayer/src/javazoom/jl/converter/RiffFile.java000066400000000000000000000303101335566474600265010ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 02/23/99 JavaConversion by E.B * Don Cross, April 1993. * RIFF file format classes. * See Chapter 8 of "Multimedia Programmer's Reference" in * the Microsoft Windows SDK. * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.converter; import java.io.IOException; import java.io.RandomAccessFile; /** * Class to manage RIFF files */ public class RiffFile { class RiffChunkHeader { public int ckID = 0; // Four-character chunk ID public int ckSize = 0; // Length of data in chunk public RiffChunkHeader() {} } // DDCRET public static final int DDC_SUCCESS = 0; // The operation succeded public static final int DDC_FAILURE = 1; // The operation failed for unspecified reasons public static final int DDC_OUT_OF_MEMORY = 2; // Operation failed due to running out of memory public static final int DDC_FILE_ERROR = 3; // Operation encountered file I/O error public static final int DDC_INVALID_CALL = 4; // Operation was called with invalid parameters public static final int DDC_USER_ABORT = 5; // Operation was aborted by the user public static final int DDC_INVALID_FILE = 6; // File format does not match // RiffFileMode public static final int RFM_UNKNOWN = 0; // undefined type (can use to mean "N/A" or "not open") public static final int RFM_WRITE = 1; // open for write public static final int RFM_READ = 2; // open for read private RiffChunkHeader riff_header; // header for whole file protected int fmode; // current file I/O mode protected RandomAccessFile file; // I/O stream to use /** * Dummy Constructor */ public RiffFile() { file = null; fmode = RFM_UNKNOWN; riff_header = new RiffChunkHeader(); riff_header.ckID = FourCC("RIFF"); riff_header.ckSize = 0; } /** * Return File Mode. */ public int CurrentFileMode() {return fmode;} /** * Open a RIFF file. */ public int Open(String Filename, int NewMode) { int retcode = DDC_SUCCESS; if ( fmode != RFM_UNKNOWN ) { retcode = Close(); } if ( retcode == DDC_SUCCESS ) { switch ( NewMode ) { case RFM_WRITE: try { file = new RandomAccessFile(Filename,"rw"); try { // Write the RIFF header... // We will have to come back later and patch it! byte[] br = new byte[8]; br[0] = (byte) ((riff_header.ckID >>> 24) & 0x000000FF); br[1] = (byte) ((riff_header.ckID >>> 16) & 0x000000FF); br[2] = (byte) ((riff_header.ckID >>> 8) & 0x000000FF); br[3] = (byte) (riff_header.ckID & 0x000000FF); byte br4 = (byte) ((riff_header.ckSize >>> 24)& 0x000000FF); byte br5 = (byte) ((riff_header.ckSize >>> 16)& 0x000000FF); byte br6 = (byte) ((riff_header.ckSize >>> 8)& 0x000000FF); byte br7 = (byte) (riff_header.ckSize & 0x000000FF); br[4] = br7; br[5] = br6; br[6] = br5; br[7] = br4; file.write(br,0,8); fmode = RFM_WRITE; } catch (IOException ioe) { file.close(); fmode = RFM_UNKNOWN; } } catch (IOException ioe) { fmode = RFM_UNKNOWN; retcode = DDC_FILE_ERROR; } break; case RFM_READ: try { file = new RandomAccessFile(Filename,"r"); try { // Try to read the RIFF header... byte[] br = new byte[8]; file.read(br,0,8); fmode = RFM_READ; riff_header.ckID = ((br[0]<<24)& 0xFF000000) | ((br[1]<<16)&0x00FF0000) | ((br[2]<<8)&0x0000FF00) | (br[3]&0x000000FF); riff_header.ckSize = ((br[4]<<24)& 0xFF000000) | ((br[5]<<16)&0x00FF0000) | ((br[6]<<8)&0x0000FF00) | (br[7]&0x000000FF); } catch (IOException ioe) { file.close(); fmode = RFM_UNKNOWN; } } catch (IOException ioe) { fmode = RFM_UNKNOWN; retcode = DDC_FILE_ERROR; } break; default: retcode = DDC_INVALID_CALL; } } return retcode; } /** * Write NumBytes data. */ public int Write(byte[] Data, int NumBytes ) { if ( fmode != RFM_WRITE ) { return DDC_INVALID_CALL; } try { file.write(Data,0,NumBytes); fmode = RFM_WRITE; } catch (IOException ioe) { return DDC_FILE_ERROR; } riff_header.ckSize += NumBytes; return DDC_SUCCESS; } /** * Write NumBytes data. */ public int Write(short[] Data, int NumBytes ) { byte[] theData = new byte[NumBytes]; int yc = 0; for (int y = 0;y>> 8) & 0x00FF); } if ( fmode != RFM_WRITE ) { return DDC_INVALID_CALL; } try { file.write(theData,0,NumBytes); fmode = RFM_WRITE; } catch (IOException ioe) { return DDC_FILE_ERROR; } riff_header.ckSize += NumBytes; return DDC_SUCCESS; } /** * Write NumBytes data. */ public int Write(RiffChunkHeader Triff_header, int NumBytes ) { byte[] br = new byte[8]; br[0] = (byte) ((Triff_header.ckID >>> 24) & 0x000000FF); br[1] = (byte) ((Triff_header.ckID >>> 16) & 0x000000FF); br[2] = (byte) ((Triff_header.ckID >>> 8) & 0x000000FF); br[3] = (byte) (Triff_header.ckID & 0x000000FF); byte br4 = (byte) ((Triff_header.ckSize >>> 24)& 0x000000FF); byte br5 = (byte) ((Triff_header.ckSize >>> 16)& 0x000000FF); byte br6 = (byte) ((Triff_header.ckSize >>> 8)& 0x000000FF); byte br7 = (byte) (Triff_header.ckSize & 0x000000FF); br[4] = br7; br[5] = br6; br[6] = br5; br[7] = br4; if ( fmode != RFM_WRITE ) { return DDC_INVALID_CALL; } try { file.write(br,0,NumBytes); fmode = RFM_WRITE; } catch (IOException ioe) { return DDC_FILE_ERROR; } riff_header.ckSize += NumBytes; return DDC_SUCCESS; } /** * Write NumBytes data. */ public int Write(short Data, int NumBytes ) { short theData = (short) ( ((Data>>>8)&0x00FF) | ((Data<<8)&0xFF00) ); if ( fmode != RFM_WRITE ) { return DDC_INVALID_CALL; } try { file.writeShort(theData); fmode = RFM_WRITE; } catch (IOException ioe) { return DDC_FILE_ERROR; } riff_header.ckSize += NumBytes; return DDC_SUCCESS; } /** * Write NumBytes data. */ public int Write(int Data, int NumBytes ) { short theDataL = (short) ((Data>>>16)&0x0000FFFF); short theDataR = (short) (Data&0x0000FFFF); short theDataLI = (short) ( ((theDataL>>>8)&0x00FF) | ((theDataL<<8)&0xFF00) ); short theDataRI = (short) ( ((theDataR>>>8)&0x00FF) | ((theDataR<<8)&0xFF00) ); int theData = ((theDataRI<<16)&0xFFFF0000) | (theDataLI&0x0000FFFF); if ( fmode != RFM_WRITE ) { return DDC_INVALID_CALL; } try { file.writeInt(theData); fmode = RFM_WRITE; } catch (IOException ioe) { return DDC_FILE_ERROR; } riff_header.ckSize += NumBytes; return DDC_SUCCESS; } /** * Read NumBytes data. */ public int Read (byte[] Data, int NumBytes) { int retcode = DDC_SUCCESS; try { file.read(Data,0,NumBytes); } catch (IOException ioe) { retcode = DDC_FILE_ERROR; } return retcode; } /** * Expect NumBytes data. */ public int Expect(String Data, int NumBytes ) { byte target = 0; int cnt = 0; try { while ((NumBytes--) != 0) { target = file.readByte(); if (target != Data.charAt(cnt++)) return DDC_FILE_ERROR; } } catch (IOException ioe) { return DDC_FILE_ERROR; } return DDC_SUCCESS; } /** * Close Riff File. * Length is written too. */ public int Close() { int retcode = DDC_SUCCESS; switch ( fmode ) { case RFM_WRITE: try { file.seek(0); try { byte[] br = new byte[8]; br[0] = (byte) ((riff_header.ckID >>> 24) & 0x000000FF); br[1] = (byte) ((riff_header.ckID >>> 16) & 0x000000FF); br[2] = (byte) ((riff_header.ckID >>> 8) & 0x000000FF); br[3] = (byte) (riff_header.ckID & 0x000000FF); br[7] = (byte) ((riff_header.ckSize >>> 24)& 0x000000FF); br[6] = (byte) ((riff_header.ckSize >>> 16)& 0x000000FF); br[5] = (byte) ((riff_header.ckSize >>> 8)& 0x000000FF); br[4] = (byte) (riff_header.ckSize & 0x000000FF); file.write(br,0,8); file.close(); } catch (IOException ioe) { retcode = DDC_FILE_ERROR; } } catch (IOException ioe) { retcode = DDC_FILE_ERROR; } break; case RFM_READ: try { file.close(); } catch (IOException ioe) { retcode = DDC_FILE_ERROR; } break; } file = null; fmode = RFM_UNKNOWN; return retcode; } /** * Return File Position. */ public long CurrentFilePosition() { long position; try { position = file.getFilePointer(); } catch (IOException ioe) { position = -1; } return position; } /** * Write Data to specified offset. */ public int Backpatch (long FileOffset, RiffChunkHeader Data, int NumBytes ) { if (file == null) { return DDC_INVALID_CALL; } try { file.seek(FileOffset); } catch (IOException ioe) { return DDC_FILE_ERROR; } return Write ( Data, NumBytes ); } public int Backpatch (long FileOffset, byte[] Data, int NumBytes ) { if (file == null) { return DDC_INVALID_CALL; } try { file.seek(FileOffset); } catch (IOException ioe) { return DDC_FILE_ERROR; } return Write ( Data, NumBytes ); } /** * Seek in the File. */ protected int Seek(long offset) { int rc; try { file.seek(offset); rc = DDC_SUCCESS; } catch (IOException ioe) { rc = DDC_FILE_ERROR; } return rc; } /** * Error Messages. */ private String DDCRET_String(int retcode) { switch ( retcode ) { case DDC_SUCCESS: return "DDC_SUCCESS"; case DDC_FAILURE: return "DDC_FAILURE"; case DDC_OUT_OF_MEMORY: return "DDC_OUT_OF_MEMORY"; case DDC_FILE_ERROR: return "DDC_FILE_ERROR"; case DDC_INVALID_CALL: return "DDC_INVALID_CALL"; case DDC_USER_ABORT: return "DDC_USER_ABORT"; case DDC_INVALID_FILE: return "DDC_INVALID_FILE"; } return "Unknown Error"; } /** * Fill the header. */ public static int FourCC(String ChunkName) { //byte[] p = {0x20,0x20,0x20,0x20}; // ChunkName.getBytes(0,4,p,0); // int ret = (((p[0] << 24)& 0xFF000000) | ((p[1] << 16)&0x00FF0000) | ((p[2] << 8)&0x0000FF00) | (p[3]&0x000000FF)); //return ret; return ((((byte)(ChunkName.charAt(0)) << 24)& 0xFF000000) | (((byte)(ChunkName.charAt(1)) << 16)&0x00FF0000) | (((byte)(ChunkName.charAt(2)) << 8)&0x0000FF00) | ((byte)(ChunkName.charAt(3))&0x000000FF)); } } extensions/soundspi/javalayer/src/javazoom/jl/converter/WaveFile.java000066400000000000000000000323011335566474600265170ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 02/23/99 JavaConversion by E.B * Don Cross, April 1993. * RIFF file format classes. * See Chapter 8 of "Multimedia Programmer's Reference" in * the Microsoft Windows SDK. * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.converter; /** * Class allowing WaveFormat Access */ public class WaveFile extends RiffFile { public static final int MAX_WAVE_CHANNELS = 2; class WaveFormat_ChunkData { public short wFormatTag = 0; // Format category (PCM=1) public short nChannels = 0; // Number of channels (mono=1, stereo=2) public int nSamplesPerSec = 0; // Sampling rate [Hz] public int nAvgBytesPerSec = 0; public short nBlockAlign = 0; public short nBitsPerSample = 0; public WaveFormat_ChunkData() { wFormatTag = 1; // PCM Config(44100,(short)16,(short)1); } public void Config (int NewSamplingRate, short NewBitsPerSample, short NewNumChannels) { nSamplesPerSec = NewSamplingRate; nChannels = NewNumChannels; nBitsPerSample = NewBitsPerSample; nAvgBytesPerSec = (nChannels * nSamplesPerSec * nBitsPerSample) / 8; nBlockAlign = (short) ((nChannels * nBitsPerSample) / 8); } } class WaveFormat_Chunk { public RiffChunkHeader header; public WaveFormat_ChunkData data; public WaveFormat_Chunk() { header = new RiffChunkHeader(); data = new WaveFormat_ChunkData(); header.ckID = FourCC("fmt "); header.ckSize = 16; } public int VerifyValidity() { boolean ret = header.ckID == FourCC("fmt ") && (data.nChannels == 1 || data.nChannels == 2) && data.nAvgBytesPerSec == ( data.nChannels * data.nSamplesPerSec * data.nBitsPerSample ) / 8 && data.nBlockAlign == ( data.nChannels * data.nBitsPerSample ) / 8; if (ret == true) return 1; else return 0; } } public class WaveFileSample { public short[] chan; public WaveFileSample() {chan = new short[WaveFile.MAX_WAVE_CHANNELS];} } private WaveFormat_Chunk wave_format; private RiffChunkHeader pcm_data; private long pcm_data_offset = 0; // offset of 'pcm_data' in output file private int num_samples = 0; /** * Constructs a new WaveFile instance. */ public WaveFile() { pcm_data = new RiffChunkHeader(); wave_format = new WaveFormat_Chunk(); pcm_data.ckID = FourCC("data"); pcm_data.ckSize = 0; num_samples = 0; } /** * * public int OpenForRead (String Filename) { // Verify filename parameter as best we can... if (Filename == null) { return DDC_INVALID_CALL; } int retcode = Open ( Filename, RFM_READ ); if ( retcode == DDC_SUCCESS ) { retcode = Expect ( "WAVE", 4 ); if ( retcode == DDC_SUCCESS ) { retcode = Read(wave_format,24); if ( retcode == DDC_SUCCESS && !wave_format.VerifyValidity() ) { // This isn't standard PCM, so we don't know what it is! retcode = DDC_FILE_ERROR; } if ( retcode == DDC_SUCCESS ) { pcm_data_offset = CurrentFilePosition(); // Figure out number of samples from // file size, current file position, and // WAVE header. retcode = Read (pcm_data, 8 ); num_samples = filelength(fileno(file)) - CurrentFilePosition(); num_samples /= NumChannels(); num_samples /= (BitsPerSample() / 8); } } } return retcode; }*/ /** * */ public int OpenForWrite (String Filename, int SamplingRate, short BitsPerSample, short NumChannels) { // Verify parameters... if ( (Filename==null) || (BitsPerSample != 8 && BitsPerSample != 16) || NumChannels < 1 || NumChannels > 2 ) { return DDC_INVALID_CALL; } wave_format.data.Config ( SamplingRate, BitsPerSample, NumChannels ); int retcode = Open ( Filename, RFM_WRITE ); if ( retcode == DDC_SUCCESS ) { byte [] theWave = {(byte)'W',(byte)'A',(byte)'V',(byte)'E'}; retcode = Write ( theWave, 4 ); if ( retcode == DDC_SUCCESS ) { // Ecriture de wave_format retcode = Write (wave_format.header, 8); retcode = Write (wave_format.data.wFormatTag, 2); retcode = Write (wave_format.data.nChannels, 2); retcode = Write (wave_format.data.nSamplesPerSec, 4); retcode = Write (wave_format.data.nAvgBytesPerSec, 4); retcode = Write (wave_format.data.nBlockAlign, 2); retcode = Write (wave_format.data.nBitsPerSample, 2); /* byte[] br = new byte[16]; br[0] = (byte) ((wave_format.data.wFormatTag >> 8) & 0x00FF); br[1] = (byte) (wave_format.data.wFormatTag & 0x00FF); br[2] = (byte) ((wave_format.data.nChannels >> 8) & 0x00FF); br[3] = (byte) (wave_format.data.nChannels & 0x00FF); br[4] = (byte) ((wave_format.data.nSamplesPerSec >> 24)& 0x000000FF); br[5] = (byte) ((wave_format.data.nSamplesPerSec >> 16)& 0x000000FF); br[6] = (byte) ((wave_format.data.nSamplesPerSec >> 8)& 0x000000FF); br[7] = (byte) (wave_format.data.nSamplesPerSec & 0x000000FF); br[8] = (byte) ((wave_format.data.nAvgBytesPerSec>> 24)& 0x000000FF); br[9] = (byte) ((wave_format.data.nAvgBytesPerSec >> 16)& 0x000000FF); br[10] = (byte) ((wave_format.data.nAvgBytesPerSec >> 8)& 0x000000FF); br[11] = (byte) (wave_format.data.nAvgBytesPerSec & 0x000000FF); br[12] = (byte) ((wave_format.data.nBlockAlign >> 8) & 0x00FF); br[13] = (byte) (wave_format.data.nBlockAlign & 0x00FF); br[14] = (byte) ((wave_format.data.nBitsPerSample >> 8) & 0x00FF); br[15] = (byte) (wave_format.data.nBitsPerSample & 0x00FF); retcode = Write (br, 16); */ if ( retcode == DDC_SUCCESS ) { pcm_data_offset = CurrentFilePosition(); retcode = Write ( pcm_data, 8 ); } } } return retcode; } /** * * public int ReadSample ( short[] Sample ) { }*/ /** * * public int WriteSample( short[] Sample ) { int retcode = DDC_SUCCESS; switch ( wave_format.data.nChannels ) { case 1: switch ( wave_format.data.nBitsPerSample ) { case 8: pcm_data.ckSize += 1; retcode = Write ( Sample, 1 ); break; case 16: pcm_data.ckSize += 2; retcode = Write ( Sample, 2 ); break; default: retcode = DDC_INVALID_CALL; } break; case 2: switch ( wave_format.data.nBitsPerSample ) { case 8: retcode = Write ( Sample, 1 ); if ( retcode == DDC_SUCCESS ) { // &Sample[1] retcode = Write (Sample, 1 ); if ( retcode == DDC_SUCCESS ) { pcm_data.ckSize += 2; } } break; case 16: retcode = Write ( Sample, 2 ); if ( retcode == DDC_SUCCESS ) { // &Sample[1] retcode = Write (Sample, 2 ); if ( retcode == DDC_SUCCESS ) { pcm_data.ckSize += 4; } } break; default: retcode = DDC_INVALID_CALL; } break; default: retcode = DDC_INVALID_CALL; } return retcode; }*/ /** * * public int SeekToSample ( long SampleIndex ) { if ( SampleIndex >= NumSamples() ) { return DDC_INVALID_CALL; } int SampleSize = (BitsPerSample() + 7) / 8; int rc = Seek ( pcm_data_offset + 8 + SampleSize * NumChannels() * SampleIndex ); return rc; }*/ /** * Write 16-bit audio */ public int WriteData ( short[] data, int numData ) { int extraBytes = numData * 2; pcm_data.ckSize += extraBytes; return super.Write ( data, extraBytes ); } /** * Read 16-bit audio. * public int ReadData (short[] data, int numData) {return super.Read ( data, numData * 2);} */ /** * Write 8-bit audio. * public int WriteData ( byte[] data, int numData ) { pcm_data.ckSize += numData; return super.Write ( data, numData ); }*/ /** * Read 8-bit audio. * public int ReadData ( byte[] data, int numData ) {return super.Read ( data, numData );} */ /** * * public int ReadSamples (int num, int [] WaveFileSample) { }*/ /** * * public int WriteMonoSample ( short[] SampleData ) { switch ( wave_format.data.nBitsPerSample ) { case 8: pcm_data.ckSize += 1; return Write ( SampleData, 1 ); case 16: pcm_data.ckSize += 2; return Write ( SampleData, 2 ); } return DDC_INVALID_CALL; }*/ /** * * public int WriteStereoSample ( short[] LeftSample, short[] RightSample ) { int retcode = DDC_SUCCESS; switch ( wave_format.data.nBitsPerSample ) { case 8: retcode = Write ( LeftSample, 1 ); if ( retcode == DDC_SUCCESS ) { retcode = Write ( RightSample, 1 ); if ( retcode == DDC_SUCCESS ) { pcm_data.ckSize += 2; } } break; case 16: retcode = Write ( LeftSample, 2 ); if ( retcode == DDC_SUCCESS ) { retcode = Write ( RightSample, 2 ); if ( retcode == DDC_SUCCESS ) { pcm_data.ckSize += 4; } } break; default: retcode = DDC_INVALID_CALL; } return retcode; }*/ /** * * public int ReadMonoSample ( short[] Sample ) { int retcode = DDC_SUCCESS; switch ( wave_format.data.nBitsPerSample ) { case 8: byte[] x = {0}; retcode = Read ( x, 1 ); Sample[0] = (short)(x[0]); break; case 16: retcode = Read ( Sample, 2 ); break; default: retcode = DDC_INVALID_CALL; } return retcode; }*/ /** * * public int ReadStereoSample ( short[] LeftSampleData, short[] RightSampleData ) { int retcode = DDC_SUCCESS; byte[] x = new byte[2]; short[] y = new short[2]; switch ( wave_format.data.nBitsPerSample ) { case 8: retcode = Read ( x, 2 ); L[0] = (short) ( x[0] ); R[0] = (short) ( x[1] ); break; case 16: retcode = Read ( y, 4 ); L[0] = (short) ( y[0] ); R[0] = (short) ( y[1] ); break; default: retcode = DDC_INVALID_CALL; } return retcode; }*/ /** * */ public int Close() { int rc = DDC_SUCCESS; if ( fmode == RFM_WRITE ) rc = Backpatch ( pcm_data_offset, pcm_data, 8 ); if ( rc == DDC_SUCCESS ) rc = super.Close(); return rc; } // [Hz] public int SamplingRate() {return wave_format.data.nSamplesPerSec;} public short BitsPerSample() {return wave_format.data.nBitsPerSample;} public short NumChannels() {return wave_format.data.nChannels;} public int NumSamples() {return num_samples;} /** * Open for write using another wave file's parameters... */ public int OpenForWrite (String Filename, WaveFile OtherWave ) { return OpenForWrite ( Filename, OtherWave.SamplingRate(), OtherWave.BitsPerSample(), OtherWave.NumChannels() ); } /** * */ public long CurrentFilePosition() { return super.CurrentFilePosition(); } /* public int FourCC(String ChunkName) { byte[] p = {0x20,0x20,0x20,0x20}; ChunkName.getBytes(0,4,p,0); int ret = (((p[0] << 24)& 0xFF000000) | ((p[1] << 16)&0x00FF0000) | ((p[2] << 8)&0x0000FF00) | (p[3]&0x000000FF)); return ret; }*/ }extensions/soundspi/javalayer/src/javazoom/jl/converter/WaveFileObuffer.java000066400000000000000000000072231335566474600300350ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 12/12/99 0.0.7 Renamed class, additional constructor arguments * and larger write buffers. mdm@techie.com. * * 15/02/99 Java Conversion by E.B ,javalayer@javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.converter; import javazoom.jl.decoder.Obuffer; /** * Implements an Obuffer by writing the data to * a file in RIFF WAVE format. * * @since 0.0 */ public class WaveFileObuffer extends Obuffer { private short[] buffer; private short[] bufferp; private int channels; private WaveFile outWave; /** * Creates a new WareFileObuffer instance. * * @param number_of_channels * The number of channels of audio data * this buffer will receive. * * @param freq The sample frequency of the samples in the buffer. * * @param fileName The filename to write the data to. */ public WaveFileObuffer(int number_of_channels, int freq, String FileName) { if (FileName==null) throw new NullPointerException("FileName"); buffer = new short[OBUFFERSIZE]; bufferp = new short[MAXCHANNELS]; channels = number_of_channels; for (int i = 0; i < number_of_channels; ++i) bufferp[i] = (short)i; outWave = new WaveFile(); int rc = outWave.OpenForWrite (FileName,freq,(short)16,(short)channels); } /** * Takes a 16 Bit PCM sample. */ public void append(int channel, short value) { buffer[bufferp[channel]] = value; bufferp[channel] += channels; } /** * Write the samples to the file (Random Acces). */ short[] myBuffer = new short[2]; public void write_buffer(int val) { int k = 0; int rc = 0; rc = outWave.WriteData(buffer, bufferp[0]); // REVIEW: handle RiffFile errors. /* for (int j=0;j>8)&0x000000FF) | ((buffer[j]<<8)&0x0000FF00)); //myBuffer[1] = (short) (((buffer[j+1]>>8)&0x000000FF) | ((buffer[j+1]<<8)&0x0000FF00)); myBuffer[0] = buffer[j]; myBuffer[1] = buffer[j+1]; rc = outWave.WriteData (myBuffer,2); } */ for (int i = 0; i < channels; ++i) bufferp[i] = (short)i; } public void close() { outWave.Close(); } /** * */ public void clear_buffer() {} /** * */ public void set_stop_flag() {} /* * Create STDOUT buffer * * public static Obuffer create_stdout_obuffer(MPEG_Args maplay_args) { Obuffer thebuffer = null; int mode = maplay_args.MPEGheader.mode(); int which_channels = maplay_args.which_c; if (mode == Header.single_channel || which_channels != MPEG_Args.both) thebuffer = new FileObuffer(1,maplay_args.output_filename); else thebuffer = new FileObuffer(2,maplay_args.output_filename); return(thebuffer); } */ } extensions/soundspi/javalayer/src/javazoom/jl/converter/jlc.java000066400000000000000000000135671335566474600256020ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 29/01/00 Initial version. mdm@techie.com * * 12/12/99 JavaLayer 0.0.7 mdm@techie.com * * 14/02/99 MPEG_Args Based Class - E.B * Adapted from javalayer and MPEG_Args. * Doc'ed and integerated with JL converter. Removed * Win32 specifics from original Maplay code. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.converter; import java.io.PrintWriter; import javazoom.jl.decoder.Crc16; import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.decoder.OutputChannels; /** * The jlc class presents the JavaLayer * Conversion functionality as a command-line program. * * @since 0.0.7 */ public class jlc { static public void main(String args[]) { String[] argv; long start = System.currentTimeMillis(); int argc = args.length + 1; argv = new String[argc]; argv[0] = "jlc"; for(int i=0;i2) { try { String level = argv[i].substring(2); verbose_level = Integer.parseInt(level); } catch (NumberFormatException ex) { System.err.println("Invalid verbose level. Using default."); } } System.out.println("Verbose Activated (level "+verbose_level+")"); } /* else if (argv[i].equals("-s")) ma.stdout_mode = true; */ else if (argv[i].equals("-p")) { if (++i == argc) { System.out.println("Please specify an output filename after the -p option!"); System.exit (1); } //output_mode = O_WAVEFILE; output_filename = argv[i]; } /*else if (argv[i].equals("-f")) { if (++i == argc) { System.out.println("Please specify a new scalefactor after the -f option!"); System.exit(1); } ma.use_own_scalefactor = true; // ma.scalefactor = argv[i]; }*/ else return Usage(); } else { filename = argv[i]; System.out.println("FileName = "+argv[i]); if (filename == null) return Usage(); } i++; } if (filename == null) return Usage(); return true; } /** * Usage of JavaLayer. */ public boolean Usage() { System.out.println("JavaLayer Converter :"); System.out.println(" -v[x] verbose mode. "); System.out.println(" default = 2"); /* System.out.println(" -s write u-law samples at 8 kHz rate to stdout"); System.out.println(" -l decode only the left channel"); System.out.println(" -r decode only the right channel"); System.out.println(" -d downmix mode (layer III only)"); System.out.println(" -s write pcm samples to stdout"); System.out.println(" -d downmix mode (layer III only)");*/ System.out.println(" -p name output as a PCM wave file"); System.out.println(""); System.out.println(" More info on http://www.javazoom.net"); /* System.out.println(" -f ushort use this scalefactor instead of the default value 32768");*/ return false; } }; };extensions/soundspi/javalayer/src/javazoom/jl/decoder/000077500000000000000000000000001335566474600235515ustar00rootroot00000000000000extensions/soundspi/javalayer/src/javazoom/jl/decoder/BitReserve.java000066400000000000000000000115201335566474600264650ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 12/12/99 0.0.7 Implementation stores single bits * as ints for better performance. mdm@techie.com. * * 02/28/99 0.0 Java Conversion by E.B, javalayer@javazoom.net * * Adapted from the public c code by Jeff Tsay. * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Implementation of Bit Reservoir for Layer III. *

* The implementation stores single bits as a word in the buffer. If * a bit is set, the corresponding word in the buffer will be non-zero. * If a bit is clear, the corresponding word is zero. Although this * may seem waseful, this can be a factor of two quicker than * packing 8 bits to a byte and extracting. *

*/ // REVIEW: there is no range checking, so buffer underflow or overflow // can silently occur. final class BitReserve { /** * Size of the internal buffer to store the reserved bits. * Must be a power of 2. And x8, as each bit is stored as a single * entry. */ private static final int BUFSIZE = 4096*8; /** * Mask that can be used to quickly implement the * modulus operation on BUFSIZE. */ private static final int BUFSIZE_MASK = BUFSIZE-1; private int offset, totbit, buf_byte_idx; private final int[] buf = new int[BUFSIZE]; private int buf_bit_idx; BitReserve() { offset = 0; totbit = 0; buf_byte_idx = 0; } /** * Return totbit Field. */ public int hsstell() { return(totbit); } /** * Read a number bits from the bit stream. * @param N the number of */ public int hgetbits(int N) { totbit += N; int val = 0; int pos = buf_byte_idx; if (pos+N < BUFSIZE) { while (N-- > 0) { val <<= 1; val |= ((buf[pos++]!=0) ? 1 : 0); } } else { while (N-- > 0) { val <<= 1; val |= ((buf[pos]!=0) ? 1 : 0); pos = (pos+1) & BUFSIZE_MASK; } } buf_byte_idx = pos; return val; } /** * Read 1 bit from the bit stream. */ /* public int hget1bit_old() { int val; totbit++; if (buf_bit_idx == 0) { buf_bit_idx = 8; buf_byte_idx++; } // BUFSIZE = 4096 = 2^12, so // buf_byte_idx%BUFSIZE == buf_byte_idx & 0xfff val = buf[buf_byte_idx & BUFSIZE_MASK] & putmask[buf_bit_idx]; buf_bit_idx--; val = val >>> buf_bit_idx; return val; } */ /** * Returns next bit from reserve. * @returns 0 if next bit is reset, or 1 if next bit is set. */ public int hget1bit() { totbit++; int val = buf[buf_byte_idx]; buf_byte_idx = (buf_byte_idx+1) & BUFSIZE_MASK; return val; } /** * Retrieves bits from the reserve. */ /* public int readBits(int[] out, int len) { if (buf_bit_idx == 0) { buf_bit_idx = 8; buf_byte_idx++; current = buf[buf_byte_idx & BUFSIZE_MASK]; } // save total number of bits returned len = buf_bit_idx; buf_bit_idx = 0; int b = current; int count = len-1; while (count >= 0) { out[count--] = (b & 0x1); b >>>= 1; } totbit += len; return len; } */ /** * Write 8 bits into the bit stream. */ public void hputbuf(int val) { int ofs = offset; buf[ofs++] = val & 0x80; buf[ofs++] = val & 0x40; buf[ofs++] = val & 0x20; buf[ofs++] = val & 0x10; buf[ofs++] = val & 0x08; buf[ofs++] = val & 0x04; buf[ofs++] = val & 0x02; buf[ofs++] = val & 0x01; if (ofs==BUFSIZE) offset = 0; else offset = ofs; } /** * Rewind N bits in Stream. */ public void rewindNbits(int N) { totbit -= N; buf_byte_idx -= N; if (buf_byte_idx<0) buf_byte_idx += BUFSIZE; } /** * Rewind N bytes in Stream. */ public void rewindNbytes(int N) { int bits = (N << 3); totbit -= bits; buf_byte_idx -= bits; if (buf_byte_idx<0) buf_byte_idx += BUFSIZE; } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/Bitstream.java000066400000000000000000000363211335566474600263530ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 11/17/04 Uncomplete frames discarded. E.B, javalayer@javazoom.net * * 12/05/03 ID3v2 tag returned. E.B, javalayer@javazoom.net * * 12/12/99 Based on Ibitstream. Exceptions thrown on errors, * Temporary removed seek functionality. mdm@techie.com * * 02/12/99 : Java Conversion by E.B , javalayer@javazoom.net * * 04/14/97 : Added function prototypes for new syncing and seeking * mechanisms. Also made this file portable. Changes made by Jeff Tsay * * @(#) ibitstream.h 1.5, last edit: 6/15/94 16:55:34 * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de) * @(#) Berlin University of Technology *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; /** * The Bistream class is responsible for parsing * an MPEG audio bitstream. * * REVIEW: much of the parsing currently occurs in the * various decoders. This should be moved into this class and associated * inner classes. */ public final class Bitstream implements BitstreamErrors { /** * Synchronization control constant for the initial * synchronization to the start of a frame. */ static byte INITIAL_SYNC = 0; /** * Synchronization control constant for non-initial frame * synchronizations. */ static byte STRICT_SYNC = 1; // max. 1730 bytes per frame: 144 * 384kbit/s / 32000 Hz + 2 Bytes CRC /** * Maximum size of the frame buffer. */ private static final int BUFFER_INT_SIZE = 433; /** * The frame buffer that holds the data for the current frame. */ private final int[] framebuffer = new int[BUFFER_INT_SIZE]; /** * Number of valid bytes in the frame buffer. */ private int framesize; /** * The bytes read from the stream. */ private byte[] frame_bytes = new byte[BUFFER_INT_SIZE*4]; /** * Index into framebuffer where the next bits are * retrieved. */ private int wordpointer; /** * Number (0-31, from MSB to LSB) of next bit for get_bits() */ private int bitindex; /** * The current specified syncword */ private int syncword; /** * Audio header position in stream. */ private int header_pos = 0; /** * */ private boolean single_ch_mode; //private int current_frame_number; //private int last_frame_number; private final int bitmask[] = {0, // dummy 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF }; private final PushbackInputStream source; private final Header header = new Header(); private final byte syncbuf[] = new byte[4]; private Crc16[] crc = new Crc16[1]; private byte[] rawid3v2 = null; private boolean firstframe = true; /** * Construct a IBitstream that reads data from a * given InputStream. * * @param in The InputStream to read from. */ public Bitstream(InputStream in) { if (in==null) throw new NullPointerException("in"); in = new BufferedInputStream(in); loadID3v2(in); firstframe = true; //source = new PushbackInputStream(in, 1024); source = new PushbackInputStream(in, BUFFER_INT_SIZE*4); closeFrame(); //current_frame_number = -1; //last_frame_number = -1; } /** * Return position of the first audio header. * @return size of ID3v2 tag frames. */ public int header_pos() { return header_pos; } /** * Load ID3v2 frames. * @param in MP3 InputStream. * @author JavaZOOM */ private void loadID3v2(InputStream in) { int size = -1; try { // Read ID3v2 header (10 bytes). in.mark(10); size = readID3v2Header(in); header_pos = size; } catch (IOException e) {} finally { try { // Unread ID3v2 header (10 bytes). in.reset(); } catch (IOException e) {} } // Load ID3v2 tags. try { if (size > 0) { rawid3v2 = new byte[size]; in.read(rawid3v2,0,rawid3v2.length); } } catch (IOException e) {} } /** * Parse ID3v2 tag header to find out size of ID3v2 frames. * @param in MP3 InputStream * @return size of ID3v2 frames + header * @throws IOException * @author JavaZOOM */ private int readID3v2Header(InputStream in) throws IOException { byte[] id3header = new byte[4]; int size = -10; in.read(id3header,0,3); // Look for ID3v2 if ( (id3header[0]=='I') && (id3header[1]=='D') && (id3header[2]=='3')) { in.read(id3header,0,3); int majorVersion = id3header[0]; int revision = id3header[1]; in.read(id3header,0,4); size = (int) (id3header[0] << 21) + (id3header[1] << 14) + (id3header[2] << 7) + (id3header[3]); } return (size+10); } /** * Return raw ID3v2 frames + header. * @return ID3v2 InputStream or null if ID3v2 frames are not available. */ public InputStream getRawID3v2() { if (rawid3v2 == null) return null; else { ByteArrayInputStream bain = new ByteArrayInputStream(rawid3v2); return bain; } } /** * Close the Bitstream. * @throws BitstreamException */ public void close() throws BitstreamException { try { source.close(); } catch (IOException ex) { throw newBitstreamException(STREAM_ERROR, ex); } } /** * Reads and parses the next frame from the input source. * @return the Header describing details of the frame read, * or null if the end of the stream has been reached. */ public Header readFrame() throws BitstreamException { Header result = null; try { result = readNextFrame(); // E.B, Parse VBR (if any) first frame. if (firstframe == true) { result.parseVBR(frame_bytes); firstframe = false; } } catch (BitstreamException ex) { if ((ex.getErrorCode()==INVALIDFRAME)) { // Try to skip this frame. //System.out.println("INVALIDFRAME"); try { closeFrame(); result = readNextFrame(); } catch (BitstreamException e) { if ((e.getErrorCode()!=STREAM_EOF)) { // wrap original exception so stack trace is maintained. throw newBitstreamException(e.getErrorCode(), e); } } } else if ((ex.getErrorCode()!=STREAM_EOF)) { // wrap original exception so stack trace is maintained. throw newBitstreamException(ex.getErrorCode(), ex); } } return result; } /** * Read next MP3 frame. * @return MP3 frame header. * @throws BitstreamException */ private Header readNextFrame() throws BitstreamException { if (framesize == -1) { nextFrame(); } return header; } /** * Read next MP3 frame. * @throws BitstreamException */ private void nextFrame() throws BitstreamException { // entire frame is read by the header class. header.read_header(this, crc); } /** * Unreads the bytes read from the frame. * @throws BitstreamException */ // REVIEW: add new error codes for this. public void unreadFrame() throws BitstreamException { if (wordpointer==-1 && bitindex==-1 && (framesize>0)) { try { source.unread(frame_bytes, 0, framesize); } catch (IOException ex) { throw newBitstreamException(STREAM_ERROR); } } } /** * Close MP3 frame. */ public void closeFrame() { framesize = -1; wordpointer = -1; bitindex = -1; } /** * Determines if the next 4 bytes of the stream represent a * frame header. */ public boolean isSyncCurrentPosition(int syncmode) throws BitstreamException { int read = readBytes(syncbuf, 0, 4); int headerstring = ((syncbuf[0] << 24) & 0xFF000000) | ((syncbuf[1] << 16) & 0x00FF0000) | ((syncbuf[2] << 8) & 0x0000FF00) | ((syncbuf[3] << 0) & 0x000000FF); try { source.unread(syncbuf, 0, read); } catch (IOException ex) { } boolean sync = false; switch (read) { case 0: sync = true; break; case 4: sync = isSyncMark(headerstring, syncmode, syncword); break; } return sync; } // REVIEW: this class should provide inner classes to // parse the frame contents. Eventually, readBits will // be removed. public int readBits(int n) { return get_bits(n); } public int readCheckedBits(int n) { // REVIEW: implement CRC check. return get_bits(n); } protected BitstreamException newBitstreamException(int errorcode) { return new BitstreamException(errorcode, null); } protected BitstreamException newBitstreamException(int errorcode, Throwable throwable) { return new BitstreamException(errorcode, throwable); } /** * Get next 32 bits from bitstream. * They are stored in the headerstring. * syncmod allows Synchro flag ID * The returned value is False at the end of stream. */ int syncHeader(byte syncmode) throws BitstreamException { boolean sync; int headerstring; // read additional 2 bytes int bytesRead = readBytes(syncbuf, 0, 3); if (bytesRead!=3) throw newBitstreamException(STREAM_EOF, null); headerstring = ((syncbuf[0] << 16) & 0x00FF0000) | ((syncbuf[1] << 8) & 0x0000FF00) | ((syncbuf[2] << 0) & 0x000000FF); do { headerstring <<= 8; if (readBytes(syncbuf, 3, 1)!=1) throw newBitstreamException(STREAM_EOF, null); headerstring |= (syncbuf[3] & 0x000000FF); sync = isSyncMark(headerstring, syncmode, syncword); } while (!sync); //current_frame_number++; //if (last_frame_number < current_frame_number) last_frame_number = current_frame_number; return headerstring; } public boolean isSyncMark(int headerstring, int syncmode, int word) { boolean sync = false; if (syncmode == INITIAL_SYNC) { //sync = ((headerstring & 0xFFF00000) == 0xFFF00000); sync = ((headerstring & 0xFFE00000) == 0xFFE00000); // SZD: MPEG 2.5 } else { sync = ((headerstring & 0xFFF80C00) == word) && (((headerstring & 0x000000C0) == 0x000000C0) == single_ch_mode); } // filter out invalid sample rate if (sync) sync = (((headerstring >>> 10) & 3)!=3); // filter out invalid layer if (sync) sync = (((headerstring >>> 17) & 3)!=0); // filter out invalid version if (sync) sync = (((headerstring >>> 19) & 3)!=1); return sync; } /** * Reads the data for the next frame. The frame is not parsed * until parse frame is called. */ int read_frame_data(int bytesize) throws BitstreamException { int numread = 0; numread = readFully(frame_bytes, 0, bytesize); framesize = bytesize; wordpointer = -1; bitindex = -1; return numread; } /** * Parses the data previously read with read_frame_data(). */ void parse_frame() throws BitstreamException { // Convert Bytes read to int int b=0; byte[] byteread = frame_bytes; int bytesize = framesize; // Check ID3v1 TAG (True only if last frame). //for (int t=0;t<(byteread.length)-2;t++) //{ // if ((byteread[t]=='T') && (byteread[t+1]=='A') && (byteread[t+2]=='G')) // { // System.out.println("ID3v1 detected at offset "+t); // throw newBitstreamException(INVALIDFRAME, null); // } //} for (int k=0;k>> (32 - sum)) & bitmask[number_of_bits]; // returnvalue = (wordpointer[0] >> (32 - sum)) & bitmask[number_of_bits]; if ((bitindex += number_of_bits) == 32) { bitindex = 0; wordpointer++; // added by me! } return returnvalue; } // E.B : Check that ? //((short[])&returnvalue)[0] = ((short[])wordpointer + 1)[0]; //wordpointer++; // Added by me! //((short[])&returnvalue + 1)[0] = ((short[])wordpointer)[0]; int Right = (framebuffer[wordpointer] & 0x0000FFFF); wordpointer++; int Left = (framebuffer[wordpointer] & 0xFFFF0000); returnvalue = ((Right << 16) & 0xFFFF0000) | ((Left >>> 16)& 0x0000FFFF); returnvalue >>>= 48 - sum; // returnvalue >>= 16 - (number_of_bits - (32 - bitindex)) returnvalue &= bitmask[number_of_bits]; bitindex = sum - 32; return returnvalue; } /** * Set the word we want to sync the header to. * In Big-Endian byte order */ void set_syncword(int syncword0) { syncword = syncword0 & 0xFFFFFF3F; single_ch_mode = ((syncword0 & 0x000000C0) == 0x000000C0); } /** * Reads the exact number of bytes from the source * input stream into a byte array. * * @param b The byte array to read the specified number * of bytes into. * @param offs The index in the array where the first byte * read should be stored. * @param len the number of bytes to read. * * @exception BitstreamException is thrown if the specified * number of bytes could not be read from the stream. */ private int readFully(byte[] b, int offs, int len) throws BitstreamException { int nRead = 0; try { while (len > 0) { int bytesread = source.read(b, offs, len); if (bytesread == -1) { while (len-->0) { b[offs++] = 0; } break; //throw newBitstreamException(UNEXPECTED_EOF, new EOFException()); } nRead = nRead + bytesread; offs += bytesread; len -= bytesread; } } catch (IOException ex) { throw newBitstreamException(STREAM_ERROR, ex); } return nRead; } /** * Simlar to readFully, but doesn't throw exception when * EOF is reached. */ private int readBytes(byte[] b, int offs, int len) throws BitstreamException { int totalBytesRead = 0; try { while (len > 0) { int bytesread = source.read(b, offs, len); if (bytesread == -1) { break; } totalBytesRead += bytesread; offs += bytesread; len -= bytesread; } } catch (IOException ex) { throw newBitstreamException(STREAM_ERROR, ex); } return totalBytesRead; } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/BitstreamErrors.java000066400000000000000000000040461335566474600275470ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 11/17/04 INVALIDFRAME code added. javalayer@javazoom.net * 12/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * This interface describes all error codes that can be thrown * in BistreamExceptions. * * @see BitstreamException * * @author MDM 12/12/99 * @since 0.0.6 */ public interface BitstreamErrors extends JavaLayerErrors { /** * An undeterminable error occurred. */ static public final int UNKNOWN_ERROR = BITSTREAM_ERROR + 0; /** * The header describes an unknown sample rate. */ static public final int UNKNOWN_SAMPLE_RATE = BITSTREAM_ERROR + 1; /** * A problem occurred reading from the stream. */ static public final int STREAM_ERROR = BITSTREAM_ERROR + 2; /** * The end of the stream was reached prematurely. */ static public final int UNEXPECTED_EOF = BITSTREAM_ERROR + 3; /** * The end of the stream was reached. */ static public final int STREAM_EOF = BITSTREAM_ERROR + 4; /** * Frame data are missing. */ static public final int INVALIDFRAME = BITSTREAM_ERROR + 5; /** * */ static public final int BITSTREAM_LAST = 0x1ff; } extensions/soundspi/javalayer/src/javazoom/jl/decoder/BitstreamException.java000066400000000000000000000040751335566474600302330ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Instances of BitstreamException are thrown * when operations on a Bitstream fail. *

* The exception provides details of the exception condition * in two ways: *

  1. * as an error-code describing the nature of the error *


  2. * as the Throwable instance, if any, that was thrown * indicating that an exceptional condition has occurred. *

* * @since 0.0.6 * @author MDM 12/12/99 */ public class BitstreamException extends JavaLayerException implements BitstreamErrors { private int errorcode = UNKNOWN_ERROR; public BitstreamException(String msg, Throwable t) { super(msg, t); } public BitstreamException(int errorcode, Throwable t) { this(getErrorString(errorcode), t); this.errorcode = errorcode; } public int getErrorCode() { return errorcode; } static public String getErrorString(int errorcode) { // REVIEW: use resource bundle to map error codes // to locale-sensitive strings. return "Bitstream errorcode "+Integer.toHexString(errorcode); } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/Control.java000066400000000000000000000026341335566474600260410ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Work in progress. */ public interface Control { /** * Starts playback of the media presented by this control. */ public void start(); /** * Stops playback of the media presented by this control. */ public void stop(); public boolean isPlaying(); public void pause(); public boolean isRandomAccess(); /** * Retrieves the current position. */ public double getPosition(); /** * */ public void setPosition(double d); } extensions/soundspi/javalayer/src/javazoom/jl/decoder/Crc16.java000066400000000000000000000036211335566474600252740ustar00rootroot00000000000000/* * 11/19/04 : 1.0 moved to LGPL. * * 02/12/99 : Java Conversion by E.B , javalayer@javazoom.net * * @(#) crc.h 1.5, last edit: 6/15/94 16:55:32 * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de) * @(#) Berlin University of Technology *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * 16-Bit CRC checksum */ public final class Crc16 { private static short polynomial=(short)0x8005; private short crc; /** * Dummy Constructor */ public Crc16() { crc = (short) 0xFFFF; } /** * Feed a bitstring to the crc calculation (0 < length <= 32). */ public void add_bits (int bitstring, int length) { int bitmask = 1 << (length - 1); do if (((crc & 0x8000) == 0) ^ ((bitstring & bitmask) == 0 )) { crc <<= 1; crc ^= polynomial; } else crc <<= 1; while ((bitmask >>>= 1) != 0); } /** * Return the calculated checksum. * Erase it for next calls to add_bits(). */ public short checksum() { short sum = crc; crc = (short) 0xFFFF; return sum; } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/Decoder.java000066400000000000000000000205521335566474600257650ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 01/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * The Decoder class encapsulates the details of * decoding an MPEG audio frame. * * @author MDM * @version 0.0.7 12/12/99 * @since 0.0.5 */ public class Decoder implements DecoderErrors { static private final Params DEFAULT_PARAMS = new Params(); /** * The Bistream from which the MPEG audio frames are read. */ //private Bitstream stream; /** * The Obuffer instance that will receive the decoded * PCM samples. */ private Obuffer output; /** * Synthesis filter for the left channel. */ private SynthesisFilter filter1; /** * Sythesis filter for the right channel. */ private SynthesisFilter filter2; /** * The decoder used to decode layer III frames. */ private LayerIIIDecoder l3decoder; private LayerIIDecoder l2decoder; private LayerIDecoder l1decoder; private int outputFrequency; private int outputChannels; private Equalizer equalizer = new Equalizer(); private Params params; private boolean initialized; /** * Creates a new Decoder instance with default * parameters. */ public Decoder() { this(null); } /** * Creates a new Decoder instance with default * parameters. * * @param params The Params instance that describes * the customizable aspects of the decoder. */ public Decoder(Params params0) { if (params0==null) params0 = DEFAULT_PARAMS; params = params0; Equalizer eq = params.getInitialEqualizerSettings(); if (eq!=null) { equalizer.setFrom(eq); } } static public Params getDefaultParams() { return (Params)DEFAULT_PARAMS.clone(); } public void setEqualizer(Equalizer eq) { if (eq==null) eq = Equalizer.PASS_THRU_EQ; equalizer.setFrom(eq); float[] factors = equalizer.getBandFactors(); if (filter1!=null) filter1.setEQ(factors); if (filter2!=null) filter2.setEQ(factors); } /** * Decodes one frame from an MPEG audio bitstream. * * @param header The header describing the frame to decode. * @param bitstream The bistream that provides the bits for te body of the frame. * * @return A SampleBuffer containing the decoded samples. */ public Obuffer decodeFrame(Header header, Bitstream stream) throws DecoderException { if (!initialized) { initialize(header); } int layer = header.layer(); output.clear_buffer(); FrameDecoder decoder = retrieveDecoder(header, stream, layer); decoder.decodeFrame(); output.write_buffer(1); return output; } /** * Changes the output buffer. This will take effect the next time * decodeFrame() is called. */ public void setOutputBuffer(Obuffer out) { output = out; } /** * Retrieves the sample frequency of the PCM samples output * by this decoder. This typically corresponds to the sample * rate encoded in the MPEG audio stream. * * @param the sample rate (in Hz) of the samples written to the * output buffer when decoding. */ public int getOutputFrequency() { return outputFrequency; } /** * Retrieves the number of channels of PCM samples output by * this decoder. This usually corresponds to the number of * channels in the MPEG audio stream, although it may differ. * * @return The number of output channels in the decoded samples: 1 * for mono, or 2 for stereo. * */ public int getOutputChannels() { return outputChannels; } /** * Retrieves the maximum number of samples that will be written to * the output buffer when one frame is decoded. This can be used to * help calculate the size of other buffers whose size is based upon * the number of samples written to the output buffer. NB: this is * an upper bound and fewer samples may actually be written, depending * upon the sample rate and number of channels. * * @return The maximum number of samples that are written to the * output buffer when decoding a single frame of MPEG audio. */ public int getOutputBlockSize() { return Obuffer.OBUFFERSIZE; } protected DecoderException newDecoderException(int errorcode) { return new DecoderException(errorcode, null); } protected DecoderException newDecoderException(int errorcode, Throwable throwable) { return new DecoderException(errorcode, throwable); } protected FrameDecoder retrieveDecoder(Header header, Bitstream stream, int layer) throws DecoderException { FrameDecoder decoder = null; // REVIEW: allow channel output selection type // (LEFT, RIGHT, BOTH, DOWNMIX) switch (layer) { case 3: if (l3decoder==null) { l3decoder = new LayerIIIDecoder(stream, header, filter1, filter2, output, OutputChannels.BOTH_CHANNELS); } decoder = l3decoder; break; case 2: if (l2decoder==null) { l2decoder = new LayerIIDecoder(); l2decoder.create(stream, header, filter1, filter2, output, OutputChannels.BOTH_CHANNELS); } decoder = l2decoder; break; case 1: if (l1decoder==null) { l1decoder = new LayerIDecoder(); l1decoder.create(stream, header, filter1, filter2, output, OutputChannels.BOTH_CHANNELS); } decoder = l1decoder; break; } if (decoder==null) { throw newDecoderException(UNSUPPORTED_LAYER, null); } return decoder; } private void initialize(Header header) throws DecoderException { // REVIEW: allow customizable scale factor float scalefactor = 32700.0f; int mode = header.mode(); int layer = header.layer(); int channels = mode==Header.SINGLE_CHANNEL ? 1 : 2; // set up output buffer if not set up by client. if (output==null) output = new SampleBuffer(header.frequency(), channels); float[] factors = equalizer.getBandFactors(); filter1 = new SynthesisFilter(0, scalefactor, factors); // REVIEW: allow mono output for stereo if (channels==2) filter2 = new SynthesisFilter(1, scalefactor, factors); outputChannels = channels; outputFrequency = header.frequency(); initialized = true; } /** * The Params class presents the customizable * aspects of the decoder. *

* Instances of this class are not thread safe. */ public static class Params implements Cloneable { private OutputChannels outputChannels = OutputChannels.BOTH; private Equalizer equalizer = new Equalizer(); public Params() { } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException ex) { throw new InternalError(this+": "+ex); } } public void setOutputChannels(OutputChannels out) { if (out==null) throw new NullPointerException("out"); outputChannels = out; } public OutputChannels getOutputChannels() { return outputChannels; } /** * Retrieves the equalizer settings that the decoder's equalizer * will be initialized from. *

* The Equalizer instance returned * cannot be changed in real time to affect the * decoder output as it is used only to initialize the decoders * EQ settings. To affect the decoder's output in realtime, * use the Equalizer returned from the getEqualizer() method on * the decoder. * * @return The Equalizer used to initialize the * EQ settings of the decoder. */ public Equalizer getInitialEqualizerSettings() { return equalizer; } }; } extensions/soundspi/javalayer/src/javazoom/jl/decoder/DecoderErrors.java000066400000000000000000000025421335566474600271610ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 01/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * This interface provides constants describing the error * codes used by the Decoder to indicate errors. * * @author MDM */ public interface DecoderErrors extends JavaLayerErrors { static public final int UNKNOWN_ERROR = DECODER_ERROR + 0; /** * Layer not supported by the decoder. */ static public final int UNSUPPORTED_LAYER = DECODER_ERROR + 1; } extensions/soundspi/javalayer/src/javazoom/jl/decoder/DecoderException.java000066400000000000000000000033301335566474600276370ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 01/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * The DecoderException represents the class of * errors that can occur when decoding MPEG audio. * * @author MDM */ public class DecoderException extends JavaLayerException implements DecoderErrors { private int errorcode = UNKNOWN_ERROR; public DecoderException(String msg, Throwable t) { super(msg, t); } public DecoderException(int errorcode, Throwable t) { this(getErrorString(errorcode), t); this.errorcode = errorcode; } public int getErrorCode() { return errorcode; } static public String getErrorString(int errorcode) { // REVIEW: use resource file to map error codes // to locale-sensitive strings. return "Decoder errorcode "+Integer.toHexString(errorcode); } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/Equalizer.java000066400000000000000000000113331335566474600263560ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * The Equalizer class can be used to specify * equalization settings for the MPEG audio decoder. *

* The equalizer consists of 32 band-pass filters. * Each band of the equalizer can take on a fractional value between * -1.0 and +1.0. * At -1.0, the input signal is attenuated by 6dB, at +1.0 the signal is * amplified by 6dB. * * @see Decoder * * @author MDM */ public final class Equalizer { /** * Equalizer setting to denote that a given band will not be * present in the output signal. */ static public final float BAND_NOT_PRESENT = Float.NEGATIVE_INFINITY; static public final Equalizer PASS_THRU_EQ = new Equalizer(); private static final int BANDS = 32; private final float[] settings = new float[BANDS]; /** * Creates a new Equalizer instance. */ public Equalizer() { } // private Equalizer(float b1, float b2, float b3, float b4, float b5, // float b6, float b7, float b8, float b9, float b10, float b11, // float b12, float b13, float b14, float b15, float b16, // float b17, float b18, float b19, float b20); public Equalizer(float[] settings) { setFrom(settings); } public Equalizer(EQFunction eq) { setFrom(eq); } public void setFrom(float[] eq) { reset(); int max = (eq.length > BANDS) ? BANDS : eq.length; for (int i=0; i=0) && (band=0) && (band 1.0f) return 1.0f; if (eq < -1.0f) return -1.0f; return eq; } /** * Retrieves an array of floats whose values represent a * scaling factor that can be applied to linear samples * in each band to provide the equalization represented by * this instance. * * @return an array of factors that can be applied to the * subbands. */ float[] getBandFactors() { float[] factors = new float[BANDS]; for (int i=0, maxCount=BANDS; i>> 19) & 1); if (((headerstring >>> 20) & 1) == 0) // SZD: MPEG2.5 detection if (h_version == MPEG2_LSF) h_version = MPEG25_LSF; else throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR); if ((h_sample_frequency = ((headerstring >>> 10) & 3)) == 3) { throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR); } } h_layer = 4 - (headerstring >>> 17) & 3; h_protection_bit = (headerstring >>> 16) & 1; h_bitrate_index = (headerstring >>> 12) & 0xF; h_padding_bit = (headerstring >>> 9) & 1; h_mode = ((headerstring >>> 6) & 3); h_mode_extension = (headerstring >>> 4) & 3; if (h_mode == JOINT_STEREO) h_intensity_stereo_bound = (h_mode_extension << 2) + 4; else h_intensity_stereo_bound = 0; // should never be used if (((headerstring >>> 3) & 1) == 1) h_copyright = true; if (((headerstring >>> 2) & 1) == 1) h_original = true; // calculate number of subbands: if (h_layer == 1) h_number_of_subbands = 32; else { channel_bitrate = h_bitrate_index; // calculate bitrate per channel: if (h_mode != SINGLE_CHANNEL) if (channel_bitrate == 4) channel_bitrate = 1; else channel_bitrate -= 4; if ((channel_bitrate == 1) || (channel_bitrate == 2)) if (h_sample_frequency == THIRTYTWO) h_number_of_subbands = 12; else h_number_of_subbands = 8; else if ((h_sample_frequency == FOURTYEIGHT) || ((channel_bitrate >= 3) && (channel_bitrate <= 5))) h_number_of_subbands = 27; else h_number_of_subbands = 30; } if (h_intensity_stereo_bound > h_number_of_subbands) h_intensity_stereo_bound = h_number_of_subbands; // calculate framesize and nSlots calculate_framesize(); // read framedata: int framesizeloaded = stream.read_frame_data(framesize); if ((framesize >=0) && (framesizeloaded != framesize)) { // Data loaded does not match to expected framesize, // it might be an ID3v1 TAG. (Fix 11/17/04). throw stream.newBitstreamException(Bitstream.INVALIDFRAME); } if (stream.isSyncCurrentPosition(syncmode)) { if (syncmode == Bitstream.INITIAL_SYNC) { syncmode = Bitstream.STRICT_SYNC; stream.set_syncword(headerstring & 0xFFF80CC0); } sync = true; } else { stream.unreadFrame(); } } while (!sync); stream.parse_frame(); if (h_protection_bit == 0) { // frame contains a crc checksum checksum = (short) stream.get_bits(16); if (crc == null) crc = new Crc16(); crc.add_bits(headerstring, 16); crcp[0] = crc; } else crcp[0] = null; if (h_sample_frequency == FOURTYFOUR_POINT_ONE) { /* if (offset == null) { int max = max_number_of_frames(stream); offset = new int[max]; for(int i=0; i 0) && (cf == lf)) { offset[cf] = offset[cf-1] + h_padding_bit; } else { offset[0] = h_padding_bit; } */ } } /** * Parse frame to extract optionnal VBR frame. * @param firstframe * @author E.B (javalayer@javazoom.net) */ void parseVBR(byte[] firstframe) throws BitstreamException { // Trying Xing header. String xing = "Xing"; byte tmp[] = new byte[4]; int offset; // Compute "Xing" offset depending on MPEG version and channels. if (h_version == MPEG1) { if (h_mode == SINGLE_CHANNEL) offset=21-4; else offset=36-4; } else { if (h_mode == SINGLE_CHANNEL) offset=13-4; else offset = 21-4; } try { System.arraycopy(firstframe, offset, tmp, 0, 4); // Is "Xing" ? if (xing.equals(new String(tmp))) { //Yes. h_vbr = true; h_vbr_frames = -1; h_vbr_bytes = -1; h_vbr_scale = -1; h_vbr_toc = new byte[100]; int length = 4; // Read flags. byte flags[] = new byte[4]; System.arraycopy(firstframe, offset + length, flags, 0, flags.length); length += flags.length; // Read number of frames (if available). if ((flags[3] & (byte) (1)) != 0) { System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); h_vbr_frames = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; length += 4; } // Read size (if available). if ((flags[3] & (byte) (1 << 1)) != 0) { System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); h_vbr_bytes = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; length += 4; } // Read TOC (if available). if ((flags[3] & (byte) (1 << 2)) != 0) { System.arraycopy(firstframe, offset + length, h_vbr_toc, 0, h_vbr_toc.length); length += h_vbr_toc.length; } // Read scale (if available). if ((flags[3] & (byte) (1 << 3)) != 0) { System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); h_vbr_scale = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; length += 4; } //System.out.println("VBR:"+xing+" Frames:"+ h_vbr_frames +" Size:"+h_vbr_bytes); } } catch (ArrayIndexOutOfBoundsException e) { throw new BitstreamException("XingVBRHeader Corrupted",e); } // Trying VBRI header. String vbri = "VBRI"; offset = 36-4; try { System.arraycopy(firstframe, offset, tmp, 0, 4); // Is "VBRI" ? if (vbri.equals(new String(tmp))) { //Yes. h_vbr = true; h_vbr_frames = -1; h_vbr_bytes = -1; h_vbr_scale = -1; h_vbr_toc = new byte[100]; // Bytes. int length = 4 + 6; System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); h_vbr_bytes = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; length += 4; // Frames. System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); h_vbr_frames = (tmp[0] << 24)&0xFF000000 | (tmp[1] << 16)&0x00FF0000 | (tmp[2] << 8)&0x0000FF00 | tmp[3]&0x000000FF; length += 4; //System.out.println("VBR:"+vbri+" Frames:"+ h_vbr_frames +" Size:"+h_vbr_bytes); // TOC // TODO } } catch (ArrayIndexOutOfBoundsException e) { throw new BitstreamException("VBRIVBRHeader Corrupted",e); } } // Functions to query header contents: /** * Returns version. */ public int version() { return h_version; } /** * Returns Layer ID. */ public int layer() { return h_layer; } /** * Returns bitrate index. */ public int bitrate_index() { return h_bitrate_index; } /** * Returns Sample Frequency. */ public int sample_frequency() { return h_sample_frequency; } /** * Returns Frequency. */ public int frequency() {return frequencies[h_version][h_sample_frequency];} /** * Returns Mode. */ public int mode() { return h_mode; } /** * Returns Protection bit. */ public boolean checksums() { if (h_protection_bit == 0) return true; else return false; } /** * Returns Copyright. */ public boolean copyright() { return h_copyright; } /** * Returns Original. */ public boolean original() { return h_original; } /** * Return VBR. * @return true if VBR header is found */ public boolean vbr() { return h_vbr; } /** * Return VBR scale. * @return scale of -1 if not available */ public int vbr_scale() { return h_vbr_scale; } /** * Return VBR TOC. * @return vbr toc ot null if not available */ public byte[] vbr_toc() { return h_vbr_toc; } /** * Returns Checksum flag. * Compares computed checksum with stream checksum. */ public boolean checksum_ok () { return (checksum == crc.checksum()); } // Seeking and layer III stuff /** * Returns Layer III Padding bit. */ public boolean padding() { if (h_padding_bit == 0) return false; else return true; } /** * Returns Slots. */ public int slots() { return nSlots; } /** * Returns Mode Extension. */ public int mode_extension() { return h_mode_extension; } // E.B -> private to public public static final int bitrates[][][] = { {{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000 ,224000, 256000, 0}, {0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}, {0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}}, {{0 /*free format*/, 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000, 0}, {0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000, 0}, {0 /*free format*/, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 0}}, // SZD: MPEG2.5 {{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000 ,224000, 256000, 0}, {0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}, {0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}}, }; // E.B -> private to public /** * Calculate Frame size. * Calculates framesize in bytes excluding header size. */ public int calculate_framesize() { if (h_layer == 1) { framesize = (12 * bitrates[h_version][0][h_bitrate_index]) / frequencies[h_version][h_sample_frequency]; if (h_padding_bit != 0 ) framesize++; framesize <<= 2; // one slot is 4 bytes long nSlots = 0; } else { framesize = (144 * bitrates[h_version][h_layer - 1][h_bitrate_index]) / frequencies[h_version][h_sample_frequency]; if (h_version == MPEG2_LSF || h_version == MPEG25_LSF) framesize >>= 1; // SZD if (h_padding_bit != 0) framesize++; // Layer III slots if (h_layer == 3) { if (h_version == MPEG1) { nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 17 : 32) // side info size - ((h_protection_bit!=0) ? 0 : 2) // CRC size - 4; // header size } else { // MPEG-2 LSF, SZD: MPEG-2.5 LSF nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 9 : 17) // side info size - ((h_protection_bit!=0) ? 0 : 2) // CRC size - 4; // header size } } else { nSlots = 0; } } framesize -= 4; // subtract header size return framesize; } /** * Returns the maximum number of frames in the stream. * @param streamsize * @return number of frames */ public int max_number_of_frames(int streamsize) // E.B { if (h_vbr == true) return h_vbr_frames; else { if ((framesize + 4 - h_padding_bit) == 0) return 0; else return(streamsize / (framesize + 4 - h_padding_bit)); } } /** * Returns the maximum number of frames in the stream. * @param streamsize * @return number of frames */ public int min_number_of_frames(int streamsize) // E.B { if (h_vbr == true) return h_vbr_frames; else { if ((framesize + 5 - h_padding_bit) == 0) return 0; else return(streamsize / (framesize + 5 - h_padding_bit)); } } /** * Returns ms/frame. * @return milliseconds per frame */ public float ms_per_frame() // E.B { if (h_vbr == true) { double tpf = h_vbr_time_per_frame[layer()] / frequency(); if ((h_version == MPEG2_LSF) || (h_version == MPEG25_LSF)) tpf /= 2; return ((float) (tpf * 1000)); } else { float ms_per_frame_array[][] = {{8.707483f, 8.0f, 12.0f}, {26.12245f, 24.0f, 36.0f}, {26.12245f, 24.0f, 36.0f}}; return(ms_per_frame_array[h_layer-1][h_sample_frequency]); } } /** * Returns total ms. * @param streamsize * @return total milliseconds */ public float total_ms(int streamsize) // E.B { return(max_number_of_frames(streamsize) * ms_per_frame()); } /** * Returns synchronized header. */ public int getSyncHeader() // E.B { return _headerstring; } // functions which return header informations as strings: /** * Return Layer version. */ public String layer_string() { switch (h_layer) { case 1: return "I"; case 2: return "II"; case 3: return "III"; } return null; } // E.B -> private to public public static final String bitrate_str[][][] = { {{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", "176 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "forbidden"}, {"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", "forbidden"}, {"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", "forbidden"}}, {{"free format", "32 kbit/s", "64 kbit/s", "96 kbit/s", "128 kbit/s", "160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "288 kbit/s", "320 kbit/s", "352 kbit/s", "384 kbit/s", "416 kbit/s", "448 kbit/s", "forbidden"}, {"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "320 kbit/s", "384 kbit/s", "forbidden"}, {"free format", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s" , "96 kbit/s", "112 kbit/s", "128 kbit/s", "160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "320 kbit/s", "forbidden"}}, // SZD: MPEG2.5 {{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", "176 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "forbidden"}, {"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", "forbidden"}, {"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", "forbidden"}}, }; /** * Return Bitrate. * @return bitrate in bps */ public String bitrate_string() { if (h_vbr == true) { return Integer.toString(bitrate()/1000)+" kb/s"; } else return bitrate_str[h_version][h_layer - 1][h_bitrate_index]; } /** * Return Bitrate. * @return bitrate in bps and average bitrate for VBR header */ public int bitrate() { if (h_vbr == true) { return ((int) ((h_vbr_bytes * 8) / (ms_per_frame() * h_vbr_frames)))*1000; } else return bitrates[h_version][h_layer - 1][h_bitrate_index]; } /** * Return Instant Bitrate. * Bitrate for VBR is not constant. * @return bitrate in bps */ public int bitrate_instant() { return bitrates[h_version][h_layer - 1][h_bitrate_index]; } /** * Returns Frequency * @return frequency string in kHz */ public String sample_frequency_string() { switch (h_sample_frequency) { case THIRTYTWO: if (h_version == MPEG1) return "32 kHz"; else if (h_version == MPEG2_LSF) return "16 kHz"; else // SZD return "8 kHz"; case FOURTYFOUR_POINT_ONE: if (h_version == MPEG1) return "44.1 kHz"; else if (h_version == MPEG2_LSF) return "22.05 kHz"; else // SZD return "11.025 kHz"; case FOURTYEIGHT: if (h_version == MPEG1) return "48 kHz"; else if (h_version == MPEG2_LSF) return "24 kHz"; else // SZD return "12 kHz"; } return(null); } /** * Returns Mode. */ public String mode_string() { switch (h_mode) { case STEREO: return "Stereo"; case JOINT_STEREO: return "Joint stereo"; case DUAL_CHANNEL: return "Dual channel"; case SINGLE_CHANNEL: return "Single channel"; } return null; } /** * Returns Version. * @return MPEG-1 or MPEG-2 LSF or MPEG-2.5 LSF */ public String version_string() { switch (h_version) { case MPEG1: return "MPEG-1"; case MPEG2_LSF: return "MPEG-2 LSF"; case MPEG25_LSF: // SZD return "MPEG-2.5 LSF"; } return(null); } /** * Returns the number of subbands in the current frame. * @return number of subbands */ public int number_of_subbands() {return h_number_of_subbands;} /** * Returns Intensity Stereo. * (Layer II joint stereo only). * Returns the number of subbands which are in stereo mode, * subbands above that limit are in intensity stereo mode. * @return intensity */ public int intensity_stereo_bound() {return h_intensity_stereo_bound;} } extensions/soundspi/javalayer/src/javazoom/jl/decoder/InputStreamSource.java000066400000000000000000000036311335566474600300530ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; import java.io.IOException; import java.io.InputStream; /** * Work In Progress. * * An instance of InputStreamSource implements a * Source that provides data from an InputStream * . Seeking functionality is not supported. * * @author MDM */ public class InputStreamSource implements Source { private final InputStream in; public InputStreamSource(InputStream in) { if (in==null) throw new NullPointerException("in"); this.in = in; } public int read(byte[] b, int offs, int len) throws IOException { int read = in.read(b, offs, len); return read; } public boolean willReadBlock() { return true; //boolean block = (in.available()==0); //return block; } public boolean isSeekable() { return false; } public long tell() { return -1; } public long seek(long to) { return -1; } public long length() { return -1; } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/JavaLayerError.java000066400000000000000000000022331335566474600273040ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Work in progress. * * API usage errors may be handled by throwing an instance of this * class, as per JMF 2.0. */ public class JavaLayerError extends Error { } extensions/soundspi/javalayer/src/javazoom/jl/decoder/JavaLayerErrors.java000066400000000000000000000027121335566474600274710ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Exception erorr codes for components of the JavaLayer API. */ public interface JavaLayerErrors { /** * The first bitstream error code. See the {@link DecoderErrors DecoderErrors} * interface for other bitstream error codes. */ static public final int BITSTREAM_ERROR = 0x100; /** * The first decoder error code. See the {@link DecoderErrors DecoderErrors} * interface for other decoder error codes. */ static public final int DECODER_ERROR = 0x200; } extensions/soundspi/javalayer/src/javazoom/jl/decoder/JavaLayerException.java000066400000000000000000000035741335566474600301620ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; import java.io.PrintStream; /** * The JavaLayerException is the base class for all API-level * exceptions thrown by JavaLayer. To facilitate conversion and * common handling of exceptions from other domains, the class * can delegate some functionality to a contained Throwable instance. *

* * @author MDM */ public class JavaLayerException extends Exception { private Throwable exception; public JavaLayerException() { } public JavaLayerException(String msg) { super(msg); } public JavaLayerException(String msg, Throwable t) { super(msg); exception = t; } public Throwable getException() { return exception; } public void printStackTrace() { printStackTrace(System.err); } public void printStackTrace(PrintStream ps) { if (this.exception==null) { super.printStackTrace(ps); } else { exception.printStackTrace(); } } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/JavaLayerHook.java000066400000000000000000000024671335566474600271240ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; import java.io.InputStream; /** * The JavaLayerHooks class allows developers to change * the way the JavaLayer library uses Resources. */ public interface JavaLayerHook { /** * Retrieves the named resource. This allows resources to be * obtained without specifying how they are retrieved. */ public InputStream getResourceAsStream(String name); } extensions/soundspi/javalayer/src/javazoom/jl/decoder/JavaLayerUtils.java000066400000000000000000000126371335566474600273240ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; import java.io.IOException; import java.io.InputStream; import java.io.InvalidClassException; import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.lang.reflect.Array; /** * The JavaLayerUtils class is not strictly part of the JavaLayer API. * It serves to provide useful methods and system-wide hooks. * * @author MDM */ public class JavaLayerUtils { static private JavaLayerHook hook = null; /** * Deserializes the object contained in the given input stream. * @param in The input stream to deserialize an object from. * @param cls The expected class of the deserialized object. */ static public Object deserialize(InputStream in, Class cls) throws IOException { if (cls==null) throw new NullPointerException("cls"); Object obj = deserialize(in, cls); if (!cls.isInstance(obj)) { throw new InvalidObjectException("type of deserialized instance not of required class."); } return obj; } /** * Deserializes an object from the given InputStream. * The deserialization is delegated to an * ObjectInputStream instance. * * @param in The InputStream to deserialize an object * from. * * @return The object deserialized from the stream. * @exception IOException is thrown if there was a problem reading * the underlying stream, or an object could not be deserialized * from the stream. * * @see java.io.ObjectInputStream */ static public Object deserialize(InputStream in) throws IOException { if (in==null) throw new NullPointerException("in"); ObjectInputStream objIn = new ObjectInputStream(in); Object obj; try { obj = objIn.readObject(); } catch (ClassNotFoundException ex) { throw new InvalidClassException(ex.toString()); } return obj; } /** * Deserializes an array from a given InputStream. * * @param in The InputStream to * deserialize an object from. * * @param elemType The class denoting the type of the array * elements. * @param length The expected length of the array, or -1 if * any length is expected. */ static public Object deserializeArray(InputStream in, Class elemType, int length) throws IOException { if (elemType==null) throw new NullPointerException("elemType"); if (length<-1) throw new IllegalArgumentException("length"); Object obj = deserialize(in); Class cls = obj.getClass(); if (!cls.isArray()) throw new InvalidObjectException("object is not an array"); Class arrayElemType = cls.getComponentType(); if (arrayElemType!=elemType) throw new InvalidObjectException("unexpected array component type"); if (length != -1) { int arrayLength = Array.getLength(obj); if (arrayLength!=length) throw new InvalidObjectException("array length mismatch"); } return obj; } static public Object deserializeArrayResource(String name, Class elemType, int length) throws IOException { InputStream str = getResourceAsStream(name); if (str==null) throw new IOException("unable to load resource '"+name+"'"); Object obj = deserializeArray(str, elemType, length); return obj; } static public void serialize(OutputStream out, Object obj) throws IOException { if (out==null) throw new NullPointerException("out"); if (obj==null) throw new NullPointerException("obj"); ObjectOutputStream objOut = new ObjectOutputStream(out); objOut.writeObject(obj); } /** * Sets the system-wide JavaLayer hook. */ static synchronized public void setHook(JavaLayerHook hook0) { hook = hook0; } static synchronized public JavaLayerHook getHook() { return hook; } /** * Retrieves an InputStream for a named resource. * * @param name The name of the resource. This must be a simple * name, and not a qualified package name. * * @return The InputStream for the named resource, or null if * the resource has not been found. If a hook has been * provided, its getResourceAsStream() method is called * to retrieve the resource. */ static synchronized public InputStream getResourceAsStream(String name) { InputStream is = null; if (hook!=null) { is = hook.getResourceAsStream(name); } else { Class cls = JavaLayerUtils.class; is = cls.getResourceAsStream(name); } return is; } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/LayerIDecoder.java000066400000000000000000000313161335566474600270730ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 12/12/99 Initial version. Adapted from javalayer.java * and Subband*.java. mdm@techie.com * * 02/28/99 Initial version : javalayer.java by E.B *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Implements decoding of MPEG Audio Layer I frames. */ class LayerIDecoder implements FrameDecoder { protected Bitstream stream; protected Header header; protected SynthesisFilter filter1, filter2; protected Obuffer buffer; protected int which_channels; protected int mode; protected int num_subbands; protected Subband[] subbands; protected Crc16 crc = null; // new Crc16[1] to enable CRC checking. public LayerIDecoder() { crc = new Crc16(); } public void create(Bitstream stream0, Header header0, SynthesisFilter filtera, SynthesisFilter filterb, Obuffer buffer0, int which_ch0) { stream = stream0; header = header0; filter1 = filtera; filter2 = filterb; buffer = buffer0; which_channels = which_ch0; } public void decodeFrame() { num_subbands = header.number_of_subbands(); subbands = new Subband[32]; mode = header.mode(); createSubbands(); readAllocation(); readScaleFactorSelection(); if ((crc != null) || header.checksum_ok()) { readScaleFactors(); readSampleData(); } } protected void createSubbands() { int i; if (mode == Header.SINGLE_CHANNEL) for (i = 0; i < num_subbands; ++i) subbands[i] = new SubbandLayer1(i); else if (mode == Header.JOINT_STEREO) { for (i = 0; i < header.intensity_stereo_bound(); ++i) subbands[i] = new SubbandLayer1Stereo(i); for (; i < num_subbands; ++i) subbands[i] = new SubbandLayer1IntensityStereo(i); } else { for (i = 0; i < num_subbands; ++i) subbands[i] = new SubbandLayer1Stereo(i); } } protected void readAllocation() { // start to read audio data: for (int i = 0; i < num_subbands; ++i) subbands[i].read_allocation(stream, header, crc); } protected void readScaleFactorSelection() { // scale factor selection not present for layer I. } protected void readScaleFactors() { for (int i = 0; i < num_subbands; ++i) subbands[i].read_scalefactor(stream, header); } protected void readSampleData() { boolean read_ready = false; boolean write_ready = false; int mode = header.mode(); int i; do { for (i = 0; i < num_subbands; ++i) read_ready = subbands[i].read_sampledata(stream); do { for (i = 0; i < num_subbands; ++i) write_ready = subbands[i].put_next_sample(which_channels,filter1, filter2); filter1.calculate_pcm_samples(buffer); if ((which_channels == OutputChannels.BOTH_CHANNELS) && (mode != Header.SINGLE_CHANNEL)) filter2.calculate_pcm_samples(buffer); } while (!write_ready); } while (!read_ready); } /** * Abstract base class for subband classes of layer I and II */ static abstract class Subband { /* * Changes from version 1.1 to 1.2: * - array size increased by one, although a scalefactor with index 63 * is illegal (to prevent segmentation faults) */ // Scalefactors for layer I and II, Annex 3-B.1 in ISO/IEC DIS 11172: public static final float scalefactors[] = { 2.00000000000000f, 1.58740105196820f, 1.25992104989487f, 1.00000000000000f, 0.79370052598410f, 0.62996052494744f, 0.50000000000000f, 0.39685026299205f, 0.31498026247372f, 0.25000000000000f, 0.19842513149602f, 0.15749013123686f, 0.12500000000000f, 0.09921256574801f, 0.07874506561843f, 0.06250000000000f, 0.04960628287401f, 0.03937253280921f, 0.03125000000000f, 0.02480314143700f, 0.01968626640461f, 0.01562500000000f, 0.01240157071850f, 0.00984313320230f, 0.00781250000000f, 0.00620078535925f, 0.00492156660115f, 0.00390625000000f, 0.00310039267963f, 0.00246078330058f, 0.00195312500000f, 0.00155019633981f, 0.00123039165029f, 0.00097656250000f, 0.00077509816991f, 0.00061519582514f, 0.00048828125000f, 0.00038754908495f, 0.00030759791257f, 0.00024414062500f, 0.00019377454248f, 0.00015379895629f, 0.00012207031250f, 0.00009688727124f, 0.00007689947814f, 0.00006103515625f, 0.00004844363562f, 0.00003844973907f, 0.00003051757813f, 0.00002422181781f, 0.00001922486954f, 0.00001525878906f, 0.00001211090890f, 0.00000961243477f, 0.00000762939453f, 0.00000605545445f, 0.00000480621738f, 0.00000381469727f, 0.00000302772723f, 0.00000240310869f, 0.00000190734863f, 0.00000151386361f, 0.00000120155435f, 0.00000000000000f /* illegal scalefactor */ }; public abstract void read_allocation (Bitstream stream, Header header, Crc16 crc); public abstract void read_scalefactor (Bitstream stream, Header header); public abstract boolean read_sampledata (Bitstream stream); public abstract boolean put_next_sample (int channels, SynthesisFilter filter1, SynthesisFilter filter2); }; /** * Class for layer I subbands in single channel mode. * Used for single channel mode * and in derived class for intensity stereo mode */ static class SubbandLayer1 extends Subband { // Factors and offsets for sample requantization public static final float table_factor[] = { 0.0f, (1.0f/2.0f) * (4.0f/3.0f), (1.0f/4.0f) * (8.0f/7.0f), (1.0f/8.0f) * (16.0f/15.0f), (1.0f/16.0f) * (32.0f/31.0f), (1.0f/32.0f) * (64.0f/63.0f), (1.0f/64.0f) * (128.0f/127.0f), (1.0f/128.0f) * (256.0f/255.0f), (1.0f/256.0f) * (512.0f/511.0f), (1.0f/512.0f) * (1024.0f/1023.0f), (1.0f/1024.0f) * (2048.0f/2047.0f), (1.0f/2048.0f) * (4096.0f/4095.0f), (1.0f/4096.0f) * (8192.0f/8191.0f), (1.0f/8192.0f) * (16384.0f/16383.0f), (1.0f/16384.0f) * (32768.0f/32767.0f) }; public static final float table_offset[] = { 0.0f, ((1.0f/2.0f)-1.0f) * (4.0f/3.0f), ((1.0f/4.0f)-1.0f) * (8.0f/7.0f), ((1.0f/8.0f)-1.0f) * (16.0f/15.0f), ((1.0f/16.0f)-1.0f) * (32.0f/31.0f), ((1.0f/32.0f)-1.0f) * (64.0f/63.0f), ((1.0f/64.0f)-1.0f) * (128.0f/127.0f), ((1.0f/128.0f)-1.0f) * (256.0f/255.0f), ((1.0f/256.0f)-1.0f) * (512.0f/511.0f), ((1.0f/512.0f)-1.0f) * (1024.0f/1023.0f), ((1.0f/1024.0f)-1.0f) * (2048.0f/2047.0f), ((1.0f/2048.0f)-1.0f) * (4096.0f/4095.0f), ((1.0f/4096.0f)-1.0f) * (8192.0f/8191.0f), ((1.0f/8192.0f)-1.0f) * (16384.0f/16383.0f), ((1.0f/16384.0f)-1.0f) * (32768.0f/32767.0f) }; protected int subbandnumber; protected int samplenumber; protected int allocation; protected float scalefactor; protected int samplelength; protected float sample; protected float factor, offset; /** * Construtor. */ public SubbandLayer1(int subbandnumber) { this.subbandnumber = subbandnumber; samplenumber = 0; } /** * */ public void read_allocation(Bitstream stream, Header header, Crc16 crc) { if ((allocation = stream.get_bits (4)) == 15) ; // cerr << "WARNING: stream contains an illegal allocation!\n"; // MPEG-stream is corrupted! if (crc != null) crc.add_bits (allocation, 4); if (allocation != 0) { samplelength = allocation + 1; factor = table_factor[allocation]; offset = table_offset[allocation]; } } /** * */ public void read_scalefactor(Bitstream stream, Header header) { if (allocation != 0) scalefactor = scalefactors[stream.get_bits(6)]; } /** * */ public boolean read_sampledata(Bitstream stream) { if (allocation != 0) { sample = (float) (stream.get_bits(samplelength)); } if (++samplenumber == 12) { samplenumber = 0; return true; } return false; } /** * */ public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) { if ((allocation !=0) && (channels != OutputChannels.RIGHT_CHANNEL)) { float scaled_sample = (sample * factor + offset) * scalefactor; filter1.input_sample (scaled_sample, subbandnumber); } return true; } }; /** * Class for layer I subbands in joint stereo mode. */ static class SubbandLayer1IntensityStereo extends SubbandLayer1 { protected float channel2_scalefactor; /** * Constructor */ public SubbandLayer1IntensityStereo(int subbandnumber) { super(subbandnumber); } /** * */ public void read_allocation(Bitstream stream, Header header, Crc16 crc) { super.read_allocation (stream, header, crc); } /** * */ public void read_scalefactor (Bitstream stream, Header header) { if (allocation != 0) { scalefactor = scalefactors[stream.get_bits(6)]; channel2_scalefactor = scalefactors[stream.get_bits(6)]; } } /** * */ public boolean read_sampledata(Bitstream stream) { return super.read_sampledata (stream); } /** * */ public boolean put_next_sample (int channels, SynthesisFilter filter1, SynthesisFilter filter2) { if (allocation !=0 ) { sample = sample * factor + offset; // requantization if (channels == OutputChannels.BOTH_CHANNELS) { float sample1 = sample * scalefactor, sample2 = sample * channel2_scalefactor; filter1.input_sample(sample1, subbandnumber); filter2.input_sample(sample2, subbandnumber); } else if (channels == OutputChannels.LEFT_CHANNEL) { float sample1 = sample * scalefactor; filter1.input_sample(sample1, subbandnumber); } else { float sample2 = sample * channel2_scalefactor; filter1.input_sample(sample2, subbandnumber); } } return true; } }; /** * Class for layer I subbands in stereo mode. */ static class SubbandLayer1Stereo extends SubbandLayer1 { protected int channel2_allocation; protected float channel2_scalefactor; protected int channel2_samplelength; protected float channel2_sample; protected float channel2_factor, channel2_offset; /** * Constructor */ public SubbandLayer1Stereo(int subbandnumber) { super(subbandnumber); } /** * */ public void read_allocation (Bitstream stream, Header header, Crc16 crc) { allocation = stream.get_bits(4); channel2_allocation = stream.get_bits(4); if (crc != null) { crc.add_bits (allocation, 4); crc.add_bits (channel2_allocation, 4); } if (allocation != 0) { samplelength = allocation + 1; factor = table_factor[allocation]; offset = table_offset[allocation]; } if (channel2_allocation != 0) { channel2_samplelength = channel2_allocation + 1; channel2_factor = table_factor[channel2_allocation]; channel2_offset = table_offset[channel2_allocation]; } } /** * */ public void read_scalefactor(Bitstream stream, Header header) { if (allocation != 0) scalefactor = scalefactors[stream.get_bits(6)]; if (channel2_allocation != 0) channel2_scalefactor = scalefactors[stream.get_bits(6)]; } /** * */ public boolean read_sampledata (Bitstream stream) { boolean returnvalue = super.read_sampledata(stream); if (channel2_allocation != 0) { channel2_sample = (float) (stream.get_bits(channel2_samplelength)); } return(returnvalue); } /** * */ public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) { super.put_next_sample (channels, filter1, filter2); if ((channel2_allocation != 0) && (channels != OutputChannels.LEFT_CHANNEL)) { float sample2 = (channel2_sample * channel2_factor + channel2_offset) * channel2_scalefactor; if (channels == OutputChannels.BOTH_CHANNELS) filter2.input_sample (sample2, subbandnumber); else filter1.input_sample (sample2, subbandnumber); } return true; } }; } extensions/soundspi/javalayer/src/javazoom/jl/decoder/LayerIIDecoder.java000066400000000000000000001527361335566474600272160ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 29/05/01 Michael Scheerer, Fixed some C++ to Java porting bugs. * * 16/07/01 Michael Scheerer, Catched a bug in method * read_sampledata, which causes an outOfIndexException. * * 12/12/99 Initial version. Adapted from javalayer.java * and Subband*.java. mdm@techie.com * * 02/28/99 Initial version : javalayer.java by E.B *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Implements decoding of MPEG Audio Layer II frames. */ class LayerIIDecoder extends LayerIDecoder implements FrameDecoder { public LayerIIDecoder() { } protected void createSubbands() { int i; if (mode == Header.SINGLE_CHANNEL) for (i = 0; i < num_subbands; ++i) subbands[i] = new SubbandLayer2(i); else if (mode == Header.JOINT_STEREO) { for (i = 0; i < header.intensity_stereo_bound(); ++i) subbands[i] = new SubbandLayer2Stereo(i); for (; i < num_subbands; ++i) subbands[i] = new SubbandLayer2IntensityStereo(i); } else { for (i = 0; i < num_subbands; ++i) subbands[i] = new SubbandLayer2Stereo(i); } } protected void readScaleFactorSelection() { for (int i = 0; i < num_subbands; ++i) ((SubbandLayer2)subbands[i]).read_scalefactor_selection(stream, crc); } /** * Class for layer II subbands in single channel mode. */ static class SubbandLayer2 extends Subband { // this table contains 3 requantized samples for each legal codeword // when grouped in 5 bits, i.e. 3 quantizationsteps per sample public static final float grouping_5bits[] = new float[] { -2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f, 0.0f, -2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f, 0.0f, -2.0f/3.0f, 0.0f, 0.0f, -2.0f/3.0f, 2.0f/3.0f, 0.0f, -2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f, 0.0f, 2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f, -2.0f/3.0f, 0.0f, 0.0f, -2.0f/3.0f, 0.0f, 2.0f/3.0f, -2.0f/3.0f, 0.0f, -2.0f/3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f/3.0f, 0.0f, 0.0f, -2.0f/3.0f, 2.0f/3.0f, 0.0f, 0.0f, 2.0f/3.0f, 0.0f, 2.0f/3.0f, 2.0f/3.0f, 0.0f, -2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f, 0.0f, -2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f, -2.0f/3.0f, 0.0f, 2.0f/3.0f, 0.0f, 0.0f, 2.0f/3.0f, 2.0f/3.0f, 0.0f, 2.0f/3.0f, -2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f, 0.0f, 2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f }; // this table contains 3 requantized samples for each legal codeword // when grouped in 7 bits, i.e. 5 quantizationsteps per sample public static final float grouping_7bits[] = new float[] { -0.8f, -0.8f, -0.8f, -0.4f, -0.8f, -0.8f, 0.0f, -0.8f, -0.8f, 0.4f, -0.8f, -0.8f, 0.8f, -0.8f, -0.8f, -0.8f, -0.4f, -0.8f, -0.4f, -0.4f, -0.8f, 0.0f, -0.4f, -0.8f, 0.4f, -0.4f, -0.8f, 0.8f, -0.4f, -0.8f, -0.8f, 0.0f, -0.8f, -0.4f, 0.0f, -0.8f, 0.0f, 0.0f, -0.8f, 0.4f, 0.0f, -0.8f, 0.8f, 0.0f, -0.8f, -0.8f, 0.4f, -0.8f, -0.4f, 0.4f, -0.8f, 0.0f, 0.4f, -0.8f, 0.4f, 0.4f, -0.8f, 0.8f, 0.4f, -0.8f, -0.8f, 0.8f, -0.8f, -0.4f, 0.8f, -0.8f, 0.0f, 0.8f, -0.8f, 0.4f, 0.8f, -0.8f, 0.8f, 0.8f, -0.8f, -0.8f, -0.8f, -0.4f, -0.4f, -0.8f, -0.4f, 0.0f, -0.8f, -0.4f, 0.4f, -0.8f, -0.4f, 0.8f, -0.8f, -0.4f, -0.8f, -0.4f, -0.4f, -0.4f, -0.4f, -0.4f, 0.0f, -0.4f, -0.4f, 0.4f, -0.4f, -0.4f, 0.8f, -0.4f, -0.4f, -0.8f, 0.0f, -0.4f, -0.4f, 0.0f, -0.4f, 0.0f, 0.0f, -0.4f, 0.4f, 0.0f, -0.4f, 0.8f, 0.0f, -0.4f, -0.8f, 0.4f, -0.4f, -0.4f, 0.4f, -0.4f, 0.0f, 0.4f, -0.4f, 0.4f, 0.4f, -0.4f, 0.8f, 0.4f, -0.4f, -0.8f, 0.8f, -0.4f, -0.4f, 0.8f, -0.4f, 0.0f, 0.8f, -0.4f, 0.4f, 0.8f, -0.4f, 0.8f, 0.8f, -0.4f, -0.8f, -0.8f, 0.0f, -0.4f, -0.8f, 0.0f, 0.0f, -0.8f, 0.0f, 0.4f, -0.8f, 0.0f, 0.8f, -0.8f, 0.0f, -0.8f, -0.4f, 0.0f, -0.4f, -0.4f, 0.0f, 0.0f, -0.4f, 0.0f, 0.4f, -0.4f, 0.0f, 0.8f, -0.4f, 0.0f, -0.8f, 0.0f, 0.0f, -0.4f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.4f, 0.0f, 0.0f, 0.8f, 0.0f, 0.0f, -0.8f, 0.4f, 0.0f, -0.4f, 0.4f, 0.0f, 0.0f, 0.4f, 0.0f, 0.4f, 0.4f, 0.0f, 0.8f, 0.4f, 0.0f, -0.8f, 0.8f, 0.0f, -0.4f, 0.8f, 0.0f, 0.0f, 0.8f, 0.0f, 0.4f, 0.8f, 0.0f, 0.8f, 0.8f, 0.0f, -0.8f, -0.8f, 0.4f, -0.4f, -0.8f, 0.4f, 0.0f, -0.8f, 0.4f, 0.4f, -0.8f, 0.4f, 0.8f, -0.8f, 0.4f, -0.8f, -0.4f, 0.4f, -0.4f, -0.4f, 0.4f, 0.0f, -0.4f, 0.4f, 0.4f, -0.4f, 0.4f, 0.8f, -0.4f, 0.4f, -0.8f, 0.0f, 0.4f, -0.4f, 0.0f, 0.4f, 0.0f, 0.0f, 0.4f, 0.4f, 0.0f, 0.4f, 0.8f, 0.0f, 0.4f, -0.8f, 0.4f, 0.4f, -0.4f, 0.4f, 0.4f, 0.0f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.8f, 0.4f, 0.4f, -0.8f, 0.8f, 0.4f, -0.4f, 0.8f, 0.4f, 0.0f, 0.8f, 0.4f, 0.4f, 0.8f, 0.4f, 0.8f, 0.8f, 0.4f, -0.8f, -0.8f, 0.8f, -0.4f, -0.8f, 0.8f, 0.0f, -0.8f, 0.8f, 0.4f, -0.8f, 0.8f, 0.8f, -0.8f, 0.8f, -0.8f, -0.4f, 0.8f, -0.4f, -0.4f, 0.8f, 0.0f, -0.4f, 0.8f, 0.4f, -0.4f, 0.8f, 0.8f, -0.4f, 0.8f, -0.8f, 0.0f, 0.8f, -0.4f, 0.0f, 0.8f, 0.0f, 0.0f, 0.8f, 0.4f, 0.0f, 0.8f, 0.8f, 0.0f, 0.8f, -0.8f, 0.4f, 0.8f, -0.4f, 0.4f, 0.8f, 0.0f, 0.4f, 0.8f, 0.4f, 0.4f, 0.8f, 0.8f, 0.4f, 0.8f, -0.8f, 0.8f, 0.8f, -0.4f, 0.8f, 0.8f, 0.0f, 0.8f, 0.8f, 0.4f, 0.8f, 0.8f, 0.8f, 0.8f, 0.8f }; // this table contains 3 requantized samples for each legal codeword // when grouped in 10 bits, i.e. 9 quantizationsteps per sample public static final float grouping_10bits[] = { -8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 0.0f, -8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 0.0f, -6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 0.0f, -4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 0.0f, -2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 0.0f, -8.0f/9.0f, -6.0f/9.0f, 0.0f, -8.0f/9.0f, -4.0f/9.0f, 0.0f, -8.0f/9.0f, -2.0f/9.0f, 0.0f, -8.0f/9.0f, 0.0f, 0.0f, -8.0f/9.0f, 2.0f/9.0f, 0.0f, -8.0f/9.0f, 4.0f/9.0f, 0.0f, -8.0f/9.0f, 6.0f/9.0f, 0.0f, -8.0f/9.0f, 8.0f/9.0f, 0.0f, -8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 0.0f, 2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 0.0f, 4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 0.0f, 6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 0.0f, 8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 0.0f, -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 0.0f, -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f, -2.0f/9.0f, 0.0f, -6.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f, 4.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 0.0f, 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 0.0f, -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 0.0f, -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f, -2.0f/9.0f, 0.0f, -4.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f, 4.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 0.0f, 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 0.0f, -8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 0.0f, -6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 0.0f, -4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 0.0f, -2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 0.0f, -2.0f/9.0f, -6.0f/9.0f, 0.0f, -2.0f/9.0f, -4.0f/9.0f, 0.0f, -2.0f/9.0f, -2.0f/9.0f, 0.0f, -2.0f/9.0f, 0.0f, 0.0f, -2.0f/9.0f, 2.0f/9.0f, 0.0f, -2.0f/9.0f, 4.0f/9.0f, 0.0f, -2.0f/9.0f, 6.0f/9.0f, 0.0f, -2.0f/9.0f, 8.0f/9.0f, 0.0f, -2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 0.0f, 2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 0.0f, 4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 0.0f, 6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 0.0f, 8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 0.0f, -6.0f/9.0f, -8.0f/9.0f, 0.0f, -4.0f/9.0f, -8.0f/9.0f, 0.0f, -2.0f/9.0f, -8.0f/9.0f, 0.0f, 0.0f, -8.0f/9.0f, 0.0f, 2.0f/9.0f, -8.0f/9.0f, 0.0f, 4.0f/9.0f, -8.0f/9.0f, 0.0f, 6.0f/9.0f, -8.0f/9.0f, 0.0f, 8.0f/9.0f, -8.0f/9.0f, 0.0f, -8.0f/9.0f, -6.0f/9.0f, 0.0f, -6.0f/9.0f, -6.0f/9.0f, 0.0f, -4.0f/9.0f, -6.0f/9.0f, 0.0f, -2.0f/9.0f, -6.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f, 4.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f, -8.0f/9.0f, -4.0f/9.0f, 0.0f, -6.0f/9.0f, -4.0f/9.0f, 0.0f, -4.0f/9.0f, -4.0f/9.0f, 0.0f, -2.0f/9.0f, -4.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f, 4.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f, -8.0f/9.0f, -2.0f/9.0f, 0.0f, -6.0f/9.0f, -2.0f/9.0f, 0.0f, -4.0f/9.0f, -2.0f/9.0f, 0.0f, -2.0f/9.0f, -2.0f/9.0f, 0.0f, 0.0f, -2.0f/9.0f, 0.0f, 2.0f/9.0f, -2.0f/9.0f, 0.0f, 4.0f/9.0f, -2.0f/9.0f, 0.0f, 6.0f/9.0f, -2.0f/9.0f, 0.0f, 8.0f/9.0f, -2.0f/9.0f, 0.0f, -8.0f/9.0f, 0.0f, 0.0f, -6.0f/9.0f, 0.0f, 0.0f, -4.0f/9.0f, 0.0f, 0.0f, -2.0f/9.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f/9.0f, 0.0f, 0.0f, 4.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 0.0f, 0.0f, -8.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f, -2.0f/9.0f, 2.0f/9.0f, 0.0f, 0.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f, 4.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f, -8.0f/9.0f, 4.0f/9.0f, 0.0f, -6.0f/9.0f, 4.0f/9.0f, 0.0f, -4.0f/9.0f, 4.0f/9.0f, 0.0f, -2.0f/9.0f, 4.0f/9.0f, 0.0f, 0.0f, 4.0f/9.0f, 0.0f, 2.0f/9.0f, 4.0f/9.0f, 0.0f, 4.0f/9.0f, 4.0f/9.0f, 0.0f, 6.0f/9.0f, 4.0f/9.0f, 0.0f, 8.0f/9.0f, 4.0f/9.0f, 0.0f, -8.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f, -2.0f/9.0f, 6.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f, 4.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f, -8.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f, -2.0f/9.0f, 8.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f, 4.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f, -8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 0.0f, -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 0.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 0.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 0.0f, -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 0.0f, 2.0f/9.0f, -6.0f/9.0f, 0.0f, 2.0f/9.0f, -4.0f/9.0f, 0.0f, 2.0f/9.0f, -2.0f/9.0f, 0.0f, 2.0f/9.0f, 0.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f, 4.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 0.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 0.0f, 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 0.0f, -8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 0.0f, -6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 0.0f, -4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 0.0f, -2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 0.0f, 4.0f/9.0f, -6.0f/9.0f, 0.0f, 4.0f/9.0f, -4.0f/9.0f, 0.0f, 4.0f/9.0f, -2.0f/9.0f, 0.0f, 4.0f/9.0f, 0.0f, 0.0f, 4.0f/9.0f, 2.0f/9.0f, 0.0f, 4.0f/9.0f, 4.0f/9.0f, 0.0f, 4.0f/9.0f, 6.0f/9.0f, 0.0f, 4.0f/9.0f, 8.0f/9.0f, 0.0f, 4.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 0.0f, 2.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 0.0f, 4.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 0.0f, 6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 0.0f, 8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 0.0f, -8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 0.0f, -6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 0.0f, -4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 0.0f, -2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 0.0f, 6.0f/9.0f, -6.0f/9.0f, 0.0f, 6.0f/9.0f, -4.0f/9.0f, 0.0f, 6.0f/9.0f, -2.0f/9.0f, 0.0f, 6.0f/9.0f, 0.0f, 0.0f, 6.0f/9.0f, 2.0f/9.0f, 0.0f, 6.0f/9.0f, 4.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 0.0f, 2.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 0.0f, 4.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 0.0f, 6.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 0.0f, -8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 0.0f, -6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 0.0f, -4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 0.0f, -2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 0.0f, 8.0f/9.0f, -6.0f/9.0f, 0.0f, 8.0f/9.0f, -4.0f/9.0f, 0.0f, 8.0f/9.0f, -2.0f/9.0f, 0.0f, 8.0f/9.0f, 0.0f, 0.0f, 8.0f/9.0f, 2.0f/9.0f, 0.0f, 8.0f/9.0f, 4.0f/9.0f, 0.0f, 8.0f/9.0f, 6.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f, -8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 0.0f, 2.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 0.0f, 4.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 0.0f, 6.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, -8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, -2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 0.0f, 8.0f/9.0f, 8.0f/9.0f, 2.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 4.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 6.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f, 8.0f/9.0f }; // data taken from ISO/IEC DIS 11172, Annexes 3-B.2[abcd] and 3-B.4: // subbands 0-2 in tables 3-B.2a and 2b: (index is allocation) public static final int table_ab1_codelength[] = // bits per codeword { 0, 5, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; public static final float table_ab1_groupingtables[][] = // pointer to sample grouping table, or NULL-pointer if ungrouped { null, grouping_5bits, null, null, null, null, null, null, null, null, null, null, null, null, null, null }; public static final float table_ab1_factor[] = // factor for requantization: (real)sample * factor - 1.0 gives requantized sample { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32.0f, 1.0f/64.0f, 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f, 1.0f/1024.0f, 1.0f/2048.0f, 1.0f/4096.0f, 1.0f/8192.0f, 1.0f/16384.0f, 1.0f/32768.0f }; public static final float table_ab1_c[] = // factor c for requantization from table 3-B.4 { 0.0f, 1.33333333333f, 1.14285714286f, 1.06666666666f, 1.03225806452f, 1.01587301587f, 1.00787401575f, 1.00392156863f, 1.00195694716f, 1.00097751711f, 1.00048851979f, 1.00024420024f, 1.00012208522f, 1.00006103888f, 1.00003051851f, 1.00001525902f }; public static final float table_ab1_d[] = // addend d for requantization from table 3-B.4 { 0.0f, 0.50000000000f, 0.25000000000f, 0.12500000000f, 0.06250000000f, 0.03125000000f, 0.01562500000f, 0.00781250000f, 0.00390625000f, 0.00195312500f, 0.00097656250f, 0.00048828125f, 0.00024414063f, 0.00012207031f, 0.00006103516f, 0.00003051758f }; // subbands 3-... tables 3-B.2a and 2b: public static final float[] table_ab234_groupingtables[] = { null, grouping_5bits, grouping_7bits, null, grouping_10bits, null, null, null, null, null, null, null, null, null, null, null }; // subbands 3-10 in tables 3-B.2a and 2b: public static final int table_ab2_codelength[] = { 0, 5, 7, 3, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 }; public static final float table_ab2_factor[] = { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32.0f, 1.0f/64.0f, 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f, 1.0f/1024.0f, 1.0f/2048.0f, 1.0f/4096.0f, 1.0f/32768.0f }; public static final float table_ab2_c[] = { 0.0f, 1.33333333333f, 1.60000000000f, 1.14285714286f, 1.77777777777f, 1.06666666666f, 1.03225806452f, 1.01587301587f, 1.00787401575f, 1.00392156863f, 1.00195694716f, 1.00097751711f, 1.00048851979f, 1.00024420024f, 1.00012208522f, 1.00001525902f }; public static final float table_ab2_d[] = { 0.0f, 0.50000000000f, 0.50000000000f, 0.25000000000f, 0.50000000000f, 0.12500000000f, 0.06250000000f, 0.03125000000f, 0.01562500000f, 0.00781250000f, 0.00390625000f, 0.00195312500f, 0.00097656250f, 0.00048828125f, 0.00024414063f, 0.00003051758f }; // subbands 11-22 in tables 3-B.2a and 2b: public static final int table_ab3_codelength[] = { 0, 5, 7, 3, 10, 4, 5, 16 }; public static final float table_ab3_factor[] = { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32768.0f }; public static final float table_ab3_c[] = { 0.0f, 1.33333333333f, 1.60000000000f, 1.14285714286f, 1.77777777777f, 1.06666666666f, 1.03225806452f, 1.00001525902f }; public static final float table_ab3_d[] = { 0.0f, 0.50000000000f, 0.50000000000f, 0.25000000000f, 0.50000000000f, 0.12500000000f, 0.06250000000f, 0.00003051758f }; // subbands 23-... in tables 3-B.2a and 2b: public static final int table_ab4_codelength[] = { 0, 5, 7, 16 }; public static final float table_ab4_factor[] = { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/32768.0f }; public static final float table_ab4_c[] = { 0.0f, 1.33333333333f, 1.60000000000f, 1.00001525902f }; public static final float table_ab4_d[] = { 0.0f, 0.50000000000f, 0.50000000000f, 0.00003051758f }; // subbands in tables 3-B.2c and 2d: public static final int table_cd_codelength[] = { 0, 5, 7, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; public static final float table_cd_groupingtables[][] = { null, grouping_5bits, grouping_7bits, grouping_10bits, null, null, null, null, null, null, null, null, null, null, null, null }; public static final float table_cd_factor[] = { 0.0f, 1.0f/2.0f, 1.0f/4.0f, 1.0f/8.0f, 1.0f/8.0f, 1.0f/16.0f, 1.0f/32.0f, 1.0f/64.0f, 1.0f/128.0f, 1.0f/256.0f, 1.0f/512.0f, 1.0f/1024.0f, 1.0f/2048.0f, 1.0f/4096.0f, 1.0f/8192.0f, 1.0f/16384.0f }; public static final float table_cd_c[] = { 0.0f, 1.33333333333f, 1.60000000000f, 1.77777777777f, 1.06666666666f, 1.03225806452f, 1.01587301587f, 1.00787401575f, 1.00392156863f, 1.00195694716f, 1.00097751711f, 1.00048851979f, 1.00024420024f, 1.00012208522f, 1.00006103888f, 1.00003051851f }; public static final float table_cd_d[] = { 0.0f, 0.50000000000f, 0.50000000000f, 0.50000000000f, 0.12500000000f, 0.06250000000f, 0.03125000000f, 0.01562500000f, 0.00781250000f, 0.00390625000f, 0.00195312500f, 0.00097656250f, 0.00048828125f, 0.00024414063f, 0.00012207031f, 0.00006103516f }; protected int subbandnumber; protected int allocation; protected int scfsi; protected float scalefactor1, scalefactor2, scalefactor3; protected int[] codelength = {0}; protected float groupingtable[][] = new float[2][]; //protected float[][] groupingtable = {{0},{0}} ; protected float[] factor = {0.0f}; protected int groupnumber; protected int samplenumber; protected float[] samples = new float[3]; protected float[] c = {0}; protected float[] d = {0}; /** * Constructor */ public SubbandLayer2(int subbandnumber) { this.subbandnumber = subbandnumber; groupnumber = samplenumber = 0; } /** * */ protected int get_allocationlength (Header header) { if (header.version() == Header.MPEG1) { int channel_bitrate = header.bitrate_index(); // calculate bitrate per channel: if (header.mode() != Header.SINGLE_CHANNEL) if (channel_bitrate == 4) channel_bitrate = 1; else channel_bitrate -= 4; if (channel_bitrate == 1 || channel_bitrate == 2) // table 3-B.2c or 3-B.2d if (subbandnumber <= 1) return 4; else return 3; else // tables 3-B.2a or 3-B.2b if (subbandnumber <= 10) return 4; else if (subbandnumber <= 22) return 3; else return 2; } else { // MPEG-2 LSF -- Jeff // table B.1 of ISO/IEC 13818-3 if (subbandnumber <= 3) return 4; else if (subbandnumber <= 10) return 3; else return 2; } } /** * */ protected void prepare_sample_reading(Header header, int allocation, //float[][] groupingtable, int channel, float[] factor, int[] codelength, float[] c, float[] d) { int channel_bitrate = header.bitrate_index(); // calculate bitrate per channel: if (header.mode() != Header.SINGLE_CHANNEL) if (channel_bitrate == 4) channel_bitrate = 1; else channel_bitrate -= 4; if (channel_bitrate == 1 || channel_bitrate == 2) { // table 3-B.2c or 3-B.2d groupingtable[channel] = table_cd_groupingtables[allocation]; factor[0] = table_cd_factor[allocation]; codelength[0] = table_cd_codelength[allocation]; c[0] = table_cd_c[allocation]; d[0] = table_cd_d[allocation]; } else { // tables 3-B.2a or 3-B.2b if (subbandnumber <= 2) { groupingtable[channel] = table_ab1_groupingtables[allocation]; factor[0] = table_ab1_factor[allocation]; codelength[0] = table_ab1_codelength[allocation]; c[0] = table_ab1_c[allocation]; d[0] = table_ab1_d[allocation]; } else { groupingtable[channel] = table_ab234_groupingtables[allocation]; if (subbandnumber <= 10) { factor[0] = table_ab2_factor[allocation]; codelength[0] = table_ab2_codelength[allocation]; c[0] = table_ab2_c[allocation]; d[0] = table_ab2_d[allocation]; } else if (subbandnumber <= 22) { factor[0] = table_ab3_factor[allocation]; codelength[0] = table_ab3_codelength[allocation]; c[0] = table_ab3_c[allocation]; d[0] = table_ab3_d[allocation]; } else { factor[0] = table_ab4_factor[allocation]; codelength[0] = table_ab4_codelength[allocation]; c[0] = table_ab4_c[allocation]; d[0] = table_ab4_d[allocation]; } } } } /** * */ public void read_allocation(Bitstream stream, Header header, Crc16 crc) { int length = get_allocationlength(header); allocation = stream.get_bits(length); if (crc != null) crc.add_bits(allocation, length); } /** * */ public void read_scalefactor_selection (Bitstream stream, Crc16 crc) { if (allocation != 0) { scfsi = stream.get_bits(2); if (crc != null) crc.add_bits(scfsi, 2); } } /** * */ public void read_scalefactor (Bitstream stream, Header header) { if (allocation != 0) { switch (scfsi) { case 0: scalefactor1 = scalefactors[stream.get_bits(6)]; scalefactor2 = scalefactors[stream.get_bits(6)]; scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 1: scalefactor1 = scalefactor2 = scalefactors[stream.get_bits(6)]; scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 2: scalefactor1 = scalefactor2 = scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 3: scalefactor1 = scalefactors[stream.get_bits(6)]; scalefactor2 = scalefactor3 = scalefactors[stream.get_bits(6)]; break; } prepare_sample_reading(header, allocation, 0, factor, codelength, c, d); } } /** * */ public boolean read_sampledata (Bitstream stream) { if (allocation != 0) if (groupingtable[0] != null) { int samplecode = stream.get_bits(codelength[0]); // create requantized samples: samplecode += samplecode << 1; float[] target = samples; float[] source = groupingtable[0]; /* int tmp = 0; int temp = 0; target[tmp++] = source[samplecode + temp]; temp++; target[tmp++] = source[samplecode + temp]; temp++; target[tmp] = source[samplecode + temp]; */ //Bugfix: int tmp = 0; int temp = samplecode; if(temp > source.length - 3) temp = source.length - 3; target[tmp] = source[temp]; temp++;tmp++; target[tmp] = source[temp]; temp++;tmp++; target[tmp] = source[temp]; // memcpy (samples, groupingtable + samplecode, 3 * sizeof (real)); } else { samples[0] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); samples[1] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); samples[2] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); } samplenumber = 0; if (++groupnumber == 12) return true; else return false; } /** * */ public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) { if ((allocation != 0) && (channels != OutputChannels.RIGHT_CHANNEL)) { float sample = samples[samplenumber]; if (groupingtable[0] == null) sample = (sample + d[0]) * c[0]; if (groupnumber <= 4) sample *= scalefactor1; else if (groupnumber <= 8) sample *= scalefactor2; else sample *= scalefactor3; filter1.input_sample(sample, subbandnumber); } if (++samplenumber == 3) return true; else return false; } }; /** * Class for layer II subbands in joint stereo mode. */ static class SubbandLayer2IntensityStereo extends SubbandLayer2 { protected int channel2_scfsi; protected float channel2_scalefactor1, channel2_scalefactor2, channel2_scalefactor3; /** * Constructor */ public SubbandLayer2IntensityStereo (int subbandnumber) { super(subbandnumber); } /** * */ public void read_allocation(Bitstream stream, Header header, Crc16 crc) { super.read_allocation (stream, header, crc); } /** * */ public void read_scalefactor_selection(Bitstream stream, Crc16 crc) { if (allocation != 0) { scfsi = stream.get_bits(2); channel2_scfsi = stream.get_bits(2); if (crc != null) { crc.add_bits(scfsi, 2); crc.add_bits(channel2_scfsi, 2); } } } /** * */ public void read_scalefactor(Bitstream stream, Header header) { if (allocation != 0) { super.read_scalefactor(stream, header); switch (channel2_scfsi) { case 0: channel2_scalefactor1 = scalefactors[stream.get_bits(6)]; channel2_scalefactor2 = scalefactors[stream.get_bits(6)]; channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 1: channel2_scalefactor1 = channel2_scalefactor2 = scalefactors[stream.get_bits (6)]; channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 2: channel2_scalefactor1 = channel2_scalefactor2 = channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 3: channel2_scalefactor1 = scalefactors[stream.get_bits(6)]; channel2_scalefactor2 = channel2_scalefactor3 = scalefactors[stream.get_bits (6)]; break; } } } /** * */ public boolean read_sampledata(Bitstream stream) { return super.read_sampledata (stream); } /** * */ public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) { if (allocation != 0) { float sample = samples[samplenumber]; if (groupingtable[0] == null) sample = (sample + d[0]) * c[0]; if (channels == OutputChannels.BOTH_CHANNELS) { float sample2 = sample; if (groupnumber <= 4) { sample *= scalefactor1; sample2 *= channel2_scalefactor1; } else if (groupnumber <= 8) { sample *= scalefactor2; sample2 *= channel2_scalefactor2; } else { sample *= scalefactor3; sample2 *= channel2_scalefactor3; } filter1.input_sample(sample, subbandnumber); filter2.input_sample(sample2, subbandnumber); } else if (channels == OutputChannels.LEFT_CHANNEL) { if (groupnumber <= 4) sample *= scalefactor1; else if (groupnumber <= 8) sample *= scalefactor2; else sample *= scalefactor3; filter1.input_sample(sample, subbandnumber); } else { if (groupnumber <= 4) sample *= channel2_scalefactor1; else if (groupnumber <= 8) sample *= channel2_scalefactor2; else sample *= channel2_scalefactor3; filter1.input_sample(sample, subbandnumber); } } if (++samplenumber == 3) return true; else return false; } }; /** * Class for layer II subbands in stereo mode. */ static class SubbandLayer2Stereo extends SubbandLayer2 { protected int channel2_allocation; protected int channel2_scfsi; protected float channel2_scalefactor1, channel2_scalefactor2, channel2_scalefactor3; //protected boolean channel2_grouping; ???? Never used! protected int[] channel2_codelength = {0}; //protected float[][] channel2_groupingtable = {{0},{0}}; protected float[] channel2_factor = {0}; protected float[] channel2_samples; protected float[] channel2_c = {0}; protected float[] channel2_d = {0}; /** * Constructor */ public SubbandLayer2Stereo(int subbandnumber) { super(subbandnumber); channel2_samples = new float[3]; } /** * */ public void read_allocation (Bitstream stream, Header header, Crc16 crc) { int length = get_allocationlength(header); allocation = stream.get_bits(length); channel2_allocation = stream.get_bits(length); if (crc != null) { crc.add_bits(allocation, length); crc.add_bits(channel2_allocation, length); } } /** * */ public void read_scalefactor_selection(Bitstream stream, Crc16 crc) { if (allocation != 0) { scfsi = stream.get_bits(2); if (crc != null) crc.add_bits(scfsi, 2); } if (channel2_allocation != 0) { channel2_scfsi = stream.get_bits(2); if (crc != null) crc.add_bits(channel2_scfsi, 2); } } /** * */ public void read_scalefactor(Bitstream stream, Header header) { super.read_scalefactor(stream, header); if (channel2_allocation != 0) { switch (channel2_scfsi) { case 0: channel2_scalefactor1 = scalefactors[stream.get_bits(6)]; channel2_scalefactor2 = scalefactors[stream.get_bits(6)]; channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 1: channel2_scalefactor1 = channel2_scalefactor2 = scalefactors[stream.get_bits(6)]; channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 2: channel2_scalefactor1 = channel2_scalefactor2 = channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; break; case 3: channel2_scalefactor1 = scalefactors[stream.get_bits(6)]; channel2_scalefactor2 = channel2_scalefactor3 = scalefactors[stream.get_bits(6)]; break; } prepare_sample_reading(header, channel2_allocation, 1, channel2_factor, channel2_codelength, channel2_c, channel2_d); } } /** * */ public boolean read_sampledata (Bitstream stream) { boolean returnvalue = super.read_sampledata(stream); if (channel2_allocation != 0) if (groupingtable[1] != null) { int samplecode = stream.get_bits(channel2_codelength[0]); // create requantized samples: samplecode += samplecode << 1; /* float[] target = channel2_samples; float[] source = channel2_groupingtable[0]; int tmp = 0; int temp = 0; target[tmp++] = source[samplecode + temp]; temp++; target[tmp++] = source[samplecode + temp]; temp++; target[tmp] = source[samplecode + temp]; // memcpy (channel2_samples, channel2_groupingtable + samplecode, 3 * sizeof (real)); */ float[] target = channel2_samples; float[] source = groupingtable[1]; int tmp = 0; int temp = samplecode; target[tmp] = source[temp]; temp++;tmp++; target[tmp] = source[temp]; temp++;tmp++; target[tmp] = source[temp]; } else { channel2_samples[0] = (float) ((stream.get_bits(channel2_codelength[0])) * channel2_factor[0] - 1.0); channel2_samples[1] = (float) ((stream.get_bits(channel2_codelength[0])) * channel2_factor[0] - 1.0); channel2_samples[2] = (float) ((stream.get_bits(channel2_codelength[0])) * channel2_factor[0] - 1.0); } return returnvalue; } /** * */ public boolean put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2) { boolean returnvalue = super.put_next_sample(channels, filter1, filter2); if ((channel2_allocation != 0) && (channels != OutputChannels.LEFT_CHANNEL)) { float sample = channel2_samples[samplenumber - 1]; if (groupingtable[1] == null) sample = (sample + channel2_d[0]) * channel2_c[0]; if (groupnumber <= 4) sample *= channel2_scalefactor1; else if (groupnumber <= 8) sample *= channel2_scalefactor2; else sample *= channel2_scalefactor3; if (channels == OutputChannels.BOTH_CHANNELS) filter2.input_sample(sample, subbandnumber); else filter1.input_sample(sample, subbandnumber); } return returnvalue; } } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/LayerIIIDecoder.java000066400000000000000000002566461335566474600273340ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 18/06/01 Michael Scheerer, Fixed bugs which causes * negative indexes in method huffmann_decode and in method * dequanisize_sample. * * 16/07/01 Michael Scheerer, Catched a bug in method * huffmann_decode, which causes an outOfIndexException. * Cause : Indexnumber of 24 at SfBandIndex, * which has only a length of 22. I have simply and dirty * fixed the index to <= 22, because I'm not really be able * to fix the bug. The Indexnumber is taken from the MP3 * file and the origin Ma-Player with the same code works * well. * * 02/19/99 Java Conversion by E.B, javalayer@javazoom.net *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Class Implementing Layer 3 Decoder. * * @since 0.0 */ final class LayerIIIDecoder implements FrameDecoder { final double d43 = (4.0/3.0); public int[] scalefac_buffer; // MDM: removed, as this wasn't being used. //private float CheckSumOut1d = 0.0f; private int CheckSumHuff = 0; private int[] is_1d; private float[][][] ro; private float[][][] lr; private float[] out_1d; private float[][] prevblck; private float[][] k; private int[] nonzero; private Bitstream stream; private Header header; private SynthesisFilter filter1, filter2; private Obuffer buffer; private int which_channels; private BitReserve br; private III_side_info_t si; private temporaire2[] III_scalefac_t; private temporaire2[] scalefac; // private III_scalefac_t scalefac; private int max_gr; private int frame_start; private int part2_start; private int channels; private int first_channel; private int last_channel; private int sfreq; /** * Constructor. */ // REVIEW: these constructor arguments should be moved to the // decodeFrame() method, where possible, so that one public LayerIIIDecoder(Bitstream stream0, Header header0, SynthesisFilter filtera, SynthesisFilter filterb, Obuffer buffer0, int which_ch0) { huffcodetab.inithuff(); is_1d = new int[SBLIMIT*SSLIMIT+4]; ro = new float[2][SBLIMIT][SSLIMIT]; lr = new float[2][SBLIMIT][SSLIMIT]; out_1d = new float[SBLIMIT*SSLIMIT]; prevblck = new float[2][SBLIMIT*SSLIMIT]; k = new float[2][SBLIMIT*SSLIMIT]; nonzero = new int[2]; //III_scalefact_t III_scalefac_t = new temporaire2[2]; III_scalefac_t[0] = new temporaire2(); III_scalefac_t[1] = new temporaire2(); scalefac = III_scalefac_t; // L3TABLE INIT sfBandIndex = new SBI[9]; // SZD: MPEG2.5 +3 indices int[] l0 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}; int[] s0 = {0,4,8,12,18,24,32,42,56,74,100,132,174,192}; int[] l1 = {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}; int[] s1 = {0,4,8,12,18,26,36,48,62,80,104,136,180,192}; int[] l2 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}; int[] s2 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192}; int[] l3 = {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576}; int[] s3 = {0,4,8,12,16,22,30,40,52,66,84,106,136,192}; int[] l4 = {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576}; int[] s4 = {0,4,8,12,16,22,28,38,50,64,80,100,126,192}; int[] l5 = {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576}; int[] s5 = {0,4,8,12,16,22,30,42,58,78,104,138,180,192}; // SZD: MPEG2.5 int[] l6 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}; int[] s6 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192}; int[] l7 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}; int[] s7 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192}; int[] l8 = {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}; int[] s8 = {0,8,16,24,36,52,72,96,124,160,162,164,166,192}; sfBandIndex[0]= new SBI(l0,s0); sfBandIndex[1]= new SBI(l1,s1); sfBandIndex[2]= new SBI(l2,s2); sfBandIndex[3]= new SBI(l3,s3); sfBandIndex[4]= new SBI(l4,s4); sfBandIndex[5]= new SBI(l5,s5); //SZD: MPEG2.5 sfBandIndex[6]= new SBI(l6,s6); sfBandIndex[7]= new SBI(l7,s7); sfBandIndex[8]= new SBI(l8,s8); // END OF L3TABLE INIT if(reorder_table == null) { // SZD: generate LUT reorder_table = new int[9][]; for(int i = 0; i < 9; i++) reorder_table[i] = reorder(sfBandIndex[i].s); } // Sftable int[] ll0 = {0, 6, 11, 16, 21}; int[] ss0 = {0, 6, 12}; sftable = new Sftable(ll0,ss0); // END OF Sftable // scalefac_buffer scalefac_buffer = new int[54]; // END OF scalefac_buffer stream = stream0; header = header0; filter1 = filtera; filter2 = filterb; buffer = buffer0; which_channels = which_ch0; frame_start = 0; channels = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2; max_gr = (header.version() == Header.MPEG1) ? 2 : 1; sfreq = header.sample_frequency() + ((header.version() == Header.MPEG1) ? 3 : (header.version() == Header.MPEG25_LSF) ? 6 : 0); // SZD if (channels == 2) { switch (which_channels) { case OutputChannels.LEFT_CHANNEL: case OutputChannels.DOWNMIX_CHANNELS: first_channel = last_channel = 0; break; case OutputChannels.RIGHT_CHANNEL: first_channel = last_channel = 1; break; case OutputChannels.BOTH_CHANNELS: default: first_channel = 0; last_channel = 1; break; } } else { first_channel = last_channel = 0; } for(int ch=0;ch<2;ch++) for (int j=0; j<576; j++) prevblck[ch][j] = 0.0f; nonzero[0] = nonzero[1] = 576; br = new BitReserve(); si = new III_side_info_t(); } /** * Notify decoder that a seek is being made. */ public void seek_notify() { frame_start = 0; for(int ch=0;ch<2;ch++) for (int j=0; j<576; j++) prevblck[ch][j] = 0.0f; br = new BitReserve(); } public void decodeFrame() { decode(); } /** * Decode one frame, filling the buffer with the output samples. */ // subband samples are buffered and passed to the // SynthesisFilter in one go. private float[] samples1 = new float[32]; private float[] samples2 = new float[32]; public void decode() { int nSlots = header.slots(); int flush_main; int gr, ch, ss, sb, sb18; int main_data_end; int bytes_to_discard; int i; get_side_info(); for (i=0; i>> 3; // of previous frame if ((flush_main = (br.hsstell() & 7)) != 0) { br.hgetbits(8 - flush_main); main_data_end++; } bytes_to_discard = frame_start - main_data_end - si.main_data_begin; frame_start += nSlots; if (bytes_to_discard < 0) return; if (main_data_end > 4096) { frame_start -= 4096; br.rewindNbytes(4096); } for (; bytes_to_discard > 0; bytes_to_discard--) br.hgetbits(8); for (gr=0;gr>> 4) / 5 ; new_slen[1] = (scalefac_comp >>> 4) % 5 ; new_slen[2] = (scalefac_comp & 0xF) >>> 2 ; new_slen[3] = (scalefac_comp & 3); si.ch[ch].gr[gr].preflag = 0; blocknumber = 0; } else if (scalefac_comp < 500) { new_slen[0] = ((scalefac_comp - 400) >>> 2) / 5 ; new_slen[1] = ((scalefac_comp - 400) >>> 2) % 5 ; new_slen[2] = (scalefac_comp - 400 ) & 3 ; new_slen[3] = 0; si.ch[ch].gr[gr].preflag = 0; blocknumber = 1; } else if (scalefac_comp < 512) { new_slen[0] = (scalefac_comp - 500 ) / 3 ; new_slen[1] = (scalefac_comp - 500) % 3 ; new_slen[2] = 0; new_slen[3] = 0; si.ch[ch].gr[gr].preflag = 1; blocknumber = 2; } } if((((mode_ext == 1) || (mode_ext == 3)) && (ch == 1))) { int_scalefac_comp = scalefac_comp >>> 1; if (int_scalefac_comp < 180) { new_slen[0] = int_scalefac_comp / 36 ; new_slen[1] = (int_scalefac_comp % 36 ) / 6 ; new_slen[2] = (int_scalefac_comp % 36) % 6; new_slen[3] = 0; si.ch[ch].gr[gr].preflag = 0; blocknumber = 3; } else if (int_scalefac_comp < 244) { new_slen[0] = ((int_scalefac_comp - 180 ) & 0x3F) >>> 4 ; new_slen[1] = ((int_scalefac_comp - 180) & 0xF) >>> 2 ; new_slen[2] = (int_scalefac_comp - 180 ) & 3 ; new_slen[3] = 0; si.ch[ch].gr[gr].preflag = 0; blocknumber = 4; } else if (int_scalefac_comp < 255) { new_slen[0] = (int_scalefac_comp - 244 ) / 3 ; new_slen[1] = (int_scalefac_comp - 244 ) % 3 ; new_slen[2] = 0 ; new_slen[3] = 0; si.ch[ch].gr[gr].preflag = 0; blocknumber = 5; } } for (int x=0; x<45; x++) // why 45, not 54? scalefac_buffer[x] = 0; m = 0; for (int i=0; i<4;i++) { for (int j = 0; j < nr_of_sfb_block[blocknumber][blocktypenumber][i]; j++) { scalefac_buffer[m] = (new_slen[i] == 0) ? 0 : br.hgetbits(new_slen[i]); m++; } // for (unint32 j ... } // for (uint32 i ... } /** * */ private void get_LSF_scale_factors(int ch, int gr) { int m = 0; int sfb, window; gr_info_s gr_info = (si.ch[ch].gr[gr]); get_LSF_scale_data(ch, gr); if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) { if (gr_info.mixed_block_flag != 0) { // MIXED for (sfb = 0; sfb < 8; sfb++) { scalefac[ch].l[sfb] = scalefac_buffer[m]; m++; } for (sfb = 3; sfb < 12; sfb++) { for (window=0; window<3; window++) { scalefac[ch].s[window][sfb] = scalefac_buffer[m]; m++; } } for (window=0; window<3; window++) scalefac[ch].s[window][12] = 0; } else { // SHORT for (sfb = 0; sfb < 12; sfb++) { for (window=0; window<3; window++) { scalefac[ch].s[window][sfb] = scalefac_buffer[m]; m++; } } for (window=0; window<3; window++) scalefac[ch].s[window][12] = 0; } } else { // LONG types 0,1,3 for (sfb = 0; sfb < 21; sfb++) { scalefac[ch].l[sfb] = scalefac_buffer[m]; m++; } scalefac[ch].l[21] = 0; // Jeff scalefac[ch].l[22] = 0; } } /** * */ int[] x = {0}; int[] y = {0}; int[] v = {0}; int[] w = {0}; private void huffman_decode(int ch, int gr) { x[0] = 0; y[0] = 0; v[0] = 0; w[0] = 0; int part2_3_end = part2_start + si.ch[ch].gr[gr].part2_3_length; int num_bits; int region1Start; int region2Start; int index; int buf, buf1; huffcodetab h; // Find region boundary for short block case if ( ((si.ch[ch].gr[gr].window_switching_flag) != 0) && (si.ch[ch].gr[gr].block_type == 2) ) { // Region2. //MS: Extrahandling for 8KHZ region1Start = (sfreq == 8) ? 72 : 36; // sfb[9/3]*3=36 or in case 8KHZ = 72 region2Start = 576; // No Region2 for short block case } else { // Find region boundary for long block case buf = si.ch[ch].gr[gr].region0_count + 1; buf1 = buf + si.ch[ch].gr[gr].region1_count + 1; if(buf1 > sfBandIndex[sfreq].l.length - 1) buf1 = sfBandIndex[sfreq].l.length - 1; region1Start = sfBandIndex[sfreq].l[buf]; region2Start = sfBandIndex[sfreq].l[buf1]; /* MI */ } index = 0; // Read bigvalues area for (int i=0; i<(si.ch[ch].gr[gr].big_values<<1); i+=2) { if (i= is_1d.length) System.out.println("i0="+i+"/"+(si.ch[ch].gr[gr].big_values<<1)+" Index="+index+" is_1d="+is_1d.length); is_1d[index++] = x[0]; is_1d[index++] = y[0]; CheckSumHuff = CheckSumHuff + x[0] + y[0]; // System.out.println("x = "+x[0]+" y = "+y[0]); } // Read count1 area h = huffcodetab.ht[si.ch[ch].gr[gr].count1table_select+32]; num_bits = br.hsstell(); while ((num_bits < part2_3_end) && (index < 576)) { huffcodetab.huffman_decoder(h, x, y, v, w, br); is_1d[index++] = v[0]; is_1d[index++] = w[0]; is_1d[index++] = x[0]; is_1d[index++] = y[0]; CheckSumHuff = CheckSumHuff + v[0] + w[0] + x[0] + y[0]; // System.out.println("v = "+v[0]+" w = "+w[0]); // System.out.println("x = "+x[0]+" y = "+y[0]); num_bits = br.hsstell(); } if (num_bits > part2_3_end) { br.rewindNbits(num_bits - part2_3_end); index-=4; } num_bits = br.hsstell(); // Dismiss stuffing bits if (num_bits < part2_3_end) br.hgetbits(part2_3_end - num_bits); // Zero out rest if (index < 576) nonzero[ch] = index; else nonzero[ch] = 576; if (index < 0) index = 0; // may not be necessary for (; index<576; index++) is_1d[index] = 0; } /** * */ private void i_stereo_k_values(int is_pos, int io_type, int i) { if (is_pos == 0) { k[0][i] = 1.0f; k[1][i] = 1.0f; } else if ((is_pos & 1) != 0) { k[0][i] = io[io_type][(is_pos + 1) >>> 1]; k[1][i] = 1.0f; } else { k[0][i] = 1.0f; k[1][i] = io[io_type][is_pos >>> 1]; } } /** * */ private void dequantize_sample(float xr[][], int ch, int gr) { gr_info_s gr_info = (si.ch[ch].gr[gr]); int cb=0; int next_cb_boundary; int cb_begin = 0; int cb_width = 0; int index=0, t_index, j; float g_gain; float[][] xr_1d = xr; // choose correct scalefactor band per block type, initalize boundary if ((gr_info.window_switching_flag !=0 ) && (gr_info.block_type == 2) ) { if (gr_info.mixed_block_flag != 0) next_cb_boundary=sfBandIndex[sfreq].l[1]; // LONG blocks: 0,1,3 else { cb_width = sfBandIndex[sfreq].s[1]; next_cb_boundary = (cb_width << 2) - cb_width; cb_begin = 0; } } else { next_cb_boundary=sfBandIndex[sfreq].l[1]; // LONG blocks: 0,1,3 } // Compute overall (global) scaling. g_gain = (float) Math.pow(2.0 , (0.25 * (gr_info.global_gain - 210.0))); for (j=0; j 0) xr_1d[quotien][reste] = g_gain * t_43[abv]; else { if (-abv < t_43.length) xr_1d[quotien][reste] = -g_gain * t_43[-abv]; else xr_1d[quotien][reste] = -g_gain * (float)Math.pow(-abv, d43); } } else { if (is_1d[j] > 0) xr_1d[quotien][reste] = g_gain * (float)Math.pow(abv, d43); else xr_1d[quotien][reste] = -g_gain * (float)Math.pow(-abv, d43); } } } // apply formula per block type for (j=0; j= 36)) )) { t_index = (index - cb_begin) / cb_width; /* xr[sb][ss] *= pow(2.0, ((-2.0 * gr_info.subblock_gain[t_index]) -(0.5 * (1.0 + gr_info.scalefac_scale) * scalefac[ch].s[t_index][cb]))); */ int idx = scalefac[ch].s[t_index][cb] << gr_info.scalefac_scale; idx += (gr_info.subblock_gain[t_index] << 2); xr_1d[quotien][reste] *= two_to_negative_half_pow[idx]; } else { // LONG block types 0,1,3 & 1st 2 subbands of switched blocks /* xr[sb][ss] *= pow(2.0, -0.5 * (1.0+gr_info.scalefac_scale) * (scalefac[ch].l[cb] + gr_info.preflag * pretab[cb])); */ int idx = scalefac[ch].l[cb]; if (gr_info.preflag != 0) idx += pretab[cb]; idx = idx << gr_info.scalefac_scale; xr_1d[quotien][reste] *= two_to_negative_half_pow[idx]; } index++; } for (j=nonzero[ch]; j<576; j++) { // Modif E.B 02/22/99 int reste = j % SSLIMIT; int quotien = (int) ((j-reste)/SSLIMIT); if(reste < 0) reste = 0; if(quotien < 0) quotien = 0; xr_1d[quotien][reste] = 0.0f; } return; } /** * */ private void reorder(float xr[][], int ch, int gr) { gr_info_s gr_info = (si.ch[ch].gr[gr]); int freq, freq3; int index; int sfb, sfb_start, sfb_lines; int src_line, des_line; float[][] xr_1d = xr; if ((gr_info.window_switching_flag !=0) && (gr_info.block_type == 2)) { for(index=0; index<576; index++) out_1d[index] = 0.0f; if (gr_info.mixed_block_flag !=0 ) { // NO REORDER FOR LOW 2 SUBBANDS for (index = 0; index < 36; index++) { // Modif E.B 02/22/99 int reste = index % SSLIMIT; int quotien = (int) ((index-reste)/SSLIMIT); out_1d[index] = xr_1d[quotien][reste]; } // REORDERING FOR REST SWITCHED SHORT /*for( sfb=3,sfb_start=sfBandIndex[sfreq].s[3], sfb_lines=sfBandIndex[sfreq].s[4] - sfb_start; sfb < 13; sfb++,sfb_start = sfBandIndex[sfreq].s[sfb], sfb_lines = sfBandIndex[sfreq].s[sfb+1] - sfb_start ) {*/ for( sfb=3; sfb < 13; sfb++) { //System.out.println("sfreq="+sfreq+" sfb="+sfb+" sfBandIndex="+sfBandIndex.length+" sfBandIndex[sfreq].s="+sfBandIndex[sfreq].s.length); sfb_start = sfBandIndex[sfreq].s[sfb]; sfb_lines = sfBandIndex[sfreq].s[sfb+1] - sfb_start; int sfb_start3 = (sfb_start << 2) - sfb_start; for(freq=0, freq3=0; freq=3; sfb-- ) { i = sfBandIndex[sfreq].s[sfb]; lines = sfBandIndex[sfreq].s[sfb+1] - i; i = (i << 2) - i + (j+1) * lines - 1; while (lines > 0) { if (ro[1][i/18][i%18] != 0.0f) { // MDM: in java, array access is very slow. // Is quicker to compute div and mod values. //if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) { sfbcnt = sfb; sfb = -10; lines = -10; } lines--; i--; } // while (lines > 0) } // for (sfb=12 ... sfb = sfbcnt + 1; if (sfb > max_sfb) max_sfb = sfb; while(sfb < 12) { temp = sfBandIndex[sfreq].s[sfb]; sb = sfBandIndex[sfreq].s[sfb+1] - temp; i = (temp << 2) - temp + j * sb; for ( ; sb > 0; sb--) { is_pos[i] = scalefac[1].s[j][sfb]; if (is_pos[i] != 7) if (lsf) i_stereo_k_values(is_pos[i], io_type, i); else is_ratio[i] = TAN12[is_pos[i]]; i++; } // for (; sb>0... sfb++; } // while (sfb < 12) sfb = sfBandIndex[sfreq].s[10]; sb = sfBandIndex[sfreq].s[11] - sfb; sfb = (sfb << 2) - sfb + j * sb; temp = sfBandIndex[sfreq].s[11]; sb = sfBandIndex[sfreq].s[12] - temp; i = (temp << 2) - temp + j * sb; for (; sb > 0; sb--) { is_pos[i] = is_pos[sfb]; if (lsf) { k[0][i] = k[0][sfb]; k[1][i] = k[1][sfb]; } else { is_ratio[i] = is_ratio[sfb]; } i++; } // for (; sb > 0 ... } if (max_sfb <= 3) { i = 2; ss = 17; sb = -1; while (i >= 0) { if (ro[1][i][ss] != 0.0f) { sb = (i<<4) + (i<<1) + ss; i = -1; } else { ss--; if (ss < 0) { i--; ss = 17; } } // if (ro ... } // while (i>=0) i = 0; while (sfBandIndex[sfreq].l[i] <= sb) i++; sfb = i; i = sfBandIndex[sfreq].l[i]; for (; sfb<8; sfb++) { sb = sfBandIndex[sfreq].l[sfb+1]-sfBandIndex[sfreq].l[sfb]; for (; sb>0; sb--) { is_pos[i] = scalefac[1].l[sfb]; if (is_pos[i] != 7) if (lsf) i_stereo_k_values(is_pos[i], io_type, i); else is_ratio[i] = TAN12[is_pos[i]]; i++; } // for (; sb>0 ... } // for (; sfb<8 ... } // for (j=0 ... } else { // if (gr_info.mixed_block_flag) for (int j=0; j<3; j++) { int sfbcnt; sfbcnt = -1; for( sfb=12; sfb >=0; sfb-- ) { temp = sfBandIndex[sfreq].s[sfb]; lines = sfBandIndex[sfreq].s[sfb+1] - temp; i = (temp << 2) - temp + (j+1) * lines - 1; while (lines > 0) { if (ro[1][i/18][i%18] != 0.0f) { // MDM: in java, array access is very slow. // Is quicker to compute div and mod values. //if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) { sfbcnt = sfb; sfb = -10; lines = -10; } lines--; i--; } // while (lines > 0) */ } // for (sfb=12 ... sfb = sfbcnt + 1; while(sfb<12) { temp = sfBandIndex[sfreq].s[sfb]; sb = sfBandIndex[sfreq].s[sfb+1] - temp; i = (temp << 2) - temp + j * sb; for ( ; sb > 0; sb--) { is_pos[i] = scalefac[1].s[j][sfb]; if (is_pos[i] != 7) if (lsf) i_stereo_k_values(is_pos[i], io_type, i); else is_ratio[i] = TAN12[is_pos[i]]; i++; } // for (; sb>0 ... sfb++; } // while (sfb<12) temp = sfBandIndex[sfreq].s[10]; temp2= sfBandIndex[sfreq].s[11]; sb = temp2 - temp; sfb = (temp << 2) - temp + j * sb; sb = sfBandIndex[sfreq].s[12] - temp2; i = (temp2 << 2) - temp2 + j * sb; for (; sb>0; sb--) { is_pos[i] = is_pos[sfb]; if (lsf) { k[0][i] = k[0][sfb]; k[1][i] = k[1][sfb]; } else { is_ratio[i] = is_ratio[sfb]; } i++; } // for (; sb>0 ... } // for (sfb=12 } // for (j=0 ... } else { // if (gr_info.window_switching_flag ... i = 31; ss = 17; sb = 0; while (i >= 0) { if (ro[1][i][ss] != 0.0f) { sb = (i<<4) + (i<<1) + ss; i = -1; } else { ss--; if (ss < 0) { i--; ss = 17; } } } i = 0; while (sfBandIndex[sfreq].l[i] <= sb) i++; sfb = i; i = sfBandIndex[sfreq].l[i]; for (; sfb<21; sfb++) { sb = sfBandIndex[sfreq].l[sfb+1] - sfBandIndex[sfreq].l[sfb]; for (; sb > 0; sb--) { is_pos[i] = scalefac[1].l[sfb]; if (is_pos[i] != 7) if (lsf) i_stereo_k_values(is_pos[i], io_type, i); else is_ratio[i] = TAN12[is_pos[i]]; i++; } } sfb = sfBandIndex[sfreq].l[20]; for (sb = 576 - sfBandIndex[sfreq].l[21]; (sb > 0) && (i<576); sb--) { is_pos[i] = is_pos[sfb]; // error here : i >=576 if (lsf) { k[0][i] = k[0][sfb]; k[1][i] = k[1][sfb]; } else { is_ratio[i] = is_ratio[sfb]; } i++; } // if (gr_info.mixed_block_flag) } // if (gr_info.window_switching_flag ... } // if (i_stereo) i = 0; for(sb=0;sb 32767.0f) ? 32767 : ((sample < -32768.0f) ? -32768 : (short) sample)); } /** * Write the samples to the file or directly to the audio hardware. */ public abstract void write_buffer(int val); public abstract void close(); /** * Clears all data in the buffer (for seeking). */ public abstract void clear_buffer(); /** * Notify the buffer that the user has stopped the stream. */ public abstract void set_stop_flag(); } extensions/soundspi/javalayer/src/javazoom/jl/decoder/OutputChannels.java000066400000000000000000000073121335566474600273730ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 12/12/99 Initial implementation. mdm@techie.com. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * A Type-safe representation of the the supported output channel * constants. * * This class is immutable and, hence, is thread safe. * * @author Mat McGowan 12/12/99 * @since 0.0.7 */ public class OutputChannels { /** * Flag to indicate output should include both channels. */ public static final int BOTH_CHANNELS = 0; /** * Flag to indicate output should include the left channel only. */ public static final int LEFT_CHANNEL = 1; /** * Flag to indicate output should include the right channel only. */ public static final int RIGHT_CHANNEL = 2; /** * Flag to indicate output is mono. */ public static final int DOWNMIX_CHANNELS = 3; public static final OutputChannels LEFT = new OutputChannels(LEFT_CHANNEL); public static final OutputChannels RIGHT = new OutputChannels(RIGHT_CHANNEL); public static final OutputChannels BOTH = new OutputChannels(BOTH_CHANNELS); public static final OutputChannels DOWNMIX = new OutputChannels(DOWNMIX_CHANNELS); private /*final*/ int outputChannels; /** * Creates an OutputChannels instance * corresponding to the given channel code. * * @param code one of the OutputChannels channel code constants. * * @throws IllegalArgumentException if code is not a valid * channel code. */ static public OutputChannels fromInt(int code) { switch (code) { case LEFT_CHANNEL: return LEFT; case RIGHT_CHANNEL: return RIGHT; case BOTH_CHANNELS: return BOTH; case DOWNMIX_CHANNELS: return DOWNMIX; default: throw new IllegalArgumentException("Invalid channel code: "+code); } } private OutputChannels(int channels) { outputChannels = channels; if (channels<0 || channels>3) throw new IllegalArgumentException("channels"); } /** * Retrieves the code representing the desired output channels. * Will be one of LEFT_CHANNEL, RIGHT_CHANNEL, BOTH_CHANNELS * or DOWNMIX_CHANNELS. * * @return the channel code represented by this instance. */ public int getChannelsOutputCode() { return outputChannels; } /** * Retrieves the number of output channels represented * by this channel output type. * * @return The number of output channels for this channel output * type. This will be 2 for BOTH_CHANNELS only, and 1 * for all other types. */ public int getChannelCount() { int count = (outputChannels==BOTH_CHANNELS) ? 2 : 1; return count; } public boolean equals(Object o) { boolean equals = false; if (o instanceof OutputChannels) { OutputChannels oc = (OutputChannels)o; equals = (oc.outputChannels == outputChannels); } return equals; } public int hashCode() { return outputChannels; } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/SampleBuffer.java000066400000000000000000000055141335566474600267740ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 12/12/99 Initial Version based on FileObuffer. mdm@techie.com. * * FileObuffer: * 15/02/99 Java Conversion by E.B ,javalayer@javazoom.net * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * The SampleBuffer class implements an output buffer * that provides storage for a fixed size block of samples. */ public class SampleBuffer extends Obuffer { private short[] buffer; private int[] bufferp; private int channels; private int frequency; /** * Constructor */ public SampleBuffer(int sample_frequency, int number_of_channels) { buffer = new short[OBUFFERSIZE]; bufferp = new int[MAXCHANNELS]; channels = number_of_channels; frequency = sample_frequency; for (int i = 0; i < number_of_channels; ++i) bufferp[i] = (short)i; } public int getChannelCount() { return this.channels; } public int getSampleFrequency() { return this.frequency; } public short[] getBuffer() { return this.buffer; } public int getBufferLength() { return bufferp[0]; } /** * Takes a 16 Bit PCM sample. */ public void append(int channel, short value) { buffer[bufferp[channel]] = value; bufferp[channel] += channels; } public void appendSamples(int channel, float[] f) { int pos = bufferp[channel]; short s; float fs; for (int i=0; i<32;) { fs = f[i++]; fs = (fs>32767.0f ? 32767.0f : (fs < -32767.0f ? -32767.0f : fs)); s = (short)fs; buffer[pos] = s; pos += channels; } bufferp[channel] = pos; } /** * Write the samples to the file (Random Acces). */ public void write_buffer(int val) { //for (int i = 0; i < channels; ++i) // bufferp[i] = (short)i; } public void close() {} /** * */ public void clear_buffer() { for (int i = 0; i < channels; ++i) bufferp[i] = (short)i; } /** * */ public void set_stop_flag() {} } extensions/soundspi/javalayer/src/javazoom/jl/decoder/Source.java000066400000000000000000000025411335566474600256560ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; import java.io.IOException; /** * Work in progress. * * Class to describe a seekable data source. * */ public interface Source { public static final long LENGTH_UNKNOWN = -1; public int read(byte[] b, int offs, int len) throws IOException; public boolean willReadBlock(); public boolean isSeekable(); public long length(); public long tell(); public long seek(long pos); } extensions/soundspi/javalayer/src/javazoom/jl/decoder/SynthesisFilter.java000066400000000000000000001471721335566474600275670ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 04/01/00 Fixes for running under build 23xx Microsoft JVM. mdm. * * 19/12/99 Performance improvements to compute_pcm_samples(). * Mat McGowan. mdm@techie.com. * * 16/02/99 Java Conversion by E.B , javalayer@javazoom.net * * @(#) synthesis_filter.h 1.8, last edit: 6/15/94 16:52:00 * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de) * @(#) Berlin University of Technology * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; import java.io.IOException; /** * A class for the synthesis filter bank. * This class does a fast downsampling from 32, 44.1 or 48 kHz to 8 kHz, if ULAW is defined. * Frequencies above 4 kHz are removed by ignoring higher subbands. */ final class SynthesisFilter { private float[] v1; private float[] v2; private float[] actual_v; // v1 or v2 private int actual_write_pos; // 0-15 private float[] samples; // 32 new subband samples private int channel; private float scalefactor; private float[] eq; /** * Quality value for controlling CPU usage/quality tradeoff. */ /* private int quality; private int v_inc; public static final int HIGH_QUALITY = 1; public static final int MEDIUM_QUALITY = 2; public static final int LOW_QUALITY = 4; */ /** * Contructor. * The scalefactor scales the calculated float pcm samples to short values * (raw pcm samples are in [-1.0, 1.0], if no violations occur). */ public SynthesisFilter(int channelnumber, float factor, float[] eq0) { if (d==null) { d = load_d(); d16 = splitArray(d, 16); } v1 = new float[512]; v2 = new float[512]; samples = new float[32]; channel = channelnumber; scalefactor = factor; setEQ(eq); //setQuality(HIGH_QUALITY); reset(); } public void setEQ(float[] eq0) { this.eq = eq0; if (eq==null) { eq = new float[32]; for (int i=0; i<32; i++) eq[i] = 1.0f; } if (eq.length<32) { throw new IllegalArgumentException("eq0"); } } /* private void setQuality(int quality0) { switch (quality0) { case HIGH_QUALITY: case MEDIUM_QUALITY: case LOW_QUALITY: v_inc = 16 * quality0; quality = quality0; break; default : throw new IllegalArgumentException("Unknown quality value"); } } public int getQuality() { return quality; } */ /** * Reset the synthesis filter. */ public void reset() { //float[] floatp; // float[] floatp2; // initialize v1[] and v2[]: //for (floatp = v1 + 512, floatp2 = v2 + 512; floatp > v1; ) // *--floatp = *--floatp2 = 0.0; for (int p=0;p<512;p++) v1[p] = v2[p] = 0.0f; // initialize samples[]: //for (floatp = samples + 32; floatp > samples; ) // *--floatp = 0.0; for (int p2=0;p2<32;p2++) samples[p2] = 0.0f; actual_v = v1; actual_write_pos = 15; } /** * Inject Sample. */ public void input_sample(float sample, int subbandnumber) { samples[subbandnumber] = eq[subbandnumber]*sample; } public void input_samples(float[] s) { for (int i=31; i>=0; i--) { samples[i] = s[i]*eq[i]; } } /** * Compute new values via a fast cosine transform. */ private void compute_new_v() { // p is fully initialized from x1 //float[] p = _p; // pp is fully initialized from p //float[] pp = _pp; //float[] new_v = _new_v; //float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3 //float[] p = new float[16]; //float[] pp = new float[16]; /* for (int i=31; i>=0; i--) { new_v[i] = 0.0f; } */ float new_v0, new_v1, new_v2, new_v3, new_v4, new_v5, new_v6, new_v7, new_v8, new_v9; float new_v10, new_v11, new_v12, new_v13, new_v14, new_v15, new_v16, new_v17, new_v18, new_v19; float new_v20, new_v21, new_v22, new_v23, new_v24, new_v25, new_v26, new_v27, new_v28, new_v29; float new_v30, new_v31; new_v0 = new_v1 = new_v2 = new_v3 = new_v4 = new_v5 = new_v6 = new_v7 = new_v8 = new_v9 = new_v10 = new_v11 = new_v12 = new_v13 = new_v14 = new_v15 = new_v16 = new_v17 = new_v18 = new_v19 = new_v20 = new_v21 = new_v22 = new_v23 = new_v24 = new_v25 = new_v26 = new_v27 = new_v28 = new_v29 = new_v30 = new_v31 = 0.0f; // float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3 // float[] p = new float[16]; // float[] pp = new float[16]; float[] s = samples; float s0 = s[0]; float s1 = s[1]; float s2 = s[2]; float s3 = s[3]; float s4 = s[4]; float s5 = s[5]; float s6 = s[6]; float s7 = s[7]; float s8 = s[8]; float s9 = s[9]; float s10 = s[10]; float s11 = s[11]; float s12 = s[12]; float s13 = s[13]; float s14 = s[14]; float s15 = s[15]; float s16 = s[16]; float s17 = s[17]; float s18 = s[18]; float s19 = s[19]; float s20 = s[20]; float s21 = s[21]; float s22 = s[22]; float s23 = s[23]; float s24 = s[24]; float s25 = s[25]; float s26 = s[26]; float s27 = s[27]; float s28 = s[28]; float s29 = s[29]; float s30 = s[30]; float s31 = s[31]; float p0 = s0 + s31; float p1 = s1 + s30; float p2 = s2 + s29; float p3 = s3 + s28; float p4 = s4 + s27; float p5 = s5 + s26; float p6 = s6 + s25; float p7 = s7 + s24; float p8 = s8 + s23; float p9 = s9 + s22; float p10 = s10 + s21; float p11 = s11 + s20; float p12 = s12 + s19; float p13 = s13 + s18; float p14 = s14 + s17; float p15 = s15 + s16; float pp0 = p0 + p15; float pp1 = p1 + p14; float pp2 = p2 + p13; float pp3 = p3 + p12; float pp4 = p4 + p11; float pp5 = p5 + p10; float pp6 = p6 + p9; float pp7 = p7 + p8; float pp8 = (p0 - p15) * cos1_32; float pp9 = (p1 - p14) * cos3_32; float pp10 = (p2 - p13) * cos5_32; float pp11 = (p3 - p12) * cos7_32; float pp12 = (p4 - p11) * cos9_32; float pp13 = (p5 - p10) * cos11_32; float pp14 = (p6 - p9) * cos13_32; float pp15 = (p7 - p8) * cos15_32; p0 = pp0 + pp7; p1 = pp1 + pp6; p2 = pp2 + pp5; p3 = pp3 + pp4; p4 = (pp0 - pp7) * cos1_16; p5 = (pp1 - pp6) * cos3_16; p6 = (pp2 - pp5) * cos5_16; p7 = (pp3 - pp4) * cos7_16; p8 = pp8 + pp15; p9 = pp9 + pp14; p10 = pp10 + pp13; p11 = pp11 + pp12; p12 = (pp8 - pp15) * cos1_16; p13 = (pp9 - pp14) * cos3_16; p14 = (pp10 - pp13) * cos5_16; p15 = (pp11 - pp12) * cos7_16; pp0 = p0 + p3; pp1 = p1 + p2; pp2 = (p0 - p3) * cos1_8; pp3 = (p1 - p2) * cos3_8; pp4 = p4 + p7; pp5 = p5 + p6; pp6 = (p4 - p7) * cos1_8; pp7 = (p5 - p6) * cos3_8; pp8 = p8 + p11; pp9 = p9 + p10; pp10 = (p8 - p11) * cos1_8; pp11 = (p9 - p10) * cos3_8; pp12 = p12 + p15; pp13 = p13 + p14; pp14 = (p12 - p15) * cos1_8; pp15 = (p13 - p14) * cos3_8; p0 = pp0 + pp1; p1 = (pp0 - pp1) * cos1_4; p2 = pp2 + pp3; p3 = (pp2 - pp3) * cos1_4; p4 = pp4 + pp5; p5 = (pp4 - pp5) * cos1_4; p6 = pp6 + pp7; p7 = (pp6 - pp7) * cos1_4; p8 = pp8 + pp9; p9 = (pp8 - pp9) * cos1_4; p10 = pp10 + pp11; p11 = (pp10 - pp11) * cos1_4; p12 = pp12 + pp13; p13 = (pp12 - pp13) * cos1_4; p14 = pp14 + pp15; p15 = (pp14 - pp15) * cos1_4; // this is pretty insane coding float tmp1; new_v19/*36-17*/ = -(new_v4 = (new_v12 = p7) + p5) - p6; new_v27/*44-17*/ = -p6 - p7 - p4; new_v6 = (new_v10 = (new_v14 = p15) + p11) + p13; new_v17/*34-17*/ = -(new_v2 = p15 + p13 + p9) - p14; new_v21/*38-17*/ = (tmp1 = -p14 - p15 - p10 - p11) - p13; new_v29/*46-17*/ = -p14 - p15 - p12 - p8; new_v25/*42-17*/ = tmp1 - p12; new_v31/*48-17*/ = -p0; new_v0 = p1; new_v23/*40-17*/ = -(new_v8 = p3) - p2; p0 = (s0 - s31) * cos1_64; p1 = (s1 - s30) * cos3_64; p2 = (s2 - s29) * cos5_64; p3 = (s3 - s28) * cos7_64; p4 = (s4 - s27) * cos9_64; p5 = (s5 - s26) * cos11_64; p6 = (s6 - s25) * cos13_64; p7 = (s7 - s24) * cos15_64; p8 = (s8 - s23) * cos17_64; p9 = (s9 - s22) * cos19_64; p10 = (s10 - s21) * cos21_64; p11 = (s11 - s20) * cos23_64; p12 = (s12 - s19) * cos25_64; p13 = (s13 - s18) * cos27_64; p14 = (s14 - s17) * cos29_64; p15 = (s15 - s16) * cos31_64; pp0 = p0 + p15; pp1 = p1 + p14; pp2 = p2 + p13; pp3 = p3 + p12; pp4 = p4 + p11; pp5 = p5 + p10; pp6 = p6 + p9; pp7 = p7 + p8; pp8 = (p0 - p15) * cos1_32; pp9 = (p1 - p14) * cos3_32; pp10 = (p2 - p13) * cos5_32; pp11 = (p3 - p12) * cos7_32; pp12 = (p4 - p11) * cos9_32; pp13 = (p5 - p10) * cos11_32; pp14 = (p6 - p9) * cos13_32; pp15 = (p7 - p8) * cos15_32; p0 = pp0 + pp7; p1 = pp1 + pp6; p2 = pp2 + pp5; p3 = pp3 + pp4; p4 = (pp0 - pp7) * cos1_16; p5 = (pp1 - pp6) * cos3_16; p6 = (pp2 - pp5) * cos5_16; p7 = (pp3 - pp4) * cos7_16; p8 = pp8 + pp15; p9 = pp9 + pp14; p10 = pp10 + pp13; p11 = pp11 + pp12; p12 = (pp8 - pp15) * cos1_16; p13 = (pp9 - pp14) * cos3_16; p14 = (pp10 - pp13) * cos5_16; p15 = (pp11 - pp12) * cos7_16; pp0 = p0 + p3; pp1 = p1 + p2; pp2 = (p0 - p3) * cos1_8; pp3 = (p1 - p2) * cos3_8; pp4 = p4 + p7; pp5 = p5 + p6; pp6 = (p4 - p7) * cos1_8; pp7 = (p5 - p6) * cos3_8; pp8 = p8 + p11; pp9 = p9 + p10; pp10 = (p8 - p11) * cos1_8; pp11 = (p9 - p10) * cos3_8; pp12 = p12 + p15; pp13 = p13 + p14; pp14 = (p12 - p15) * cos1_8; pp15 = (p13 - p14) * cos3_8; p0 = pp0 + pp1; p1 = (pp0 - pp1) * cos1_4; p2 = pp2 + pp3; p3 = (pp2 - pp3) * cos1_4; p4 = pp4 + pp5; p5 = (pp4 - pp5) * cos1_4; p6 = pp6 + pp7; p7 = (pp6 - pp7) * cos1_4; p8 = pp8 + pp9; p9 = (pp8 - pp9) * cos1_4; p10 = pp10 + pp11; p11 = (pp10 - pp11) * cos1_4; p12 = pp12 + pp13; p13 = (pp12 - pp13) * cos1_4; p14 = pp14 + pp15; p15 = (pp14 - pp15) * cos1_4; // manually doing something that a compiler should handle sucks // coding like this is hard to read float tmp2; new_v5 = (new_v11 = (new_v13 = (new_v15 = p15) + p7) + p11) + p5 + p13; new_v7 = (new_v9 = p15 + p11 + p3) + p13; new_v16/*33-17*/ = -(new_v1 = (tmp1 = p13 + p15 + p9) + p1) - p14; new_v18/*35-17*/ = -(new_v3 = tmp1 + p5 + p7) - p6 - p14; new_v22/*39-17*/ = (tmp1 = -p10 - p11 - p14 - p15) - p13 - p2 - p3; new_v20/*37-17*/ = tmp1 - p13 - p5 - p6 - p7; new_v24/*41-17*/ = tmp1 - p12 - p2 - p3; new_v26/*43-17*/ = tmp1 - p12 - (tmp2 = p4 + p6 + p7); new_v30/*47-17*/ = (tmp1 = -p8 - p12 - p14 - p15) - p0; new_v28/*45-17*/ = tmp1 - tmp2; // insert V[0-15] (== new_v[0-15]) into actual v: // float[] x2 = actual_v + actual_write_pos; float dest[] = actual_v; int pos = actual_write_pos; dest[0 + pos] = new_v0; dest[16 + pos] = new_v1; dest[32 + pos] = new_v2; dest[48 + pos] = new_v3; dest[64 + pos] = new_v4; dest[80 + pos] = new_v5; dest[96 + pos] = new_v6; dest[112 + pos] = new_v7; dest[128 + pos] = new_v8; dest[144 + pos] = new_v9; dest[160 + pos] = new_v10; dest[176 + pos] = new_v11; dest[192 + pos] = new_v12; dest[208 + pos] = new_v13; dest[224 + pos] = new_v14; dest[240 + pos] = new_v15; // V[16] is always 0.0: dest[256 + pos] = 0.0f; // insert V[17-31] (== -new_v[15-1]) into actual v: dest[272 + pos] = -new_v15; dest[288 + pos] = -new_v14; dest[304 + pos] = -new_v13; dest[320 + pos] = -new_v12; dest[336 + pos] = -new_v11; dest[352 + pos] = -new_v10; dest[368 + pos] = -new_v9; dest[384 + pos] = -new_v8; dest[400 + pos] = -new_v7; dest[416 + pos] = -new_v6; dest[432 + pos] = -new_v5; dest[448 + pos] = -new_v4; dest[464 + pos] = -new_v3; dest[480 + pos] = -new_v2; dest[496 + pos] = -new_v1; // insert V[32] (== -new_v[0]) into other v: dest = (actual_v==v1) ? v2 : v1; dest[0 + pos] = -new_v0; // insert V[33-48] (== new_v[16-31]) into other v: dest[16 + pos] = new_v16; dest[32 + pos] = new_v17; dest[48 + pos] = new_v18; dest[64 + pos] = new_v19; dest[80 + pos] = new_v20; dest[96 + pos] = new_v21; dest[112 + pos] = new_v22; dest[128 + pos] = new_v23; dest[144 + pos] = new_v24; dest[160 + pos] = new_v25; dest[176 + pos] = new_v26; dest[192 + pos] = new_v27; dest[208 + pos] = new_v28; dest[224 + pos] = new_v29; dest[240 + pos] = new_v30; dest[256 + pos] = new_v31; // insert V[49-63] (== new_v[30-16]) into other v: dest[272 + pos] = new_v30; dest[288 + pos] = new_v29; dest[304 + pos] = new_v28; dest[320 + pos] = new_v27; dest[336 + pos] = new_v26; dest[352 + pos] = new_v25; dest[368 + pos] = new_v24; dest[384 + pos] = new_v23; dest[400 + pos] = new_v22; dest[416 + pos] = new_v21; dest[432 + pos] = new_v20; dest[448 + pos] = new_v19; dest[464 + pos] = new_v18; dest[480 + pos] = new_v17; dest[496 + pos] = new_v16; /* } else { v1[0 + actual_write_pos] = -new_v0; // insert V[33-48] (== new_v[16-31]) into other v: v1[16 + actual_write_pos] = new_v16; v1[32 + actual_write_pos] = new_v17; v1[48 + actual_write_pos] = new_v18; v1[64 + actual_write_pos] = new_v19; v1[80 + actual_write_pos] = new_v20; v1[96 + actual_write_pos] = new_v21; v1[112 + actual_write_pos] = new_v22; v1[128 + actual_write_pos] = new_v23; v1[144 + actual_write_pos] = new_v24; v1[160 + actual_write_pos] = new_v25; v1[176 + actual_write_pos] = new_v26; v1[192 + actual_write_pos] = new_v27; v1[208 + actual_write_pos] = new_v28; v1[224 + actual_write_pos] = new_v29; v1[240 + actual_write_pos] = new_v30; v1[256 + actual_write_pos] = new_v31; // insert V[49-63] (== new_v[30-16]) into other v: v1[272 + actual_write_pos] = new_v30; v1[288 + actual_write_pos] = new_v29; v1[304 + actual_write_pos] = new_v28; v1[320 + actual_write_pos] = new_v27; v1[336 + actual_write_pos] = new_v26; v1[352 + actual_write_pos] = new_v25; v1[368 + actual_write_pos] = new_v24; v1[384 + actual_write_pos] = new_v23; v1[400 + actual_write_pos] = new_v22; v1[416 + actual_write_pos] = new_v21; v1[432 + actual_write_pos] = new_v20; v1[448 + actual_write_pos] = new_v19; v1[464 + actual_write_pos] = new_v18; v1[480 + actual_write_pos] = new_v17; v1[496 + actual_write_pos] = new_v16; } */ } /** * Compute new values via a fast cosine transform. */ private void compute_new_v_old() { // p is fully initialized from x1 //float[] p = _p; // pp is fully initialized from p //float[] pp = _pp; //float[] new_v = _new_v; float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3 float[] p = new float[16]; float[] pp = new float[16]; for (int i=31; i>=0; i--) { new_v[i] = 0.0f; } // float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3 // float[] p = new float[16]; // float[] pp = new float[16]; float[] x1 = samples; p[0] = x1[0] + x1[31]; p[1] = x1[1] + x1[30]; p[2] = x1[2] + x1[29]; p[3] = x1[3] + x1[28]; p[4] = x1[4] + x1[27]; p[5] = x1[5] + x1[26]; p[6] = x1[6] + x1[25]; p[7] = x1[7] + x1[24]; p[8] = x1[8] + x1[23]; p[9] = x1[9] + x1[22]; p[10] = x1[10] + x1[21]; p[11] = x1[11] + x1[20]; p[12] = x1[12] + x1[19]; p[13] = x1[13] + x1[18]; p[14] = x1[14] + x1[17]; p[15] = x1[15] + x1[16]; pp[0] = p[0] + p[15]; pp[1] = p[1] + p[14]; pp[2] = p[2] + p[13]; pp[3] = p[3] + p[12]; pp[4] = p[4] + p[11]; pp[5] = p[5] + p[10]; pp[6] = p[6] + p[9]; pp[7] = p[7] + p[8]; pp[8] = (p[0] - p[15]) * cos1_32; pp[9] = (p[1] - p[14]) * cos3_32; pp[10] = (p[2] - p[13]) * cos5_32; pp[11] = (p[3] - p[12]) * cos7_32; pp[12] = (p[4] - p[11]) * cos9_32; pp[13] = (p[5] - p[10]) * cos11_32; pp[14] = (p[6] - p[9]) * cos13_32; pp[15] = (p[7] - p[8]) * cos15_32; p[0] = pp[0] + pp[7]; p[1] = pp[1] + pp[6]; p[2] = pp[2] + pp[5]; p[3] = pp[3] + pp[4]; p[4] = (pp[0] - pp[7]) * cos1_16; p[5] = (pp[1] - pp[6]) * cos3_16; p[6] = (pp[2] - pp[5]) * cos5_16; p[7] = (pp[3] - pp[4]) * cos7_16; p[8] = pp[8] + pp[15]; p[9] = pp[9] + pp[14]; p[10] = pp[10] + pp[13]; p[11] = pp[11] + pp[12]; p[12] = (pp[8] - pp[15]) * cos1_16; p[13] = (pp[9] - pp[14]) * cos3_16; p[14] = (pp[10] - pp[13]) * cos5_16; p[15] = (pp[11] - pp[12]) * cos7_16; pp[0] = p[0] + p[3]; pp[1] = p[1] + p[2]; pp[2] = (p[0] - p[3]) * cos1_8; pp[3] = (p[1] - p[2]) * cos3_8; pp[4] = p[4] + p[7]; pp[5] = p[5] + p[6]; pp[6] = (p[4] - p[7]) * cos1_8; pp[7] = (p[5] - p[6]) * cos3_8; pp[8] = p[8] + p[11]; pp[9] = p[9] + p[10]; pp[10] = (p[8] - p[11]) * cos1_8; pp[11] = (p[9] - p[10]) * cos3_8; pp[12] = p[12] + p[15]; pp[13] = p[13] + p[14]; pp[14] = (p[12] - p[15]) * cos1_8; pp[15] = (p[13] - p[14]) * cos3_8; p[0] = pp[0] + pp[1]; p[1] = (pp[0] - pp[1]) * cos1_4; p[2] = pp[2] + pp[3]; p[3] = (pp[2] - pp[3]) * cos1_4; p[4] = pp[4] + pp[5]; p[5] = (pp[4] - pp[5]) * cos1_4; p[6] = pp[6] + pp[7]; p[7] = (pp[6] - pp[7]) * cos1_4; p[8] = pp[8] + pp[9]; p[9] = (pp[8] - pp[9]) * cos1_4; p[10] = pp[10] + pp[11]; p[11] = (pp[10] - pp[11]) * cos1_4; p[12] = pp[12] + pp[13]; p[13] = (pp[12] - pp[13]) * cos1_4; p[14] = pp[14] + pp[15]; p[15] = (pp[14] - pp[15]) * cos1_4; // this is pretty insane coding float tmp1; new_v[36-17] = -(new_v[4] = (new_v[12] = p[7]) + p[5]) - p[6]; new_v[44-17] = -p[6] - p[7] - p[4]; new_v[6] = (new_v[10] = (new_v[14] = p[15]) + p[11]) + p[13]; new_v[34-17] = -(new_v[2] = p[15] + p[13] + p[9]) - p[14]; new_v[38-17] = (tmp1 = -p[14] - p[15] - p[10] - p[11]) - p[13]; new_v[46-17] = -p[14] - p[15] - p[12] - p[8]; new_v[42-17] = tmp1 - p[12]; new_v[48-17] = -p[0]; new_v[0] = p[1]; new_v[40-17] = -(new_v[8] = p[3]) - p[2]; p[0] = (x1[0] - x1[31]) * cos1_64; p[1] = (x1[1] - x1[30]) * cos3_64; p[2] = (x1[2] - x1[29]) * cos5_64; p[3] = (x1[3] - x1[28]) * cos7_64; p[4] = (x1[4] - x1[27]) * cos9_64; p[5] = (x1[5] - x1[26]) * cos11_64; p[6] = (x1[6] - x1[25]) * cos13_64; p[7] = (x1[7] - x1[24]) * cos15_64; p[8] = (x1[8] - x1[23]) * cos17_64; p[9] = (x1[9] - x1[22]) * cos19_64; p[10] = (x1[10] - x1[21]) * cos21_64; p[11] = (x1[11] - x1[20]) * cos23_64; p[12] = (x1[12] - x1[19]) * cos25_64; p[13] = (x1[13] - x1[18]) * cos27_64; p[14] = (x1[14] - x1[17]) * cos29_64; p[15] = (x1[15] - x1[16]) * cos31_64; pp[0] = p[0] + p[15]; pp[1] = p[1] + p[14]; pp[2] = p[2] + p[13]; pp[3] = p[3] + p[12]; pp[4] = p[4] + p[11]; pp[5] = p[5] + p[10]; pp[6] = p[6] + p[9]; pp[7] = p[7] + p[8]; pp[8] = (p[0] - p[15]) * cos1_32; pp[9] = (p[1] - p[14]) * cos3_32; pp[10] = (p[2] - p[13]) * cos5_32; pp[11] = (p[3] - p[12]) * cos7_32; pp[12] = (p[4] - p[11]) * cos9_32; pp[13] = (p[5] - p[10]) * cos11_32; pp[14] = (p[6] - p[9]) * cos13_32; pp[15] = (p[7] - p[8]) * cos15_32; p[0] = pp[0] + pp[7]; p[1] = pp[1] + pp[6]; p[2] = pp[2] + pp[5]; p[3] = pp[3] + pp[4]; p[4] = (pp[0] - pp[7]) * cos1_16; p[5] = (pp[1] - pp[6]) * cos3_16; p[6] = (pp[2] - pp[5]) * cos5_16; p[7] = (pp[3] - pp[4]) * cos7_16; p[8] = pp[8] + pp[15]; p[9] = pp[9] + pp[14]; p[10] = pp[10] + pp[13]; p[11] = pp[11] + pp[12]; p[12] = (pp[8] - pp[15]) * cos1_16; p[13] = (pp[9] - pp[14]) * cos3_16; p[14] = (pp[10] - pp[13]) * cos5_16; p[15] = (pp[11] - pp[12]) * cos7_16; pp[0] = p[0] + p[3]; pp[1] = p[1] + p[2]; pp[2] = (p[0] - p[3]) * cos1_8; pp[3] = (p[1] - p[2]) * cos3_8; pp[4] = p[4] + p[7]; pp[5] = p[5] + p[6]; pp[6] = (p[4] - p[7]) * cos1_8; pp[7] = (p[5] - p[6]) * cos3_8; pp[8] = p[8] + p[11]; pp[9] = p[9] + p[10]; pp[10] = (p[8] - p[11]) * cos1_8; pp[11] = (p[9] - p[10]) * cos3_8; pp[12] = p[12] + p[15]; pp[13] = p[13] + p[14]; pp[14] = (p[12] - p[15]) * cos1_8; pp[15] = (p[13] - p[14]) * cos3_8; p[0] = pp[0] + pp[1]; p[1] = (pp[0] - pp[1]) * cos1_4; p[2] = pp[2] + pp[3]; p[3] = (pp[2] - pp[3]) * cos1_4; p[4] = pp[4] + pp[5]; p[5] = (pp[4] - pp[5]) * cos1_4; p[6] = pp[6] + pp[7]; p[7] = (pp[6] - pp[7]) * cos1_4; p[8] = pp[8] + pp[9]; p[9] = (pp[8] - pp[9]) * cos1_4; p[10] = pp[10] + pp[11]; p[11] = (pp[10] - pp[11]) * cos1_4; p[12] = pp[12] + pp[13]; p[13] = (pp[12] - pp[13]) * cos1_4; p[14] = pp[14] + pp[15]; p[15] = (pp[14] - pp[15]) * cos1_4; // manually doing something that a compiler should handle sucks // coding like this is hard to read float tmp2; new_v[5] = (new_v[11] = (new_v[13] = (new_v[15] = p[15]) + p[7]) + p[11]) + p[5] + p[13]; new_v[7] = (new_v[9] = p[15] + p[11] + p[3]) + p[13]; new_v[33-17] = -(new_v[1] = (tmp1 = p[13] + p[15] + p[9]) + p[1]) - p[14]; new_v[35-17] = -(new_v[3] = tmp1 + p[5] + p[7]) - p[6] - p[14]; new_v[39-17] = (tmp1 = -p[10] - p[11] - p[14] - p[15]) - p[13] - p[2] - p[3]; new_v[37-17] = tmp1 - p[13] - p[5] - p[6] - p[7]; new_v[41-17] = tmp1 - p[12] - p[2] - p[3]; new_v[43-17] = tmp1 - p[12] - (tmp2 = p[4] + p[6] + p[7]); new_v[47-17] = (tmp1 = -p[8] - p[12] - p[14] - p[15]) - p[0]; new_v[45-17] = tmp1 - tmp2; // insert V[0-15] (== new_v[0-15]) into actual v: x1 = new_v; // float[] x2 = actual_v + actual_write_pos; float[] dest = actual_v; dest[0 + actual_write_pos] = x1[0]; dest[16 + actual_write_pos] = x1[1]; dest[32 + actual_write_pos] = x1[2]; dest[48 + actual_write_pos] = x1[3]; dest[64 + actual_write_pos] = x1[4]; dest[80 + actual_write_pos] = x1[5]; dest[96 + actual_write_pos] = x1[6]; dest[112 + actual_write_pos] = x1[7]; dest[128 + actual_write_pos] = x1[8]; dest[144 + actual_write_pos] = x1[9]; dest[160 + actual_write_pos] = x1[10]; dest[176 + actual_write_pos] = x1[11]; dest[192 + actual_write_pos] = x1[12]; dest[208 + actual_write_pos] = x1[13]; dest[224 + actual_write_pos] = x1[14]; dest[240 + actual_write_pos] = x1[15]; // V[16] is always 0.0: dest[256 + actual_write_pos] = 0.0f; // insert V[17-31] (== -new_v[15-1]) into actual v: dest[272 + actual_write_pos] = -x1[15]; dest[288 + actual_write_pos] = -x1[14]; dest[304 + actual_write_pos] = -x1[13]; dest[320 + actual_write_pos] = -x1[12]; dest[336 + actual_write_pos] = -x1[11]; dest[352 + actual_write_pos] = -x1[10]; dest[368 + actual_write_pos] = -x1[9]; dest[384 + actual_write_pos] = -x1[8]; dest[400 + actual_write_pos] = -x1[7]; dest[416 + actual_write_pos] = -x1[6]; dest[432 + actual_write_pos] = -x1[5]; dest[448 + actual_write_pos] = -x1[4]; dest[464 + actual_write_pos] = -x1[3]; dest[480 + actual_write_pos] = -x1[2]; dest[496 + actual_write_pos] = -x1[1]; // insert V[32] (== -new_v[0]) into other v: } /** * Compute PCM Samples. */ private float[] _tmpOut = new float[32]; private void compute_pcm_samples0(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { float pcm_sample; final float[] dp = d16[i]; pcm_sample = (float)(((vp[0 + dvp] * dp[0]) + (vp[15 + dvp] * dp[1]) + (vp[14 + dvp] * dp[2]) + (vp[13 + dvp] * dp[3]) + (vp[12 + dvp] * dp[4]) + (vp[11 + dvp] * dp[5]) + (vp[10 + dvp] * dp[6]) + (vp[9 + dvp] * dp[7]) + (vp[8 + dvp] * dp[8]) + (vp[7 + dvp] * dp[9]) + (vp[6 + dvp] * dp[10]) + (vp[5 + dvp] * dp[11]) + (vp[4 + dvp] * dp[12]) + (vp[3 + dvp] * dp[13]) + (vp[2 + dvp] * dp[14]) + (vp[1 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples1(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[1 + dvp] * dp[0]) + (vp[0 + dvp] * dp[1]) + (vp[15 + dvp] * dp[2]) + (vp[14 + dvp] * dp[3]) + (vp[13 + dvp] * dp[4]) + (vp[12 + dvp] * dp[5]) + (vp[11 + dvp] * dp[6]) + (vp[10 + dvp] * dp[7]) + (vp[9 + dvp] * dp[8]) + (vp[8 + dvp] * dp[9]) + (vp[7 + dvp] * dp[10]) + (vp[6 + dvp] * dp[11]) + (vp[5 + dvp] * dp[12]) + (vp[4 + dvp] * dp[13]) + (vp[3 + dvp] * dp[14]) + (vp[2 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples2(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[2 + dvp] * dp[0]) + (vp[1 + dvp] * dp[1]) + (vp[0 + dvp] * dp[2]) + (vp[15 + dvp] * dp[3]) + (vp[14 + dvp] * dp[4]) + (vp[13 + dvp] * dp[5]) + (vp[12 + dvp] * dp[6]) + (vp[11 + dvp] * dp[7]) + (vp[10 + dvp] * dp[8]) + (vp[9 + dvp] * dp[9]) + (vp[8 + dvp] * dp[10]) + (vp[7 + dvp] * dp[11]) + (vp[6 + dvp] * dp[12]) + (vp[5 + dvp] * dp[13]) + (vp[4 + dvp] * dp[14]) + (vp[3 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples3(Obuffer buffer) { final float[] vp = actual_v; int idx = 0; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[3 + dvp] * dp[0]) + (vp[2 + dvp] * dp[1]) + (vp[1 + dvp] * dp[2]) + (vp[0 + dvp] * dp[3]) + (vp[15 + dvp] * dp[4]) + (vp[14 + dvp] * dp[5]) + (vp[13 + dvp] * dp[6]) + (vp[12 + dvp] * dp[7]) + (vp[11 + dvp] * dp[8]) + (vp[10 + dvp] * dp[9]) + (vp[9 + dvp] * dp[10]) + (vp[8 + dvp] * dp[11]) + (vp[7 + dvp] * dp[12]) + (vp[6 + dvp] * dp[13]) + (vp[5 + dvp] * dp[14]) + (vp[4 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples4(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[4 + dvp] * dp[0]) + (vp[3 + dvp] * dp[1]) + (vp[2 + dvp] * dp[2]) + (vp[1 + dvp] * dp[3]) + (vp[0 + dvp] * dp[4]) + (vp[15 + dvp] * dp[5]) + (vp[14 + dvp] * dp[6]) + (vp[13 + dvp] * dp[7]) + (vp[12 + dvp] * dp[8]) + (vp[11 + dvp] * dp[9]) + (vp[10 + dvp] * dp[10]) + (vp[9 + dvp] * dp[11]) + (vp[8 + dvp] * dp[12]) + (vp[7 + dvp] * dp[13]) + (vp[6 + dvp] * dp[14]) + (vp[5 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples5(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[5 + dvp] * dp[0]) + (vp[4 + dvp] * dp[1]) + (vp[3 + dvp] * dp[2]) + (vp[2 + dvp] * dp[3]) + (vp[1 + dvp] * dp[4]) + (vp[0 + dvp] * dp[5]) + (vp[15 + dvp] * dp[6]) + (vp[14 + dvp] * dp[7]) + (vp[13 + dvp] * dp[8]) + (vp[12 + dvp] * dp[9]) + (vp[11 + dvp] * dp[10]) + (vp[10 + dvp] * dp[11]) + (vp[9 + dvp] * dp[12]) + (vp[8 + dvp] * dp[13]) + (vp[7 + dvp] * dp[14]) + (vp[6 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples6(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[6 + dvp] * dp[0]) + (vp[5 + dvp] * dp[1]) + (vp[4 + dvp] * dp[2]) + (vp[3 + dvp] * dp[3]) + (vp[2 + dvp] * dp[4]) + (vp[1 + dvp] * dp[5]) + (vp[0 + dvp] * dp[6]) + (vp[15 + dvp] * dp[7]) + (vp[14 + dvp] * dp[8]) + (vp[13 + dvp] * dp[9]) + (vp[12 + dvp] * dp[10]) + (vp[11 + dvp] * dp[11]) + (vp[10 + dvp] * dp[12]) + (vp[9 + dvp] * dp[13]) + (vp[8 + dvp] * dp[14]) + (vp[7 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples7(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[7 + dvp] * dp[0]) + (vp[6 + dvp] * dp[1]) + (vp[5 + dvp] * dp[2]) + (vp[4 + dvp] * dp[3]) + (vp[3 + dvp] * dp[4]) + (vp[2 + dvp] * dp[5]) + (vp[1 + dvp] * dp[6]) + (vp[0 + dvp] * dp[7]) + (vp[15 + dvp] * dp[8]) + (vp[14 + dvp] * dp[9]) + (vp[13 + dvp] * dp[10]) + (vp[12 + dvp] * dp[11]) + (vp[11 + dvp] * dp[12]) + (vp[10 + dvp] * dp[13]) + (vp[9 + dvp] * dp[14]) + (vp[8 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples8(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[8 + dvp] * dp[0]) + (vp[7 + dvp] * dp[1]) + (vp[6 + dvp] * dp[2]) + (vp[5 + dvp] * dp[3]) + (vp[4 + dvp] * dp[4]) + (vp[3 + dvp] * dp[5]) + (vp[2 + dvp] * dp[6]) + (vp[1 + dvp] * dp[7]) + (vp[0 + dvp] * dp[8]) + (vp[15 + dvp] * dp[9]) + (vp[14 + dvp] * dp[10]) + (vp[13 + dvp] * dp[11]) + (vp[12 + dvp] * dp[12]) + (vp[11 + dvp] * dp[13]) + (vp[10 + dvp] * dp[14]) + (vp[9 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples9(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[9 + dvp] * dp[0]) + (vp[8 + dvp] * dp[1]) + (vp[7 + dvp] * dp[2]) + (vp[6 + dvp] * dp[3]) + (vp[5 + dvp] * dp[4]) + (vp[4 + dvp] * dp[5]) + (vp[3 + dvp] * dp[6]) + (vp[2 + dvp] * dp[7]) + (vp[1 + dvp] * dp[8]) + (vp[0 + dvp] * dp[9]) + (vp[15 + dvp] * dp[10]) + (vp[14 + dvp] * dp[11]) + (vp[13 + dvp] * dp[12]) + (vp[12 + dvp] * dp[13]) + (vp[11 + dvp] * dp[14]) + (vp[10 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples10(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[10 + dvp] * dp[0]) + (vp[9 + dvp] * dp[1]) + (vp[8 + dvp] * dp[2]) + (vp[7 + dvp] * dp[3]) + (vp[6 + dvp] * dp[4]) + (vp[5 + dvp] * dp[5]) + (vp[4 + dvp] * dp[6]) + (vp[3 + dvp] * dp[7]) + (vp[2 + dvp] * dp[8]) + (vp[1 + dvp] * dp[9]) + (vp[0 + dvp] * dp[10]) + (vp[15 + dvp] * dp[11]) + (vp[14 + dvp] * dp[12]) + (vp[13 + dvp] * dp[13]) + (vp[12 + dvp] * dp[14]) + (vp[11 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples11(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[11 + dvp] * dp[0]) + (vp[10 + dvp] * dp[1]) + (vp[9 + dvp] * dp[2]) + (vp[8 + dvp] * dp[3]) + (vp[7 + dvp] * dp[4]) + (vp[6 + dvp] * dp[5]) + (vp[5 + dvp] * dp[6]) + (vp[4 + dvp] * dp[7]) + (vp[3 + dvp] * dp[8]) + (vp[2 + dvp] * dp[9]) + (vp[1 + dvp] * dp[10]) + (vp[0 + dvp] * dp[11]) + (vp[15 + dvp] * dp[12]) + (vp[14 + dvp] * dp[13]) + (vp[13 + dvp] * dp[14]) + (vp[12 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples12(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[12 + dvp] * dp[0]) + (vp[11 + dvp] * dp[1]) + (vp[10 + dvp] * dp[2]) + (vp[9 + dvp] * dp[3]) + (vp[8 + dvp] * dp[4]) + (vp[7 + dvp] * dp[5]) + (vp[6 + dvp] * dp[6]) + (vp[5 + dvp] * dp[7]) + (vp[4 + dvp] * dp[8]) + (vp[3 + dvp] * dp[9]) + (vp[2 + dvp] * dp[10]) + (vp[1 + dvp] * dp[11]) + (vp[0 + dvp] * dp[12]) + (vp[15 + dvp] * dp[13]) + (vp[14 + dvp] * dp[14]) + (vp[13 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples13(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[13 + dvp] * dp[0]) + (vp[12 + dvp] * dp[1]) + (vp[11 + dvp] * dp[2]) + (vp[10 + dvp] * dp[3]) + (vp[9 + dvp] * dp[4]) + (vp[8 + dvp] * dp[5]) + (vp[7 + dvp] * dp[6]) + (vp[6 + dvp] * dp[7]) + (vp[5 + dvp] * dp[8]) + (vp[4 + dvp] * dp[9]) + (vp[3 + dvp] * dp[10]) + (vp[2 + dvp] * dp[11]) + (vp[1 + dvp] * dp[12]) + (vp[0 + dvp] * dp[13]) + (vp[15 + dvp] * dp[14]) + (vp[14 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples14(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { final float[] dp = d16[i]; float pcm_sample; pcm_sample = (float)(((vp[14 + dvp] * dp[0]) + (vp[13 + dvp] * dp[1]) + (vp[12 + dvp] * dp[2]) + (vp[11 + dvp] * dp[3]) + (vp[10 + dvp] * dp[4]) + (vp[9 + dvp] * dp[5]) + (vp[8 + dvp] * dp[6]) + (vp[7 + dvp] * dp[7]) + (vp[6 + dvp] * dp[8]) + (vp[5 + dvp] * dp[9]) + (vp[4 + dvp] * dp[10]) + (vp[3 + dvp] * dp[11]) + (vp[2 + dvp] * dp[12]) + (vp[1 + dvp] * dp[13]) + (vp[0 + dvp] * dp[14]) + (vp[15 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples15(Obuffer buffer) { final float[] vp = actual_v; //int inc = v_inc; final float[] tmpOut = _tmpOut; int dvp =0; // fat chance of having this loop unroll for( int i=0; i<32; i++) { float pcm_sample; final float dp[] = d16[i]; pcm_sample = (float)(((vp[15 + dvp] * dp[0]) + (vp[14 + dvp] * dp[1]) + (vp[13 + dvp] * dp[2]) + (vp[12 + dvp] * dp[3]) + (vp[11 + dvp] * dp[4]) + (vp[10 + dvp] * dp[5]) + (vp[9 + dvp] * dp[6]) + (vp[8 + dvp] * dp[7]) + (vp[7 + dvp] * dp[8]) + (vp[6 + dvp] * dp[9]) + (vp[5 + dvp] * dp[10]) + (vp[4 + dvp] * dp[11]) + (vp[3 + dvp] * dp[12]) + (vp[2 + dvp] * dp[13]) + (vp[1 + dvp] * dp[14]) + (vp[0 + dvp] * dp[15]) ) * scalefactor); tmpOut[i] = pcm_sample; dvp += 16; } // for } private void compute_pcm_samples(Obuffer buffer) { switch (actual_write_pos) { case 0: compute_pcm_samples0(buffer); break; case 1: compute_pcm_samples1(buffer); break; case 2: compute_pcm_samples2(buffer); break; case 3: compute_pcm_samples3(buffer); break; case 4: compute_pcm_samples4(buffer); break; case 5: compute_pcm_samples5(buffer); break; case 6: compute_pcm_samples6(buffer); break; case 7: compute_pcm_samples7(buffer); break; case 8: compute_pcm_samples8(buffer); break; case 9: compute_pcm_samples9(buffer); break; case 10: compute_pcm_samples10(buffer); break; case 11: compute_pcm_samples11(buffer); break; case 12: compute_pcm_samples12(buffer); break; case 13: compute_pcm_samples13(buffer); break; case 14: compute_pcm_samples14(buffer); break; case 15: compute_pcm_samples15(buffer); break; } if (buffer!=null) { buffer.appendSamples(channel, _tmpOut); } /* // MDM: I was considering putting in quality control for // low-spec CPUs, but the performance gain (about 10-15%) // did not justify the considerable drop in audio quality. switch (inc) { case 16: buffer.appendSamples(channel, tmpOut); break; case 32: for (int i=0; i<16; i++) { buffer.append(channel, (short)tmpOut[i]); buffer.append(channel, (short)tmpOut[i]); } break; case 64: for (int i=0; i<8; i++) { buffer.append(channel, (short)tmpOut[i]); buffer.append(channel, (short)tmpOut[i]); buffer.append(channel, (short)tmpOut[i]); buffer.append(channel, (short)tmpOut[i]); } break; } */ } /** * Calculate 32 PCM samples and put the into the Obuffer-object. */ public void calculate_pcm_samples(Obuffer buffer) { compute_new_v(); compute_pcm_samples(buffer); actual_write_pos = (actual_write_pos + 1) & 0xf; actual_v = (actual_v == v1) ? v2 : v1; // initialize samples[]: //for (register float *floatp = samples + 32; floatp > samples; ) // *--floatp = 0.0f; // MDM: this may not be necessary. The Layer III decoder always // outputs 32 subband samples, but I haven't checked layer I & II. for (int p=0;p<32;p++) samples[p] = 0.0f; } private static final double MY_PI = 3.14159265358979323846; private static final float cos1_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 64.0))); private static final float cos3_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 64.0))); private static final float cos5_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 64.0))); private static final float cos7_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 64.0))); private static final float cos9_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 9.0 / 64.0))); private static final float cos11_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 11.0 / 64.0))); private static final float cos13_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 13.0 / 64.0))); private static final float cos15_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 15.0 / 64.0))); private static final float cos17_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 17.0 / 64.0))); private static final float cos19_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 19.0 / 64.0))); private static final float cos21_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 21.0 / 64.0))); private static final float cos23_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 23.0 / 64.0))); private static final float cos25_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 25.0 / 64.0))); private static final float cos27_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 27.0 / 64.0))); private static final float cos29_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 29.0 / 64.0))); private static final float cos31_64 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 31.0 / 64.0))); private static final float cos1_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 32.0))); private static final float cos3_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 32.0))); private static final float cos5_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 32.0))); private static final float cos7_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 32.0))); private static final float cos9_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 9.0 / 32.0))); private static final float cos11_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 11.0 / 32.0))); private static final float cos13_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 13.0 / 32.0))); private static final float cos15_32 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 15.0 / 32.0))); private static final float cos1_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 16.0))); private static final float cos3_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 16.0))); private static final float cos5_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 5.0 / 16.0))); private static final float cos7_16 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 7.0 / 16.0))); private static final float cos1_8 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 8.0))); private static final float cos3_8 =(float) (1.0 / (2.0 * Math.cos(MY_PI * 3.0 / 8.0))); private static final float cos1_4 =(float) (1.0 / (2.0 * Math.cos(MY_PI / 4.0))); // Note: These values are not in the same order // as in Annex 3-B.3 of the ISO/IEC DIS 11172-3 // private float d[] = {0.000000000, -4.000442505}; private static float d[] = null; /** * d[] split into subarrays of length 16. This provides for * more faster access by allowing a block of 16 to be addressed * with constant offset. **/ private static float d16[][] = null; /** * Loads the data for the d[] from the resource SFd.ser. * @return the loaded values for d[]. */ static private float[] load_d() { try { Class elemType = Float.TYPE; Object o = JavaLayerUtils.deserializeArrayResource("sfd.ser", elemType, 512); return (float[])o; } catch (IOException ex) { throw new ExceptionInInitializerError(ex); } } /** * Converts a 1D array into a number of smaller arrays. This is used * to achieve offset + constant indexing into an array. Each sub-array * represents a block of values of the original array. * @param array The array to split up into blocks. * @param blockSize The size of the blocks to split the array * into. This must be an exact divisor of * the length of the array, or some data * will be lost from the main array. * * @return An array of arrays in which each element in the returned * array will be of length blockSize. */ static private float[][] splitArray(final float[] array, final int blockSize) { int size = array.length / blockSize; float[][] split = new float[size][]; for (int i=0; i array.length) { len = array.length-offs; } if (len < 0) len = 0; float[] subarray = new float[len]; for (int i=0; i<:86420.,*(&$"   LK J H G F EDc#b"a!` oO/nN.ueUE5%xph`XPH@80( extensions/soundspi/javalayer/src/javazoom/jl/decoder/huffcodetab.java000066400000000000000000000721511335566474600266740ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 16/11/99 Renamed class, added javadoc, and changed table * name from String to 3 chars. mdm@techie.com * 02/15/99 Java Conversion by E.B, javalayer@javazoom.net * * 04/19/97 : Adapted from the ISO MPEG Audio Subgroup Software Simulation * Group's public c source for its MPEG audio decoder. Miscellaneous * changes by Jeff Tsay (ctsay@pasteur.eecs.berkeley.edu). *----------------------------------------------------------------------- * Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reserved * MPEG/audio coding/decoding software, work in progress * NOT for public distribution until verified and approved by the * MPEG/audio committee. For further information, please contact * Davis Pan, 508-493-2241, e-mail: pan@3d.enet.dec.com * * VERSION 4.1 * changes made since last update: * date programmers comment * 27.2.92 F.O.Witte (ITT Intermetall) * 8/24/93 M. Iwadare Changed for 1 pass decoding. * 7/14/94 J. Koller useless 'typedef' before huffcodetab removed *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.decoder; /** * Class to implements Huffman decoder. */ final class huffcodetab { private static final int MXOFF=250; private static final int HTN=34; private char tablename0 = ' '; /* string, containing table_description */ private char tablename1 = ' '; /* string, containing table_description */ private char tablename2 = ' '; /* string, containing table_description */ private int xlen; /* max. x-index+ */ private int ylen; /* max. y-index+ */ private int linbits; /* number of linbits */ private int linmax; /* max number to be stored in linbits */ private int ref; /* a positive value indicates a reference */ private int[] table=null; /* pointer to array[xlen][ylen] */ private int[] hlen=null; /* pointer to array[xlen][ylen] */ private int[][] val=null; /* decoder tree */ private int treelen; /* length of decoder tree */ private static int ValTab0[][] = { {0,0} // dummy }; private static int ValTab1[][] = { {2,1},{0,0},{2,1},{0,16},{2,1},{0,1},{0,17}, }; private static int ValTab2[][] = { {2,1},{0,0},{4,1},{2,1},{0,16},{0,1},{2,1},{0,17},{4,1},{2,1}, {0,32},{0,33},{2,1},{0,18},{2,1},{0,2},{0,34}, }; private static int ValTab3[][] = { {4,1},{2,1},{0,0},{0,1},{2,1},{0,17},{2,1},{0,16},{4,1},{2,1}, {0,32},{0,33},{2,1},{0,18},{2,1},{0,2},{0,34}, }; private static int ValTab4[][] = {{0,0}}; // dummy private static int ValTab5[][] = { {2,1},{0,0},{4,1},{2,1},{0,16},{0,1},{2,1},{0,17},{8,1},{4,1}, {2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{8,1},{4,1},{2,1},{0,34}, {0,48},{2,1},{0,3},{0,19},{2,1},{0,49},{2,1},{0,50},{2,1},{0,35}, {0,51}, }; private static int ValTab6[][] = { {6,1},{4,1},{2,1},{0,0},{0,16},{0,17},{6,1},{2,1},{0,1},{2,1}, {0,32},{0,33},{6,1},{2,1},{0,18},{2,1},{0,2},{0,34},{4,1},{2,1}, {0,49},{0,19},{4,1},{2,1},{0,48},{0,50},{2,1},{0,35},{2,1},{0,3}, {0,51}, }; private static int ValTab7[][] = { {2,1},{0,0},{4,1},{2,1},{0,16},{0,1},{8,1},{2,1},{0,17},{4,1}, {2,1},{0,32},{0,2},{0,33},{18,1},{6,1},{2,1},{0,18},{2,1},{0,34}, {0,48},{4,1},{2,1},{0,49},{0,19},{4,1},{2,1},{0,3},{0,50},{2,1}, {0,35},{0,4},{10,1},{4,1},{2,1},{0,64},{0,65},{2,1},{0,20},{2,1}, {0,66},{0,36},{12,1},{6,1},{4,1},{2,1},{0,51},{0,67},{0,80},{4,1}, {2,1},{0,52},{0,5},{0,81},{6,1},{2,1},{0,21},{2,1},{0,82},{0,37}, {4,1},{2,1},{0,68},{0,53},{4,1},{2,1},{0,83},{0,84},{2,1},{0,69}, {0,85}, }; private static int ValTab8[][] = { {6,1},{2,1},{0,0},{2,1},{0,16},{0,1},{2,1},{0,17},{4,1},{2,1}, {0,33},{0,18},{14,1},{4,1},{2,1},{0,32},{0,2},{2,1},{0,34},{4,1}, {2,1},{0,48},{0,3},{2,1},{0,49},{0,19},{14,1},{8,1},{4,1},{2,1}, {0,50},{0,35},{2,1},{0,64},{0,4},{2,1},{0,65},{2,1},{0,20},{0,66}, {12,1},{6,1},{2,1},{0,36},{2,1},{0,51},{0,80},{4,1},{2,1},{0,67}, {0,52},{0,81},{6,1},{2,1},{0,21},{2,1},{0,5},{0,82},{6,1},{2,1}, {0,37},{2,1},{0,68},{0,53},{2,1},{0,83},{2,1},{0,69},{2,1},{0,84}, {0,85}, }; private static int ValTab9[][] = { {8,1},{4,1},{2,1},{0,0},{0,16},{2,1},{0,1},{0,17},{10,1},{4,1}, {2,1},{0,32},{0,33},{2,1},{0,18},{2,1},{0,2},{0,34},{12,1},{6,1}, {4,1},{2,1},{0,48},{0,3},{0,49},{2,1},{0,19},{2,1},{0,50},{0,35}, {12,1},{4,1},{2,1},{0,65},{0,20},{4,1},{2,1},{0,64},{0,51},{2,1}, {0,66},{0,36},{10,1},{6,1},{4,1},{2,1},{0,4},{0,80},{0,67},{2,1}, {0,52},{0,81},{8,1},{4,1},{2,1},{0,21},{0,82},{2,1},{0,37},{0,68}, {6,1},{4,1},{2,1},{0,5},{0,84},{0,83},{2,1},{0,53},{2,1},{0,69}, {0,85}, }; private static int ValTab10[][] = { {2,1},{0,0},{4,1},{2,1},{0,16},{0,1},{10,1},{2,1},{0,17},{4,1}, {2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{28,1},{8,1},{4,1},{2,1}, {0,34},{0,48},{2,1},{0,49},{0,19},{8,1},{4,1},{2,1},{0,3},{0,50}, {2,1},{0,35},{0,64},{4,1},{2,1},{0,65},{0,20},{4,1},{2,1},{0,4}, {0,51},{2,1},{0,66},{0,36},{28,1},{10,1},{6,1},{4,1},{2,1},{0,80}, {0,5},{0,96},{2,1},{0,97},{0,22},{12,1},{6,1},{4,1},{2,1},{0,67}, {0,52},{0,81},{2,1},{0,21},{2,1},{0,82},{0,37},{4,1},{2,1},{0,38}, {0,54},{0,113},{20,1},{8,1},{2,1},{0,23},{4,1},{2,1},{0,68},{0,83}, {0,6},{6,1},{4,1},{2,1},{0,53},{0,69},{0,98},{2,1},{0,112},{2,1}, {0,7},{0,100},{14,1},{4,1},{2,1},{0,114},{0,39},{6,1},{2,1},{0,99}, {2,1},{0,84},{0,85},{2,1},{0,70},{0,115},{8,1},{4,1},{2,1},{0,55}, {0,101},{2,1},{0,86},{0,116},{6,1},{2,1},{0,71},{2,1},{0,102},{0,117}, {4,1},{2,1},{0,87},{0,118},{2,1},{0,103},{0,119}, }; private static int ValTab11[][] = { {6,1},{2,1},{0,0},{2,1},{0,16},{0,1},{8,1},{2,1},{0,17},{4,1}, {2,1},{0,32},{0,2},{0,18},{24,1},{8,1},{2,1},{0,33},{2,1},{0,34}, {2,1},{0,48},{0,3},{4,1},{2,1},{0,49},{0,19},{4,1},{2,1},{0,50}, {0,35},{4,1},{2,1},{0,64},{0,4},{2,1},{0,65},{0,20},{30,1},{16,1}, {10,1},{4,1},{2,1},{0,66},{0,36},{4,1},{2,1},{0,51},{0,67},{0,80}, {4,1},{2,1},{0,52},{0,81},{0,97},{6,1},{2,1},{0,22},{2,1},{0,6}, {0,38},{2,1},{0,98},{2,1},{0,21},{2,1},{0,5},{0,82},{16,1},{10,1}, {6,1},{4,1},{2,1},{0,37},{0,68},{0,96},{2,1},{0,99},{0,54},{4,1}, {2,1},{0,112},{0,23},{0,113},{16,1},{6,1},{4,1},{2,1},{0,7},{0,100}, {0,114},{2,1},{0,39},{4,1},{2,1},{0,83},{0,53},{2,1},{0,84},{0,69}, {10,1},{4,1},{2,1},{0,70},{0,115},{2,1},{0,55},{2,1},{0,101},{0,86}, {10,1},{6,1},{4,1},{2,1},{0,85},{0,87},{0,116},{2,1},{0,71},{0,102}, {4,1},{2,1},{0,117},{0,118},{2,1},{0,103},{0,119}, }; private static int ValTab12[][] = { {12,1},{4,1},{2,1},{0,16},{0,1},{2,1},{0,17},{2,1},{0,0},{2,1}, {0,32},{0,2},{16,1},{4,1},{2,1},{0,33},{0,18},{4,1},{2,1},{0,34}, {0,49},{2,1},{0,19},{2,1},{0,48},{2,1},{0,3},{0,64},{26,1},{8,1}, {4,1},{2,1},{0,50},{0,35},{2,1},{0,65},{0,51},{10,1},{4,1},{2,1}, {0,20},{0,66},{2,1},{0,36},{2,1},{0,4},{0,80},{4,1},{2,1},{0,67}, {0,52},{2,1},{0,81},{0,21},{28,1},{14,1},{8,1},{4,1},{2,1},{0,82}, {0,37},{2,1},{0,83},{0,53},{4,1},{2,1},{0,96},{0,22},{0,97},{4,1}, {2,1},{0,98},{0,38},{6,1},{4,1},{2,1},{0,5},{0,6},{0,68},{2,1}, {0,84},{0,69},{18,1},{10,1},{4,1},{2,1},{0,99},{0,54},{4,1},{2,1}, {0,112},{0,7},{0,113},{4,1},{2,1},{0,23},{0,100},{2,1},{0,70},{0,114}, {10,1},{6,1},{2,1},{0,39},{2,1},{0,85},{0,115},{2,1},{0,55},{0,86}, {8,1},{4,1},{2,1},{0,101},{0,116},{2,1},{0,71},{0,102},{4,1},{2,1}, {0,117},{0,87},{2,1},{0,118},{2,1},{0,103},{0,119}, }; private static int ValTab13[][] = { {2,1},{0,0},{6,1},{2,1},{0,16},{2,1},{0,1},{0,17},{28,1},{8,1}, {4,1},{2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{8,1},{4,1},{2,1}, {0,34},{0,48},{2,1},{0,3},{0,49},{6,1},{2,1},{0,19},{2,1},{0,50}, {0,35},{4,1},{2,1},{0,64},{0,4},{0,65},{70,1},{28,1},{14,1},{6,1}, {2,1},{0,20},{2,1},{0,51},{0,66},{4,1},{2,1},{0,36},{0,80},{2,1}, {0,67},{0,52},{4,1},{2,1},{0,81},{0,21},{4,1},{2,1},{0,5},{0,82}, {2,1},{0,37},{2,1},{0,68},{0,83},{14,1},{8,1},{4,1},{2,1},{0,96}, {0,6},{2,1},{0,97},{0,22},{4,1},{2,1},{0,128},{0,8},{0,129},{16,1}, {8,1},{4,1},{2,1},{0,53},{0,98},{2,1},{0,38},{0,84},{4,1},{2,1}, {0,69},{0,99},{2,1},{0,54},{0,112},{6,1},{4,1},{2,1},{0,7},{0,85}, {0,113},{2,1},{0,23},{2,1},{0,39},{0,55},{72,1},{24,1},{12,1},{4,1}, {2,1},{0,24},{0,130},{2,1},{0,40},{4,1},{2,1},{0,100},{0,70},{0,114}, {8,1},{4,1},{2,1},{0,132},{0,72},{2,1},{0,144},{0,9},{2,1},{0,145}, {0,25},{24,1},{14,1},{8,1},{4,1},{2,1},{0,115},{0,101},{2,1},{0,86}, {0,116},{4,1},{2,1},{0,71},{0,102},{0,131},{6,1},{2,1},{0,56},{2,1}, {0,117},{0,87},{2,1},{0,146},{0,41},{14,1},{8,1},{4,1},{2,1},{0,103}, {0,133},{2,1},{0,88},{0,57},{2,1},{0,147},{2,1},{0,73},{0,134},{6,1}, {2,1},{0,160},{2,1},{0,104},{0,10},{2,1},{0,161},{0,26},{68,1},{24,1}, {12,1},{4,1},{2,1},{0,162},{0,42},{4,1},{2,1},{0,149},{0,89},{2,1}, {0,163},{0,58},{8,1},{4,1},{2,1},{0,74},{0,150},{2,1},{0,176},{0,11}, {2,1},{0,177},{0,27},{20,1},{8,1},{2,1},{0,178},{4,1},{2,1},{0,118}, {0,119},{0,148},{6,1},{4,1},{2,1},{0,135},{0,120},{0,164},{4,1},{2,1}, {0,105},{0,165},{0,43},{12,1},{6,1},{4,1},{2,1},{0,90},{0,136},{0,179}, {2,1},{0,59},{2,1},{0,121},{0,166},{6,1},{4,1},{2,1},{0,106},{0,180}, {0,192},{4,1},{2,1},{0,12},{0,152},{0,193},{60,1},{22,1},{10,1},{6,1}, {2,1},{0,28},{2,1},{0,137},{0,181},{2,1},{0,91},{0,194},{4,1},{2,1}, {0,44},{0,60},{4,1},{2,1},{0,182},{0,107},{2,1},{0,196},{0,76},{16,1}, {8,1},{4,1},{2,1},{0,168},{0,138},{2,1},{0,208},{0,13},{2,1},{0,209}, {2,1},{0,75},{2,1},{0,151},{0,167},{12,1},{6,1},{2,1},{0,195},{2,1}, {0,122},{0,153},{4,1},{2,1},{0,197},{0,92},{0,183},{4,1},{2,1},{0,29}, {0,210},{2,1},{0,45},{2,1},{0,123},{0,211},{52,1},{28,1},{12,1},{4,1}, {2,1},{0,61},{0,198},{4,1},{2,1},{0,108},{0,169},{2,1},{0,154},{0,212}, {8,1},{4,1},{2,1},{0,184},{0,139},{2,1},{0,77},{0,199},{4,1},{2,1}, {0,124},{0,213},{2,1},{0,93},{0,224},{10,1},{4,1},{2,1},{0,225},{0,30}, {4,1},{2,1},{0,14},{0,46},{0,226},{8,1},{4,1},{2,1},{0,227},{0,109}, {2,1},{0,140},{0,228},{4,1},{2,1},{0,229},{0,186},{0,240},{38,1},{16,1}, {4,1},{2,1},{0,241},{0,31},{6,1},{4,1},{2,1},{0,170},{0,155},{0,185}, {2,1},{0,62},{2,1},{0,214},{0,200},{12,1},{6,1},{2,1},{0,78},{2,1}, {0,215},{0,125},{2,1},{0,171},{2,1},{0,94},{0,201},{6,1},{2,1},{0,15}, {2,1},{0,156},{0,110},{2,1},{0,242},{0,47},{32,1},{16,1},{6,1},{4,1}, {2,1},{0,216},{0,141},{0,63},{6,1},{2,1},{0,243},{2,1},{0,230},{0,202}, {2,1},{0,244},{0,79},{8,1},{4,1},{2,1},{0,187},{0,172},{2,1},{0,231}, {0,245},{4,1},{2,1},{0,217},{0,157},{2,1},{0,95},{0,232},{30,1},{12,1}, {6,1},{2,1},{0,111},{2,1},{0,246},{0,203},{4,1},{2,1},{0,188},{0,173}, {0,218},{8,1},{2,1},{0,247},{4,1},{2,1},{0,126},{0,127},{0,142},{6,1}, {4,1},{2,1},{0,158},{0,174},{0,204},{2,1},{0,248},{0,143},{18,1},{8,1}, {4,1},{2,1},{0,219},{0,189},{2,1},{0,234},{0,249},{4,1},{2,1},{0,159}, {0,235},{2,1},{0,190},{2,1},{0,205},{0,250},{14,1},{4,1},{2,1},{0,221}, {0,236},{6,1},{4,1},{2,1},{0,233},{0,175},{0,220},{2,1},{0,206},{0,251}, {8,1},{4,1},{2,1},{0,191},{0,222},{2,1},{0,207},{0,238},{4,1},{2,1}, {0,223},{0,239},{2,1},{0,255},{2,1},{0,237},{2,1},{0,253},{2,1},{0,252}, {0,254}, }; private static int ValTab14[][] = { {0,0} // dummy }; private static int ValTab15[][] = { {16,1},{6,1},{2,1},{0,0},{2,1},{0,16},{0,1},{2,1},{0,17},{4,1}, {2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{50,1},{16,1},{6,1},{2,1}, {0,34},{2,1},{0,48},{0,49},{6,1},{2,1},{0,19},{2,1},{0,3},{0,64}, {2,1},{0,50},{0,35},{14,1},{6,1},{4,1},{2,1},{0,4},{0,20},{0,65}, {4,1},{2,1},{0,51},{0,66},{2,1},{0,36},{0,67},{10,1},{6,1},{2,1}, {0,52},{2,1},{0,80},{0,5},{2,1},{0,81},{0,21},{4,1},{2,1},{0,82}, {0,37},{4,1},{2,1},{0,68},{0,83},{0,97},{90,1},{36,1},{18,1},{10,1}, {6,1},{2,1},{0,53},{2,1},{0,96},{0,6},{2,1},{0,22},{0,98},{4,1}, {2,1},{0,38},{0,84},{2,1},{0,69},{0,99},{10,1},{6,1},{2,1},{0,54}, {2,1},{0,112},{0,7},{2,1},{0,113},{0,85},{4,1},{2,1},{0,23},{0,100}, {2,1},{0,114},{0,39},{24,1},{16,1},{8,1},{4,1},{2,1},{0,70},{0,115}, {2,1},{0,55},{0,101},{4,1},{2,1},{0,86},{0,128},{2,1},{0,8},{0,116}, {4,1},{2,1},{0,129},{0,24},{2,1},{0,130},{0,40},{16,1},{8,1},{4,1}, {2,1},{0,71},{0,102},{2,1},{0,131},{0,56},{4,1},{2,1},{0,117},{0,87}, {2,1},{0,132},{0,72},{6,1},{4,1},{2,1},{0,144},{0,25},{0,145},{4,1}, {2,1},{0,146},{0,118},{2,1},{0,103},{0,41},{92,1},{36,1},{18,1},{10,1}, {4,1},{2,1},{0,133},{0,88},{4,1},{2,1},{0,9},{0,119},{0,147},{4,1}, {2,1},{0,57},{0,148},{2,1},{0,73},{0,134},{10,1},{6,1},{2,1},{0,104}, {2,1},{0,160},{0,10},{2,1},{0,161},{0,26},{4,1},{2,1},{0,162},{0,42}, {2,1},{0,149},{0,89},{26,1},{14,1},{6,1},{2,1},{0,163},{2,1},{0,58}, {0,135},{4,1},{2,1},{0,120},{0,164},{2,1},{0,74},{0,150},{6,1},{4,1}, {2,1},{0,105},{0,176},{0,177},{4,1},{2,1},{0,27},{0,165},{0,178},{14,1}, {8,1},{4,1},{2,1},{0,90},{0,43},{2,1},{0,136},{0,151},{2,1},{0,179}, {2,1},{0,121},{0,59},{8,1},{4,1},{2,1},{0,106},{0,180},{2,1},{0,75}, {0,193},{4,1},{2,1},{0,152},{0,137},{2,1},{0,28},{0,181},{80,1},{34,1}, {16,1},{6,1},{4,1},{2,1},{0,91},{0,44},{0,194},{6,1},{4,1},{2,1}, {0,11},{0,192},{0,166},{2,1},{0,167},{0,122},{10,1},{4,1},{2,1},{0,195}, {0,60},{4,1},{2,1},{0,12},{0,153},{0,182},{4,1},{2,1},{0,107},{0,196}, {2,1},{0,76},{0,168},{20,1},{10,1},{4,1},{2,1},{0,138},{0,197},{4,1}, {2,1},{0,208},{0,92},{0,209},{4,1},{2,1},{0,183},{0,123},{2,1},{0,29}, {2,1},{0,13},{0,45},{12,1},{4,1},{2,1},{0,210},{0,211},{4,1},{2,1}, {0,61},{0,198},{2,1},{0,108},{0,169},{6,1},{4,1},{2,1},{0,154},{0,184}, {0,212},{4,1},{2,1},{0,139},{0,77},{2,1},{0,199},{0,124},{68,1},{34,1}, {18,1},{10,1},{4,1},{2,1},{0,213},{0,93},{4,1},{2,1},{0,224},{0,14}, {0,225},{4,1},{2,1},{0,30},{0,226},{2,1},{0,170},{0,46},{8,1},{4,1}, {2,1},{0,185},{0,155},{2,1},{0,227},{0,214},{4,1},{2,1},{0,109},{0,62}, {2,1},{0,200},{0,140},{16,1},{8,1},{4,1},{2,1},{0,228},{0,78},{2,1}, {0,215},{0,125},{4,1},{2,1},{0,229},{0,186},{2,1},{0,171},{0,94},{8,1}, {4,1},{2,1},{0,201},{0,156},{2,1},{0,241},{0,31},{6,1},{4,1},{2,1}, {0,240},{0,110},{0,242},{2,1},{0,47},{0,230},{38,1},{18,1},{8,1},{4,1}, {2,1},{0,216},{0,243},{2,1},{0,63},{0,244},{6,1},{2,1},{0,79},{2,1}, {0,141},{0,217},{2,1},{0,187},{0,202},{8,1},{4,1},{2,1},{0,172},{0,231}, {2,1},{0,126},{0,245},{8,1},{4,1},{2,1},{0,157},{0,95},{2,1},{0,232}, {0,142},{2,1},{0,246},{0,203},{34,1},{18,1},{10,1},{6,1},{4,1},{2,1}, {0,15},{0,174},{0,111},{2,1},{0,188},{0,218},{4,1},{2,1},{0,173},{0,247}, {2,1},{0,127},{0,233},{8,1},{4,1},{2,1},{0,158},{0,204},{2,1},{0,248}, {0,143},{4,1},{2,1},{0,219},{0,189},{2,1},{0,234},{0,249},{16,1},{8,1}, {4,1},{2,1},{0,159},{0,220},{2,1},{0,205},{0,235},{4,1},{2,1},{0,190}, {0,250},{2,1},{0,175},{0,221},{14,1},{6,1},{4,1},{2,1},{0,236},{0,206}, {0,251},{4,1},{2,1},{0,191},{0,237},{2,1},{0,222},{0,252},{6,1},{4,1}, {2,1},{0,207},{0,253},{0,238},{4,1},{2,1},{0,223},{0,254},{2,1},{0,239}, {0,255}, }; private static int ValTab16[][] = { {2,1},{0,0},{6,1},{2,1},{0,16},{2,1},{0,1},{0,17},{42,1},{8,1}, {4,1},{2,1},{0,32},{0,2},{2,1},{0,33},{0,18},{10,1},{6,1},{2,1}, {0,34},{2,1},{0,48},{0,3},{2,1},{0,49},{0,19},{10,1},{4,1},{2,1}, {0,50},{0,35},{4,1},{2,1},{0,64},{0,4},{0,65},{6,1},{2,1},{0,20}, {2,1},{0,51},{0,66},{4,1},{2,1},{0,36},{0,80},{2,1},{0,67},{0,52}, {138,1},{40,1},{16,1},{6,1},{4,1},{2,1},{0,5},{0,21},{0,81},{4,1}, {2,1},{0,82},{0,37},{4,1},{2,1},{0,68},{0,53},{0,83},{10,1},{6,1}, {4,1},{2,1},{0,96},{0,6},{0,97},{2,1},{0,22},{0,98},{8,1},{4,1}, {2,1},{0,38},{0,84},{2,1},{0,69},{0,99},{4,1},{2,1},{0,54},{0,112}, {0,113},{40,1},{18,1},{8,1},{2,1},{0,23},{2,1},{0,7},{2,1},{0,85}, {0,100},{4,1},{2,1},{0,114},{0,39},{4,1},{2,1},{0,70},{0,101},{0,115}, {10,1},{6,1},{2,1},{0,55},{2,1},{0,86},{0,8},{2,1},{0,128},{0,129}, {6,1},{2,1},{0,24},{2,1},{0,116},{0,71},{2,1},{0,130},{2,1},{0,40}, {0,102},{24,1},{14,1},{8,1},{4,1},{2,1},{0,131},{0,56},{2,1},{0,117}, {0,132},{4,1},{2,1},{0,72},{0,144},{0,145},{6,1},{2,1},{0,25},{2,1}, {0,9},{0,118},{2,1},{0,146},{0,41},{14,1},{8,1},{4,1},{2,1},{0,133}, {0,88},{2,1},{0,147},{0,57},{4,1},{2,1},{0,160},{0,10},{0,26},{8,1}, {2,1},{0,162},{2,1},{0,103},{2,1},{0,87},{0,73},{6,1},{2,1},{0,148}, {2,1},{0,119},{0,134},{2,1},{0,161},{2,1},{0,104},{0,149},{220,1},{126,1}, {50,1},{26,1},{12,1},{6,1},{2,1},{0,42},{2,1},{0,89},{0,58},{2,1}, {0,163},{2,1},{0,135},{0,120},{8,1},{4,1},{2,1},{0,164},{0,74},{2,1}, {0,150},{0,105},{4,1},{2,1},{0,176},{0,11},{0,177},{10,1},{4,1},{2,1}, {0,27},{0,178},{2,1},{0,43},{2,1},{0,165},{0,90},{6,1},{2,1},{0,179}, {2,1},{0,166},{0,106},{4,1},{2,1},{0,180},{0,75},{2,1},{0,12},{0,193}, {30,1},{14,1},{6,1},{4,1},{2,1},{0,181},{0,194},{0,44},{4,1},{2,1}, {0,167},{0,195},{2,1},{0,107},{0,196},{8,1},{2,1},{0,29},{4,1},{2,1}, {0,136},{0,151},{0,59},{4,1},{2,1},{0,209},{0,210},{2,1},{0,45},{0,211}, {18,1},{6,1},{4,1},{2,1},{0,30},{0,46},{0,226},{6,1},{4,1},{2,1}, {0,121},{0,152},{0,192},{2,1},{0,28},{2,1},{0,137},{0,91},{14,1},{6,1}, {2,1},{0,60},{2,1},{0,122},{0,182},{4,1},{2,1},{0,76},{0,153},{2,1}, {0,168},{0,138},{6,1},{2,1},{0,13},{2,1},{0,197},{0,92},{4,1},{2,1}, {0,61},{0,198},{2,1},{0,108},{0,154},{88,1},{86,1},{36,1},{16,1},{8,1}, {4,1},{2,1},{0,139},{0,77},{2,1},{0,199},{0,124},{4,1},{2,1},{0,213}, {0,93},{2,1},{0,224},{0,14},{8,1},{2,1},{0,227},{4,1},{2,1},{0,208}, {0,183},{0,123},{6,1},{4,1},{2,1},{0,169},{0,184},{0,212},{2,1},{0,225}, {2,1},{0,170},{0,185},{24,1},{10,1},{6,1},{4,1},{2,1},{0,155},{0,214}, {0,109},{2,1},{0,62},{0,200},{6,1},{4,1},{2,1},{0,140},{0,228},{0,78}, {4,1},{2,1},{0,215},{0,229},{2,1},{0,186},{0,171},{12,1},{4,1},{2,1}, {0,156},{0,230},{4,1},{2,1},{0,110},{0,216},{2,1},{0,141},{0,187},{8,1}, {4,1},{2,1},{0,231},{0,157},{2,1},{0,232},{0,142},{4,1},{2,1},{0,203}, {0,188},{0,158},{0,241},{2,1},{0,31},{2,1},{0,15},{0,47},{66,1},{56,1}, {2,1},{0,242},{52,1},{50,1},{20,1},{8,1},{2,1},{0,189},{2,1},{0,94}, {2,1},{0,125},{0,201},{6,1},{2,1},{0,202},{2,1},{0,172},{0,126},{4,1}, {2,1},{0,218},{0,173},{0,204},{10,1},{6,1},{2,1},{0,174},{2,1},{0,219}, {0,220},{2,1},{0,205},{0,190},{6,1},{4,1},{2,1},{0,235},{0,237},{0,238}, {6,1},{4,1},{2,1},{0,217},{0,234},{0,233},{2,1},{0,222},{4,1},{2,1}, {0,221},{0,236},{0,206},{0,63},{0,240},{4,1},{2,1},{0,243},{0,244},{2,1}, {0,79},{2,1},{0,245},{0,95},{10,1},{2,1},{0,255},{4,1},{2,1},{0,246}, {0,111},{2,1},{0,247},{0,127},{12,1},{6,1},{2,1},{0,143},{2,1},{0,248}, {0,249},{4,1},{2,1},{0,159},{0,250},{0,175},{8,1},{4,1},{2,1},{0,251}, {0,191},{2,1},{0,252},{0,207},{4,1},{2,1},{0,253},{0,223},{2,1},{0,254}, {0,239}, }; private static int ValTab24[][] = { {60,1},{8,1},{4,1},{2,1},{0,0},{0,16},{2,1},{0,1},{0,17},{14,1}, {6,1},{4,1},{2,1},{0,32},{0,2},{0,33},{2,1},{0,18},{2,1},{0,34}, {2,1},{0,48},{0,3},{14,1},{4,1},{2,1},{0,49},{0,19},{4,1},{2,1}, {0,50},{0,35},{4,1},{2,1},{0,64},{0,4},{0,65},{8,1},{4,1},{2,1}, {0,20},{0,51},{2,1},{0,66},{0,36},{6,1},{4,1},{2,1},{0,67},{0,52}, {0,81},{6,1},{4,1},{2,1},{0,80},{0,5},{0,21},{2,1},{0,82},{0,37}, {250,1},{98,1},{34,1},{18,1},{10,1},{4,1},{2,1},{0,68},{0,83},{2,1}, {0,53},{2,1},{0,96},{0,6},{4,1},{2,1},{0,97},{0,22},{2,1},{0,98}, {0,38},{8,1},{4,1},{2,1},{0,84},{0,69},{2,1},{0,99},{0,54},{4,1}, {2,1},{0,113},{0,85},{2,1},{0,100},{0,70},{32,1},{14,1},{6,1},{2,1}, {0,114},{2,1},{0,39},{0,55},{2,1},{0,115},{4,1},{2,1},{0,112},{0,7}, {0,23},{10,1},{4,1},{2,1},{0,101},{0,86},{4,1},{2,1},{0,128},{0,8}, {0,129},{4,1},{2,1},{0,116},{0,71},{2,1},{0,24},{0,130},{16,1},{8,1}, {4,1},{2,1},{0,40},{0,102},{2,1},{0,131},{0,56},{4,1},{2,1},{0,117}, {0,87},{2,1},{0,132},{0,72},{8,1},{4,1},{2,1},{0,145},{0,25},{2,1}, {0,146},{0,118},{4,1},{2,1},{0,103},{0,41},{2,1},{0,133},{0,88},{92,1}, {34,1},{16,1},{8,1},{4,1},{2,1},{0,147},{0,57},{2,1},{0,148},{0,73}, {4,1},{2,1},{0,119},{0,134},{2,1},{0,104},{0,161},{8,1},{4,1},{2,1}, {0,162},{0,42},{2,1},{0,149},{0,89},{4,1},{2,1},{0,163},{0,58},{2,1}, {0,135},{2,1},{0,120},{0,74},{22,1},{12,1},{4,1},{2,1},{0,164},{0,150}, {4,1},{2,1},{0,105},{0,177},{2,1},{0,27},{0,165},{6,1},{2,1},{0,178}, {2,1},{0,90},{0,43},{2,1},{0,136},{0,179},{16,1},{10,1},{6,1},{2,1}, {0,144},{2,1},{0,9},{0,160},{2,1},{0,151},{0,121},{4,1},{2,1},{0,166}, {0,106},{0,180},{12,1},{6,1},{2,1},{0,26},{2,1},{0,10},{0,176},{2,1}, {0,59},{2,1},{0,11},{0,192},{4,1},{2,1},{0,75},{0,193},{2,1},{0,152}, {0,137},{67,1},{34,1},{16,1},{8,1},{4,1},{2,1},{0,28},{0,181},{2,1}, {0,91},{0,194},{4,1},{2,1},{0,44},{0,167},{2,1},{0,122},{0,195},{10,1}, {6,1},{2,1},{0,60},{2,1},{0,12},{0,208},{2,1},{0,182},{0,107},{4,1}, {2,1},{0,196},{0,76},{2,1},{0,153},{0,168},{16,1},{8,1},{4,1},{2,1}, {0,138},{0,197},{2,1},{0,92},{0,209},{4,1},{2,1},{0,183},{0,123},{2,1}, {0,29},{0,210},{9,1},{4,1},{2,1},{0,45},{0,211},{2,1},{0,61},{0,198}, {85,250},{4,1},{2,1},{0,108},{0,169},{2,1},{0,154},{0,212},{32,1},{16,1}, {8,1},{4,1},{2,1},{0,184},{0,139},{2,1},{0,77},{0,199},{4,1},{2,1}, {0,124},{0,213},{2,1},{0,93},{0,225},{8,1},{4,1},{2,1},{0,30},{0,226}, {2,1},{0,170},{0,185},{4,1},{2,1},{0,155},{0,227},{2,1},{0,214},{0,109}, {20,1},{10,1},{6,1},{2,1},{0,62},{2,1},{0,46},{0,78},{2,1},{0,200}, {0,140},{4,1},{2,1},{0,228},{0,215},{4,1},{2,1},{0,125},{0,171},{0,229}, {10,1},{4,1},{2,1},{0,186},{0,94},{2,1},{0,201},{2,1},{0,156},{0,110}, {8,1},{2,1},{0,230},{2,1},{0,13},{2,1},{0,224},{0,14},{4,1},{2,1}, {0,216},{0,141},{2,1},{0,187},{0,202},{74,1},{2,1},{0,255},{64,1},{58,1}, {32,1},{16,1},{8,1},{4,1},{2,1},{0,172},{0,231},{2,1},{0,126},{0,217}, {4,1},{2,1},{0,157},{0,232},{2,1},{0,142},{0,203},{8,1},{4,1},{2,1}, {0,188},{0,218},{2,1},{0,173},{0,233},{4,1},{2,1},{0,158},{0,204},{2,1}, {0,219},{0,189},{16,1},{8,1},{4,1},{2,1},{0,234},{0,174},{2,1},{0,220}, {0,205},{4,1},{2,1},{0,235},{0,190},{2,1},{0,221},{0,236},{8,1},{4,1}, {2,1},{0,206},{0,237},{2,1},{0,222},{0,238},{0,15},{4,1},{2,1},{0,240}, {0,31},{0,241},{4,1},{2,1},{0,242},{0,47},{2,1},{0,243},{0,63},{18,1}, {8,1},{4,1},{2,1},{0,244},{0,79},{2,1},{0,245},{0,95},{4,1},{2,1}, {0,246},{0,111},{2,1},{0,247},{2,1},{0,127},{0,143},{10,1},{4,1},{2,1}, {0,248},{0,249},{4,1},{2,1},{0,159},{0,175},{0,250},{8,1},{4,1},{2,1}, {0,251},{0,191},{2,1},{0,252},{0,207},{4,1},{2,1},{0,253},{0,223},{2,1}, {0,254},{0,239}, }; private static int ValTab32[][] = { {2,1},{0,0},{8,1},{4,1},{2,1},{0,8},{0,4},{2,1},{0,1},{0,2}, {8,1},{4,1},{2,1},{0,12},{0,10},{2,1},{0,3},{0,6},{6,1},{2,1}, {0,9},{2,1},{0,5},{0,7},{4,1},{2,1},{0,14},{0,13},{2,1},{0,15}, {0,11}, }; private static int ValTab33[][] = { {16,1},{8,1},{4,1},{2,1},{0,0},{0,1},{2,1},{0,2},{0,3},{4,1}, {2,1},{0,4},{0,5},{2,1},{0,6},{0,7},{8,1},{4,1},{2,1},{0,8}, {0,9},{2,1},{0,10},{0,11},{4,1},{2,1},{0,12},{0,13},{2,1},{0,14}, {0,15}, }; public static huffcodetab[] ht = null; /* Simulate extern struct */ private static int[] bitbuf = new int[32]; /** * Big Constructor : Computes all Huffman Tables. */ private huffcodetab(String S,int XLEN, int YLEN, int LINBITS, int LINMAX, int REF, int[] TABLE, int[] HLEN, int[][] VAL, int TREELEN) { tablename0 = S.charAt(0); tablename1 = S.charAt(1); tablename2 = S.charAt(2); xlen = XLEN; ylen = YLEN; linbits = LINBITS; linmax = LINMAX; ref = REF; table = TABLE; hlen = HLEN; val = VAL; treelen = TREELEN; } /** * Do the huffman-decoding. * note! for counta,countb -the 4 bit value is returned in y, * discard x. */ public static int huffman_decoder(huffcodetab h, int[] x, int[] y, int[] v, int[] w, BitReserve br) { // array of all huffcodtable headers // 0..31 Huffman code table 0..31 // 32,33 count1-tables int dmask = 1 << ((4 * 8) - 1); int hs = 4 * 8; int level; int point = 0; int error = 1; level = dmask; if (h.val == null) return 2; /* table 0 needs no bits */ if ( h.treelen == 0) { x[0] = y[0] = 0; return 0; } /* Lookup in Huffman table. */ /*int bitsAvailable = 0; int bitIndex = 0; int bits[] = bitbuf;*/ do { if (h.val[point][0]==0) { /*end of tree*/ x[0] = h.val[point][1] >>> 4; y[0] = h.val[point][1] & 0xf; error = 0; break; } // hget1bit() is called thousands of times, and so needs to be // ultra fast. /* if (bitIndex==bitsAvailable) { bitsAvailable = br.readBits(bits, 32); bitIndex = 0; } */ //if (bits[bitIndex++]!=0) if (br.hget1bit()!=0) { while (h.val[point][1] >= MXOFF) point += h.val[point][1]; point += h.val[point][1]; } else { while (h.val[point][0] >= MXOFF) point += h.val[point][0]; point += h.val[point][0]; } level >>>= 1; // MDM: ht[0] is always 0; } while ((level !=0 ) || (point < 0 /*ht[0].treelen*/) ); // put back any bits not consumed /* int unread = (bitsAvailable-bitIndex); if (unread>0) br.rewindNbits(unread); */ /* Process sign encodings for quadruples tables. */ // System.out.println(h.tablename); if (h.tablename0 == '3' && (h.tablename1 == '2' || h.tablename1 == '3')) { v[0] = (y[0]>>3) & 1; w[0] = (y[0]>>2) & 1; x[0] = (y[0]>>1) & 1; y[0] = y[0] & 1; /* v, w, x and y are reversed in the bitstream. switch them around to make test bistream work. */ if (v[0]!=0) if (br.hget1bit() != 0) v[0] = -v[0]; if (w[0]!=0) if (br.hget1bit() != 0) w[0] = -w[0]; if (x[0]!=0) if (br.hget1bit() != 0) x[0] = -x[0]; if (y[0]!=0) if (br.hget1bit() != 0) y[0] = -y[0]; } else { // Process sign and escape encodings for dual tables. // x and y are reversed in the test bitstream. // Reverse x and y here to make test bitstream work. if (h.linbits != 0) if ((h.xlen-1) == x[0]) x[0] += br.hgetbits(h.linbits); if (x[0] != 0) if (br.hget1bit() != 0) x[0] = -x[0]; if (h.linbits != 0) if ((h.ylen-1) == y[0]) y[0] += br.hgetbits(h.linbits); if (y[0] != 0) if (br.hget1bit() != 0) y[0] = -y[0]; } return error; } public static void inithuff() { if (ht!=null) return; ht = new huffcodetab[HTN]; ht[0] = new huffcodetab("0 ",0,0,0,0,-1,null,null,ValTab0,0); ht[1] = new huffcodetab("1 ",2,2,0,0,-1,null,null,ValTab1,7); ht[2] = new huffcodetab("2 ",3,3,0,0,-1,null,null,ValTab2,17); ht[3] = new huffcodetab("3 ",3,3,0,0,-1,null,null,ValTab3,17); ht[4] = new huffcodetab("4 ",0,0,0,0,-1,null,null,ValTab4,0); ht[5] = new huffcodetab("5 ",4,4,0,0,-1,null,null,ValTab5,31); ht[6] = new huffcodetab("6 ",4,4,0,0,-1,null,null,ValTab6,31); ht[7] = new huffcodetab("7 ",6,6,0,0,-1,null,null,ValTab7,71); ht[8] = new huffcodetab("8 ",6,6,0,0,-1,null,null,ValTab8,71); ht[9] = new huffcodetab("9 ",6,6,0,0,-1,null,null,ValTab9,71); ht[10] = new huffcodetab("10 ",8,8,0,0,-1,null,null,ValTab10,127); ht[11] = new huffcodetab("11 ",8,8,0,0,-1,null,null,ValTab11,127); ht[12] = new huffcodetab("12 ",8,8,0,0,-1,null,null,ValTab12,127); ht[13] = new huffcodetab("13 ",16,16,0,0,-1,null,null,ValTab13,511); ht[14] = new huffcodetab("14 ",0,0,0,0,-1,null,null,ValTab14,0); ht[15] = new huffcodetab("15 ",16,16,0,0,-1,null,null,ValTab15,511); ht[16] = new huffcodetab("16 ",16,16,1,1,-1,null,null,ValTab16,511); ht[17] = new huffcodetab("17 ",16,16,2,3,16,null,null,ValTab16,511); ht[18] = new huffcodetab("18 ",16,16,3,7,16,null,null,ValTab16,511); ht[19] = new huffcodetab("19 ",16,16,4,15,16,null,null,ValTab16,511); ht[20] = new huffcodetab("20 ",16,16,6,63,16,null,null,ValTab16,511); ht[21] = new huffcodetab("21 ",16,16,8,255,16,null,null,ValTab16,511); ht[22] = new huffcodetab("22 ",16,16,10,1023,16,null,null,ValTab16,511); ht[23] = new huffcodetab("23 ",16,16,13,8191,16,null,null,ValTab16,511); ht[24] = new huffcodetab("24 ",16,16,4,15,-1,null,null,ValTab24,512); ht[25] = new huffcodetab("25 ",16,16,5,31,24,null,null,ValTab24,512); ht[26] = new huffcodetab("26 ",16,16,6,63,24,null,null,ValTab24,512); ht[27] = new huffcodetab("27 ",16,16,7,127,24,null,null,ValTab24,512); ht[28] = new huffcodetab("28 ",16,16,8,255,24,null,null,ValTab24,512); ht[29] = new huffcodetab("29 ",16,16,9,511,24,null,null,ValTab24,512); ht[30] = new huffcodetab("30 ",16,16,11,2047,24,null,null,ValTab24,512); ht[31] = new huffcodetab("31 ",16,16,13,8191,24,null,null,ValTab24,512); ht[32] = new huffcodetab("32 ",1,16,0,0,-1,null,null,ValTab32,31); ht[33] = new huffcodetab("33 ",1,16,0,0,-1,null,null,ValTab33,31); } } extensions/soundspi/javalayer/src/javazoom/jl/decoder/l3reorder.ser000066400000000000000000000331451335566474600261730ustar00rootroot00000000000000ur[[IO<xpur[IM`&v겥xp@     !"#$*0%+1&,2'-3(.4)/56<B7=C8>D9?E:@F;AGHPXIQYJRZKS[LT\MU]NV^OW_`jtakublvcmwdnxeoyfpzgq{hr|is}~ !" # $ % & '()*+,Ll-Mm.Nn/Oo0Pp1Qq2Rr3Ss4Tt5Uu6Vv7Ww8Xx9Yy:Zz;[{<\|=]}>^~?_@`AaBbCcDdEeFfGgHhIiJjKk  . / 0 1 2!3"4#5$6%7&8'9(:);*<+=,>-?uq~@     !"#$*0%+1&,2'-3(.4)/56>F7?G8@H9AI:BJ;CK<DL=EMNXbOYcPZdQ[eR\fS]gT^hU_iV`jWaklxmynzo{p|q}r~stuvw  ! " # $ %&'()*+,-./012345678Xx9Yy:Zz;[{<\|=]}>^~?_@`AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWw     (4)5*6+7 ,8!-9".:#/;$0<%1=&2>'3?uq~@     !"#$*0%+1&,2'-3(.4)/56>F7?G8@H9AI:BJ;CK<DL=EMNXbOYcPZdQ[eR\fS]gT^hU_iV`jWaklxmynzo{p|q}r~stuvw  ! " # $ %&'()*+,-./012345678Vt9Wu:Xv;Yw<Zx=[y>\z?]{@^|A_}B`~CaDbEcFdGeHfIgJhKiLjMkNlOmPnQoRpSqTrUs  . / 0 1 2!3"4#5$6%7&8'9(:);*<+=,>-?uq~@     !"#$(,%)-&*.'+/06<17=28>39?4:@5;ABJRCKSDLTEMUFNVGOWHPXIQYZdn[eo\fp]gq^hr_is`jtakublvcmwxyz{|}~()*+,-./01234 5  6 !7 "8 #9$:%;&<'=>\z?]{@^|A_}B`~CaDbEcFdGeHfIgJhKiLjMkNlOmPnQoRpSqTrUsVtWuXvYwZx[y      !"#$%&'()*+,-./0123456789:;<=>?uq~@     !"#$(,%)-&*.'+/06<17=28>39?4:@5;ABHNCIODJPEKQFLRGMST^hU_iV`jWakXblYcmZdn[eo\fp]gqr~stuvwxyz{|}      !"#$%&'()*+,F`-Ga.Hb/Ic0Jd1Ke2Lf3Mg4Nh5Oi6Pj7Qk8Rl9Sm:Tn;Uo<Vp=Wq>Xr?Ys@ZtA[uB\vC]wD^xE_yz{|}~      !"#$%&'()*+,-./0123456789:;<=>?uq~@     !"#$(,%)-&*.'+/06<17=28>39?4:@5;ABJRCKSDLTEMUFNVGOWHPXIQYZfr[gs\ht]iu^jv_kw`lxamybnzco{dp|eq}~ !" # $ % & '()*+,-./012345678Z|9[}:\~;]<^=_>`?a@bAcBdCeDfEgFhGiHjIkJlKmLnMoNpOqPrQsRtSuTvUwVxWyXzY{     (4)5*6+7 ,8!-9".:#/;$0<%1=&2>'3?extensions/soundspi/javalayer/src/javazoom/jl/decoder/lin2au.ser000066400000000000000000000400331335566474600254560ustar00rootroot00000000000000ur[S.]xp   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""""""""""""""""""""""""################################$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'''''''''''''''''''''''''''''''''(((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))********************************++++++++++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------------------------------................................/////////////////////////////////0000000000000000111111111111111122222222222222223333333333333333444444444444444455555555555555556666666666666666777777777777777788888888888888889999999999999999::::::::::::::::;;;;;;;;;;;;;;;;<<<<<<<<<<<<<<<<=================>>>>>>>>>>>>>>>>????????????????@@@@@@@@AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFFGGGGGGGGHHHHHHHHIIIIIIIIJJJJJJJJKKKKKKKKLLLLLLLLMMMMMMMMNNNNNNNNOOOOOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____``aabbccddeeffgghhhiijjkkllmmnnoopqrstuvwxyz{|}~extensions/soundspi/javalayer/src/javazoom/jl/decoder/readme.txt000066400000000000000000000005021335566474600255440ustar00rootroot00000000000000 TODO: Implement high-level Player and Converter classes. Add MP1 and MP2 support and test. Add option to run each "stage" on own thread. E.g. read & parse input, decode subbands, subband synthesis, audio output. Retrofit seek support (temporarily removed when reworking classes.) Document and give example code. extensions/soundspi/javalayer/src/javazoom/jl/decoder/sfd.ser000066400000000000000000000040331335566474600250400ustar00rootroot00000000000000ur[F " Bxp;U<=pq??q=p=<;;U9t;Z<h=8?x? 8===;;O9t ;]@<=@ ?4?==H=;;I9t;a!@<='?>==}=p;;D9t#;b1<=l/?$>@>=g=P;t;>9t4;dB<`ظ=7p6?Z>> =Qp=;D;69tD;dT<̀8<=?c>>=;=;;09 tT;be<h<@C?A>>=&p<:;(9_th;`w<0:J?>">=< :;!9Ot|;\<DyQ?~>>X<<@:;90t;W <`W?>,><Ӏ<8t;9 ?;O@><<<; 9?;H`|l><< d;8ոպ;<<@ i?>cP>J><@<@:8A;#@;9pt? >2>;<@:8%;4z?z>>:4<:8%:@2 ?t>p>9<@#:8A:@@J?oi=ߐ> <1:8ոA:KcP?i=> @<<:8ոջ:d |l*?c=> F<`H:8? 9<?]=N@>r<@O:8? tӀ,?W=>`< W:8t0@X~?QD<\:|8tO! "?J=0tPg@$?/l=<1b:#7tDp}?'=AudioDevice interface provides an abstraction for * a device capable of sounding audio samples. Samples are written to * the device wia the write() method. The device assumes * that these samples are signed 16-bit samples taken at the output frequency * of the decoder. If the decoder outputs more than one channel, the samples for * each channel are assumed to appear consecutively, with the lower numbered * channels preceeding higher-numbered channels. E.g. if there are two * channels, the samples will appear in this order: *


 * 
 *		l0, r0, l1, r1, l2, r2...
 * 
 * where 
 *	lx indicates the xth sample on channel 0
 *  rx indicates the xth sample on channel 1
 * 
* * @since 0.0.8 * @author Mat McGowan */ public interface AudioDevice { /** * Prepares the AudioDevice for playback of audio samples. * @param decoder The decoder that will be providing the audio * samples. * * If the audio device is already open, this method returns silently. * */ public void open(Decoder decoder) throws JavaLayerException; /** * Retrieves the open state of this audio device. * * @return true if this audio device is open and playing * audio samples, or false otherwise. */ public boolean isOpen(); /** * Writes a number of samples to this AudioDevice. * * @param samples The array of signed 16-bit samples to write * to the audio device. * @param offs The offset of the first sample. * @param len The number of samples to write. * * This method may return prior to the samples actually being played * by the audio device. */ public void write(short[] samples, int offs, int len) throws JavaLayerException; /** * Closes this audio device. Any currently playing audio is stopped * as soon as possible. Any previously written audio data that has not been heard * is discarded. * * The implementation should ensure that any threads currently blocking * on the device (e.g. during a write or flush * operation should be unblocked by this method. */ public void close(); /** * Blocks until all audio samples previously written to this audio device have * been heard. */ public void flush(); /** * Retrieves the current playback position in milliseconds. */ public int getPosition(); } extensions/soundspi/javalayer/src/javazoom/jl/player/AudioDeviceBase.java000066400000000000000000000110051335566474600272540ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 29/01/00 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.JavaLayerException; /** * The AudioDeviceBase class provides a simple thread-safe * implementation of the AudioDevice interface. * Template methods are provided for subclasses to override and * in doing so provide the implementation for the main operations * of the AudioDevice interface. * * @since 0.0.8 * @author Mat McGowan */ /* * REVIEW: It is desirable to be able to use the decoder whe * in the implementation of open(), but the decoder * has not yet read a frame, and so much of the * desired information (sample rate, channels etc.) * are not available. */ public abstract class AudioDeviceBase implements AudioDevice { private boolean open = false; private Decoder decoder = null; /** * Opens this audio device. * * @param decoder The decoder that will provide audio data * to this audio device. */ public synchronized void open(Decoder decoder) throws JavaLayerException { if (!isOpen()) { this.decoder = decoder; openImpl(); setOpen(true); } } /** * Template method to provide the * implementation for the opening of the audio device. */ protected void openImpl() throws JavaLayerException { } /** * Sets the open state for this audio device. */ protected void setOpen(boolean open) { this.open = open; } /** * Determines if this audio device is open or not. * * @return true if the audio device is open, * false if it is not. */ public synchronized boolean isOpen() { return open; } /** * Closes this audio device. If the device is currently playing * audio, playback is stopped immediately without flushing * any buffered audio data. */ public synchronized void close() { if (isOpen()) { closeImpl(); setOpen(false); decoder = null; } } /** * Template method to provide the implementation for * closing the audio device. */ protected void closeImpl() { } /** * Writes audio data to this audio device. Audio data is * assumed to be in the output format of the decoder. This * method may return before the data has actually been sounded * by the device if the device buffers audio samples. * * @param samples The samples to write to the audio device. * @param offs The offset into the array of the first sample to write. * @param len The number of samples from the array to write. * @throws JavaLayerException if the audio data could not be * written to the audio device. * If the audio device is not open, this method does nthing. */ public void write(short[] samples, int offs, int len) throws JavaLayerException { if (isOpen()) { writeImpl(samples, offs, len); } } /** * Template method to provide the implementation for * writing audio samples to the audio device. */ protected void writeImpl(short[] samples, int offs, int len) throws JavaLayerException { } /** * Waits for any buffered audio samples to be played by the * audio device. This method should only be called prior * to closing the device. */ public void flush() { if (isOpen()) { flushImpl(); } } /** * Template method to provide the implementation for * flushing any buffered audio data. */ protected void flushImpl() { } /** * Retrieves the decoder that provides audio data to this * audio device. * * @return The associated decoder. */ protected Decoder getDecoder() { return decoder; } } extensions/soundspi/javalayer/src/javazoom/jl/player/AudioDeviceFactory.java000066400000000000000000000057211335566474600300210ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 29/01/00 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player; import javazoom.jl.decoder.JavaLayerException; /** * An AudioDeviceFactory class is responsible for creating * a specific AudioDevice implementation. A factory implementation * can be as simple or complex as desired and may support just one implementation * or may return several implementations depending upon the execution * environment. *

* When implementing a factory that provides an AudioDevice that uses * class that may not be present, the factory should dynamically link to any * specific implementation classes required to instantiate or test the audio * implementation. This is so that the application as a whole * can run without these classes being present. The audio * device implementation, however, will usually statically link to the classes * required. (See the JavaSound deivce and factory for an example * of this.) * * @see FactoryRegistry * * @since 0.0.8 * @author Mat McGowan */ public abstract class AudioDeviceFactory { /** * Creates a new AudioDevice. * * @return a new instance of a specific class of AudioDevice. * @throws JavaLayerException if an instance of AudioDevice could not * be created. */ public abstract AudioDevice createAudioDevice() throws JavaLayerException; /** * Creates an instance of an AudioDevice implementation. * @param loader The ClassLoader to use to * load the named class, or null to use the * system class loader. * @param name The name of the class to load. * @return A newly-created instance of the audio device class. */ protected AudioDevice instantiate(ClassLoader loader, String name) throws ClassNotFoundException, IllegalAccessException, InstantiationException { AudioDevice dev = null; Class cls = null; if (loader==null) { cls = Class.forName(name); } else { cls = loader.loadClass(name); } Object o = cls.newInstance(); dev = (AudioDevice)o; return dev; } } extensions/soundspi/javalayer/src/javazoom/jl/player/FactoryRegistry.java000066400000000000000000000062751335566474600274550ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 29/01/00 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player; import java.util.Enumeration; import java.util.Hashtable; import javazoom.jl.decoder.JavaLayerException; /** * The FactoryRegistry class stores the factories * for all the audio device implementations available in the system. *

* Instances of this class are thread-safe. * * @since 0.0.8 * @author Mat McGowan */ public class FactoryRegistry extends AudioDeviceFactory { static private FactoryRegistry instance = null; static synchronized public FactoryRegistry systemRegistry() { if (instance==null) { instance = new FactoryRegistry(); instance.registerDefaultFactories(); } return instance; } protected Hashtable factories = new Hashtable(); /** * Registers an AudioDeviceFactory instance * with this registry. */ public void addFactory(AudioDeviceFactory factory) { factories.put(factory.getClass(), factory); } public void removeFactoryType(Class cls) { factories.remove(cls); } public void removeFactory(AudioDeviceFactory factory) { factories.remove(factory.getClass()); } public AudioDevice createAudioDevice() throws JavaLayerException { AudioDevice device = null; AudioDeviceFactory[] factories = getFactoriesPriority(); if (factories==null) throw new JavaLayerException(this+": no factories registered"); JavaLayerException lastEx = null; for (int i=0; (device==null) && (iJavaSoundAudioDevice implements an audio * device by using the JavaSound API. * * @since 0.0.8 * @author Mat McGowan */ public class JavaSoundAudioDevice extends AudioDeviceBase { private SourceDataLine source = null; private AudioFormat fmt = null; private byte[] byteBuf = new byte[4096]; protected void setAudioFormat(AudioFormat fmt0) { fmt = fmt0; } protected AudioFormat getAudioFormat() { if (fmt==null) { Decoder decoder = getDecoder(); fmt = new AudioFormat(decoder.getOutputFrequency(), 16, decoder.getOutputChannels(), true, false); } return fmt; } protected DataLine.Info getSourceLineInfo() { AudioFormat fmt = getAudioFormat(); //DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt, 4000); DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt); return info; } public void open(AudioFormat fmt) throws JavaLayerException { if (!isOpen()) { setAudioFormat(fmt); openImpl(); setOpen(true); } } protected void openImpl() throws JavaLayerException { } // createSource fix. protected void createSource() throws JavaLayerException { Throwable t = null; try { Line line = AudioSystem.getLine(getSourceLineInfo()); if (line instanceof SourceDataLine) { source = (SourceDataLine)line; //source.open(fmt, millisecondsToBytes(fmt, 2000)); source.open(fmt); /* if (source.isControlSupported(FloatControl.Type.MASTER_GAIN)) { FloatControl c = (FloatControl)source.getControl(FloatControl.Type.MASTER_GAIN); c.setValue(c.getMaximum()); }*/ source.start(); } } catch (RuntimeException ex) { t = ex; } catch (LinkageError ex) { t = ex; } catch (LineUnavailableException ex) { t = ex; } if (source==null) throw new JavaLayerException("cannot obtain source audio line", t); } public int millisecondsToBytes(AudioFormat fmt, int time) { return (int)(time*(fmt.getSampleRate()*fmt.getChannels()*fmt.getSampleSizeInBits())/8000.0); } protected void closeImpl() { if (source!=null) { source.close(); } } protected void writeImpl(short[] samples, int offs, int len) throws JavaLayerException { if (source==null) createSource(); byte[] b = toByteArray(samples, offs, len); source.write(b, 0, len*2); } protected byte[] getByteArray(int length) { if (byteBuf.length < length) { byteBuf = new byte[length+1024]; } return byteBuf; } protected byte[] toByteArray(short[] samples, int offs, int len) { byte[] b = getByteArray(len*2); int idx = 0; short s; while (len-- > 0) { s = samples[offs++]; b[idx++] = (byte)s; b[idx++] = (byte)(s>>>8); } return b; } protected void flushImpl() { if (source!=null) { source.drain(); } } public int getPosition() { int pos = 0; if (source!=null) { pos = (int)(source.getMicrosecondPosition()/1000); } return pos; } /** * Runs a short test by playing a short silent sound. */ public void test() throws JavaLayerException { try { open(new AudioFormat(22050, 16, 1, true, false)); short[] data = new short[22050/10]; write(data, 0, data.length); flush(); close(); } catch (RuntimeException ex) { throw new JavaLayerException("Device test failed: "+ex); } } } extensions/soundspi/javalayer/src/javazoom/jl/player/JavaSoundAudioDeviceFactory.java000066400000000000000000000047531335566474600316400ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 29/01/00 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player; import javazoom.jl.decoder.JavaLayerException; /** * This class is responsible for creating instances of the * JavaSoundAudioDevice. The audio device implementation is loaded * and tested dynamically as not all systems will have support * for JavaSound, or they may have the incorrect version. */ public class JavaSoundAudioDeviceFactory extends AudioDeviceFactory { private boolean tested = false; static private final String DEVICE_CLASS_NAME = "javazoom.jl.player.JavaSoundAudioDevice"; public synchronized AudioDevice createAudioDevice() throws JavaLayerException { if (!tested) { testAudioDevice(); tested = true; } try { return createAudioDeviceImpl(); } catch (Exception ex) { throw new JavaLayerException("unable to create JavaSound device: "+ex); } catch (LinkageError ex) { throw new JavaLayerException("unable to create JavaSound device: "+ex); } } protected JavaSoundAudioDevice createAudioDeviceImpl() throws JavaLayerException { ClassLoader loader = getClass().getClassLoader(); try { JavaSoundAudioDevice dev = (JavaSoundAudioDevice)instantiate(loader, DEVICE_CLASS_NAME); return dev; } catch (Exception ex) { throw new JavaLayerException("Cannot create JavaSound device", ex); } catch (LinkageError ex) { throw new JavaLayerException("Cannot create JavaSound device", ex); } } public void testAudioDevice() throws JavaLayerException { JavaSoundAudioDevice dev = createAudioDeviceImpl(); dev.test(); } } extensions/soundspi/javalayer/src/javazoom/jl/player/NullAudioDevice.java000066400000000000000000000023741335566474600273250ustar00rootroot00000000000000/* * 11/19/04 1.0 moved o LGPL. * 29/01/00 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player; /** * The NullAudioDevice implements a silent, no-op * audio device. This is useful for testing purposes. * * @since 0.0.8 * @author Mat McGowan */ public class NullAudioDevice extends AudioDeviceBase { public int getPosition() { return 0; } } extensions/soundspi/javalayer/src/javazoom/jl/player/Player.java000066400000000000000000000127651335566474600255520ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 29/01/00 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player; import java.io.InputStream; import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.BitstreamException; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.Header; import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.decoder.SampleBuffer; /** * The Player class implements a simple player for playback * of an MPEG audio stream. * * @author Mat McGowan * @since 0.0.8 */ // REVIEW: the audio device should not be opened until the // first MPEG audio frame has been decoded. public class Player { /** * The current frame number. */ private int frame = 0; /** * The MPEG audio bitstream. */ // javac blank final bug. /*final*/ private Bitstream bitstream; /** * The MPEG audio decoder. */ /*final*/ private Decoder decoder; /** * The AudioDevice the audio samples are written to. */ private AudioDevice audio; /** * Has the player been closed? */ private boolean closed = false; /** * Has the player played back all frames from the stream? */ private boolean complete = false; private int lastPosition = 0; /** * Creates a new Player instance. */ public Player(InputStream stream) throws JavaLayerException { this(stream, null); } public Player(InputStream stream, AudioDevice device) throws JavaLayerException { bitstream = new Bitstream(stream); decoder = new Decoder(); if (device!=null) { audio = device; } else { FactoryRegistry r = FactoryRegistry.systemRegistry(); audio = r.createAudioDevice(); } audio.open(decoder); } public void play() throws JavaLayerException { play(Integer.MAX_VALUE); } /** * Plays a number of MPEG audio frames. * * @param frames The number of frames to play. * @return true if the last frame was played, or false if there are * more frames. */ public boolean play(int frames) throws JavaLayerException { boolean ret = true; while (frames-- > 0 && ret) { ret = decodeFrame(); } if (!ret) { // last frame, ensure all data flushed to the audio device. AudioDevice out = audio; if (out!=null) { out.flush(); synchronized (this) { complete = (!closed); close(); } } } return ret; } /** * Cloases this player. Any audio currently playing is stopped * immediately. */ public synchronized void close() { AudioDevice out = audio; if (out!=null) { closed = true; audio = null; // this may fail, so ensure object state is set up before // calling this method. out.close(); lastPosition = out.getPosition(); try { bitstream.close(); } catch (BitstreamException ex) { } } } /** * Returns the completed status of this player. * * @return true if all available MPEG audio frames have been * decoded, or false otherwise. */ public synchronized boolean isComplete() { return complete; } /** * Retrieves the position in milliseconds of the current audio * sample being played. This method delegates to the * AudioDevice that is used by this player to sound * the decoded audio samples. */ public int getPosition() { int position = lastPosition; AudioDevice out = audio; if (out!=null) { position = out.getPosition(); } return position; } /** * Decodes a single frame. * * @return true if there are no more frames to decode, false otherwise. */ protected boolean decodeFrame() throws JavaLayerException { try { AudioDevice out = audio; if (out==null) return false; Header h = bitstream.readFrame(); if (h==null) return false; // sample buffer set when decoder constructed SampleBuffer output = (SampleBuffer)decoder.decodeFrame(h, bitstream); synchronized (this) { out = audio; if (out!=null) { out.write(output.getBuffer(), 0, output.getBufferLength()); } } bitstream.closeFrame(); } catch (RuntimeException ex) { throw new JavaLayerException("Exception decoding audio frame", ex); } /* catch (IOException ex) { System.out.println("exception decoding audio frame: "+ex); return false; } catch (BitstreamException bitex) { System.out.println("exception decoding audio frame: "+bitex); return false; } catch (DecoderException decex) { System.out.println("exception decoding audio frame: "+decex); return false; } */ return true; } } extensions/soundspi/javalayer/src/javazoom/jl/player/PlayerApplet.java000066400000000000000000000122661335566474600267140ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * 29/01/00 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player; import java.applet.Applet; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javazoom.jl.decoder.JavaLayerException; /** * A simple applet that plays an MPEG audio file. * The URL (relative to the document base) * is passed as the "audioURL" parameter. * * @author Mat McGowan * @since 0.0.8 */ public class PlayerApplet extends Applet implements Runnable { static public final String AUDIO_PARAMETER = "audioURL"; /** * The Player used to play the MPEG audio file. */ private Player player = null; /** * The thread that runs the player. */ private Thread playerThread = null; private String fileName = null; /** * Retrieves the AudioDevice instance that will * be used to sound the audio data. * * @return an audio device instance that will be used to * sound the audio stream. */ protected AudioDevice getAudioDevice() throws JavaLayerException { return FactoryRegistry.systemRegistry().createAudioDevice(); } /** * Retrieves the InputStream that provides the MPEG audio * stream data. * * @return an InputStream from which the MPEG audio data * is read, or null if an error occurs. */ protected InputStream getAudioStream() { InputStream in = null; try { URL url = getAudioURL(); if (url!=null) in = url.openStream(); } catch (IOException ex) { System.err.println(ex); } return in; } protected String getAudioFileName() { String urlString = fileName; if (urlString==null) { urlString = getParameter(AUDIO_PARAMETER); } return urlString; } protected URL getAudioURL() { String urlString = getAudioFileName(); URL url = null; if (urlString!=null) { try { url = new URL(getDocumentBase(), urlString); } catch (Exception ex) { System.err.println(ex); } } return url; } /** * Sets the URL of the audio stream to play. */ public void setFileName(String name) { fileName = name; } public String getFileName() { return fileName; } /** * Stops the audio player. If the player is already stopped * this method is a no-op. */ protected void stopPlayer() throws JavaLayerException { if (player!=null) { player.close(); player = null; playerThread = null; } } /** * Decompresses audio data from an InputStream and plays it * back through an AudioDevice. The playback is run on a newly * created thread. * * @param in The InputStream that provides the MPEG audio data. * @param dev The AudioDevice to use to sound the decompressed data. * * @throws JavaLayerException if there was a problem decoding * or playing the audio data. */ protected void play(InputStream in, AudioDevice dev) throws JavaLayerException { stopPlayer(); if (in!=null && dev!=null) { player = new Player(in, dev); playerThread = createPlayerThread(); playerThread.start(); } } /** * Creates a new thread used to run the audio player. * @return A new Thread that, once started, runs the audio player. */ protected Thread createPlayerThread() { return new Thread(this, "Audio player thread"); } /** * Initializes this applet. */ public void init() { } /** * Starts this applet. An input stream and audio device * are created and passed to the play() method. */ public void start() { String name = getAudioFileName(); try { InputStream in = getAudioStream(); AudioDevice dev = getAudioDevice(); play(in, dev); } catch (JavaLayerException ex) { synchronized (System.err) { System.err.println("Unable to play "+name); ex.printStackTrace(System.err); } } } /** * Stops this applet. If audio is currently playing, it is * stopped. */ public void stop() { try { stopPlayer(); } catch (JavaLayerException ex) { System.err.println(ex); } } public void destroy() { } /** * The run method for the audio player thread. Simply calls * play() on the player to play the entire stream. */ public void run() { if (player!=null) { try { player.play(); } catch (JavaLayerException ex) { System.err.println("Problem playing audio: "+ex); } } } } extensions/soundspi/javalayer/src/javazoom/jl/player/advanced/000077500000000000000000000000001335566474600252055ustar00rootroot00000000000000extensions/soundspi/javalayer/src/javazoom/jl/player/advanced/AdvancedPlayer.java000066400000000000000000000137101335566474600307340ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player.advanced; import java.io.InputStream; import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.BitstreamException; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.Header; import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.decoder.SampleBuffer; import javazoom.jl.player.AudioDevice; import javazoom.jl.player.FactoryRegistry; /** * a hybrid of javazoom.jl.player.Player tweeked to include play(startFrame, endFrame) * hopefully this will be included in the api */ public class AdvancedPlayer { /** The MPEG audio bitstream.*/ private Bitstream bitstream; /** The MPEG audio decoder. */ private Decoder decoder; /** The AudioDevice the audio samples are written to. */ private AudioDevice audio; /** Has the player been closed? */ private boolean closed = false; /** Has the player played back all frames from the stream? */ private boolean complete = false; private int lastPosition = 0; /** Listener for the playback process */ private PlaybackListener listener; /** * Creates a new Player instance. */ public AdvancedPlayer(InputStream stream) throws JavaLayerException { this(stream, null); } public AdvancedPlayer(InputStream stream, AudioDevice device) throws JavaLayerException { bitstream = new Bitstream(stream); if (device!=null) audio = device; else audio = FactoryRegistry.systemRegistry().createAudioDevice(); audio.open(decoder = new Decoder()); } public void play() throws JavaLayerException { play(Integer.MAX_VALUE); } /** * Plays a number of MPEG audio frames. * * @param frames The number of frames to play. * @return true if the last frame was played, or false if there are * more frames. */ public boolean play(int frames) throws JavaLayerException { boolean ret = true; // report to listener if(listener != null) listener.playbackStarted(createEvent(PlaybackEvent.STARTED)); while (frames-- > 0 && ret) { ret = decodeFrame(); } // if (!ret) { // last frame, ensure all data flushed to the audio device. AudioDevice out = audio; if (out != null) { // System.out.println(audio.getPosition()); out.flush(); // System.out.println(audio.getPosition()); synchronized (this) { complete = (!closed); close(); } // report to listener if(listener != null) listener.playbackFinished(createEvent(out, PlaybackEvent.STOPPED)); } } return ret; } /** * Cloases this player. Any audio currently playing is stopped * immediately. */ public synchronized void close() { AudioDevice out = audio; if (out != null) { closed = true; audio = null; // this may fail, so ensure object state is set up before // calling this method. out.close(); lastPosition = out.getPosition(); try { bitstream.close(); } catch (BitstreamException ex) {} } } /** * Decodes a single frame. * * @return true if there are no more frames to decode, false otherwise. */ protected boolean decodeFrame() throws JavaLayerException { try { AudioDevice out = audio; if (out == null) return false; Header h = bitstream.readFrame(); if (h == null) return false; // sample buffer set when decoder constructed SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream); synchronized (this) { out = audio; if(out != null) { out.write(output.getBuffer(), 0, output.getBufferLength()); } } bitstream.closeFrame(); } catch (RuntimeException ex) { throw new JavaLayerException("Exception decoding audio frame", ex); } return true; } /** * skips over a single frame * @return false if there are no more frames to decode, true otherwise. */ protected boolean skipFrame() throws JavaLayerException { Header h = bitstream.readFrame(); if (h == null) return false; bitstream.closeFrame(); return true; } /** * Plays a range of MPEG audio frames * @param start The first frame to play * @param end The last frame to play * @return true if the last frame was played, or false if there are more frames. */ public boolean play(final int start, final int end) throws JavaLayerException { boolean ret = true; int offset = start; while (offset-- > 0 && ret) ret = skipFrame(); return play(end - start); } /** * Constructs a PlaybackEvent */ private PlaybackEvent createEvent(int id) { return createEvent(audio, id); } /** * Constructs a PlaybackEvent */ private PlaybackEvent createEvent(AudioDevice dev, int id) { return new PlaybackEvent(this, id, dev.getPosition()); } /** * sets the PlaybackListener */ public void setPlayBackListener(PlaybackListener listener) { this.listener = listener; } /** * gets the PlaybackListener */ public PlaybackListener getPlayBackListener() { return listener; } /** * closes the player and notifies PlaybackListener */ public void stop() { listener.playbackFinished(createEvent(PlaybackEvent.STOPPED)); close(); } }extensions/soundspi/javalayer/src/javazoom/jl/player/advanced/PlaybackEvent.java000066400000000000000000000032421335566474600306010ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player.advanced; /** * An event which indicates a Player has performed an 'playback action' * @author Paul Stanton (http://wanto.f2o.org/) */ public class PlaybackEvent { public static int STOPPED = 1; public static int STARTED = 2; private AdvancedPlayer source; private int frame; private int id; public PlaybackEvent(AdvancedPlayer source, int id, int frame) { this.id = id; this.source = source; this.frame = frame; } public int getId(){return id;} public void setId(int id){this.id = id;} public int getFrame(){return frame;} public void setFrame(int frame){this.frame = frame;} public AdvancedPlayer getSource(){return source;} public void setSource(AdvancedPlayer source){this.source = source;} } extensions/soundspi/javalayer/src/javazoom/jl/player/advanced/PlaybackListener.java000066400000000000000000000022731335566474600313100ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player.advanced; /** * Listener for javalayer Player playback * @author Paul Stanton (http://wanto.f2o.org/) */ public abstract class PlaybackListener { public void playbackStarted(PlaybackEvent evt){} public void playbackFinished(PlaybackEvent evt){} } extensions/soundspi/javalayer/src/javazoom/jl/player/advanced/jlap.java000066400000000000000000000063311335566474600270010ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player.advanced; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javazoom.jl.decoder.JavaLayerException; /** * This class implements a sample player using Playback listener. */ public class jlap { public static void main(String[] args) { jlap test = new jlap(); if (args.length != 1) { test.showUsage(); System.exit(0); } else { try { test.play(args[0]); } catch (Exception ex) { System.err.println(ex.getMessage()); System.exit(0); } } } public void play(String filename) throws JavaLayerException, IOException { InfoListener lst = new InfoListener(); playMp3(new File(filename), lst); } public void showUsage() { System.out.println("Usage: jla "); System.out.println(""); System.out.println(" e.g. : java javazoom.jl.player.advanced.jlap localfile.mp3"); } public static AdvancedPlayer playMp3(File mp3, PlaybackListener listener) throws IOException, JavaLayerException { return playMp3(mp3, 0, Integer.MAX_VALUE, listener); } public static AdvancedPlayer playMp3(File mp3, int start, int end, PlaybackListener listener) throws IOException, JavaLayerException { return playMp3(new BufferedInputStream(new FileInputStream(mp3)), start, end, listener); } public static AdvancedPlayer playMp3(final InputStream is, final int start, final int end, PlaybackListener listener) throws JavaLayerException { final AdvancedPlayer player = new AdvancedPlayer(is); player.setPlayBackListener(listener); // run in new thread new Thread() { public void run() { try { player.play(start, end); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } }.start(); return player; } public class InfoListener extends PlaybackListener { public void playbackStarted(PlaybackEvent evt) { System.out.println("Play started from frame " + evt.getFrame()); } public void playbackFinished(PlaybackEvent evt) { System.out.println("Play completed at frame " + evt.getFrame()); System.exit(0); } } }extensions/soundspi/javalayer/src/javazoom/jl/player/jlp.java000066400000000000000000000077031335566474600250770ustar00rootroot00000000000000/* * 11/19/04 1.0 moved to LGPL. * * 06/04/01 Streaming support added. javalayer@javazoom.net * * 29/01/00 Initial version. mdm@techie.com *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package javazoom.jl.player; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javazoom.jl.decoder.JavaLayerException; /** * The jlp class implements a simple command-line * player for MPEG audio files. * * @author Mat McGowan (mdm@techie.com) */ public class jlp { private String fFilename = null; private boolean remote = false; public static void main(String[] args) { int retval = 0; try { jlp player = createInstance(args); if (player!=null) player.play(); } catch (Exception ex) { System.err.println(ex); ex.printStackTrace(System.err); retval = 1; } System.exit(retval); } static public jlp createInstance(String[] args) { jlp player = new jlp(); if (!player.parseArgs(args)) player = null; return player; } private jlp() { } public jlp(String filename) { init(filename); } protected void init(String filename) { fFilename = filename; } protected boolean parseArgs(String[] args) { boolean parsed = false; if (args.length == 1) { init(args[0]); parsed = true; remote = false; } else if (args.length == 2) { if (!(args[0].equals("-url"))) { showUsage(); } else { init(args[1]); parsed = true; remote = true; } } else { showUsage(); } return parsed; } public void showUsage() { System.out.println("Usage: jlp [-url] "); System.out.println(""); System.out.println(" e.g. : java javazoom.jl.player.jlp localfile.mp3"); System.out.println(" java javazoom.jl.player.jlp -url http://www.server.com/remotefile.mp3"); System.out.println(" java javazoom.jl.player.jlp -url http://www.shoutcastserver.com:8000"); } public void play() throws JavaLayerException { try { System.out.println("playing "+fFilename+"..."); InputStream in = null; if (remote == true) in = getURLInputStream(); else in = getInputStream(); AudioDevice dev = getAudioDevice(); Player player = new Player(in, dev); player.play(); } catch (IOException ex) { throw new JavaLayerException("Problem playing file "+fFilename, ex); } catch (Exception ex) { throw new JavaLayerException("Problem playing file "+fFilename, ex); } } /** * Playing file from URL (Streaming). */ protected InputStream getURLInputStream() throws Exception { URL url = new URL(fFilename); InputStream fin = url.openStream(); BufferedInputStream bin = new BufferedInputStream(fin); return bin; } /** * Playing file from FileInputStream. */ protected InputStream getInputStream() throws IOException { FileInputStream fin = new FileInputStream(fFilename); BufferedInputStream bin = new BufferedInputStream(fin); return bin; } protected AudioDevice getAudioDevice() throws JavaLayerException { return FactoryRegistry.systemRegistry().createAudioDevice(); } } extensions/soundspi/jorbis/000077500000000000000000000000001335566474600164345ustar00rootroot00000000000000extensions/soundspi/jorbis/COPYING.LIB000066400000000000000000000636441335566474600201110ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. ^L Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. ^L GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. ^L Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. ^L 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. ^L 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. ^L 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. ^L 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ^L How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! extensions/soundspi/jorbis/ChangeLog000066400000000000000000000054671335566474600202220ustar00rootroot00000000000000 ChangeLog of JOrbis ==================================================================== Last modified: Wed Oct 13 01:53:26 JST 2004 Changes since version 0.0.13: - added com.jcraft.jogg.Buffer.readB method for Fluendo's theora decoder. - added com.jcraft.jogg.Page.copy methods for handling grouped ogg streams. Changes since version 0.0.12: - fixed resorce leaks in com.jcraft.jorbis.VorbisFile class. Changes since version 0.0.11: ............................ - updated VorbisFile class for calculating total length in seconds of a Vorbis file. - some improvements on JOrbisPlayer. For example, songs on play-list will be played sequentially. Changes since version 0.0.10: ............................ - fixed bugs and incompleteness in the 'residue back-end type 2', which is required for decoding stereo coupling streams generated by RC3 encoder. - fixed minor bugs in JOrbisPlayer. Changes since version 0.0.9: ............................ - modified JOrbisPlayer for playing Ogg Vorbis live streams on UDP broadcast packets from JRoar 0.0.2. Changes since version 0.0.8: ............................ - improved the performance. In this improvement, the frequency of GC invocations has been suppressed by refraining from object allocations. - modified JOrbisPlayer for accepting *.m3u file. Changes since version 0.0.7: ............................ - added a 'simple' comment editor in pure Java. It has been located at 'comment_editor' directory. - improved for decoding Ogg Vorbis streams generated by 1.0 RC2 encoder. - modified JOrbisPlayer for accepting *.pls file. Changes since version 0.0.6: ............................ - fixed bugs in playing the chained ogg bit stream. Changes since version 0.0.5: ............................ - added the support for odd-sized LSP filters. Now, JOribPlayer can correctly decode/play low bitrate ogg bit streams, which are encoded by Vorbis 1.0beta4. Many thanks to smoerk, who reported me a glitch in playing low bitrate ogg bit streams on previous releases. - tuned up the performance a little bit. Changes since version 0.0.4: ............................ - fixed a bug in the LSP conversion routines. Now, JOribPlayer can decode/play 24khz/mono ogg bit streams. - fixed a bug in handling comments. Changes since version 0.0.3: ............................ - modified to use the data type 'float' instead of 'double' for handling internal data. - added the LSP conversion routines. - moved chunk of code for handling the ogg bit stream to the 'com.jcraft.jogg' package. Changes since version 0.0.2: ............................ - added a pure Java Ogg Vorbis player. Changes since version 0.0.1: ............................ - fixed bugs in the synthesis engine. By this bug fix, the sound quality of output from JOrbis has been improved. extensions/soundspi/jorbis/README000066400000000000000000000103601335566474600173140ustar00rootroot00000000000000 JOrbis a pure Java(TM) Ogg Vorbis decoder by ymnk, JCraft,Inc. http://www.jcraft.com/jorbis/ Last modified: Mon May 7 14:31:03 UTC 2001 Description =========== JOrbis is a pure Java Ogg Vorbis decoder. JOrbis accepts Ogg Vorbis bitstreams and decodes them to raw PCMs. Documentation ============= Read before asking. * README files all over the source tree have info related to the stuff in the directories. Directories & Files in the Source Tree ====================================== * com/ has source trees of JOrbis. * player/ has source and binaries of pure Java Ogg Vorbis player. Copyrights & Disclaimers ======================== JOrbis is copyrighted by JCraft Inc. and is licensed through the GNU Lesser General Public License. Read the COPYING.LIB file for the complete license. Credits ======= All credits goes to authors, Moty,The XIPHOPHORUS Company and contributers of Ogg Vorbis. What is Ogg Vorbis? =================== Here is a quote from README of Ogg Vorbis CODEC from the Developer site for Ogg Vorbis(http://xiph.org/ogg/vorbis/). "Vorbis is a general purpose audio and music encoding format contemporary to MPEG-4's AAC and TwinVQ, the next generation beyond MPEG audio layer 3. Unlike the MPEG sponsored formats (and other proprietary formats such as RealAudio G2 and Windows' flavor of the month), the Vorbis CODEC specification belongs to the public domain. All the technical details are published and documented, and any software entity may make full use of the format without royalty or patent concerns." Why JOrbis? =========== We sympathize the aim of Ogg project. JOrbis is our contribution to the Ogg project in our style. We think the ubiquity of Vorbis decoder will leverage the popularity of Ogg Vorbis. We hope JOrbis will run on any platform, any devices and any web browsers, which support Java and every people will enjoy streamed musics without without royalty or patent concerns. Features ======== * JOrbis is in pure JavaTM. JOrbis will run on JDK1.0.* or higher and may run on J2METM. * JOrbis is under LGPL. Current Status ============== The sound quality of outputs from JOrbis has been improved. If you had tried last version(0.0.1) and been disappointed with its quality, try current version. It will be worth trying. However, in current implementation, the efficiency has not been cared and many CPU resources are required. Much work must be done to solve this problem. How To Try JOrbis ================= A sample program DecodeExample.java has been included in an archive.
If you are on RedHat's GNU/Linux box, just try, $ cat foo.ogg | java com.jcraft.jorbis.DecodeExample | esdcat If outputs are noisy, save outputs in a file then cat it to esdcat. Ogg files are available at http://vorbis.com/listen.html and if you have Ogg Vorbis CODEC from xiph.org, you can make ogg files by your self. How To Play JOrbisPlayer ======================== The Ogg Voribs player, 'JOrbisPlayer', is available at the 'player' directory. It is a pure Java program, but it uses Java Sound APIs. If you have J2SE V.1.3 Java VM, you can enjoy it. *step1: Copy contents in the 'player' directory to some directory, which is accessible via the http server. *step2: Copy some ogg files to that directory. *step3: Change directory to that directory, make 'playlist' file. For example, 'ls *.ogg > playlist' *step4: Open 'JOrbisPlayer.html' file by a web browser via http server. JOrbisPlayer will run on a web browser automatically. 'JOrbisPlayer' also works as an application, so just try 'java JOrbisPlayer' in the 'player' directory. For example, on GNU/Linux, $ cd player $ export CLASSPATH=.:.. $ java JOrbisPlayer foo.ogg bar.ogg http://shomewahre/goo.ogg If you don't have the direct connections to the Internet and you have the http proxy server at 192.168.0.1:80, try as follows, $ java -Dhttp.proxyHost=192.168.0.1 -Dhttp.proxyPort=80 JOrbisPlayer http://shomewahre/goo.ogg In our experiences, if your machine has a Cerelon, you will be able to enjoy JOrbisPlayer. If you have any comments, suggestions and questions, write us at jorbis@jcraft.com extensions/soundspi/jorbis/src/000077500000000000000000000000001335566474600172235ustar00rootroot00000000000000extensions/soundspi/jorbis/src/com/000077500000000000000000000000001335566474600200015ustar00rootroot00000000000000extensions/soundspi/jorbis/src/com/jcraft/000077500000000000000000000000001335566474600212525ustar00rootroot00000000000000extensions/soundspi/jorbis/src/com/jcraft/jogg/000077500000000000000000000000001335566474600222005ustar00rootroot00000000000000extensions/soundspi/jorbis/src/com/jcraft/jogg/Buffer.java000066400000000000000000000334731335566474600242660ustar00rootroot00000000000000/* -*-mode:java; c-basic-offset:2; -*- */ /* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jogg; public class Buffer{ private static final int BUFFER_INCREMENT=256; private static final int[] mask={ 0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, 0x3fffffff,0x7fffffff,0xffffffff }; int ptr=0; byte[] buffer=null; int endbit=0; int endbyte=0; int storage=0; public void writeinit(){ buffer=new byte[BUFFER_INCREMENT]; ptr=0; buffer[0]=(byte)'\0'; storage=BUFFER_INCREMENT; } public void write(byte[] s){ for(int i=0; iret="+Integer.toHexString(ret)); if(bits>32 && endbit!=0){ ret|=((buffer[ptr+4])&0xff)<<(32-endbit); // ret|=((byte)(buffer[ptr+4]))<<(32-endbit); } } } } return(m&ret); } public int look1(){ if(endbyte>=storage)return(-1); return((buffer[ptr]>>endbit)&1); } public void adv(int bits){ bits+=endbit; ptr+=bits/8; endbyte+=bits/8; endbit=bits&7; } public void adv1(){ ++endbit; if(endbit>7){ endbit=0; ptr++; endbyte++; } } public int read(int bits){ //System.err.println(this+" read: bits="+bits+", storage="+storage+", endbyte="+endbyte); //System.err.println(this+" read: bits="+bits+", storage="+storage+", endbyte="+endbyte+ // ", ptr="+ptr+", endbit="+endbit+", buf[ptr]="+buffer[ptr]); int ret; int m=mask[bits]; bits+=endbit; if(endbyte+4>=storage){ ret=-1; if(endbyte+(bits-1)/8>=storage){ ptr+=bits/8; endbyte+=bits/8; endbit=bits&7; return(ret); } } /* ret=(byte)(buffer[ptr]>>>endbit); if(bits>8){ ret|=(buffer[ptr+1]<<(8-endbit)); if(bits>16){ ret|=(buffer[ptr+2]<<(16-endbit)); if(bits>24){ ret|=(buffer[ptr+3]<<(24-endbit)); if(bits>32 && endbit>0){ ret|=(buffer[ptr+4]<<(32-endbit)); } } } } */ ret=((buffer[ptr])&0xff)>>>endbit; if(bits>8){ ret|=((buffer[ptr+1])&0xff)<<(8-endbit); // ret|=((byte)(buffer[ptr+1]))<<(8-endbit); if(bits>16){ ret|=((buffer[ptr+2])&0xff)<<(16-endbit); // ret|=((byte)(buffer[ptr+2]))<<(16-endbit); if(bits>24){ ret|=((buffer[ptr+3])&0xff)<<(24-endbit); // ret|=((byte)(buffer[ptr+3]))<<(24-endbit); if(bits>32 && endbit!=0){ ret|=((buffer[ptr+4])&0xff)<<(32-endbit); // ret|=((byte)(buffer[ptr+4]))<<(32-endbit); } } } } ret&=m; ptr+=bits/8; // ptr=bits/8; endbyte+=bits/8; // endbyte=bits/8; endbit=bits&7; return(ret); } public int readB(int bits){ //System.err.println(this+" read: bits="+bits+", storage="+storage+", endbyte="+endbyte+ // ", ptr="+ptr+", endbit="+endbit+", buf[ptr]="+buffer[ptr]); int ret; int m=32-bits; bits+=endbit; if(endbyte+4>=storage){ /* not the main path */ ret=-1; if(endbyte*8+bits>storage*8) { ptr+=bits/8; endbyte+=bits/8; endbit=bits&7; return(ret); } } ret=(buffer[ptr]&0xff)<<(24+endbit); if(bits>8){ ret|=(buffer[ptr+1]&0xff)<<(16+endbit); if(bits>16){ ret|=(buffer[ptr+2]&0xff)<<(8+endbit); if(bits>24){ ret|=(buffer[ptr+3]&0xff)<<(endbit); if(bits>32 && (endbit != 0)) ret|=(buffer[ptr+4]&0xff)>>(8-endbit); } } } ret=(ret>>>(m>>1))>>>((m+1)>>1); ptr+=bits/8; endbyte+=bits/8; endbit=bits&7; return(ret); } public int read1(){ int ret; if(endbyte>=storage){ ret=-1; endbit++; if(endbit>7){ endbit=0; ptr++; endbyte++; } return(ret); } ret=(buffer[ptr]>>endbit)&1; endbit++; if(endbit>7){ endbit=0; ptr++; endbyte++; } return(ret); } public int bytes(){ return(endbyte+(endbit+7)/8); } public int bits(){ return(endbyte*8+endbit); } public byte[] buffer(){ return(buffer); } public static int ilog(int v){ int ret=0; while(v>0){ ret++; v>>>=1; } return(ret); } public static void report(String in){ System.err.println(in); System.exit(1); } /* static void cliptest(int[] b, int vals, int bits, int[] comp, int compsize){ int bytes; byte[] buffer; o.reset(); for(int i=0;i * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jogg; public class Packet{ public byte[] packet_base; public int packet; public int bytes; public int b_o_s; public int e_o_s; public long granulepos; public long packetno; // sequence number for decode; the framing // knows where there's a hole in the data, // but we need coupling so that the codec // (which is in a seperate abstraction // layer) also knows about the gap /* // TEST static int sequence=0; static int lastno=0; void checkpacket(int len, int no, int pos){ if(bytes!=len){ System.err.println("incorrect packet length!"); System.exit(1); } if(granulepos!=pos){ System.err.println("incorrect packet position!"); System.exit(1); } // packet number just follows sequence/gap; adjust the input number // for that if(no==0){ sequence=0; } else{ sequence++; if(no>lastno+1) sequence++; } lastno=no; if(packetno!=sequence){ System.err.println("incorrect packet sequence "+packetno+" != "+sequence); System.exit(1); } // Test data for(int j=0;j * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jogg; public class Page{ private static int[] crc_lookup=new int[256]; static { for(int i=0; i>>24)&0xff)^(header_base[header+i]&0xff)]; } for(int i=0;i>>24)&0xff)^(body_base[body+i]&0xff)]; } header_base[header+22]=(byte)crc_reg/*&0xff*/; header_base[header+23]=(byte)(crc_reg>>>8)/*&0xff*/; header_base[header+24]=(byte)(crc_reg>>>16)/*&0xff*/; header_base[header+25]=(byte)(crc_reg>>>24)/*&0xff*/; } public Page copy(){ return copy(new Page()); } public Page copy(Page p){ byte[] tmp=new byte[header_len]; System.arraycopy(header_base, header, tmp, 0, header_len); p.header_len=header_len; p.header_base=tmp; p.header=0; tmp=new byte[body_len]; System.arraycopy(body_base, body, tmp, 0, body_len); p.body_len=body_len; p.body_base=tmp; p.body=0; return p; } /* // TEST static StreamState os_en, os_de; static SyncState oy; void check_page(byte[] data_base, int data, int[] _header){ // Test data for(int j=0;j 4k... "); test_pack(packets,headret); } { // continuing packet test int[] packets={0,4345,259,255,-1}; int[] head1={0x4f,0x67,0x67,0x53,0,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,0,0,0,0, 0xff,0x7b,0x23,0x17, 1, 0}; int[] head2={0x4f,0x67,0x67,0x53,0,0x00, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,1,0,0,0, 0x34,0x24,0xd5,0x29, 17, 255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255}; int[] head3={0x4f,0x67,0x67,0x53,0,0x05, 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,2,0,0,0, 0xc8,0xc3,0xcb,0xed, 5, 10,255,4,255,0}; int[][] headret={head1,head2,head3,null}; System.err.print("testing single packet page span... "); test_pack(packets,headret); } // page with the 255 segment limit { int[] packets={0,10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,50,-1}; int[] head1={0x4f,0x67,0x67,0x53,0,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,0,0,0,0, 0xff,0x7b,0x23,0x17, 1, 0}; int[] head2={0x4f,0x67,0x67,0x53,0,0x00, 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,1,0,0,0, 0xed,0x2a,0x2e,0xa7, 255, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10}; int[] head3={0x4f,0x67,0x67,0x53,0,0x04, 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,2,0,0,0, 0x6c,0x3b,0x82,0x3d, 1, 50}; int[][] headret={head1,head2,head3,null}; System.err.print("testing max packet segments... "); test_pack(packets,headret); } { // packet that overspans over an entire page int[] packets={0,100,9000,259,255,-1}; int[] head1={0x4f,0x67,0x67,0x53,0,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,0,0,0,0, 0xff,0x7b,0x23,0x17, 1, 0}; int[] head2={0x4f,0x67,0x67,0x53,0,0x00, 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,1,0,0,0, 0x3c,0xd9,0x4d,0x3f, 17, 100,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255}; int[] head3={0x4f,0x67,0x67,0x53,0,0x01, 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,2,0,0,0, 0xbd,0xd5,0xb5,0x8b, 17, 255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255}; int[] head4={0x4f,0x67,0x67,0x53,0,0x05, 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,3,0,0,0, 0xef,0xdd,0x88,0xde, 7, 255,255,75,255,4,255,0}; int[][] headret={head1,head2,head3,head4,null}; System.err.print("testing very large packets... "); test_pack(packets,headret); } { // term only page. why not? int[] packets={0,100,4080,-1}; int[] head1={0x4f,0x67,0x67,0x53,0,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,0,0,0,0, 0xff,0x7b,0x23,0x17, 1, 0}; int[] head2={0x4f,0x67,0x67,0x53,0,0x00, 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,1,0,0,0, 0x3c,0xd9,0x4d,0x3f, 17, 100,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255}; int[] head3={0x4f,0x67,0x67,0x53,0,0x05, 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x03,0x04,2,0,0,0, 0xd4,0xe0,0x60,0xe5, 1,0}; int[][] headret={head1,head2,head3,null}; System.err.print("testing zero data page (1 nil packet)... "); test_pack(packets,headret); } { // build a bunch of pages for testing byte[] data=new byte[1024*1024]; int[] pl={0,100,4079,2956,2057,76,34,912,0,234,1000,1000,1000,300,-1}; int inptr=0; Page[] og=new Page[5]; for(int i=0; i<5; i++){ og[i]=new Page(); } os_en.reset(); for(int i=0;pl[i]!=-1;i++){ Packet op=new Packet(); int len=pl[i]; op.packet_base=data; op.packet=inptr; op.bytes=len; op.e_o_s=(pl[i+1]<0?1:0); op.granulepos=(i+1)*1000; for(int j=0;j0)error(); // Test fractional page inputs: incomplete fixed header index=oy.buffer(og[1].header_len); System.arraycopy(og[1].header_base, og[1].header+3, oy.data, index, 20); oy.wrote(20); if(oy.pageout(og_de)>0)error(); // Test fractional page inputs: incomplete header index=oy.buffer(og[1].header_len); System.arraycopy(og[1].header_base, og[1].header+23, oy.data, index, 5); oy.wrote(5); if(oy.pageout(og_de)>0)error(); // Test fractional page inputs: incomplete body index=oy.buffer(og[1].header_len); System.arraycopy(og[1].header_base, og[1].header+28, oy.data, index, og[1].header_len-28); oy.wrote(og[1].header_len-28); if(oy.pageout(og_de)>0)error(); index=oy.buffer(og[1].body_len); System.arraycopy(og[1].body_base, og[1].body, oy.data, index, 1000); oy.wrote(1000); if(oy.pageout(og_de)>0)error(); index=oy.buffer(og[1].body_len); System.arraycopy(og[1].body_base, og[1].body+1000, oy.data, index, og[1].body_len-1000); oy.wrote(og[1].body_len-1000); if(oy.pageout(og_de)<=0)error(); System.err.println("ok."); } // Test fractional page inputs: page + incomplete capture { Page og_de=new Page(); System.err.print("Testing sync on 1+partial inputs... "); oy.reset(); int index=oy.buffer(og[1].header_len); System.arraycopy(og[1].header_base, og[1].header, oy.data, index, og[1].header_len); oy.wrote(og[1].header_len); index=oy.buffer(og[1].body_len); System.arraycopy(og[1].body_base, og[1].body, oy.data, index, og[1].body_len); oy.wrote(og[1].body_len); index=oy.buffer(og[1].header_len); System.arraycopy(og[1].header_base, og[1].header, oy.data, index, 20); oy.wrote(20); if(oy.pageout(og_de)<=0)error(); if(oy.pageout(og_de)>0)error(); index=oy.buffer(og[1].header_len); System.arraycopy(og[1].header_base, og[1].header+20, oy.data, index, og[1].header_len-20); oy.wrote(og[1].header_len-20); index=oy.buffer(og[1].body_len); System.arraycopy(og[1].body_base, og[1].body, oy.data, index, og[1].body_len); oy.wrote(og[1].body_len); if(oy.pageout(og_de)<=0)error(); System.err.println("ok."); } // // // // // // // // // // Test recapture: garbage + page { Page og_de=new Page(); System.err.print("Testing search for capture... "); oy.reset(); // 'garbage' int index=oy.buffer(og[1].body_len); System.arraycopy(og[1].body_base, og[1].body, oy.data, index, og[1].body_len); oy.wrote(og[1].body_len); index=oy.buffer(og[1].header_len); System.arraycopy(og[1].header_base, og[1].header, oy.data, index, og[1].header_len); oy.wrote(og[1].header_len); index=oy.buffer(og[1].body_len); System.arraycopy(og[1].body_base, og[1].body, oy.data, index, og[1].body_len); oy.wrote(og[1].body_len); index=oy.buffer(og[2].header_len); System.arraycopy(og[2].header_base, og[2].header, oy.data, index, 20); oy.wrote(20); if(oy.pageout(og_de)>0)error(); if(oy.pageout(og_de)<=0)error(); if(oy.pageout(og_de)>0)error(); index=oy.buffer(og[2].header_len); System.arraycopy(og[2].header_base, og[2].header+20, oy.data, index, og[2].header_len-20); oy.wrote(og[2].header_len-20); index=oy.buffer(og[2].body_len); System.arraycopy(og[2].body_base, og[2].body, oy.data, index, og[2].body_len); oy.wrote(og[2].body_len); if(oy.pageout(og_de)<=0)error(); System.err.println("ok."); } // Test recapture: page + garbage + page { Page og_de=new Page(); System.err.print("Testing recapture... "); oy.reset(); int index=oy.buffer(og[1].header_len); System.arraycopy(og[1].header_base, og[1].header, oy.data, index, og[1].header_len); oy.wrote(og[1].header_len); index=oy.buffer(og[1].body_len); System.arraycopy(og[1].body_base, og[1].body, oy.data, index, og[1].body_len); oy.wrote(og[1].body_len); index=oy.buffer(og[2].header_len); System.arraycopy(og[2].header_base, og[2].header, oy.data, index, og[2].header_len); oy.wrote(og[2].header_len); index=oy.buffer(og[2].header_len); System.arraycopy(og[2].header_base, og[2].header, oy.data, index, og[2].header_len); oy.wrote(og[2].header_len); if(oy.pageout(og_de)<=0)error(); index=oy.buffer(og[2].body_len); System.arraycopy(og[2].body_base, og[2].body, oy.data, index, og[2].body_len-5); oy.wrote(og[2].body_len-5); index=oy.buffer(og[3].header_len); System.arraycopy(og[3].header_base, og[3].header, oy.data, index, og[3].header_len); oy.wrote(og[3].header_len); index=oy.buffer(og[3].body_len); System.arraycopy(og[3].body_base, og[3].body, oy.data, index, og[3].body_len); oy.wrote(og[3].body_len); if(oy.pageout(og_de)>0)error(); if(oy.pageout(og_de)<=0)error(); System.err.println("ok."); } } //return(0); } */ } extensions/soundspi/jorbis/src/com/jcraft/jogg/StreamState.java000066400000000000000000000436741335566474600253150ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jogg; public class StreamState{ byte[] body_data; /* bytes from packet bodies */ int body_storage; /* storage elements allocated */ int body_fill; /* elements stored; fill mark */ private int body_returned; /* elements of fill returned */ int[] lacing_vals; /* The values that will go to the segment table */ long[] granule_vals; /* pcm_pos values for headers. Not compact this way, but it is simple coupled to the lacing fifo */ int lacing_storage; int lacing_fill; int lacing_packet; int lacing_returned; byte[] header=new byte[282]; /* working space for header encode */ int header_fill; public int e_o_s; /* set when we have buffered the last packet in the logical bitstream */ int b_o_s; /* set after we've written the initial page of a logical bitstream */ int serialno; int pageno; long packetno; /* sequence number for decode; the framing knows where there's a hole in the data, but we need coupling so that the codec (which is in a seperate abstraction layer) also knows about the gap */ long granulepos; public StreamState(){ init(); } StreamState(int serialno){ this(); init(serialno); } void init(){ body_storage=16*1024; body_data=new byte[body_storage]; lacing_storage=1024; lacing_vals=new int[lacing_storage]; granule_vals=new long[lacing_storage]; } public void init(int serialno){ if(body_data==null){ init(); } else{ for(int i=0; i255?255:lacing_fill); int bytes=0; int acc=0; long granule_pos=granule_vals[0]; if(maxvals==0)return(0); /* construct a page */ /* decide how many segments to include */ /* If this is the initial header case, the first page must only include the initial header packet */ if(b_o_s==0){ /* 'initial header page' case */ granule_pos=0; for(vals=0;vals4096)break; acc+=(lacing_vals[vals]&0x0ff); granule_pos=granule_vals[vals]; } } /* construct the header in temp storage */ System.arraycopy("OggS".getBytes(), 0, header, 0, 4); /* stream structure version */ header[4]=0x00; /* continued packet flag? */ header[5]=0x00; if((lacing_vals[0]&0x100)==0)header[5]|=0x01; /* first page flag? */ if(b_o_s==0) header[5]|=0x02; /* last page flag? */ if(e_o_s!=0 && lacing_fill==vals) header[5]|=0x04; b_o_s=1; /* 64 bits of PCM position */ for(i=6;i<14;i++){ header[i]=(byte)granule_pos; granule_pos>>>=8; } /* 32 bits of stream serial number */ { int _serialno=serialno; for(i=14;i<18;i++){ header[i]=(byte)_serialno; _serialno>>>=8; } } /* 32 bits of page counter (we have both counter and page header because this val can roll over) */ if(pageno==-1)pageno=0; /* because someone called stream_reset; this would be a strange thing to do in an encode stream, but it has plausible uses */ { int _pageno=pageno++; for(i=18;i<22;i++){ header[i]=(byte)_pageno; _pageno>>>=8; } } /* zero for computation; filled in later */ header[22]=0; header[23]=0; header[24]=0; header[25]=0; /* segment table */ header[26]=(byte)vals; for(i=0;i>>=8; // } // // /* 32 bits of stream serial number */ // { // int serialn=serialno; // for(int i=14;i<18;i++){ // header[i]=(byte)serialn; // serialn>>>=8; // } // } // // ///* 32 bits of page counter (we have both counter and page header // because this val can roll over) */ // if(pageno==-1)pageno=0; /* because someone called // stream_reset; this would be a // strange thing to do in an // encode stream, but it has // plausible uses */ // { // int pagen=pageno++; // for(int i=18;i<22;i++){ // header[i]=(byte)pagen; // pagen>>>=8; // } // } // // /* zero for computation; filled in later */ // header[22]=0; // header[23]=0; // header[24]=0; // header[25]=0; // // /* segment table */ // header[26]=(byte)vals; // for(int i=0;i 4096 || /* 'page nominal size' case */ lacing_fill>=255 || /* 'segment table full' case */ (lacing_fill!=0&&b_o_s==0)){ /* 'initial header page' case */ return flush(og); } return 0; } public int eof(){ return e_o_s; } public int reset(){ body_fill=0; body_returned=0; lacing_fill=0; lacing_packet=0; lacing_returned=0; header_fill=0; e_o_s=0; b_o_s=0; pageno=-1; packetno=0; granulepos=0; return(0); } } extensions/soundspi/jorbis/src/com/jcraft/jogg/SyncState.java000066400000000000000000000164361335566474600247720ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jogg; // DECODING PRIMITIVES: packet streaming layer // This has two layers to place more of the multi-serialno and paging // control in the application's hands. First, we expose a data buffer // using ogg_decode_buffer(). The app either copies into the // buffer, or passes it directly to read(), etc. We then call // ogg_decode_wrote() to tell how many bytes we just added. // // Pages are returned (pointers into the buffer in ogg_sync_state) // by ogg_decode_stream(). The page is then submitted to // ogg_decode_page() along with the appropriate // ogg_stream_state* (ie, matching serialno). We then get raw // packets out calling ogg_stream_packet() with a // ogg_stream_state. See the 'frame-prog.txt' docs for details and // example code. public class SyncState{ public byte[] data; int storage; int fill; int returned; int unsynced; int headerbytes; int bodybytes; public int clear(){ data=null; return(0); } // !!!!!!!!!!!! // byte[] buffer(int size){ public int buffer(int size){ // first, clear out any space that has been previously returned if(returned!=0){ fill-=returned; if(fill>0){ System.arraycopy(data, returned, data, 0, fill); } returned=0; } if(size>storage-fill){ // We need to extend the internal buffer int newsize=size+fill+4096; // an extra page to be nice if(data!=null){ byte[] foo=new byte[newsize]; System.arraycopy(data, 0, foo, 0, data.length); data=foo; } else{ data=new byte[newsize]; } storage=newsize; } // expose a segment at least as large as requested at the fill mark // return((char *)oy->data+oy->fill); // return(data); return(fill); } public int wrote(int bytes){ if(fill+bytes>storage)return(-1); fill+=bytes; return(0); } // sync the stream. This is meant to be useful for finding page // boundaries. // // return values for this: // -n) skipped n bytes // 0) page not ready; more data (no bytes skipped) // n) page synced at current location; page length n bytes private Page pageseek=new Page(); private byte[] chksum=new byte[4]; public int pageseek(Page og){ int page=returned; int next; int bytes=fill-returned; if(headerbytes==0){ int _headerbytes,i; if(bytes<27)return(0); // not enough for a header /* verify capture pattern */ //!!!!!!!!!!! if(data[page]!='O' || data[page+1]!='g' || data[page+2]!='g' || data[page+3]!='S'){ headerbytes=0; bodybytes=0; // search for possible capture next=0; for(int ii=0; iibytes)return(0); // The whole test page is buffered. Verify the checksum synchronized(chksum){ // Grab the checksum bytes, set the header field to zero System.arraycopy(data, page+22, chksum, 0, 4); data[page+22]=0; data[page+23]=0; data[page+24]=0; data[page+25]=0; // set up a temp page struct and recompute the checksum Page log=pageseek; log.header_base=data; log.header=page; log.header_len=headerbytes; log.body_base=data; log.body=page+headerbytes; log.body_len=bodybytes; log.checksum(); // Compare if(chksum[0]!=data[page+22] || chksum[1]!=data[page+23] || chksum[2]!=data[page+24] || chksum[3]!=data[page+25]){ // D'oh. Mismatch! Corrupt page (or miscapture and not a page at all) // replace the computed checksum with the one actually read in System.arraycopy(chksum, 0, data, page+22, 4); // Bad checksum. Lose sync */ headerbytes=0; bodybytes=0; // search for possible capture next=0; for(int ii=0; ii0){ // have a page return(1); } if(ret==0){ // need more data return(0); } // head did not start a synced page... skipped some bytes if(unsynced==0){ unsynced=1; return(-1); } // loop. keep looking } } // clear things to an initial state. Good to call, eg, before seeking public int reset(){ fill=0; returned=0; unsynced=0; headerbytes=0; bodybytes=0; return(0); } public void init(){} public int getDataOffset(){ return returned; } public int getBufferOffset(){ return fill; } } extensions/soundspi/jorbis/src/com/jcraft/jorbis/000077500000000000000000000000001335566474600225425ustar00rootroot00000000000000extensions/soundspi/jorbis/src/com/jcraft/jorbis/AllocChain.java000066400000000000000000000020761335566474600254070ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; class AllocChain{ Object ptr; AllocChain next; }; extensions/soundspi/jorbis/src/com/jcraft/jorbis/Block.java000066400000000000000000000111041335566474600244340ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; public class Block{ ///necessary stream state for linking to the framing abstraction float[][] pcm=new float[0][]; // this is a pointer into local storage Buffer opb=new Buffer(); int lW; int W; int nW; int pcmend; int mode; int eofflag; long granulepos; long sequence; DspState vd; // For read-only access of configuration // local storage to avoid remallocing; it's up to the mapping to // structure it //byte[] localstore; //int localtop; //int localalloc; //int totaluse; //AllocChain reap; // bitmetrics for the frame int glue_bits; int time_bits; int floor_bits; int res_bits; public Block(DspState vd){ this.vd=vd; // localalloc=0; // localstore=null; if(vd.analysisp!=0){ opb.writeinit(); } } public void init(DspState vd){ this.vd=vd; } // int alloc(int bytes){ // bytes=(bytes+(8-1))&(~(8-1)); // if(bytes+localtop>localalloc){ // if(localstore!=null){ // AllocChain link=new AllocChain(); // totaluse+=localtop; // link.next=reap; // link.ptr=localstore; // reap=link; // } // // highly conservative // localalloc=bytes; // localstore=new byte[localalloc]; // localtop=0; // } // { // int foo=localtop; // //void *ret=(void *)(((char *)vb->localstore)+vb->localtop); // localtop+=bytes; // return foo; // } // } // reap the chain, pull the ripcord // void ripcord(){ // // reap the chain // while(reap!=null){ // AllocChain next=reap.next; // //free(reap->ptr); // reap.ptr=null; // //memset(reap,0,sizeof(struct alloc_chain)); // //free(reap); // reap=next; // } // // consolidate storage // if(totaluse!=0){ // //vb->localstore=realloc(vb->localstore,vb->totaluse+vb->localalloc); // byte[] foo=new byte[totaluse+localalloc]; // System.arraycopy(localstore, 0, foo, 0, localstore.length); // localstore=foo; // localalloc+=totaluse; // totaluse=0; // } // // pull the ripcord // localtop=0; // reap=null; // } public int clear(){ if(vd!=null){ if(vd.analysisp!=0){ opb.writeclear(); } } //ripcord(); //if(localstore!=null) // localstore=null; //memset(vb,0,sizeof(vorbis_block)); return(0); } public int synthesis(Packet op){ Info vi=vd.vi; // first things first. Make sure decode is ready // ripcord(); opb.readinit(op.packet_base, op.packet, op.bytes); // Check the packet type if(opb.read(1)!=0){ // Oops. This is not an audio data packet return(-1); } // read our mode and pre/post windowsize int _mode=opb.read(vd.modebits); if(_mode==-1)return(-1); mode=_mode; W=vi.mode_param[mode].blockflag; if(W!=0){ lW=opb.read(1); nW=opb.read(1); if(nW==-1) return(-1); } else{ lW=0; nW=0; } // more setup granulepos=op.granulepos; sequence=op.packetno-3; // first block is third packet eofflag=op.e_o_s; // alloc pcm passback storage pcmend=vi.blocksizes[W]; //pcm=alloc(vi.channels); if(pcm.length * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; class ChainingExample{ public static void main(String[] arg){ VorbisFile ov=null; try{ ov=new VorbisFile(System.in, null, -1); } catch(Exception e){ System.err.println(e); return; } if(ov.seekable()){ System.out.println("Input bitstream contained "+ov.streams()+" logical bitstream section(s)."); System.out.println("Total bitstream playing time: "+ov.time_total(-1)+" seconds\n"); } else{ System.out.println("Standard input was not seekable."); System.out.println("First logical bitstream information:\n"); } for(int i=0;i * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; class CodeBook{ int dim; // codebook dimensions (elements per vector) int entries; // codebook entries StaticCodeBook c=new StaticCodeBook(); float[] valuelist; // list of dim*entries actual entry values int[] codelist; // list of bitstream codewords for each entry DecodeAux decode_tree; // returns the number of bits int encode(int a, Buffer b){ b.write(codelist[a], c.lengthlist[a]); return(c.lengthlist[a]); } // One the encode side, our vector writers are each designed for a // specific purpose, and the encoder is not flexible without modification: // // The LSP vector coder uses a single stage nearest-match with no // interleave, so no step and no error return. This is specced by floor0 // and doesn't change. // // Residue0 encoding interleaves, uses multiple stages, and each stage // peels of a specific amount of resolution from a lattice (thus we want // to match by threshhold, not nearest match). Residue doesn't *have* to // be encoded that way, but to change it, one will need to add more // infrastructure on the encode side (decode side is specced and simpler) // floor0 LSP (single stage, non interleaved, nearest match) // returns entry number and *modifies a* to the quantization value int errorv(float[] a){ int best=best(a,1); for(int k=0;k8){ for(i=0;i.000001){ System.err.print("read ("+iv[i]+") != written ("+qv[i]+") at position ("+i+")\n"); System.exit(1); } } System.err.print("OK\n"); ptr++; } // The above is the trivial stuff; // now try unquantizing a log scale codebook } */ } class DecodeAux{ int[] tab; int[] tabl; int tabn; int[] ptr0; int[] ptr1; int aux; // number of tree entries } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Comment.java000066400000000000000000000143101335566474600250060ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; // the comments are not part of vorbis_info so that vorbis_info can be // static storage public class Comment{ private static byte[] _vorbis="vorbis".getBytes(); private static final int OV_EFAULT=-129; private static final int OV_EIMPL=-130; // unlimited user comment fields. libvorbis writes 'libvorbis' // whatever vendor is set to in encode public byte[][] user_comments; public int[] comment_lengths; public int comments; public byte[] vendor; public void init(){ user_comments=null; comments=0; vendor=null; } public void add(String comment){ add(comment.getBytes()); } private void add(byte[] comment){ byte[][] foo=new byte[comments+2][]; if(user_comments!=null){ System.arraycopy(user_comments, 0, foo, 0, comments); } user_comments=foo; int[] goo=new int[comments+2]; if(comment_lengths!=null){ System.arraycopy(comment_lengths, 0, goo, 0, comments); } comment_lengths=goo; byte[] bar=new byte[comment.length+1]; System.arraycopy(comment, 0, bar, 0, comment.length); user_comments[comments]=bar; comment_lengths[comments]=comment.length; comments++; user_comments[comments]=null; } public void add_tag(String tag, String contents){ if(contents==null) contents=""; add(tag+"="+contents); } /* private void add_tag(byte[] tag, byte[] contents){ byte[] foo=new byte[tag.length+contents.length+1]; int j=0; for(int i=0; i='A')u1=(byte)(u1-'A'+'a'); if(u2>='A')u2=(byte)(u2-'A'+'a'); if(u1!=u2){ return false; } c++; } return true; } public String query(String tag){ return query(tag, 0); } public String query(String tag, int count){ int foo=query(tag.getBytes(), count); if(foo==-1)return null; byte[] comment=user_comments[foo]; for(int i=0; i * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; // Takes a vorbis bitstream from stdin and writes raw stereo PCM to // stdout. Decodes simple and chained OggVorbis files from beginning // to end. Vorbisfile.a is somewhat more complex than the code below. class DecodeExample{ static int convsize=4096*2; static byte[] convbuffer=new byte[convsize]; // take 8k out of the data segment, not the stack public static void main(String[] arg){ java.io.InputStream input=System.in; if(arg.length>0){ try{ input=new java.io.FileInputStream(arg[0]); } catch(Exception e){ System.err.println(e); } } SyncState oy=new SyncState(); // sync and verify incoming physical bitstream StreamState os=new StreamState(); // take physical pages, weld into a logical stream of packets Page og=new Page(); // one Ogg bitstream page. Vorbis packets are inside Packet op=new Packet(); // one raw packet of data for decode Info vi=new Info(); // struct that stores all the static vorbis bitstream settings Comment vc=new Comment(); // struct that stores all the bitstream user comments DspState vd=new DspState(); // central working state for the packet->PCM decoder Block vb=new Block(vd); // local working space for packet->PCM decode byte[] buffer; int bytes=0; // Decode setup oy.init(); // Now we can read pages while(true){ // we repeat if the bitstream is chained int eos=0; // grab some data at the head of the stream. We want the first page // (which is guaranteed to be small and only contain the Vorbis // stream initial header) We need the first page to get the stream // serialno. // submit a 4k block to libvorbis' Ogg layer int index=oy.buffer(4096); buffer=oy.data; try{ bytes=input.read(buffer, index, 4096); } catch(Exception e){ System.err.println(e); System.exit(-1); } oy.wrote(bytes); // Get the first page. if(oy.pageout(og)!=1){ // have we simply run out of data? If so, we're done. if(bytes<4096)break; // error case. Must not be Vorbis data System.err.println("Input does not appear to be an Ogg bitstream."); System.exit(1); } // Get the serial number and set up the rest of decode. // serialno first; use it to set up a logical stream os.init(og.serialno()); // extract the initial header from the first page and verify that the // Ogg bitstream is in fact Vorbis data // I handle the initial header first instead of just having the code // read all three Vorbis headers at once because reading the initial // header is an easy way to identify a Vorbis bitstream and it's // useful to see that functionality seperated out. vi.init(); vc.init(); if(os.pagein(og)<0){ // error; stream version mismatch perhaps System.err.println("Error reading first page of Ogg bitstream data."); System.exit(1); } if(os.packetout(op)!=1){ // no page? must not be vorbis System.err.println("Error reading initial header packet."); System.exit(1); } if(vi.synthesis_headerin(vc,op)<0){ // error case; not a vorbis header System.err.println("This Ogg bitstream does not contain Vorbis audio data."); System.exit(1); } // At this point, we're sure we're Vorbis. We've set up the logical // (Ogg) bitstream decoder. Get the comment and codebook headers and // set up the Vorbis decoder // The next two packets in order are the comment and codebook headers. // They're likely large and may span multiple pages. Thus we reead // and submit data until we get our two pacakets, watching that no // pages are missing. If a page is missing, error out; losing a // header page is the only place where missing data is fatal. */ int i=0; while(i<2){ while(i<2){ int result=oy.pageout(og); if(result==0) break; // Need more data // Don't complain about missing or corrupt data yet. We'll // catch it at the packet output phase if(result==1){ os.pagein(og); // we can ignore any errors here // as they'll also become apparent // at packetout while(i<2){ result=os.packetout(op); if(result==0)break; if(result==-1){ // Uh oh; data at some point was corrupted or missing! // We can't tolerate that in a header. Die. System.err.println("Corrupt secondary header. Exiting."); System.exit(1); } vi.synthesis_headerin(vc,op); i++; } } } // no harm in not checking before adding more index=oy.buffer(4096); buffer=oy.data; try{ bytes=input.read(buffer, index, 4096); } catch(Exception e){ System.err.println(e); System.exit(1); } if(bytes==0 && i<2){ System.err.println("End of file before finding all Vorbis headers!"); System.exit(1); } oy.wrote(bytes); } // Throw the comments plus a few lines about the bitstream we're // decoding { byte[][] ptr=vc.user_comments; for(int j=0; jPCM decoder. vd.synthesis_init(vi); // central decode state vb.init(vd); // local state for most of the decode // so multiple block decodes can // proceed in parallel. We could init // multiple vorbis_block structures // for vd here float[][][] _pcm=new float[1][][]; int[] _index=new int[vi.channels]; // The rest is just a straight decode loop until end of stream while(eos==0){ while(eos==0){ int result=oy.pageout(og); if(result==0)break; // need more data if(result==-1){ // missing or corrupt data at this page position System.err.println("Corrupt or missing data in bitstream; continuing..."); } else{ os.pagein(og); // can safely ignore errors at // this point while(true){ result=os.packetout(op); if(result==0)break; // need more data if(result==-1){ // missing or corrupt data at this page position // no reason to complain; already complained above } else{ // we have a packet. Decode it int samples; if(vb.synthesis(op)==0){ // test for success! vd.synthesis_blockin(vb); } // **pcm is a multichannel float vector. In stereo, for // example, pcm[0] is left, and pcm[1] is right. samples is // the size of each channel. Convert the float values // (-1.<=range<=1.) to whatever PCM format and write it out while((samples=vd.synthesis_pcmout(_pcm, _index))>0){ float[][] pcm=_pcm[0]; boolean clipflag=false; int bout=(samples32767){ val=32767; clipflag=true; } if(val<-32768){ val=-32768; clipflag=true; } if(val<0) val=val|0x8000; convbuffer[ptr]=(byte)(val); convbuffer[ptr+1]=(byte)(val>>>8); ptr+=2*(vi.channels); } } //if(clipflag) // System.err.println("Clipping in frame "+vd.sequence); System.out.write(convbuffer, 0, 2*vi.channels*bout); vd.synthesis_read(bout); // tell libvorbis how // many samples we // actually consumed } } } if(og.eos()!=0)eos=1; } } if(eos==0){ index=oy.buffer(4096); buffer=oy.data; try{ bytes=input.read(buffer,index,4096); } catch(Exception e){ System.err.println(e); System.exit(1); } oy.wrote(bytes); if(bytes==0)eos=1; } } // clean up this logical bitstream; before exit we see if we're // followed by another [chained] os.clear(); // ogg_page and ogg_packet structs always point to storage in // libvorbis. They're never freed or manipulated directly vb.clear(); vd.clear(); vi.clear(); // must be called last } // OK, clean up the framer oy.clear(); System.err.println("Done."); } } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Drft.java000066400000000000000000000546741335566474600243240ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; class Drft{ int n; float[] trigcache; int[] splitcache; void backward(float[] data){ //System.err.println("Drft.backward"); if(n==1)return; drftb1(n,data,trigcache,trigcache,n,splitcache); } void init(int n){ //System.err.println("Drft.init"); this.n=n; trigcache=new float[3*n]; splitcache=new int[32]; fdrffti(n, trigcache, splitcache); } void clear(){ //System.err.println("Drft.clear"); if(trigcache!=null)trigcache=null; if(splitcache!=null)splitcache=null; // memset(l,0,sizeof(drft_lookup)); } static int[] ntryh = { 4,2,3,5 }; static float tpi = 6.28318530717958647692528676655900577f; static float hsqt2 = .70710678118654752440084436210485f; static float taui = .86602540378443864676372317075293618f; static float taur = -.5f; static float sqrt2 = 1.4142135623730950488016887242097f; static void drfti1(int n, float[] wa, int index, int[] ifac){ float arg,argh,argld,fi; int ntry=0,i,j=-1; int k1, l1, l2, ib; int ld, ii, ip, is, nq, nr; int ido, ipm, nfm1; int nl=n; int nf=0; int state=101; loop: while(true){ switch(state){ case 101: j++; if (j < 4) ntry=ntryh[j]; else ntry+=2; case 104: nq=nl/ntry; nr=nl-ntry*nq; if(nr!=0){ state=101; break; } nf++; ifac[nf+1]=ntry; nl=nq; if(ntry!=2){ state=107; break; } if(nf==1){ state=107; break; } for(i=1;i0){ // also handles the -1 out of data case int maxval=(1<m); for(int j=0; jn); for(int k=0; kn); return(0); } Object inverse1(Block vb, Object i, Object memo){ //System.err.println("Floor0.inverse "+i.getClass()+"]"); LookFloor0 look=(LookFloor0)i; InfoFloor0 info=look.vi; float[] lsp=null; if(memo instanceof float[]){ lsp=(float[])memo; } int ampraw=vb.opb.read(info.ampbits); if(ampraw>0){ // also handles the -1 out of data case int maxval=(1<n); for(int j=0; j>>=1; } return(ret); } static void lsp_to_lpc(float[] lsp, float[] lpc, int m){ int i,j,m2=m/2; float[] O=new float[m2]; float[] E=new float[m2]; float A; float[] Ae=new float[m2+1]; float[] Ao=new float[m2+1]; float B; float[] Be=new float[m2]; float[] Bo=new float[m2]; float temp; // even/odd roots setup for(i=0;im+1 must be less than l->ln, but guard in case we get a bad stream float[] lcurve=new float[Math.max(l.ln*2,l.m*2+2)]; if(amp==0){ //memset(curve,0,sizeof(float)*l->n); for(int j=0; j * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; class Floor1 extends FuncFloor{ static final int floor1_rangedb=140; static final int VIF_POSIT=63; void pack(Object i, Buffer opb){ InfoFloor1 info=(InfoFloor1)i; int count=0; int rangebits; int maxposit=info.postlist[1]; int maxclass=-1; /* save out partitions */ opb.write(info.partitions,5); /* only 0 to 31 legal */ for(int j=0;j=vi.books){ //goto err_out; info.free(); return(null); } for(int k=0;k<(1<=vi.books){ //goto err_out; info.free(); return(null); } } } /* read the post list */ info.mult=opb.read(2)+1; /* only 1,2,3,4 legal now */ rangebits=opb.read(4); for(int j=0,k=0;j=(1<info.postlist[sortpointer[k]]){ foo=sortpointer[k]; sortpointer[k]=sortpointer[j]; sortpointer[j]=foo; } } } /* points from sort order back to range number */ for(int j=0;j<_n;j++){ look.forward_index[j]=sortpointer[j]; } /* points from range order to sorted position */ for(int j=0;j<_n;j++){ look.reverse_index[look.forward_index[j]]=j; } /* we actually need the post values too */ for(int j=0;j<_n;j++){ look.sorted_index[j]=info.postlist[look.forward_index[j]]; } /* quantize values to multiplier spec */ switch(info.mult){ case 1: /* 1024 -> 256 */ look.quant_q=256; break; case 2: /* 1024 -> 128 */ look.quant_q=128; break; case 3: /* 1024 -> 86 */ look.quant_q=86; break; case 4: /* 1024 -> 64 */ look.quant_q=64; break; default: look.quant_q=-1; } /* discover our neighbors for decode where we don't use fit flags (that would push the neighbors outward) */ for(int j=0;j<_n-2;j++){ int lo=0; int hi=1; int lx=0; int hx=look.n; int currentx=info.postlist[j+2]; for(int k=0;klx && xcurrentx){ hi=k; hx=x; } } look.loneighbor[j]=lo; look.hineighbor[j]=hi; } return look; } void free_info(Object i){} void free_look(Object i){} void free_state(Object vs){} int forward(Block vb, Object i, float[] in, float[] out, Object vs){return 0;} Object inverse1(Block vb, Object ii, Object memo){ //System.err.println("Floor1.inverse "+i.getClass()+"]"); LookFloor1 look=(LookFloor1)ii; InfoFloor1 info=look.vi; CodeBook[] books=vb.vd.fullbooks; /* unpack wrapped/predicted values from stream */ if(vb.opb.read(1)==1){ int[] fit_value=null; if(memo instanceof int[]){ fit_value=(int[])memo; } if(fit_value==null || fit_value.length>>=csubbits; if(book>=0){ if((fit_value[j+k]=books[book].decode(vb.opb))==-1){ //goto eop; return(null); } } else{ fit_value[j+k]=0; } } j+=cdim; } /* unwrap positive values and reconsitute via linear interpolation */ for(int i=2;i=room){ if(hiroom>loroom){ val = val-loroom; } else{ val = -1-(val-hiroom); } } else{ if((val&1)!=0){ val= -((val+1)>>>1); } else{ val>>=1; } } fit_value[i]=val+predicted; fit_value[look.loneighbor[i-2]]&=0x7fff; fit_value[look.hineighbor[i-2]]&=0x7fff; } else{ fit_value[i]=predicted|0x8000; } } return(fit_value); } // eop: // return(NULL); return(null); } private static int render_point(int x0,int x1,int y0,int y1,int x){ y0&=0x7fff; /* mask off flag */ y1&=0x7fff; { int dy=y1-y0; int adx=x1-x0; int ady=Math.abs(dy); int err=ady*(x-x0); int off=(int)(err/adx); if(dy<0)return(y0-off); return(y0+off); } } int inverse2(Block vb, Object i, Object memo, float[] out){ LookFloor1 look=(LookFloor1)i; InfoFloor1 info=look.vi; int n=vb.vd.vi.blocksizes[vb.mode]/2; if(memo!=null){ /* render the lines */ int[] fit_value=(int[] )memo; int hx=0; int lx=0; int ly=fit_value[0]*info.mult; for(int j=1;j=adx){ err-=adx; y+=sy; } else{ y+=base; } d[x]*=FLOOR_fromdB_LOOKUP[y]; } } static int ilog(int v){ int ret=0; while(v!=0){ ret++; v>>>=1; } return(ret); } private static int ilog2(int v){ int ret=0; while(v>1){ ret++; v>>>=1; } return(ret); } } class InfoFloor1{ static final int VIF_POSIT=63; static final int VIF_CLASS=16; static final int VIF_PARTS=31; int partitions; /* 0 to 31 */ int[] partitionclass=new int[VIF_PARTS]; /* 0 to 15 */ int[] class_dim=new int[VIF_CLASS]; /* 1 to 8 */ int[] class_subs=new int[VIF_CLASS]; /* 0,1,2,3 (bits: 1< * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; abstract class FuncFloor{ // public static FuncFloor[] floor_P={new Floor0()}; public static FuncFloor[] floor_P={new Floor0(),new Floor1()}; abstract void pack(Object i, Buffer opb); abstract Object unpack(Info vi, Buffer opb); abstract Object look(DspState vd, InfoMode mi, Object i); // abstract Object state(Object i); abstract void free_info(Object i); abstract void free_look(Object i); abstract void free_state(Object vs); abstract int forward(Block vb, Object i, float[] in, float[] out, Object vs); // abstract int inverse(Block vb, Object i, float[] out); abstract Object inverse1(Block vb, Object i, Object memo); abstract int inverse2(Block vb, Object i, Object memo, float[] out); } extensions/soundspi/jorbis/src/com/jcraft/jorbis/FuncMapping.java000066400000000000000000000027271335566474600256240ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; abstract class FuncMapping{ public static FuncMapping[] mapping_P={new Mapping0()}; abstract void pack(Info info , Object imap, Buffer buffer); abstract Object unpack(Info info , Buffer buffer); abstract Object look(DspState vd, InfoMode vm, Object m); abstract void free_info(Object imap); abstract void free_look(Object imap); // abstract int forward(Block vd, Object lm); abstract int inverse(Block vd, Object lm); } extensions/soundspi/jorbis/src/com/jcraft/jorbis/FuncResidue.java000066400000000000000000000031411335566474600256200ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; abstract class FuncResidue{ public static FuncResidue[] residue_P={new Residue0(), new Residue1(), new Residue2()}; abstract void pack(Object vr, Buffer opb); abstract Object unpack(Info vi, Buffer opb); abstract Object look(DspState vd, InfoMode vm, Object vr); abstract void free_info(Object i); abstract void free_look(Object i); abstract int forward(Block vb,Object vl, float[][] in, int ch); // abstract int inverse(Block vb, Object vl, float[][] in, int ch); abstract int inverse(Block vb, Object vl, float[][] in, int[] nonzero,int ch); } extensions/soundspi/jorbis/src/com/jcraft/jorbis/FuncTime.java000066400000000000000000000027031335566474600251210ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; abstract class FuncTime{ public static FuncTime[] time_P={new Time0()}; abstract void pack(Object i, Buffer opb); abstract Object unpack(Info vi , Buffer opb); abstract Object look(DspState vd, InfoMode vm, Object i); abstract void free_info(Object i); abstract void free_look(Object i); abstract int forward(Block vb, Object i); abstract int inverse(Block vb, Object i, float[] in, float[] out); } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Info.java000066400000000000000000000321511335566474600243020ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; public class Info{ private static final int OV_EBADPACKET=-136; private static final int OV_ENOTAUDIO=-135; private static byte[] _vorbis="vorbis".getBytes(); private static final int VI_TIMEB=1; // private static final int VI_FLOORB=1; private static final int VI_FLOORB=2; // private static final int VI_RESB=1; private static final int VI_RESB=3; private static final int VI_MAPB=1; private static final int VI_WINDOWB=1; public int version; public int channels; public int rate; // The below bitrate declarations are *hints*. // Combinations of the three values carry the following implications: // // all three set to the same value: // implies a fixed rate bitstream // only nominal set: // implies a VBR stream that averages the nominal bitrate. No hard // upper/lower limit // upper and or lower set: // implies a VBR bitstream that obeys the bitrate limits. nominal // may also be set to give a nominal rate. // none set: // the coder does not care to speculate. int bitrate_upper; int bitrate_nominal; int bitrate_lower; // Vorbis supports only short and long blocks, but allows the // encoder to choose the sizes int[] blocksizes=new int[2]; // modes are the primary means of supporting on-the-fly different // blocksizes, different channel mappings (LR or mid-side), // different residue backends, etc. Each mode consists of a // blocksize flag and a mapping (along with the mapping setup int modes; int maps; int times; int floors; int residues; int books; int psys; // encode only InfoMode[] mode_param=null; int[] map_type=null; Object[] map_param=null; int[] time_type=null; Object[] time_param=null; int[] floor_type=null; Object[] floor_param=null; int[] residue_type=null; Object[] residue_param=null; StaticCodeBook[] book_param=null; PsyInfo[] psy_param=new PsyInfo[64]; // encode only // for block long/sort tuning; encode only int envelopesa; float preecho_thresh; float preecho_clamp; // used by synthesis, which has a full, alloced vi public void init(){ rate=0; //memset(vi,0,sizeof(vorbis_info)); } public void clear(){ for(int i=0;ibook_param)free(vi->book_param); book_param=null; for(int i=0;ipsy_param)free(vi->psy_param); //memset(vi,0,sizeof(vorbis_info)); } // Header packing/unpacking int unpack_info(Buffer opb){ version=opb.read(32); if(version!=0)return(-1); channels=opb.read(8); rate=opb.read(32); bitrate_upper=opb.read(32); bitrate_nominal=opb.read(32); bitrate_lower=opb.read(32); blocksizes[0]=1<=VI_TIMEB){ //goto err_out; clear(); return(-1); } time_param[i]=FuncTime.time_P[time_type[i]].unpack(this, opb); if(time_param[i]==null){ //goto err_out; clear(); return(-1); } } // floor backend settings floors=opb.read(6)+1; if(floor_type==null || floor_type.length!=floors) floor_type=new int[floors]; if(floor_param==null || floor_param.length!=floors) floor_param=new Object[floors]; for(int i=0;i=VI_FLOORB){ //goto err_out; clear(); return(-1); } floor_param[i]=FuncFloor.floor_P[floor_type[i]].unpack(this,opb); if(floor_param[i]==null){ //goto err_out; clear(); return(-1); } } // residue backend settings residues=opb.read(6)+1; if(residue_type==null || residue_type.length!=residues) residue_type=new int[residues]; if(residue_param==null || residue_param.length!=residues) residue_param=new Object[residues]; for(int i=0;i=VI_RESB){ // goto err_out; clear(); return(-1); } residue_param[i]=FuncResidue.residue_P[residue_type[i]].unpack(this,opb); if(residue_param[i]==null){ // goto err_out; clear(); return(-1); } } // map backend settings maps=opb.read(6)+1; if(map_type==null || map_type.length!=maps) map_type=new int[maps]; if(map_param==null || map_param.length!=maps) map_param=new Object[maps]; for(int i=0;i=VI_MAPB){ // goto err_out; clear(); return(-1); } map_param[i]=FuncMapping.mapping_P[map_type[i]].unpack(this,opb); if(map_param[i]==null){ // goto err_out; clear(); return(-1); } } // mode settings modes=opb.read(6)+1; if(mode_param==null || mode_param.length!=modes) mode_param=new InfoMode[modes]; for(int i=0;i=VI_WINDOWB)|| (mode_param[i].transformtype>=VI_WINDOWB)|| (mode_param[i].mapping>=maps)){ // goto err_out; clear(); return(-1); } } if(opb.read(1)!=1){ //goto err_out; // top level EOP check clear(); return(-1); } return(0); // err_out: // vorbis_info_clear(vi); // return(-1); } // The Vorbis header is in three packets; the initial small packet in // the first page that identifies basic parameters, a second packet // with bitstream comments and a third packet that holds the // codebook. public int synthesis_headerin(Comment vc, Packet op){ Buffer opb=new Buffer(); if(op!=null){ opb.readinit(op.packet_base, op.packet, op.bytes); // Which of the three types of header is this? // Also verify header-ness, vorbis { byte[] buffer=new byte[6]; int packtype=opb.read(8); //memset(buffer,0,6); opb.read(buffer,6); if(buffer[0]!='v' || buffer[1]!='o' || buffer[2]!='r' || buffer[3]!='b' || buffer[4]!='i' || buffer[5]!='s'){ // not a vorbis header return(-1); } switch(packtype){ case 0x01: // least significant *bit* is read first if(op.b_o_s==0){ // Not the initial packet return(-1); } if(rate!=0){ // previously initialized info header return(-1); } return(unpack_info(opb)); case 0x03: // least significant *bit* is read first if(rate==0){ // um... we didn't get the initial header return(-1); } return(vc.unpack(opb)); case 0x05: // least significant *bit* is read first if(rate==0 || vc.vendor==null){ // um... we didn;t get the initial header or comments yet return(-1); } return(unpack_books(opb)); default: // Not a valid vorbis header type //return(-1); break; } } } return(-1); } // pack side int pack_info(Buffer opb){ // preamble opb.write(0x01,8); opb.write(_vorbis); // basic information about the stream opb.write(0x00,32); opb.write(channels,8); opb.write(rate,32); opb.write(bitrate_upper,32); opb.write(bitrate_nominal,32); opb.write(bitrate_lower,32); opb.write(ilog2(blocksizes[0]),4); opb.write(ilog2(blocksizes[1]),4); opb.write(1,1); return(0); } int pack_books(Buffer opb){ opb.write(0x05,8); opb.write(_vorbis); // books opb.write(books-1,8); for(int i=0;icodec_setup; Buffer opb=new Buffer(); // synchronized(opb_blocksize){ int mode; opb.readinit(op.packet_base, op.packet, op.bytes); /* Check the packet type */ if(opb.read(1)!=0){ /* Oops. This is not an audio data packet */ return(OV_ENOTAUDIO); } { int modebits=0; int v=modes; while(v>1){ modebits++; v>>>=1; } /* read our mode and pre/post windowsize */ mode=opb.read(modebits); } if(mode==-1)return(OV_EBADPACKET); return(blocksizes[mode_param[mode].blockflag]); // } } private static int ilog2(int v){ int ret=0; while(v>1){ ret++; v>>>=1; } return(ret); } public String toString(){ return "version:"+new Integer(version)+ ", channels:"+new Integer(channels)+ ", rate:"+new Integer(rate)+ ", bitrate:"+new Integer(bitrate_upper)+","+ new Integer(bitrate_nominal)+","+ new Integer(bitrate_lower); } } extensions/soundspi/jorbis/src/com/jcraft/jorbis/InfoMode.java000066400000000000000000000021411335566474600251030ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; class InfoMode{ int blockflag; int windowtype; int transformtype; int mapping; } extensions/soundspi/jorbis/src/com/jcraft/jorbis/JOrbisException.java000066400000000000000000000022561335566474600264610ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; public class JOrbisException extends Exception { public JOrbisException () { super(); } public JOrbisException (String s) { super ("JOrbis: "+s); } } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Lookup.java000066400000000000000000000172701335566474600246650ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; class Lookup{ static final int COS_LOOKUP_SZ=128; static final float[] COS_LOOKUP={ +1.0000000000000f,+0.9996988186962f,+0.9987954562052f,+0.9972904566787f, +0.9951847266722f,+0.9924795345987f,+0.9891765099648f,+0.9852776423889f, +0.9807852804032f,+0.9757021300385f,+0.9700312531945f,+0.9637760657954f, +0.9569403357322f,+0.9495281805930f,+0.9415440651830f,+0.9329927988347f, +0.9238795325113f,+0.9142097557035f,+0.9039892931234f,+0.8932243011955f, +0.8819212643484f,+0.8700869911087f,+0.8577286100003f,+0.8448535652497f, +0.8314696123025f,+0.8175848131516f,+0.8032075314806f,+0.7883464276266f, +0.7730104533627f,+0.7572088465065f,+0.7409511253550f,+0.7242470829515f, +0.7071067811865f,+0.6895405447371f,+0.6715589548470f,+0.6531728429538f, +0.6343932841636f,+0.6152315905806f,+0.5956993044924f,+0.5758081914178f, +0.5555702330196f,+0.5349976198871f,+0.5141027441932f,+0.4928981922298f, +0.4713967368260f,+0.4496113296546f,+0.4275550934303f,+0.4052413140050f, +0.3826834323651f,+0.3598950365350f,+0.3368898533922f,+0.3136817403989f, +0.2902846772545f,+0.2667127574749f,+0.2429801799033f,+0.2191012401569f, +0.1950903220161f,+0.1709618887603f,+0.1467304744554f,+0.1224106751992f, +0.0980171403296f,+0.0735645635997f,+0.0490676743274f,+0.0245412285229f, +0.0000000000000f,-0.0245412285229f,-0.0490676743274f,-0.0735645635997f, -0.0980171403296f,-0.1224106751992f,-0.1467304744554f,-0.1709618887603f, -0.1950903220161f,-0.2191012401569f,-0.2429801799033f,-0.2667127574749f, -0.2902846772545f,-0.3136817403989f,-0.3368898533922f,-0.3598950365350f, -0.3826834323651f,-0.4052413140050f,-0.4275550934303f,-0.4496113296546f, -0.4713967368260f,-0.4928981922298f,-0.5141027441932f,-0.5349976198871f, -0.5555702330196f,-0.5758081914178f,-0.5956993044924f,-0.6152315905806f, -0.6343932841636f,-0.6531728429538f,-0.6715589548470f,-0.6895405447371f, -0.7071067811865f,-0.7242470829515f,-0.7409511253550f,-0.7572088465065f, -0.7730104533627f,-0.7883464276266f,-0.8032075314806f,-0.8175848131516f, -0.8314696123025f,-0.8448535652497f,-0.8577286100003f,-0.8700869911087f, -0.8819212643484f,-0.8932243011955f,-0.9039892931234f,-0.9142097557035f, -0.9238795325113f,-0.9329927988347f,-0.9415440651830f,-0.9495281805930f, -0.9569403357322f,-0.9637760657954f,-0.9700312531945f,-0.9757021300385f, -0.9807852804032f,-0.9852776423889f,-0.9891765099648f,-0.9924795345987f, -0.9951847266722f,-0.9972904566787f,-0.9987954562052f,-0.9996988186962f, -1.0000000000000f, }; /* interpolated lookup based cos function, domain 0 to PI only */ static float coslook(float a){ double d=a*(.31830989*(float)COS_LOOKUP_SZ); int i=(int)d; return COS_LOOKUP[i]+ ((float)(d-i))*(COS_LOOKUP[i+1]-COS_LOOKUP[i]); } static final int INVSQ_LOOKUP_SZ=32; static final float[] INVSQ_LOOKUP={ 1.414213562373f,1.392621247646f,1.371988681140f,1.352246807566f, 1.333333333333f,1.315191898443f,1.297771369046f,1.281025230441f, 1.264911064067f,1.249390095109f,1.234426799697f,1.219988562661f, 1.206045378311f,1.192569588000f,1.179535649239f,1.166919931983f, 1.154700538379f,1.142857142857f,1.131370849898f,1.120224067222f, 1.109400392450f,1.098884511590f,1.088662107904f,1.078719779941f, 1.069044967650f,1.059625885652f,1.050451462878f,1.041511287847f, 1.032795558989f,1.024295039463f,1.016001016002f,1.007905261358f, 1.000000000000f, }; /* interpolated 1./sqrt(p) where .5 <= p < 1. */ static float invsqlook(float a){ // System.out.println(a); double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ; int i=(int)d; return INVSQ_LOOKUP[i]+ ((float)(d-i))*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]); } static final int INVSQ2EXP_LOOKUP_MIN=-32; static final int INVSQ2EXP_LOOKUP_MAX=32; static final float[] INVSQ2EXP_LOOKUP={ 65536.f, 46340.95001f, 32768.f, 23170.47501f, 16384.f, 11585.2375f, 8192.f, 5792.618751f, 4096.f, 2896.309376f, 2048.f, 1448.154688f, 1024.f, 724.0773439f, 512.f, 362.038672f, 256.f, 181.019336f, 128.f, 90.50966799f, 64.f, 45.254834f, 32.f, 22.627417f, 16.f, 11.3137085f, 8.f, 5.656854249f, 4.f, 2.828427125f, 2.f, 1.414213562f, 1.f, 0.7071067812f, 0.5f, 0.3535533906f, 0.25f, 0.1767766953f, 0.125f, 0.08838834765f, 0.0625f, 0.04419417382f, 0.03125f, 0.02209708691f, 0.015625f, 0.01104854346f, 0.0078125f, 0.005524271728f, 0.00390625f, 0.002762135864f, 0.001953125f, 0.001381067932f, 0.0009765625f, 0.000690533966f, 0.00048828125f, 0.000345266983f, 0.000244140625f,0.0001726334915f,0.0001220703125f,8.631674575e-05f, 6.103515625e-05f,4.315837288e-05f,3.051757812e-05f,2.157918644e-05f, 1.525878906e-05f, }; /* interpolated 1./sqrt(p) where .5 <= p < 1. */ static float invsq2explook(int a){ return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN]; } static final int FROMdB_LOOKUP_SZ=35; static final int FROMdB2_LOOKUP_SZ=32; static final int FROMdB_SHIFT=5; static final int FROMdB2_SHIFT=3; static final int FROMdB2_MASK=31; static final float[] FROMdB_LOOKUP={ 1.f, 0.6309573445f, 0.3981071706f, 0.2511886432f, 0.1584893192f, 0.1f, 0.06309573445f, 0.03981071706f, 0.02511886432f, 0.01584893192f, 0.01f, 0.006309573445f, 0.003981071706f, 0.002511886432f, 0.001584893192f, 0.001f, 0.0006309573445f,0.0003981071706f,0.0002511886432f,0.0001584893192f, 0.0001f,6.309573445e-05f,3.981071706e-05f,2.511886432e-05f, 1.584893192e-05f, 1e-05f,6.309573445e-06f,3.981071706e-06f, 2.511886432e-06f,1.584893192e-06f, 1e-06f,6.309573445e-07f, 3.981071706e-07f,2.511886432e-07f,1.584893192e-07f, }; static final float[] FROMdB2_LOOKUP={ 0.9928302478f, 0.9786445908f, 0.9646616199f, 0.9508784391f, 0.9372921937f, 0.92390007f, 0.9106992942f, 0.8976871324f, 0.8848608897f, 0.8722179097f, 0.8597555737f, 0.8474713009f, 0.835362547f, 0.8234268041f, 0.8116616003f, 0.8000644989f, 0.7886330981f, 0.7773650302f, 0.7662579617f, 0.755309592f, 0.7445176537f, 0.7338799116f, 0.7233941627f, 0.7130582353f, 0.7028699885f, 0.6928273125f, 0.6829281272f, 0.6731703824f, 0.6635520573f, 0.6540711597f, 0.6447257262f, 0.6355138211f, }; /* interpolated lookup based fromdB function, domain -140dB to 0dB only */ static float fromdBlook(float a){ int i=(int)(a*((float)(-(1<=(FROMdB_LOOKUP_SZ<>>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); } } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Lpc.java000066400000000000000000000136101335566474600241240ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; class Lpc{ // en/decode lookups Drft fft=new Drft();; int ln; int m; // Autocorrelation LPC coeff generation algorithm invented by // N. Levinson in 1947, modified by J. Durbin in 1959. // Input : n elements of time doamin data // Output: m lpc coefficients, excitation energy static float lpc_from_data(float[] data, float[] lpc,int n,int m){ float[] aut=new float[m+1]; float error; int i,j; // autocorrelation, p+1 lag coefficients j=m+1; while(j--!=0){ float d=0; for(i=j;iln*2); for(int i=0; i * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; /* function: LSP (also called LSF) conversion routines The LSP generation code is taken (with minimal modification) from "On the Computation of the LSP Frequencies" by Joseph Rothweiler , available at: http://www2.xtdl.com/~rothwlr/lsfpaper/lsfpage.html ********************************************************************/ class Lsp{ static final float M_PI=(float)(3.1415926539); static void lsp_to_curve(float[] curve, int[] map, int n, int ln, float[] lsp, int m, float amp, float ampoffset){ int i; float wdel=M_PI/ln; for(i=0;i>>1; for(int j=0;j=0x7f800000||(ix==0)){ // 0,inf,nan } else{ if(ix<0x00800000){ // subnormal q*=3.3554432000e+07; // 0x4c000000 hx=Float.floatToIntBits(q); ix=0x7fffffff&hx; qexp=-25; } qexp += ((ix>>>23)-126); hx=(hx&0x807fffff)|0x3f000000; q=Float.intBitsToFloat(hx); } q=Lookup.fromdBlook(amp* Lookup.invsqlook(q)* Lookup.invsq2explook(qexp+m)-ampoffset); do{curve[i++]*=q;} // do{curve[i++]=q;} while(i * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; class Mapping0 extends FuncMapping{ static int seq=0; void free_info(Object imap){}; void free_look(Object imap){ /* LookMapping0 l=(LookMapping0)imap; InfoMapping0 info=l.map; if(l!=null){ for(int i=0;idecay[i]); l.decay[i]=null; } //free(l->decay); l.decay=null; } //free(l->time_func); //free(l->floor_func); //free(l->residue_func); //free(l->time_look); //free(l->floor_look); //free(l->residue_look); //f(l->psy_look)free(l->psy_look); l.time_func=null; l.floor_func=null; l.residue_func=null; l.time_look=null; l.floor_look=null; l.residue_look=null; //memset(l,0,sizeof(vorbis_look_mapping0)); //free(l); */ } Object look(DspState vd, InfoMode vm, Object m){ //System.err.println("Mapping0.look"); Info vi=vd.vi; LookMapping0 look=new LookMapping0(); InfoMapping0 info=look.map=(InfoMapping0)m; look.mode=vm; look.time_look=new Object[info.submaps]; look.floor_look=new Object[info.submaps]; look.residue_look=new Object[info.submaps]; /* if(vd.analysisp!=0){ look.floor_state=new Object[vi.channels]; } if(vi.psys!=0){ look.psy_look=new PsyLook[info.submaps]; for(int i=0; ipsy[0] != info->psy[1]){ int psynum=info->psy[0]; look->psy_look[0]=_ogg_calloc(1,sizeof(vorbis_look_psy)); _vp_psy_init(look->psy_look[0],ci->psy_param[psynum], ci->psy_g_param, ci->blocksizes[vm->blockflag]/2,vi->rate); psynum=info->psy[1]; look->psy_look[1]=_ogg_calloc(1,sizeof(vorbis_look_psy)); _vp_psy_init(look->psy_look[1],ci->psy_param[psynum], ci->psy_g_param, ci->blocksizes[vm->blockflag]/2,vi->rate); }else{ int psynum=info->psy[0]; look->psy_look[0]=_ogg_calloc(1,sizeof(vorbis_look_psy)); look->psy_look[1]=look->psy_look[0]; _vp_psy_init(look->psy_look[0],ci->psy_param[psynum], ci->psy_g_param, ci->blocksizes[vm->blockflag]/2,vi->rate); } */ } look.ch=vi.channels; // if(vd->analysisp)drft_init(&look->fft_look,ci->blocksizes[vm->blockflag]); return(look); //return null; } void pack(Info vi, Object imap, Buffer opb){ InfoMapping0 info=(InfoMapping0)imap; /* another 'we meant to do it this way' hack... up to beta 4, we packed 4 binary zeros here to signify one submapping in use. We now redefine that to mean four bitflags that indicate use of deeper features; bit0:submappings, bit1:coupling, bit2,3:reserved. This is backward compatable with all actual uses of the beta code. */ if(info.submaps>1){ opb.write(1,1); opb.write(info.submaps-1,4); } else{ opb.write(0,1); } if(info.coupling_steps>0){ opb.write(1,1); opb.write(info.coupling_steps-1,8); for(int i=0;i1){ for(int i=0;i=vi.channels || testA>=vi.channels){ //goto err_out; info.free(); return(null); } } } if(opb.read(2)>0){ /* 2,3:reserved */ //goto err_out; info.free(); return(null); } if(info.submaps>1){ for(int i=0;i=info.submaps){ //goto err_out; info.free(); return(null); } } } for(int i=0;i=vi.times){ //goto err_out; info.free(); return(null); } info.floorsubmap[i]=opb.read(8); if(info.floorsubmap[i]>=vi.floors){ //goto err_out; info.free(); return(null); } info.residuesubmap[i]=opb.read(8); if(info.residuesubmap[i]>=vi.residues){ //goto err_out; info.free(); return(null); } } return info; //err_out: //free_info(info); //return(NULL); } /* // no time mapping implementation for now static int seq=0; int forward(Block vb, Object l){ DspState vd=vb.vd; Info vi=vd.vi; LookMapping0 look=(LookMapping0)l; InfoMapping0 info=look.map; InfoMode mode=look.mode; int n=vb.pcmend; float[] window=vd.window[vb.W][vb.lW][vb.nW][mode.windowtype]; float[][] pcmbundle=new float[vi.channles][]; int[] nonzero=new int[vi.channels]; // time domain pre-window: NONE IMPLEMENTED // window the PCM data: takes PCM vector, vb; modifies PCM vector for(int i=0;isequence) // memset(decay,0,n*sizeof(float)/2); // perform psychoacoustics; do masking _vp_compute_mask(look.psy_look[submap],pcm,floor,decay); _analysis_output("mdct",seq,pcm,n/2,0,1); _analysis_output("lmdct",seq,pcm,n/2,0,0); _analysis_output("prefloor",seq,floor,n/2,0,1); // perform floor encoding nonzero[i]=look.floor_func[submap]. forward(vb,look.floor_look[submap],floor,floor,look.floor_state[i]); _analysis_output("floor",seq,floor,n/2,0,1); // apply the floor, do optional noise levelling _vp_apply_floor(look->psy_look+submap,pcm,floor); _analysis_output("res",seq++,pcm,n/2,0,0); } // perform residue encoding with residue mapping; this is // multiplexed. All the channels belonging to one submap are // encoded (values interleaved), then the next submap, etc for(int i=0;i=0;i--){ float[] pcmM=vb.pcm[info.coupling_mag[i]]; float[] pcmA=vb.pcm[info.coupling_ang[i]]; for(int j=0;j0){ if(ang>0){ pcmM[j]=mag; pcmA[j]=mag-ang; } else{ pcmA[j]=mag; pcmM[j]=mag+ang; } } else{ if(ang>0){ pcmM[j]=mag; pcmA[j]=mag+ang; } else{ pcmA[j]=mag; pcmM[j]=mag-ang; } } } } // /* compute and apply spectral envelope */ for(int i=0;i1){ ret++; v>>>=1; } return(ret); } } class InfoMapping0{ int submaps; // <= 16 int[] chmuxlist=new int[256]; // up to 256 channels in a Vorbis stream int[] timesubmap=new int[16]; // [mux] int[] floorsubmap=new int[16]; // [mux] submap to floors int[] residuesubmap=new int[16];// [mux] submap to residue int[] psysubmap=new int[16]; // [mux]; encode only int coupling_steps; int[] coupling_mag=new int[256]; int[] coupling_ang=new int[256]; void free(){ chmuxlist=null; timesubmap=null; floorsubmap=null; residuesubmap=null; psysubmap=null; coupling_mag=null; coupling_ang=null; } } class LookMapping0{ InfoMode mode; InfoMapping0 map; Object[] time_look; Object[] floor_look; Object[] floor_state; Object[] residue_look; PsyLook[] psy_look; FuncTime[] time_func; FuncFloor[] floor_func; FuncResidue[] residue_func; int ch; float[][] decay; int lastframe; // if a different mode is called, we need to // invalidate decay and floor state } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Mdct.java000066400000000000000000000117511335566474600243010ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; class Mdct{ static private final float cPI3_8=0.38268343236508977175f; static private final float cPI2_8=0.70710678118654752441f; static private final float cPI1_8=0.92387953251128675613f; int n; int log2n; float[] trig; int[] bitrev; float scale; void init(int n){ bitrev=new int[n/4]; trig=new float[n+n/4]; int n2=n>>>1; log2n=(int)Math.rint(Math.log(n)/Math.log(2)); this.n=n; int AE=0; int AO=1; int BE=AE+n/2; int BO=BE+1; int CE=BE+n/2; int CO=CE+1; // trig lookups... for(int i=0;i>>j!=0;j++) if(((msb>>>j)&i)!=0)acc|=1<>>1; int n4=n>>>2; int n8=n>>>3; // rotate + step 1 { int inO=1; int xO=0; int A=n2; int i; for(i=0;i>>(i+2); int k1=1<<(i+3); int wbase=n2-2; A=0; float[] temp; for(int r=0;r<(k0>>>2);r++){ int w1=wbase; w2=w1-(k0>>1); float AEv= trig[A],wA; float AOv= trig[A+1],wB; wbase-=2; k0++; for(int s=0;s<(2< * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; // psychoacoustic setup class PsyInfo{ int athp; int decayp; int smoothp; int noisefitp; int noisefit_subblock; float noisefit_threshdB; float ath_att; int tonemaskp; float[] toneatt_125Hz=new float[5]; float[] toneatt_250Hz=new float[5]; float[] toneatt_500Hz=new float[5]; float[] toneatt_1000Hz=new float[5]; float[] toneatt_2000Hz=new float[5]; float[] toneatt_4000Hz=new float[5]; float[] toneatt_8000Hz=new float[5]; int peakattp; float[] peakatt_125Hz=new float[5]; float[] peakatt_250Hz=new float[5]; float[] peakatt_500Hz=new float[5]; float[] peakatt_1000Hz=new float[5]; float[] peakatt_2000Hz=new float[5]; float[] peakatt_4000Hz=new float[5]; float[] peakatt_8000Hz=new float[5]; int noisemaskp; float[] noiseatt_125Hz=new float[5]; float[] noiseatt_250Hz=new float[5]; float[] noiseatt_500Hz=new float[5]; float[] noiseatt_1000Hz=new float[5]; float[] noiseatt_2000Hz=new float[5]; float[] noiseatt_4000Hz=new float[5]; float[] noiseatt_8000Hz=new float[5]; float max_curve_dB; float attack_coeff; float decay_coeff; void free(){} } extensions/soundspi/jorbis/src/com/jcraft/jorbis/PsyLook.java000066400000000000000000000171031335566474600250070ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; class PsyLook { int n; PsyInfo vi; float[][][] tonecurves; float[][] peakatt; float[][][] noisecurves; float[] ath; int[] octave; void init(PsyInfo vi, int n, int rate){ /* float rate2=rate/2.; //memset(p,0,sizeof(vorbis_look_psy)); ath=new float[n]; octave=new int[n]; this.vi=vi; this.n=n; // set up the lookups for a given blocksize and sample rate // Vorbis max sample rate is limited by 26 Bark (54kHz) set_curve(ATH_Bark_dB, ath,n,rate); for(int i=0;i12)oc=12; octave[i]=oc; } tonecurves=malloc(13*sizeof(float **)); noisecurves=malloc(13*sizeof(float **)); peakatt=malloc(7*sizeof(float *)); for(int i=0;i<13;i++){ tonecurves[i]=malloc(9*sizeof(float *)); noisecurves[i]=malloc(9*sizeof(float *)); } for(i=0;i<7;i++) peakatt[i]=malloc(5*sizeof(float)); for(i=0;i<13;i++){ for(j=0;j<9;j++){ tonecurves[i][j]=malloc(EHMER_MAX*sizeof(float)); noisecurves[i][j]=malloc(EHMER_MAX*sizeof(float)); } } // OK, yeah, this was a silly way to do it memcpy(tonecurves[0][2],tone_125_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[0][4],tone_125_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[0][6],tone_125_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[0][8],tone_125_100dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[2][2],tone_250_40dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[2][4],tone_250_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[2][6],tone_250_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[2][8],tone_250_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[4][2],tone_500_40dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[4][4],tone_500_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[4][6],tone_500_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[4][8],tone_500_100dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[6][2],tone_1000_40dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[6][4],tone_1000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[6][6],tone_1000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[6][8],tone_1000_100dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[8][2],tone_2000_40dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[8][4],tone_2000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[8][6],tone_2000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[8][8],tone_2000_100dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[10][2],tone_4000_40dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[10][4],tone_4000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[10][6],tone_4000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[10][8],tone_4000_100dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[12][2],tone_4000_40dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[12][4],tone_4000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[12][6],tone_8000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(tonecurves[12][8],tone_8000_100dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[0][2],noise_500_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[0][4],noise_500_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[0][6],noise_500_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[0][8],noise_500_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[2][2],noise_500_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[2][4],noise_500_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[2][6],noise_500_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[2][8],noise_500_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[4][2],noise_500_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[4][4],noise_500_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[4][6],noise_500_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[4][8],noise_500_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[6][2],noise_1000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[6][4],noise_1000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[6][6],noise_1000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[6][8],noise_1000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[8][2],noise_2000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[8][4],noise_2000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[8][6],noise_2000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[8][8],noise_2000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[10][2],noise_4000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[10][4],noise_4000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[10][6],noise_4000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[10][8],noise_4000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[12][2],noise_4000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[12][4],noise_4000_60dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[12][6],noise_4000_80dB_SL,sizeof(float)*EHMER_MAX); memcpy(noisecurves[12][8],noise_4000_80dB_SL,sizeof(float)*EHMER_MAX); setup_curve(tonecurves[0],0,vi.toneatt_125Hz); setup_curve(tonecurves[2],2,vi.toneatt_250Hz); setup_curve(tonecurves[4],4,vi.toneatt_500Hz); setup_curve(tonecurves[6],6,vi.toneatt_1000Hz); setup_curve(tonecurves[8],8,vi.toneatt_2000Hz); setup_curve(tonecurves[10],10,vi.toneatt_4000Hz); setup_curve(tonecurves[12],12,vi.toneatt_8000Hz); setup_curve(noisecurves[0],0,vi.noiseatt_125Hz); setup_curve(noisecurves[2],2,vi.noiseatt_250Hz); setup_curve(noisecurves[4],4,vi.noiseatt_500Hz); setup_curve(noisecurves[6],6,vi.noiseatt_1000Hz); setup_curve(noisecurves[8],8,vi.noiseatt_2000Hz); setup_curve(noisecurves[10],10,vi.noiseatt_4000Hz); setup_curve(noisecurves[12],12,vi.noiseatt_8000Hz); for(i=1;i<13;i+=2){ for(j=0;j<9;j++){ interp_curve_dB(tonecurves[i][j], tonecurves[i-1][j], tonecurves[i+1][j],.5); interp_curve_dB(noisecurves[i][j], noisecurves[i-1][j], noisecurves[i+1][j],.5); } } for(i=0;i<5;i++){ peakatt[0][i]=fromdB(vi.peakatt_125Hz[i]); peakatt[1][i]=fromdB(vi.peakatt_250Hz[i]); peakatt[2][i]=fromdB(vi.peakatt_500Hz[i]); peakatt[3][i]=fromdB(vi.peakatt_1000Hz[i]); peakatt[4][i]=fromdB(vi.peakatt_2000Hz[i]); peakatt[5][i]=fromdB(vi.peakatt_4000Hz[i]); peakatt[6][i]=fromdB(vi.peakatt_8000Hz[i]); } */ } } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Residue0.java000066400000000000000000000276231335566474600250770ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; class Residue0 extends FuncResidue{ void pack(Object vr, Buffer opb){ InfoResidue0 info=(InfoResidue0)vr; int acc=0; opb.write(info.begin,24); opb.write(info.end,24); opb.write(info.grouping-1,24); /* residue vectors to group and code with a partitioned book */ opb.write(info.partitions-1,6); /* possible partition choices */ opb.write(info.groupbook,8); /* group huffman book */ /* secondstages is a bitmask; as encoding progresses pass by pass, a bitmask of one indicates this partition class has bits to write this pass */ for(int j=0;j3){ /* yes, this is a minor hack due to not thinking ahead */ opb.write(info.secondstages[j],3); opb.write(1,1); opb.write(info.secondstages[j]>>>3,5); } else{ opb.write(info.secondstages[j],4); /* trailing zero */ } acc+=icount(info.secondstages[j]); } for(int j=0;j=vi.books){ free_info(info); return(null); } for(int j=0;j=vi.books){ free_info(info); return(null); } } return(info); // errout: // free_info(info); // return(NULL); } Object look(DspState vd, InfoMode vm, Object vr){ InfoResidue0 info=(InfoResidue0)vr; LookResidue0 look=new LookResidue0(); int acc=0; int dim; int maxstage=0; look.info=info; look.map=vm.mapping; look.parts=info.partitions; look.fullbooks=vd.fullbooks; look.phrasebook=vd.fullbooks[info.groupbook]; dim=look.phrasebook.dim; look.partbooks=new int[look.parts][]; for(int j=0;jmaxstage)maxstage=stages; look.partbooks[j]=new int[stages]; for(int k=0; k>>=1; } return(ret); } private static int icount(int v){ int ret=0; while(v!=0){ ret+=(v&1); v>>>=1; } return(ret); } } class LookResidue0 { InfoResidue0 info; int map; int parts; int stages; CodeBook[] fullbooks; CodeBook phrasebook; int[][] partbooks; // CodeBook[][] partbooks; int partvals; int[][] decodemap; int postbits; int phrasebits; // int[][] frames; int frames; } class InfoResidue0{ // block-partitioned VQ coded straight residue int begin; int end; // first stage (lossless partitioning) int grouping; // group n vectors per partition int partitions; // possible codebooks for a partition int groupbook; // huffbook for partitioning int[] secondstages=new int[64]; // expanded out to pointers in lookup int[] booklist=new int[256]; // list of second stage books // encode-only heuristic settings float[] entmax=new float[64]; // book entropy threshholds float[] ampmax=new float[64]; // book amp threshholds int[] subgrp=new int[64]; // book heuristic subgroup size int[] blimit=new int[64]; // subgroup position limits } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Residue1.java000066400000000000000000000030261335566474600250670ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; class Residue1 extends Residue0{ int forward(Block vb,Object vl, float[][] in, int ch){ System.err.println("Residue0.forward: not implemented"); return 0; } int inverse(Block vb, Object vl, float[][] in, int[] nonzero, int ch){ //System.err.println("Residue0.inverse"); int used=0; for(int i=0; i * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; class Residue2 extends Residue0{ int forward(Block vb,Object vl, float[][] in, int ch){ System.err.println("Residue0.forward: not implemented"); return 0; } int inverse(Block vb, Object vl, float[][] in, int[] nonzero, int ch){ //System.err.println("Residue0.inverse"); int i=0; for(i=0;i * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; class StaticCodeBook{ int dim; // codebook dimensions (elements per vector) int entries; // codebook entries int[] lengthlist; // codeword lengths in bits // mapping int maptype; // 0=none // 1=implicitly populated values from map column // 2=listed arbitrary values // The below does a linear, single monotonic sequence mapping. int q_min; // packed 32 bit float; quant value 0 maps to minval int q_delta; // packed 32 bit float; val 1 - val 0 == delta int q_quant; // bits: 0 < quant <= 16 int q_sequencep; // bitflag // additional information for log (dB) mapping; the linear mapping // is assumed to actually be values in dB. encodebias is used to // assign an error weight to 0 dB. We have two additional flags: // zeroflag indicates if entry zero is to represent -Inf dB; negflag // indicates if we're to represent negative linear values in a // mirror of the positive mapping. int[] quantlist; // map == 1: (int)(entries/dim) element column map // map == 2: list of dim*entries quantized entry vals // encode helpers EncodeAuxNearestMatch nearest_tree; EncodeAuxThreshMatch thresh_tree; StaticCodeBook(){} StaticCodeBook(int dim, int entries, int[] lengthlist, int maptype, int q_min, int q_delta, int q_quant, int q_sequencep, int[] quantlist, //EncodeAuxNearestmatch nearest_tree, Object nearest_tree, // EncodeAuxThreshmatch thresh_tree, Object thresh_tree ){ this(); this.dim=dim; this.entries=entries; this.lengthlist=lengthlist; this.maptype=maptype; this.q_min=q_min; this.q_delta=q_delta; this.q_quant=q_quant; this.q_sequencep=q_sequencep; this.quantlist=quantlist; } int pack(Buffer opb){ int i; boolean ordered=false; opb.write(0x564342,24); opb.write(dim, 16); opb.write(entries, 24); // pack the codewords. There are two packings; length ordered and // length random. Decide between the two now. for(i=1;i_last){ for(int j=_last;j<_this;j++){ opb.write(i-count,ilog(entries-count)); count=i; } } } opb.write(i-count,ilog(entries-count)); } else{ // length random. Again, we don't code the codeword itself, just // the length. This time, though, we have to encode each length opb.write(0,1); // unordered // algortihmic mapping has use for 'unused entries', which we tag // here. The algorithmic mapping happens as usual, but the unused // entry has no codeword. for(i=0;ientries/c->dim) quantized values for // building a full value list algorithmically (square lattice) quantvals=maptype1_quantvals(); break; case 2: // every value (c->entries*c->dim total) specified explicitly quantvals=entries*dim; break; } // quantized values for(i=0;ibim <= b->entries // treat the above as an initial guess while(true){ int acc=1; int acc1=1; for(int i=0;ientries){ return(vals); } else{ if(acc>entries){ vals--; } else{ vals++; } } } } void clear(){ // if(quantlist!=null)free(b->quantlist); // if(lengthlist!=null)free(b->lengthlist); // if(nearest_tree!=null){ // free(b->nearest_tree->ptr0); // free(b->nearest_tree->ptr1); // free(b->nearest_tree->p); // free(b->nearest_tree->q); // memset(b->nearest_tree,0,sizeof(encode_aux_nearestmatch)); // free(b->nearest_tree); // } // if(thresh_tree!=null){ // free(b->thresh_tree->quantthresh); // free(b->thresh_tree->quantmap); // memset(b->thresh_tree,0,sizeof(encode_aux_threshmatch)); // free(b->thresh_tree); // } // memset(b,0,sizeof(static_codebook)); } // unpack the quantized list of values for encode/decode // we need to deal with two map types: in map type 1, the values are // generated algorithmically (each column of the vector counts through // the values in the quant vector). in map type 2, all the values came // in in an explicit list. Both value lists must be unpacked float[] unquantize(){ if(maptype==1 || maptype==2){ int quantvals; float mindel=float32_unpack(q_min); float delta=float32_unpack(q_delta); float[] r=new float[entries*dim]; //System.err.println("q_min="+q_min+", mindel="+mindel); // maptype 1 and 2 both use a quantized value vector, but // different sizes switch(maptype){ case 1: // most of the time, entries%dimensions == 0, but we need to be // well defined. We define that the possible vales at each // scalar is values == entries/dim. If entries%dim != 0, we'll // have 'too few' values (values*dim "+val+" | ");} val=Math.abs(val)*delta+mindel+last; if(q_sequencep!=0)last=val; r[j*dim+k]=val; //if((j*dim+k)==0){System.err.println(" $ r[0] -> "+r[0]+" | ");} } } //System.err.println("\nr[0]="+r[0]); } return(r); } return(null); } private static int ilog(int v){ int ret=0; while(v!=0){ ret++; v>>>=1; } return(ret); } // 32 bit float (not IEEE; nonnormalized mantissa + // biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm // Why not IEEE? It's just not that important here. static final int VQ_FEXP=10; static final int VQ_FMAN=21; static final int VQ_FEXP_BIAS=768; // bias toward values smaller than 1. // doesn't currently guard under/overflow static long float32_pack(float val){ int sign=0; int exp; int mant; if(val<0){ sign=0x80000000; val= -val; } exp=(int)Math.floor(Math.log(val)/Math.log(2)); mant=(int)Math.rint(Math.pow(val,(VQ_FMAN-1)-exp)); exp=(exp+VQ_FEXP_BIAS)<>>VQ_FMAN; //System.err.println("mant="+mant+", sign="+sign+", exp="+exp); //if(sign!=0.0)mant= -mant; if((val&0x80000000)!=0)mant= -mant; //System.err.println("mant="+mant); return(ldexp(mant,((int)exp)-(VQ_FMAN-1)-VQ_FEXP_BIAS)); } static float ldexp(float foo, int e){ return (float)(foo*Math.pow(2, e)); } /* // TEST // Unit tests of the dequantizer; this stuff will be OK // cross-platform, I simply want to be sure that special mapping cases // actually work properly; a bug could go unnoticed for a while // cases: // // no mapping // full, explicit mapping // algorithmic mapping // // nonsequential // sequential static int[] full_quantlist1={0,1,2,3, 4,5,6,7, 8,3,6,1}; static int[] partial_quantlist1={0,7,2}; // no mapping static StaticCodeBook test1=new StaticCodeBook(4,16,null, 0,0,0,0,0, null,null,null); static float[] test1_result=null; // linear, full mapping, nonsequential static StaticCodeBook test2=new StaticCodeBook(4,3,null, 2,-533200896,1611661312,4,0, full_quantlist1, null, null); static float[] test2_result={-3,-2,-1,0, 1,2,3,4, 5,0,3,-2}; // linear, full mapping, sequential static StaticCodeBook test3=new StaticCodeBook(4,3,null, 2, -533200896,1611661312,4,1, full_quantlist1,null, null); static float[] test3_result={-3,-5,-6,-6, 1,3,6,10, 5,5,8,6}; // linear, algorithmic mapping, nonsequential static StaticCodeBook test4=new StaticCodeBook(3,27,null, 1,-533200896,1611661312,4,0, partial_quantlist1,null,null); static float[] test4_result={-3,-3,-3, 4,-3,-3, -1,-3,-3, -3, 4,-3, 4, 4,-3, -1, 4,-3, -3,-1,-3, 4,-1,-3, -1,-1,-3, -3,-3, 4, 4,-3, 4, -1,-3, 4, -3, 4, 4, 4, 4, 4, -1, 4, 4, -3,-1, 4, 4,-1, 4, -1,-1, 4, -3,-3,-1, 4,-3,-1, -1,-3,-1, -3, 4,-1, 4, 4,-1, -1, 4,-1, -3,-1,-1, 4,-1,-1, -1,-1,-1}; // linear, algorithmic mapping, sequential static StaticCodeBook test5=new StaticCodeBook(3,27,null, 1,-533200896,1611661312,4,1, partial_quantlist1,null,null); static float[] test5_result={-3,-6,-9, 4, 1,-2, -1,-4,-7, -3, 1,-2, 4, 8, 5, -1, 3, 0, -3,-4,-7, 4, 3, 0, -1,-2,-5, -3,-6,-2, 4, 1, 5, -1,-4, 0, -3, 1, 5, 4, 8,12, -1, 3, 7, -3,-4, 0, 4, 3, 7, -1,-2, 2, -3,-6,-7, 4, 1, 0, -1,-4,-5, -3, 1, 0, 4, 8, 7, -1, 3, 2, -3,-4,-5, 4, 3, 2, -1,-2,-3}; void run_test(float[] comp){ float[] out=unquantize(); if(comp!=null){ if(out==null){ System.err.println("_book_unquantize incorrectly returned NULL"); System.exit(1); } for(int i=0;i.0001){ System.err.println("disagreement in unquantized and reference data:\nposition "+i+": "+out[i]+" != "+comp[i]); System.exit(1); } } } else{ if(out!=null){ System.err.println("_book_unquantize returned a value array:\n correct result should have been NULL"); System.exit(1); } } } public static void main(String[] arg){ // run the nine dequant tests, and compare to the hand-rolled results System.err.print("Dequant test 1... "); test1.run_test(test1_result); System.err.print("OK\nDequant test 2... "); test2.run_test(test2_result); System.err.print("OK\nDequant test 3... "); test3.run_test(test3_result); System.err.print("OK\nDequant test 4... "); test4.run_test(test4_result); System.err.print("OK\nDequant test 5... "); test5.run_test(test5_result); System.err.print("OK\n\n"); } */ } extensions/soundspi/jorbis/src/com/jcraft/jorbis/Time0.java000066400000000000000000000026041335566474600243650ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; class Time0 extends FuncTime{ void pack(Object i, Buffer opb){} Object unpack(Info vi , Buffer opb){return "";} Object look(DspState vd, InfoMode mi, Object i){return "";} void free_info(Object i){} void free_look(Object i){} int forward(Block vb, Object i){return 0;} int inverse(Block vb, Object i, float[] in, float[] out){return 0;} } extensions/soundspi/jorbis/src/com/jcraft/jorbis/VorbisFile.java000066400000000000000000001100011335566474600254420ustar00rootroot00000000000000/* JOrbis * Copyright (C) 2000 ymnk, JCraft,Inc. * * Written by: 2000 ymnk * * Many thanks to * Monty and * The XIPHOPHORUS Company http://www.xiph.org/ . * JOrbis has been based on their awesome works, Vorbis codec. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.jcraft.jorbis; import com.jcraft.jogg.*; import java.io.InputStream; import java.io.IOException; public class VorbisFile{ static final int CHUNKSIZE=8500; static final int SEEK_SET=0; static final int SEEK_CUR=1; static final int SEEK_END=2; static final int OV_FALSE=-1; static final int OV_EOF=-2; static final int OV_HOLE=-3; static final int OV_EREAD=-128; static final int OV_EFAULT=-129; static final int OV_EIMPL=-130; static final int OV_EINVAL=-131; static final int OV_ENOTVORBIS=-132; static final int OV_EBADHEADER=-133; static final int OV_EVERSION=-134; static final int OV_ENOTAUDIO=-135; static final int OV_EBADPACKET=-136; static final int OV_EBADLINK=-137; static final int OV_ENOSEEK=-138; InputStream datasource; boolean seekable=false; long offset; long end; SyncState oy=new SyncState(); int links; long[] offsets; long[] dataoffsets; int[] serialnos; long[] pcmlengths; Info[] vi; Comment[] vc; // Decoding working state local storage long pcm_offset; boolean decode_ready=false; int current_serialno; int current_link; float bittrack; float samptrack; StreamState os=new StreamState(); // take physical pages, weld into a logical // stream of packets DspState vd=new DspState(); // central working state for // the packet->PCM decoder Block vb=new Block(vd); // local working space for packet->PCM decode //ov_callbacks callbacks; public VorbisFile(String file) throws JOrbisException { super(); InputStream is=null; try{ is=new SeekableInputStream(file); int ret=open(is, null, 0); if(ret==-1){ throw new JOrbisException("VorbisFile: open return -1"); } } catch(Exception e){ throw new JOrbisException("VorbisFile: "+e.toString()); } finally{ if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } public VorbisFile(InputStream is, byte[] initial, int ibytes) throws JOrbisException { super(); int ret=open(is, initial, ibytes); if(ret==-1){ } } private int get_data(){ int index=oy.buffer(CHUNKSIZE); byte[] buffer=oy.data; // int bytes=callbacks.read_func(buffer, index, 1, CHUNKSIZE, datasource); int bytes=0; try{ bytes=datasource.read(buffer, index, CHUNKSIZE); } catch(Exception e){ //System.err.println(e); return OV_EREAD; } oy.wrote(bytes); if(bytes==-1){ // System.out.println("bytes="+bytes); bytes=0; } return bytes; } private void seek_helper(long offst){ //callbacks.seek_func(datasource, offst, SEEK_SET); fseek(datasource, offst, SEEK_SET); this.offset=offst; oy.reset(); } private int get_next_page(Page page, long boundary){ if(boundary>0) boundary+=offset; while(true){ int more; if(boundary>0 && offset>=boundary)return OV_FALSE; more=oy.pageseek(page); if(more<0){offset-=more;} else{ if(more==0){ if(boundary==0)return OV_FALSE; // if(get_data()<=0)return -1; int ret=get_data(); if(ret==0) return OV_EOF; if(ret<0) return OV_EREAD; } else{ int ret=(int)offset; //!!! offset+=more; return ret; } } } } private int get_prev_page(Page page) throws JOrbisException { long begin=offset; //!!! int ret; int offst=-1; while(offst==-1){ begin-=CHUNKSIZE; if(begin<0) begin=0; seek_helper(begin); while(offset=0)next=ret; } else{ searched=ret+page.header_len+page.body_len; } } seek_helper(next); ret=get_next_page(page, -1); if(ret==OV_EREAD) return OV_EREAD; if(searched>=end || ret==-1){ links=m+1; offsets=new long[m+2]; offsets[m+1]=searched; } else{ ret=bisect_forward_serialno(next, offset, end, page.serialno(), m+1); if(ret==OV_EREAD)return OV_EREAD; } offsets[m]=begin; return 0; } // uses the local ogg_stream storage in vf; this is important for // non-streaming input sources int fetch_headers(Info vi, Comment vc, int[] serialno, Page og_ptr){ //System.err.println("fetch_headers"); Page og=new Page(); Packet op=new Packet(); int ret; if(og_ptr==null){ ret=get_next_page(og, CHUNKSIZE); if(ret==OV_EREAD)return OV_EREAD; if(ret<0) return OV_ENOTVORBIS; og_ptr=og; } if(serialno!=null)serialno[0]=og_ptr.serialno(); os.init(og_ptr.serialno()); // extract the initial header from the first page and verify that the // Ogg bitstream is in fact Vorbis data vi.init(); vc.init(); int i=0; while(i<3){ os.pagein(og_ptr); while(i<3){ int result=os.packetout(op); if(result==0)break; if(result==-1){ //System.err.println("Corrupt header in logical bitstream."); //goto bail_header; vi.clear(); vc.clear(); os.clear(); return -1; } if(vi.synthesis_headerin(vc, op)!=0){ //System.err.println("Illegal header in logical bitstream."); //goto bail_header; vi.clear(); vc.clear(); os.clear(); return -1; } i++; } if(i<3) if(get_next_page(og_ptr, 1)<0){ //System.err.println("Missing header in logical bitstream."); //goto bail_header; vi.clear(); vc.clear(); os.clear(); return -1; } } return 0; // bail_header: // vorbis_info_clear(vi); // vorbis_comment_clear(vc); // ogg_stream_clear(&vf->os); // return -1; } // last step of the OggVorbis_File initialization; get all the // vorbis_info structs and PCM positions. Only called by the seekable // initialization (local stream storage is hacked slightly; pay // attention to how that's done) void prefetch_all_headers(Info first_i,Comment first_c, int dataoffset) throws JOrbisException { Page og=new Page(); int ret; vi=new Info[links]; vc=new Comment[links]; dataoffsets=new long[links]; pcmlengths=new long[links]; serialnos=new int[links]; for(int i=0;ivi+i,first_i,sizeof(vorbis_info)); vc[i]=first_c; //memcpy(vf->vc+i,first_c,sizeof(vorbis_comment)); dataoffsets[i]=dataoffset; } else{ // seek to the location of the initial header seek_helper(offsets[i]); //!!! vi[i]=new Info(); vc[i]=new Comment(); if(fetch_headers(vi[i], vc[i], null, null)==-1){ //System.err.println("Error opening logical bitstream #"+(i+1)+"\n"); dataoffsets[i]=-1; } else{ dataoffsets[i]=offset; os.clear(); } } // get the serial number and PCM length of this link. To do this, // get the last page of the stream { long end=offsets[i+1]; //!!! seek_helper(end); while(true){ ret=get_prev_page(og); if(ret==-1){ // this should not be possible //System.err.println("Could not find last page of logical "+ // "bitstream #"+(i)+"\n"); vi[i].clear(); vc[i].clear(); break; } if(og.granulepos()!=-1){ serialnos[i]=og.serialno(); pcmlengths[i]=og.granulepos(); break; } } } } } int make_decode_ready(){ if(decode_ready)System.exit(1); vd.synthesis_init(vi[0]); vb.init(vd); decode_ready=true; return(0); } int open_seekable() throws JOrbisException { Info initial_i=new Info(); Comment initial_c=new Comment(); int serialno; long end; int ret; int dataoffset; Page og=new Page(); // is this even vorbis...? int[] foo=new int[1]; ret=fetch_headers(initial_i, initial_c, foo, null); serialno=foo[0]; dataoffset=(int)offset; //!! os.clear(); if(ret==-1)return(-1); // we can seek, so set out learning all about this file seekable=true; //(callbacks.seek_func)(datasource, 0, SEEK_END); fseek(datasource, 0, SEEK_END); //offset=end=(callbacks.tell_func)(datasource); offset=ftell(datasource); end=offset; // We get the offset for the last page of the physical bitstream. // Most OggVorbis files will contain a single logical bitstream end=get_prev_page(og); // moer than one logical bitstream? if(og.serialno()!=serialno){ // Chained bitstream. Bisect-search each logical bitstream // section. Do so based on serial number only if(bisect_forward_serialno(0,0,end+1,serialno,0)<0){ clear(); return OV_EREAD; } } else{ // Only one logical bitstream if(bisect_forward_serialno(0,end,end+1,serialno,0)<0){ clear(); return OV_EREAD; } } prefetch_all_headers(initial_i, initial_c, dataoffset); return(raw_seek(0)); } int open_nonseekable(){ //System.err.println("open_nonseekable"); // we cannot seek. Set up a 'single' (current) logical bitstream entry links=1; vi=new Info[links]; vi[0]=new Info(); // ?? vc=new Comment[links]; vc[0]=new Comment(); // ?? bug? // Try to fetch the headers, maintaining all the storage int[]foo=new int[1]; if(fetch_headers(vi[0], vc[0], foo, null)==-1)return(-1); current_serialno=foo[0]; make_decode_ready(); return 0; } // clear out the current logical bitstream decoder void decode_clear(){ os.clear(); vd.clear(); vb.clear(); decode_ready=false; bittrack=0.f; samptrack=0.f; } // fetch and process a packet. Handles the case where we're at a // bitstream boundary and dumps the decoding machine. If the decoding // machine is unloaded, it loads it. It also keeps pcm_offset up to // date (seek and read both use this. seek uses a special hack with // readp). // // return: -1) hole in the data (lost packet) // 0) need more date (only if readp==0)/eof // 1) got a packet int process_packet(int readp){ Page og=new Page(); // handle one packet. Try to fetch it from current stream state // extract packets from page while(true){ // process a packet if we can. If the machine isn't loaded, // neither is a page if(decode_ready){ Packet op=new Packet(); int result=os.packetout(op); long granulepos; // if(result==-1)return(-1); // hole in the data. For now, swallow // and go. We'll need to add a real // error code in a bit. if(result>0){ // got a packet. process it granulepos=op.granulepos; if(vb.synthesis(op)==0){ // lazy check for lazy // header handling. The // header packets aren't // audio, so if/when we // submit them, // vorbis_synthesis will // reject them // suck in the synthesis data and track bitrate { int oldsamples=vd.synthesis_pcmout(null, null); vd.synthesis_blockin(vb); samptrack+=vd.synthesis_pcmout(null, null)-oldsamples; bittrack+=op.bytes*8; } // update the pcm offset. if(granulepos!=-1 && op.e_o_s==0){ int link=(seekable?current_link:0); int samples; // this packet has a pcm_offset on it (the last packet // completed on a page carries the offset) After processing // (above), we know the pcm position of the *last* sample // ready to be returned. Find the offset of the *first* // // As an aside, this trick is inaccurate if we begin // reading anew right at the last page; the end-of-stream // granulepos declares the last frame in the stream, and the // last packet of the last page may be a partial frame. // So, we need a previous granulepos from an in-sequence page // to have a reference point. Thus the !op.e_o_s clause above samples=vd.synthesis_pcmout(null, null); granulepos-=samples; for(int i=0;icallbacks.close_func)(vf->datasource); //memset(vf,0,sizeof(OggVorbis_File)); return(0); } static int fseek(InputStream fis, //int64_t off, long off, int whence){ if(fis instanceof SeekableInputStream){ SeekableInputStream sis=(SeekableInputStream)fis; try{ if(whence==SEEK_SET){ sis.seek(off); } else if(whence==SEEK_END){ sis.seek(sis.getLength()-off); } else{ //System.out.println("seek: "+whence+" is not supported"); } } catch(Exception e){ } return 0; } try{ if(whence==0){ fis.reset(); } fis.skip(off); } catch(Exception e){return -1;} return 0; } static long ftell(InputStream fis){ try{ if(fis instanceof SeekableInputStream){ SeekableInputStream sis=(SeekableInputStream)fis; return (sis.tell()); } } catch(Exception e){ } return 0; } // inspects the OggVorbis file and finds/documents all the logical // bitstreams contained in it. Tries to be tolerant of logical // bitstream sections that are truncated/woogie. // // return: -1) error // 0) OK int open(InputStream is, byte[] initial, int ibytes) throws JOrbisException { //callbacks callbacks = { // (size_t (*)(void *, size_t, size_t, void *)) fread, // (int (*)(void *, int64_t, int)) _fseek, // (int (*)(void *)) fclose, // (long (*)(void *)) ftell // }; return open_callbacks(is, initial, ibytes//, callbacks ); } int open_callbacks(InputStream is, byte[] initial, int ibytes//, callbacks callbacks ) throws JOrbisException { int ret; datasource=is; //callbacks = _callbacks; // init the framing state oy.init(); // perhaps some data was previously read into a buffer for testing // against other stream types. Allow initialization from this // previously read data (as we may be reading from a non-seekable // stream) if(initial!=null){ int index=oy.buffer(ibytes); System.arraycopy(initial, 0, oy.data, index, ibytes); oy.wrote(ibytes); } // can we seek? Stevens suggests the seek test was portable if(is instanceof SeekableInputStream){ ret=open_seekable(); } else{ ret=open_nonseekable(); } if(ret!=0){ datasource=null; clear(); } return ret; } // How many logical bitstreams in this physical bitstream? public int streams(){ return links; } // Is the FILE * associated with vf seekable? public boolean seekable(){ return seekable; } // returns the bitrate for a given logical bitstream or the entire // physical bitstream. If the file is open for random access, it will // find the *actual* average bitrate. If the file is streaming, it // returns the nominal bitrate (if set) else the average of the // upper/lower bounds (if set) else -1 (unset). // // If you want the actual bitrate field settings, get them from the // vorbis_info structs public int bitrate(int i){ if(i>=links)return(-1); if(!seekable && i!=0)return(bitrate(0)); if(i<0){ long bits=0; for(int j=0;j0){ return vi[i].bitrate_nominal; } else{ if(vi[i].bitrate_upper>0){ if(vi[i].bitrate_lower>0){ return (vi[i].bitrate_upper+vi[i].bitrate_lower)/2; }else{ return vi[i].bitrate_upper; } } return(-1); } } } } // returns the actual bitrate since last call. returns -1 if no // additional data to offer since last call (or at beginning of stream) public int bitrate_instant(){ int _link=(seekable?current_link:0); if(samptrack==0)return(-1); int ret=(int)(bittrack/samptrack*vi[_link].rate+.5); bittrack=0.f; samptrack=0.f; return(ret); } public int serialnumber(int i){ if(i>=links)return(-1); if(!seekable && i>=0)return(serialnumber(-1)); if(i<0){ return(current_serialno); } else{ return(serialnos[i]); } } // returns: total raw (compressed) length of content if i==-1 // raw (compressed) length of that logical bitstream for i==0 to n // -1 if the stream is not seekable (we can't know the length) public long raw_total(int i){ if(!seekable || i>=links)return(-1); if(i<0){ long acc=0; // bug? for(int j=0;j=links)return(-1); if(i<0){ long acc=0; for(int j=0;j=links)return(-1); if(i<0){ float acc=0; for(int j=0;joffsets[links]){ //goto seek_error; pcm_offset=-1; decode_clear(); return -1; } // clear out decoding machine state pcm_offset=-1; decode_clear(); // seek seek_helper(pos); // we need to make sure the pcm_offset is set. We use the // _fetch_packet helper to process one packet with readp set, then // call it until it returns '0' with readp not set (the last packet // from a page has the 'granulepos' field set, and that's how the // helper updates the offset switch(process_packet(1)){ case 0: // oh, eof. There are no packets remaining. Set the pcm offset to // the end of file pcm_offset=pcm_total(-1); return(0); case -1: // error! missing data or invalid bitstream structure //goto seek_error; pcm_offset=-1; decode_clear(); return -1; default: // all OK break; } while(true){ switch(process_packet(0)){ case 0: // the offset is set. If it's a bogus bitstream with no offset // information, it's not but that's not our fault. We still run // gracefully, we're just missing the offset return(0); case -1: // error! missing data or invalid bitstream structure //goto seek_error; pcm_offset=-1; decode_clear(); return -1; default: // continue processing packets break; } } // seek_error: // dump the machine so we're in a known state //pcm_offset=-1; //decode_clear(); //return -1; } // seek to a sample offset relative to the decompressed pcm stream // returns zero on success, nonzero on failure public int pcm_seek(long pos){ int link=-1; long total=pcm_total(-1); if(!seekable)return(-1); // don't dump machine if we can't seek if(pos<0 || pos>total){ //goto seek_error; pcm_offset=-1; decode_clear(); return -1; } // which bitstream section does this pcm offset occur in? for(link=links-1;link>=0;link--){ total-=pcmlengths[link]; if(pos>=total)break; } // search within the logical bitstream for the page with the highest // pcm_pos preceeding (or equal to) pos. There is a danger here; // missing pages or incorrect frame number information in the // bitstream could make our task impossible. Account for that (it // would be an error condition) { long target=pos-total; long end=offsets[link+1]; long begin=offsets[link]; int best=(int)begin; Page og=new Page(); while(begin=pos){ //goto seek_error; pcm_offset=-1; decode_clear(); return -1; } if(pos>pcm_total(-1)){ //goto seek_error; pcm_offset=-1; decode_clear(); return -1; } // discard samples until we reach the desired position. Crossing a // logical bitstream boundary with abandon is OK. while(pcm_offsettarget)samples=target; vd.synthesis_read(samples); pcm_offset+=samples; if(samplestime_total){ //goto seek_error; pcm_offset=-1; decode_clear(); return -1; } // which bitstream section does this time offset occur in? for(link=links-1;link>=0;link--){ pcm_total-=pcmlengths[link]; time_total-=time_total(link); if(seconds>=time_total)break; } // enough information to convert time offset to pcm offset { long target=(long)(pcm_total+(seconds-time_total)*vi[link].rate); return(pcm_seek(target)); } //seek_error: // dump machine so we're in a known state //pcm_offset=-1; //decode_clear(); //return -1; } // tell the current stream offset cursor. Note that seek followed by // tell will likely not give the set offset due to caching public long raw_tell(){ return(offset); } // return PCM offset (sample) of next PCM sample to be read public long pcm_tell(){ return(pcm_offset); } // return time offset (seconds) of next PCM sample to be read public float time_tell(){ // translate time to PCM position and call pcm_seek int link=-1; long pcm_total=0; float time_total=0.f; if(seekable){ pcm_total=pcm_total(-1); time_total=time_total(-1); // which bitstream section does this time offset occur in? for(link=links-1;link>=0;link--){ pcm_total-=pcmlengths[link]; time_total-=time_total(link); if(pcm_offset>=pcm_total)break; } } return((float)time_total+(float)(pcm_offset-pcm_total)/vi[link].rate); } // link: -1) return the vorbis_info struct for the bitstream section // currently being decoded // 0-n) to request information for a specific bitstream section // // In the case of a non-seekable bitstream, any call returns the // current bitstream. NULL in the case that the machine is not // initialized public Info getInfo(int link){ if(seekable){ if(link<0){ if(decode_ready){ return vi[current_link]; } else{ return null; } } else{ if(link>=links){ return null; } else{ return vi[link]; } } } else{ if(decode_ready){ return vi[0]; } else{ return null; } } } public Comment getComment(int link){ if(seekable){ if(link<0){ if(decode_ready){ return vc[current_link]; } else{ return null; } } else{ if(link>=links){ return null;} else{ return vc[link]; } } } else{ if(decode_ready){ return vc[0]; } else{ return null; } } } int host_is_big_endian() { return 1; // short pattern = 0xbabe; // unsigned char *bytewise = (unsigned char *)&pattern; // if (bytewise[0] == 0xba) return 1; // assert(bytewise[0] == 0xbe); // return 0; } // up to this point, everything could more or less hide the multiple // logical bitstream nature of chaining from the toplevel application // if the toplevel application didn't particularly care. However, at // the point that we actually read audio back, the multiple-section // nature must surface: Multiple bitstream sections do not necessarily // have to have the same number of channels or sampling rate. // // read returns the sequential logical bitstream number currently // being decoded along with the PCM data in order that the toplevel // application can take action on channel/sample rate changes. This // number will be incremented even for streamed (non-seekable) streams // (for seekable streams, it represents the actual logical bitstream // index within the physical bitstream. Note that the accessor // functions above are aware of this dichotomy). // // input values: buffer) a buffer to hold packed PCM data for return // length) the byte length requested to be placed into buffer // bigendianp) should the data be packed LSB first (0) or // MSB first (1) // word) word size for output. currently 1 (byte) or // 2 (16 bit short) // // return values: -1) error/hole in data // 0) EOF // n) number of bytes of PCM actually returned. The // below works on a packet-by-packet basis, so the // return length is not related to the 'length' passed // in, just guaranteed to fit. // // *section) set to the logical bitstream number int read(byte[] buffer,int length, int bigendianp, int word, int sgned, int[] bitstream){ int host_endian = host_is_big_endian(); int index=0; while(true){ if(decode_ready){ float[][] pcm; float[][][] _pcm=new float[1][][]; int[] _index=new int[getInfo(-1).channels]; int samples=vd.synthesis_pcmout(_pcm, _index); pcm=_pcm[0]; if(samples!=0){ // yay! proceed to pack data into the byte buffer int channels=getInfo(-1).channels; int bytespersample=word * channels; if(samples>length/bytespersample)samples=length/bytespersample; // a tight loop to pack each size { int val; if(word==1){ int off=(sgned!=0?0:128); for(int j=0;j127)val=127; else if(val<-128)val=-128; buffer[index++]=(byte)(val+off); } } } else{ int off=(sgned!=0?0:32768); if(host_endian==bigendianp){ if(sgned!=0){ for(int i=0;i32767)val=32767; else if(val<-32768)val=-32768; buffer[dest]=(byte)(val>>>8); buffer[dest+1]=(byte)(val); dest+=channels*2; } } } else{ for(int i=0;i32767)val=32767; else if(val<-32768)val=-32768; buffer[dest]=(byte)((val+off)>>>8); buffer[dest+1]=(byte)(val+off); dest+=channels*2; } } } } else if(bigendianp!=0){ for(int j=0;j32767)val=32767; else if(val<-32768)val=-32768; val+=off; buffer[index++]=(byte)(val>>>8); buffer[index++]=(byte)val; } } } else{ //int val; for(int j=0;j32767)val=32767; else if(val<-32768)val=-32768; val+=off; buffer[index++]=(byte)val; buffer[index++]=(byte)(val>>>8); } } } } } vd.synthesis_read(samples); pcm_offset+=samples; if(bitstream!=null)bitstream[0]=current_link; return(samples*bytespersample); } } // suck in another packet switch(process_packet(1)){ case 0: return(0); case -1: return -1; default: break; } } } public Info[] getInfo(){return vi;} public Comment[] getComment(){return vc;} /* public static void main(String[] arg){ try{ VorbisFile foo=new VorbisFile(arg[0]); int links=foo.streams(); System.out.println("links="+links); Comment[] comment=foo.getComment(); Info[] info=foo.getInfo(); for(int i=0; i Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! extensions/soundspi/tritonus/NEWS000066400000000000000000000035271335566474600175410ustar00rootroot00000000000000NEWS for Tritonus version 0.2.0: - bug fixes in audio file writers - improved A-law and u-law converters - bug fixes in installation procedure version 0.1.92: - file writers for .aiff and .wav - improved file readers - a-law and u-law converters - installation with jdk1.1.x now possible again version 0.1.91: - MIDI OUT is working (exception: sysex events) - major improvements in handling of 8-bit sound data version 0.1.90: many, many new things. Only key points here: - Java Sound API 1.0 interface - mp3 decoder fully integrated - recording works, even full-duplex - MIDI stuff: Sequencer (playback), Synthesizer (some advanced features missing), external MIDI IN, external MIDI OUT (only together with Sequencer) - NAS support removed version 0.1.82: - automatic configuration with configure - builds on jdk1.1.x (many thanks to Peter Pilgrim) - new base class TMixerProvider - NasMixer now has Mixer.Info object - interface of PanControl changed to 0.90 API - AudioInputStream can now handle streams with indefinite length - basis support for mp3 decoding by integration of javalayer - MidiDevice.Info.getVersion() added, constructor adapted - GroupLine added - Port.Info added version 0.1.81: - audio file writing for .au files - Clips for esd - several bugs fixed version 0.1.80: - JavaSound 0.90 API - support for esd - AudioInputStreamProviders for au, aiff and wave files version 0.1.003: - pause() and resume() are implemented - channels send start, stop and eom events - workaround for buggy fileparsers (now all work) version 0.1.002: - works with AuParser of Sun (other parser do not work/are not tested) - circular buffer in output channel has been eliminated - honors passed AudioFormat in Mixer.getOutputChannel() - Mixer.get*Formats() work Please report bugs to the author of this library: Matthias Pfisterer Have fun! extensions/soundspi/tritonus/README000066400000000000000000000016011335566474600177110ustar00rootroot00000000000000This is Tritonus, version 0.3.1 Tritonus is an implementation of the Java Sound API 1.0. What you see here is an implementaion for GNU/Linux i386 and GNU/Linux PowerPC. It is intended to support different plattforms in the future. Several components are written purely in Java. They can be used to extend any known Java Sound implementation. For pre-compiled versions of these components, see: http://www.tritonus.org/plugins.html Tritonus is distributed under the terms of the GNU Library General Public License. See the file LGPL for details. For installing instructions, see the file INSTALL. For new features and bug fixes, see file NEWS Please report bugs in Tritonus: http://sourceforge.net/bugs/?group_id=1390 or send mail to the developer mailing list: mailto:tritonus-devel@lists.sourceforge.net You may also have a look at the Tritonus page: http://www.tritonus.org/ Have fun! extensions/soundspi/tritonus/README_mp3000066400000000000000000000065011335566474600204740ustar00rootroot00000000000000README.mp3 ---------- MP3 DECODING ------------ This version of Tritonus includes mp3 decoding support. This is due to using javalayer 0.0.8, a pure-java mp3 decoder developed by the javalayer project. The big credit for this goes to Eric B. who wrote the decoder. The javalayer code is no longer duplicated in Tritonus. To compile from scratch, you need to check out javalayer from its own cvs (see http://sourceforge.net/projects/javalayer/). Make sure javalayer is in a directory 'javalayer' that is in the same directory as 'tritonus'. In this case, if you issue ant int Tritonus, it will build javalayer, too. Alternatively, if you want a different location, change the path to javalayer in build.xml. For a runnable program, see DecodingAudioPlayer.java or AudioPlayer.java from the Java Sound Examples. The decoder can also be used as plug-in for any Java Sound implementation (like the Sun jdk1.3). Precompiled jar files are at http://www.tritonus.org/plugins.html JavaLayer project: http://www.javazoom.net/javalayer/javalayer.html MP3 ENCODING ------------ MP3 file creation is supported with native access to the LAME library. A pure Java MP3 encoder does not exist in our knowledge and would probably be too slow - nowadays. LAME is acknowledged to provide high quality mp3 encoding. Additionally, it is completely open source (LGPL) and does not use 3rd party source code. As LAME is accessed via JNI, the current implementation in Tritonus can only be used under Linux. In future, a port to Windows and other systems is possible. Capabilities in Tritonus: The encoder creates MPEG1 layer III, MPEG2 layer III or MPEG2.5 layer III files and chooses automatically the right encoding. Bit rates may vary from 8 to 320KBit/s, VBR (variable bit rate) is supported, too. Different quality levels may be choosen which affect - encoding speed for CBR (constant bit rate) - mp3 file size for VBR. Downloading LAME: LAME has to be installed on your system. You need at least LAME V3.88beta or later. You can get LAME from http://sourceforge.net/projects/lame/ To get the latest CVS version of lame, issue these 2 commands: cvs -d:pserver:anonymous@cvs.lame.sourceforge.net:/cvsroot/lame login (Password empty) cvs -z3 -d:pserver:anonymous@cvs.lame.sourceforge.net:/cvsroot/lame co lame Installation of LAME: In the main directory of lame, issue "./configure --enable-shared" and "make". As root, invoke "make install". This copies the library to /usr/local/lib. You may need to include /usr/local/lib to /etc/ld.so.conf and then run "ldconfig" Integration in Tritonus: You must re-run "configure" after installation of LAME. Be sure to remove "config.cache" before. "configure" outputs a line like "Will build stuff for LAME encoder" when everything is fine. Call "make" and as root "make install" (or make install-link). Testing: A simple command line tool for converting any audio file to mp3 is included in the directory test: Mp3Encoder.java. Run it without parameters to see brief usage instructions. Looking at its source code will show you how it works (and the problems...). Please send problems or bugs to florian@tritonus.org or submit them to the bug database on sourceforge. Thanks: Many thanks to Mark Taylor, who leads development of LAME. He was open to my (Florians) proposals and let me work on LAME to make the integration into Tritonus possible. extensions/soundspi/tritonus/VERSION000066400000000000000000000000061335566474600200770ustar00rootroot000000000000000.3.1 extensions/soundspi/tritonus/src/000077500000000000000000000000001335566474600176225ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/000077500000000000000000000000001335566474600204115ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/000077500000000000000000000000001335566474600223005ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/applet/000077500000000000000000000000001335566474600235655ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/applet/AppletMpegSPIWorkaround.java000066400000000000000000000202651335566474600311230ustar00rootroot00000000000000/* * AppletMpegSPIWorkaround. * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package org.tritonus.applet; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; /** * From JRE/JDK 1.3.0_01 on, applets can not use provided service * providers. Obviously, in these later releases of the Java 2 platform * the service providers are only searched on the system/boot classloader * and NOT on the classloader of the applet. * Workaround found by Tritonus Team. */ public class AppletMpegSPIWorkaround { public static boolean DEBUG = false; public static String useragent = null; public static AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream) { try { return AudioSystem.getAudioInputStream(targetFormat, sourceStream); } catch (IllegalArgumentException iae) { if (DEBUG == true) { System.err.println("Using AppletMpegSPIWorkaround to get codec"); } try { Class.forName( "javazoom.spi.mpeg.sampled.convert.MpegFormatConversionProvider"); //"org.tritonus.sampled.convert.javalayer.MpegFormatConversionProvider"); return new javazoom.spi.mpeg.sampled.convert.MpegFormatConversionProvider(). //return new org.tritonus.sampled.convert.javalayer.MpegFormatConversionProvider(). getAudioInputStream(targetFormat, sourceStream); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException("Mpeg codec not properly installed"); } } } public static AudioInputStream getAudioInputStream(File file) throws UnsupportedAudioFileException, IOException { InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); try { if (DEBUG == true) { System.err.println( "Using AppletMpegSPIWorkaround to get codec (AudioInputStream:file)"); } return getAudioInputStream(inputStream); } catch (UnsupportedAudioFileException e) { inputStream.close(); throw e; } catch (IOException e) { inputStream.close(); throw e; } } public static AudioInputStream getAudioInputStream(URL url) throws UnsupportedAudioFileException, IOException { //alexey fix: we use MpegAudioFileReaderWorkaround with URL and user agent try { Class.forName("javazoom.spi.mpeg.sampled.file.MpegAudioFileReader"); //Class.forName("org.tritonus.sampled.file.mpeg.MpegAudioFileReader"); return new MpegAudioFileReaderWorkaround().getAudioInputStream(url, useragent); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException("Mpeg codec not properly installed"); } //InputStream inputStream = new BufferedInputStream(url.openStream()); //try //{ // if (DEBUG == true) // { // System.err.println( // "Using AppletMpegSPIWorkaround to get codec (AudioInputStream:url)"); // } // return getAudioInputStream(inputStream); //} //catch (UnsupportedAudioFileException e) //{ // inputStream.close(); // throw e; //} //catch (IOException e) //{ // inputStream.close(); // throw e; //} } public static AudioFileFormat getAudioFileFormat(File file) throws UnsupportedAudioFileException, IOException { InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); try { if (DEBUG == true) { System.err.println( "Using AppletMpegSPIWorkaround to get codec (AudioFileFormat:file)"); } return getAudioFileFormat(inputStream); } finally { inputStream.close(); } } public static AudioFileFormat getAudioFileFormat(URL url) throws UnsupportedAudioFileException, IOException { InputStream inputStream = null; if (useragent != null) { URLConnection myCon = url.openConnection(); myCon.setUseCaches(false); myCon.setDoInput(true); myCon.setDoOutput(true); myCon.setAllowUserInteraction(false); myCon.setRequestProperty("User-Agent", useragent); myCon.setRequestProperty("Accept", "*/*"); myCon.setRequestProperty("Icy-Metadata", "1"); myCon.setRequestProperty("Connection", "close"); inputStream = new BufferedInputStream(myCon.getInputStream()); } else { inputStream = new BufferedInputStream(url.openStream()); } try { if (DEBUG == true) { System.err.println( "Using AppletMpegSPIWorkaround to get codec (AudioFileFormat:url)"); } //alexey fix: use another version of method return getAudioFileFormatForUrl(inputStream); //return getAudioFileFormat(inputStream); } finally { inputStream.close(); } } //alexey fix: we use MpegAudioFileReader's getAudioFileFormat public static AudioFileFormat getAudioFileFormatForUrl(InputStream is) throws UnsupportedAudioFileException, IOException { try { //return AudioSystem.getAudioFileFormat(is); throw new Exception(); } catch (Exception iae) { if (DEBUG == true) { System.err.println( "Using AppletMpegSPIWorkaround to get codec (AudioFileFormat)"); } try { Class.forName("javazoom.spi.mpeg.sampled.file.MpegAudioFileReader"); //Class.forName("org.tritonus.sampled.file.mpeg.MpegAudioFileReader"); // 2.2 Fix. //is.mark(4096); return new javazoom.spi.mpeg.sampled.file.MpegAudioFileReader(). //return new org.tritonus.sampled.file.mpeg.MpegAudioFileReader(). getAudioFileFormat(is, AudioSystem.NOT_SPECIFIED); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException("Mpeg codec not properly installed"); } } // 2.2 Fix. finally { //is.reset(); } } public static AudioFileFormat getAudioFileFormat(InputStream is) throws UnsupportedAudioFileException, IOException { try { //return AudioSystem.getAudioFileFormat(is); throw new Exception(); } catch (Exception iae) { if (DEBUG == true) { System.err.println( "Using AppletMpegSPIWorkaround to get codec (AudioFileFormat)"); } try { Class.forName("javazoom.spi.mpeg.sampled.file.MpegAudioFileReader"); //Class.forName("org.tritonus.sampled.file.mpeg.MpegAudioFileReader"); // 2.2 Fix. is.mark(4096); return new javazoom.spi.mpeg.sampled.file.MpegAudioFileReader(). //return new org.tritonus.sampled.file.mpeg.MpegAudioFileReader(). getAudioFileFormat(is); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException("Mpeg codec not properly installed"); } } // 2.2 Fix. finally { is.reset(); } } public static AudioInputStream getAudioInputStream(InputStream is) throws UnsupportedAudioFileException, IOException { try { //return AudioSystem.getAudioInputStream(is); throw new Exception(); } catch (Exception iae) { if (DEBUG == true) { System.err.println("Using AppletMpegSPIWorkaround to get codec"); } try { Class.forName("javazoom.spi.mpeg.sampled.file.MpegAudioFileReader"); //Class.forName("org.tritonus.sampled.file.mpeg.MpegAudioFileReader"); return new javazoom.spi.mpeg.sampled.file.MpegAudioFileReader().getAudioInputStream(is); //return new org.tritonus.sampled.file.mpeg.MpegAudioFileReader().getAudioInputStream(is); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException("Mpeg codec not properly installed"); } } } }extensions/soundspi/tritonus/src/org/tritonus/applet/AppletVorbisSPIWorkaround.java000066400000000000000000000164131335566474600314770ustar00rootroot00000000000000/* * AppletVorbisSPIWorkaround. * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package org.tritonus.applet; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; /** * From JRE/JDK 1.3.0_01 on, applets can not use provided service * providers. Obviously, in these later releases of the Java 2 platform * the service providers are only searched on the system/boot classloader * and NOT on the classloader of the applet. * Workaround found by Tritonus Team. */ public class AppletVorbisSPIWorkaround { public static boolean DEBUG = false; public static String useragent = null; public static AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream) { try { return AudioSystem.getAudioInputStream(targetFormat, sourceStream); } catch (IllegalArgumentException iae) { if (DEBUG == true) { System.err.println("Using AppletVorbisSPIWorkaround to get codec"); } try { Class.forName( //"javazoom.spi.vorbis.sampled.convert.VorbisFormatConversionProvider" "org.tritonus.sampled.convert.jorbis.JorbisFormatConversionProvider"); //return new javazoom.spi.vorbis.sampled.convert.VorbisFormatConversionProvider(). return new org.tritonus.sampled.convert.jorbis.JorbisFormatConversionProvider(). getAudioInputStream(targetFormat, sourceStream); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException( "Vorbis codec not properly installed"); } } } public static AudioFileFormat getAudioFileFormat(File file) throws UnsupportedAudioFileException, IOException { InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); try { if (DEBUG == true) { System.err.println( "Using AppletVorbisSPIWorkaround to get codec (AudioFileFormat:file)"); } return getAudioFileFormat(inputStream); } finally { inputStream.close(); } } public static AudioInputStream getAudioInputStream(File file) throws UnsupportedAudioFileException, IOException { InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); try { if (DEBUG == true) { System.err.println( "Using AppletVorbisSPIWorkaround to get codec (AudioInputStream:file)"); } return getAudioInputStream(inputStream); } catch (UnsupportedAudioFileException e) { inputStream.close(); throw e; } catch (IOException e) { inputStream.close(); throw e; } } public static AudioInputStream getAudioInputStream(URL url) throws UnsupportedAudioFileException, IOException { InputStream inputStream = new BufferedInputStream(url.openStream()); try { if (DEBUG == true) { System.err.println( "Using AppletVorbisSPIWorkaround to get codec (AudioInputStream:url)"); } return getAudioInputStream(inputStream); } catch (UnsupportedAudioFileException e) { inputStream.close(); throw e; } catch (IOException e) { inputStream.close(); throw e; } } public static AudioFileFormat getAudioFileFormat(URL url) throws UnsupportedAudioFileException, IOException { InputStream inputStream = null; if (useragent != null) { URLConnection myCon = url.openConnection(); myCon.setUseCaches(false); myCon.setDoInput(true); myCon.setDoOutput(true); myCon.setAllowUserInteraction(false); myCon.setRequestProperty("User-Agent", useragent); myCon.setRequestProperty("Accept", "*/*"); myCon.setRequestProperty("Icy-Metadata", "1"); myCon.setRequestProperty("Connection", "close"); inputStream = new BufferedInputStream(myCon.getInputStream()); } else { inputStream = new BufferedInputStream(url.openStream()); } try { if (DEBUG == true) { System.err.println( "Using AppletVorbisSPIWorkaround to get codec AudioFileFormat(url)"); } return getAudioFileFormat(inputStream); } finally { inputStream.close(); } } public static AudioFileFormat getAudioFileFormat(InputStream is) throws UnsupportedAudioFileException, IOException { try { //return AudioSystem.getAudioFileFormat(is); throw new Exception(); } catch (Exception iae) { if (DEBUG == true) { System.err.println("Using AppletVorbisSPIWorkaround to get codec"); } try { // 2.2 Fix. is.mark(4096); //Class.forName("javazoom.spi.vorbis.sampled.file.VorbisAudioFileReader"); Class.forName("org.tritonus.sampled.file.jorbis.JorbisAudioFileReader"); //return new javazoom.spi.vorbis.sampled.file.VorbisAudioFileReader(). return new org.tritonus.sampled.file.jorbis.JorbisAudioFileReader(). getAudioFileFormat(is); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException( "Vorbis codec not properly installed"); } } // 2.2 Fix. finally { is.reset(); } } public static AudioInputStream getAudioInputStream(InputStream is) throws UnsupportedAudioFileException, IOException { try { //return AudioSystem.getAudioInputStream(is); throw new Exception(); } catch (Exception iae) { if (DEBUG == true) { System.err.println("Using AppleVorbisSPIWorkaround to get codec"); } try { //Class.forName("javazoom.spi.vorbis.sampled.file.VorbisAudioFileReader"); Class.forName("org.tritonus.sampled.file.jorbis.JorbisAudioFileReader"); //return new javazoom.spi.vorbis.sampled.file.VorbisAudioFileReader(). return new org.tritonus.sampled.file.jorbis.JorbisAudioFileReader(). getAudioInputStream(is); } catch (ClassNotFoundException cnfe) { throw new IllegalArgumentException( "Vorbis codec not properly installed:" + cnfe.getMessage()); } } } }extensions/soundspi/tritonus/src/org/tritonus/applet/MpegAudioFileReaderWorkaround.java000066400000000000000000000072751335566474600323140ustar00rootroot00000000000000/* * MpegAudioFileReaderWorkaround. * *----------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package org.tritonus.applet; import javazoom.spi.mpeg.sampled.file.IcyListener; import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader; import javazoom.spi.mpeg.sampled.file.tag.IcyInputStream; import org.tritonus.share.TDebug; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; public class MpegAudioFileReaderWorkaround extends MpegAudioFileReader { /** * Returns AudioInputStream from url and userAgent */ public AudioInputStream getAudioInputStream(URL url, String userAgent) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) { TDebug.out("MpegAudioFileReaderWorkaround.getAudioInputStream(URL,String): begin"); } long lFileLengthInBytes = AudioSystem.NOT_SPECIFIED; URLConnection conn = url.openConnection(); // Tell shoucast server (if any) that SPI support shoutcast stream. boolean isShout = false; int toRead = 4; byte[] head = new byte[toRead]; if (userAgent != null) conn.setRequestProperty("User-Agent", userAgent); conn.setRequestProperty("Accept", "*/*"); conn.setRequestProperty("Icy-Metadata", "1"); conn.setRequestProperty("Connection", "close"); BufferedInputStream bInputStream = new BufferedInputStream(conn.getInputStream()); bInputStream.mark(toRead); int read = bInputStream.read(head, 0, toRead); if ((read > 2) && (((head[0] == 'I') | (head[0] == 'i')) && ((head[1] == 'C') | (head[1] == 'c')) && ((head[2] == 'Y') | (head[2] == 'y')))) { isShout = true; } bInputStream.reset(); InputStream inputStream = null; // Is is a shoutcast server ? if (isShout == true) { // Yes IcyInputStream icyStream = new IcyInputStream(bInputStream); icyStream.addTagParseListener(IcyListener.getInstance()); inputStream = icyStream; } else { // No, is Icecast 2 ? String metaint = conn.getHeaderField("icy-metaint"); if (metaint != null) { // Yes, it might be icecast 2 mp3 stream. IcyInputStream icyStream = new IcyInputStream(bInputStream, metaint); icyStream.addTagParseListener(IcyListener.getInstance()); inputStream = icyStream; } else { // No inputStream = bInputStream; } } AudioInputStream audioInputStream = null; try { audioInputStream = getAudioInputStream(inputStream, lFileLengthInBytes); } catch (UnsupportedAudioFileException e) { inputStream.close(); throw e; } catch (IOException e) { inputStream.close(); throw e; } if (TDebug.TraceAudioFileReader) { TDebug.out("MpegAudioFileReaderWorkaround.getAudioInputStream(URL,String): end"); } return audioInputStream; } }extensions/soundspi/tritonus/src/org/tritonus/lowlevel/000077500000000000000000000000001335566474600241315ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/lowlevel/lame/000077500000000000000000000000001335566474600250475ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/lowlevel/lame/Lame.java000066400000000000000000000347521335566474600266030ustar00rootroot00000000000000/* * Lame.java */ /* * Copyright (c) 2000,2001 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.lowlevel.lame; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.sound.sampled.AudioFormat; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.Encodings; public class Lame { // constants from lame.h private static final int MPEG_VERSION_2 = 0; // MPEG-2 private static final int MPEG_VERSION_1 = 1; // MPEG-1 private static final int MPEG_VERSION_2DOT5 = 2; // MPEG-2.5 public static final int QUALITY_LOWEST = 9; // low mean bitrate in VBR mode public static final int QUALITY_LOW = 7; public static final int QUALITY_MIDDLE = 5; public static final int QUALITY_HIGH = 2; // quality==0 not yet coded in LAME (3.83alpha) public static final int QUALITY_HIGHEST = 1; // high mean bitrate in VBR mode public static final int CHANNEL_MODE_STEREO = 0; public static final int CHANNEL_MODE_JOINT_STEREO = 1; public static final int CHANNEL_MODE_DUAL_CHANNEL = 2; public static final int CHANNEL_MODE_MONO = 3; // channel mode has no influence on mono files. public static final int CHANNEL_MODE_AUTO = -1; public static final int BITRATE_AUTO = -1; // suggested maximum buffer size for an mpeg frame private static final int DEFAULT_PCM_BUFFER_SIZE=2048*16; // frame size=576 for MPEG2 and MPEG2.5 // =576*2 for MPEG1 private static boolean libAvailable=false; private static String linkError=""; private static int DEFAULT_QUALITY = QUALITY_MIDDLE; private static int DEFAULT_BITRATE = BITRATE_AUTO; private static int DEFAULT_CHANNEL_MODE = CHANNEL_MODE_AUTO; // in VBR mode, bitrate is ignored. private static boolean DEFAULT_VBR = false; private static final int OUT_OF_MEMORY = -300; private static final int NOT_INITIALIZED = -301; private static final int LAME_ENC_NOT_FOUND = -302; private static final String PROPERTY_PREFIX = "tritonus.lame."; static { try { System.loadLibrary("lametritonus"); libAvailable=true; } catch (UnsatisfiedLinkError e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } linkError=e.getMessage(); } } /** * Holds LameConf * This field is long because on 64 bit architectures, the native * size of ints may be 64 bit. */ private long m_lNativeGlobalFlags; // these fields are set upon successful initialization to show effective values. private int effQuality; private int effBitRate; private int effVbr; private int effChMode; private int effSampleRate; private int effEncoding; private void handleNativeException(int resultCode) { close(); if (resultCode==OUT_OF_MEMORY) { throw new OutOfMemoryError("out of memory"); } else if (resultCode==NOT_INITIALIZED) { throw new RuntimeException("not initialized"); } else if (resultCode==LAME_ENC_NOT_FOUND) { libAvailable=false; linkError="lame_enc.dll not found"; throw new IllegalArgumentException(linkError); } } /** * Initializes the decoder with * DEFAULT_BITRATE, DEFAULT_CHANNEL_MODE, DEFAULT_QUALITY, and DEFAULT_VBR * Throws IllegalArgumentException when parameters are not supported * by LAME. */ public Lame(AudioFormat sourceFormat) { initParams(sourceFormat); } /** * Initializes the decoder. * Throws IllegalArgumentException when parameters are not supported * by LAME. */ public Lame(AudioFormat sourceFormat, int bitRate, int channelMode, int quality, boolean VBR) { initParams(sourceFormat, bitRate, channelMode, quality, VBR); } private void initParams(AudioFormat sourceFormat) { readParameters(); initParams(sourceFormat, DEFAULT_BITRATE, DEFAULT_CHANNEL_MODE, DEFAULT_QUALITY, DEFAULT_VBR); } private void initParams(AudioFormat sourceFormat, int bitRate, int channelMode, int quality, boolean VBR) { // simple check that bitrate is not too high for MPEG2 and MPEG2.5 // todo: exception ? if (sourceFormat.getSampleRate()<32000 && bitRate>160) { bitRate=160; } if (TDebug.TraceAudioConverter) { TDebug.out("LAME parameters: channels="+sourceFormat.getChannels() +" sample rate="+((int) Math.round(sourceFormat.getSampleRate())+"Hz") +" bitrate="+bitRate+"KBit/s"); TDebug.out(" channelMode="+chmode2string(channelMode) +" quality="+quality2string(quality) +" VBR="+VBR+" bigEndian="+sourceFormat.isBigEndian()); } int result=nInitParams(sourceFormat.getChannels(), (int) Math.round(sourceFormat.getSampleRate()), bitRate, channelMode, quality, VBR, sourceFormat.isBigEndian()); if (result<0) { handleNativeException(result); throw new IllegalArgumentException( "parameters not supported by LAME (returned "+result+")"); } // provide effective parameters to user-space try { System.setProperty(PROPERTY_PREFIX + "effective.quality", quality2string(getEffectiveQuality())); System.setProperty(PROPERTY_PREFIX + "effective.bitrate", String.valueOf(getEffectiveBitRate())); System.setProperty(PROPERTY_PREFIX + "effective.chmode", chmode2string(getEffectiveChannelMode())); System.setProperty(PROPERTY_PREFIX + "effective.vbr", String.valueOf(getEffectiveVBR())); System.setProperty(PROPERTY_PREFIX + "effective.samplerate", String.valueOf(getEffectiveSampleRate())); System.setProperty(PROPERTY_PREFIX + "effective.encoding", getEffectiveEncoding().toString()); System.setProperty(PROPERTY_PREFIX + "encoder.version", getEncoderVersion()); } catch (Throwable t) { if (TDebug.TraceAllExceptions) { TDebug.out(t); } } } /** * Initializes the lame encoder. * Throws IllegalArgumentException when parameters are not supported * by LAME. */ private native int nInitParams(int channels, int sampleRate, int bitrate, int mode, int quality, boolean VBR, boolean bigEndian); /** * returns -1 if string is too short * or returns one of the exception constants * if everything OK, returns the length of the string */ private native int nGetEncoderVersion(byte[] string); public String getEncoderVersion() { byte[] string=new byte[300]; int res=nGetEncoderVersion(string); if (res<0) { if (res==-1) { throw new RuntimeException("Unexpected error in Lame.getEncoderVersion()"); } handleNativeException(res); } String sRes=""; if (res>0) { try { sRes=new String(string, 0, res, "ISO-8859-1"); } catch (UnsupportedEncodingException uee) { if (TDebug.TraceAllExceptions) { TDebug.out(uee); } sRes=new String(string, 0, res); } } return sRes; } private native int nGetPCMBufferSize(int suggested); /** * Returns the buffer needed pcm buffer size. * The passed parameter is a wished buffer size. * The implementation of the encoder may return * a lower or higher buffer size. * The encoder must be initalized (i.e. not closed) at this point. * A return value of <0 denotes an error. */ public int getPCMBufferSize() { int ret=nGetPCMBufferSize(DEFAULT_PCM_BUFFER_SIZE); if (ret<0) { handleNativeException(ret); throw new RuntimeException("Unknown error in Lame.nGetPCMBufferSize(). Resultcode="+ret); } return ret; } public int getMP3BufferSize() { // bad estimate :) return getPCMBufferSize()/2+1024; } private native int nEncodeBuffer(byte[] pcm, int offset, int length, byte[] encoded); /** * Encode a block of data. Throws IllegalArgumentException when parameters * are wrong. * When the encoded array is too small, * an ArrayIndexOutOfBoundsException is thrown. * length should be the value returned by getPCMBufferSize. * @return the number of bytes written to encoded. May be 0. */ public int encodeBuffer(byte[] pcm, int offset, int length, byte[] encoded) throws ArrayIndexOutOfBoundsException { if (length<0 || (offset+length)>pcm.length) { throw new IllegalArgumentException("inconsistent parameters"); } int result=nEncodeBuffer(pcm, offset, length, encoded); if (result<0) { if (result==-1) { throw new ArrayIndexOutOfBoundsException("Encode buffer too small"); } handleNativeException(result); throw new RuntimeException("crucial error in encodeBuffer."); } return result; } /** * Has to be called to finish encoding. encoded may be null. * * @return the number of bytes written to encoded */ private native int nEncodeFinish(byte[] encoded); public int encodeFinish(byte[] encoded) { return nEncodeFinish(encoded); } /* * Deallocates resources used by the native library. * *MUST* be called ! */ private native void nClose(); public void close() { nClose(); } /* * Returns whether the libraries are installed correctly. */ public static boolean isLibAvailable() { return libAvailable; } public static String getLinkError() { return linkError; } public int getEffectiveQuality() { if (effQuality>=QUALITY_LOWEST) { return QUALITY_LOWEST; } else if (effQuality>=QUALITY_LOW) { return QUALITY_LOW; } else if (effQuality>=QUALITY_MIDDLE) { return QUALITY_MIDDLE; } else if (effQuality>=QUALITY_HIGH) { return QUALITY_HIGH; } return QUALITY_HIGHEST; } public int getEffectiveBitRate() { return effBitRate; } public int getEffectiveChannelMode() { return effChMode; } public boolean getEffectiveVBR() { return effVbr!=0; } public int getEffectiveSampleRate() { return effSampleRate; } public AudioFormat.Encoding getEffectiveEncoding() { if (effEncoding==MPEG_VERSION_2) { if (getEffectiveSampleRate()<16000) { return Encodings.getEncoding("MPEG2DOT5L3"); } return Encodings.getEncoding("MPEG2L3"); } else if (effEncoding==MPEG_VERSION_2DOT5) { return Encodings.getEncoding("MPEG2DOT5L3"); } return Encodings.getEncoding("MPEG1L3"); } /** * workaround for missing paramtrization possibilities * for FormatConversionProviders */ private void readParameters() { String v=getStringProperty("quality", quality2string(DEFAULT_QUALITY)); DEFAULT_QUALITY=string2quality(v.toLowerCase(), DEFAULT_QUALITY); DEFAULT_BITRATE=getIntProperty("bitrate", DEFAULT_BITRATE); v=getStringProperty("chmode", chmode2string(DEFAULT_CHANNEL_MODE)); DEFAULT_CHANNEL_MODE=string2chmode(v.toLowerCase(), DEFAULT_CHANNEL_MODE); DEFAULT_VBR = getBooleanProperty("vbr", DEFAULT_VBR); // set the parameters back so that user program can verify them try { System.setProperty(PROPERTY_PREFIX + "quality", quality2string(DEFAULT_QUALITY)); System.setProperty(PROPERTY_PREFIX + "bitrate", String.valueOf(DEFAULT_BITRATE)); System.setProperty(PROPERTY_PREFIX + "chmode", chmode2string(DEFAULT_CHANNEL_MODE)); System.setProperty(PROPERTY_PREFIX + "vbr", String.valueOf(DEFAULT_VBR)); } catch (Throwable t) { if (TDebug.TraceAllExceptions) { TDebug.out(t); } } } private String quality2string(int quality) { if (quality>=QUALITY_LOWEST) { return "lowest"; } else if (quality>=QUALITY_LOW) { return "low"; } else if (quality>=QUALITY_MIDDLE) { return "middle"; } else if (quality>=QUALITY_HIGH) { return "high"; } return "highest"; } private int string2quality(String quality, int def) { if (quality.equals("lowest")) { return QUALITY_LOWEST; } else if (quality.equals("low")) { return QUALITY_LOW; } else if (quality.equals("middle")) { return QUALITY_MIDDLE; } else if (quality.equals("high")) { return QUALITY_HIGH; } else if (quality.equals("highest")) { return QUALITY_HIGHEST; } return def; } private String chmode2string(int chmode) { if (chmode==CHANNEL_MODE_STEREO) { return "stereo"; } else if (chmode==CHANNEL_MODE_JOINT_STEREO) { return "jointstereo"; } else if (chmode==CHANNEL_MODE_DUAL_CHANNEL) { return "dual"; } else if (chmode==CHANNEL_MODE_MONO) { return "mono"; } else if (chmode==CHANNEL_MODE_AUTO) { return "auto"; } return "auto"; } private int string2chmode(String chmode, int def) { if (chmode.equals("stereo")) { return CHANNEL_MODE_STEREO; } else if (chmode.equals("jointstereo")) { return CHANNEL_MODE_JOINT_STEREO; } else if (chmode.equals("dual")) { return CHANNEL_MODE_DUAL_CHANNEL; } else if (chmode.equals("mono")) { return CHANNEL_MODE_MONO; } else if (chmode.equals("auto")) { return CHANNEL_MODE_AUTO; } return def; } private static boolean getBooleanProperty(String strName, boolean def) { String strPropertyName = PROPERTY_PREFIX + strName; String strValue = def ? "true":"false"; try { strValue = System.getProperty(strPropertyName, strValue); } catch (Throwable t) { if (TDebug.TraceAllExceptions) { TDebug.out(t); } } strValue=strValue.toLowerCase(); boolean bValue=false; if (strValue.length()>0) { if (def) { bValue=(strValue.charAt(0)!='f') // false && (strValue.charAt(0)!='n') // no && (!strValue.equals("off")); } else { bValue=(strValue.charAt(0)=='t') // true || (strValue.charAt(0)=='y') // yes || (strValue.equals("on")); } } return bValue; } private static String getStringProperty(String strName, String def) { String strPropertyName = PROPERTY_PREFIX + strName; String strValue = def; try { strValue = System.getProperty(strPropertyName, def); } catch (Throwable t) { if (TDebug.TraceAllExceptions) { TDebug.out(t); } } return strValue; } private static int getIntProperty(String strName, int def) { String strPropertyName = PROPERTY_PREFIX + strName; int value = def; try { String strValue = System.getProperty(strPropertyName, String.valueOf(def)); value=new Integer(strValue).intValue(); } catch (Throwable e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } } return value; } } /*** Lame.java ***/ extensions/soundspi/tritonus/src/org/tritonus/sampled/000077500000000000000000000000001335566474600237255ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/sampled/convert/000077500000000000000000000000001335566474600254055ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/sampled/convert/javalayer/000077500000000000000000000000001335566474600273635ustar00rootroot00000000000000MpegFormatConversionProvider.java000066400000000000000000000560541335566474600360030ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/sampled/convert/javalayer/* * MpegFormatConversionProvider.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.sampled.convert.javalayer; import java.io.InputStream; import java.io.IOException; import java.util.Arrays; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.sampled.TConversionTool; import org.tritonus.share.sampled.convert.TMatrixFormatConversionProvider; import org.tritonus.share.sampled.convert.TAsynchronousFilteredAudioInputStream; import javazoom.jl.decoder.Bitstream; import javazoom.jl.decoder.BitstreamException; import javazoom.jl.decoder.Decoder; import javazoom.jl.decoder.DecoderException; import javazoom.jl.decoder.Header; import javazoom.jl.decoder.Obuffer; /** * ConversionProvider for MPEG files. * * @author Matthias Pfisterer */ public class MpegFormatConversionProvider extends TMatrixFormatConversionProvider { public static final AudioFormat.Encoding MPEG1L1 = Encodings.getEncoding("MPEG1L1"); public static final AudioFormat.Encoding MPEG1L2 = Encodings.getEncoding("MPEG1L2"); public static final AudioFormat.Encoding MPEG1L3 = Encodings.getEncoding("MPEG1L3"); public static final AudioFormat.Encoding MPEG2L1 = Encodings.getEncoding("MPEG2L1"); public static final AudioFormat.Encoding MPEG2L2 = Encodings.getEncoding("MPEG2L2"); public static final AudioFormat.Encoding MPEG2L3 = Encodings.getEncoding("MPEG2L3"); public static final AudioFormat.Encoding MPEG2DOT5L1 = Encodings.getEncoding("MPEG2DOT5L1"); public static final AudioFormat.Encoding MPEG2DOT5L2 = Encodings.getEncoding("MPEG2DOT5L2"); public static final AudioFormat.Encoding MPEG2DOT5L3 = Encodings.getEncoding("MPEG2DOT5L3"); /* private static final AudioFormat.Encoding[] INPUT_ENCODINGS = { MPEG1L1, MPEG1L2, MPEG1L3, MPEG2L1, MPEG2L2, MPEG2L3, MPEG2DOT5L1, MPEG2DOT5L2, MPEG2DOT5L3 }; private static final AudioFormat.Encoding[] OUTPUT_ENCODINGS = { AudioFormat.Encoding.PCM_SIGNED }; */ // TODO: frame size, frame rate, sample size, endianess? private static final AudioFormat[] INPUT_FORMATS = { new AudioFormat(MPEG1L1, 32000.0F, -1, 1, -1, -1, false), // 0 new AudioFormat(MPEG1L1, 32000.0F, -1, 2, -1, -1, false), // 1 new AudioFormat(MPEG1L1, 44100.0F, -1, 1, -1, -1, false), // 2 new AudioFormat(MPEG1L1, 44100.0F, -1, 2, -1, -1, false), // 3 new AudioFormat(MPEG1L1, 48000.0F, -1, 1, -1, -1, false), // 4 new AudioFormat(MPEG1L1, 48000.0F, -1, 2, -1, -1, false), // 5 new AudioFormat(MPEG1L2, 32000.0F, -1, 1, -1, -1, false), // 6 new AudioFormat(MPEG1L2, 32000.0F, -1, 2, -1, -1, false), // 7 new AudioFormat(MPEG1L2, 44100.0F, -1, 1, -1, -1, false), // 8 new AudioFormat(MPEG1L2, 44100.0F, -1, 2, -1, -1, false), // 9 new AudioFormat(MPEG1L2, 48000.0F, -1, 1, -1, -1, false), // 10 new AudioFormat(MPEG1L2, 48000.0F, -1, 2, -1, -1, false), // 11 new AudioFormat(MPEG1L3, 32000.0F, -1, 1, -1, -1, false), // 12 new AudioFormat(MPEG1L3, 32000.0F, -1, 2, -1, -1, false), // 13 new AudioFormat(MPEG1L3, 44100.0F, -1, 1, -1, -1, false), // 14 new AudioFormat(MPEG1L3, 44100.0F, -1, 2, -1, -1, false), // 15 new AudioFormat(MPEG1L3, 48000.0F, -1, 1, -1, -1, false), // 16 new AudioFormat(MPEG1L3, 48000.0F, -1, 2, -1, -1, false), // 17 new AudioFormat(MPEG2L1, 16000.0F, -1, 1, -1, -1, false), // 18 new AudioFormat(MPEG2L1, 16000.0F, -1, 2, -1, -1, false), // 19 new AudioFormat(MPEG2L1, 22050.0F, -1, 1, -1, -1, false), // 20 new AudioFormat(MPEG2L1, 22050.0F, -1, 2, -1, -1, false), // 21 new AudioFormat(MPEG2L1, 24000.0F, -1, 1, -1, -1, false), // 22 new AudioFormat(MPEG2L1, 24000.0F, -1, 2, -1, -1, false), // 23 new AudioFormat(MPEG2L2, 16000.0F, -1, 1, -1, -1, false), // 24 new AudioFormat(MPEG2L2, 16000.0F, -1, 2, -1, -1, false), // 25 new AudioFormat(MPEG2L2, 22050.0F, -1, 1, -1, -1, false), // 26 new AudioFormat(MPEG2L2, 22050.0F, -1, 2, -1, -1, false), // 27 new AudioFormat(MPEG2L2, 24000.0F, -1, 1, -1, -1, false), // 28 new AudioFormat(MPEG2L2, 24000.0F, -1, 2, -1, -1, false), // 29 new AudioFormat(MPEG2L3, 16000.0F, -1, 1, -1, -1, false), // 30 new AudioFormat(MPEG2L3, 16000.0F, -1, 2, -1, -1, false), // 31 new AudioFormat(MPEG2L3, 22050.0F, -1, 1, -1, -1, false), // 32 new AudioFormat(MPEG2L3, 22050.0F, -1, 2, -1, -1, false), // 33 new AudioFormat(MPEG2L3, 24000.0F, -1, 1, -1, -1, false), // 34 new AudioFormat(MPEG2L3, 24000.0F, -1, 2, -1, -1, false), // 35 new AudioFormat(MPEG2DOT5L1, 8000.0F, -1, 1, -1, -1, false), // 36 new AudioFormat(MPEG2DOT5L1, 8000.0F, -1, 2, -1, -1, false), // 37 new AudioFormat(MPEG2DOT5L1, 11025.0F, -1, 1, -1, -1, false), // 38 new AudioFormat(MPEG2DOT5L1, 11025.0F, -1, 2, -1, -1, false), // 39 new AudioFormat(MPEG2DOT5L1, 12000.0F, -1, 1, -1, -1, false), // 40 new AudioFormat(MPEG2DOT5L1, 12000.0F, -1, 2, -1, -1, false), // 41 new AudioFormat(MPEG2DOT5L2, 8000.0F, -1, 1, -1, -1, false), // 42 new AudioFormat(MPEG2DOT5L2, 8000.0F, -1, 2, -1, -1, false), // 43 new AudioFormat(MPEG2DOT5L2, 11025.0F, -1, 1, -1, -1, false), // 44 new AudioFormat(MPEG2DOT5L2, 11025.0F, -1, 2, -1, -1, false), // 45 new AudioFormat(MPEG2DOT5L2, 12000.0F, -1, 1, -1, -1, false), // 46 new AudioFormat(MPEG2DOT5L2, 12000.0F, -1, 2, -1, -1, false), // 47 new AudioFormat(MPEG2DOT5L3, 8000.0F, -1, 1, -1, -1, false), // 48 new AudioFormat(MPEG2DOT5L3, 8000.0F, -1, 2, -1, -1, false), // 49 new AudioFormat(MPEG2DOT5L3, 11025.0F, -1, 1, -1, -1, false), // 50 new AudioFormat(MPEG2DOT5L3, 11025.0F, -1, 2, -1, -1, false), // 51 new AudioFormat(MPEG2DOT5L3, 12000.0F, -1, 1, -1, -1, false), // 52 new AudioFormat(MPEG2DOT5L3, 12000.0F, -1, 2, -1, -1, false), // 53 }; private static final AudioFormat[] OUTPUT_FORMATS = { new AudioFormat(8000.0F, 16, 1, true, false), // 0 new AudioFormat(8000.0F, 16, 1, true, true), // 1 new AudioFormat(8000.0F, 16, 2, true, false), // 2 new AudioFormat(8000.0F, 16, 2, true, true), // 3 /* 24 and 32 bit not yet possible new AudioFormat(8000.0F, 24, 1, true, false), new AudioFormat(8000.0F, 24, 1, true, true), new AudioFormat(8000.0F, 24, 2, true, false), new AudioFormat(8000.0F, 24, 2, true, true), new AudioFormat(8000.0F, 32, 1, true, false), new AudioFormat(8000.0F, 32, 1, true, true), new AudioFormat(8000.0F, 32, 2, true, false), new AudioFormat(8000.0F, 32, 2, true, true), */ new AudioFormat(11025.0F, 16, 1, true, false), // 4 new AudioFormat(11025.0F, 16, 1, true, true), // 5 new AudioFormat(11025.0F, 16, 2, true, false), // 6 new AudioFormat(11025.0F, 16, 2, true, true), // 7 /* 24 and 32 bit not yet possible new AudioFormat(11025.0F, 24, 1, true, false), new AudioFormat(11025.0F, 24, 1, true, true), new AudioFormat(11025.0F, 24, 2, true, false), new AudioFormat(11025.0F, 24, 2, true, true), new AudioFormat(11025.0F, 32, 1, true, false), new AudioFormat(11025.0F, 32, 1, true, true), new AudioFormat(11025.0F, 32, 2, true, false), new AudioFormat(11025.0F, 32, 2, true, true), */ new AudioFormat(12000.0F, 16, 1, true, false), // 8 new AudioFormat(12000.0F, 16, 1, true, true), // 9 new AudioFormat(12000.0F, 16, 2, true, false), // 10 new AudioFormat(12000.0F, 16, 2, true, true), // 11 /* 24 and 32 bit not yet possible new AudioFormat(12000.0F, 24, 1, true, false), new AudioFormat(12000.0F, 24, 1, true, true), new AudioFormat(12000.0F, 24, 2, true, false), new AudioFormat(12000.0F, 24, 2, true, true), new AudioFormat(12000.0F, 32, 1, true, false), new AudioFormat(12000.0F, 32, 1, true, true), new AudioFormat(12000.0F, 32, 2, true, false), new AudioFormat(12000.0F, 32, 2, true, true), */ new AudioFormat(16000.0F, 16, 1, true, false), // 12 new AudioFormat(16000.0F, 16, 1, true, true), // 13 new AudioFormat(16000.0F, 16, 2, true, false), // 14 new AudioFormat(16000.0F, 16, 2, true, true), // 15 /* 24 and 32 bit not yet possible new AudioFormat(16000.0F, 24, 1, true, false), new AudioFormat(16000.0F, 24, 1, true, true), new AudioFormat(16000.0F, 24, 2, true, false), new AudioFormat(16000.0F, 24, 2, true, true), new AudioFormat(16000.0F, 32, 1, true, false), new AudioFormat(16000.0F, 32, 1, true, true), new AudioFormat(16000.0F, 32, 2, true, false), new AudioFormat(16000.0F, 32, 2, true, true), */ new AudioFormat(22050.0F, 16, 1, true, false), // 16 new AudioFormat(22050.0F, 16, 1, true, true), // 17 new AudioFormat(22050.0F, 16, 2, true, false), // 18 new AudioFormat(22050.0F, 16, 2, true, true), // 19 /* 24 and 32 bit not yet possible new AudioFormat(22050.0F, 24, 1, true, false), new AudioFormat(22050.0F, 24, 1, true, true), new AudioFormat(22050.0F, 24, 2, true, false), new AudioFormat(22050.0F, 24, 2, true, true), new AudioFormat(22050.0F, 32, 1, true, false), new AudioFormat(22050.0F, 32, 1, true, true), new AudioFormat(22050.0F, 32, 2, true, false), new AudioFormat(22050.0F, 32, 2, true, true), */ new AudioFormat(24000.0F, 16, 1, true, false), // 20 new AudioFormat(24000.0F, 16, 1, true, true), // 21 new AudioFormat(24000.0F, 16, 2, true, false), // 22 new AudioFormat(24000.0F, 16, 2, true, true), // 23 /* 24 and 32 bit not yet possible new AudioFormat(24000.0F, 24, 1, true, false), new AudioFormat(24000.0F, 24, 1, true, true), new AudioFormat(24000.0F, 24, 2, true, false), new AudioFormat(24000.0F, 24, 2, true, true), new AudioFormat(24000.0F, 32, 1, true, false), new AudioFormat(24000.0F, 32, 1, true, true), new AudioFormat(24000.0F, 32, 2, true, false), new AudioFormat(24000.0F, 32, 2, true, true), */ new AudioFormat(32000.0F, 16, 1, true, false), // 24 new AudioFormat(32000.0F, 16, 1, true, true), // 25 new AudioFormat(32000.0F, 16, 2, true, false), // 26 new AudioFormat(32000.0F, 16, 2, true, true), // 27 /* 24 and 32 bit not yet possible new AudioFormat(32000.0F, 24, 1, true, false), new AudioFormat(32000.0F, 24, 1, true, true), new AudioFormat(32000.0F, 24, 2, true, false), new AudioFormat(32000.0F, 24, 2, true, true), new AudioFormat(32000.0F, 32, 1, true, false), new AudioFormat(32000.0F, 32, 1, true, true), new AudioFormat(32000.0F, 32, 2, true, false), new AudioFormat(32000.0F, 32, 2, true, true), */ new AudioFormat(44100.0F, 16, 1, true, false), // 28 new AudioFormat(44100.0F, 16, 1, true, true), // 29 new AudioFormat(44100.0F, 16, 2, true, false), // 30 new AudioFormat(44100.0F, 16, 2, true, true), // 31 /* 24 and 32 bit not yet possible new AudioFormat(44100.0F, 24, 1, true, false), new AudioFormat(44100.0F, 24, 1, true, true), new AudioFormat(44100.0F, 24, 2, true, false), new AudioFormat(44100.0F, 24, 2, true, true), new AudioFormat(44100.0F, 32, 1, true, false), new AudioFormat(44100.0F, 32, 1, true, true), new AudioFormat(44100.0F, 32, 2, true, false), new AudioFormat(44100.0F, 32, 2, true, true), */ new AudioFormat(48000.0F, 16, 1, true, false), // 32 new AudioFormat(48000.0F, 16, 1, true, true), // 33 new AudioFormat(48000.0F, 16, 2, true, false), // 34 new AudioFormat(48000.0F, 16, 2, true, true), // 35 /* 24 and 32 bit not yet possible new AudioFormat(48000.0F, 24, 1, true, false), new AudioFormat(48000.0F, 24, 1, true, true), new AudioFormat(48000.0F, 24, 2, true, false), new AudioFormat(48000.0F, 24, 2, true, true), new AudioFormat(48000.0F, 32, 1, true, false), new AudioFormat(48000.0F, 32, 1, true, true), new AudioFormat(48000.0F, 32, 2, true, false), new AudioFormat(48000.0F, 32, 2, true, true), */ }; private static final boolean t = true; private static final boolean f = false; /* * One row for each source format. */ private static final boolean[][] CONVERSIONS = { {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f}, // 0 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f}, // 1 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f}, // 2 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f}, // 3 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f}, // 4 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t}, // 5 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f}, // 6 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f}, // 7 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f}, // 8 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f}, // 9 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f}, // 10 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t}, // 11 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f}, // 12 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f}, // 13 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f}, // 14 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f}, // 15 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f}, // 16 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t}, // 17 {f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 18 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 19 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 20 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 21 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 22 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f}, // 23 {f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 24 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 25 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 26 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 27 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 28 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f}, // 29 {f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 30 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 31 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 32 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 33 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 34 {f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f}, // 35 {t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 36 {f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 37 {f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 38 {f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 39 {f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 40 {f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 41 {t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 42 {f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 43 {f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 44 {f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 45 {f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 46 {f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 47 {t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 48 {f,f,t,t,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 49 {f,f,f,f,t,t,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 50 {f,f,f,f,f,f,t,t,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 51 {f,f,f,f,f,f,f,f,t,t, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 52 {f,f,f,f,f,f,f,f,f,f, t,t,f,f,f,f,f,f,f,f, f,f,f,f,f,f,f,f,f,f, f,f,f,f,f,f}, // 53 }; /** Constructor. */ public MpegFormatConversionProvider() { super(Arrays.asList(INPUT_FORMATS), Arrays.asList(OUTPUT_FORMATS), CONVERSIONS); if (TDebug.TraceAudioConverter) { TDebug.out("MpegFormatConversionProvider.(): begin"); } if (TDebug.TraceAudioConverter) { TDebug.out("MpegFormatConversionProvider.(): end"); } } public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream audioInputStream) { if (TDebug.TraceAudioConverter) { TDebug.out("MpegFormatConversionProvider.getAudioInputStream(AudioFormat, AudioInputStream):"); TDebug.out("trying to convert"); TDebug.out("\tfrom: " + audioInputStream.getFormat()); TDebug.out("\tto: " + targetFormat); } AudioFormat matchingFormat = getMatchingFormat( targetFormat, audioInputStream.getFormat()); // if (isConversionSupported(targetFormat, // audioInputStream.getFormat())) if (matchingFormat != null) { if (TDebug.TraceAudioConverter) { TDebug.out("MpegFormatConversionProvider.getAudioInputStream(AudioFormat, AudioInputStream):"); TDebug.out("\tisConversionSupported() accepted it; now setting up the conversion"); } targetFormat = setUnspecifiedFieldsFromProto(targetFormat, matchingFormat); if (TDebug.TraceAudioConverter) { TDebug.out("MpegFormatConversionProvider.getAudioInputStream(AudioFormat, AudioInputStream):"); TDebug.out("\tcompleted target format (1. stage): " + targetFormat); } targetFormat = setUnspecifiedFieldsFromProto(targetFormat, audioInputStream.getFormat()); if (TDebug.TraceAudioConverter) { TDebug.out("MpegFormatConversionProvider.getAudioInputStream(AudioFormat, AudioInputStream):"); TDebug.out("\tcompleted target format (2. stage): " + targetFormat); } return new DecodedMpegAudioInputStream( targetFormat, audioInputStream); } else { throw new IllegalArgumentException("conversion not supported"); } } // TODO: ask Florian if these methods are of general interest private static AudioFormat setUnspecifiedFieldsFromProto( AudioFormat incomplete, AudioFormat prototype) { AudioFormat format = new AudioFormat( incomplete.getEncoding(), getSpecificValue(incomplete.getSampleRate(), prototype.getSampleRate()), getSpecificValue(incomplete.getSampleSizeInBits(), prototype.getSampleSizeInBits()), getSpecificValue(incomplete.getChannels(), prototype.getChannels()), getSpecificValue(incomplete.getFrameSize(), prototype.getFrameSize()), getSpecificValue(incomplete.getFrameRate(), prototype.getFrameRate()), incomplete.isBigEndian()); return format; } private static float getSpecificValue(float fIncomplete, float fProto) { return (fIncomplete == AudioSystem.NOT_SPECIFIED) ? fProto : fIncomplete; } private static int getSpecificValue(int nIncomplete, int nProto) { return (nIncomplete == AudioSystem.NOT_SPECIFIED) ? nProto : nIncomplete; } public static class DecodedMpegAudioInputStream extends TAsynchronousFilteredAudioInputStream { private InputStream m_encodedStream; private Bitstream m_bitstream; private Decoder m_decoder; private DMAISObuffer m_oBuffer; public DecodedMpegAudioInputStream(AudioFormat outputFormat, AudioInputStream inputStream) { // TODO: try to find out length (possible?) super(outputFormat, AudioSystem.NOT_SPECIFIED); m_encodedStream = inputStream; m_bitstream = new Bitstream(inputStream); m_decoder = new Decoder(null); m_oBuffer = new DMAISObuffer(outputFormat.getChannels()); m_decoder.setOutputBuffer(m_oBuffer); } public void execute() { try { Header header = m_bitstream.readFrame(); if (header == null) { if (TDebug.TraceAudioConverter) { TDebug.out("header is null (end of mpeg stream)"); } getCircularBuffer().close(); return; } Obuffer decoderOutput = m_decoder.decodeFrame(header, m_bitstream); m_bitstream.closeFrame(); getCircularBuffer().write(m_oBuffer.getBuffer(), 0, m_oBuffer.getCurrentBufferSize()); m_oBuffer.reset(); } catch (BitstreamException e) { if (TDebug.TraceAudioConverter || TDebug.TraceAllExceptions) { TDebug.out(e); } } catch (DecoderException e) { if (TDebug.TraceAudioConverter || TDebug.TraceAllExceptions) { TDebug.out(e); } } } private boolean isBigEndian() { return getFormat().isBigEndian(); } public void close() throws IOException { super.close(); m_encodedStream.close(); } private class DMAISObuffer extends Obuffer { private int m_nChannels; private byte[] m_abBuffer; private int[] m_anBufferPointers; private boolean m_bIsBigEndian; public DMAISObuffer(int nChannels) { m_nChannels = nChannels; m_abBuffer = new byte[OBUFFERSIZE * nChannels]; m_anBufferPointers = new int[nChannels]; reset(); m_bIsBigEndian = DecodedMpegAudioInputStream.this.isBigEndian(); } public void append(int nChannel, short sValue) { // TODO: replace by TConversionTool methods /* byte bFirstByte; byte bSecondByte; if (m_bIsBigEndian) { bFirstByte = (byte) ((sValue >>> 8) & 0xFF); bSecondByte = (byte) (sValue & 0xFF); } else // little endian { bFirstByte = (byte) (sValue & 0xFF); bSecondByte = (byte) ((sValue >>> 8) & 0xFF); } m_abBuffer[m_anBufferPointers[nChannel]] = bFirstByte; m_abBuffer[m_anBufferPointers[nChannel] + 1] = bSecondByte; */ TConversionTool.shortToBytes16(sValue, m_abBuffer, m_anBufferPointers[nChannel], m_bIsBigEndian); m_anBufferPointers[nChannel] += m_nChannels * 2; } public void set_stop_flag() { } public void close() { } public void write_buffer(int nValue) { } public void clear_buffer() { } public byte[] getBuffer() { return m_abBuffer; } public int getCurrentBufferSize() { return m_anBufferPointers[0]; } public void reset() { for (int i = 0; i < m_nChannels; i++) { /* Points to byte location, * implicitely assuming 16 bit * samples. */ m_anBufferPointers[i] = i * 2; } } } } } /*** MpegFormatConversionProvider.java ***/ extensions/soundspi/tritonus/src/org/tritonus/sampled/convert/jorbis/000077500000000000000000000000001335566474600266755ustar00rootroot00000000000000JorbisFormatConversionProvider.java000066400000000000000000000466141335566474600356560ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/sampled/convert/jorbis/* * JorbisFormatConversionProvider.java */ /* * Copyright (c) 1999 - 2003 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* |<--- this code is formatted to fit into 80 columns --->| */ package org.tritonus.sampled.convert.jorbis; import java.io.EOFException; import java.io.InputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.AudioFormats; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.sampled.convert.TAsynchronousFilteredAudioInputStream; import org.tritonus.share.sampled.convert.TEncodingFormatConversionProvider; import com.jcraft.jogg.SyncState; import com.jcraft.jogg.StreamState; import com.jcraft.jogg.Page; import com.jcraft.jogg.Packet; import com.jcraft.jorbis.Info; import com.jcraft.jorbis.Comment; import com.jcraft.jorbis.DspState; import com.jcraft.jorbis.Block; /** Pure-java decoder for ogg vorbis streams. The FormatConversionProvider uses the pure-java ogg vorbis decoder from www.jcraft.com/jorbis/. @author Matthias Pfisterer */ public class JorbisFormatConversionProvider extends TEncodingFormatConversionProvider { // only used as abbreviation private static final AudioFormat.Encoding VORBIS = Encodings.getEncoding("VORBIS"); private static final AudioFormat.Encoding PCM_SIGNED = Encodings.getEncoding("PCM_SIGNED"); private static final AudioFormat[] INPUT_FORMATS = { // mono // TODO: mechanism to make the double specification with // different endianess obsolete. new AudioFormat(VORBIS, -1.0F, -1, 1, -1, -1.0F, false), new AudioFormat(VORBIS, -1.0F, -1, 1, -1, -1.0F, true), // stereo new AudioFormat(VORBIS, -1.0F, -1, 2, -1, -1.0F, false), new AudioFormat(VORBIS, -1.0F, -1, 2, -1, -1.0F, true), // TODO: other channel configurations }; private static final AudioFormat[] OUTPUT_FORMATS = { // mono, 16 bit signed new AudioFormat(PCM_SIGNED, -1.0F, 16, 1, 2, -1.0F, false), new AudioFormat(PCM_SIGNED, -1.0F, 16, 1, 2, -1.0F, true), // stereo, 16 bit signed new AudioFormat(PCM_SIGNED, -1.0F, 16, 2, 4, -1.0F, false), new AudioFormat(PCM_SIGNED, -1.0F, 16, 2, 4, -1.0F, true), // TODO: other channel configurations }; /** Constructor. */ // TODO: check interaction with base class public JorbisFormatConversionProvider() { super(Arrays.asList(INPUT_FORMATS), Arrays.asList(OUTPUT_FORMATS)/*, true, // new behaviour false*/); // bidirectional .. constants UNIDIR../BIDIR..? } public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream audioInputStream) { /** The AudioInputStream to return. */ AudioInputStream convertedAudioInputStream = null; if (TDebug.TraceAudioConverter) { TDebug.out(">JorbisFormatConversionProvider.getAudioInputStream(): begin"); TDebug.out("checking if conversion supported"); TDebug.out("from: " + audioInputStream.getFormat()); TDebug.out("to: " + targetFormat); } // what is this ??? targetFormat=getDefaultTargetFormat(targetFormat, audioInputStream.getFormat()); if (isConversionSupported(targetFormat, audioInputStream.getFormat())) { if (TDebug.TraceAudioConverter) { TDebug.out("conversion supported; trying to create DecodedJorbisAudioInputStream"); } convertedAudioInputStream = new DecodedJorbisAudioInputStream( targetFormat, audioInputStream); } else { if (TDebug.TraceAudioConverter) { TDebug.out("conversion not supported; throwing IllegalArgumentException"); TDebug.out("<"); } throw new IllegalArgumentException("conversion not supported"); } if (TDebug.TraceAudioConverter) { TDebug.out("(): begin"); } m_oggBitStream = bitStream; m_bHeadersExpected = true; init_jorbis(); if (TDebug.TraceAudioConverter) { TDebug.out("DecodedJorbisAudioInputStream.(): end"); } } /** * Initializes all the jOrbis and jOgg vars that are used for song playback. */ private void init_jorbis() { m_oggSyncState = new SyncState(); m_oggStreamState = new StreamState(); m_oggPage = new Page(); m_oggPacket = new Packet(); m_vorbisInfo = new Info(); m_vorbisComment = new Comment(); m_vorbisDspState = new DspState(); m_vorbisBlock = new Block(m_vorbisDspState); m_oggSyncState.init(); } /** Callback from circular buffer. */ public void execute() { if (TDebug.TraceAudioConverter) TDebug.out(">DecodedJorbisAudioInputStream.execute(): begin"); if (m_bHeadersExpected) { if (TDebug.TraceAudioConverter) TDebug.out("reading headers..."); // Headers (+ Comments). try { readHeaders(); } catch (IOException e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } closePhysicalStream(); if (TDebug.TraceAudioConverter) TDebug.out(" 0) { float[][] pcmf = _pcmf[0]; int bout = (samples < convsize ? samples : convsize); // convert floats to signed ints and // interleave for (int nChannel = 0; nChannel < m_vorbisInfo.channels; nChannel++) { int pointer = nChannel * getSampleSizeInBytes(); int mono = _index[nChannel]; for (int j = 0; j < bout; j++) { float fVal = pcmf[nChannel][mono + j]; clipAndWriteSample(fVal, pointer); pointer += getFrameSize(); } } m_vorbisDspState.synthesis_read(bout); getCircularBuffer().write(convbuffer, 0, getFrameSize() * bout); } } /** Scale and clip the sample and write it to convbuffer. */ private void clipAndWriteSample(float fSample, int nPointer) { int nSample; // TODO: check if clipping is necessary if (fSample > 1.0F) { fSample = 1.0F; } if (fSample < -1.0F) { fSample = -1.0F; } switch (getFormat().getSampleSizeInBits()) { case 16: nSample = (int) (fSample * 32767.0F); if (isBigEndian()) { convbuffer[nPointer++] = (byte) (nSample >> 8); convbuffer[nPointer] = (byte) (nSample & 0xFF); } else { convbuffer[nPointer++] = (byte) (nSample & 0xFF); convbuffer[nPointer] = (byte) (nSample >> 8); } break; case 24: nSample = (int) (fSample * 8388607.0F); if (isBigEndian()) { convbuffer[nPointer++] = (byte) (nSample >> 16); convbuffer[nPointer++] = (byte) ((nSample >>> 8) & 0xFF); convbuffer[nPointer] = (byte) (nSample & 0xFF); } else { convbuffer[nPointer++] = (byte) (nSample & 0xFF); convbuffer[nPointer++] = (byte) ((nSample >>> 8) & 0xFF); convbuffer[nPointer] = (byte) (nSample >> 16); } break; case 32: nSample = (int) (fSample * 2147483647.0F); if (isBigEndian()) { convbuffer[nPointer++] = (byte) (nSample >> 24); convbuffer[nPointer++] = (byte) ((nSample >>> 16) & 0xFF); convbuffer[nPointer++] = (byte) ((nSample >>> 8) & 0xFF); convbuffer[nPointer] = (byte) (nSample & 0xFF); } else { convbuffer[nPointer++] = (byte) (nSample & 0xFF); convbuffer[nPointer++] = (byte) ((nSample >>> 8) & 0xFF); convbuffer[nPointer++] = (byte) ((nSample >>> 16) & 0xFF); convbuffer[nPointer] = (byte) (nSample >> 24); } break; } } /** Read an ogg packet. This method does everything necessary to read an ogg packet. If needed, it calls {@link #readOggPage readOggPage()}, which, in turn, may read more data from the stream. The resulting packet is placed in {@link #m_oggPacket m_oggPacket} (for which the reference is not altered; is has to be initialized before). */ private void readOggPacket() throws IOException { while (true) { int result = m_oggStreamState.packetout(m_oggPacket); if (result == 1) { return; } if (result == -1) { throw new IOException("can't read packet"); } readOggPage(); if (m_oggStreamState.pagein(m_oggPage) < 0) { throw new IOException("can't read page of Ogg bitstream data"); } } } /** Read an ogg page. This method does everything necessary to read an ogg page. If needed, it reads more data from the stream. The resulting page is placed in {@link #m_oggPage m_oggPage} (for which the reference is not altered; is has to be initialized before). Note: this method doesn't deliver the page read to a StreamState object (which assembles pages to packets). This has to be done by the caller. */ private void readOggPage() throws IOException { while (true) { int result = m_oggSyncState.pageout(m_oggPage); if (result == 1) { return; } // we need more data from the stream int nIndex = m_oggSyncState.buffer(BUFFER_SIZE); // TODO: call stream.read() directly int nBytes = readFromStream(m_oggSyncState.data, nIndex, BUFFER_SIZE); // TODO: This clause should become obsolete; readFromStream() should // propagate exceptions directly. if (nBytes == -1) { throw new EOFException(); } m_oggSyncState.wrote(nBytes); } } /** Read raw data from to ogg bitstream. Reads from {@ #m_oggBitStream m_oggBitStream} a specified number of bytes into a buffer, starting at a specified buffer index. @param buffer the where the read data should be put into. Its length has to be at least nStart + nLength. @param nStart @param nLength the number of bytes to read @return the number of bytes read (maybe 0) or -1 if there is no more data in the stream. */ private int readFromStream(byte[] buffer, int nStart, int nLength) throws IOException { return m_oggBitStream.read(buffer, nStart, nLength); } /** */ private int getSampleSizeInBytes() { return getFormat().getFrameSize() / getFormat().getChannels(); } /** . @return . */ private int getFrameSize() { return getFormat().getFrameSize(); } /** Returns if this stream (the decoded one) is big endian. @return true if this stream is big endian. */ private boolean isBigEndian() { return getFormat().isBigEndian(); } /** * */ public void close() throws IOException { super.close(); m_oggBitStream.close(); } } } /*** JorbisFormatConversionProvider.java ***/ extensions/soundspi/tritonus/src/org/tritonus/sampled/convert/lame/000077500000000000000000000000001335566474600263235ustar00rootroot00000000000000Mp3LameFormatConversionProvider.java000066400000000000000000000404311335566474600353010ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/sampled/convert/lame/* * Mp3LameFormatConversionProvider.java */ /* * Copyright (c) 2000 by Florian Bomers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.sampled.convert.lame; import java.io.File; import java.io.FileOutputStream; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; import java.util.Iterator; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.spi.FormatConversionProvider; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.TCircularBuffer; import org.tritonus.share.sampled.AudioFormatSet; import org.tritonus.share.sampled.convert.TSimpleFormatConversionProvider; import org.tritonus.share.sampled.convert.TAsynchronousFilteredAudioInputStream; import org.tritonus.lowlevel.lame.Lame; /** * ConversionProvider for encoding MP3 audio files with the lame lib. *

* It uses a sloppy implementation of the MPEG1L3 encoding: * It is used as a common denominator. So users can always ask for * MPEG1L3 encoding but may get in fact an MPEG2L3 or MPEG2.5L3 encoded * stream. * * @author Florian Bomers */ //TODO: - fill frame rate, frame size. Use frame rate for bit rate ? // - add decoding ? more work on LAME itself... // - byte swapping support in LAME ? public class Mp3LameFormatConversionProvider extends TSimpleFormatConversionProvider { private static final int ALL=AudioSystem.NOT_SPECIFIED; private static final int MPEG_BITS_PER_SAMPLE=ALL; // TODO! should be 0... private static final int MPEG_FRAME_RATE=ALL; // TODO private static final int MPEG_FRAME_SIZE=ALL; // TODO public static final AudioFormat.Encoding MPEG1L3 = Encodings.getEncoding("MPEG1L3"); // Lame converts automagically to MPEG2 or MPEG2.5, if necessary. public static final AudioFormat.Encoding MPEG2L3 = Encodings.getEncoding("MPEG2L3"); public static final AudioFormat.Encoding MPEG2DOT5L3 = Encodings.getEncoding("MPEG2DOT5L3"); /* * Lame provides these formats: * MPEG1 layer III samplerates(kHz): 32 44.1 48 * bitrates(kbs): 32 40 48 56 64 80 96 112 128 160 192 224 256 320 * * MPEG2 layer III samplerates(kHz): 16 22.05 24 * bitrates(kbs): 8 16 24 32 40 48 56 64 80 96 112 128 144 160 * * MPEG2.5 layer III samplerates(kHz): 8 11.025 12 * bitrates(kbs): 8 16 24 32 40 48 56 64 80 96 112 128 144 160 */ private static final AudioFormat[] OUTPUT_FORMATS = { new AudioFormat(MPEG2DOT5L3, 8000, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG2DOT5L3, 8000, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG2DOT5L3, 8000, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG2DOT5L3, 8000, ALL, 2, ALL, ALL, true), new AudioFormat(MPEG2DOT5L3, 11025, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG2DOT5L3, 11025, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG2DOT5L3, 11025, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG2DOT5L3, 11025, ALL, 2, ALL, ALL, true), new AudioFormat(MPEG2DOT5L3, 12000, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG2DOT5L3, 12000, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG2DOT5L3, 12000, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG2DOT5L3, 12000, ALL, 2, ALL, ALL, true), new AudioFormat(MPEG2L3, 16000, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG2L3, 16000, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG2L3, 16000, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG2L3, 16000, ALL, 2, ALL, ALL, true), new AudioFormat(MPEG2L3, 22050, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG2L3, 22050, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG2L3, 22050, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG2L3, 22050, ALL, 2, ALL, ALL, true), new AudioFormat(MPEG2L3, 24000, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG2L3, 24000, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG2L3, 24000, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG2L3, 24000, ALL, 2, ALL, ALL, true), new AudioFormat(MPEG1L3, 8000, ALL, 1, ALL, ALL, false), //MPEG2DOT5L3 new AudioFormat(MPEG1L3, 8000, ALL, 2, ALL, ALL, false), //MPEG2DOT5L3 new AudioFormat(MPEG1L3, 8000, ALL, 1, ALL, ALL, true), //MPEG2DOT5L3 new AudioFormat(MPEG1L3, 8000, ALL, 2, ALL, ALL, true), //MPEG2DOT5L3 new AudioFormat(MPEG1L3, 11025, ALL, 1, ALL, ALL, false),//MPEG2DOT5L3 new AudioFormat(MPEG1L3, 11025, ALL, 2, ALL, ALL, false),//MPEG2DOT5L3 new AudioFormat(MPEG1L3, 11025, ALL, 1, ALL, ALL, true), //MPEG2DOT5L3 new AudioFormat(MPEG1L3, 11025, ALL, 2, ALL, ALL, true), //MPEG2DOT5L3 new AudioFormat(MPEG1L3, 12000, ALL, 1, ALL, ALL, false),//MPEG2DOT5L3 new AudioFormat(MPEG1L3, 12000, ALL, 2, ALL, ALL, false),//MPEG2DOT5L3 new AudioFormat(MPEG1L3, 12000, ALL, 1, ALL, ALL, true), //MPEG2DOT5L3 new AudioFormat(MPEG1L3, 12000, ALL, 2, ALL, ALL, true), //MPEG2DOT5L3 new AudioFormat(MPEG1L3, 16000, ALL, 1, ALL, ALL, false), //MPEG2L3 new AudioFormat(MPEG1L3, 16000, ALL, 2, ALL, ALL, false), //MPEG2L3 new AudioFormat(MPEG1L3, 16000, ALL, 1, ALL, ALL, true), //MPEG2L3 new AudioFormat(MPEG1L3, 16000, ALL, 2, ALL, ALL, true), //MPEG2L3 new AudioFormat(MPEG1L3, 22050, ALL, 1, ALL, ALL, false), //MPEG2L3 new AudioFormat(MPEG1L3, 22050, ALL, 2, ALL, ALL, false), //MPEG2L3 new AudioFormat(MPEG1L3, 22050, ALL, 1, ALL, ALL, true), //MPEG2L3 new AudioFormat(MPEG1L3, 22050, ALL, 2, ALL, ALL, true), //MPEG2L3 new AudioFormat(MPEG1L3, 24000, ALL, 1, ALL, ALL, false), //MPEG2L3 new AudioFormat(MPEG1L3, 24000, ALL, 2, ALL, ALL, false), //MPEG2L3 new AudioFormat(MPEG1L3, 24000, ALL, 1, ALL, ALL, true), //MPEG2L3 new AudioFormat(MPEG1L3, 24000, ALL, 2, ALL, ALL, true), //MPEG2L3 new AudioFormat(MPEG1L3, 32000, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG1L3, 32000, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG1L3, 32000, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG1L3, 32000, ALL, 2, ALL, ALL, true), new AudioFormat(MPEG1L3, 44100, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG1L3, 44100, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG1L3, 44100, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG1L3, 44100, ALL, 2, ALL, ALL, true), new AudioFormat(MPEG1L3, 48000, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG1L3, 48000, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG1L3, 48000, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG1L3, 48000, ALL, 2, ALL, ALL, true), }; private static final AudioFormat[] INPUT_FORMATS = { new AudioFormat(8000, 16, 1, true, false), new AudioFormat(8000, 16, 1, true, true), new AudioFormat(11025, 16, 1, true, false), new AudioFormat(11025, 16, 1, true, true), new AudioFormat(12000, 16, 1, true, false), new AudioFormat(12000, 16, 1, true, true), new AudioFormat(16000, 16, 1, true, false), new AudioFormat(16000, 16, 1, true, true), new AudioFormat(22050, 16, 1, true, false), new AudioFormat(22050, 16, 1, true, true), new AudioFormat(24000, 16, 1, true, false), new AudioFormat(24000, 16, 1, true, true), new AudioFormat(32000, 16, 1, true, false), new AudioFormat(32000, 16, 1, true, true), new AudioFormat(44100, 16, 1, true, false), new AudioFormat(44100, 16, 1, true, true), new AudioFormat(48000, 16, 1, true, false), new AudioFormat(48000, 16, 1, true, true), new AudioFormat(8000, 16, 2, true, false), new AudioFormat(8000, 16, 2, true, true), new AudioFormat(11025, 16, 2, true, false), new AudioFormat(11025, 16, 2, true, true), new AudioFormat(12000, 16, 2, true, false), new AudioFormat(12000, 16, 2, true, true), new AudioFormat(16000, 16, 2, true, false), new AudioFormat(16000, 16, 2, true, true), new AudioFormat(22050, 16, 2, true, false), new AudioFormat(22050, 16, 2, true, true), new AudioFormat(24000, 16, 2, true, false), new AudioFormat(24000, 16, 2, true, true), new AudioFormat(32000, 16, 2, true, false), new AudioFormat(32000, 16, 2, true, true), new AudioFormat(44100, 16, 2, true, false), new AudioFormat(44100, 16, 2, true, true), new AudioFormat(48000, 16, 2, true, false), new AudioFormat(48000, 16, 2, true, true), }; /** * Constructor. */ public Mp3LameFormatConversionProvider() { super(Arrays.asList(INPUT_FORMATS), Arrays.asList(OUTPUT_FORMATS)); if (!Lame.isLibAvailable()) { disable(); if (TDebug.TraceAudioConverter) { TDebug.out("******* Error initializing LAME mp3 encoder: "+Lame.getLinkError()); } } } public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream audioInputStream) { if (isConversionSupported(targetFormat, audioInputStream.getFormat())) { return new EncodedMpegAudioInputStream( getDefaultTargetFormat(targetFormat, audioInputStream.getFormat(), false), audioInputStream); } else { throw new IllegalArgumentException("conversion not supported"); } } public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) { if (TDebug.TraceAudioConverter) { TDebug.out(">MP3Lame getTargetFormats(AudioFormat.Encoding, AudioFormat):"); TDebug.out("checking out possible target formats"); TDebug.out("from: " + sourceFormat); TDebug.out("to : " + targetEncoding); } if (isConversionSupported(targetEncoding, sourceFormat)) { AudioFormatSet result=new AudioFormatSet(); Iterator iterator=getCollectionTargetFormats().iterator(); while (iterator.hasNext()) { AudioFormat targetFormat = (AudioFormat) iterator.next(); //if (TDebug.TraceAudioConverter) { //TDebug.out("-checking target format "+targetFormat); //} if (doMatch(targetFormat.getSampleRate(), sourceFormat.getSampleRate()) && targetFormat.getEncoding().equals(targetEncoding) && doMatch(targetFormat.getChannels(), sourceFormat.getChannels())) { targetFormat=getDefaultTargetFormat(targetFormat, sourceFormat, true); //if (TDebug.TraceAudioConverter) { //TDebug.out("-yes. added "+targetFormat); //} result.add(targetFormat); } //else { //if (TDebug.TraceAudioConverter) { //boolean e=targetFormat.getEncoding().equals(targetEncoding); //TDebug.out("-no. \""+targetFormat.getEncoding()+"\"==\""+targetEncoding+"\" ? "+e); //} //} } if (TDebug.TraceAudioConverter) { TDebug.out("0) { encodedBytes=encoder.encodeBuffer(pcmBuffer, 0, readBytes, encodedBuffer); buffer=encodedBuffer; } else { // take the larger buffer for the remaining frame(s) buffer=encodedBuffer.length>pcmBuffer.length?encodedBuffer:pcmBuffer; encodedBytes=encoder.encodeFinish(buffer); encoder.close(); encoder=null; } } if (encodedBytes>0) { getCircularBuffer().write(buffer, 0, encodedBytes); } if (encoder==null) { getCircularBuffer().close(); } } catch (ArrayIndexOutOfBoundsException e) { if (TDebug.TraceAudioConverter || TDebug.TraceAllExceptions) { TDebug.out(e); } } catch (IOException e) { if (TDebug.TraceAudioConverter || TDebug.TraceAllExceptions) { TDebug.out(e); } } } private boolean isBigEndian() { return getFormat().isBigEndian(); } public void close() throws IOException { super.close(); pcmStream.close(); if (encoder!=null) { encoder.encodeFinish(null); encoder.close(); encoder=null; } } } } /*** Mp3LameFormatConversionProvider.java ***/ extensions/soundspi/tritonus/src/org/tritonus/sampled/file/000077500000000000000000000000001335566474600246445ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/sampled/file/jorbis/000077500000000000000000000000001335566474600261345ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/sampled/file/jorbis/JorbisAudioFileReader.java000066400000000000000000000166451335566474600331500ustar00rootroot00000000000000/* * JorbisAudioFileReader.java */ /* * Copyright (c) 2001 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.sampled.file.jorbis; import java.io.InputStream; import java.io.IOException; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.UnsupportedAudioFileException; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.sampled.AudioFileTypes; import org.tritonus.share.sampled.file.TAudioFileFormat; import org.tritonus.share.sampled.file.TAudioFileReader; import com.jcraft.jogg.Buffer; import com.jcraft.jogg.SyncState; import com.jcraft.jogg.StreamState; import com.jcraft.jogg.Page; import com.jcraft.jogg.Packet; /** * @author Matthias Pfisterer */ public class JorbisAudioFileReader extends TAudioFileReader { private static final int INITAL_READ_LENGTH = 4096; private static final int MARK_LIMIT = INITAL_READ_LENGTH + 1; public JorbisAudioFileReader() { super(MARK_LIMIT, true); } protected AudioFileFormat getAudioFileFormat(InputStream inputStream, long lFileSizeInBytes) throws UnsupportedAudioFileException, IOException { // sync and verify incoming physical bitstream SyncState oggSyncState = new SyncState(); // take physical pages, weld into a logical stream of packets StreamState oggStreamState = new StreamState(); // one Ogg bitstream page. Vorbis packets are inside Page oggPage = new Page(); // one raw packet of data for decode Packet oggPacket = new Packet(); int bytes = 0; // Decode setup oggSyncState.init(); // Now we can read pages // grab some data at the head of the stream. We want the first page // (which is guaranteed to be small and only contain the Vorbis // stream initial header) We need the first page to get the stream // serialno. // submit a 4k block to libvorbis' Ogg layer int index = oggSyncState.buffer(INITAL_READ_LENGTH); bytes = inputStream.read(oggSyncState.data, index, INITAL_READ_LENGTH); oggSyncState.wrote(bytes); // Get the first page. if (oggSyncState.pageout(oggPage) != 1) { // have we simply run out of data? If so, we're done. if (bytes < 4096) { // IDEA: throw EOFException? throw new UnsupportedAudioFileException("not a Vorbis stream: ended prematurely"); } throw new UnsupportedAudioFileException("not a Vorbis stream: not in Ogg bitstream format"); } // Get the serial number and set up the rest of decode. // serialno first; use it to set up a logical stream oggStreamState.init(oggPage.serialno()); // extract the initial header from the first page and verify that the // Ogg bitstream is in fact Vorbis data // I handle the initial header first instead of just having the code // read all three Vorbis headers at once because reading the initial // header is an easy way to identify a Vorbis bitstream and it's // useful to see that functionality seperated out. if (oggStreamState.pagein(oggPage) < 0) { // error; stream version mismatch perhaps throw new UnsupportedAudioFileException("not a Vorbis stream: can't read first page of Ogg bitstream data"); } if (oggStreamState.packetout(oggPacket) != 1) { // no page? must not be vorbis throw new UnsupportedAudioFileException("not a Vorbis stream: can't read initial header packet"); } Buffer oggPacketBuffer = new Buffer(); oggPacketBuffer.readinit(oggPacket.packet_base, oggPacket.packet, oggPacket.bytes); int nPacketType = oggPacketBuffer.read(8); byte[] buf = new byte[6]; oggPacketBuffer.read(buf, 6); if(buf[0]!='v' || buf[1]!='o' || buf[2]!='r' || buf[3]!='b' || buf[4]!='i' || buf[5]!='s') { throw new UnsupportedAudioFileException("not a Vorbis stream: not a vorbis header packet"); } if (nPacketType != 1) { throw new UnsupportedAudioFileException("not a Vorbis stream: first packet is not the identification header"); } if(oggPacket.b_o_s == 0) { throw new UnsupportedAudioFileException("not a Vorbis stream: initial packet not marked as beginning of stream"); } int nVersion = oggPacketBuffer.read(32); if (nVersion != 0) { throw new UnsupportedAudioFileException("not a Vorbis stream: wrong vorbis version"); } int nChannels = oggPacketBuffer.read(8); float fSampleRate = oggPacketBuffer.read(32); // These are only used for error checking. int bitrate_upper = oggPacketBuffer.read(32); int bitrate_nominal = oggPacketBuffer.read(32); int bitrate_lower = oggPacketBuffer.read(32); int[] blocksizes = new int[2]; blocksizes[0] = 1 << oggPacketBuffer.read(4); blocksizes[1] = 1 << oggPacketBuffer.read(4); if (fSampleRate < 1.0F || nChannels < 1 || blocksizes[0] < 8|| blocksizes[1] < blocksizes[0] || oggPacketBuffer.read(1) != 1) { throw new UnsupportedAudioFileException("not a Vorbis stream: illegal values in initial header"); } if (TDebug.TraceAudioFileReader) { TDebug.out("JorbisAudioFileReader.getAudioFileFormat(): channels: " + nChannels); } if (TDebug.TraceAudioFileReader) { TDebug.out("JorbisAudioFileReader.getAudioFileFormat(): rate: " + fSampleRate); } /* If the file size is known, we derive the number of frames ('frame size') from it. If the values don't fit into integers, we leave them at NOT_SPECIFIED. 'Unknown' is considered less incorrect than a wrong value. */ // [fb] not specifying it causes Sun's Wave file writer to write rubbish int nByteSize = AudioSystem.NOT_SPECIFIED; if (lFileSizeInBytes != AudioSystem.NOT_SPECIFIED && lFileSizeInBytes <= Integer.MAX_VALUE) { nByteSize = (int) lFileSizeInBytes; } int nFrameSize = AudioSystem.NOT_SPECIFIED; /* Can we calculate a useful size? Peeking into ogginfo gives the insight that the only way seems to be reading through the file. This is something we do not want, at least not by default. */ // nFrameSize = (int) (lFileSizeInBytes / ...; AudioFormat format = new AudioFormat( Encodings.getEncoding("VORBIS"), fSampleRate, AudioSystem.NOT_SPECIFIED, nChannels, AudioSystem.NOT_SPECIFIED, AudioSystem.NOT_SPECIFIED, true); // this value is chosen arbitrarily if (TDebug.TraceAudioFileReader) { TDebug.out("JorbisAudioFileReader.getAudioFileFormat(): AudioFormat: " + format); } AudioFileFormat.Type type = AudioFileTypes.getType("Ogg","ogg"); AudioFileFormat audioFileFormat = new TAudioFileFormat( type, format, nFrameSize, nByteSize); if (TDebug.TraceAudioFileReader) { TDebug.out("JorbisAudioFileReader.getAudioFileFormat(): AudioFileFormat: " + audioFileFormat); } return audioFileFormat; } } /*** JorbisAudioFileReader.java ***/ extensions/soundspi/tritonus/src/org/tritonus/sampled/file/mpeg/000077500000000000000000000000001335566474600255745ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/sampled/file/mpeg/MpegAudioFileReader.java000066400000000000000000000123511335566474600322360ustar00rootroot00000000000000/* * MpegAudioFileReader.java */ /* * Copyright (c) 1999 -2001 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.sampled.file.mpeg; import java.io.InputStream; import java.io.IOException; import java.io.EOFException; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.UnsupportedAudioFileException; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.sampled.AudioFileTypes; import org.tritonus.share.sampled.file.TAudioFileFormat; import org.tritonus.share.sampled.file.TAudioFileReader; /* * @author Matthias Pfisterer */ public class MpegAudioFileReader extends TAudioFileReader { private static final int SYNC = 0xFFE00000; private static final AudioFormat.Encoding[][] sm_aEncodings = { {Encodings.getEncoding("MPEG2DOT5L3"), Encodings.getEncoding("MPEG2DOT5L2"), Encodings.getEncoding("MPEG2DOT5L1")}, {null, null, null}, /* reserved */ {Encodings.getEncoding("MPEG2L3"), Encodings.getEncoding("MPEG2L2"), Encodings.getEncoding("MPEG2L1")}, {Encodings.getEncoding("MPEG1L3"), Encodings.getEncoding("MPEG1L2"), Encodings.getEncoding("MPEG1L1")}, }; private static final float[][] sm_afSamplingRates = { {11025.0F, 12000.0F, 8000.0F}, {0.0F, 0.0F, 0.0F}, /* reserved */ {22050.0F, 24000.0F, 16000.0F}, {44100.0F, 48000.0F, 32000.0F}, }; private static final int MARK_LIMIT = 4; public MpegAudioFileReader() { super(MARK_LIMIT, true); } //protected AudioFileFormat getAudioFileFormat(InputStream inputStream, long lFileSizeInBytes) public AudioFileFormat getAudioFileFormat(InputStream inputStream, long lFileSizeInBytes) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) { TDebug.out("MpegAudioFileReader.getAudioFileFormat(): begin"); } int b0 = inputStream.read(); int b1 = inputStream.read(); int b2 = inputStream.read(); int b3 = inputStream.read(); if ((b0 | b1 | b2 | b3) < 0) { throw new EOFException(); } int nHeader = (b0 << 24) + (b1 << 16) + (b2 << 8) + (b3 << 0); /* * We check for the sync bits. If they are present, we * assume that we have an MPEG bitstream. */ if ((nHeader & SYNC) != SYNC) { throw new UnsupportedAudioFileException("not a MPEG stream: no sync bits"); } int nVersion = (nHeader >> 19) & 0x3; if (nVersion == 1) { throw new UnsupportedAudioFileException("not a MPEG stream: wrong version"); } int nLayer = (nHeader >> 17) & 0x3; if (nLayer == 0) { throw new UnsupportedAudioFileException("not a MPEG stream: wrong layer"); } AudioFormat.Encoding encoding = sm_aEncodings[nVersion][nLayer - 1]; // TODO: bit rate, protection int nSFIndex = (nHeader >> 10) & 0x3; if (nSFIndex == 3) { throw new UnsupportedAudioFileException("not a MPEG stream: wrong sampling rate"); } float fSamplingRate = sm_afSamplingRates[nVersion][nSFIndex]; int nMode = (nHeader >> 6) & 0x3; int nChannels = nMode == 3 ? 1 : 2; AudioFormat format = new AudioFormat( encoding, fSamplingRate, AudioSystem.NOT_SPECIFIED /*???*/, nChannels, AudioSystem.NOT_SPECIFIED /*????*/, AudioSystem.NOT_SPECIFIED /*????*/, true); //$$fb 2000-08-15: workaround for the fixed extension problem in AudioFileFormat.Type // see org.tritonus.share.sampled.AudioFileTypes.java AudioFileFormat.Type type = AudioFileTypes.getType("MPEG", "mpeg"); if (encoding.equals(Encodings.getEncoding("MPEG1L3"))) { type = AudioFileTypes.getType("MP3", "mp3"); } /* If the file size is known, we derive the number of frames ('frame size') from it. If the values don't fit into integers, we leave them at NOT_SPECIFIED. 'Unknown' is considered less incorrect than a wrong value. */ // [fb] not specifying it causes Sun's Wave file writer to write rubbish int nByteSize = AudioSystem.NOT_SPECIFIED; int nFrameSize = AudioSystem.NOT_SPECIFIED; if (lFileSizeInBytes != AudioSystem.NOT_SPECIFIED && lFileSizeInBytes <= Integer.MAX_VALUE) { nByteSize = (int) lFileSizeInBytes; // TODO: check if we can calculate a useful value here // nFrameSize = (int) (lFileSizeInBytes / 33); } AudioFileFormat audioFileFormat = new TAudioFileFormat( type, format, nFrameSize, nByteSize); if (TDebug.TraceAudioFileReader) { TDebug.out("MpegAudioFileReader.getAudioFileFormat(): end"); } return audioFileFormat; } } /*** MpegAudioFileReader.java ***/ extensions/soundspi/tritonus/src/org/tritonus/sampled/file/mpeg/MpegAudioFileWriter.java000066400000000000000000000044451335566474600323150ustar00rootroot00000000000000/* * MpegAudioFileWriter.java */ /* * Copyright (c) 2000 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.sampled.file.mpeg; import java.util.Arrays; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.sampled.AudioFileTypes; import org.tritonus.share.sampled.file.THeaderlessAudioFileWriter; /** Class for writing mpeg files * * @author Florian Bomers */ public class MpegAudioFileWriter extends THeaderlessAudioFileWriter { private static final AudioFileFormat.Type[] FILE_TYPES = { //AudioFileTypes.getType("MPEG", "mpeg"), // workaround for the fixed extension problem in AudioFileFormat.Type // see org.tritonus.share.sampled.AudioFileTypes.java AudioFileTypes.getType("MP3", "mp3") }; public static AudioFormat.Encoding MPEG1L3=Encodings.getEncoding("MPEG1L3"); private static final AudioFormat[] AUDIO_FORMATS = { new AudioFormat(MPEG1L3, ALL, ALL, 1, ALL, ALL, false), new AudioFormat(MPEG1L3, ALL, ALL, 1, ALL, ALL, true), new AudioFormat(MPEG1L3, ALL, ALL, 2, ALL, ALL, false), new AudioFormat(MPEG1L3, ALL, ALL, 2, ALL, ALL, true), }; public MpegAudioFileWriter() { super(Arrays.asList(FILE_TYPES), Arrays.asList(AUDIO_FORMATS)); if (TDebug.TraceAudioFileWriter) { TDebug.out("MpegAudioFileWriter.(): begin"); } if (TDebug.TraceAudioFileWriter) { TDebug.out("MpegAudioFileWriter.(): end"); } } } /*** MpegAudioFileWriter.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/000077500000000000000000000000001335566474600234025ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/ArraySet.java000066400000000000000000000031141335566474600257760ustar00rootroot00000000000000/* * ArraySet.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share; import java.util.ArrayList; import java.util.Collection; import java.util.Set; public class ArraySet extends ArrayList implements Set { public ArraySet() { super(); } public ArraySet(Collection c) { this(); addAll(c); } public boolean add(Object element) { if (!contains(element)) { super.add(element); return true; } else { return false; } } public void add(int index, Object element) { throw new UnsupportedOperationException("ArraySet.add(int index, Object element) unsupported"); } public Object set(int index, Object element) { throw new UnsupportedOperationException("ArraySet.set(int index, Object element) unsupported"); } } /*** ArraySet.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/GlobalInfo.java000066400000000000000000000023451335566474600262650ustar00rootroot00000000000000/* * GlobalInfo.java */ /* * Copyright (c) 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share; import org.tritonus.share.TDebug; public class GlobalInfo { private static final String VENDOR = "Tritonus is free software. See http://www.tritonus.org/"; private static final String VERSION = "0.3.1"; public static String getVendor() { return VENDOR; } public static String getVersion() { return VERSION; } } /*** GlobalInfo.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/StringHashedSet.java000066400000000000000000000050671335566474600273140ustar00rootroot00000000000000/* * StringHashedSet.java */ /* * Copyright (c) 2000 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.tritonus.share.ArraySet; /** * A set where the elements are uniquely referenced by their * string representation as given by the objects toString() * method. No 2 objects with the same toString() can * be in the set. *

* The contains(Object elem) and get(Object elem) * methods can be called with Strings as elem parameter. * For get(Object elem), the object that has been added * is returned, and not its String representation. *

* Though it's possible to store * Strings as objects in this class, it doesn't make sense * as you could use ArraySet for that equally well. *

* You shouldn't use the ArrayList specific functions * like those that take index parameters. *

* It is not possible to add null elements. */ public class StringHashedSet extends ArraySet { public StringHashedSet() { super(); } public StringHashedSet(Collection c) { super(c); } public boolean add(Object elem) { if (elem==null) { return false; } return super.add(elem); } public boolean contains(Object elem) { if (elem==null) { return false; } String comp=elem.toString(); Iterator it=iterator(); while (it.hasNext()) { if (comp.equals(it.next().toString())) { return true; } } return false; } public Object get(Object elem) { if (elem==null) { return null; } String comp=elem.toString(); Iterator it=iterator(); while (it.hasNext()) { Object thisElem=it.next(); if (comp.equals(thisElem.toString())) { return thisElem; } } return null; } } /*** StringHashedSet.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/TCircularBuffer.java000066400000000000000000000126231335566474600272730ustar00rootroot00000000000000/* * TCircularBuffer.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share; import org.tritonus.share.TDebug; public class TCircularBuffer { private boolean m_bBlockingRead; private boolean m_bBlockingWrite; private byte[] m_abData; private int m_nSize; private int m_nReadPos; private int m_nWritePos; private Trigger m_trigger; private boolean m_bOpen; public TCircularBuffer(int nSize, boolean bBlockingRead, boolean bBlockingWrite, Trigger trigger) { m_bBlockingRead = bBlockingRead; m_bBlockingWrite = bBlockingWrite; m_nSize = nSize; m_abData = new byte[m_nSize]; m_nReadPos = 0; m_nWritePos = 0; m_trigger = trigger; m_bOpen = true; } public void close() { m_bOpen = false; // TODO: call notify() ? } private boolean isOpen() { return m_bOpen; } public int availableRead() { return m_nWritePos - m_nReadPos; } public int availableWrite() { return m_nSize - availableRead(); } private int getReadPos() { return m_nReadPos % m_nSize; } private int getWritePos() { return m_nWritePos % m_nSize; } public int read(byte[] abData) { return read(abData, 0, abData.length); } public int read(byte[] abData, int nOffset, int nLength) { if (TDebug.TraceCircularBuffer) { TDebug.out(">TCircularBuffer.read(): called."); dumpInternalState(); } if (! isOpen()) { if (availableRead() > 0) { nLength = Math.min(nLength, availableRead()); if (TDebug.TraceCircularBuffer) { TDebug.out("reading rest in closed buffer, length: " + nLength); } } else { if (TDebug.TraceCircularBuffer) { TDebug.out("< not open. returning -1."); } return -1; } } synchronized (this) { if (m_trigger != null && availableRead() < nLength) { if (TDebug.TraceCircularBuffer) { TDebug.out("executing trigger."); } m_trigger.execute(); } if (!m_bBlockingRead) { nLength = Math.min(availableRead(), nLength); } int nRemainingBytes = nLength; while (nRemainingBytes > 0) { while (availableRead() == 0) { try { wait(); } catch (InterruptedException e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } } } int nAvailable = Math.min(availableRead(), nRemainingBytes); while (nAvailable > 0) { int nToRead = Math.min(nAvailable, m_nSize - getReadPos()); System.arraycopy(m_abData, getReadPos(), abData, nOffset, nToRead); m_nReadPos += nToRead; nOffset += nToRead; nAvailable -= nToRead; nRemainingBytes -= nToRead; } notifyAll(); } if (TDebug.TraceCircularBuffer) { TDebug.out("After read:"); dumpInternalState(); TDebug.out("< completed. Read " + nLength + " bytes"); } return nLength; } } public int write(byte[] abData) { return write(abData, 0, abData.length); } public int write(byte[] abData, int nOffset, int nLength) { if (TDebug.TraceCircularBuffer) { TDebug.out(">TCircularBuffer.write(): called; nLength: " + nLength); dumpInternalState(); } synchronized (this) { if (TDebug.TraceCircularBuffer) { TDebug.out("entered synchronized block."); } if (!m_bBlockingWrite) { nLength = Math.min(availableWrite(), nLength); } int nRemainingBytes = nLength; while (nRemainingBytes > 0) { while (availableWrite() == 0) { try { wait(); } catch (InterruptedException e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } } } int nAvailable = Math.min(availableWrite(), nRemainingBytes); while (nAvailable > 0) { int nToWrite = Math.min(nAvailable, m_nSize - getWritePos()); //TDebug.out("src buf size= " + abData.length + ", offset = " + nOffset + ", dst buf size=" + m_abData.length + " write pos=" + getWritePos() + " len=" + nToWrite); System.arraycopy(abData, nOffset, m_abData, getWritePos(), nToWrite); m_nWritePos += nToWrite; nOffset += nToWrite; nAvailable -= nToWrite; nRemainingBytes -= nToWrite; } notifyAll(); } if (TDebug.TraceCircularBuffer) { TDebug.out("After write:"); dumpInternalState(); TDebug.out("< completed. Wrote "+nLength+" bytes"); } return nLength; } } private void dumpInternalState() { TDebug.out("m_nReadPos = " + m_nReadPos + " ^= "+getReadPos()); TDebug.out("m_nWritePos = " + m_nWritePos + " ^= "+getWritePos()); TDebug.out("availableRead() = " + availableRead()); TDebug.out("availableWrite() = " + availableWrite()); } public static interface Trigger { public void execute(); } } /*** TCircularBuffer.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/TDebug.java000066400000000000000000000150751335566474600254270ustar00rootroot00000000000000/* * TDebug.java */ /* * Copyright (c) 1999 - 2002 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share; import java.io.PrintStream; import java.util.StringTokenizer; import java.security.AccessControlException; public class TDebug { public static boolean SHOW_ACCESS_CONTROL_EXCEPTIONS = false; private static final String PROPERTY_PREFIX = "tritonus."; // The stream we output to public static PrintStream m_printStream = System.out; private static String indent=""; // meta-general public static boolean TraceAllExceptions = getBooleanProperty("TraceAllExceptions"); public static boolean TraceAllWarnings = getBooleanProperty("TraceAllWarnings"); // general public static boolean TraceInit = getBooleanProperty("TraceInit"); public static boolean TraceCircularBuffer = getBooleanProperty("TraceCircularBuffer"); public static boolean TraceService = getBooleanProperty("TraceService"); // sampled common implementation public static boolean TraceAudioSystem = getBooleanProperty("TraceAudioSystem"); public static boolean TraceAudioConfig = getBooleanProperty("TraceAudioConfig"); public static boolean TraceAudioInputStream = getBooleanProperty("TraceAudioInputStream"); public static boolean TraceMixerProvider = getBooleanProperty("TraceMixerProvider"); public static boolean TraceControl = getBooleanProperty("TraceControl"); public static boolean TraceLine = getBooleanProperty("TraceLine"); public static boolean TraceDataLine = getBooleanProperty("TraceDataLine"); public static boolean TraceMixer = getBooleanProperty("TraceMixer"); public static boolean TraceSourceDataLine = getBooleanProperty("TraceSourceDataLine"); public static boolean TraceTargetDataLine = getBooleanProperty("TraceTargetDataLine"); public static boolean TraceClip = getBooleanProperty("TraceClip"); public static boolean TraceAudioFileReader = getBooleanProperty("TraceAudioFileReader"); public static boolean TraceAudioFileWriter = getBooleanProperty("TraceAudioFileWriter"); public static boolean TraceAudioConverter = getBooleanProperty("TraceAudioConverter"); public static boolean TraceAudioOutputStream = getBooleanProperty("TraceAudioOutputStream"); // sampled specific implementation public static boolean TraceEsdNative = getBooleanProperty("TraceEsdNative"); public static boolean TraceEsdStreamNative = getBooleanProperty("TraceEsdStreamNative"); public static boolean TraceEsdRecordingStreamNative = getBooleanProperty("TraceEsdRecordingStreamNative"); public static boolean TraceAlsaNative = getBooleanProperty("TraceAlsaNative"); public static boolean TraceAlsaMixerNative = getBooleanProperty("TraceAlsaMixerNative"); public static boolean TraceAlsaPcmNative = getBooleanProperty("TraceAlsaPcmNative"); public static boolean TraceMixingAudioInputStream = getBooleanProperty("TraceMixingAudioInputStream"); public static boolean TraceOggNative = getBooleanProperty("TraceOggNative"); public static boolean TraceVorbisNative = getBooleanProperty("TraceVorbisNative"); // midi common implementation public static boolean TraceMidiSystem = getBooleanProperty("TraceMidiSystem"); public static boolean TraceMidiConfig = getBooleanProperty("TraceMidiConfig"); public static boolean TraceMidiDeviceProvider = getBooleanProperty("TraceMidiDeviceProvider"); public static boolean TraceSequencer = getBooleanProperty("TraceSequencer"); public static boolean TraceMidiDevice = getBooleanProperty("TraceMidiDevice"); // midi specific implementation public static boolean TraceAlsaSeq = getBooleanProperty("TraceAlsaSeq"); public static boolean TraceAlsaSeqDetails = getBooleanProperty("TraceAlsaSeqDetails"); public static boolean TraceAlsaSeqNative = getBooleanProperty("TraceAlsaSeqNative"); public static boolean TracePortScan = getBooleanProperty("TracePortScan"); public static boolean TraceAlsaMidiIn = getBooleanProperty("TraceAlsaMidiIn"); public static boolean TraceAlsaMidiOut = getBooleanProperty("TraceAlsaMidiOut"); public static boolean TraceAlsaMidiChannel = getBooleanProperty("TraceAlsaMidiChannel"); // misc public static boolean TraceAlsaCtlNative = getBooleanProperty("TraceAlsaCtlNative"); public static boolean TraceCdda = getBooleanProperty("TraceCdda"); public static boolean TraceCddaNative = getBooleanProperty("TraceCddaNative"); // make this method configurable to write to file, write to stderr,... public static void out(String strMessage) { if (strMessage.length()>0 && strMessage.charAt(0)=='<') { if (indent.length()>2) { indent=indent.substring(2); } else { indent=""; } } String newMsg=null; if (indent!="" && strMessage.indexOf("\n")>=0) { newMsg=""; StringTokenizer tokenizer=new StringTokenizer(strMessage, "\n"); while (tokenizer.hasMoreTokens()) { newMsg+=indent+tokenizer.nextToken()+"\n"; } } else { newMsg=indent+strMessage; } m_printStream.println(newMsg); if (strMessage.length()>0 && strMessage.charAt(0)=='>') { indent+=" "; } } public static void out(Throwable throwable) { throwable.printStackTrace(m_printStream); } public static void assertion(boolean bAssertion) { if (!bAssertion) { throw new AssertException(); } } public static class AssertException extends RuntimeException { public AssertException() { } public AssertException(String sMessage) { super(sMessage); } } private static boolean getBooleanProperty(String strName) { String strPropertyName = PROPERTY_PREFIX + strName; String strValue = "false"; try { strValue = System.getProperty(strPropertyName, "false"); } catch (AccessControlException e) { if (SHOW_ACCESS_CONTROL_EXCEPTIONS) { out(e); } } // TDebug.out("property: " + strPropertyName + "=" + strValue); boolean bValue = strValue.toLowerCase().equals("true"); // TDebug.out("bValue: " + bValue); return bValue; } } /*** TDebug.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/TNotifier.java000066400000000000000000000054021335566474600261510ustar00rootroot00000000000000/* * TNotifier.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share; import java.util.EventObject; import java.util.Collection; import java.util.ArrayList; import java.util.List; import java.util.Iterator; public class TNotifier extends Thread { public static class NotifyEntry { private EventObject m_event; private List m_listeners; public NotifyEntry(EventObject event, Collection listeners) { m_event = event; m_listeners = new ArrayList(listeners); } public void deliver() { // TDebug.out("%% TNotifier.NotifyEntry.deliver(): called."); Iterator iterator = m_listeners.iterator(); while (iterator.hasNext()) { Object listener = iterator.next(); if (listener instanceof javax.sound.sampled.LineListener) { ((javax.sound.sampled.LineListener) listener).update((javax.sound.sampled.LineEvent) m_event); } else { // TODO: error message } } } } public static TNotifier notifier = null; static { notifier = new TNotifier(); notifier.setDaemon(true); notifier.start(); } /** The queue of events to deliver. * The entries are of class NotifyEntry. */ private List m_entries; public TNotifier() { super("Tritonus Notifier"); m_entries = new ArrayList(); } public void addEntry(EventObject event, Collection listeners) { // TDebug.out("%% TNotifier.addEntry(): called."); synchronized (m_entries) { m_entries.add(new NotifyEntry(event, listeners)); m_entries.notifyAll(); } // TDebug.out("%% TNotifier.addEntry(): completed."); } public void run() { while (true) { NotifyEntry entry = null; synchronized (m_entries) { while (m_entries.size() == 0) { try { m_entries.wait(); } catch (InterruptedException e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } } } entry = (NotifyEntry) m_entries.remove(0); } entry.deliver(); } } } /*** TNotifier.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/TSettings.java000066400000000000000000000034301335566474600261710ustar00rootroot00000000000000/* * TSettings.java */ /* * Copyright (c) 1999 - 2001 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share; import java.io.PrintStream; import java.util.StringTokenizer; import java.security.AccessControlException; import org.tritonus.share.TDebug; public class TSettings { public static boolean SHOW_ACCESS_CONTROL_EXCEPTIONS = false; private static final String PROPERTY_PREFIX = "tritonus."; public static boolean AlsaUsePlughw = getBooleanProperty("AlsaUsePlughw"); private static boolean getBooleanProperty(String strName) { String strPropertyName = PROPERTY_PREFIX + strName; String strValue = "false"; try { strValue = System.getProperty(strPropertyName, "false"); } catch (AccessControlException e) { if (SHOW_ACCESS_CONTROL_EXCEPTIONS) { TDebug.out(e); } } // TDebug.out("property: " + strPropertyName + "=" + strValue); boolean bValue = strValue.toLowerCase().equals("true"); // TDebug.out("bValue: " + bValue); return bValue; } } /*** TSettings.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/midi/000077500000000000000000000000001335566474600243245ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/midi/MidiUtils.java000066400000000000000000000052101335566474600270700ustar00rootroot00000000000000/* * MidiUtils.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.midi; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import org.tritonus.share.TDebug; /** Helper methods for reading and writing MIDI files. */ public class MidiUtils { public static int getUnsignedInteger(byte b) { return (b < 0) ? (int) b + 256 : b; } public static int get14bitValue(int nLSB, int nMSB) { return (nLSB & 0x7F) | ((nMSB & 0x7F) << 7); } public static int get14bitMSB(int nValue) { return (nValue >> 7) & 0x7F; } public static int get14bitLSB(int nValue) { return nValue & 0x7F; } public static byte[] getVariableLengthQuantity(long lValue) { ByteArrayOutputStream data = new ByteArrayOutputStream(); try { writeVariableLengthQuantity(lValue, data); } catch (IOException e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } } return data.toByteArray(); } public static int writeVariableLengthQuantity(long lValue, OutputStream outputStream) throws IOException { int nLength = 0; // IDEA: use a loop boolean bWritingStarted = false; int nByte = (int) ((lValue >> 21) & 0x7f); if (nByte != 0) { if (outputStream != null) { outputStream.write(nByte | 0x80); } nLength++; bWritingStarted = true; } nByte = (int) ((lValue >> 14) & 0x7f); if (nByte != 0 || bWritingStarted) { if (outputStream != null) { outputStream.write(nByte | 0x80); } nLength++; bWritingStarted = true; } nByte = (int) ((lValue >> 7) & 0x7f); if (nByte != 0 || bWritingStarted) { if (outputStream != null) { outputStream.write(nByte | 0x80); } nLength++; } nByte = (int) (lValue & 0x7f); if (outputStream != null) { outputStream.write(nByte); } nLength++; return nLength; } } /*** MidiUtils.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/midi/TMidiDevice.java000066400000000000000000000261311335566474600273200ustar00rootroot00000000000000/* * TMidiDevice.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.midi; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MetaMessage; import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiMessage; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Receiver; import javax.sound.midi.Transmitter; import org.tritonus.share.TDebug; /** Base class for MidiDevice implementations. * The goal of this class is to supply the common functionality for * classes that implement the interface MidiDevice. */ public abstract class TMidiDevice implements MidiDevice { /** The Info object for a certain instance of MidiDevice. */ private MidiDevice.Info m_info; /** A flag to store whether the device is "open". */ private boolean m_bOpen; // TODO: rename to UseReceiver/UseTransmitter /** Whether to handle input from the physical port and to allow Transmitters. */ private boolean m_bUseIn; /** Whether to handle output to the physical port and to allow Receivers. */ private boolean m_bUseOut; /** The number of Receivers that refer to this MidiDevice. * This is currently only maintained for information purposes. * * @see #addReceiver * @see #removeReceiver */ private int m_nNumReceivers; /** The collection of Transmitter that refer to this MidiDevice. */ private List m_transmitters; /** Initialize this class. * This sets the info from the passed one, sets the open status * to false, the number of Receivers to zero and the collection * of Transmitters to be empty. * * @param info The info object that describes this instance. */ public TMidiDevice(MidiDevice.Info info) { this(info, true, true); } /** Initialize this class. * This sets the info from the passed one, sets the open status * to false, the number of Receivers to zero and the collection * of Transmitters to be empty. * * @param info The info object that describes this instance. */ public TMidiDevice(MidiDevice.Info info, boolean bUseIn, boolean bUseOut) { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.(): begin"); } m_info = info; m_bUseIn = bUseIn; m_bUseOut = bUseOut; m_bOpen = false; m_nNumReceivers = 0; m_transmitters = new ArrayList(); if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.(): end"); } } /** Retrieves a description of this instance. * This returns the info object passed to the constructor. * * @return the description * * @see #TMidiDevice */ public MidiDevice.Info getDeviceInfo() { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.getDeviceInfo(): begin"); } if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.getDeviceInfo(): end"); } return m_info; } public void open() throws MidiUnavailableException { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.open(): begin"); } if (! isOpen()) { m_bOpen = true; openImpl(); } if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.open(): end"); } } /** * Subclasses have to override this method to be notified of * opening. */ protected void openImpl() throws MidiUnavailableException { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.openImpl(): begin"); } if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.openImpl(): end"); } } public void close() { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.close(): begin"); } if (isOpen()) { closeImpl(); // TODO: close all Receivers and Transmitters m_bOpen = false; } if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.close(): end"); } } /** * Subclasses have to override this method to be notified of * closeing. */ protected void closeImpl() { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.closeImpl(): begin"); } if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.closeImpl(): end"); } } public boolean isOpen() { return m_bOpen; } /** Returns whether to handle input. If this is true, retrieving Transmitters is possible and input from the physical port is passed to them. @see #getUseOut */ protected boolean getUseIn() { return m_bUseIn; } /** Returns whether to handle output. If this is true, retrieving Receivers is possible and output to them is passed to the physical port. @see #getUseIn */ protected boolean getUseOut() { return m_bUseOut; } /** Returns the device time in microseconds. This is a default implementation, telling the application program that the device doesn't track time. If a device wants to give timing information, it has to override this method. */ public long getMicrosecondPosition() { return -1; } public int getMaxReceivers() { int nMaxReceivers = 0; if (getUseOut()) { /* * The value -1 means unlimited. */ nMaxReceivers = -1; } return nMaxReceivers; } public int getMaxTransmitters() { int nMaxTransmitters = 0; if (getUseIn()) { /* * The value -1 means unlimited. */ nMaxTransmitters = -1; } return nMaxTransmitters; } /** Creates a new Receiver object associated with this instance. * In this implementation, an unlimited number of Receivers * per MidiDevice can be created. */ public Receiver getReceiver() throws MidiUnavailableException { if (! getUseOut()) { throw new MidiUnavailableException("Receivers are not supported by this device"); } return new TReceiver(); } /** Creates a new Transmitter object associated with this instance. * In this implementation, an unlimited number of Transmitters * per MidiDevice can be created. */ public Transmitter getTransmitter() throws MidiUnavailableException { if (! getUseIn()) { throw new MidiUnavailableException("Transmitters are not supported by this device"); } return new TTransmitter(); } /* * Intended for overriding by subclasses to receive messages. * This method is called by TMidiDevice.Receiver object on * receipt of a MidiMessage. */ protected void receive(MidiMessage message, long lTimeStamp) { if (TDebug.TraceMidiDevice) { TDebug.out("### [should be overridden] TMidiDevice.receive(): message " + message); } } private void addReceiver() { m_nNumReceivers++; } private void removeReceiver() { m_nNumReceivers--; } private void addTransmitter(Transmitter transmitter) { synchronized (m_transmitters) { m_transmitters.add(transmitter); } } private void removeTransmitter(Transmitter transmitter) { synchronized (m_transmitters) { m_transmitters.remove(transmitter); } } /** Send a MidiMessage to all Transmitters. * This method should be called by subclasses when they get a * message from a physical MIDI port. */ protected void sendImpl(MidiMessage message, long lTimeStamp) { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.sendImpl(): begin"); } Iterator transmitters = m_transmitters.iterator(); while (transmitters.hasNext()) { TTransmitter transmitter = (TTransmitter) transmitters.next(); /* due to a bug in the Sun jdk1.3, we cannot use clone() for MetaMessages. So we have to do the equivalent ourselves. */ // MidiMessage copiedMessage = (MidiMessage) message.clone(); MidiMessage copiedMessage = null; if (message instanceof MetaMessage) { MetaMessage origMessage = (MetaMessage) message; MetaMessage metaMessage = new MetaMessage(); try { metaMessage.setMessage(origMessage.getType(), origMessage.getData(), origMessage.getData().length); } catch (InvalidMidiDataException e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } } copiedMessage = metaMessage; } else { copiedMessage = (MidiMessage) message.clone(); } if (message instanceof MetaMessage) { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.sendImpl(): MetaMessage.getData().length (original): " + ((MetaMessage) message).getData().length); } if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.sendImpl(): MetaMessage.getData().length (cloned): " + ((MetaMessage) copiedMessage).getData().length); } } transmitter.send(copiedMessage, lTimeStamp); } if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.sendImpl(): end"); } } /////////////////// INNER CLASSES ////////////////////////////////////// /** Receiver proxy class. * This class' objects are handed out on calls to * TMidiDevice.getReceiver(). */ public class TReceiver implements Receiver { private boolean m_bOpen; public TReceiver() { TMidiDevice.this.addReceiver(); m_bOpen = true; } protected boolean isOpen() { return m_bOpen; } /** Receive a MidiMessage. * */ public void send(MidiMessage message, long lTimeStamp) { if (TDebug.TraceMidiDevice) { TDebug.out("TMidiDevice.TReceiver.send(): message " + message); } if (m_bOpen) { TMidiDevice.this.receive(message, lTimeStamp); } else { throw new IllegalStateException("receiver is not open"); } } /** Closes the receiver. * After a receiver has been closed, it does no longer * propagate MidiMessages to its associated MidiDevice. */ public void close() { TMidiDevice.this.removeReceiver(); m_bOpen = false; } } public class TTransmitter implements Transmitter { private Receiver m_receiver; public TTransmitter() { TMidiDevice.this.addTransmitter(this); } public void setReceiver(Receiver receiver) { synchronized (this) { m_receiver = receiver; } } public Receiver getReceiver() { return m_receiver; } public void send(MidiMessage message, long lTimeStamp) { if (getReceiver() != null) { getReceiver().send(message, lTimeStamp); } } /** Closes the transmitter. * After a transmitter has been closed, it no longer * passes MidiMessages to a Receiver previously set for * it. */ public void close() { TMidiDevice.this.removeTransmitter(this); synchronized (this) { m_receiver = null; } } } /* * This is needed only because MidiDevice.Info's * constructor is protected (in the Sun jdk1.3). */ public static class Info extends MidiDevice.Info { public Info(String a, String b, String c, String d) { super(a, b, c, d); } } } /*** TMidiDevice.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/midi/TMidiFileFormat.java000066400000000000000000000032341335566474600301500ustar00rootroot00000000000000/* * TMidiFileFormat.java */ /* * Copyright (c) 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.midi; import javax.sound.midi.MidiFileFormat; /** A MidiFileFormat that has information about the number of tracks. * This class is used by org.tritonus.midi.file.StandardMidiFileReader. * Its purpose is to carry the number of tracks from * getMidiFileFormat() to getSequence(). */ public class TMidiFileFormat extends MidiFileFormat { private int m_nTrackCount; public TMidiFileFormat(int nType, float fDivisionType, int nResolution, int nByteLength, long lMicrosecondLength, int nTrackCount) { super(nType, fDivisionType, nResolution, nByteLength, lMicrosecondLength); m_nTrackCount = nTrackCount; } public int getTrackCount() { return m_nTrackCount; } } /*** TMidiFileFormat.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/midi/TPreloadingSequencer.java000066400000000000000000000101111335566474600312440ustar00rootroot00000000000000/* * TPreloadingSequencer.java */ /* * Copyright (c) 2003 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.midi; import java.io.InputStream; import java.io.IOException; import java.util.BitSet; import java.util.Collection; import java.util.Iterator; import java.util.Set; import javax.sound.midi.MidiSystem; import javax.sound.midi.Sequencer; import javax.sound.midi.Sequence; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MetaMessage; import javax.sound.midi.MetaEventListener; import javax.sound.midi.MidiMessage; import javax.sound.midi.ShortMessage; import javax.sound.midi.ControllerEventListener; import javax.sound.midi.MidiDevice; import org.tritonus.share.TDebug; import org.tritonus.share.ArraySet; /** Base class for sequencers that work with an internal queue. To be more precise, this is the base class for sequencers that do not load the complete Sequence to internal data structures before start, but take single events from the Sequence and put them to the sequencing queue while running. */ public abstract class TPreloadingSequencer extends TSequencer { /** The default value for {@link m_nLatency}. This default value is set in the constructor. */ private static final int DEFAULT_LATENCY = 100; /** */ private int m_nLatency; private Thread m_loaderThread; /** Sets the latency to the default value. */ protected TPreloadingSequencer(MidiDevice.Info info, Collection masterSyncModes, Collection slaveSyncModes) { super(info, masterSyncModes, slaveSyncModes); if (TDebug.TraceSequencer) { TDebug.out("TPreloadingSequencer.(): begin"); } m_nLatency = DEFAULT_LATENCY; if (TDebug.TraceSequencer) { TDebug.out("TPreloadingSequencer.(): end"); } } /** Sets the preloading intervall. This is the time span between preloading events to an internal queue and playing them. This intervall should be kept constant by the implementation. However, this cannot be guaranteed. */ public void setLatency(int nLatency) { // TODO: preload if latency becomes shorter m_nLatency = nLatency; } /** Get the preloading intervall. @return the preloading intervall in milliseconds, or -1 if the sequencer doesn't repond to changes in the Sequence at all. */ public int getLatency() { return m_nLatency; } // currently not called by subclasses. order has to be assured (subclass first) protected void openImpl() { if (TDebug.TraceSequencer) { TDebug.out("AlsaSequencer.openImpl(): begin"); } // m_loaderThread = new LoaderThread(); // m_loaderThread.start(); } /** Put a message into the queue. This is Claus-Dieter's special method: it puts the message to the ALSA queue for delivery at the specified time. The time has to be given in ticks according to the resolution of the currently active Sequence. For this method to work, the Sequencer has to be started. The message is delivered the same way as messages from a Sequence, i.e. to all registered Transmitters. If the current queue position (as returned by getTickPosition()) is already behind the desired schedule time, the message is ignored. @param message the MidiMessage to put into the queue. @param lTick the desired schedule time in ticks. */ public abstract void sendMessageTick(MidiMessage message, long lTick); } /*** TPreloadingSequencer.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/midi/TSequencer.java000066400000000000000000000471631335566474600272600ustar00rootroot00000000000000/* * TSequencer.java */ /* * Copyright (c) 1999 - 2003 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.midi; import java.io.InputStream; import java.io.IOException; import java.util.BitSet; import java.util.Collection; import java.util.Iterator; import java.util.Set; import javax.sound.midi.MidiSystem; import javax.sound.midi.Sequencer; import javax.sound.midi.Sequence; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MetaMessage; import javax.sound.midi.MetaEventListener; import javax.sound.midi.MidiMessage; import javax.sound.midi.ShortMessage; import javax.sound.midi.ControllerEventListener; import javax.sound.midi.MidiDevice; import org.tritonus.share.TDebug; import org.tritonus.share.ArraySet; public abstract class TSequencer extends TMidiDevice implements Sequencer { private static final float MPQ_BPM_FACTOR = 6.0E7F; // This is for use in Collection.toArray(Object[]). private static final SyncMode[] EMPTY_SYNCMODE_ARRAY = new SyncMode[0]; private boolean m_bRunning; /** The Sequence to play or to record to. */ private Sequence m_sequence; /** The listeners that want to be notified of MetaMessages. */ private Set m_metaListeners; /** The listeners that want to be notified of control change events. * They are organized as follows: this array is indexed with * the number of the controller change events listeners are * interested in. If there is any interest, the array element * contains a reference to a Set containing the listeners. * These sets are allocated on demand. */ private Set[] m_aControllerListeners; private float m_fNominalTempoInMPQ; private float m_fTempoFactor; private Collection m_masterSyncModes; private Collection m_slaveSyncModes; private SyncMode m_masterSyncMode; private SyncMode m_slaveSyncMode; private BitSet m_muteBitSet; private BitSet m_soloBitSet; /** Contains the enabled state of the tracks. This BitSet holds the pre-calculated effect of mute and solo status. */ private BitSet m_enabledBitSet; protected TSequencer(MidiDevice.Info info, Collection masterSyncModes, Collection slaveSyncModes) { super(info); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.(): begin"); } m_bRunning = false; m_sequence = null; m_metaListeners = new ArraySet(); m_aControllerListeners = new Set[128]; setTempoInMPQ(500000); setTempoFactor(1.0F); m_masterSyncModes = masterSyncModes; m_slaveSyncModes = slaveSyncModes; if (getMasterSyncModes().length > 0) { m_masterSyncMode = getMasterSyncModes()[0]; } if (getSlaveSyncModes().length > 0) { m_slaveSyncMode = getSlaveSyncModes()[0]; } m_muteBitSet = new BitSet(); m_soloBitSet = new BitSet(); m_enabledBitSet = new BitSet(); updateEnabled(); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.(): end"); } } public void setSequence(Sequence sequence) throws InvalidMidiDataException { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setSequence(Sequence): begin"); } // TODO: what if playing is in progress? m_sequence = sequence; // yes, this is required by the specification setTempoFactor(1.0F); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setSequence(Sequence): end"); } } public void setSequence(InputStream inputStream) throws InvalidMidiDataException, IOException { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setSequence(InputStream): begin"); } Sequence sequence = MidiSystem.getSequence(inputStream); setSequence(sequence); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setSequence(InputStream): end"); } } public Sequence getSequence() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getSequence(): begin"); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getSequence(): end"); } return m_sequence; } public synchronized void start() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.start(): begin"); } checkOpen(); if (! isRunning()) { m_bRunning = true; // TODO: perhaps check if sequence present startImpl(); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.start(): end"); } } /** * Subclasses have to override this method to be notified of * starting. */ protected void startImpl() { if (TDebug.TraceMidiDevice) { TDebug.out("TSequencer.startImpl(): begin"); } if (TDebug.TraceMidiDevice) { TDebug.out("TSequencer.startImpl(): end"); } } public synchronized void stop() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.stop(): begin"); } checkOpen(); if (isRunning()) { stopImpl(); m_bRunning = false; } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.stop(): end"); } } /** * Subclasses have to override this method to be notified of * stopping. */ protected void stopImpl() { if (TDebug.TraceMidiDevice) { TDebug.out("TSequencer.stopImpl(): begin"); } if (TDebug.TraceMidiDevice) { TDebug.out("TSequencer.stopImpl(): end"); } } public synchronized boolean isRunning() { return m_bRunning; } /** Checks if the Sequencer is open. This method is intended to be called by {@link javax.sound.midi.Sequencer#start start}, {@link javax.sound.midi.Sequencer#stop stop}, {@link javax.sound.midi.Sequencer#startRecording startRecording} and {@link javax.sound.midi.Sequencer#stop stopRecording}. @throws IllegalStateException if the Sequencer is not open */ protected void checkOpen() { if (! isOpen()) { throw new IllegalStateException("Sequencer is not open"); } } /** Returns the resolution (ticks per quarter) of the current sequence. If no sequence is set, a bogus default value != 0 is returned. */ protected int getResolution() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getResolution(): begin"); } Sequence sequence = getSequence(); int nResolution; if (sequence != null) { nResolution = sequence.getResolution(); } else { nResolution = 1; } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getResolution(): end"); } return nResolution; } protected void setRealTempo() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setRealTempo(): begin"); } float fRealTempo = getTempoInMPQ() / getTempoFactor(); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setRealTempo(): real tempo: " + fRealTempo); } setTempoImpl(fRealTempo); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setRealTempo(): end"); } } public float getTempoInBPM() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getTempoInBPM(): begin"); } float fBPM = MPQ_BPM_FACTOR / getTempoInMPQ(); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getTempoInBPM(): end"); } return fBPM; } public void setTempoInBPM(float fBPM) { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setTempoInBPM(): begin"); } float fMPQ = MPQ_BPM_FACTOR / fBPM; setTempoInMPQ(fMPQ); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setTempoInBPM(): end"); } } public float getTempoInMPQ() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getTempoInMPQ(): begin"); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getTempoInMPQ(): end"); } return m_fNominalTempoInMPQ; } /** Sets the tempo. Implementation classes are required to call this method for changing the tempo in reaction to a tempo change event. */ public void setTempoInMPQ(float fMPQ) { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setTempoInMPQ(): begin"); } m_fNominalTempoInMPQ = fMPQ; setRealTempo(); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setTempoInMPQ(): end"); } } public void setTempoFactor(float fFactor) { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setTempoFactor(): begin"); } m_fTempoFactor = fFactor; setRealTempo(); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setTempoFactor(): end"); } } public float getTempoFactor() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getTempoFactor(): begin"); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getTempoFactor(): end"); } return m_fTempoFactor; } /** Change the tempo of the native sequencer part. * This method has to be defined by subclasses according * to the native facilities they use for sequenceing. * The implementation should not take into account the * tempo factor. This is handled elsewhere. */ protected abstract void setTempoImpl(float fMPQ); // NOTE: has to be redefined if recording is done natively public long getTickLength() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getTickLength(): begin"); } long lLength = 0; if (getSequence() != null) { lLength = getSequence().getTickLength(); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getTickLength(): end"); } return lLength; } // NOTE: has to be redefined if recording is done natively public long getMicrosecondLength() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getMicrosecondLength(): begin"); } long lLength = 0; if (getSequence() != null) { lLength = getSequence().getMicrosecondLength(); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getMicrosecondLength(): end"); } return lLength; } public boolean addMetaEventListener(MetaEventListener listener) { synchronized (m_metaListeners) { return m_metaListeners.add(listener); } } public void removeMetaEventListener(MetaEventListener listener) { synchronized (m_metaListeners) { m_metaListeners.remove(listener); } } protected Iterator getMetaEventListeners() { synchronized (m_metaListeners) { return m_metaListeners.iterator(); } } protected void sendMetaMessage(MetaMessage message) { Iterator iterator = getMetaEventListeners(); while (iterator.hasNext()) { MetaEventListener metaEventListener = (MetaEventListener) iterator.next(); MetaMessage copiedMessage = (MetaMessage) message.clone(); metaEventListener.meta(copiedMessage); } } public int[] addControllerEventListener(ControllerEventListener listener, int[] anControllers) { synchronized (m_aControllerListeners) { if (anControllers == null) { /* * Add to all controllers. NOTE: this * is an implementation-specific * semantic! */ for (int i = 0; i < 128; i++) { addControllerListener(i, listener); } } else { for (int i = 0; i < anControllers.length; i++) { addControllerListener(anControllers[i], listener); } } } return getListenedControllers(listener); } private void addControllerListener(int i, ControllerEventListener listener) { if (m_aControllerListeners[i] == null) { m_aControllerListeners[i] = new ArraySet(); } m_aControllerListeners[i].add(listener); } public int[] removeControllerEventListener(ControllerEventListener listener, int[] anControllers) { synchronized (m_aControllerListeners) { if (anControllers == null) { /* * Remove from all controllers. Unlike * above, this is specified semantics. */ for (int i = 0; i < 128; i++) { removeControllerListener(i, listener); } } else { for (int i = 0; i < anControllers.length; i++) { removeControllerListener(anControllers[i], listener); } } } return getListenedControllers(listener); } private void removeControllerListener(int i, ControllerEventListener listener) { if (m_aControllerListeners[i] != null) { m_aControllerListeners[i].add(listener); } } private int[] getListenedControllers(ControllerEventListener listener) { int[] anControllers = new int[128]; int nIndex = 0; // points to the next position to use. for (int nController = 0; nController < 128; nController++) { if (m_aControllerListeners[nController] != null && m_aControllerListeners[nController].contains(listener)) { anControllers[nIndex] = nController; nIndex++; } } int[] anResultControllers = new int[nIndex]; System.arraycopy(anControllers, 0, anResultControllers, 0, nIndex); return anResultControllers; } protected void sendControllerEvent(ShortMessage message) { // TDebug.out("TSequencer.sendControllerEvent(): called"); int nController = message.getData1(); if (m_aControllerListeners[nController] != null) { Iterator iterator = m_aControllerListeners[nController].iterator(); while (iterator.hasNext()) { ControllerEventListener controllerEventListener = (ControllerEventListener) iterator.next(); ShortMessage copiedMessage = (ShortMessage) message.clone(); controllerEventListener.controlChange(copiedMessage); } } } protected void notifyListeners(MidiMessage message) { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.sendToListeners(): begin"); } if (message instanceof MetaMessage) { // IDEA: use extra thread for event delivery sendMetaMessage((MetaMessage) message); } else if (message instanceof ShortMessage && ((ShortMessage) message).getCommand() == ShortMessage.CONTROL_CHANGE) { sendControllerEvent((ShortMessage) message); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.sendToListeners(): end"); } } public SyncMode getMasterSyncMode() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getMasterSyncMode(): begin"); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getMasterSyncMode(): end"); } return m_masterSyncMode; } public void setMasterSyncMode(SyncMode syncMode) { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setMasterSyncMode(): begin"); } if (m_masterSyncModes.contains(syncMode)) { if (! getMasterSyncMode().equals(syncMode)) { m_masterSyncMode = syncMode; setMasterSyncModeImpl(syncMode); } } else { throw new IllegalArgumentException("sync mode not allowed: " + syncMode); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setMasterSyncMode(): end"); } } /* This method is guaranteed only to be called if the sync mode really changes. */ protected void setMasterSyncModeImpl(SyncMode syncMode) { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setMasterSyncModeImpl(): begin"); } // DO NOTHING if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setMasterSyncModeImpl(): end"); } } public SyncMode[] getMasterSyncModes() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getMasterSyncModes(): begin"); } SyncMode[] syncModes = (SyncMode[]) m_masterSyncModes.toArray(EMPTY_SYNCMODE_ARRAY); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getMasterSyncModes(): end"); } return syncModes; } public SyncMode getSlaveSyncMode() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getSlaveSyncMode(): begin"); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getSlaveSyncMode(): end"); } return m_slaveSyncMode; } public void setSlaveSyncMode(SyncMode syncMode) { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setSlaveSyncMode(): begin"); } if (m_slaveSyncModes.contains(syncMode)) { if (! getSlaveSyncMode().equals(syncMode)) { m_slaveSyncMode = syncMode; setSlaveSyncModeImpl(syncMode); } } else { throw new IllegalArgumentException("sync mode not allowed: " + syncMode); } if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setSlaveSyncMode(): end"); } } /* This method is guaranteed only to be called if the sync mode really changes. */ protected void setSlaveSyncModeImpl(SyncMode syncMode) { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setSlaveSyncModeImpl(): begin"); } // DO NOTHING if (TDebug.TraceSequencer) { TDebug.out("TSequencer.setSlaveSyncModeImpl(): end"); } } public SyncMode[] getSlaveSyncModes() { if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getSlaveSyncModes(): begin"); } SyncMode[] syncModes = (SyncMode[]) m_slaveSyncModes.toArray(EMPTY_SYNCMODE_ARRAY); if (TDebug.TraceSequencer) { TDebug.out("TSequencer.getSlaveSyncModes(): end"); } return syncModes; } public boolean getTrackSolo(int nTrack) { boolean bSoloed = false; if (getSequence() != null) { if (nTrack < getSequence().getTracks().length) { bSoloed = m_soloBitSet.get(nTrack); } } return bSoloed; } public void setTrackSolo(int nTrack, boolean bSolo) { if (getSequence() != null) { if (nTrack < getSequence().getTracks().length) { boolean bOldState = m_soloBitSet.get(nTrack); if (bSolo != bOldState) { if (bSolo) { m_soloBitSet.set(nTrack); } else { m_soloBitSet.clear(nTrack); } updateEnabled(); setTrackSoloImpl(nTrack, bSolo); } } } } protected void setTrackSoloImpl(int nTrack, boolean bSolo) { } public boolean getTrackMute(int nTrack) { boolean bMuted = false; if (getSequence() != null) { if (nTrack < getSequence().getTracks().length) { bMuted = m_muteBitSet.get(nTrack); } } return bMuted; } public void setTrackMute(int nTrack, boolean bMute) { if (getSequence() != null) { if (nTrack < getSequence().getTracks().length) { boolean bOldState = m_muteBitSet.get(nTrack); if (bMute != bOldState) { if (bMute) { m_muteBitSet.set(nTrack); } else { m_muteBitSet.clear(nTrack); } updateEnabled(); setTrackMuteImpl(nTrack, bMute); } } } } protected void setTrackMuteImpl(int nTrack, boolean bMute) { } private void updateEnabled() { BitSet oldEnabledBitSet = (BitSet) m_enabledBitSet.clone(); boolean bSoloExists = m_soloBitSet.length() > 0; if (bSoloExists) { m_enabledBitSet = (BitSet) m_soloBitSet.clone(); } else { for (int i = 0; i < m_muteBitSet.size(); i++) { if (m_muteBitSet.get(i)) { m_enabledBitSet.clear(i); } else { m_enabledBitSet.set(i); } } } oldEnabledBitSet.xor(m_enabledBitSet); /* oldEnabledBitSet now has a bit set if the status for this bit changed. */ for (int i = 0; i < oldEnabledBitSet.size(); i++) { if (oldEnabledBitSet.get(i)) { setTrackEnabledImpl(i, m_enabledBitSet.get(i)); } } } /** Shows that a track state has changed. This method is called for each track where the enabled state (calculated from mute and solo) has changed. The boolean value passed represents the new state. @param nTrack The track number for which the enabled status has changed. @param bEnabled The new enabled state for this track. */ protected void setTrackEnabledImpl(int nTrack, boolean bEnabled) { } protected boolean isTrackEnabled(int nTrack) { return m_enabledBitSet.get(nTrack); } /** Sets the preloading intervall. This is the time span between preloading events to an internal queue and playing them. This intervall should be kept constant by the implementation. However, this cannot be guaranteed. */ public void setLatency(int nMilliseconds) { } /** Get the preloading intervall. @return the preloading intervall in milliseconds, or -1 if the sequencer doesn't repond to changes in the Sequence at all. */ public int getLatency() { return -1; } } /*** TSequencer.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/000077500000000000000000000000001335566474600250275ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/sampled/AudioFileTypes.java000066400000000000000000000125061335566474600305640ustar00rootroot00000000000000/* * AudioFileTypes.java */ /* * Copyright (c) 2000 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled; import javax.sound.sampled.AudioFileFormat; import org.tritonus.share.StringHashedSet; import org.tritonus.share.TDebug; /** * This class is a proposal for generic handling of audio file format types. * The main purpose is to provide a standardized way of * implementing audio file format types. Like this, file types * are only identified by their String name, and not, as currently, * by their object instance. *

* A standard registry of file type names will * be maintained by the Tritonus team. *

* In a specification request to JavaSoft, these static methods * could be integrated intoAudioFileFormat.Type. The static * instances of AIFF, AIFC, AU, SND, and WAVE types in class * AudioFileFormat.Type should be retrieved * using this method, too (internally).
* At best, the protected constructor of that class * should also be replaced to be a private constructor. * Like this it will be prevented that developers create * instances of Type, which causes problems with the * equals method. In fact, the equals method should be redefined anyway * so that it compares the names and not the objects. *

* Also, the file name extension should be deprecated and moved * to AudioFileFormat. There are some file formats * which have varying extensions depending, e.g. on the encoding. * An example for this is MPEG: the special encoding Mpeg 1, layer 3 * has the extension mp3, whereas other Mpeg files use mpeg or mpg.
* This could be implemented with 2 methods in AudioFileFormat: *

  1. String[] getFileExtensions(): returns all usable extensions * for this file. *
  2. String getDefaultFileExtension(): returns the preferred extension. *
* * @author Florian Bomers */ public class AudioFileTypes extends AudioFileFormat.Type { /** contains all known types */ private static StringHashedSet types = new StringHashedSet(); // initially add the standard types static { types.add(AudioFileFormat.Type.AIFF); types.add(AudioFileFormat.Type.AIFC); types.add(AudioFileFormat.Type.AU); types.add(AudioFileFormat.Type.SND); types.add(AudioFileFormat.Type.WAVE); } AudioFileTypes(String name, String ext) { super(name, ext); } /** * Use this method to retrieve an instance of * AudioFileFormat.Type of the specified * name. If no type of this name is in the internally * maintained list, null is returned. *

* This method is supposed to be used by user programs. *

* In order to assure a well-filled internal list, * call AudioSystem.getAudioFileTypes() * at initialization time. * * @see #getType(String, String) */ public static AudioFileFormat.Type getType(String name) { return getType(name, null); } /** * Use this method to retrieve an instance of * AudioFileFormat.Type of the specified * name. If it does not exist in the internal list * of types, a new type is created and returned. * If it a type of that name already exists (regardless * of extension), it is returned. In this case it can * not be guaranteed that the extension is the same as * passed as parameter.
* If extension is null, * this method returns null if the * type of the specified name does not exist in the * internal list. *

* This method is supposed to be used by file providers. * Every file reader and file writer provider should * exclusively use this method for retrieving instances * of AudioFileFormat.Type. */ public static AudioFileFormat.Type getType(String name, String extension) { AudioFileFormat.Type res=(AudioFileFormat.Type) types.get(name); if (res==null) { // it is not already in the string set. if (extension==null) { return null; } // Create a new type instance. res=new AudioFileTypes(name, extension); // and save it for the future types.add(res); } return res; } /** * Tests for equality of 2 file types. They are equal when their names match. *

* This function should be AudioFileFormat.Type.equals and must * be considered as a temporary workaround until it flows into the * JavaSound API. */ // IDEA: create a special "NOT_SPECIFIED" file type // and a AudioFileFormat.Type.matches method. public static boolean equals(AudioFileFormat.Type t1, AudioFileFormat.Type t2) { return t2.toString().equals(t1.toString()); } } /*** AudioFileTypes.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/AudioFormatSet.java000066400000000000000000000075041335566474600305660ustar00rootroot00000000000000/* * AudioFormatSet.java */ /* * Copyright (c) 2000 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import javax.sound.sampled.AudioFormat; import org.tritonus.share.ArraySet; import org.tritonus.share.sampled.AudioFormats; /** * A set where the elements are uniquely referenced by * AudioFormats.equals rather than their object reference. * No 2 equal AudioFormats can exist in the set. *

* This class provide convenience methods like * getAudioFormat(AudioFormat) and * matches(AudioFormat). *

* The contains(Object elem) and get(Object elem) * fail, if elem is not an instance of AudioFormat. *

* You shouldn't use the ArrayList specific functions * like those that take index parameters. *

* It is not possible to add null elements. *

* Currently, the methods equals(.,.) and matches(.,.) of * class AudioFormats are used. Let's hope that they will * be integrated into AudioFormat. */ public class AudioFormatSet extends ArraySet { protected static final AudioFormat[] EMPTY_FORMAT_ARRAY = new AudioFormat[0]; public AudioFormatSet() { super(); } public AudioFormatSet(Collection c) { super(c); } public boolean add(Object elem) { if (elem==null || !(elem instanceof AudioFormat)) { return false; } return super.add(elem); } public boolean contains(Object elem) { if (elem==null || !(elem instanceof AudioFormat)) { return false; } AudioFormat comp=(AudioFormat) elem; Iterator it=iterator(); while (it.hasNext()) { if (AudioFormats.equals(comp, (AudioFormat) it.next())) { return true; } } return false; } public Object get(Object elem) { if (elem==null || !(elem instanceof AudioFormat)) { return null; } AudioFormat comp=(AudioFormat) elem; Iterator it=iterator(); while (it.hasNext()) { AudioFormat thisElem=(AudioFormat) it.next(); if (AudioFormats.equals(comp, thisElem)) { return thisElem; } } return null; } public AudioFormat getAudioFormat(AudioFormat elem) { return (AudioFormat) get(elem); } /** * Checks whether this Set contains an AudioFormat * that matches elem. * The first matching format is returned. If no element * matches elem, null is returned. *

* @see AudioFormats#matches(AudioFormat, AudioFormat) */ public AudioFormat matches(AudioFormat elem) { if (elem==null) { return null; } Iterator it=iterator(); while (it.hasNext()) { AudioFormat thisElem=(AudioFormat) it.next(); if (AudioFormats.matches(elem, thisElem)) { return thisElem; } } return null; } public AudioFormat[] toAudioFormatArray() { return (AudioFormat[]) toArray(EMPTY_FORMAT_ARRAY); } public void add(int index, Object element) { throw new UnsupportedOperationException("unsupported"); } public Object set(int index, Object element) { throw new UnsupportedOperationException("unsupported"); } } /*** AudioFormatSet.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/AudioFormats.java000066400000000000000000000104461335566474600302740ustar00rootroot00000000000000/* * AudioFormats.java */ /* * Copyright (c) 1999,2000 by Matthias Pfisterer * Copyright (c) 1999 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; public class AudioFormats { private static boolean doMatch(int i1, int i2) { return i1 == AudioSystem.NOT_SPECIFIED || i2 == AudioSystem.NOT_SPECIFIED || i1 == i2; } private static boolean doMatch(float f1, float f2) { return f1 == AudioSystem.NOT_SPECIFIED || f2 == AudioSystem.NOT_SPECIFIED || Math.abs(f1 - f2) < 1.0e-9; } /** * Tests whether 2 AudioFormats have matching formats. * A field matches when it is AudioSystem.NOT_SPECIFIED in * at least one of the formats or the field is the same * in both formats.
* Exceptions: *

    *
  • Encoding must always be equal for a match. *
  • For a match, endianness must be equal if SampleSizeInBits is not * AudioSystem.NOT_SPECIFIED and greater than 8bit in both formats.
    * In other words: If SampleSizeInBits is AudioSystem.NOT_SPECIFIED * in either format or both formats have a SampleSizeInBits<8, * endianness does not matter. *
* This is a proposition to be used as AudioFormat.matches. * It can therefore be considered as a temporary workaround. */ // IDEA: create a special "NOT_SPECIFIED" encoding // and a AudioFormat.Encoding.matches method. public static boolean matches(AudioFormat format1, AudioFormat format2) { //$$fb 19 Dec 99: endian must be checked, too. // // we do have a problem with redundant elements: // e.g. // encoding=ALAW || ULAW -> bigEndian and samplesizeinbits don't matter // sample size in bits == 8 -> bigEndian doesn't matter // sample size in bits > 8 -> PCM is always signed. // This is an overall issue in JavaSound, I think. // At present, it is not consistently implemented to support these // redundancies and implicit definitions // // As a workaround of this issue I return in the converters // all combinations, e.g. for ULAW I return bigEndian and !bigEndian formats. /* old version */ // as proposed by florian return Encodings.equals(format1.getEncoding(), format2.getEncoding()) && (format2.getSampleSizeInBits()<=8 || format1.getSampleSizeInBits()==AudioSystem.NOT_SPECIFIED || format2.getSampleSizeInBits()==AudioSystem.NOT_SPECIFIED || format1.isBigEndian()==format2.isBigEndian()) && doMatch(format1.getChannels(),format2.getChannels()) && doMatch(format1.getSampleSizeInBits(), format2.getSampleSizeInBits()) && doMatch(format1.getFrameSize(), format2.getFrameSize()) && doMatch(format1.getSampleRate(), format2.getSampleRate()) && doMatch(format1.getFrameRate(),format2.getFrameRate()); } /** * Tests for exact equality of 2 AudioFormats. * This is the behaviour of AudioFormat.matches in JavaSound 1.0. *

* This is a proposition to be used as AudioFormat.equals. * It can therefore be considered as a temporary workaround. */ public static boolean equals(AudioFormat format1, AudioFormat format2) { return Encodings.equals(format1.getEncoding(), format2.getEncoding()) && format1.getChannels() == format2.getChannels() && format1.getSampleSizeInBits() == format2.getSampleSizeInBits() && format1.getFrameSize() == format2.getFrameSize() && (Math.abs(format1.getSampleRate() - format2.getSampleRate()) < 1.0e-9) && (Math.abs(format1.getFrameRate() - format2.getFrameRate()) < 1.0e-9); } } /*** AudioFormats.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/AudioUtils.java000066400000000000000000000111621335566474600277550ustar00rootroot00000000000000/* * AudioUtils.java */ /* * Copyright (c) 2000 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Collection; import java.util.Iterator; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.spi.AudioFileWriter; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.TConversionTool; public class AudioUtils { public static long getLengthInBytes(AudioInputStream audioInputStream) { return getLengthInBytes(audioInputStream.getFormat(), audioInputStream.getFrameLength()); /* long lLengthInFrames = audioInputStream.getFrameLength(); int nFrameSize = audioInputStream.getFormat().getFrameSize(); if (lLengthInFrames >= 0 && nFrameSize >= 1) { return lLengthInFrames * nFrameSize; } else { return AudioSystem.NOT_SPECIFIED; } */ } /** * if the passed value for lLength is * AudioSystem.NOT_SPECIFIED (unknown * length), the length in bytes becomes * AudioSystem.NOT_SPECIFIED, too. */ public static long getLengthInBytes(AudioFormat audioFormat, long lLengthInFrames) { int nFrameSize = audioFormat.getFrameSize(); if (lLengthInFrames >= 0 && nFrameSize >= 1) { return lLengthInFrames * nFrameSize; } else { return AudioSystem.NOT_SPECIFIED; } } public static boolean containsFormat(AudioFormat sourceFormat, Iterator possibleFormats) { while (possibleFormats.hasNext()) { AudioFormat format = (AudioFormat) possibleFormats.next(); if (AudioFormats.matches(format, sourceFormat)) { return true; } } return false; } /** * Conversion milliseconds -> bytes */ public static long millis2Bytes(long ms, AudioFormat format) { return millis2Bytes(ms, format.getFrameRate(), format.getFrameSize()); } public static long millis2Bytes(long ms, float frameRate, int frameSize) { return (long) (ms*frameRate/1000*frameSize); } /** * Conversion milliseconds -> bytes (bytes will be frame-aligned) */ public static long millis2BytesFrameAligned(long ms, AudioFormat format) { return millis2BytesFrameAligned(ms, format.getFrameRate(), format.getFrameSize()); } public static long millis2BytesFrameAligned(long ms, float frameRate, int frameSize) { return ((long) (ms*frameRate/1000))*frameSize; } /** * Conversion milliseconds -> frames */ public static long millis2Frames(long ms, AudioFormat format) { return millis2Frames(ms, format.getFrameRate()); } public static long millis2Frames(long ms, float frameRate) { return (long) (ms*frameRate/1000); } /** * Conversion bytes -> milliseconds */ public static long bytes2Millis(long bytes, AudioFormat format) { return (long) (bytes/format.getFrameRate()*1000/format.getFrameSize()); } /** * Conversion frames -> milliseconds */ public static long frames2Millis(long frames, AudioFormat format) { return (long) (frames/format.getFrameRate()*1000); } //$$fb 2000-07-18: added these debugging functions public static String NS_or_number(int number) { return (number==AudioSystem.NOT_SPECIFIED)?"NOT_SPECIFIED":String.valueOf(number); } public static String NS_or_number(float number) { return (number==AudioSystem.NOT_SPECIFIED)?"NOT_SPECIFIED":String.valueOf(number); } /** * For debugging purposes. */ public static String format2ShortStr(AudioFormat format) { return format.getEncoding() + "-" + NS_or_number(format.getChannels()) + "ch-" + NS_or_number(format.getSampleSizeInBits()) + "bit-" + NS_or_number(((int)format.getSampleRate())) + "Hz-"+ (format.isBigEndian() ? "be" : "le"); } } /*** AudioUtils.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/Encodings.java000066400000000000000000000153021335566474600276040ustar00rootroot00000000000000/* * Encodings.java */ /* * Copyright (c) 2000 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled; import java.util.Iterator; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import org.tritonus.share.StringHashedSet; import org.tritonus.share.TDebug; /** * This class is a proposal for generic handling of encodings. * The main purpose is to provide a standardized way of * implementing encoding types. Like this, encodings * are only identified by their String name, and not, as currently, * by their object instance. *

* A registry of standard encoding names will * be maintained by the Tritonus team. *

* In a specification request to JavaSoft, the static method * getEncoding should be integrated into * AudioFormat.Encoding(String name) (possibly * renamed to getInstance(String name).
* The static instances of ULAW, ALAW PCM_UNSIGNED and PCM_SIGNED * encodings in that class should be retrieved using that function, * too (internally).
* At best, the protected constructor of that class * should also be replaced to be a private constructor. * Like this it will be prevented that developers create their own * instances of Encoding, which causes problems with the * equals method. In fact, the equals method should be redefined anyway * so that it compares the names and not the objects. *

* Also, a specification request should be made to integrate * getEncodings() into AudioSystem (this is * especially annoying as the relevant methods already exist * in the provider interfaces of file readers, file writers and * converters). * * @author Florian Bomers */ public class Encodings extends AudioFormat.Encoding { /** contains all known encodings */ private static StringHashedSet encodings = new StringHashedSet(); // initially add the standard encodings static { encodings.add(AudioFormat.Encoding.PCM_SIGNED); encodings.add(AudioFormat.Encoding.PCM_UNSIGNED); encodings.add(AudioFormat.Encoding.ULAW); encodings.add(AudioFormat.Encoding.ALAW); } Encodings(String name) { super(name); } /** * Use this method for retrieving an instance of * AudioFormat.Encoding of the specified * name. A standard registry of encoding names will * be maintained by the Tritonus team. *

* Every file reader, file writer, and format converter * provider should exclusively use this method for * retrieving instances of AudioFormat.Encoding. */ /* MP2000/09/11: perhaps it is not a good idea to allow user programs the creation of new encodings. The problem with it is that a plain typo will produce an encoding object that is not supported. Instead, some indication of an error should be signaled to the user program. And, there should be a second interface for service providers allowing them to register encodings supported by themselves. $$fb2000/09/26: The problem is what you see as second issue: it can never be assured that this class knows all available encodings. So at the moment, there is no choice than to allow users to create any Encoding they wish. The encodings database will simplify things. A problem with an interface to retrieve supported encodings (or API function in spi.FormatConversionProvider) is that this requires loading of all providers very early. Hmmm, maybe this is necessary in any case when the user issues something like AudioSystem.isConversionSupported. */ public static AudioFormat.Encoding getEncoding(String name) { AudioFormat.Encoding res=(AudioFormat.Encoding) encodings.get(name); if (res==null) { // it is not already in the string set. Create a new encoding instance. res=new Encodings(name); // and save it for the future encodings.add(res); } return res; } /** * Tests for equality of 2 encodings. They are equal when their strings match. *

* This function should be AudioFormat.Encoding.equals and must * be considered as a temporary work around until it flows into the * JavaSound API. */ // IDEA: create a special "NOT_SPECIFIED" encoding // and a AudioFormat.Encoding.matches method. public static boolean equals(AudioFormat.Encoding e1, AudioFormat.Encoding e2) { return e2.toString().equals(e1.toString()); } /** * Returns all "supported" encodings. * Supported means that it is possible to read or * write files with this encoding, or that a converter * accepts this encoding as source or target format. *

* Currently, this method returns a best guess and * the search algorithm is far from complete: with standard * methods of AudioSystem, only the target encodings * of the converters can be retrieved - neither * the source encodings of converters nor the encodings * of file readers and file writers cannot be retrieved. */ public static AudioFormat.Encoding[] getEncodings() { StringHashedSet iteratedSources=new StringHashedSet(); StringHashedSet retrievedTargets=new StringHashedSet(); Iterator sourceFormats=encodings.iterator(); while (sourceFormats.hasNext()) { AudioFormat.Encoding source=(AudioFormat.Encoding) sourceFormats.next(); iterateEncodings(source, iteratedSources, retrievedTargets); } return (AudioFormat.Encoding[]) retrievedTargets.toArray( new AudioFormat.Encoding[retrievedTargets.size()]); } private static void iterateEncodings(AudioFormat.Encoding source, StringHashedSet iteratedSources, StringHashedSet retrievedTargets) { if (!iteratedSources.contains(source)) { iteratedSources.add(source); AudioFormat.Encoding[] targets=AudioSystem.getTargetEncodings(source); for (int i=0; i * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled; import java.util.ArrayList; import java.util.Iterator; import java.util.Random; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.spi.AudioFileWriter; import org.tritonus.share.TDebug; /** * A class for small buffers of samples in linear, 32-bit * floating point format. *

* It is supposed to be a replacement of the byte[] stream * architecture of JavaSound, especially for chains of * AudioInputStreams. Ideally, all involved AudioInputStreams * handle reading into a FloatSampleBuffer. *

* Specifications: *

    *
  1. Channels are separated, i.e. for stereo there are 2 float arrays * with the samples for the left and right channel *
  2. All data is handled in samples, where one sample means * one float value in each channel *
  3. All samples are normalized to the interval [-1.0...1.0] *
*

* When a cascade of AudioInputStreams use FloatSampleBuffer for * processing, they may implement the interface FloatSampleInput. * This signals that this stream may provide float buffers * for reading. The data is not converted back to bytes, * but stays in a single buffer that is passed from stream to stream. * For that serves the read(FloatSampleBuffer) method, which is * then used as replacement for the byte-based read functions of * AudioInputStream.
* However, backwards compatibility must always be retained, so * even when an AudioInputStream implements FloatSampleInput, * it must work the same way when any of the byte-based read methods * is called.
* As an example, consider the following set-up:
*

    *
  • auAIS is an AudioInputStream (AIS) that reads from an AU file * in 8bit pcm at 8000Hz. It does not implement FloatSampleInput. *
  • pcmAIS1 is an AIS that reads from auAIS and converts the data * to PCM 16bit. This stream implements FloatSampleInput, i.e. it * can generate float audio data from the ulaw samples. *
  • pcmAIS2 reads from pcmAIS1 and adds a reverb. * It operates entirely on floating point samples. *
  • The method that reads from pcmAIS2 (i.e. AudioSystem.write) does * not handle floating point samples. *
* So, what happens when a block of samples is read from pcmAIS2 ? *
    *
  1. the read(byte[]) method of pcmAIS2 is called *
  2. pcmAIS2 always operates on floating point samples, so * it uses an own instance of FloatSampleBuffer and initializes * it with the number of samples requested in the read(byte[]) * method. *
  3. It queries pcmAIS1 for the FloatSampleInput interface. As it * implements it, pcmAIS2 calls the read(FloatSampleBuffer) method * of pcmAIS1. *
  4. pcmAIS1 notes that its underlying stream does not support floats, * so it instantiates a byte buffer which can hold the number of * samples of the FloatSampleBuffer passed to it. It calls the * read(byte[]) method of auAIS. *
  5. auAIS fills the buffer with the bytes. *
  6. pcmAIS1 calls the initFromByteArray method of * the float buffer to initialize it with the 8 bit data. *
  7. Then pcmAIS1 processes the data: as the float buffer is * normalized, it does nothing with the buffer - and returns * control to pcmAIS2. The SampleSizeInBits field of the * AudioFormat of pcmAIS1 defines that it should be 16 bits. *
  8. pcmAIS2 receives the filled buffer from pcmAIS1 and does * its processing on the buffer - it adds the reverb. *
  9. As pcmAIS2's read(byte[]) method had been called, pcmAIS2 * calls the convertToByteArray method of * the float buffer to fill the byte buffer with the * resulting samples. *
*

* To summarize, here are some advantages when using a FloatSampleBuffer * for streaming: *

    *
  • no conversions from/to bytes need to be done during processing *
  • the sample size in bits is irrelevant - normalized range *
  • higher quality for processing *
  • separated channels (easy process/remove/add channels) *
  • potentially less copying of audio data, as processing * of the float samples is generally done in-place. The same * instance of a FloatSampleBuffer may be used from the data source * to the final data sink. *
*

* Simple benchmarks showed that the processing needs * for the conversion to and from float is about the same as * when converting it to shorts or ints without dithering, * and significantly higher with dithering. An own implementation * of a random number generator may improve this. *

* "Lazy" deletion of samples and channels:
*

    *
  • When the sample count is reduced, the arrays are not resized, but * only the member variable sampleCount is reduced. A subsequent * increase of the sample count (which will occur frequently), will check * that and eventually reuse the existing array. *
  • When a channel is deleted, it is not removed from memory but only * hidden. Subsequent insertions of a channel will check whether a hidden channel * can be reused. *
* The lazy mechanism can save many array instantiation (and copy-) operations * for the sake of performance. All relevant methods exist in a second * version which allows explicitely to disable lazy deletion. *

* Use the reset functions to clear the memory and remove * hidden samples and channels. *

* Note that the lazy mechanism implies that the arrays returned * from getChannel(int) may have a greater size * than getSampleCount(). Consequently, be sure to never rely on the * length field of the sample arrays. *

* As an example, consider a chain of converters that all act * on the same instance of FloatSampleBuffer. Some converters * may decrease the sample count (e.g. sample rate converter) and * delete channels (e.g. PCM2PCM converter). So, processing of one * block will decrease both. For the next block, all starts * from the beginning. With the lazy mechanism, all float arrays * are only created once for processing all blocks.
* Having lazy disabled would require for each chunk that is processed *

    *
  1. new instantiation of all channel arrays * at the converter chain beginning as they have been * either deleted or decreased in size during processing of the * previous chunk, and *
  2. re-instantiation of all channel arrays for * the reduction of the sample count. *
*

* Dithering:
* By default, this class uses dithering for reduction * of sample width (e.g. original data was 16bit, target * data is 8bit). As dithering may be needed in other cases * (especially when the float samples are processed using DSP * algorithms), or it is preferred to switch it off, * dithering can be explicitely switched on or off with * the method setDitherMode(int).
* For a discussion about dithering, see * * here and * * here. * * @author Florian Bomers */ public class FloatSampleBuffer { /** Whether the functions without lazy parameter are lazy or not. */ private static final boolean LAZY_DEFAULT=true; private ArrayList channels=new ArrayList(); // contains for each channel a float array private int sampleCount=0; private int channelCount=0; private float sampleRate=0; private int originalFormatType=0; /** Constant for setDitherMode: dithering will be enabled if sample size is decreased */ public static final int DITHER_MODE_AUTOMATIC=0; /** Constant for setDitherMode: dithering will be done */ public static final int DITHER_MODE_ON=1; /** Constant for setDitherMode: dithering will not be done */ public static final int DITHER_MODE_OFF=2; private static Random random=null; private float ditherBits=0.8f; private boolean doDither=false; // set in convertFloatToBytes // e.g. the sample rate converter may want to force dithering private int ditherMode=DITHER_MODE_AUTOMATIC; // sample width (must be in order !) private static final int F_8=1; private static final int F_16=2; private static final int F_24=3; private static final int F_32=4; private static final int F_SAMPLE_WIDTH_MASK=F_8 | F_16 | F_24 | F_32; // format bit-flags private static final int F_SIGNED=8; private static final int F_BIGENDIAN=16; // supported formats private static final int CT_8S=F_8 | F_SIGNED; private static final int CT_8U=F_8; private static final int CT_16SB=F_16 | F_SIGNED | F_BIGENDIAN; private static final int CT_16SL=F_16 | F_SIGNED; private static final int CT_24SB=F_24 | F_SIGNED | F_BIGENDIAN; private static final int CT_24SL=F_24 | F_SIGNED; private static final int CT_32SB=F_32 | F_SIGNED | F_BIGENDIAN; private static final int CT_32SL=F_32 | F_SIGNED; //////////////////////////////// initialization ///////////////////////////////// public FloatSampleBuffer() { this(0,0,1); } public FloatSampleBuffer(int channelCount, int sampleCount, float sampleRate) { init(channelCount, sampleCount, sampleRate, LAZY_DEFAULT); } public FloatSampleBuffer(byte[] buffer, int offset, int byteCount, AudioFormat format) { this(format.getChannels(), byteCount/(format.getSampleSizeInBits()/8*format.getChannels()), format.getSampleRate()); initFromByteArray(buffer, offset, byteCount, format); } protected void init(int channelCount, int sampleCount, float sampleRate) { init(channelCount, sampleCount, sampleRate, LAZY_DEFAULT); } protected void init(int channelCount, int sampleCount, float sampleRate, boolean lazy) { if (channelCount<0 || sampleCount<0) { throw new IllegalArgumentException( "Invalid parameters in initialization of FloatSampleBuffer."); } setSampleRate(sampleRate); if (getSampleCount()!=sampleCount || getChannelCount()!=channelCount) { createChannels(channelCount, sampleCount, lazy); } } private void createChannels(int channelCount, int sampleCount, boolean lazy) { this.sampleCount=sampleCount; // lazy delete of all channels. Intentionally lazy ! this.channelCount=0; for (int ch=0; ch

If silent is true, the new channel will be silent. * Otherwise it will contain random data. *

If lazy is true, hidden channels which have at least getSampleCount() * elements will be examined for reusage as inserted channel.
* If lazy is false, still hidden channels are reused, * but it is assured that the inserted channel has exactly getSampleCount() elements, * thus not wasting memory. */ public void insertChannel(int index, boolean silent, boolean lazy) { int physSize=channels.size(); int virtSize=getChannelCount(); float[] newChannel=null; if (physSize>virtSize) { // there are hidden channels. Try to use one. for (int ch=virtSize; ch=getSampleCount()) || (!lazy && thisChannel.length==getSampleCount())) { // we found a matching channel. Use it ! newChannel=thisChannel; channels.remove(ch); break; } } } if (newChannel==null) { newChannel=new float[getSampleCount()]; } channels.add(index, newChannel); this.channelCount++; if (silent) { makeSilence(index); } } /** performs a lazy remove of the channel */ public void removeChannel(int channel) { removeChannel(channel, LAZY_DEFAULT); } /** * Removes a channel. * If lazy is true, the channel is not physically removed, but only hidden. * These hidden channels are reused by subsequent calls to addChannel * or insertChannel. */ public void removeChannel(int channel, boolean lazy) { if (!lazy) { channels.remove(channel); } else if (channelbufferCount || destIndex+length>bufferCount || sourceIndex<0 || destIndex<0 || length<0) { throw new IndexOutOfBoundsException("parameters exceed buffer size"); } System.arraycopy(data, sourceIndex, data, destIndex, length); } /** * Mix up of 1 channel to n channels.
* It copies the first channel to all newly created channels. * @param targetChannelCount the number of channels that this sample buffer * will have after expanding. NOT the number of * channels to add ! * @exception IllegalArgumentException if this buffer does not have one * channel before calling this method. */ public void expandChannel(int targetChannelCount) { // even more sanity... if (getChannelCount()!=1) { throw new IllegalArgumentException( "FloatSampleBuffer: can only expand channels for mono signals."); } for (int ch=1; ch * It uses a simple mixdown: all other channels are added to first channel.
* The volume is NOT lowered ! * Be aware, this might cause clipping when converting back * to integer samples. */ public void mixDownChannels() { float[] firstChannel=getChannel(0); int sampleCount=getSampleCount(); int channelCount=getChannelCount(); for (int ch=channelCount-1; ch>0; ch--) { float[] thisChannel=getChannel(ch); for (int i=0; i srcBuffer.length) { throw new IllegalArgumentException ("FloatSampleBuffer.setSamplesFromBytes: srcBuffer too small."); } if (destOffset + lengthInSamples > getSampleCount()) { throw new IllegalArgumentException ("FloatSampleBuffer.setSamplesFromBytes: destBuffer too small."); } boolean signed = format.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED); boolean unsigned = format.getEncoding().equals(AudioFormat.Encoding.PCM_UNSIGNED); if (!signed && !unsigned) { throw new IllegalArgumentException ("FloatSampleBuffer: only PCM samples are possible."); } int formatType = getFormatType(format.getSampleSizeInBits(), signed, format.isBigEndian()); for (int ch = 0; ch < format.getChannels(); ch++) { convertByteToFloat(srcBuffer, srcOffset, bytesPerFrame, formatType, getChannel(ch), destOffset, lengthInSamples); srcOffset += bytesPerSample; // next channel } } //////////////////////////////// properties ///////////////////////////////// public int getChannelCount() { return channelCount; } public int getSampleCount() { return sampleCount; } public float getSampleRate() { return sampleRate; } /** * Sets the sample rate of this buffer. * NOTE: no conversion is done. The samples are only re-interpreted. */ public void setSampleRate(float sampleRate) { if (sampleRate<=0) { throw new IllegalArgumentException ("Invalid samplerate for FloatSampleBuffer."); } this.sampleRate=sampleRate; } /** * NOTE: the returned array may be larger than sampleCount. So in any case, * sampleCount is to be respected. */ public float[] getChannel(int channel) { if (channel<0 || channel>=getChannelCount()) { throw new IllegalArgumentException( "FloatSampleBuffer: invalid channel number."); } return (float[]) channels.get(channel); } public Object[] getAllChannels() { Object[] res=new Object[getChannelCount()]; for (int ch=0; chNote: this value is only used, when dithering is actually performed. */ public void setDitherBits(float ditherBits) { if (ditherBits<=0) { throw new IllegalArgumentException("DitherBits must be greater than 0"); } this.ditherBits=ditherBits; } public float getDitherBits() { return ditherBits; } /** * Sets the mode for dithering. * This can be one of: *

  • DITHER_MODE_AUTOMATIC: it is decided automatically, * whether dithering is necessary - in general when sample size is * decreased. *
  • DITHER_MODE_ON: dithering will be forced *
  • DITHER_MODE_OFF: dithering will not be done. *
*/ public void setDitherMode(int mode) { if (mode!=DITHER_MODE_AUTOMATIC && mode!=DITHER_MODE_ON && mode!=DITHER_MODE_OFF) { throw new IllegalArgumentException("Illegal DitherMode"); } this.ditherMode=mode; } public int getDitherMode() { return ditherMode; } /////////////////////////////// "low level" conversion functions //////////////////////////////// public int getFormatType(int ssib, boolean signed, boolean bigEndian) { int bytesPerSample=ssib/8; int res=0; if (ssib==8) { res=F_8; } else if (ssib==16) { res=F_16; } else if (ssib==24) { res=F_24; } else if (ssib==32) { res=F_32; } if (res==0) { throw new IllegalArgumentException ("FloatSampleBuffer: unsupported sample size of " +ssib+" bits per sample."); } if (!signed && bytesPerSample>1) { throw new IllegalArgumentException ("FloatSampleBuffer: unsigned samples larger than " +"8 bit are not supported"); } if (signed) { res|=F_SIGNED; } if (bigEndian && (ssib!=8)) { res|=F_BIGENDIAN; } return res; } private static final float twoPower7=128.0f; private static final float twoPower15=32768.0f; private static final float twoPower23=8388608.0f; private static final float twoPower31=2147483648.0f; private static final float invTwoPower7=1/twoPower7; private static final float invTwoPower15=1/twoPower15; private static final float invTwoPower23=1/twoPower23; private static final float invTwoPower31=1/twoPower31; /*public*/ private static void convertByteToFloat(byte[] input, int inputOffset, int bytesPerFrame, int formatType, float[] output, int outputOffset, int sampleCount) { //if (TDebug.TraceAudioConverter) { // TDebug.out("FloatSampleBuffer.convertByteToFloat, formatType=" // +formatType2Str(formatType)); //} int sample; int endCount = outputOffset + sampleCount; for (sample = outputOffset; sample < endCount; sample++) { // do conversion switch (formatType) { case CT_8S: output[sample]= ((float) input[inputOffset])*invTwoPower7; break; case CT_8U: output[sample]= ((float) ((input[inputOffset] & 0xFF)-128))*invTwoPower7; break; case CT_16SB: output[sample]= ((float) ((input[inputOffset]<<8) | (input[inputOffset+1] & 0xFF)))*invTwoPower15; break; case CT_16SL: output[sample]= ((float) ((input[inputOffset+1]<<8) | (input[inputOffset] & 0xFF)))*invTwoPower15; break; case CT_24SB: output[sample]= ((float) ((input[inputOffset]<<16) | ((input[inputOffset+1] & 0xFF)<<8) | (input[inputOffset+2] & 0xFF)))*invTwoPower23; break; case CT_24SL: output[sample]= ((float) ((input[inputOffset+2]<<16) | ((input[inputOffset+1] & 0xFF)<<8) | (input[inputOffset] & 0xFF)))*invTwoPower23; break; case CT_32SB: output[sample]= ((float) ((input[inputOffset]<<24) | ((input[inputOffset+1] & 0xFF)<<16) | ((input[inputOffset+2] & 0xFF)<<8) | (input[inputOffset+3] & 0xFF)))*invTwoPower31; break; case CT_32SL: output[sample]= ((float) ((input[inputOffset+3]<<24) | ((input[inputOffset+2] & 0xFF)<<16) | ((input[inputOffset+1] & 0xFF)<<8) | (input[inputOffset] & 0xFF)))*invTwoPower31; break; default: throw new IllegalArgumentException ("Unsupported formatType="+formatType); } inputOffset += bytesPerFrame; } } protected byte quantize8(float sample) { if (doDither) { sample+=random.nextFloat()*ditherBits; } if (sample>=127.0f) { return (byte) 127; } else if (sample<=-128) { return (byte) -128; } else { return (byte) (sample<0?(sample-0.5f):(sample+0.5f)); } } protected int quantize16(float sample) { if (doDither) { sample+=random.nextFloat()*ditherBits; } if (sample>=32767.0f) { return 32767; } else if (sample<=-32768.0f) { return -32768; } else { return (int) (sample<0?(sample-0.5f):(sample+0.5f)); } } protected int quantize24(float sample) { if (doDither) { sample+=random.nextFloat()*ditherBits; } if (sample>=8388607.0f) { return 8388607; } else if (sample<=-8388608.0f) { return -8388608; } else { return (int) (sample<0?(sample-0.5f):(sample+0.5f)); } } protected int quantize32(float sample) { if (doDither) { sample+=random.nextFloat()*ditherBits; } if (sample>=2147483647.0f) { return 2147483647; } else if (sample<=-2147483648.0f) { return -2147483648; } else { return (int) (sample<0?(sample-0.5f):(sample+0.5f)); } } // should be static and public, but dithering needs class members private void convertFloatToByte(float[] input, int sampleCount, byte[] output, int offset, int bytesPerFrame, int formatType) { //if (TDebug.TraceAudioConverter) { // TDebug.out("FloatSampleBuffer.convertFloatToByte, formatType=" // +"formatType2Str(formatType)); //} // let's see whether dithering is necessary switch (ditherMode) { case DITHER_MODE_AUTOMATIC: doDither=(originalFormatType & F_SAMPLE_WIDTH_MASK)> (formatType & F_SAMPLE_WIDTH_MASK); break; case DITHER_MODE_ON: doDither=true; break; case DITHER_MODE_OFF: doDither=false; break; } if (doDither && random==null) { // create the random number generator for dithering random=new Random(); } int inIndex; int iSample; for (inIndex=0; inIndex> 8); output[offset+1]=(byte) (iSample & 0xFF); break; case CT_16SL: iSample=quantize16(input[inIndex]*twoPower15); output[offset+1]=(byte) (iSample >> 8); output[offset]=(byte) (iSample & 0xFF); break; case CT_24SB: iSample=quantize24(input[inIndex]*twoPower23); output[offset]=(byte) (iSample >> 16); output[offset+1]=(byte) ((iSample >>> 8) & 0xFF); output[offset+2]=(byte) (iSample & 0xFF); break; case CT_24SL: iSample=quantize24(input[inIndex]*twoPower23); output[offset+2]=(byte) (iSample >> 16); output[offset+1]=(byte) ((iSample >>> 8) & 0xFF); output[offset]=(byte) (iSample & 0xFF); break; case CT_32SB: iSample=quantize32(input[inIndex]*twoPower31); output[offset]=(byte) (iSample >> 24); output[offset+1]=(byte) ((iSample >>> 16) & 0xFF); output[offset+2]=(byte) ((iSample >>> 8) & 0xFF); output[offset+3]=(byte) (iSample & 0xFF); break; case CT_32SL: iSample=quantize32(input[inIndex]*twoPower31); output[offset+3]=(byte) (iSample >> 24); output[offset+2]=(byte) ((iSample >>> 16) & 0xFF); output[offset+1]=(byte) ((iSample >>> 8) & 0xFF); output[offset]=(byte) (iSample & 0xFF); break; default: throw new IllegalArgumentException ("Unsupported formatType="+formatType); } offset+=bytesPerFrame; } } /** * Debugging function */ private static String formatType2Str(int formatType) { String res=""+formatType+": "; switch (formatType & F_SAMPLE_WIDTH_MASK) { case F_8: res+="8bit"; break; case F_16: res+="16bit"; break; case F_24: res+="24bit"; break; case F_32: res+="32bit"; break; } res+=((formatType & F_SIGNED)==F_SIGNED)?" signed":" unsigned"; if ((formatType & F_SAMPLE_WIDTH_MASK)!=F_8) { res+=((formatType & F_BIGENDIAN)==F_BIGENDIAN)? " big endian":" little endian"; } return res; } } /*** FloatSampleBuffer.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/TAudioFormat.java000066400000000000000000000043211335566474600302300ustar00rootroot00000000000000/* * TAudioFormat.java */ /* * Copyright (c) 2003 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.sound.sampled.AudioFormat; public class TAudioFormat extends AudioFormat { private Map m_properties; private Map m_unmodifiableProperties; public TAudioFormat(AudioFormat.Encoding encoding, float sampleRate, int sampleSizeInBits, int channels, int frameSize, float frameRate, boolean bigEndian, Map properties) { super(encoding, sampleRate, sampleSizeInBits, channels, frameSize, frameRate, bigEndian); initMaps(properties); } public TAudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian, Map properties) { super(sampleRate, sampleSizeInBits, channels, signed, bigEndian); initMaps(properties); } private void initMaps(Map properties) { /* Here, we make a shallow copy of the map. It's unclear if this is sufficient (of if a deep copy should be made). */ m_properties = new HashMap(); m_properties.putAll(properties); m_unmodifiableProperties = Collections.unmodifiableMap(m_properties); } public Map properties() { return m_unmodifiableProperties; } protected void setProperty(String key, Object value) { m_properties.put(key, value); } } /*** TAudioFormat.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/TConversionTool.java000066400000000000000000001213641335566474600310100ustar00rootroot00000000000000/* * TConversionTool.java */ /* * Copyright (c) 1999,2000 by Florian Bomers * Copyright (c) 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled; /** * Useful methods for converting audio data. * * @author Florian Bomers * @author Matthias Pfisterer */ /* For convenience, a list of available methods is maintained here. Some hints: - buffers: always byte arrays - offsets: always in bytes - sampleCount: number of SAMPLES to read/write, as opposed to FRAMES or BYTES! - when in buffer and out buffer are given, the data is copied, otherwise it is replaced in the same buffer (buffer size is not checked!) - a number (except "2") gives the number of bits in which format the samples have to be. - >8 bits per sample is always treated signed. - all functions are tried to be optimized - hints welcome ! ** "high level" methods ** changeOrderOrSign(buffer, nOffset, nByteLength, nBytesPerSample) changeOrderOrSign(inBuffer, nInOffset, outBuffer, nOutOffset, nByteLength, nBytesPerSample) ** PCM byte order and sign conversion ** void convertSign8(buffer, byteOffset, sampleCount) void swapOrder16(buffer, byteOffset, sampleCount) void swapOrder24(buffer, byteOffset, sampleCount) void swapOrder32(buffer, byteOffset, sampleCount) void convertSign8(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount) void swapOrder16(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount) void swapOrder24(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount) void swapOrder32(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount) ** conversion functions for byte arrays ** ** these are for reference to see how to implement these conversions ** short bytesToShort16(highByte, lowByte) short bytesToShort16(buffer, byteOffset, bigEndian) short bytesToInt16(highByte, lowByte) short bytesToInt16(buffer, byteOffset, bigEndian) short bytesToInt24(buffer, byteOffset, bigEndian) short bytesToInt32(buffer, byteOffset, bigEndian) void shortToBytes16(sample, buffer, byteOffset, bigEndian) void intToBytes24(sample, buffer, byteOffset, bigEndian) void intToBytes32(sample, buffer, byteOffset, bigEndian) ** ULAW <-> PCM ** byte linear2ulaw(int sample) short ulaw2linear(int ulawbyte) void pcm162ulaw(buffer, byteOffset, sampleCount, bigEndian) void pcm162ulaw(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount, bigEndian) void pcm82ulaw(buffer, byteOffset, sampleCount, signed) void pcm82ulaw(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount, signed) void ulaw2pcm16(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount, bigEndian) void ulaw2pcm8(buffer, byteOffset, sampleCount, signed) void ulaw2pcm8(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount, signed) ** ALAW <-> PCM ** byte linear2alaw(short pcm_val) short alaw2linear(byte ulawbyte) void pcm162alaw(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount, bigEndian) void pcm162alaw(buffer, byteOffset, sampleCount, bigEndian) void pcm82alaw(buffer, byteOffset, sampleCount, signed) void pcm82alaw(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount, signed) void alaw2pcm16(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount, bigEndian) void alaw2pcm8(buffer, byteOffset, sampleCount, signed) void alaw2pcm8(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount, signed) ** ULAW <-> ALAW ** byte ulaw2alaw(byte sample) void ulaw2alaw(buffer, byteOffset, sampleCount) void ulaw2alaw(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount) byte alaw2ulaw(byte sample) void alaw2ulaw(buffer, byteOffset, sampleCount) void alaw2ulaw(inBuffer, inByteOffset, outBuffer, outByteOffset, sampleCount) */ public class TConversionTool { ///////////////// sign/byte-order conversion /////////////////////////////////// public static void convertSign8(byte[] buffer, int byteOffset, int sampleCount) { sampleCount+=byteOffset; for (int i=byteOffset; i0) { outBuffer[outByteOffset++]=(byte)(inBuffer[inByteOffset++]+128); sampleCount--; } } public static void swapOrder16(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount) { while (sampleCount>0) { outBuffer[outByteOffset++]=inBuffer[inByteOffset+1]; outBuffer[outByteOffset++]=inBuffer[inByteOffset++]; inByteOffset++; sampleCount--; } } public static void swapOrder24(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount) { while (sampleCount>0) { outBuffer[outByteOffset++]=inBuffer[inByteOffset+2]; outByteOffset++; outBuffer[outByteOffset++]=inBuffer[inByteOffset++]; inByteOffset++; inByteOffset++; sampleCount--; } } public static void swapOrder32(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount) { while (sampleCount>0) { outBuffer[outByteOffset++]=inBuffer[inByteOffset+3]; outBuffer[outByteOffset++]=inBuffer[inByteOffset+2]; outBuffer[outByteOffset++]=inBuffer[inByteOffset+1]; outBuffer[outByteOffset++]=inBuffer[inByteOffset++]; inByteOffset++; inByteOffset++; inByteOffset++; sampleCount--; } } ///////////////// conversion functions for byte arrays //////////////////////////// /** * Converts 2 bytes to a signed sample of type short. *

This is a reference function. */ public static short bytesToShort16(byte highByte, byte lowByte) { return (short) ((highByte<<8) | (lowByte & 0xFF)); } /** * Converts 2 successive bytes starting at byteOffset in * buffer to a signed sample of type short. *

* For little endian, buffer[byteOffset] is interpreted as low byte, * whereas it is interpreted as high byte in big endian. *

This is a reference function. */ public static short bytesToShort16(byte[] buffer, int byteOffset, boolean bigEndian) { return bigEndian? ((short) ((buffer[byteOffset]<<8) | (buffer[byteOffset+1] & 0xFF))): ((short) ((buffer[byteOffset+1]<<8) | (buffer[byteOffset] & 0xFF))); } /** * Converts 2 bytes to a signed integer sample with 16bit range. *

This is a reference function. */ public static int bytesToInt16(byte highByte, byte lowByte) { return (highByte<<8) | (lowByte & 0xFF); } /** * Converts 2 successive bytes starting at byteOffset in * buffer to a signed integer sample with 16bit range. *

* For little endian, buffer[byteOffset] is interpreted as low byte, * whereas it is interpreted as high byte in big endian. *

This is a reference function. */ public static int bytesToInt16(byte[] buffer, int byteOffset, boolean bigEndian) { return bigEndian? ((buffer[byteOffset]<<8) | (buffer[byteOffset+1] & 0xFF)): ((buffer[byteOffset+1]<<8) | (buffer[byteOffset] & 0xFF)); } /** * Converts 3 successive bytes starting at byteOffset in * buffer to a signed integer sample with 24bit range. *

* For little endian, buffer[byteOffset] is interpreted as lowest byte, * whereas it is interpreted as highest byte in big endian. *

This is a reference function. */ public static int bytesToInt24(byte[] buffer, int byteOffset, boolean bigEndian) { return bigEndian? ((buffer[byteOffset]<<16) // let Java handle sign-bit | ((buffer[byteOffset+1] & 0xFF)<<8) // inhibit sign-bit handling | (buffer[byteOffset+2] & 0xFF)): ((buffer[byteOffset+2]<<16) // let Java handle sign-bit | ((buffer[byteOffset+1] & 0xFF)<<8) // inhibit sign-bit handling | (buffer[byteOffset] & 0xFF)); } /** * Converts a 4 successive bytes starting at byteOffset in * buffer to a signed 32bit integer sample. *

* For little endian, buffer[byteOffset] is interpreted as lowest byte, * whereas it is interpreted as highest byte in big endian. *

This is a reference function. */ public static int bytesToInt32(byte[] buffer, int byteOffset, boolean bigEndian) { return bigEndian? ((buffer[byteOffset]<<24) // let Java handle sign-bit | ((buffer[byteOffset+1] & 0xFF)<<16) // inhibit sign-bit handling | ((buffer[byteOffset+2] & 0xFF)<<8) // inhibit sign-bit handling | (buffer[byteOffset+3] & 0xFF)): ((buffer[byteOffset+3]<<24) // let Java handle sign-bit | ((buffer[byteOffset+2] & 0xFF)<<16) // inhibit sign-bit handling | ((buffer[byteOffset+1] & 0xFF)<<8) // inhibit sign-bit handling | (buffer[byteOffset] & 0xFF)); } /** * Converts a sample of type short to 2 bytes in an array. * sample is interpreted as signed (as Java does). *

* For little endian, buffer[byteOffset] is filled with low byte of sample, * and buffer[byteOffset+1] is filled with high byte of sample. *

For big endian, this is reversed. *

This is a reference function. */ public static void shortToBytes16(short sample, byte[] buffer, int byteOffset, boolean bigEndian) { intToBytes16(sample, buffer, byteOffset, bigEndian); } /** * Converts a 16 bit sample of type int to 2 bytes in an array. * sample is interpreted as signed (as Java does). *

* For little endian, buffer[byteOffset] is filled with low byte of sample, * and buffer[byteOffset+1] is filled with high byte of sample + sign bit. *

For big endian, this is reversed. *

Before calling this function, it should be assured that sample * is in the 16bit range - it will not be clipped. *

This is a reference function. */ public static void intToBytes16(int sample, byte[] buffer, int byteOffset, boolean bigEndian) { if (bigEndian) { buffer[byteOffset++]=(byte) (sample >> 8); buffer[byteOffset]=(byte) (sample & 0xFF); } else { buffer[byteOffset++]=(byte) (sample & 0xFF); buffer[byteOffset]=(byte) (sample >> 8); } } /** * Converts a 24 bit sample of type int to 3 bytes in an array. * sample is interpreted as signed (as Java does). *

* For little endian, buffer[byteOffset] is filled with low byte of sample, * and buffer[byteOffset+2] is filled with the high byte of sample + sign bit. *

For big endian, this is reversed. *

Before calling this function, it should be assured that sample * is in the 24bit range - it will not be clipped. *

This is a reference function. */ public static void intToBytes24(int sample, byte[] buffer, int byteOffset, boolean bigEndian) { if (bigEndian) { buffer[byteOffset++]=(byte) (sample >> 16); buffer[byteOffset++]=(byte) ((sample >>> 8) & 0xFF); buffer[byteOffset]=(byte) (sample & 0xFF); } else { buffer[byteOffset++]=(byte) (sample & 0xFF); buffer[byteOffset++]=(byte) ((sample >>> 8) & 0xFF); buffer[byteOffset]=(byte) (sample >> 16); } } /** * Converts a 32 bit sample of type int to 4 bytes in an array. * sample is interpreted as signed (as Java does). *

* For little endian, buffer[byteOffset] is filled with lowest byte of sample, * and buffer[byteOffset+3] is filled with the high byte of sample + sign bit. *

For big endian, this is reversed. *

This is a reference function. */ public static void intToBytes32(int sample, byte[] buffer, int byteOffset, boolean bigEndian) { if (bigEndian) { buffer[byteOffset++]=(byte) (sample >> 24); buffer[byteOffset++]=(byte) ((sample >>> 16) & 0xFF); buffer[byteOffset++]=(byte) ((sample >>> 8) & 0xFF); buffer[byteOffset]=(byte) (sample & 0xFF); } else { buffer[byteOffset++]=(byte) (sample & 0xFF); buffer[byteOffset++]=(byte) ((sample >>> 8) & 0xFF); buffer[byteOffset++]=(byte) ((sample >>> 16) & 0xFF); buffer[byteOffset]=(byte) (sample >> 24); } } /////////////////////// ULAW /////////////////////////////////////////// private static final boolean ZEROTRAP=true; private static final short BIAS=0x84; private static final int CLIP=32635; private static final int exp_lut1[] ={ 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 }; /** * Converts a linear signed 16bit sample to a uLaw byte. * Ported to Java by fb. *
Originally by:
* Craig Reese: IDA/Supercomputing Research Center
* Joe Campbell: Department of Defense
* 29 September 1989
*/ public static byte linear2ulaw(int sample) { int sign, exponent, mantissa, ulawbyte; if (sample>32767) sample=32767; else if (sample<-32768) sample=-32768; /* Get the sample into sign-magnitude. */ sign = (sample >> 8) & 0x80; /* set aside the sign */ if (sign != 0) sample = -sample; /* get magnitude */ if (sample > CLIP) sample = CLIP; /* clip the magnitude */ /* Convert from 16 bit linear to ulaw. */ sample = sample + BIAS; exponent = exp_lut1[(sample >> 7) & 0xFF]; mantissa = (sample >> (exponent + 3)) & 0x0F; ulawbyte = ~(sign | (exponent << 4) | mantissa); if (ZEROTRAP) if (ulawbyte == 0) ulawbyte = 0x02; /* optional CCITT trap */ return((byte) ulawbyte); } /* u-law to linear conversion table */ private static short[] u2l = { -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316, -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, -876, -844, -812, -780, -748, -716, -684, -652, -620, -588, -556, -524, -492, -460, -428, -396, -372, -356, -340, -324, -308, -292, -276, -260, -244, -228, -212, -196, -180, -164, -148, -132, -120, -112, -104, -96, -88, -80, -72, -64, -56, -48, -40, -32, -24, -16, -8, 0, 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, 876, 844, 812, 780, 748, 716, 684, 652, 620, 588, 556, 524, 492, 460, 428, 396, 372, 356, 340, 324, 308, 292, 276, 260, 244, 228, 212, 196, 180, 164, 148, 132, 120, 112, 104, 96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0 }; public static short ulaw2linear(byte ulawbyte) { return u2l[ulawbyte & 0xFF]; } /** * Converts a buffer of signed 16bit big endian samples to uLaw. * The uLaw bytes overwrite the original 16 bit values. * The first byte-offset of the uLaw bytes is byteOffset. * It will be written sampleCount/2 bytes. */ public static void pcm162ulaw(byte[] buffer, int byteOffset, int sampleCount, boolean bigEndian) { int shortIndex=byteOffset; int ulawIndex=shortIndex; if (bigEndian) { while (sampleCount>0) { buffer[ulawIndex++]=linear2ulaw (bytesToInt16(buffer[shortIndex], buffer[shortIndex+1])); shortIndex++; shortIndex++; sampleCount--; } } else { while (sampleCount>0) { buffer[ulawIndex++]=linear2ulaw (bytesToInt16(buffer[shortIndex+1], buffer[shortIndex])); shortIndex++; shortIndex++; sampleCount--; } } } /** * Fills outBuffer with ulaw samples. * reading starts from inBuffer[inByteOffset]. * writing starts at outBuffer[outByteOffset]. * There will be sampleCount*2 bytes read from inBuffer; * There will be sampleCount bytes written to outBuffer. */ public static void pcm162ulaw(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount, boolean bigEndian) { int shortIndex=inByteOffset; int ulawIndex=outByteOffset; if (bigEndian) { while (sampleCount>0) { outBuffer[ulawIndex++]=linear2ulaw (bytesToInt16(inBuffer[shortIndex], inBuffer[shortIndex+1])); shortIndex++; shortIndex++; sampleCount--; } } else { while (sampleCount>0) { outBuffer[ulawIndex++]=linear2ulaw (bytesToInt16(inBuffer[shortIndex+1], inBuffer[shortIndex])); shortIndex++; shortIndex++; sampleCount--; } } } // TODO: either direct 8bit pcm to ulaw, or better conversion from 8bit to 16bit /** * Converts a buffer of 8bit samples to uLaw. * The uLaw bytes overwrite the original 8 bit values. * The first byte-offset of the uLaw bytes is byteOffset. * It will be written sampleCount bytes. */ public static void pcm82ulaw(byte[] buffer, int byteOffset, int sampleCount, boolean signed) { sampleCount+=byteOffset; if (signed) { for (int i=byteOffset; ibytes written to outBuffer. */ public static void pcm82ulaw(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount, boolean signed) { int ulawIndex=outByteOffset; int pcmIndex=inByteOffset; if (signed) { while (sampleCount>0) { outBuffer[ulawIndex++]=linear2ulaw(inBuffer[pcmIndex++] << 8); sampleCount--; } } else { while (sampleCount>0) { outBuffer[ulawIndex++]=linear2ulaw(((byte) (inBuffer[pcmIndex++]+128)) << 8); sampleCount--; } } } /** * Fills outBuffer with pcm signed 16 bit samples. * reading starts from inBuffer[inByteOffset]. * writing starts at outBuffer[outByteOffset]. * There will be sampleCount bytes read from inBuffer; * There will be sampleCount*2 bytes written to outBuffer. */ public static void ulaw2pcm16(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount, boolean bigEndian) { int shortIndex=outByteOffset; int ulawIndex=inByteOffset; while (sampleCount>0) { intToBytes16 (u2l[inBuffer[ulawIndex++] & 0xFF], outBuffer, shortIndex++, bigEndian); shortIndex++; sampleCount--; } } // TODO: either direct 8bit pcm to ulaw, or better conversion from 8bit to 16bit /** * Inplace-conversion of a ulaw buffer to 8bit samples. * The 8bit bytes overwrite the original ulaw values. * The first byte-offset of the uLaw bytes is byteOffset. * It will be written sampleCount bytes. */ public static void ulaw2pcm8(byte[] buffer, int byteOffset, int sampleCount, boolean signed) { sampleCount+=byteOffset; if (signed) { for (int i=byteOffset; i> 8) & 0xFF); } } else { for (int i=byteOffset; i>8)+128); } } } /** * Fills outBuffer with ulaw samples. * reading starts from inBuffer[inByteOffset]. * writing starts at outBuffer[outByteOffset]. * There will be sampleCount bytes written to outBuffer. */ public static void ulaw2pcm8(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount, boolean signed) { int ulawIndex=inByteOffset; int pcmIndex=outByteOffset; if (signed) { while (sampleCount>0) { outBuffer[pcmIndex++]= (byte) ((u2l[inBuffer[ulawIndex++] & 0xFF] >> 8) & 0xFF); sampleCount--; } } else { while (sampleCount>0) { outBuffer[pcmIndex++]= (byte) ((u2l[inBuffer[ulawIndex++] & 0xFF]>>8)+128); sampleCount--; } } } //////////////////// ALAW //////////////////////////// /* * This source code is a product of Sun Microsystems, Inc. and is provided * for unrestricted use. Users may copy or modify this source code without * charge. * * linear2alaw() - Convert a 16-bit linear PCM value to 8-bit A-law * * linear2alaw() accepts an 16-bit integer and encodes it as A-law data. * * Linear Input Code Compressed Code * ------------------------ --------------- * 0000000wxyza 000wxyz * 0000001wxyza 001wxyz * 000001wxyzab 010wxyz * 00001wxyzabc 011wxyz * 0001wxyzabcd 100wxyz * 001wxyzabcde 101wxyz * 01wxyzabcdef 110wxyz * 1wxyzabcdefg 111wxyz * * For further information see John C. Bellamy's Digital Telephony, 1982, * John Wiley & Sons, pps 98-111 and 472-476. */ private static final byte QUANT_MASK = 0xf; /* Quantization field mask. */ private static final byte SEG_SHIFT = 4; /* Left shift for segment number. */ private static final short[] seg_end = { 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF }; public static byte linear2alaw(short pcm_val) /* 2's complement (16-bit range) */ { byte mask; byte seg=8; byte aval; if (pcm_val >= 0) { mask = (byte) 0xD5; /* sign (7th) bit = 1 */ } else { mask = 0x55; /* sign bit = 0 */ pcm_val = (short) (-pcm_val - 8); } /* Convert the scaled magnitude to segment number. */ for (int i = 0; i < 8; i++) { if (pcm_val <= seg_end[i]) { seg=(byte) i; break; } } /* Combine the sign, segment, and quantization bits. */ if (seg >= 8) /* out of range, return maximum value. */ return (byte) ((0x7F ^ mask) & 0xFF); else { aval = (byte) (seg << SEG_SHIFT); if (seg < 2) aval |= (pcm_val >> 4) & QUANT_MASK; else aval |= (pcm_val >> (seg + 3)) & QUANT_MASK; return (byte) ((aval ^ mask) & 0xFF); } } private static short[] a2l = { -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, -11008, -10496, -12032, -11520, -8960, -8448, -9984, -9472, -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, -344, -328, -376, -360, -280, -264, -312, -296, -472, -456, -504, -488, -408, -392, -440, -424, -88, -72, -120, -104, -24, -8, -56, -40, -216, -200, -248, -232, -152, -136, -184, -168, -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, -688, -656, -752, -720, -560, -528, -624, -592, -944, -912, -1008, -976, -816, -784, -880, -848, 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296, 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56, 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976, 816, 784, 880, 848 }; public static short alaw2linear(byte ulawbyte) { return a2l[ulawbyte & 0xFF]; } /** * Converts a buffer of signed 16bit big endian samples to uLaw. * The uLaw bytes overwrite the original 16 bit values. * The first byte-offset of the uLaw bytes is byteOffset. * It will be written sampleCount/2 bytes. */ public static void pcm162alaw(byte[] buffer, int byteOffset, int sampleCount, boolean bigEndian) { int shortIndex=byteOffset; int alawIndex=shortIndex; if (bigEndian) { while (sampleCount>0) { buffer[alawIndex++]= linear2alaw(bytesToShort16 (buffer[shortIndex], buffer[shortIndex+1])); shortIndex++; shortIndex++; sampleCount--; } } else { while (sampleCount>0) { buffer[alawIndex++]= linear2alaw(bytesToShort16 (buffer[shortIndex+1], buffer[shortIndex])); shortIndex++; shortIndex++; sampleCount--; } } } /** * Fills outBuffer with alaw samples. * reading starts from inBuffer[inByteOffset]. * writing starts at outBuffer[outByteOffset]. * There will be sampleCount*2 bytes read from inBuffer; * There will be sampleCount bytes written to outBuffer. */ public static void pcm162alaw(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount, boolean bigEndian) { int shortIndex=inByteOffset; int alawIndex=outByteOffset; if (bigEndian) { while (sampleCount>0) { outBuffer[alawIndex++]=linear2alaw (bytesToShort16(inBuffer[shortIndex], inBuffer[shortIndex+1])); shortIndex++; shortIndex++; sampleCount--; } } else { while (sampleCount>0) { outBuffer[alawIndex++]=linear2alaw (bytesToShort16(inBuffer[shortIndex+1], inBuffer[shortIndex])); shortIndex++; shortIndex++; sampleCount--; } } } /** * Converts a buffer of 8bit samples to alaw. * The alaw bytes overwrite the original 8 bit values. * The first byte-offset of the aLaw bytes is byteOffset. * It will be written sampleCount bytes. */ public static void pcm82alaw(byte[] buffer, int byteOffset, int sampleCount, boolean signed) { sampleCount+=byteOffset; if (signed) { for (int i=byteOffset; ibytes written to outBuffer. */ public static void pcm82alaw(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount, boolean signed) { int alawIndex=outByteOffset; int pcmIndex=inByteOffset; if (signed) { while (sampleCount>0) { outBuffer[alawIndex++]= linear2alaw((short) (inBuffer[pcmIndex++] << 8)); sampleCount--; } } else { while (sampleCount>0) { outBuffer[alawIndex++]= linear2alaw((short) (((byte) (inBuffer[pcmIndex++]+128)) << 8)); sampleCount--; } } } /** * Converts an alaw buffer to 8bit pcm samples * The 8bit bytes overwrite the original alaw values. * The first byte-offset of the aLaw bytes is byteOffset. * It will be written sampleCount bytes. */ public static void alaw2pcm8(byte[] buffer, int byteOffset, int sampleCount, boolean signed) { sampleCount+=byteOffset; if (signed) { for (int i=byteOffset; i> 8) & 0xFF); } } else { for (int i=byteOffset; i>8)+128); } } } /** * Fills outBuffer with alaw samples. * reading starts from inBuffer[inByteOffset]. * writing starts at outBuffer[outByteOffset]. * There will be sampleCount bytes written to outBuffer. */ public static void alaw2pcm8(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount, boolean signed) { int alawIndex=inByteOffset; int pcmIndex=outByteOffset; if (signed) { while (sampleCount>0) { outBuffer[pcmIndex++]= (byte) ((a2l[inBuffer[alawIndex++] & 0xFF] >> 8) & 0xFF); sampleCount--; } } else { while (sampleCount>0) { outBuffer[pcmIndex++]= (byte) ((a2l[inBuffer[alawIndex++] & 0xFF]>>8)+128); sampleCount--; } } } /** * Fills outBuffer with pcm signed 16 bit samples. * reading starts from inBuffer[inByteOffset]. * writing starts at outBuffer[outByteOffset]. * There will be sampleCount bytes read from inBuffer; * There will be sampleCount*2 bytes written to outBuffer. */ public static void alaw2pcm16(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount, boolean bigEndian) { int shortIndex=outByteOffset; int alawIndex=inByteOffset; while (sampleCount>0) { intToBytes16 (a2l[inBuffer[alawIndex++] & 0xFF], outBuffer, shortIndex++, bigEndian); shortIndex++; sampleCount--; } } //////////////////////// cross conversion alaw <-> ulaw //////////////////////////////////////// private static byte[] u2a = { -86, -85, -88, -87, -82, -81, -84, -83, -94, -93, -96, -95, -90, -89, -92, -91, -70, -69, -72, -71, -66, -65, -68, -67, -78, -77, -80, -79, -74, -73, -76, -75, -118, -117, -120, -119, -114, -113, -116, -115, -126, -125, -128, -127, -122, -121, -124, -123, -101, -104, -103, -98, -97, -100, -99, -110, -109, -112, -111, -106, -105, -108, -107, -22, -24, -23, -18, -17, -20, -19, -30, -29, -32, -31, -26, -25, -28, -27, -6, -8, -2, -1, -4, -3, -14, -13, -16, -15, -10, -9, -12, -11, -53, -55, -49, -51, -62, -61, -64, -63, -58, -57, -60, -59, -38, -37, -40, -39, -34, -33, -36, -35, -46, -46, -45, -45, -48, -48, -47, -47, -42, -42, -41, -41, -44, -44, -43, -43, 42, 43, 40, 41, 46, 47, 44, 45, 34, 35, 32, 33, 38, 39, 36, 37, 58, 59, 56, 57, 62, 63, 60, 61, 50, 51, 48, 49, 54, 55, 52, 53, 10, 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, 1, 6, 7, 4, 5, 27, 24, 25, 30, 31, 28, 29, 18, 19, 16, 17, 22, 23, 20, 21, 106, 104, 105, 110, 111, 108, 109, 98, 99, 96, 97, 102, 103, 100, 101, 122, 120, 126, 127, 124, 125, 114, 115, 112, 113, 118, 119, 116, 117, 75, 73, 79, 77, 66, 67, 64, 65, 70, 71, 68, 69, 90, 91, 88, 89, 94, 95, 92, 93, 82, 82, 83, 83, 80, 80, 81, 81, 86, 86, 87, 87, 84, 84, 85, 85, }; public static byte ulaw2alaw(byte sample) { return u2a[sample & 0xFF]; } /** * Converts a buffer of uLaw samples to aLaw. */ public static void ulaw2alaw(byte[] buffer, int byteOffset, int sampleCount) { sampleCount+=byteOffset; for (int i=byteOffset; i0) { outBuffer[alawIndex++]=u2a[inBuffer[ulawIndex++] & 0xFF]; sampleCount--; } } private static byte[] a2u = { -86, -85, -88, -87, -82, -81, -84, -83, -94, -93, -96, -95, -90, -89, -92, -91, -71, -70, -73, -72, -67, -66, -69, -68, -79, -78, -80, -80, -75, -74, -77, -76, -118, -117, -120, -119, -114, -113, -116, -115, -126, -125, -128, -127, -122, -121, -124, -123, -102, -101, -104, -103, -98, -97, -100, -99, -110, -109, -112, -111, -106, -105, -108, -107, -30, -29, -32, -31, -26, -25, -28, -27, -35, -35, -36, -36, -33, -33, -34, -34, -12, -10, -16, -14, -4, -2, -8, -6, -22, -21, -24, -23, -18, -17, -20, -19, -56, -55, -58, -57, -52, -51, -54, -53, -64, -63, -65, -65, -60, -59, -62, -61, -42, -41, -44, -43, -38, -37, -40, -39, -49, -49, -50, -50, -46, -45, -48, -47, 42, 43, 40, 41, 46, 47, 44, 45, 34, 35, 32, 33, 38, 39, 36, 37, 57, 58, 55, 56, 61, 62, 59, 60, 49, 50, 48, 48, 53, 54, 51, 52, 10, 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, 1, 6, 7, 4, 5, 26, 27, 24, 25, 30, 31, 28, 29, 18, 19, 16, 17, 22, 23, 20, 21, 98, 99, 96, 97, 102, 103, 100, 101, 93, 93, 92, 92, 95, 95, 94, 94, 116, 118, 112, 114, 124, 126, 120, 122, 106, 107, 104, 105, 110, 111, 108, 109, 72, 73, 70, 71, 76, 77, 74, 75, 64, 65, 63, 63, 68, 69, 66, 67, 86, 87, 84, 85, 90, 91, 88, 89, 79, 79, 78, 78, 82, 83, 80, 81, }; public static byte alaw2ulaw(byte sample) { return a2u[sample & 0xFF]; } /** * Converts a buffer of aLaw samples to uLaw. * The uLaw bytes overwrite the original aLaw values. * The first byte-offset of the uLaw bytes is byteOffset. * It will be written sampleCount bytes. */ public static void alaw2ulaw(byte[] buffer, int byteOffset, int sampleCount) { sampleCount+=byteOffset; for (int i=byteOffset; ibytes written to outBuffer. */ public static void alaw2ulaw(byte[] inBuffer, int inByteOffset, byte[] outBuffer, int outByteOffset, int sampleCount) { int ulawIndex=outByteOffset; int alawIndex=inByteOffset; while (sampleCount>0) { outBuffer[ulawIndex++]=a2u[inBuffer[alawIndex++] & 0xFF]; sampleCount--; } } //////////////////////// high level methods ///////////////////////////////////////////////// /* * !! Here, unlike other functions in this class, the length is * in bytes rather than samples !! */ public static void changeOrderOrSign(byte[] buffer, int nOffset, int nByteLength, int nBytesPerSample) { switch (nBytesPerSample) { case 1: convertSign8(buffer, nOffset, nByteLength); break; case 2: swapOrder16(buffer, nOffset, nByteLength / 2); break; case 3: swapOrder24(buffer, nOffset, nByteLength / 3); break; case 4: swapOrder32(buffer, nOffset, nByteLength / 4); break; } } /* * !! Here, unlike other functions in this class, the length is * in bytes rather than samples !! */ public static void changeOrderOrSign( byte[] inBuffer, int nInOffset, byte[] outBuffer, int nOutOffset, int nByteLength, int nBytesPerSample) { switch (nBytesPerSample) { case 1: convertSign8( inBuffer, nInOffset, outBuffer, nOutOffset, nByteLength); break; case 2: swapOrder16( inBuffer, nInOffset, outBuffer, nOutOffset, nByteLength / 2); break; case 3: swapOrder24( inBuffer, nInOffset, outBuffer, nOutOffset, nByteLength / 3); break; case 4: swapOrder32( inBuffer, nInOffset, outBuffer, nOutOffset, nByteLength / 4); break; } } ///////////////// Annexe: how the arrays were created. ////////////////////////////////// /* * Converts a uLaw byte to a linear signed 16bit sample. * Ported to Java by fb. *
Originally by:
* * Craig Reese: IDA/Supercomputing Research Center
* 29 September 1989
* * References:
*

    *
  1. CCITT Recommendation G.711 (very difficult to follow)
  2. *
  3. MIL-STD-188-113,"Interoperability and Performance Standards * for Analog-to_Digital Conversion Techniques," * 17 February 1987
  4. *
*/ /* private static final int exp_lut2[] = { 0,132,396,924,1980,4092,8316,16764 }; public static short _ulaw2linear(int ulawbyte) { int sign, exponent, mantissa, sample; ulawbyte = ~ulawbyte; sign = (ulawbyte & 0x80); exponent = (ulawbyte >> 4) & 0x07; mantissa = ulawbyte & 0x0F; sample = exp_lut2[exponent] + (mantissa << (exponent + 3)); if (sign != 0) sample = -sample; return((short) sample); }*/ /* u- to A-law conversions: copied from CCITT G.711 specifications */ /* private static byte[] _u2a = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, (byte) 128}; */ /* u-law to A-law conversion */ /* * This source code is a product of Sun Microsystems, Inc. and is provided * for unrestricted use. Users may copy or modify this source code without * charge. */ /* public static byte _ulaw2alaw(byte sample) { sample &= 0xff; return (byte) (((sample & 0x80)!=0) ? (0xD5 ^ (_u2a[(0x7F ^ sample) & 0x7F] - 1)) : (0x55 ^ (_u2a[(0x7F ^ sample) & 0x7F] - 1))); }*/ /* A- to u-law conversions */ /* private static byte[] _a2u = { 1, 3, 5, 7, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127}; */ /* * This source code is a product of Sun Microsystems, Inc. and is provided * for unrestricted use. Users may copy or modify this source code without * charge. */ /* public static byte _alaw2ulaw(byte sample) { sample &= 0xff; return (byte) (((sample & 0x80)!=0) ? (0xFF ^ _a2u[(sample ^ 0xD5) & 0x7F]) : (0x7F ^ _a2u[(sample ^ 0x55) & 0x7F])); } public static void print_a2u() { System.out.println("\tprivate static byte[] a2u = {"); for (int i=-128; i<128; i++) { if (((i+128) % 16)==0) { System.out.print("\t\t"); } byte b=(byte) i; System.out.print(_alaw2ulaw(b)+", "); if (((i+128) % 16)==15) { System.out.println(""); } } System.out.println("\t};"); } public static void print_u2a() { System.out.println("\tprivate static byte[] u2a = {"); for (int i=-128; i<128; i++) { if (((i+128) % 16)==0) { System.out.print("\t\t"); } byte b=(byte) i; System.out.print(_ulaw2alaw(b)+", "); if (((i+128) % 16)==15) { System.out.println(""); } } System.out.println("\t};"); } */ } /*** TConversionTool.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/TVolumeUtils.java000066400000000000000000000023671335566474600303160ustar00rootroot00000000000000/* * TVolumeUtils.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled; public class TVolumeUtils { private static final double FACTOR1 = 20.0 / Math.log(10.0); private static final double FACTOR2 = 1 / 20.0; public static double lin2log(double dLinear) { return FACTOR1 * Math.log(dLinear); } public static double log2lin(double dLogarithmic) { return Math.pow(10.0, dLogarithmic * FACTOR2); } } /*** TVolumeUtils.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/convert/000077500000000000000000000000001335566474600265075ustar00rootroot00000000000000TAsynchronousFilteredAudioInputStream.java000066400000000000000000000147401335566474600367550ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/sampled/convert/* * TAsynchronousFilteredAudioInputStream.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.convert; import java.io.ByteArrayInputStream; import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import org.tritonus.share.TDebug; import org.tritonus.share.TCircularBuffer; /** Base class for asynchronus converters. This class serves as base class for converters that do not have a fixed ratio between the size of a block of input data and the size of a block of output data. These types of converters therefore need an internal buffer, which is realized in this class. @author Matthias Pfisterer */ public abstract class TAsynchronousFilteredAudioInputStream extends TAudioInputStream implements TCircularBuffer.Trigger { private static final int DEFAULT_BUFFER_SIZE = 327670; private static final int DEFAULT_MIN_AVAILABLE = 4096; private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; private TCircularBuffer m_circularBuffer; private int m_nMinAvailable; private byte[] m_abSingleByte; /** Constructor. This constructor uses the default buffer size and the default min available amount. @param lLength length of this stream in frames. May be AudioSystem.NOT_SPECIFIED. */ public TAsynchronousFilteredAudioInputStream(AudioFormat outputFormat, long lLength) { this(outputFormat, lLength, DEFAULT_BUFFER_SIZE, DEFAULT_MIN_AVAILABLE); } /** Constructor. With this constructor, the buffer size and the minimum available amount can be specified as parameters. @param lLength length of this stream in frames. May be AudioSystem.NOT_SPECIFIED. @param nBufferSize size of the circular buffer in bytes. */ public TAsynchronousFilteredAudioInputStream( AudioFormat outputFormat, long lLength, int nBufferSize, int nMinAvailable) { /* The usage of a ByteArrayInputStream is a hack. * (the infamous "JavaOne hack", because I did it on June * 6th 2000 in San Francisco, only hours before a * JavaOne session where I wanted to show mp3 playback * with Java Sound.) It is necessary because in the FCS * version of the Sun jdk1.3, the constructor of * AudioInputStream throws an exception if its first * argument is null. So we have to pass a dummy non-null * value. */ super(new ByteArrayInputStream(EMPTY_BYTE_ARRAY), outputFormat, lLength); if (TDebug.TraceAudioConverter) { TDebug.out("TAsynchronousFilteredAudioInputStream.(): begin"); } m_circularBuffer = new TCircularBuffer( nBufferSize, false, // blocking read true, // blocking write this); // trigger m_nMinAvailable = nMinAvailable; if (TDebug.TraceAudioConverter) { TDebug.out("TAsynchronousFilteredAudioInputStream.(): end"); } } /** Returns the circular buffer. */ protected TCircularBuffer getCircularBuffer() { return m_circularBuffer; } /** Check if writing more data to the circular buffer is recommanded. This checks the available write space in the circular buffer against the minimum available property. If the available write space is greater than th minimum available property, more writing is encouraged, so this method returns true. Note that this is only a hint to subclasses. However, it is an important hint. @return true if more writing to the circular buffer is recommanden. Otherwise, false is returned. */ protected boolean writeMore() { return getCircularBuffer().availableWrite() > m_nMinAvailable; } public int read() throws IOException { // if (TDebug.TraceAudioConverter) { TDebug.out("TAsynchronousFilteredAudioInputStream.read(): begin"); } int nByte = -1; if (m_abSingleByte == null) { m_abSingleByte = new byte[1]; } int nReturn = read(m_abSingleByte); if (nReturn == -1) { nByte = -1; } else { //$$fb 2001-04-14 nobody really knows that... nByte = m_abSingleByte[0] & 0xFF; } // if (TDebug.TraceAudioConverter) { TDebug.out("TAsynchronousFilteredAudioInputStream.read(): end"); } return nByte; } public int read(byte[] abData) throws IOException { if (TDebug.TraceAudioConverter) { TDebug.out("TAsynchronousFilteredAudioInputStream.read(byte[]): begin"); } int nRead = read(abData, 0, abData.length); if (TDebug.TraceAudioConverter) { TDebug.out("TAsynchronousFilteredAudioInputStream.read(byte[]): end"); } return nRead; } public int read(byte[] abData, int nOffset, int nLength) throws IOException { if (TDebug.TraceAudioConverter) { TDebug.out("TAsynchronousFilteredAudioInputStream.read(byte[], int, int): begin"); } //$$fb 2001-04-22: this returns at maximum circular buffer // length. This is not very efficient... //$$fb 2001-04-25: we should check that we do not exceed getFrameLength() ! int nRead = m_circularBuffer.read(abData, nOffset, nLength); if (TDebug.TraceAudioConverter) { TDebug.out("TAsynchronousFilteredAudioInputStream.read(byte[], int, int): end"); } return nRead; } public long skip(long lSkip) throws IOException { // TODO: this is quite inefficient for (long lSkipped = 0; lSkipped < lSkip; lSkipped++) { int nReturn = read(); if (nReturn == -1) { return lSkipped; } } return lSkip; } public int available() throws IOException { return m_circularBuffer.availableRead(); } public void close() throws IOException { m_circularBuffer.close(); } public boolean markSupported() { return false; } public void mark(int nReadLimit) { } public void reset() throws IOException { throw new IOException("mark not supported"); } } /*** TAsynchronousFilteredAudioInputStream.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/convert/TAudioInputStream.java000066400000000000000000000064261335566474600327430ustar00rootroot00000000000000/* * TAudioInputStream.java */ /* * Copyright (c) 2003 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled.convert; import java.io.InputStream; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; /** AudioInputStream base class. This class implements "dynamic" properties. "Dynamic" properties are properties that may change during the life time of the objects. This is typically used to pass information like the current frame number, volume of subbands and similar values. "Dynamic" properties are different from properties in AudioFormat and AudioFileFormat, which are considered "static", as they aren't allowed to change after creating of the object, thereby maintaining the immutable character of these classes. */ public class TAudioInputStream extends AudioInputStream { private Map m_properties; private Map m_unmodifiableProperties; /** Constructor without properties. Creates an empty properties map. */ public TAudioInputStream(InputStream inputStream, AudioFormat audioFormat, long lLengthInFrames) { super(inputStream, audioFormat, lLengthInFrames); initMaps(new HashMap()); } /** Constructor with properties. The passed properties map is not copied. This allows subclasses to change values in the map after creation, and the changes are reflected in the map the application program can obtain. */ public TAudioInputStream(InputStream inputStream, AudioFormat audioFormat, long lLengthInFrames, Map properties) { super(inputStream, audioFormat, lLengthInFrames); initMaps(properties); } private void initMaps(Map properties) { /* Here, we make a shallow copy of the map. It's unclear if this is sufficient (of if a deep copy should be made). */ m_properties = properties; m_unmodifiableProperties = Collections.unmodifiableMap(m_properties); } /** Obtain a Map containing the properties. This method returns a Map that cannot be modified by the application program, but reflects changes to the map made by the implementation. @return a map containing the properties. */ public Map properties() { return m_unmodifiableProperties; } /** Set a property. Unlike in AudioFormat and AudioFileFormat, this method may be used anywhere by subclasses - it is not restricted to be used in the constructor. */ protected void setProperty(String key, Object value) { m_properties.put(key, value); } } /*** TAudioInputStream.java ***/ TEncodingFormatConversionProvider.java000066400000000000000000000114121335566474600360760ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/sampled/convert/* * TEncodingFormatConversionProvider.java */ /* * Copyright (c) 2000 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.convert; import java.util.Collection; import java.util.Iterator; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import org.tritonus.share.TDebug; import org.tritonus.share.ArraySet; // this class depends on handling of AudioSystem.NOT_SPECIFIED in AudioFormat.matches() /** * This is a base class for FormatConversionProviders that only * change the encoding, i.e. they never *
    *
  • change the sample size in bits without changing the encoding *
  • change the sample rate *
  • change the number of channels *
*

It is assumed that each source format can be encoded to all * target formats. *

In the sourceFormats and targetFormats collections that are passed to * the constructor of this class, fields may be set to AudioSystem.NOT_SPECIFIED. * This means that it handles all values of that field, but cannot change it. *

This class prevents that a conversion is done (e.g. for sample rates), * because the overriding class specified AudioSystem.NOT_SPECIFIED as sample rate, * meaning it handles all sample rates. *

Overriding classes must implement at least * AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream) * and provide a constructor that calls the protected constructor of this class. * * @author Florian Bomers */ public abstract class TEncodingFormatConversionProvider extends TSimpleFormatConversionProvider { protected TEncodingFormatConversionProvider( Collection sourceFormats, Collection targetFormats) { super(sourceFormats, targetFormats); } /** * This implementation assumes that the converter can convert * from each of its source formats to each of its target * formats. If this is not the case, the converter has to * override this method. *

When conversion is supported, for every target encoding, * the fields sample size in bits, channels and sample rate are checked: *

    *
  • When a field in both the source and target format is AudioSystem.NOT_SPECIFIED, * one instance of that targetFormat is returned with this field set to AudioSystem.NOT_SPECIFIED. *
  • When a field in sourceFormat is set and it is AudioSystem.NOT_SPECIFIED in the target format, * the value of the field of source format is set in the returned format. *
  • The same applies for the other way round. *
* For this, replaceNotSpecified(sourceFormat, targetFormat) in the base * class TSimpleFormatConversionProvider is used - and accordingly, the frameSize * is recalculated with getFrameSize(...) if a field with AudioSystem.NOT_SPECIFIED * is replaced. Inheriting classes may wish to override this method if the * default mode of calculating the frame size is not appropriate. */ public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) { if (TDebug.TraceAudioConverter) { TDebug.out(">TEncodingFormatConversionProvider.getTargetFormats(AudioFormat.Encoding, AudioFormat):"); TDebug.out("checking if conversion possible"); TDebug.out("from: " + sourceFormat); TDebug.out("to: " + targetEncoding); } if (isConversionSupported(targetEncoding, sourceFormat)) { // TODO: check that no duplicates may occur... ArraySet result=new ArraySet(); Iterator iterator = getCollectionTargetFormats().iterator(); while (iterator.hasNext()) { AudioFormat targetFormat = (AudioFormat) iterator.next(); targetFormat=replaceNotSpecified(sourceFormat, targetFormat); result.add(targetFormat); } if (TDebug.TraceAudioConverter) { TDebug.out("< returning "+result.size()+" elements."); } return (AudioFormat[]) result.toArray(EMPTY_FORMAT_ARRAY); } else { if (TDebug.TraceAudioConverter) { TDebug.out("< returning empty array."); } return EMPTY_FORMAT_ARRAY; } } } /*** TEncodingFormatConversionProvider.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/convert/TFormatConversionProvider.java000066400000000000000000000123731335566474600345150ustar00rootroot00000000000000/* * TFormatConversionProvider.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.convert; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.spi.FormatConversionProvider; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.AudioFormats; /** Base class for all conversion providers of Tritonus. * * @author Matthias Pfisterer */ public abstract class TFormatConversionProvider extends FormatConversionProvider { protected static final AudioFormat.Encoding[] EMPTY_ENCODING_ARRAY = new AudioFormat.Encoding[0]; protected static final AudioFormat[] EMPTY_FORMAT_ARRAY = new AudioFormat[0]; // $$fb2000-10-04: use AudioSystem.NOT_SPECIFIED for all fields. public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream audioInputStream) { AudioFormat sourceFormat = audioInputStream.getFormat(); AudioFormat targetFormat = new AudioFormat( targetEncoding, AudioSystem.NOT_SPECIFIED, // sample rate AudioSystem.NOT_SPECIFIED, // sample size in bits AudioSystem.NOT_SPECIFIED, // channels AudioSystem.NOT_SPECIFIED, // frame size AudioSystem.NOT_SPECIFIED, // frame rate sourceFormat.isBigEndian()); // big endian if (TDebug.TraceAudioConverter) { TDebug.out("TFormatConversionProvider.getAudioInputStream(AudioFormat.Encoding, AudioInputStream):"); TDebug.out("trying to convert to " + targetFormat); } return getAudioInputStream(targetFormat, audioInputStream); } /** * WARNING: this method uses getTargetFormats(AudioFormat.Encoding, AudioFormat) * which may create infinite loops if the latter is overwritten. *

* This method is overwritten here to make use of org.tritonus.share.sampled.AudioFormats.matches * and is considered temporary until AudioFormat.matches is corrected in the JavaSound API. */ /* $$mp: if we decide to use getMatchingFormat(), this method should be implemented by simply calling getMatchingFormat() and comparing the result against null. */ public boolean isConversionSupported( AudioFormat targetFormat, AudioFormat sourceFormat) { if (TDebug.TraceAudioConverter) { TDebug.out(">TFormatConversionProvider.isConversionSupported(AudioFormat, AudioFormat):"); TDebug.out("class: "+getClass().getName()); TDebug.out("checking if conversion possible"); TDebug.out("from: " + sourceFormat); TDebug.out("to: " + targetFormat); } AudioFormat[] aTargetFormats = getTargetFormats(targetFormat.getEncoding(), sourceFormat); for (int i = 0; i < aTargetFormats.length; i++) { if (TDebug.TraceAudioConverter) { TDebug.out("checking against possible target format: " + aTargetFormats[i]); } if (aTargetFormats[i] != null && AudioFormats.matches(aTargetFormats[i], targetFormat)) { if (TDebug.TraceAudioConverter) { TDebug.out("getTargetFormats(AudioFormat.Encoding, AudioFormat) * which may create infinite loops if the latter is overwritten. *

* This method is overwritten here to make use of org.tritonus.share.sampled.AudioFormats.matches * and is considered temporary until AudioFormat.matches is corrected in the JavaSound API. */ public AudioFormat getMatchingFormat( AudioFormat targetFormat, AudioFormat sourceFormat) { if (TDebug.TraceAudioConverter) { TDebug.out(">TFormatConversionProvider.isConversionSupported(AudioFormat, AudioFormat):"); TDebug.out("class: "+getClass().getName()); TDebug.out("checking if conversion possible"); TDebug.out("from: " + sourceFormat); TDebug.out("to: " + targetFormat); } AudioFormat[] aTargetFormats = getTargetFormats(targetFormat.getEncoding(), sourceFormat); for (int i = 0; i < aTargetFormats.length; i++) { if (TDebug.TraceAudioConverter) { TDebug.out("checking against possible target format: " + aTargetFormats[i]); } if (aTargetFormats[i] != null && AudioFormats.matches(aTargetFormats[i], targetFormat)) { if (TDebug.TraceAudioConverter) { TDebug.out(" * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.convert; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.HashMap; import java.util.ArrayList; import java.util.Iterator; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.spi.FormatConversionProvider; import org.tritonus.share.sampled.AudioFormats; import org.tritonus.share.ArraySet; /** * Base class for arbitrary formatConversionProviders. * * @author Matthias Pfisterer */ public abstract class TMatrixFormatConversionProvider extends TSimpleFormatConversionProvider { /* * keys: source AudioFormat * values: collection of possible target encodings * * Note that accessing values with get() is not appropriate, * since the equals() method in AudioFormat is not overloaded. * The hashtable is just used as a convenient storage * organization. */ private Map m_targetEncodingsFromSourceFormat; /* * keys: source AudioFormat * values: a Map that contains a mapping from target encodings * (keys) to a collection of target formats (values). * * Note that accessing values with get() is not appropriate, * since the equals() method in AudioFormat is not overloaded. * The hashtable is just used as a convenient storage * organization. */ private Map m_targetFormatsFromSourceFormat; protected TMatrixFormatConversionProvider( List sourceFormats, List targetFormats, boolean[][] abConversionPossible) { super(sourceFormats, targetFormats); m_targetEncodingsFromSourceFormat = new HashMap(); m_targetFormatsFromSourceFormat = new HashMap(); for (int nSourceFormat = 0; nSourceFormat < sourceFormats.size(); nSourceFormat++) { AudioFormat sourceFormat = (AudioFormat) sourceFormats.get(nSourceFormat); List supportedTargetEncodings = new ArraySet(); m_targetEncodingsFromSourceFormat.put(sourceFormat, supportedTargetEncodings); Map targetFormatsFromTargetEncodings = new HashMap(); m_targetFormatsFromSourceFormat.put(sourceFormat, targetFormatsFromTargetEncodings); for (int nTargetFormat = 0; nTargetFormat < targetFormats.size(); nTargetFormat++) { AudioFormat targetFormat = (AudioFormat) targetFormats.get(nTargetFormat); if (abConversionPossible[nSourceFormat][nTargetFormat]) { AudioFormat.Encoding targetEncoding = targetFormat.getEncoding(); supportedTargetEncodings.add(targetEncoding); Collection supportedTargetFormats = (Collection) targetFormatsFromTargetEncodings.get(targetEncoding); if (supportedTargetFormats == null) { supportedTargetFormats = new ArraySet(); targetFormatsFromTargetEncodings.put(targetEncoding, supportedTargetFormats); } supportedTargetFormats.add(targetFormat); } } } } public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat) { Iterator iterator = m_targetEncodingsFromSourceFormat.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); AudioFormat format = (AudioFormat) entry.getKey(); if (AudioFormats.matches(format, sourceFormat)) { Collection targetEncodings = (Collection) entry.getValue(); return (AudioFormat.Encoding[]) targetEncodings.toArray(EMPTY_ENCODING_ARRAY); } } return EMPTY_ENCODING_ARRAY; } // TODO: this should work on the array returned by getTargetEncodings(AudioFormat) /* public boolean isConversionSupported(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) { return isAllowedSourceFormat(sourceFormat) && isTargetEncodingSupported(targetEncoding); } */ public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) { Iterator iterator = m_targetFormatsFromSourceFormat.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry) iterator.next(); AudioFormat format = (AudioFormat) entry.getKey(); if (AudioFormats.matches(format, sourceFormat)) { Map targetEncodings = (Map) entry.getValue(); Collection targetFormats = (Collection) targetEncodings.get(targetEncoding); if (targetFormats != null) { return (AudioFormat[]) targetFormats.toArray(EMPTY_FORMAT_ARRAY); } else { return EMPTY_FORMAT_ARRAY; } } } return EMPTY_FORMAT_ARRAY; } } /*** TMatrixFormatConversionProvider.java ***/ TSimpleFormatConversionProvider.java000066400000000000000000000251441335566474600356100ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/sampled/convert/* * TSimpleFormatConversionProvider.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.convert; import java.util.Collection; import java.util.Iterator; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import org.tritonus.share.sampled.AudioFormats; import org.tritonus.share.ArraySet; import org.tritonus.share.TDebug; /** * This is a base class for FormatConversionProviders that can convert * from each source encoding/format to each target encoding/format. * If this is not the case, use TEncodingFormatConversionProvider or * TMatrixFormatConversionProvider. * *

Overriding classes must * provide a constructor that calls the protected constructor of this class and override * AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream). * The latter method should be able to handle the case that all fields are NOT_SPECIFIED * and provide appropriate default values. * * @author Matthias Pfisterer */ // todo: // - declare a constant ALL_BUT_SAME_VALUE (==-2) or so that can be used in format lists // - consistent implementation of replacing NOT_SPECIFIED when not given in conversion public abstract class TSimpleFormatConversionProvider extends TFormatConversionProvider { private Collection m_sourceEncodings; private Collection m_targetEncodings; private Collection m_sourceFormats; private Collection m_targetFormats; protected TSimpleFormatConversionProvider( Collection sourceFormats, Collection targetFormats) { m_sourceEncodings = new ArraySet(); m_targetEncodings = new ArraySet(); m_sourceFormats = sourceFormats; m_targetFormats = targetFormats; collectEncodings(m_sourceFormats, m_sourceEncodings); collectEncodings(m_targetFormats, m_targetEncodings); } /** Disables this FormatConversionProvider. This may be useful when e.g. native libraries are not present. TODO: enable method, better implementation */ protected void disable() { if (TDebug.TraceAudioConverter) { TDebug.out("TSimpleFormatConversionProvider.disable(): disabling " + getClass().getName()); } m_sourceEncodings = new ArraySet(); m_targetEncodings = new ArraySet(); m_sourceFormats = new ArraySet(); m_targetFormats = new ArraySet(); } private static void collectEncodings(Collection formats, Collection encodings) { Iterator iterator = formats.iterator(); while (iterator.hasNext()) { AudioFormat format = (AudioFormat) iterator.next(); encodings.add(format.getEncoding()); } } public AudioFormat.Encoding[] getSourceEncodings() { return (AudioFormat.Encoding[]) m_sourceEncodings.toArray(EMPTY_ENCODING_ARRAY); } public AudioFormat.Encoding[] getTargetEncodings() { return (AudioFormat.Encoding[]) m_targetEncodings.toArray(EMPTY_ENCODING_ARRAY); } // overwritten of FormatConversionProvider public boolean isSourceEncodingSupported(AudioFormat.Encoding sourceEncoding) { return m_sourceEncodings.contains(sourceEncoding); } // overwritten of FormatConversionProvider public boolean isTargetEncodingSupported(AudioFormat.Encoding targetEncoding) { return m_targetEncodings.contains(targetEncoding); } /** * This implementation assumes that the converter can convert * from each of its source encodings to each of its target * encodings. If this is not the case, the converter has to * override this method. */ public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat) { if (isAllowedSourceFormat(sourceFormat)) { return getTargetEncodings(); } else { return EMPTY_ENCODING_ARRAY; } } /** * This implementation assumes that the converter can convert * from each of its source formats to each of its target * formats. If this is not the case, the converter has to * override this method. */ public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) { if (isConversionSupported(targetEncoding, sourceFormat)) { return (AudioFormat[]) m_targetFormats.toArray(EMPTY_FORMAT_ARRAY); } else { return EMPTY_FORMAT_ARRAY; } } // TODO: check if necessary protected boolean isAllowedSourceEncoding(AudioFormat.Encoding sourceEncoding) { return m_sourceEncodings.contains(sourceEncoding); } protected boolean isAllowedTargetEncoding(AudioFormat.Encoding targetEncoding) { return m_targetEncodings.contains(targetEncoding); } protected boolean isAllowedSourceFormat(AudioFormat sourceFormat) { Iterator iterator = m_sourceFormats.iterator(); while (iterator.hasNext()) { AudioFormat format = (AudioFormat) iterator.next(); if (AudioFormats.matches(format, sourceFormat)) { return true; } } return false; } protected boolean isAllowedTargetFormat(AudioFormat targetFormat) { Iterator iterator = m_targetFormats.iterator(); while (iterator.hasNext()) { AudioFormat format = (AudioFormat) iterator.next(); if (AudioFormats.matches(format, targetFormat)) { return true; } } return false; } // $$fb 2000-04-02 added some convenience methods for overriding classes protected Collection getCollectionSourceEncodings() { return m_sourceEncodings; } protected Collection getCollectionTargetEncodings() { return m_targetEncodings; } protected Collection getCollectionSourceFormats() { return m_sourceFormats; } protected Collection getCollectionTargetFormats() { return m_targetFormats; } /** * Utility method to check whether these values match, * taking into account AudioSystem.NOT_SPECIFIED. * @return true if any of the values is AudioSystem.NOT_SPECIFIED * or both values have the same value. */ //$$fb 2000-08-16: moved from TEncodingFormatConversionProvider protected static boolean doMatch(int i1, int i2) { return i1==AudioSystem.NOT_SPECIFIED || i2==AudioSystem.NOT_SPECIFIED || i1==i2; } /** * @see #doMatch(int,int) */ //$$fb 2000-08-16: moved from TEncodingFormatConversionProvider protected static boolean doMatch(float f1, float f2) { return f1==AudioSystem.NOT_SPECIFIED || f2==AudioSystem.NOT_SPECIFIED || Math.abs(f1 - f2) < 1.0e-9; } /** * Utility method, replaces all occurences of AudioSystem.NOT_SPECIFIED * in targetFormat with the corresponding value in sourceFormat. * If targetFormat does not contain any fields with AudioSystem.NOT_SPECIFIED, * it is returned unmodified. The endian-ness and encoding remain the same in all cases. *

* If any of the fields is AudioSystem.NOT_SPECIFIED in both sourceFormat and * targetFormat, it will remain not specified. *

* This method uses getFrameSize(...) (see below) to set the new frameSize, * if a new AudioFormat instance is created. *

* This method isn't used in TSimpleFormatConversionProvider - it is solely there * for inheriting classes. */ //$$fb 2000-08-16: moved from TEncodingFormatConversionProvider protected AudioFormat replaceNotSpecified(AudioFormat sourceFormat, AudioFormat targetFormat) { boolean bSetSampleSize=false; boolean bSetChannels=false; boolean bSetSampleRate=false; boolean bSetFrameRate=false; if (targetFormat.getSampleSizeInBits()==AudioSystem.NOT_SPECIFIED && sourceFormat.getSampleSizeInBits()!=AudioSystem.NOT_SPECIFIED) { bSetSampleSize=true; } if (targetFormat.getChannels()==AudioSystem.NOT_SPECIFIED && sourceFormat.getChannels()!=AudioSystem.NOT_SPECIFIED) { bSetChannels=true; } if (targetFormat.getSampleRate()==AudioSystem.NOT_SPECIFIED && sourceFormat.getSampleRate()!=AudioSystem.NOT_SPECIFIED) { bSetSampleRate=true; } if (targetFormat.getFrameRate()==AudioSystem.NOT_SPECIFIED && sourceFormat.getFrameRate()!=AudioSystem.NOT_SPECIFIED) { bSetFrameRate=true; } if (bSetSampleSize || bSetChannels || bSetSampleRate || bSetFrameRate || (targetFormat.getFrameSize()==AudioSystem.NOT_SPECIFIED && sourceFormat.getFrameSize()!=AudioSystem.NOT_SPECIFIED)) { // create new format in place of the original target format float sampleRate=bSetSampleRate? sourceFormat.getSampleRate():targetFormat.getSampleRate(); float frameRate=bSetFrameRate? sourceFormat.getFrameRate():targetFormat.getFrameRate(); int sampleSize=bSetSampleSize? sourceFormat.getSampleSizeInBits():targetFormat.getSampleSizeInBits(); int channels=bSetChannels? sourceFormat.getChannels():targetFormat.getChannels(); int frameSize=getFrameSize( targetFormat.getEncoding(), sampleRate, sampleSize, channels, frameRate, targetFormat.isBigEndian(), targetFormat.getFrameSize()); targetFormat= new AudioFormat( targetFormat.getEncoding(), sampleRate, sampleSize, channels, frameSize, frameRate, targetFormat.isBigEndian()); } return targetFormat; } /** * Calculates the frame size for the given format description. * The default implementation returns AudioSystem.NOT_SPECIFIED * if either sampleSize or channels is AudioSystem.NOT_SPECIFIED, * otherwise sampleSize*channels/8 is returned. *

* If this does not reflect the way to calculate the right frame size, * inheriting classes should overwrite this method if they use * replaceNotSpecified(...). It is not used elsewhere in this class. */ //$$fb 2000-08-16: added protected int getFrameSize( AudioFormat.Encoding encoding, float sampleRate, int sampleSize, int channels, float frameRate, boolean bigEndian, int oldFrameSize) { if (sampleSize==AudioSystem.NOT_SPECIFIED || channels==AudioSystem.NOT_SPECIFIED) { return AudioSystem.NOT_SPECIFIED; } return sampleSize*channels/8; } } /*** TSimpleFormatConversionProvider.java ***/ TSynchronousFilteredAudioInputStream.java000066400000000000000000000173331335566474600366150ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/sampled/convert/* * TSynchronousFilteredAudioInputStream.java */ /* * Copyright (c) 1999,2000 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.convert; import java.io.IOException; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.spi.FormatConversionProvider; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.AudioUtils; /** * Base class for types of audio filter/converter that translate one frame to another frame.
* It provides all the transformation of frame sizes.
* It does NOT handle different sample rates of original stream and this stream ! * * @author Florian Bomers */ public abstract class TSynchronousFilteredAudioInputStream extends TAudioInputStream { private AudioInputStream originalStream; private AudioFormat originalFormat; /** 1 if original format's frame size is NOT_SPECIFIED */ private int originalFrameSize; /** 1 if original format's frame size is NOT_SPECIFIED */ private int newFrameSize; /** * The intermediate buffer used during convert actions * (if not convertInPlace is used). * It remains until this audioStream is closed or destroyed * and grows with the time - it always has the size of the * largest intermediate buffer ever needed. */ protected byte[] buffer=null; /** * For use of the more efficient method convertInPlace. * it will be set to true when (frameSizeFactor==1) */ private boolean m_bConvertInPlace = false; public TSynchronousFilteredAudioInputStream(AudioInputStream audioInputStream, AudioFormat newFormat) { // the super class will do nothing... we override everything super(audioInputStream, newFormat, audioInputStream.getFrameLength()); originalStream=audioInputStream; originalFormat=audioInputStream.getFormat(); originalFrameSize=(originalFormat.getFrameSize()<=0) ? 1 : originalFormat.getFrameSize(); newFrameSize=(getFormat().getFrameSize()<=0) ? 1 : getFormat().getFrameSize(); if (TDebug.TraceAudioConverter) { TDebug.out("TSynchronousFilteredAudioInputStream: original format =" +AudioUtils.format2ShortStr(originalFormat)); TDebug.out("TSynchronousFilteredAudioInputStream: converted format=" +AudioUtils.format2ShortStr(getFormat())); } //$$fb 2000-07-17: convert in place has to be enabled explicitly with "enableConvertInPlace" //if (getFormat().getFrameSize() == originalFormat.getFrameSize()) { // m_bConvertInPlace = true; //} m_bConvertInPlace = false; } protected boolean enableConvertInPlace() { if (newFrameSize >= originalFrameSize) { m_bConvertInPlace = true; } return m_bConvertInPlace; } /** * Override this method to do the actual conversion. * inBuffer starts always at index 0 (it is an internal buffer) * You should always override this. * inFrameCount is the number of frames in inBuffer. These * frames are of the format originalFormat. * @return the resulting number of frames converted and put into * outBuffer. The return value is in the format of this stream. */ protected abstract int convert(byte[] inBuffer, byte[] outBuffer, int outByteOffset, int inFrameCount); /** * Override this method to provide in-place conversion of samples. * To use it, call "enableConvertInPlace()". It will only be used when * input bytes per frame >= output bytes per frame. * This method must always convert frameCount frames, so no return value is necessary. */ protected void convertInPlace(byte[] buffer, int byteOffset, int frameCount) { throw new RuntimeException("Illegal call to convertInPlace"); } public int read() throws IOException { if (newFrameSize != 1) { throw new IOException("frame size must be 1 to read a single byte"); } // very ugly, but efficient. Who uses this method anyway ? // TODO: use an instance variable byte[] temp = new byte[1]; int result = read(temp); if (result == -1) { return -1; } if (result == 0) { // what in this case ??? Let's hope it never occurs. return -1; } return temp[0] & 0xFF; } private void clearBuffer() { buffer = null; } public AudioInputStream getOriginalStream() { return originalStream; } public AudioFormat getOriginalFormat() { return originalFormat; } /** * Read nLength bytes that will be the converted samples * of the original InputStream. * When nLength is not an integral number of frames, * this method may read less than nLength bytes. */ public int read(byte[] abData, int nOffset, int nLength) throws IOException { // number of frames that we have to read from the underlying stream. int nFrameLength = nLength/newFrameSize; // number of bytes that we need to read from underlying stream. int originalBytes = nFrameLength * originalFrameSize; if (TDebug.TraceAudioConverter) { TDebug.out("> TSynchronousFilteredAIS.read(buffer["+abData.length+"], " +nOffset+" ,"+nLength+" bytes ^="+nFrameLength+" frames)"); } int nFramesConverted = 0; // set up buffer to read byte readBuffer[]; int readOffset; if (m_bConvertInPlace) { readBuffer=abData; readOffset=nOffset; } else { // assert that the buffer fits if (buffer == null || buffer.length < originalBytes) { buffer = new byte[originalBytes]; } readBuffer=buffer; readOffset=0; } int nBytesRead = originalStream.read(readBuffer, readOffset, originalBytes); if (nBytesRead == -1) { // end of stream clearBuffer(); return -1; } int nFramesRead = nBytesRead / originalFrameSize; if (TDebug.TraceAudioConverter) { TDebug.out("original.read returned " +nBytesRead+" bytes ^="+nFramesRead+" frames"); } if (m_bConvertInPlace) { convertInPlace(abData, nOffset, nFramesRead); nFramesConverted=nFramesRead; } else { nFramesConverted = convert(buffer, abData, nOffset, nFramesRead); } if (TDebug.TraceAudioConverter) { TDebug.out("< converted "+nFramesConverted+" frames"); } return nFramesConverted*newFrameSize; } public long skip(long nSkip) throws IOException { // only returns integral frames long skipFrames = nSkip / newFrameSize; long originalSkippedBytes = originalStream.skip(skipFrames*originalFrameSize); long skippedFrames = originalSkippedBytes/originalFrameSize; return skippedFrames * newFrameSize; } public int available() throws IOException { int origAvailFrames = originalStream.available()/originalFrameSize; return origAvailFrames*newFrameSize; } public void close() throws IOException { originalStream.close(); clearBuffer(); } public void mark(int readlimit) { int readLimitFrames=readlimit/newFrameSize; originalStream.mark(readLimitFrames*originalFrameSize); } public void reset() throws IOException { originalStream.reset(); } public boolean markSupported() { return originalStream.markSupported(); } private int getFrameSize() { return getFormat().getFrameSize(); } } /*** TSynchronousFilteredAudioInputStream.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/000077500000000000000000000000001335566474600257465ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/AudioOutputStream.java000066400000000000000000000071331335566474600322530ustar00rootroot00000000000000/* * AudioOutputStream.java */ /* * Copyright (c) 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.file; import java.io.IOException; import javax.sound.sampled.AudioFormat; /** Represents a one-time writing of audio data to a destination (file or output stream). * * This interface is the lowest abstraction level of writing audio data. * Implementations of this interface should, when write() is called, never * do buffering and they should never do format conversions. However, * this interface is intended to abstract the file format (how the * headers and data chunks look like) and the way of writing to the * destination object. (implementation note [non-normative]: the last * should be done by using TDataOutputStream implementing classes). * * One reasoning behind this interface was to allow direct, unbuffered * writing of recorded data. * In JS API 0.90, there was no obvious way for this. * Data have had to be recorded to a buffer, then written to a file * from that buffer. * This gave problems with long recordings, where the main * memory of the machine is not big enough to hold all data. There are * two ways so solve this: * * a) Having a special AudioInputStream that fetches its data from a * TargetDataLine. This way, the loop inside the AudioFileWriters reads * directely from the recording line via the special AudioInputStream. * This is the solution Sun adopted for JS 1.0. * * b) The other way is to expose a direct interface to the writing of the * audio file with no loop inside it. This is to enable the application * programmer to write the main loop itself, possibly doing some * additional processing inside it. This is the more flexible way. * The drawback is that it requires a new architecture for writing files. * * This interface is the central part of a proposal for the second * solution. * The idea is now to use the new structure inside the old one to gain * experience with it before proposing to make it a public interface * (public in the sense that it is part of the javax.sound.sampled * package). * * @author Matthias Pfisterer */ public interface AudioOutputStream { /** * Retrieves the AufioFormat of this AudioOutputStream. */ public AudioFormat getFormat(); /** Gives length of the stream. * This value is in bytes. It may be AudioSystem.NOT_SPECIFIED * to express that the length is unknown. */ public long getLength(); /** * Writes a chunk of audio data to the destination (file or output stream). */ // IDEA: use long? public int write(byte[] abData, int nOffset, int nLength) throws IOException; /** Closes the stream. * This does write remaining buffered data to the destination, * backpatch the header, if necessary, and closes the destination. */ public void close() throws IOException; } /*** AudioOutputStream.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/HeaderlessAudioOutputStream.java000066400000000000000000000027751335566474600342620ustar00rootroot00000000000000/* * HeaderlessAudioOutputStream.java */ /* * Copyright (c) 2000 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.file; import java.io.IOException; import javax.sound.sampled.AudioFormat; /** * AudioOutputStream for files without a header; the input is written as it is * * @author Florian Bomers */ // todo: implement directly AudioOutputStream without using TAudioOutputStream public class HeaderlessAudioOutputStream extends TAudioOutputStream { public HeaderlessAudioOutputStream(AudioFormat audioFormat, long lLength, TDataOutputStream dataOutputStream) { super(audioFormat, lLength, dataOutputStream, false); } protected void writeHeader() throws IOException { } } /*** HeaderlessAudioOutputStream.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/TAudioFileFormat.java000066400000000000000000000047341335566474600317570ustar00rootroot00000000000000/* * TAudioFileFormat.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.file; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; /** * This class is just to have a public constructor taking the * number of bytes of the whole file. The public constructor of * AudioFileFormat doesn't take this parameter, the one who takes * it is protected. * * @author Matthias Pfisterer */ public class TAudioFileFormat extends AudioFileFormat { private Map m_properties; private Map m_unmodifiableProperties; /* * Note that the order of the arguments is different from * the one in AudioFileFormat. */ public TAudioFileFormat(Type type, AudioFormat audioFormat, int nLengthInFrames, int nLengthInBytes) { super(type, nLengthInBytes, audioFormat, nLengthInFrames); } public TAudioFileFormat(Type type, AudioFormat audioFormat, int nLengthInFrames, int nLengthInBytes, Map properties) { super(type, nLengthInBytes, audioFormat, nLengthInFrames); initMaps(properties); } private void initMaps(Map properties) { /* Here, we make a shallow copy of the map. It's unclear if this is sufficient (of if a deep copy should be made). */ m_properties = new HashMap(); m_properties.putAll(properties); m_unmodifiableProperties = Collections.unmodifiableMap(m_properties); } public Map properties() { return m_unmodifiableProperties; } protected void setProperty(String key, Object value) { m_properties.put(key, value); } } /*** TAudioFileFormat.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/TAudioFileReader.java000066400000000000000000000344021335566474600317240ustar00rootroot00000000000000/* * TAudioFileReader.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * Copyright (c) 2001 by Florian Bomers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled.file; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.DataInputStream; import java.io.InputStream; import java.io.IOException; import java.io.EOFException; import java.net.URL; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; import javax.sound.sampled.spi.AudioFileReader; import org.tritonus.share.TDebug; /** Base class for audio file readers. This is Tritonus' base class for classes that provide the facility of detecting an audio file type and reading its header. Classes should be derived from this class or one of its subclasses rather than from javax.sound.sampled.spi.AudioFileReader. @author Matthias Pfisterer @author Florian Bomers */ public abstract class TAudioFileReader extends AudioFileReader { private int m_nMarkLimit = -1; private boolean m_bRereading; protected TAudioFileReader(int nMarkLimit) { this(nMarkLimit, false); } protected TAudioFileReader(int nMarkLimit, boolean bRereading) { m_nMarkLimit = nMarkLimit; m_bRereading = bRereading; } private int getMarkLimit() { return m_nMarkLimit; } private boolean isRereading() { return m_bRereading; } /** Get an AudioFileFormat object for a File. This method calls getAudioFileFormat(InputStream, long). Subclasses should not override this method unless there are really severe reasons. Normally, it is sufficient to implement getAudioFileFormat(InputStream, long). @param file the file to read from. @return an AudioFileFormat instance containing information from the header of the file passed in. */ public AudioFileFormat getAudioFileFormat(File file) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioFileFormat(File): begin"); } long lFileLengthInBytes = file.length(); InputStream inputStream = new FileInputStream(file); AudioFileFormat audioFileFormat = null; try { audioFileFormat = getAudioFileFormat(inputStream, lFileLengthInBytes); } finally { inputStream.close(); } if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioFileFormat(File): end"); } return audioFileFormat; } /** Get an AudioFileFormat object for a URL. This method calls getAudioFileFormat(InputStream, long). Subclasses should not override this method unless there are really severe reasons. Normally, it is sufficient to implement getAudioFileFormat(InputStream, long). @param url the URL to read from. @return an AudioFileFormat instance containing information from the header of the URL passed in. */ public AudioFileFormat getAudioFileFormat(URL url) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioFileFormat(URL): begin"); } long lFileLengthInBytes = AudioSystem.NOT_SPECIFIED; InputStream inputStream = url.openStream(); AudioFileFormat audioFileFormat = null; try { audioFileFormat = getAudioFileFormat(inputStream, lFileLengthInBytes); } finally { inputStream.close(); } if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioFileFormat(URL): end"); } return audioFileFormat; } /** Get an AudioFileFormat object for an InputStream. This method calls getAudioFileFormat(InputStream, long). Subclasses should not override this method unless there are really severe reasons. Normally, it is sufficient to implement getAudioFileFormat(InputStream, long). @param inputStream the stream to read from. @return an AudioFileFormat instance containing information from the header of the stream passed in. */ public AudioFileFormat getAudioFileFormat(InputStream inputStream) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioFileFormat(InputStream): begin"); } long lFileLengthInBytes = AudioSystem.NOT_SPECIFIED; inputStream.mark(getMarkLimit()); AudioFileFormat audioFileFormat = null; try { audioFileFormat = getAudioFileFormat(inputStream, lFileLengthInBytes); } finally { /* TODO: required semantics is unclear: should reset() be executed only when there is an exception or should it be done always? */ inputStream.reset(); } if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioFileFormat(InputStream): end"); } return audioFileFormat; } /** Get an AudioFileFormat (internal implementation). Subclasses must implement this method in a way specific to the file format they handle. Note that depending on the implementation of this method, you should or should not override getAudioInputStream(InputStream, long), too (see comment there). @param inputStream The InputStream to read from. @param lFileLengthInBytes The size of the originating file, if known. If it isn't known, AudioSystem.NOT_SPECIFIED should be passed. This value may be used for byteLength in AudioFileFormat, if this value can't be derived from the informmation in the file header. @return an AudioFileFormat instance containing information from the header of the stream passed in as inputStream. */ protected abstract AudioFileFormat getAudioFileFormat( InputStream inputStream, long lFileLengthInBytes) throws UnsupportedAudioFileException, IOException; /** Get an AudioInputStream object for a file. This method calls getAudioInputStream(InputStream, long). Subclasses should not override this method unless there are really severe reasons. Normally, it is sufficient to implement getAudioFileFormat(InputStream, long) and perhaps override getAudioInputStream(InputStream, long). @param file the File object to read from. @return an AudioInputStream instance containing the audio data from this file. */ public AudioInputStream getAudioInputStream(File file) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioInputStream(File): begin"); } long lFileLengthInBytes = file.length(); InputStream inputStream = new FileInputStream(file); AudioInputStream audioInputStream = null; try { audioInputStream = getAudioInputStream(inputStream, lFileLengthInBytes); } catch (UnsupportedAudioFileException e) { inputStream.close(); throw e; } catch (IOException e) { inputStream.close(); throw e; } if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioInputStream(File): end"); } return audioInputStream; } /** Get an AudioInputStream object for a URL. This method calls getAudioInputStream(InputStream, long). Subclasses should not override this method unless there are really severe reasons. Normally, it is sufficient to implement getAudioFileFormat(InputStream, long) and perhaps override getAudioInputStream(InputStream, long). @param url the URL to read from. @return an AudioInputStream instance containing the audio data from this URL. */ public AudioInputStream getAudioInputStream(URL url) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioInputStream(URL): begin"); } long lFileLengthInBytes = AudioSystem.NOT_SPECIFIED; InputStream inputStream = url.openStream(); AudioInputStream audioInputStream = null; try { audioInputStream = getAudioInputStream(inputStream, lFileLengthInBytes); } catch (UnsupportedAudioFileException e) { inputStream.close(); throw e; } catch (IOException e) { inputStream.close(); throw e; } if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioInputStream(URL): end"); } return audioInputStream; } /** Get an AudioInputStream object for an InputStream. This method calls getAudioInputStream(InputStream, long). Subclasses should not override this method unless there are really severe reasons. Normally, it is sufficient to implement getAudioFileFormat(InputStream, long) and perhaps override getAudioInputStream(InputStream, long). @param inputStream the stream to read from. @return an AudioInputStream instance containing the audio data from this stream. */ public AudioInputStream getAudioInputStream(InputStream inputStream) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioInputStream(InputStream): begin"); } long lFileLengthInBytes = AudioSystem.NOT_SPECIFIED; AudioInputStream audioInputStream = null; inputStream.mark(getMarkLimit()); try { audioInputStream = getAudioInputStream(inputStream, lFileLengthInBytes); } catch (UnsupportedAudioFileException e) { inputStream.reset(); throw e; } catch (IOException e) { inputStream.reset(); throw e; } if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioInputStream(InputStream): end"); } return audioInputStream; } /** Get an AudioInputStream (internal implementation). This implementation calls getAudioFileFormat() with the same arguments as passed in here. Then, it constructs an AudioInputStream instance. This instance takes the passed inputStream in the state it is left after getAudioFileFormat() did its work. In other words, the implementation here assumes that getAudioFileFormat() reads the entire header up to a position exactely where the audio data starts. If this can't be realized for a certain format, this method should be overridden. @param inputStream The InputStream to read from. @param lFileLengthInBytes The size of the originating file, if known. If it isn't known, AudioSystem.NOT_SPECIFIED should be passed. This value may be used for byteLength in AudioFileFormat, if this value can't be derived from the informmation in the file header. */ protected AudioInputStream getAudioInputStream(InputStream inputStream, long lFileLengthInBytes) throws UnsupportedAudioFileException, IOException { if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioInputStream(InputStream, long): begin"); } if (isRereading()) { inputStream = new BufferedInputStream(inputStream, getMarkLimit()); inputStream.mark(getMarkLimit()); } AudioFileFormat audioFileFormat = getAudioFileFormat(inputStream, lFileLengthInBytes); if (isRereading()) { inputStream.reset(); } AudioInputStream audioInputStream = new AudioInputStream(inputStream, audioFileFormat.getFormat(), audioFileFormat.getFrameLength()); if (TDebug.TraceAudioFileReader) {TDebug.out("TAudioFileReader.getAudioInputStream(InputStream, long): end"); } return audioInputStream; } protected static int calculateFrameSize(int nSampleSize, int nNumChannels) { return ((nSampleSize + 7) / 8) * nNumChannels; } public static int readLittleEndianInt(InputStream is) throws IOException { int b0 = is.read(); int b1 = is.read(); int b2 = is.read(); int b3 = is.read(); if ((b0 | b1 | b2 | b3) < 0) { throw new EOFException(); } return (b3 << 24) + (b2 << 16) + (b1 << 8) + (b0 << 0); } public static short readLittleEndianShort(InputStream is) throws IOException { int b0 = is.read(); int b1 = is.read(); if ((b0 | b1) < 0) { throw new EOFException(); } return (short) ((b1 << 8) + (b0 << 0)); } /* * C O N V E R T F R O M I E E E E X T E N D E D */ /* * Copyright (C) 1988-1991 Apple Computer, Inc. * All rights reserved. * * Machine-independent I/O routines for IEEE floating-point numbers. * * NaN's and infinities are converted to HUGE_VAL or HUGE, which * happens to be infinity on IEEE machines. Unfortunately, it is * impossible to preserve NaN's in a machine-independent way. * Infinities are, however, preserved on IEEE machines. * * These routines have been tested on the following machines: * Apple Macintosh, MPW 3.1 C compiler * Apple Macintosh, THINK C compiler * Silicon Graphics IRIS, MIPS compiler * Cray X/MP and Y/MP * Digital Equipment VAX * * * Implemented by Malcolm Slaney and Ken Turkowski. * * Malcolm Slaney contributions during 1988-1990 include big- and little- * endian file I/O, conversion to and from Motorola's extended 80-bit * floating-point format, and conversions to and from IEEE single- * precision floating-point format. * * In 1991, Ken Turkowski implemented the conversions to and from * IEEE double-precision format, added more precision to the extended * conversions, and accommodated conversions involving +/- infinity, * NaN's, and denormalized numbers. */ public static double readIeeeExtended(DataInputStream dis) throws IOException { double f = 0.0D; int expon = 0; long hiMant = 0L; long loMant = 0L; double HUGE = 3.4028234663852886E+038D; expon = dis.readUnsignedShort(); long t1 = dis.readUnsignedShort(); long t2 = dis.readUnsignedShort(); hiMant = t1 << 16 | t2; t1 = dis.readUnsignedShort(); t2 = dis.readUnsignedShort(); loMant = t1 << 16 | t2; if(expon == 0 && hiMant == 0L && loMant == 0L) { f = 0.0D; } else { if(expon == 32767) { f = HUGE; } else { expon -= 16383; expon -= 31; f = hiMant * Math.pow(2D, expon); expon -= 32; f += loMant * Math.pow(2D, expon); } } return f; } } /*** TAudioFileReader.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/TAudioFileWriter.java000066400000000000000000000404311335566474600317750ustar00rootroot00000000000000/* * TAudioFileWriter.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * Copyright (c) 1999, 2000 by Florian Bomers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.file; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Collection; import java.util.Iterator; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.spi.AudioFileWriter; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.AudioFormats; import org.tritonus.share.sampled.AudioUtils; import org.tritonus.share.sampled.TConversionTool; import org.tritonus.share.sampled.Encodings; import org.tritonus.share.ArraySet; /** * Common base class for implementing classes of AudioFileWriter. *

It provides often-used functionality and the new architecture using * an AudioOutputStream. *

There should be only one set of audio formats supported by any given * class of TAudioFileWriter. This class assumes implicitely that all * supported file types have a common set of audio formats they can handle. * * @author Matthias Pfisterer * @author Florian Bomers */ public abstract class TAudioFileWriter extends AudioFileWriter { protected static final int ALL = AudioSystem.NOT_SPECIFIED; public static AudioFormat.Encoding PCM_SIGNED=Encodings.getEncoding("PCM_SIGNED"); public static AudioFormat.Encoding PCM_UNSIGNED=Encodings.getEncoding("PCM_UNSIGNED"); /** Buffer length for the loop in the write() method. * This is in bytes. Perhaps it should be in frames to give an * equal amount of latency. */ private static final int BUFFER_LENGTH = 16384; // only needed for Collection.toArray() protected static final AudioFileFormat.Type[] NULL_TYPE_ARRAY = new AudioFileFormat.Type[0]; /** The audio file types (AudioFileFormat.Type) that can be * handled by the AudioFileWriter. */ private Collection m_audioFileTypes; /** The AudioFormats that can be handled by the * AudioFileWriter. */ // IDEA: implement a special collection that uses matches() to test whether an element is already in private Collection m_audioFormats; /** * Inheriting classes should call this constructor * in order to make use of the functionality of TAudioFileWriter. */ protected TAudioFileWriter(Collection fileTypes, Collection audioFormats) { if (TDebug.TraceAudioFileWriter) { TDebug.out("TAudioFileWriter.(): begin"); } m_audioFileTypes = fileTypes; m_audioFormats = audioFormats; if (TDebug.TraceAudioFileWriter) { TDebug.out("TAudioFileWriter.(): end"); } } // implementing the interface public AudioFileFormat.Type[] getAudioFileTypes() { return (AudioFileFormat.Type[]) m_audioFileTypes.toArray(NULL_TYPE_ARRAY); } // implementing the interface public boolean isFileTypeSupported(AudioFileFormat.Type fileType) { return m_audioFileTypes.contains(fileType); } // implementing the interface public AudioFileFormat.Type[] getAudioFileTypes( AudioInputStream audioInputStream) { //$$fb 2000-08-16: rewrote this method. We need to check for *each* // file type, whether the format is supported ! AudioFormat format = audioInputStream.getFormat(); ArraySet res=new ArraySet(); Iterator it=m_audioFileTypes.iterator(); while (it.hasNext()) { AudioFileFormat.Type thisType=(AudioFileFormat.Type) it.next(); if (isAudioFormatSupportedImpl(format, thisType)) { res.add(thisType); } } return (AudioFileFormat.Type[]) res.toArray(NULL_TYPE_ARRAY); } // implementing the interface public boolean isFileTypeSupported(AudioFileFormat.Type fileType, AudioInputStream audioInputStream) { // $$fb 2000-08-16: finally this method works reliably ! return isFileTypeSupported(fileType) && (isAudioFormatSupportedImpl(audioInputStream.getFormat(), fileType) || findConvertableFormat(audioInputStream.getFormat(), fileType)!=null); // we may soft it up by including the possibility of endian/sign // changing for PCM formats. // I prefer to return false if the format is not exactly supported // but still exectute the write, if only sign/endian changing is necessary. } // implementing the interface public int write(AudioInputStream audioInputStream, AudioFileFormat.Type fileType, File file) throws IOException { if (TDebug.TraceAudioFileWriter) { TDebug.out(">TAudioFileWriter.write(.., File): called"); TDebug.out("class: "+getClass().getName()); } //$$fb added this check if (!isFileTypeSupported(fileType)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("< file type is not supported"); } throw new IllegalArgumentException("file type is not supported."); } AudioFormat inputFormat = audioInputStream.getFormat(); if (TDebug.TraceAudioFileWriter) { TDebug.out("input format: " + inputFormat); } AudioFormat outputFormat = null; boolean bNeedsConversion = false; if (isAudioFormatSupportedImpl(inputFormat, fileType)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("input format is supported directely"); } outputFormat = inputFormat; bNeedsConversion = false; } else { if (TDebug.TraceAudioFileWriter) { TDebug.out("input format is not supported directely; trying to find a convertable format"); } outputFormat = findConvertableFormat(inputFormat, fileType); if (outputFormat != null) { bNeedsConversion = true; // $$fb 2000-08-16 made consistent with new conversion trials // if 8 bit and only endianness changed, don't convert ! if (outputFormat.getSampleSizeInBits()==8 && outputFormat.getEncoding().equals(inputFormat.getEncoding())) { bNeedsConversion = false; } } else { if (TDebug.TraceAudioFileWriter) { TDebug.out("< input format is not supported and not convertable."); } throw new IllegalArgumentException("format not supported and not convertable"); } } long lLengthInBytes = AudioUtils.getLengthInBytes(audioInputStream); TDataOutputStream dataOutputStream = new TSeekableDataOutputStream(file); AudioOutputStream audioOutputStream = getAudioOutputStream( outputFormat, lLengthInBytes, fileType, dataOutputStream); int written=writeImpl(audioInputStream, audioOutputStream, bNeedsConversion); if (TDebug.TraceAudioFileWriter) { TDebug.out("< wrote "+written+" bytes."); } return written; } // implementing the interface public int write(AudioInputStream audioInputStream, AudioFileFormat.Type fileType, OutputStream outputStream) throws IOException { //$$fb added this check if (!isFileTypeSupported(fileType)) { throw new IllegalArgumentException("file type is not supported."); } if (TDebug.TraceAudioFileWriter) { TDebug.out(">TAudioFileWriter.write(.., OutputStream): called"); TDebug.out("class: "+getClass().getName()); } AudioFormat inputFormat = audioInputStream.getFormat(); if (TDebug.TraceAudioFileWriter) { TDebug.out("input format: " + inputFormat); } AudioFormat outputFormat = null; boolean bNeedsConversion = false; if (isAudioFormatSupportedImpl(inputFormat, fileType)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("input format is supported directely"); } outputFormat = inputFormat; bNeedsConversion = false; } else { if (TDebug.TraceAudioFileWriter) { TDebug.out("input format is not supported directely; trying to find a convertable format"); } outputFormat = findConvertableFormat(inputFormat, fileType); if (outputFormat != null) { bNeedsConversion = true; // $$fb 2000-08-16 made consistent with new conversion trials // if 8 bit and only endianness changed, don't convert ! if (outputFormat.getSampleSizeInBits()==8 && outputFormat.getEncoding().equals(inputFormat.getEncoding())) { bNeedsConversion = false; } } else { if (TDebug.TraceAudioFileWriter) { TDebug.out("< format is not supported"); } throw new IllegalArgumentException("format not supported and not convertable"); } } long lLengthInBytes = AudioUtils.getLengthInBytes(audioInputStream); TDataOutputStream dataOutputStream = new TNonSeekableDataOutputStream(outputStream); AudioOutputStream audioOutputStream = getAudioOutputStream( outputFormat, lLengthInBytes, fileType, dataOutputStream); int written=writeImpl(audioInputStream, audioOutputStream, bNeedsConversion); if (TDebug.TraceAudioFileWriter) { TDebug.out("< wrote "+written+" bytes."); } return written; } protected int writeImpl( AudioInputStream audioInputStream, AudioOutputStream audioOutputStream, boolean bNeedsConversion) throws IOException { if (TDebug.TraceAudioFileWriter) { TDebug.out(">TAudioFileWriter.writeImpl(): called"); TDebug.out("class: "+getClass().getName()); } int nTotalWritten = 0; AudioFormat inputFormat = audioInputStream.getFormat(); AudioFormat outputFormat = audioOutputStream.getFormat(); // TODO: handle case when frame size is unknown ? int nBytesPerSample = outputFormat.getFrameSize() / outputFormat.getChannels(); //$$fb 2000-07-18: BUFFER_LENGTH must be a multiple of frame size... int nBufferSize=((int)BUFFER_LENGTH/outputFormat.getFrameSize())*outputFormat.getFrameSize(); byte[] abBuffer = new byte[nBufferSize]; while (true) { if (TDebug.TraceAudioFileWriter) { TDebug.out("trying to read (bytes): " + abBuffer.length); } int nBytesRead = audioInputStream.read(abBuffer); if (TDebug.TraceAudioFileWriter) { TDebug.out("read (bytes): " + nBytesRead); } if (nBytesRead == -1) { break; } if (bNeedsConversion) { TConversionTool.changeOrderOrSign(abBuffer, 0, nBytesRead, nBytesPerSample); } int nWritten = audioOutputStream.write(abBuffer, 0, nBytesRead); nTotalWritten += nWritten; } if (TDebug.TraceAudioFileWriter) { TDebug.out("AudioFormat can be handled. * In this simple implementation, it is only checked if the * passed AudioFormat matches one of the generally handled * formats (i.e. the fileType argument is ignored). If the * handled AudioFormats depend on the file type, this method * or getSupportedAudioFormats() (on which this method relies) * has to be overwritten by subclasses. *

* This is the central method for checking if a FORMAT is supported. * Inheriting classes can overwrite this for performance * or to exclude/include special type/format combinations. *

* This method is only called when the fileType * is in the list of supported file types ! Overriding * classes need not check this. */ //$$fb 2000-08-16 changed name, changed documentation. Semantics ! protected boolean isAudioFormatSupportedImpl( AudioFormat audioFormat, AudioFileFormat.Type fileType) { if (TDebug.TraceAudioFileWriter) { TDebug.out("> TAudioFileWriter.isAudioFormatSupportedImpl(): format to test: " + audioFormat); TDebug.out("class: "+getClass().getName()); } Iterator audioFormats = getSupportedAudioFormats(fileType); while (audioFormats.hasNext()) { AudioFormat handledFormat = (AudioFormat) audioFormats.next(); if (TDebug.TraceAudioFileWriter) { TDebug.out("matching against format : " + handledFormat); } if (AudioFormats.matches(handledFormat, audioFormat)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("<...succeeded."); } return true; } } if (TDebug.TraceAudioFileWriter) { TDebug.out("< ... failed"); } return false; } protected abstract AudioOutputStream getAudioOutputStream( AudioFormat audioFormat, long lLengthInBytes, AudioFileFormat.Type fileType, TDataOutputStream dataOutputStream) throws IOException; private AudioFormat findConvertableFormat( AudioFormat inputFormat, AudioFileFormat.Type fileType) { if (TDebug.TraceAudioFileWriter) { TDebug.out("TAudioFileWriter.findConvertableFormat(): input format: " + inputFormat); } if (!isFileTypeSupported(fileType)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("< input file type is not supported."); } return null; } AudioFormat.Encoding inputEncoding = inputFormat.getEncoding(); if ((inputEncoding.equals(PCM_SIGNED) || inputEncoding.equals(PCM_UNSIGNED)) && inputFormat.getSampleSizeInBits() == 8) { AudioFormat outputFormat = convertFormat(inputFormat, true, false); if (TDebug.TraceAudioFileWriter) { TDebug.out("trying output format: " + outputFormat); } if (isAudioFormatSupportedImpl(outputFormat, fileType)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("< ... succeeded"); } return outputFormat; } //$$fb 2000-08-16: added trial of other endianness for 8bit. We try harder ! outputFormat = convertFormat(inputFormat, false, true); if (TDebug.TraceAudioFileWriter) { TDebug.out("trying output format: " + outputFormat); } if (isAudioFormatSupportedImpl(outputFormat, fileType)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("< ... succeeded"); } return outputFormat; } outputFormat = convertFormat(inputFormat, true, true); if (TDebug.TraceAudioFileWriter) { TDebug.out("trying output format: " + outputFormat); } if (isAudioFormatSupportedImpl(outputFormat, fileType)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("< ... succeeded"); } return outputFormat; } if (TDebug.TraceAudioFileWriter) { TDebug.out("< ... failed"); } return null; } else if (inputEncoding.equals(PCM_SIGNED) && (inputFormat.getSampleSizeInBits() == 16 || inputFormat.getSampleSizeInBits() == 24 || inputFormat.getSampleSizeInBits() == 32) ) { // TODO: possible to allow all sample sized > 8 bit? // $$ fb: don't think that this is necessary. Well, let's talk about that in 5 years :) AudioFormat outputFormat = convertFormat(inputFormat, false, true); if (TDebug.TraceAudioFileWriter) { TDebug.out("trying output format: " + outputFormat); } if (isAudioFormatSupportedImpl(outputFormat, fileType)) { if (TDebug.TraceAudioFileWriter) { TDebug.out("< ... succeeded"); } return outputFormat; } else { if (TDebug.TraceAudioFileWriter) { TDebug.out("< ... failed"); } return null; } } else { if (TDebug.TraceAudioFileWriter) { TDebug.out("< ... failed"); } return null; } } // $$fb 2000-08-16: added convenience method private AudioFormat convertFormat(AudioFormat format, boolean changeSign, boolean changeEndian) { AudioFormat.Encoding enc=PCM_SIGNED; if (format.getEncoding().equals(PCM_UNSIGNED)!=changeSign) { enc=PCM_UNSIGNED; } return new AudioFormat( enc, format.getSampleRate(), format.getSampleSizeInBits(), format.getChannels(), format.getFrameSize(), format.getFrameRate(), format.isBigEndian() ^ changeEndian); } } /*** TAudioFileWriter.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/TAudioOutputStream.java000066400000000000000000000106171335566474600324000ustar00rootroot00000000000000/* * TAudioOutputStream.java */ /* * Copyright (c) 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.file; import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import org.tritonus.share.TDebug; /** * Base class for classes implementing AudioOutputStream. * * @author Matthias Pfisterer */ public abstract class TAudioOutputStream implements AudioOutputStream { private AudioFormat m_audioFormat; private long m_lLength; // in bytes private long m_lCalculatedLength; private TDataOutputStream m_dataOutputStream; private boolean m_bDoBackPatching; private boolean m_bHeaderWritten; protected TAudioOutputStream(AudioFormat audioFormat, long lLength, TDataOutputStream dataOutputStream, boolean bDoBackPatching) { m_audioFormat = audioFormat; m_lLength = lLength; m_lCalculatedLength = 0; m_dataOutputStream = dataOutputStream; m_bDoBackPatching = bDoBackPatching; m_bHeaderWritten = false; } public AudioFormat getFormat() { return m_audioFormat; } /** Gives length of the stream. * This value is in bytes. It may be AudioSystem.NOT_SPECIFIED * to express that the length is unknown. */ public long getLength() { return m_lLength; } /** Gives number of bytes already written. */ // IDEA: rename this to BytesWritten or something like that ? public long getCalculatedLength() { return m_lCalculatedLength; } protected TDataOutputStream getDataOutputStream() { return m_dataOutputStream; } /** Writes audio data to the destination (file or output stream). */ // IDEA: use long? public int write(byte[] abData, int nOffset, int nLength) throws IOException { if (TDebug.TraceAudioOutputStream) { TDebug.out("TAudioOutputStream.write(): wanted length: " + nLength); } if (! m_bHeaderWritten) { writeHeader(); m_bHeaderWritten = true; } // $$fb added // check that total writes do not exceed specified length long lTotalLength=getLength(); if (lTotalLength!=AudioSystem.NOT_SPECIFIED && (m_lCalculatedLength+nLength)>lTotalLength) { if (TDebug.TraceAudioOutputStream) { TDebug.out("TAudioOutputStream.write(): requested more bytes to write than possible."); } nLength=(int) (lTotalLength-m_lCalculatedLength); // sanity if (nLength<0) { nLength=0; } } // TODO: throw an exception if nLength==0 ? (to indicate end of file ?) if (nLength>0) { m_dataOutputStream.write(abData, nOffset, nLength); m_lCalculatedLength += nLength; } if (TDebug.TraceAudioOutputStream) { TDebug.out("TAudioOutputStream.write(): calculated (total) length: " + m_lCalculatedLength+" bytes = "+(m_lCalculatedLength/getFormat().getFrameSize())+" frames"); } return nLength; } /** Writes the header of the audio file. */ protected abstract void writeHeader() throws IOException; /** Closes the stream. * This does write remaining buffered data to the destination, * backpatch the header, if necessary, and closes the destination. */ public void close() throws IOException { if (TDebug.TraceAudioOutputStream) { TDebug.out("TAudioOutputStream.close(): called"); } // flush? if (m_bDoBackPatching) { if (TDebug.TraceAudioOutputStream) { TDebug.out("TAudioOutputStream.close(): patching header"); } patchHeader(); } m_dataOutputStream.close(); } protected void patchHeader() throws IOException { TDebug.out("TAudioOutputStream.patchHeader(): called"); // DO NOTHING } protected void setLengthFromCalculatedLength() { m_lLength = m_lCalculatedLength; } } /*** TAudioOutputStream.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/TDataOutputStream.java000066400000000000000000000031251335566474600322040ustar00rootroot00000000000000/* * TDataOutputStream.java */ /* * Copyright (c) 1999 by Florian Bomers * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.file; import java.io.DataOutput; import java.io.IOException; import java.io.InputStream; /** * Interface for the file writing classes. *

Like that it is possible to write to a file without knowing * the length before. * * @author Florian Bomers */ public interface TDataOutputStream extends DataOutput { public boolean supportsSeek(); public void seek(long position) throws IOException; public long getFilePointer() throws IOException; public long length() throws IOException; public void writeLittleEndian32(int value) throws IOException; public void writeLittleEndian16(short value) throws IOException; public void close() throws IOException; } /*** TDataOutputStream.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/THeaderlessAudioFileWriter.java000066400000000000000000000047031335566474600337770ustar00rootroot00000000000000/* * THeaderlessAudioFileWriter.java */ /* * Copyright (c) 2000 by Florian Bomers * Copyright (c) 2000 - 2002 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled.file; import java.io.IOException; import java.util.Collection; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import org.tritonus.share.TDebug; /** Base class for formats without extra header. This AudioFileWriter is typically used for compressed formats where the encoder puts a header into the encoded stream. In this case, the AudioFileWriter needs not to add a header. This is why THeaderlessAudioOutputStream is used here. @author Florian Bomers @author Matthias Pfisterer */ public class THeaderlessAudioFileWriter extends TAudioFileWriter { protected THeaderlessAudioFileWriter(Collection fileTypes, Collection audioFormats) { super(fileTypes, audioFormats); if (TDebug.TraceAudioFileWriter) { TDebug.out("THeaderlessAudioFileWriter.(): begin"); } if (TDebug.TraceAudioFileWriter) { TDebug.out("THeaderlessAudioFileWriter.(): end"); } } protected AudioOutputStream getAudioOutputStream( AudioFormat audioFormat, long lLengthInBytes, AudioFileFormat.Type fileType, TDataOutputStream dataOutputStream) throws IOException { if (TDebug.TraceAudioFileWriter) { TDebug.out("THeaderlessAudioFileWriter.getAudioOutputStream(): begin"); } AudioOutputStream aos = new HeaderlessAudioOutputStream( audioFormat, lLengthInBytes, dataOutputStream); if (TDebug.TraceAudioFileWriter) { TDebug.out("THeaderlessAudioFileWriter.getAudioOutputStream(): end"); } return aos; } } /*** THeaderlessAudioFileWriter.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/TNonSeekableDataOutputStream.java000066400000000000000000000044251335566474600343170ustar00rootroot00000000000000/* * TNonSeekableDataOutputStream.java */ /* * Copyright (c) 1999 by Florian Bomers * Copyright (c) 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.file; import java.io.IOException; import java.io.OutputStream; import java.io.DataOutputStream; /** * A TDataOutputStream that does not allow seeking. * * @author Florian Bomers * @author Matthias Pfisterer */ public class TNonSeekableDataOutputStream extends DataOutputStream implements TDataOutputStream { public TNonSeekableDataOutputStream(OutputStream outputStream) { super(outputStream); } public boolean supportsSeek() { return false; } public void seek(long position) throws IOException { throw new IllegalArgumentException("TNonSeekableDataOutputStream: Call to seek not allowed."); } public long getFilePointer() throws IOException { throw new IllegalArgumentException("TNonSeekableDataOutputStream: Call to getFilePointer not allowed."); } public long length() throws IOException { throw new IllegalArgumentException("TNonSeekableDataOutputStream: Call to length not allowed."); } public void writeLittleEndian32(int value) throws IOException { writeByte(value & 0xFF); writeByte((value >> 8) & 0xFF); writeByte((value >> 16) & 0xFF); writeByte((value >> 24) & 0xFF); } public void writeLittleEndian16(short value) throws IOException { writeByte(value & 0xFF); writeByte((value >> 8) & 0xFF); } } /*** TNonSeekableDataOutputStream.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/file/TSeekableDataOutputStream.java000066400000000000000000000034351335566474600336440ustar00rootroot00000000000000/* * TSeekableDataOutputStream.java */ /* * Copyright (c) 1999 by Florian Bomers * Copyright (c) 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.file; import java.io.File; import java.io.RandomAccessFile; import java.io.IOException; /** * A TDataOutputStream that allows seeking. * * @author Florian Bomers * @author Matthias Pfisterer */ public class TSeekableDataOutputStream extends RandomAccessFile implements TDataOutputStream { public TSeekableDataOutputStream(File file) throws IOException { super(file, "rw"); } public boolean supportsSeek() { return true; } public void writeLittleEndian32(int value) throws IOException { writeByte(value & 0xFF); writeByte((value >> 8) & 0xFF); writeByte((value >> 16) & 0xFF); writeByte((value >> 24) & 0xFF); } public void writeLittleEndian16(short value) throws IOException { writeByte(value & 0xFF); writeByte((value >> 8) & 0xFF); } } /*** TSeekableDataOutputStream.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/000077500000000000000000000000001335566474600261535ustar00rootroot00000000000000extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TBaseDataLine.java000066400000000000000000000044511335566474600314220ustar00rootroot00000000000000/* * TBaseDataLine.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled.mixer; import java.util.Collection; import java.util.EventListener; import java.util.EventObject; import java.util.HashSet; import java.util.Set; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineEvent; import javax.sound.sampled.Line; import javax.sound.sampled.LineUnavailableException; import org.tritonus.share.TDebug; /** Base class for implementing SourceDataLine or TargetDataLine. */ public abstract class TBaseDataLine extends TDataLine { public TBaseDataLine(TMixer mixer, DataLine.Info info) { super(mixer, info); } public TBaseDataLine(TMixer mixer, DataLine.Info info, Collection controls) { super(mixer, info, controls); } public void open(AudioFormat format, int nBufferSize) throws LineUnavailableException { if (TDebug.TraceDataLine) { TDebug.out("TBaseDataLine.open(AudioFormat, int): called with buffer size: " + nBufferSize); } setBufferSize(nBufferSize); open(format); } public void open(AudioFormat format) throws LineUnavailableException { if (TDebug.TraceDataLine) { TDebug.out("TBaseDataLine.open(AudioFormat): called"); } setFormat(format); open(); } // IDEA: move to TDataLine or TLine? // necessary and wise at all? protected void finalize() { if (isOpen()) { close(); } } } /*** TBaseDataLine.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TBooleanControl.java000066400000000000000000000053311335566474600320640ustar00rootroot00000000000000/* * TBooleanControl.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 2001 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import javax.sound.sampled.BooleanControl; import org.tritonus.share.TDebug; /** Base class for classes implementing Line. */ public class TBooleanControl extends BooleanControl implements TControllable { private TControlController m_controller; public TBooleanControl(BooleanControl.Type type, boolean bInitialValue) { this(type, bInitialValue, null); } public TBooleanControl(BooleanControl.Type type, boolean bInitialValue, TCompoundControl parentControl) { super(type, bInitialValue); if (TDebug.TraceControl) { TDebug.out("TBooleanControl.: begin"); } m_controller = new TControlController(); if (TDebug.TraceControl) { TDebug.out("TBooleanControl.: end"); } } public TBooleanControl(BooleanControl.Type type, boolean bInitialValue, String strTrueStateLabel, String strFalseStateLabel) { this(type, bInitialValue, strTrueStateLabel, strFalseStateLabel, null); } public TBooleanControl(BooleanControl.Type type, boolean bInitialValue, String strTrueStateLabel, String strFalseStateLabel, TCompoundControl parentControl) { super(type, bInitialValue, strTrueStateLabel, strFalseStateLabel); if (TDebug.TraceControl) { TDebug.out("TBooleanControl.: begin"); } m_controller = new TControlController(); if (TDebug.TraceControl) { TDebug.out("TBooleanControl.: end"); } } public void setParentControl(TCompoundControl compoundControl) { m_controller.setParentControl(compoundControl); } public TCompoundControl getParentControl() { return m_controller.getParentControl(); } public void commit() { m_controller.commit(); } } /*** TBooleanControl.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TClip.java000066400000000000000000000143051335566474600300340ustar00rootroot00000000000000/* * TClip.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import java.io.IOException; import java.io.ByteArrayInputStream; import java.util.Collection; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Mixer; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.mixer.TDataLine; public class TClip extends TDataLine implements Clip { private static final Class[] CONTROL_CLASSES = {/*GainControl.class*/}; private static final int BUFFER_FRAMES = 16384; // private Mixer m_mixer; // private SourceDataLine m_line; public TClip(DataLine.Info info) { super(null, // TMixer info); } public TClip(DataLine.Info info, Collection controls) { super(null, // TMixer info, controls); } public void open(AudioFormat audioFormat, byte[] abData, int nOffset, int nLength) throws LineUnavailableException { // int nBufferLength = nNumFrames * audioFormat.getFrameSize(); // TODO: check if nOffset + nBufferLength <= abData.length // perhaps truncate automatically ByteArrayInputStream bais = new ByteArrayInputStream(abData, nOffset, nLength); AudioInputStream audioInputStream = new AudioInputStream(bais, audioFormat, AudioSystem.NOT_SPECIFIED); try { open(audioInputStream); } catch (IOException e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } throw new LineUnavailableException("IOException occured"); } } public void open(AudioInputStream audioInputStream) throws LineUnavailableException, IOException { AudioFormat audioFormat = audioInputStream.getFormat(); // TOOD: DataLine.Info info = new DataLine.Info(Clip.class, audioFormat, -1/*nBufferSize*/); /* setLineInfo(info); int nFrameSize = audioFormat.getFrameSize(); long lTotalLength = audioInputStream.getFrameLength() * nFrameSize; int nFormat = Esd.ESD_STREAM | Esd.ESD_PLAY | EsdUtils.getEsdFormat(audioFormat); if (TDebug.TraceClip) { TDebug.out("format: " + nFormat); TDebug.out("sample rate: " + audioFormat.getSampleRate()); } // m_esdSample.open(nFormat, (int) audioFormat.getSampleRate(), (int) lTotalLength); if (TDebug.TraceClip) { TDebug.out("size in esd: " + audioInputStream.getFrameLength() * nFrameSize); } int nBufferLength = BUFFER_FRAMES * nFrameSize; byte[] abData = new byte[nBufferLength]; int nBytesRead = 0; int nTotalBytes = 0; while (nBytesRead != -1) { try { nBytesRead = audioInputStream.read(abData, 0, abData.length); } catch (IOException e) { if (TDebug.TraceClip || TDebug.TraceAllExceptions) { TDebug.out(e); } } if (nBytesRead >= 0) { nTotalBytes += nBytesRead; if (TDebug.TraceClip) { TDebug.out("TClip.open(): total bytes: " + nTotalBytes); TDebug.out("TClip.open(): Trying to write: " + nBytesRead); } int nBytesWritten = 0; //m_esdSample.write(abData, 0, nBytesRead); if (TDebug.TraceClip) { TDebug.out("TClip.open(): Written: " + nBytesWritten); } } } // to trigger the events // open(); */ } public int getFrameLength() { // TODO: return -1; } public long getMicrosecondLength() { // TODO: return -1; } public void setFramePosition(int nPosition) { // TOOD: } public void setMicrosecondPosition(long lPosition) { // TOOD: } public int getFramePosition() { // TOOD: return -1; } public long getMicrosecondPosition() { // TOOD: return -1; } public void setLoopPoints(int nStart, int nEnd) { // TOOD: } public void loop(int nCount) { if (TDebug.TraceClip) { TDebug.out("TClip.loop(int): called; count = " + nCount); } if (false/*isStarted()*/) { /* * only allow zero count to stop the looping * at the end of an iteration. */ if (nCount == 0) { if (TDebug.TraceClip) { TDebug.out("TClip.loop(int): stopping sample"); } // m_esdSample.stop(); } } else { if (nCount == 0) { if (TDebug.TraceClip) { TDebug.out("TClip.loop(int): starting sample (once)"); } // m_esdSample.play(); } else { /* * we're ignoring the count, because esd * cannot loop for a fixed number of * times. */ // TDebug.out("hallo"); if (TDebug.TraceClip) { TDebug.out("TClip.loop(int): starting sample (forever)"); } // m_esdSample.loop(); } } // TOOD: } public void flush() { // TOOD: } public void drain() { // TOOD: } public void close() { // m_esdSample.free(); // m_esdSample.close(); // TOOD: } public void open() { // TODO: } public void start() { if (TDebug.TraceClip) { TDebug.out("TClip.start(): called"); } /* * This is a hack. What start() really should do is * start playing at the position playback was stopped. */ if (TDebug.TraceClip) { TDebug.out("TClip.start(): calling 'loop(0)' [hack]"); } loop(0); } public void stop() { // TODO: // m_esdSample.kill(); } /* * This method is enforced by DataLine, but doesn't make any * sense for Clips. */ public int available() { return -1; } public long getLongFramePosition() { return -1; } } /*** TClip.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TCompoundControl.java000066400000000000000000000044701335566474600322740ustar00rootroot00000000000000/* * TCompoundControl.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 2001 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; // import java.util.Collection; // import java.util.ArrayList; // import java.util.HashSet; // import java.util.Iterator; // import java.util.List; // import java.util.Set; // import javax.sound.sampled.AudioSystem; import javax.sound.sampled.CompoundControl; import javax.sound.sampled.Control; // import javax.sound.sampled.Line; // import javax.sound.sampled.LineEvent; // import javax.sound.sampled.LineListener; // import javax.sound.sampled.LineUnavailableException; // import javax.sound.sampled.Port; import org.tritonus.share.TDebug; /** Base class for classes implementing Line. */ public class TCompoundControl extends CompoundControl implements TControllable { private TControlController m_controller; public TCompoundControl(CompoundControl.Type type, Control[] aMemberControls) { super(type, aMemberControls); if (TDebug.TraceControl) { TDebug.out("TCompoundControl.: begin"); } m_controller = new TControlController(); if (TDebug.TraceControl) { TDebug.out("TCompoundControl.: end"); } } public void setParentControl(TCompoundControl compoundControl) { m_controller.setParentControl(compoundControl); } public TCompoundControl getParentControl() { return m_controller.getParentControl(); } public void commit() { m_controller.commit(); } } /*** TCompoundControl.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TCompoundControlType.java000066400000000000000000000026271335566474600331400ustar00rootroot00000000000000/* * TCompoundControlType.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 2001 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled.mixer; import javax.sound.sampled.CompoundControl; /** CompoundControl.Type class. This class is only needed to provide a public constructor. */ public class TCompoundControlType extends CompoundControl.Type { /** Constructor. Constructs a CompoundControl.Type with the name given. @param strName The name of the control. */ public TCompoundControlType(String strName) { super(strName); } } /*** TCompoundControlType.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TControlController.java000066400000000000000000000043331335566474600326310ustar00rootroot00000000000000/* * TControlController.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 2001 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import java.util.Collection; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Control; import javax.sound.sampled.Line; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Port; import org.tritonus.share.TDebug; /** Base class for classes implementing Line. */ public class TControlController implements TControllable { /** The parent (compound) control. In case this control is part of a compound control, the parentControl property is set to a value other than null. */ private TCompoundControl m_parentControl; public TControlController() { } public void setParentControl(TCompoundControl compoundControl) { m_parentControl = compoundControl; } public TCompoundControl getParentControl() { return m_parentControl; } public void commit() { if (TDebug.TraceControl) { TDebug.out("TControlController.commit(): called [" + this.getClass().getName() + "]"); } if (getParentControl() != null) { getParentControl().commit(); } } } /*** TControlController.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TControllable.java000066400000000000000000000031721335566474600315650ustar00rootroot00000000000000/* * TControllable.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 2001 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import java.util.Collection; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Control; import javax.sound.sampled.Line; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Port; import org.tritonus.share.TDebug; public interface TControllable { public void setParentControl(TCompoundControl compoundControl); public TCompoundControl getParentControl(); public void commit(); } /*** TControllable.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TDataLine.java000066400000000000000000000112161335566474600306240ustar00rootroot00000000000000/* * TDataLine.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import java.util.Collection; import java.util.EventListener; import java.util.EventObject; import java.util.HashSet; import java.util.Set; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineEvent; import javax.sound.sampled.Line; import org.tritonus.share.TDebug; /** Base class for classes implementing DataLine. */ public abstract class TDataLine extends TLine implements DataLine { private static final int DEFAULT_BUFFER_SIZE = 128000; private AudioFormat m_format; private int m_nBufferSize; private boolean m_bRunning; // private boolean m_bActive; public TDataLine(TMixer mixer, DataLine.Info info) { super(mixer, info); init(info); } public TDataLine(TMixer mixer, DataLine.Info info, Collection controls) { super(mixer, info, controls); init(info); } // IDEA: extract format and bufsize from info? private void init(DataLine.Info info) { m_format = null; m_nBufferSize = AudioSystem.NOT_SPECIFIED; setRunning(false); // setActive(false); } // not defined here: // public void drain() // public void flush() public void start() { if (TDebug.TraceSourceDataLine) { TDebug.out("TDataLine.start(): called"); } setRunning(true); } public void stop() { if (TDebug.TraceSourceDataLine) { TDebug.out("TDataLine.stop(): called"); } setRunning(false); } public boolean isRunning() { return m_bRunning; } // TODO: recheck protected void setRunning(boolean bRunning) { boolean bOldValue = isRunning(); m_bRunning = bRunning; if (bOldValue != isRunning()) { if (isRunning()) { startImpl(); notifyLineEvent(LineEvent.Type.START); } else { stopImpl(); notifyLineEvent(LineEvent.Type.STOP); } } } protected void startImpl() { } protected void stopImpl() { } /** * This implementation returns the status of isRunning(). * Subclasses should overwrite this method if there is more * precise information about the status of the line available. */ public boolean isActive() { return isRunning(); } /* public boolean isStarted() { return m_bStarted; } */ // TODO: should only ALLOW engaging in data I/O. // actual START event should only be sent when line really becomes active /* protected void setStarted(boolean bStarted) { m_bStarted = bStarted; if (!isRunning()) { setActive(false); } } */ public AudioFormat getFormat() { return m_format; } protected void setFormat(AudioFormat format) { if (TDebug.TraceDataLine) { TDebug.out("TDataLine.setFormat(): setting: " + format); } m_format = format; } public int getBufferSize() { return m_nBufferSize; } protected void setBufferSize(int nBufferSize) { if (TDebug.TraceDataLine) { TDebug.out("TDataLine.setBufferSize(): setting: " + nBufferSize); } m_nBufferSize = nBufferSize; } // not defined here: // public int available() public int getFramePosition() { // TODO: return -1; } public long getMicrosecondPosition() { return (long) (getFramePosition() * getFormat().getFrameRate() * 1000000); } /* * Has to be overridden to be useful. */ public float getLevel() { return AudioSystem.NOT_SPECIFIED; } protected void checkOpen() { if (getFormat() == null) { throw new IllegalStateException("format must be specified"); } if (getBufferSize() == AudioSystem.NOT_SPECIFIED) { setBufferSize(getDefaultBufferSize()); } } protected int getDefaultBufferSize() { return DEFAULT_BUFFER_SIZE; } protected void notifyLineEvent(LineEvent.Type type) { notifyLineEvent(new LineEvent(this, type, getFramePosition())); } } /*** TDataLine.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TEnumControl.java000066400000000000000000000035411335566474600314120ustar00rootroot00000000000000/* * TEnumControl.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 2001 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import javax.sound.sampled.EnumControl; import org.tritonus.share.TDebug; /** Base class for classes implementing Line. */ public class TEnumControl extends EnumControl implements TControllable { private TControlController m_controller; public TEnumControl(EnumControl.Type type, Object[] aValues, Object value) { super(type, aValues, value); if (TDebug.TraceControl) { TDebug.out("TEnumControl.: begin"); } m_controller = new TControlController(); if (TDebug.TraceControl) { TDebug.out("TEnumControl.: end"); } } public void setParentControl(TCompoundControl compoundControl) { m_controller.setParentControl(compoundControl); } public TCompoundControl getParentControl() { return m_controller.getParentControl(); } public void commit() { m_controller.commit(); } } /*** TEnumControl.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TFloatControl.java000066400000000000000000000053461335566474600315600ustar00rootroot00000000000000/* * TFloatControl.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 2001 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import javax.sound.sampled.FloatControl; import org.tritonus.share.TDebug; /** Base class for classes implementing Line. */ public class TFloatControl extends FloatControl implements TControllable { private TControlController m_controller; public TFloatControl(FloatControl.Type type, float fMinimum, float fMaximum, float fPrecision, int nUpdatePeriod, float fInitialValue, String strUnits) { super(type, fMinimum, fMaximum, fPrecision, nUpdatePeriod, fInitialValue, strUnits); if (TDebug.TraceControl) { TDebug.out("TFloatControl.: begin"); } m_controller = new TControlController(); if (TDebug.TraceControl) { TDebug.out("TFloatControl.: end"); } } public TFloatControl(FloatControl.Type type, float fMinimum, float fMaximum, float fPrecision, int nUpdatePeriod, float fInitialValue, String strUnits, String strMinLabel, String strMidLabel, String strMaxLabel) { super(type, fMinimum, fMaximum, fPrecision, nUpdatePeriod, fInitialValue, strUnits, strMinLabel, strMidLabel, strMaxLabel); if (TDebug.TraceControl) { TDebug.out("TFloatControl.: begin"); } m_controller = new TControlController(); if (TDebug.TraceControl) { TDebug.out("TFloatControl.: end"); } } public void setParentControl(TCompoundControl compoundControl) { m_controller.setParentControl(compoundControl); } public TCompoundControl getParentControl() { return m_controller.getParentControl(); } public void commit() { m_controller.commit(); } } /*** TFloatControl.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TLine.java000066400000000000000000000141131335566474600300310ustar00rootroot00000000000000/* * TLine.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import java.util.Collection; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Control; import javax.sound.sampled.Line; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import org.tritonus.share.TDebug; import org.tritonus.share.TNotifier; /** Base class for classes implementing Line. */ public abstract class TLine implements Line { private static final Control[] EMPTY_CONTROL_ARRAY = new Control[0]; private Line.Info m_info; private boolean m_bOpen; private List m_controls; private Set m_lineListeners; private TMixer m_mixer; protected TLine(TMixer mixer, Line.Info info) { setLineInfo(info); setOpen(false); m_controls = new ArrayList(); m_lineListeners = new HashSet(); m_mixer = mixer; } protected TLine(TMixer mixer, Line.Info info, Collection controls) { this (mixer, info); m_controls.addAll(controls); } protected TMixer getMixer() { return m_mixer; } public Line.Info getLineInfo() { return m_info; } protected void setLineInfo(Line.Info info) { if (TDebug.TraceLine) { TDebug.out("TLine.setLineInfo(): setting: " + info); } synchronized (this) { m_info = info; } } public void open() throws LineUnavailableException { if (TDebug.TraceLine) { TDebug.out("TLine.open(): called"); } if (! isOpen()) { if (TDebug.TraceLine) { TDebug.out("TLine.open(): opening"); } openImpl(); if (getMixer() != null) { getMixer().registerOpenLine(this); } setOpen(true); } else { if (TDebug.TraceLine) { TDebug.out("TLine.open(): already open"); } } } /** * Subclasses should override this method. */ protected void openImpl() throws LineUnavailableException { if (TDebug.TraceLine) { TDebug.out("TLine.openImpl(): called"); } } public void close() { if (TDebug.TraceLine) { TDebug.out("TLine.close(): called"); } if (isOpen()) { if (TDebug.TraceLine) { TDebug.out("TLine.close(): closing"); } if (getMixer() != null) { getMixer().unregisterOpenLine(this); } closeImpl(); setOpen(false); } else { if (TDebug.TraceLine) { TDebug.out("TLine.close(): not open"); } } } /** * Subclasses should override this method. */ protected void closeImpl() { if (TDebug.TraceLine) { TDebug.out("TLine.closeImpl(): called"); } } public boolean isOpen() { return m_bOpen; } protected void setOpen(boolean bOpen) { if (TDebug.TraceLine) { TDebug.out("TLine.setOpen(): called, value: " + bOpen); } boolean bOldValue = isOpen(); m_bOpen = bOpen; if (bOldValue != isOpen()) { if (isOpen()) { if (TDebug.TraceLine) { TDebug.out("TLine.setOpen(): opened"); } notifyLineEvent(LineEvent.Type.OPEN); } else { if (TDebug.TraceLine) { TDebug.out("TLine.setOpen(): closed"); } notifyLineEvent(LineEvent.Type.CLOSE); } } } protected void addControl(Control control) { synchronized (m_controls) { m_controls.add(control); } } protected void removeControl(Control control) { synchronized (m_controls) { m_controls.remove(control); } } public Control[] getControls() { synchronized (m_controls) { return (Control[]) m_controls.toArray(EMPTY_CONTROL_ARRAY); } } public Control getControl(Control.Type controlType) { synchronized (m_controls) { Iterator it = m_controls.iterator(); while (it.hasNext()) { Control control = (Control) it.next(); if (control.getType().equals(controlType)) { return control; } } throw new IllegalArgumentException("no control of type " + controlType); } } public boolean isControlSupported(Control.Type controlType) { // TDebug.out("TLine.isSupportedControl(): called"); try { return getControl(controlType) != null; } catch (IllegalArgumentException e) { if (TDebug.TraceAllExceptions) { TDebug.out(e); } // TDebug.out("TLine.isSupportedControl(): returning false"); return false; } } public void addLineListener(LineListener listener) { // TDebug.out("%% TChannel.addListener(): called"); synchronized (m_lineListeners) { m_lineListeners.add(listener); } } public void removeLineListener(LineListener listener) { synchronized (m_lineListeners) { m_lineListeners.remove(listener); } } private Set getLineListeners() { synchronized (m_lineListeners) { return new HashSet(m_lineListeners); } } // is overridden in TDataLine to provide a position protected void notifyLineEvent(LineEvent.Type type) { notifyLineEvent(new LineEvent(this, type, AudioSystem.NOT_SPECIFIED)); } protected void notifyLineEvent(LineEvent event) { // TDebug.out("%% TChannel.notifyChannelEvent(): called"); // Channel.Event event = new Channel.Event(this, type, getPosition()); TNotifier.notifier.addEntry(event, getLineListeners()); } } /*** TLine.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TMixer.java000066400000000000000000000317301335566474600302320ustar00rootroot00000000000000/* * TMixer.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Set; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.Line; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Mixer; import javax.sound.sampled.Port; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.TargetDataLine; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.AudioFormats; import org.tritonus.share.ArraySet; // TODO: global controls (that use the system mixer) public abstract class TMixer extends TLine implements Mixer { private static Line.Info[] EMPTY_LINE_INFO_ARRAY = new Line.Info[0]; private static Line[] EMPTY_LINE_ARRAY = new Line[0]; private Mixer.Info m_mixerInfo; private Collection m_supportedSourceFormats; private Collection m_supportedTargetFormats; private Collection m_supportedSourceLineInfos; private Collection m_supportedTargetLineInfos; private Set m_openSourceDataLines; private Set m_openTargetDataLines; /** Constructor for mixers that use setSupportInformation(). */ protected TMixer(Mixer.Info mixerInfo, Line.Info lineInfo) { this(mixerInfo, lineInfo, new ArrayList(), new ArrayList(), new ArrayList(), new ArrayList()); } /** Constructor for mixers. */ protected TMixer(Mixer.Info mixerInfo, Line.Info lineInfo, Collection supportedSourceFormats, Collection supportedTargetFormats, Collection supportedSourceLineInfos, Collection supportedTargetLineInfos) { super(null, // TMixer lineInfo); if (TDebug.TraceMixer) { TDebug.out("TMixer.(): begin"); } m_mixerInfo = mixerInfo; setSupportInformation( supportedSourceFormats, supportedTargetFormats, supportedSourceLineInfos, supportedTargetLineInfos); m_openSourceDataLines = new ArraySet(); m_openTargetDataLines = new ArraySet(); if (TDebug.TraceMixer) { TDebug.out("TMixer.(): end"); } } protected void setSupportInformation( Collection supportedSourceFormats, Collection supportedTargetFormats, Collection supportedSourceLineInfos, Collection supportedTargetLineInfos) { if (TDebug.TraceMixer) { TDebug.out("TMixer.setSupportInformation(): begin"); } m_supportedSourceFormats = supportedSourceFormats; m_supportedTargetFormats = supportedTargetFormats; m_supportedSourceLineInfos = supportedSourceLineInfos; m_supportedTargetLineInfos = supportedTargetLineInfos; if (TDebug.TraceMixer) { TDebug.out("TMixer.setSupportInformation(): end"); } } public Mixer.Info getMixerInfo() { if (TDebug.TraceMixer) { TDebug.out("TMixer.getMixerInfo(): begin"); } if (TDebug.TraceMixer) { TDebug.out("TMixer.getMixerInfo(): end"); } return m_mixerInfo; } public Line.Info[] getSourceLineInfo() { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSourceLineInfo(): begin"); } Line.Info[] infos = (Line.Info[]) m_supportedSourceLineInfos.toArray(EMPTY_LINE_INFO_ARRAY); if (TDebug.TraceMixer) { TDebug.out("TMixer.getSourceLineInfo(): end"); } return infos; } public Line.Info[] getTargetLineInfo() { if (TDebug.TraceMixer) { TDebug.out("TMixer.getTargetLineInfo(): begin"); } Line.Info[] infos = (Line.Info[]) m_supportedTargetLineInfos.toArray(EMPTY_LINE_INFO_ARRAY); if (TDebug.TraceMixer) { TDebug.out("TMixer.getTargetLineInfo(): end"); } return infos; } public Line.Info[] getSourceLineInfo(Line.Info info) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSourceLineInfo(Line.Info): info to test: " + info); } // TODO: return EMPTY_LINE_INFO_ARRAY; } public Line.Info[] getTargetLineInfo(Line.Info info) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getTargetLineInfo(Line.Info): info to test: " + info); } // TODO: return EMPTY_LINE_INFO_ARRAY; } public boolean isLineSupported(Line.Info info) { if (TDebug.TraceMixer) { TDebug.out("TMixer.isLineSupported(): info to test: " + info); } Class lineClass = info.getLineClass(); if (lineClass.equals(SourceDataLine.class)) { return isLineSupportedImpl(info, m_supportedSourceLineInfos); } else if (lineClass.equals(TargetDataLine.class)) { return isLineSupportedImpl(info, m_supportedTargetLineInfos); } else if (lineClass.equals(Port.class)) { return isLineSupportedImpl(info, m_supportedSourceLineInfos) || isLineSupportedImpl(info, m_supportedTargetLineInfos); } else { return false; } } private static boolean isLineSupportedImpl(Line.Info info, Collection supportedLineInfos) { Iterator iterator = supportedLineInfos.iterator(); while (iterator.hasNext()) { Line.Info info2 = (Line.Info) iterator.next(); if (info2.matches(info)) { return true; } } return false; } public Line getLine(Line.Info info) throws LineUnavailableException { if (TDebug.TraceMixer) { TDebug.out("TMixer.getLine(): begin"); } Class lineClass = info.getLineClass(); DataLine.Info dataLineInfo = null; Port.Info portInfo = null; AudioFormat[] aFormats = null; if (info instanceof DataLine.Info) { dataLineInfo = (DataLine.Info) info; aFormats = dataLineInfo.getFormats(); } else if (info instanceof Port.Info) { portInfo = (Port.Info) info; } AudioFormat format = null; Line line = null; if (lineClass == SourceDataLine.class) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getLine(): type: SourceDataLine"); } if (dataLineInfo == null) { throw new IllegalArgumentException("need DataLine.Info for SourceDataLine"); } format = getSupportedSourceFormat(aFormats); line = getSourceDataLine(format, dataLineInfo.getMaxBufferSize()); } else if (lineClass == Clip.class) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getLine(): type: Clip"); } if (dataLineInfo == null) { throw new IllegalArgumentException("need DataLine.Info for Clip"); } format = getSupportedSourceFormat(aFormats); line = getClip(format); } else if (lineClass == TargetDataLine.class) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getLine(): type: TargetDataLine"); } if (dataLineInfo == null) { throw new IllegalArgumentException("need DataLine.Info for TargetDataLine"); } format = getSupportedTargetFormat(aFormats); line = getTargetDataLine(format, dataLineInfo.getMaxBufferSize()); } else if (lineClass == Port.class) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getLine(): type: TargetDataLine"); } if (portInfo == null) { throw new IllegalArgumentException("need Port.Info for Port"); } line = getPort(portInfo); } else { if (TDebug.TraceMixer) { TDebug.out("TMixer.getLine(): unknown line type, will throw exception"); } throw new LineUnavailableException("unknown line class: " + lineClass); } if (TDebug.TraceMixer) { TDebug.out("TMixer.getLine(): end"); } return line; } protected SourceDataLine getSourceDataLine(AudioFormat format, int nBufferSize) throws LineUnavailableException { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSourceDataLine(): begin"); } throw new IllegalArgumentException("this mixer does not support SourceDataLines"); } protected Clip getClip(AudioFormat format) throws LineUnavailableException { if (TDebug.TraceMixer) { TDebug.out("TMixer.getClip(): begin"); } throw new IllegalArgumentException("this mixer does not support Clips"); } protected TargetDataLine getTargetDataLine(AudioFormat format, int nBufferSize) throws LineUnavailableException { if (TDebug.TraceMixer) { TDebug.out("TMixer.getTargetDataLine(): begin"); } throw new IllegalArgumentException("this mixer does not support TargetDataLines"); } protected Port getPort(Port.Info info) throws LineUnavailableException { if (TDebug.TraceMixer) { TDebug.out("TMixer.getTargetDataLine(): begin"); } throw new IllegalArgumentException("this mixer does not support Ports"); } private AudioFormat getSupportedSourceFormat(AudioFormat[] aFormats) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedSourceFormat(): begin"); } AudioFormat format = null; for (int i = 0; i < aFormats.length; i++) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedSourceFormat(): checking " + aFormats[i] + "..."); } if (isSourceFormatSupported(aFormats[i])) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedSourceFormat(): ...supported"); } format = aFormats[i]; break; } else { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedSourceFormat(): ...no luck"); } } } if (format == null) { throw new IllegalArgumentException("no line matchine one of the passed formats"); } if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedSourceFormat(): end"); } return format; } private AudioFormat getSupportedTargetFormat(AudioFormat[] aFormats) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedTargetFormat(): begin"); } AudioFormat format = null; for (int i = 0; i < aFormats.length; i++) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedTargetFormat(): checking " + aFormats[i] + " ..."); } if (isTargetFormatSupported(aFormats[i])) { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedTargetFormat(): ...supported"); } format = aFormats[i]; break; } else { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedTargetFormat(): ...no luck"); } } } if (format == null) { throw new IllegalArgumentException("no line matchine one of the passed formats"); } if (TDebug.TraceMixer) { TDebug.out("TMixer.getSupportedTargetFormat(): end"); } return format; } /* not implemented here: getMaxLines(Line.Info) */ public Line[] getSourceLines() { if (TDebug.TraceMixer) { TDebug.out("TMixer.getSourceLines(): called"); } return (Line[]) m_openSourceDataLines.toArray(EMPTY_LINE_ARRAY); } public Line[] getTargetLines() { if (TDebug.TraceMixer) { TDebug.out("TMixer.getTargetLines(): called"); } return (Line[]) m_openTargetDataLines.toArray(EMPTY_LINE_ARRAY); } public void synchronize(Line[] aLines, boolean bMaintainSync) { throw new IllegalArgumentException("synchronization not supported"); } public void unsynchronize(Line[] aLines) { throw new IllegalArgumentException("synchronization not supported"); } public boolean isSynchronizationSupported(Line[] aLines, boolean bMaintainSync) { return false; } protected boolean isSourceFormatSupported(AudioFormat format) { if (TDebug.TraceMixer) { TDebug.out("TMixer.isSourceFormatSupported(): format to test: " + format); } Iterator iterator = m_supportedSourceFormats.iterator(); while (iterator.hasNext()) { AudioFormat supportedFormat = (AudioFormat) iterator.next(); if (AudioFormats.matches(supportedFormat, format)) { return true; } } return false; } protected boolean isTargetFormatSupported(AudioFormat format) { if (TDebug.TraceMixer) { TDebug.out("TMixer.isTargetFormatSupported(): format to test: " + format); } Iterator iterator = m_supportedTargetFormats.iterator(); while (iterator.hasNext()) { AudioFormat supportedFormat = (AudioFormat) iterator.next(); if (AudioFormats.matches(supportedFormat, format)) { return true; } } return false; } /*package*/ void registerOpenLine(Line line) { if (TDebug.TraceMixer) { TDebug.out("TMixer.registerOpenLine(): line to register: " + line); } if (line instanceof SourceDataLine) { synchronized (m_openSourceDataLines) { m_openSourceDataLines.add(line); } } else if (line instanceof TargetDataLine) { synchronized (m_openSourceDataLines) { m_openTargetDataLines.add(line); } } } /*package*/ void unregisterOpenLine(Line line) { if (TDebug.TraceMixer) { TDebug.out("TMixer.unregisterOpenLine(): line to unregister: " + line); } if (line instanceof SourceDataLine) { synchronized (m_openSourceDataLines) { m_openSourceDataLines.remove(line); } } else if (line instanceof TargetDataLine) { synchronized (m_openTargetDataLines) { m_openTargetDataLines.remove(line); } } } } /*** TMixer.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TMixerInfo.java000066400000000000000000000023401335566474600310410ustar00rootroot00000000000000/* * TMixerInfo.java */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import javax.sound.sampled.Mixer; import org.tritonus.share.TDebug; /* * This is needed only because Mixer.Info's constructor * is protected (in the Sun jdk1.3). */ public class TMixerInfo extends Mixer.Info { public TMixerInfo(String a, String b, String c, String d) { super(a, b, c, d); } } /*** TMixerInfo.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TMixerProvider.java000066400000000000000000000135141335566474600317450ustar00rootroot00000000000000/* * TMixerProvider.java */ /* * Copyright (c) 1999 - 2001 by Matthias Pfisterer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.tritonus.share.sampled.mixer; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.sound.sampled.Mixer; import javax.sound.sampled.spi.MixerProvider; import org.tritonus.share.TDebug; public abstract class TMixerProvider extends MixerProvider { private static final Mixer.Info[] EMPTY_MIXER_INFO_ARRAY = new Mixer.Info[0]; private static Map sm_mixerProviderStructs = new HashMap(); private boolean m_bDisabled = false; public TMixerProvider() { if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.(): begin"); } // currently does nothing if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.(): end"); } } /* Override this method if you want a thread-safe static initializaiton. */ protected void staticInit() { } private MixerProviderStruct getMixerProviderStruct() { if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.getMixerProviderStruct(): begin"); } Class cls = this.getClass(); if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.getMixerProviderStruct(): called from " + cls); } // Thread.dumpStack(); synchronized (TMixerProvider.class) { MixerProviderStruct struct = (MixerProviderStruct) sm_mixerProviderStructs.get(cls); if (struct == null) { if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.getMixerProviderStruct(): creating new MixerProviderStruct for " + cls); } struct = new MixerProviderStruct(); sm_mixerProviderStructs.put(cls, struct); } if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.getMixerProviderStruct(): end"); } return struct; } } protected void disable() { if (TDebug.TraceMixerProvider) { TDebug.out("disabling " + getClass().getName()); } m_bDisabled = true; } protected boolean isDisabled() { return m_bDisabled; } protected void addMixer(Mixer mixer) { if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.addMixer(): begin"); } MixerProviderStruct struct = getMixerProviderStruct(); synchronized (struct) { struct.m_mixers.add(mixer); if (struct.m_defaultMixer == null) { struct.m_defaultMixer = mixer; } } if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.addMixer(): end"); } } protected void removeMixer(Mixer mixer) { if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.removeMixer(): begin"); } MixerProviderStruct struct = getMixerProviderStruct(); synchronized (struct) { struct.m_mixers.remove(mixer); // TODO: should search for another mixer if (struct.m_defaultMixer == mixer) { struct.m_defaultMixer = null; } } if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.removeMixer(): end"); } } // $$mp 2003/01/11: TODO: this implementation may become obsolete once the overridden method in spi.MixerProvider is implemented in a way documented officially. public boolean isMixerSupported(Mixer.Info info) { if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.isMixerSupported(): begin"); } boolean bIsSupported = false; Mixer.Info[] infos = getMixerInfo(); for (int i = 0; i < infos.length; i++) { if (infos[i].equals(info)) { bIsSupported = true; break; } } if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.isMixerSupported(): end"); } return bIsSupported; } /** */ public Mixer getMixer(Mixer.Info info) { if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.getMixer(): begin"); } MixerProviderStruct struct = getMixerProviderStruct(); Mixer mixerResult = null; synchronized (struct) { if (info == null) { mixerResult = struct.m_defaultMixer; } else { Iterator mixers = struct.m_mixers.iterator(); while (mixers.hasNext()) { Mixer mixer = (Mixer) mixers.next(); if (mixer.getMixerInfo().equals(info)) { mixerResult = mixer; break; } } } } if (mixerResult == null) { throw new IllegalArgumentException("no mixer available for " + info); } if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.getMixer(): end"); } return mixerResult; } public Mixer.Info[] getMixerInfo() { if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.getMixerInfo(): begin"); } Set mixerInfos = new HashSet(); MixerProviderStruct struct = getMixerProviderStruct(); synchronized (struct) { Iterator mixers = struct.m_mixers.iterator(); while (mixers.hasNext()) { Mixer mixer = (Mixer) mixers.next(); mixerInfos.add(mixer.getMixerInfo()); } } if (TDebug.TraceMixerProvider) { TDebug.out("TMixerProvider.getMixerInfo(): end"); } return (Mixer.Info[]) mixerInfos.toArray(EMPTY_MIXER_INFO_ARRAY); } private class MixerProviderStruct { public List m_mixers; public Mixer m_defaultMixer; public MixerProviderStruct() { m_mixers = new ArrayList(); m_defaultMixer = null; } } } /*** TMixerProvider.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TPort.java000066400000000000000000000033301335566474600300650ustar00rootroot00000000000000/* * TPort.java * * This file is part of Tritonus, * an implementation of the Java Sound API. */ /* * Copyright (c) 1999, 2000 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import java.util.Collection; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Control; import javax.sound.sampled.Line; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Port; import org.tritonus.share.TDebug; /** Base class for Ports. */ public class TPort extends TLine implements Port { public TPort(TMixer mixer, Line.Info info) { super(mixer, info); } public TPort(TMixer mixer, Line.Info info, Collection controls) { super(mixer, info, controls); } } /*** TPort.java ***/ extensions/soundspi/tritonus/src/org/tritonus/share/sampled/mixer/TSoftClip.java000066400000000000000000000130101335566474600306600ustar00rootroot00000000000000/* * TSoftClip.java */ /* * Copyright (c) 1999 by Matthias Pfisterer * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.tritonus.share.sampled.mixer; import java.io.IOException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.Mixer; import org.tritonus.share.TDebug; import org.tritonus.share.sampled.mixer.TDataLine; public class TSoftClip extends TClip implements Runnable { private static final Class[] CONTROL_CLASSES = {/*GainControl.class*/}; private static final int BUFFER_SIZE = 16384; private Mixer m_mixer; private SourceDataLine m_line; private byte[] m_abClip; private int m_nRepeatCount; private Thread m_thread; public TSoftClip(Mixer mixer, AudioFormat format) throws LineUnavailableException { // TODO: info object /* DataLine.Info info = new DataLine.Info(Clip.class, audioFormat, -1); */ super(null); m_mixer = mixer; DataLine.Info info = new DataLine.Info( SourceDataLine.class, // TODO: should pass a real AudioFormat object that isn't too restrictive format); m_line = (SourceDataLine) AudioSystem.getLine(info); } public void open(AudioInputStream audioInputStream) throws LineUnavailableException, IOException { AudioFormat audioFormat = audioInputStream.getFormat(); setFormat(audioFormat); int nFrameSize = audioFormat.getFrameSize(); if (nFrameSize < 1) { throw new IllegalArgumentException("frame size must be positive"); } if (TDebug.TraceClip) { TDebug.out("TSoftClip.open(): format: " + audioFormat); // TDebug.out("sample rate: " + audioFormat.getSampleRate()); } byte[] abData = new byte[BUFFER_SIZE]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); int nBytesRead = 0; while (nBytesRead != -1) { try { nBytesRead = audioInputStream.read(abData, 0, abData.length); } catch (IOException e) { if (TDebug.TraceClip || TDebug.TraceAllExceptions) { TDebug.out(e); } } if (nBytesRead >= 0) { if (TDebug.TraceClip) { TDebug.out("TSoftClip.open(): Trying to write: " + nBytesRead); } baos.write(abData, 0, nBytesRead); if (TDebug.TraceClip) { TDebug.out("TSoftClip.open(): Written: " + nBytesRead); } } } m_abClip = baos.toByteArray(); setBufferSize(m_abClip.length); // open the line m_line.open(getFormat()); // to trigger the events // open(); } public int getFrameLength() { if (isOpen()) { return getBufferSize() / getFormat().getFrameSize(); } else { return AudioSystem.NOT_SPECIFIED; } } public long getMicrosecondLength() { if (isOpen()) { return (long) (getFrameLength() * getFormat().getFrameRate() * 1000000); } else { return AudioSystem.NOT_SPECIFIED; } } public void setFramePosition(int nPosition) { // TOOD: } public void setMicrosecondPosition(long lPosition) { // TOOD: } public int getFramePosition() { // TOOD: return -1; } public long getMicrosecondPosition() { // TOOD: return -1; } public void setLoopPoints(int nStart, int nEnd) { // TOOD: } public void loop(int nCount) { if (TDebug.TraceClip) { TDebug.out("TSoftClip.loop(int): called; count = " + nCount); } if (false/*isStarted()*/) { /* * only allow zero count to stop the looping * at the end of an iteration. */ if (nCount == 0) { if (TDebug.TraceClip) { TDebug.out("TSoftClip.loop(int): stopping sample"); } // m_esdSample.stop(); } } else { m_nRepeatCount = nCount; m_thread = new Thread(this); m_thread.start(); } // TOOD: } public void flush() { // TOOD: } public void drain() { // TOOD: } public void close() { // m_esdSample.free(); // m_esdSample.close(); // TOOD: } public void open() { // TODO: } public void start() { if (TDebug.TraceClip) { TDebug.out("TSoftClip.start(): called"); } /* * This is a hack. What start() really should do is * start playing at the position playback was stopped. */ if (TDebug.TraceClip) { TDebug.out("TSoftClip.start(): calling 'loop(0)' [hack]"); } loop(0); } public void stop() { // TODO: // m_esdSample.kill(); } /* * This method is enforced by DataLine, but doesn't make any * sense for Clips. */ public int available() { return -1; } public void run() { while (m_nRepeatCount >= 0) { m_line.write(m_abClip, 0, m_abClip.length); m_nRepeatCount--; } } } /*** TSoftClip.java ***/ extensions/xml/000077500000000000000000000000001335566474600141005ustar00rootroot00000000000000extensions/xml/build.xml000066400000000000000000000073751335566474600157350ustar00rootroot00000000000000 extensions/xml/customJdom-1.0/000077500000000000000000000000001335566474600165205ustar00rootroot00000000000000extensions/xml/customJdom-1.0/src/000077500000000000000000000000001335566474600173075ustar00rootroot00000000000000extensions/xml/customJdom-1.0/src/org/000077500000000000000000000000001335566474600200765ustar00rootroot00000000000000extensions/xml/customJdom-1.0/src/org/jdom/000077500000000000000000000000001335566474600210275ustar00rootroot00000000000000extensions/xml/customJdom-1.0/src/org/jdom/output/000077500000000000000000000000001335566474600223675ustar00rootroot00000000000000extensions/xml/customJdom-1.0/src/org/jdom/output/SpecialXMLOutputter.java000066400000000000000000000007211335566474600271270ustar00rootroot00000000000000package org.jdom.output; public class SpecialXMLOutputter extends XMLOutputter { public SpecialXMLOutputter(String indent, boolean newlines, String encoding){ //super(indent, newlines, encoding); super(); Format format=Format.getPrettyFormat(); if(indent!=null) format.setIndent(indent); if(encoding!=null) format.setEncoding(encoding); setFormat(format); } } extensions/xml/jdom-1.0/000077500000000000000000000000001335566474600153255ustar00rootroot00000000000000extensions/xml/jdom-1.0/LICENSE.txt000066400000000000000000000050111335566474600171450ustar00rootroot00000000000000/*-- $Id: LICENSE.txt,v 1.1.1.1 2005/12/02 14:16:45 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ extensions/xml/jdom-1.0/MANIFEST.MF000066400000000000000000000031431335566474600167600ustar00rootroot00000000000000Manifest-Version: 1.0 Ant-Version: Apache Ant 1.5.2 Created-By: 1.2.2 (Sun Microsystems Inc.) Name: org/jdom/ Specification-Title: JDOM Classes Specification-Version: 1.0 Specification-Vendor: jdom.org Implementation-Title: org.jdom Implementation-Version: 1.0 Implementation-Vendor: jdom.org Name: org/jdom/input/ Specification-Title: JDOM Input Classes Specification-Version: 1.0 Specification-Vendor: jdom.org Implementation-Title: org.jdom.input Implementation-Version: 1.0 Implementation-Vendor: jdom.org Name: org/jdom/output/ Specification-Title: JDOM Output Classes Specification-Version: 1.0 Specification-Vendor: jdom.org Implementation-Title: org.jdom.output Implementation-Version: 1.0 Implementation-Vendor: jdom.org Name: org/jdom/adapters/ Specification-Title: JDOM Adapter Classes Specification-Version: 1.0 Specification-Vendor: jdom.org Implementation-Title: org.jdom.adapters Implementation-Version: 1.0 Implementation-Vendor: jdom.org Name: org/jdom/filter/ Specification-Title: JDOM Filter Classes Specification-Version: 1.0 Specification-Vendor: jdom.org Implementation-Title: org.jdom.filter Implementation-Version: 1.0 Implementation-Vendor: jdom.org Name: org/jdom/transform/ Specification-Title: JDOM Transformation Classes Specification-Version: 1.0 Specification-Vendor: jdom.org Implementation-Title: org.jdom.transform Implementation-Version: 1.0 Implementation-Vendor: jdom.org Name: org/jdom/xpath/ Specification-Title: JDOM XPath Classes Specification-Version: 1.0 Specification-Vendor: jdom.org Implementation-Title: org.jdom.xpath Implementation-Version: 1.0 Implementation-Vendor: jdom.org extensions/xml/jdom-1.0/info.xml000066400000000000000000000052731335566474600170110ustar00rootroot00000000000000 JDOM 1.0, built September 9 2004 JDOM is a Java-oriented object model which models XML documents. It provides a Java-centric means of generating and manipulating XML documents. While JDOM interoperates well with existing standards such as the Simple API for XML (SAX) and the Document Object Model (DOM), it is not an abstraction layer or enhancement to those APIs. Rather, it seeks to provide a robust, light-weight means of reading and writing XML data without the complex and memory-consumptive options that current API offerings provide. 2000-2004, Jason Hunter BSD/Apache style, see LICENSE.txt See the jdom-interest mailing list at jdom.org http://www.jdom.org/ Jason Hunter (primary) Brett McLaughlin (primary) Steven Gould Alex Chaffee Jon Baer Elliotte Rusty Harold Dan Schaffer Fred Trimble Jason Reid Kevin Regan Lucas Gonze Matthew Merlo Philip Nelson Wesley Biggs Wolfgang Werner Yusuf Goolamabbas Brad Huffman extensions/xml/jdom-1.0/src/000077500000000000000000000000001335566474600161145ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/000077500000000000000000000000001335566474600167035ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/jdom/000077500000000000000000000000001335566474600176345ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/jdom/Attribute.java000066400000000000000000000616431335566474600224540ustar00rootroot00000000000000/*-- $Id: Attribute.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.io.*; /** * An XML attribute. Methods allow the user to obtain the value of the attribute * as well as namespace and type information. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter * @author Elliotte Rusty Harold * @author Wesley Biggs * @version Modified for JClic: 2013.08.09 */ public class Attribute implements Serializable, Cloneable { private static final String CVS_ID = "@(#) $RCSfile: Attribute.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * Attribute type: the attribute has not been declared or type * is unknown. * * @see #getAttributeType */ public final static int UNDECLARED_TYPE = 0; /** * Attribute type: the attribute value is a string. * * @see #getAttributeType */ public final static int CDATA_TYPE = 1; /** * Attribute type: the attribute value is a unique identifier. * * @see #getAttributeType */ public final static int ID_TYPE = 2; /** * Attribute type: the attribute value is a reference to a * unique identifier. * * @see #getAttributeType */ public final static int IDREF_TYPE = 3; /** * Attribute type: the attribute value is a list of references to * unique identifiers. * * @see #getAttributeType */ public final static int IDREFS_TYPE = 4; /** * Attribute type: the attribute value is the name of an entity. * * @see #getAttributeType */ public final static int ENTITY_TYPE = 5; /** *

* Attribute type: the attribute value is a list of entity names. *

* * @see #getAttributeType */ public final static int ENTITIES_TYPE = 6; /** * Attribute type: the attribute value is a name token. *

* According to SAX 2.0 specification, attributes of enumerated * types should be reported as "NMTOKEN" by SAX parsers. But the * major parsers (Xerces and Crimson) provide specific values * that permit to recognize them as {@link #ENUMERATED_TYPE}. * * @see #getAttributeType */ public final static int NMTOKEN_TYPE = 7; /** * Attribute type: the attribute value is a list of name tokens. * * @see #getAttributeType */ public final static int NMTOKENS_TYPE = 8; /** * Attribute type: the attribute value is the name of a notation. * * @see #getAttributeType */ public final static int NOTATION_TYPE = 9; /** * Attribute type: the attribute value is a name token from an * enumeration. * * @see #getAttributeType */ public final static int ENUMERATED_TYPE = 10; // Keep the old constant names for one beta cycle to help migration /** The local name of the Attribute */ protected String name; /** The {@link Namespace} of the Attribute */ protected transient Namespace namespace; /** The value of the Attribute */ protected String value; /** The type of the Attribute */ protected int type = UNDECLARED_TYPE; /** Parent element, or null if none */ protected Object parent; /** * Default, no-args constructor for implementations to use if needed. */ protected Attribute() {} /** * This will create a new Attribute with the * specified (local) name and value, and in the provided * {@link Namespace}. * * @param name String name of Attribute. * @param value String value for new attribute. * @param namespace Namespace namespace for new attribute. * @throws IllegalNameException if the given name is illegal as an * attribute name or if if the new namespace is the default * namespace. Attributes cannot be in a default namespace. * @throws IllegalDataException if the given attribute value is * illegal character data (as determined by * {@link org.jdom.Verifier#checkCharacterData}). */ public Attribute(String name, String value, Namespace namespace) { setName(name); setValue(value); setNamespace(namespace); } /** * This will create a new Attribute with the * specified (local) name, value, and type, and in the provided * {@link Namespace}. * * @param name String name of Attribute. * @param value String value for new attribute. * @param type int type for new attribute. * @param namespace Namespace namespace for new attribute. * @throws IllegalNameException if the given name is illegal as an * attribute name or if if the new namespace is the default * namespace. Attributes cannot be in a default namespace. * @throws IllegalDataException if the given attribute value is * illegal character data (as determined by * {@link org.jdom.Verifier#checkCharacterData}) or * if the given attribute type is not one of the * supported types. */ public Attribute(String name, String value, int type, Namespace namespace) { setName(name); setValue(value); setAttributeType(type); setNamespace(namespace); } /** * This will create a new Attribute with the * specified (local) name and value, and does not place * the attribute in a {@link Namespace}. *

* Note: This actually explicitly puts the * Attribute in the "empty" Namespace * ({@link Namespace#NO_NAMESPACE}). * * @param name String name of Attribute. * @param value String value for new attribute. * @throws IllegalNameException if the given name is illegal as an * attribute name. * @throws IllegalDataException if the given attribute value is * illegal character data (as determined by * {@link org.jdom.Verifier#checkCharacterData}). */ public Attribute(String name, String value) { this(name, value, UNDECLARED_TYPE, Namespace.NO_NAMESPACE); } /** * This will create a new Attribute with the * specified (local) name, value and type, and does not place * the attribute in a {@link Namespace}. *

* Note: This actually explicitly puts the * Attribute in the "empty" Namespace * ({@link Namespace#NO_NAMESPACE}). * * @param name String name of Attribute. * @param value String value for new attribute. * @param type int type for new attribute. * @throws IllegalNameException if the given name is illegal as an * attribute name. * @throws IllegalDataException if the given attribute value is * illegal character data (as determined by * {@link org.jdom.Verifier#checkCharacterData}) or * if the given attribute type is not one of the * supported types. */ public Attribute(String name, String value, int type) { this(name, value, type, Namespace.NO_NAMESPACE); } /** * This will return the parent of this Attribute. * If there is no parent, then this returns null. * * @return parent of this Attribute */ public Element getParent() { return (Element) parent; } /** * This retrieves the owning {@link Document} for * this Attribute, or null if not a currently a member of a * {@link Document}. * * @return Document owning this Attribute, or null. */ public Document getDocument() { if (parent != null) { return ((Element)parent).getDocument(); } return null; } /** * This will set the parent of this Attribute. * * @param parent Element to be new parent. * @return this Attribute modified. */ protected Attribute setParent(Element parent) { this.parent = parent; return this; } /** * This detaches the Attribute from its parent, or does * nothing if the Attribute has no parent. * * @return Attribute - this Attribute modified. */ public Attribute detach() { Element p = getParent(); if (p != null) { p.removeAttribute(this.getName(), this.getNamespace()); } return this; } /** * This will retrieve the local name of the * Attribute. For any XML attribute * which appears as * [namespacePrefix]:[attributeName], * the local name of the attribute would be * [attributeName]. When the attribute * has no namespace, the local name is simply the attribute * name. *

* To obtain the namespace prefix for this * attribute, the * {@link #getNamespacePrefix()} * method should be used. * * @return String - name of this attribute, * without any namespace prefix. */ public String getName() { return name; } /** * This sets the local name of the Attribute. * * @param name the new local name to set * @return Attribute - the attribute modified. * @throws IllegalNameException if the given name is illegal as an * attribute name. */ public Attribute setName(String name) { String reason; if ((reason = Verifier.checkAttributeName(name)) != null) { throw new IllegalNameException(name, "attribute", reason); } this.name = name; return this; } /** * This will retrieve the qualified name of the Attribute. * For any XML attribute whose name is * [namespacePrefix]:[elementName], * the qualified name of the attribute would be * everything (both namespace prefix and * element name). When the attribute has no * namespace, the qualified name is simply the attribute's * local name. *

* To obtain the local name of the attribute, the * {@link #getName()} method should be used. *

* To obtain the namespace prefix for this attribute, * the {@link #getNamespacePrefix()} * method should be used. * * @return String - full name for this element. */ public String getQualifiedName() { // Note: Any changes here should be reflected in // XMLOutputter.printQualifiedName() String prefix = namespace.getPrefix(); if ((prefix != null) && (!prefix.equals(""))) { return new StringBuilder(prefix) .append(':') .append(getName()) // JCLIC modification //.toString(); .substring(0); } else { return getName(); } } /** * This will retrieve the namespace prefix of the * Attribute. For any XML attribute * which appears as * [namespacePrefix]:[attributeName], * the namespace prefix of the attribute would be * [namespacePrefix]. When the attribute * has no namespace, an empty String is returned. * * @return String - namespace prefix of this * attribute. */ public String getNamespacePrefix() { return namespace.getPrefix(); } /** * This returns the URI mapped to this Attribute's * prefix. If no mapping is found, an empty String is * returned. * * @return String - namespace URI for this Attribute. */ public String getNamespaceURI() { return namespace.getURI(); } /** * This will return this Attribute's * {@link Namespace}. * * @return Namespace - Namespace object for this Attribute */ public Namespace getNamespace() { return namespace; } /** * This sets this Attribute's {@link Namespace}. * If the provided namespace is null, the attribute will have no namespace. * The namespace must have a prefix. * * @param namespace the new namespace * @return Element - the element modified. * @throws IllegalNameException if the new namespace is the default * namespace. Attributes cannot be in a default namespace. */ public Attribute setNamespace(Namespace namespace) { if (namespace == null) { namespace = Namespace.NO_NAMESPACE; } // Verify the attribute isn't trying to be in a default namespace // Attributes can't be in a default namespace if (namespace != Namespace.NO_NAMESPACE && namespace.getPrefix().equals("")) { throw new IllegalNameException("", "attribute namespace", "An attribute namespace without a prefix can only be the " + "NO_NAMESPACE namespace"); } this.namespace = namespace; return this; } /** * This will return the actual textual value of this * Attribute. This will include all text * within the quotation marks. * * @return String - value for this attribute. */ public String getValue() { return value; } /** * This will set the value of the Attribute. * * @param value String value for the attribute. * @return Attribute - this Attribute modified. * @throws IllegalDataException if the given attribute value is * illegal character data (as determined by * {@link org.jdom.Verifier#checkCharacterData}). */ public Attribute setValue(String value) { String reason; if ((reason = Verifier.checkCharacterData(value)) != null) { throw new IllegalDataException(value, "attribute", reason); } this.value = value; return this; } /** * This will return the actual declared type of this * Attribute. * * @return int - type for this attribute. */ public int getAttributeType() { return type; } /** * This will set the type of the Attribute. * * @param type int type for the attribute. * @return Attribute - this Attribute modified. * @throws IllegalDataException if the given attribute type is * not one of the supported types. */ public Attribute setAttributeType(int type) { if ((type < UNDECLARED_TYPE) || (type > ENUMERATED_TYPE)) { throw new IllegalDataException(String.valueOf(type), "attribute", "Illegal attribute type"); } this.type = type; return this; } /** * This returns a String representation of the * Attribute, suitable for debugging. * * @return String - information about the * Attribute */ @Override public String toString() { return new StringBuilder() .append("[Attribute: ") .append(getQualifiedName()) .append("=\"") .append(value) .append("\"") .append("]") // JCLIC modification //.toString(); .substring(0); } /** * This tests for equality of this Attribute to the supplied * Object. * * @param ob Object to compare to. * @return boolean - whether the Attribute is * equal to the supplied Object. */ @Override public final boolean equals(Object ob) { return (ob == this); } /** * This returns the hash code for this Attribute. * * @return int - hash code. */ @Override public final int hashCode() { return super.hashCode(); } /** * This will return a clone of this Attribute. * * @return Object - clone of this Attribute. */ @Override public Object clone() { Attribute attribute = null; try { attribute = (Attribute) super.clone(); } catch(CloneNotSupportedException ce) { // Won't happen } // Name, namespace, and value are references to imutable objects // and are copied by super.clone() (aka Object.clone()) // super.clone() copies reference to set parent to null attribute.parent = null; return attribute; } ///////////////////////////////////////////////////////////////// // Convenience Methods below here ///////////////////////////////////////////////////////////////// /** * This gets the value of the attribute, in * int form, and if no conversion * can occur, throws a * {@link DataConversionException} * * @return int value of attribute. * @throws DataConversionException when conversion fails. */ public int getIntValue() throws DataConversionException { try { return Integer.parseInt(value.trim()); } catch (NumberFormatException e) { throw new DataConversionException(name, "int"); } } /** * This gets the value of the attribute, in * long form, and if no conversion * can occur, throws a * {@link DataConversionException} * * @return long value of attribute. * @throws DataConversionException when conversion fails. */ public long getLongValue() throws DataConversionException { try { return Long.parseLong(value.trim()); } catch (NumberFormatException e) { throw new DataConversionException(name, "long"); } } /** * This gets the value of the attribute, in * float form, and if no conversion * can occur, throws a * {@link DataConversionException} * * @return float value of attribute. * @throws DataConversionException when conversion fails. */ public float getFloatValue() throws DataConversionException { try { // Avoid Float.parseFloat() to support JDK 1.1 return Float.valueOf(value.trim()).floatValue(); } catch (NumberFormatException e) { throw new DataConversionException(name, "float"); } } /** * This gets the value of the attribute, in * double form, and if no conversion * can occur, throws a * {@link DataConversionException} * * @return double value of attribute. * @throws DataConversionException when conversion fails. */ public double getDoubleValue() throws DataConversionException { try { // Avoid Double.parseDouble() to support JDK 1.1 return Double.valueOf(value.trim()).doubleValue(); } catch (NumberFormatException e) { throw new DataConversionException(name, "double"); } } /** * This gets the effective boolean value of the attribute, or throws a * {@link DataConversionException} if a conversion can't be * performed. True values are: "true", "on", "1", and "yes". False * values are: "false", "off", "0", and "no". Values are trimmed before * comparison. Values other than those listed here throw the exception. * * @return boolean value of attribute. * @throws DataConversionException when conversion fails. */ public boolean getBooleanValue() throws DataConversionException { String valueTrim = value.trim(); if ((valueTrim.equalsIgnoreCase("true")) || (valueTrim.equalsIgnoreCase("on")) || (valueTrim.equalsIgnoreCase("1")) || (valueTrim.equalsIgnoreCase("yes"))) { return true; } else if ((valueTrim.equalsIgnoreCase("false")) || (valueTrim.equalsIgnoreCase("off")) || (valueTrim.equalsIgnoreCase("0")) || (valueTrim.equalsIgnoreCase("no"))) { return false; } else { throw new DataConversionException(name, "boolean"); } } // Support a custom Namespace serialization so no two namespace // object instances may exist for the same prefix/uri pair private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); // We use writeObject() and not writeUTF() to minimize space // This allows for writing pointers to already written strings out.writeObject(namespace.getPrefix()); out.writeObject(namespace.getURI()); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); namespace = Namespace.getNamespace( (String)in.readObject(), (String)in.readObject()); } } extensions/xml/jdom-1.0/src/org/jdom/AttributeList.java000066400000000000000000000416261335566474600233070ustar00rootroot00000000000000/*-- $Id: AttributeList.java,v 1.1.1.1 2005/12/02 14:16:46 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; /** * AttributeList represents legal JDOM Attribute * content. This class is NOT PUBLIC; users should see it as a simple List * implementation. * * @author Alex Rosen * @author Philippe Riand * @author Bradley S. Huffman * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:46 $ * @see CDATA * @see Comment * @see Element * @see EntityRef * @see ProcessingInstruction * @see Text */ class AttributeList extends AbstractList implements List, java.io.Serializable { private static final String CVS_ID = "@(#) $RCSfile: AttributeList.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:46 $ $Name: $"; private static final int INITIAL_ARRAY_SIZE = 5; /** The backing list */ private Attribute elementData[]; private int size; /** The parent Element */ private Element parent; /** Force an Element parent */ private AttributeList() {} /** * Create a new instance of the AttributeList representing * Element content * * @param parent element whose attributes are to be held */ AttributeList(Element parent) { this.parent = parent; } /** * Package internal method to support building from sources that are * 100% trusted. * * @param a attribute to add without any checks */ final void uncheckedAddAttribute(Attribute a) { a.parent = parent; ensureCapacity(size + 1); elementData[size++] = a; modCount++; } /** * Add a attribute to the end of the list or replace a existing * attribute with the same name and Namespace. * * @param obj The object to insert into the list. * @return true (as per the general contract of Collection.add). * @throws IndexOutOfBoundsException if index < 0 || index > size() */ public boolean add(Object obj) { if (obj instanceof Attribute) { Attribute attribute = (Attribute) obj; int duplicate = indexOfDuplicate(attribute); if (duplicate < 0) { add(size(), attribute); } else { set(duplicate, attribute); } } else if (obj == null) { throw new IllegalAddException("Cannot add null attribute"); } else { throw new IllegalAddException("Class " + obj.getClass().getName() + " is not an attribute"); } return true; } /** * Inserts the specified attribute at the specified position in this list. * Shifts the attribute currently at that position (if any) and any * subsequent attributes to the right (adds one to their indices). * * @param index The location to set the value to. * @param obj The object to insert into the list. * throws IndexOutOfBoundsException if index < 0 || index > size() */ public void add(int index, Object obj) { if (obj instanceof Attribute) { Attribute attribute = (Attribute) obj; int duplicate = indexOfDuplicate(attribute); if (duplicate >= 0) { throw new IllegalAddException("Cannot add duplicate attribute"); } add(index, attribute); } else if (obj == null) { throw new IllegalAddException("Cannot add null attribute"); } else { throw new IllegalAddException("Class " + obj.getClass().getName() + " is not an attribute"); } modCount++; } /** * Check and add the Attribute to this list at * the given index. Note: does not check for duplicate * attributes. * * @param index index where to add Attribute * @param attribute Attribute to add */ void add(int index, Attribute attribute) { if (attribute.getParent() != null) { throw new IllegalAddException( "The attribute already has an existing parent \"" + attribute.getParent().getQualifiedName() + "\""); } String reason = Verifier.checkNamespaceCollision(attribute, parent); if (reason != null) { throw new IllegalAddException(parent, attribute, reason); } if (index<0 || index>size) { throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); } attribute.setParent(parent); ensureCapacity(size+1); if( index==size ) { elementData[size++] = attribute; } else { System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = attribute; size++; } modCount++; } /** * Add all the objects in the specified collection. * * @param collection The collection containing all the objects to add. * @return true if the list was modified as a result of * the add. */ public boolean addAll(Collection collection) { return addAll(size(), collection); } /** * Inserts the specified collecton at the specified position in this list. * Shifts the attribute currently at that position (if any) and any * subsequent attributes to the right (adds one to their indices). * * @param index The offset to start adding the data in the collection * @param collection The collection to insert into the list. * @return true if the list was modified as a result of * the add. * throws IndexOutOfBoundsException if index < 0 || index > size() */ public boolean addAll(int index, Collection collection) { if (index<0 || index>size) { throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); } if ((collection == null) || (collection.size() == 0)) { return false; } ensureCapacity(size() + collection.size()); int count = 0; try { Iterator i = collection.iterator(); while (i.hasNext()) { Object obj = i.next(); add(index + count, obj); count++; } } catch (RuntimeException exception) { for (int i = 0; i < count; i++) { remove(index); } throw exception; } return true; } /** * Clear the current list. */ public void clear() { if (elementData != null) { for (int i = 0; i < size; i++) { Attribute attribute = elementData[i]; attribute.setParent(null); } elementData = null; size = 0; } modCount++; } /** * Clear the current list and set it to the contents * of the Collection. * object. * * @param collection The collection to use. */ void clearAndSet(Collection collection) { Attribute[] old = elementData; int oldSize = size; elementData = null; size = 0; if ((collection != null) && (collection.size() != 0)) { ensureCapacity(collection.size()); try { addAll(0, collection); } catch (RuntimeException exception) { elementData = old; size = oldSize; throw exception; } } if (old != null) { for (int i = 0; i < oldSize; i++) { Attribute attribute = old[i]; attribute.setParent(null); } } modCount++; } /** * Increases the capacity of this AttributeList instance, * if necessary, to ensure that it can hold at least the number of * items specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity. */ private void ensureCapacity(int minCapacity) { if (elementData == null) { elementData = new Attribute[Math.max(minCapacity, INITIAL_ARRAY_SIZE)]; } else { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Attribute oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; elementData = new Attribute[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, size); } } } /** * Return the object at the specified offset. * * @param index The offset of the object. * @return The Object which was returned. */ public Object get(int index) { if (index<0 || index>=size) { throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); } return elementData[index]; } /** * Return the Attribute with the * given name and Namespace. * * @param name name of attribute to return * @param namespace Namespace to match * @return the Attribute, or null if one doesn't exist. */ Object get(String name, Namespace namespace) { int index = indexOf(name, namespace); if (index < 0) { return null; } return elementData[index]; } /** * Return index of the Attribute with the * given name and uri. */ int indexOf(String name, Namespace namespace) { String uri = namespace.getURI(); if (elementData != null) { for (int i = 0; i < size; i++) { Attribute old = elementData[i]; String oldURI = old.getNamespaceURI(); String oldName = old.getName(); if (oldURI.equals(uri) && oldName.equals(name)) { return i; } } } return -1; } /** * Remove the object at the specified offset. * * @param index The offset of the object. * @return The Object which was removed. */ public Object remove(int index) { if (index<0 || index>=size) throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); Attribute old = elementData[index]; old.setParent(null); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index,numMoved); elementData[--size] = null; // Let gc do its work modCount++; return old; } /** * Remove the Attribute with the * given name and Namespace. * * @param namespace Namespace to match * @return the true if attribute was removed, * false otherwise */ boolean remove(String name, Namespace namespace) { int index = indexOf(name, namespace); if (index < 0) { return false; } remove(index); return true; } /** * Set the object at the specified location to the supplied * object. * * @param index The location to set the value to. * @param obj The location to set the value to. * @return The object which was replaced. * throws IndexOutOfBoundsException if index < 0 || index >= size() */ public Object set(int index, Object obj) { if (obj instanceof Attribute) { Attribute attribute = (Attribute) obj; int duplicate = indexOfDuplicate(attribute); if ((duplicate >= 0) && (duplicate != index)) { throw new IllegalAddException("Cannot set duplicate attribute"); } return set(index, attribute); } else if (obj == null) { throw new IllegalAddException("Cannot add null attribute"); } else { throw new IllegalAddException("Class " + obj.getClass().getName() + " is not an attribute"); } } /** * Set the object at the specified location to the supplied * object. Note: does not check for duplicate attributes. * * @param index The location to set the value to. * @param attribute The attribute to set. * @return The object which was replaced. * throws IndexOutOfBoundsException if index < 0 || index >= size() */ Object set(int index, Attribute attribute) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); if (attribute.getParent() != null) { throw new IllegalAddException( "The attribute already has an existing parent \"" + attribute.getParent().getQualifiedName() + "\""); } String reason = Verifier.checkNamespaceCollision(attribute, parent); if (reason != null) { throw new IllegalAddException(parent, attribute, reason); } Attribute old = (Attribute) elementData[index]; old.setParent(null); elementData[index] = attribute; attribute.setParent(parent); return old; } /** * Return index of attribute with same name and Namespace, or * -1 if one doesn't exist */ private int indexOfDuplicate(Attribute attribute) { int duplicate = -1; String name = attribute.getName(); Namespace namespace = attribute.getNamespace(); duplicate = indexOf(name, namespace); return duplicate; } /** * Return the number of items in this list * * @return The number of items in this list. */ public int size() { return size; } /** * Return this list as a String */ public String toString() { return super.toString(); } } extensions/xml/jdom-1.0/src/org/jdom/CDATA.java000066400000000000000000000155441335566474600213240ustar00rootroot00000000000000/*-- $Id: CDATA.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * An XML CDATA section. Represents character-based content within an XML * document that should be output within special CDATA tags. Semantically it's * identical to a simple {@link Text} object, but output behavior is different. * CDATA makes no guarantees about the underlying textual representation of * character data, but does expose that data as a Java String. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Dan Schaffer * @author Brett McLaughlin * @author Jason Hunter * @author Bradley S. Huffman */ public class CDATA extends Text { private static final String CVS_ID = "@(#) $RCSfile: CDATA.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This is the protected, no-args constructor standard in all JDOM * classes. It allows subclassers to get a raw instance with no * initialization. */ protected CDATA() { } /** * This constructor creates a new CDATA node, with the * supplied string value as it's character content. * * @param str the node's character content. * @throws IllegalDataException if str contains an * illegal character such as a vertical tab (as determined * by {@link org.jdom.Verifier#checkCharacterData}) * or the CDATA end delimiter ]]>. */ public CDATA(String str) { setText(str); } /** * This will set the value of this CDATA node. * * @param str value for node's content. * @return the object on which the method was invoked * @throws IllegalDataException if str contains an * illegal character such as a vertical tab (as determined * by {@link org.jdom.Verifier#checkCharacterData}) * or the CDATA end delimiter ]]>. */ @Override public Text setText(String str) { // Overrides Text.setText() because this needs to check CDATA // rules are enforced. We could have a separate Verifier check // for CDATA beyond Text and call that alone before super.setText(). String reason; if (str == null) { value = EMPTY_STRING; return this; } if ((reason = Verifier.checkCDATASection(str)) != null) { throw new IllegalDataException(str, "CDATA section", reason); } value = str; return this; } /** * This will append character content to whatever content already * exists within this CDATA node. * * @param str character content to append. * @throws IllegalDataException if str contains an * illegal character such as a vertical tab (as determined * by {@link org.jdom.Verifier#checkCharacterData}) * or the CDATA end delimiter ]]>. */ @Override public void append(String str) { // Overrides Text.setText() because this needs to check CDATA // rules are enforced. We could have a separate Verifier check // for CDATA beyond Text and call that alone before super.setText(). String reason; if (str == null) { return; } if ((reason = Verifier.checkCDATASection(str)) != null) { throw new IllegalDataException(str, "CDATA section", reason); } if (value == EMPTY_STRING) value = str; else value += str; } /** * This returns a String representation of the * CDATA node, suitable for debugging. If the XML * representation of the CDATA node is desired, * either {@link #getText} or * {@link org.jdom.output.XMLOutputter#output(CDATA, java.io.Writer)} * should be used. * * @return String - information about this node. */ @Override public String toString() { return new StringBuilder(64) .append("[CDATA: ") .append(getText()) .append("]") // JCLIC modification //.toString(); .substring(0); } } extensions/xml/jdom-1.0/src/org/jdom/Comment.java000066400000000000000000000121001335566474600220730ustar00rootroot00000000000000/*-- $Id: Comment.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * An XML comment. Methods allow the user to get and set the text of the * comment. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter */ public class Comment extends Content { private static final String CVS_ID = "@(#) $RCSfile: Comment.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** Text of the Comment */ protected String text; /** * Default, no-args constructor for implementations to use if needed. */ protected Comment() {} /** * This creates the comment with the supplied text. * * @param text String content of comment. */ public Comment(String text) { setText(text); } /** * Returns the XPath 1.0 string value of this element, which is the * text of this comment. * * @return the text of this comment */ public String getValue() { return text; } /** * This returns the textual data within the Comment. * * @return String - text of comment. */ public String getText() { return text; } /** * This will set the value of the Comment. * * @param text String text for comment. * @return Comment - this Comment modified. * @throws IllegalDataException if the given text is illegal for a * Comment. */ public Comment setText(String text) { String reason; if ((reason = Verifier.checkCommentData(text)) != null) { throw new IllegalDataException(text, "comment", reason); } this.text = text; return this; } /** * This returns a String representation of the * Comment, suitable for debugging. If the XML * representation of the Comment is desired, * {@link org.jdom.output.XMLOutputter#outputString(Comment)} * should be used. * * @return String - information about the * Attribute */ public String toString() { return new StringBuilder() .append("[Comment: ") .append(new org.jdom.output.XMLOutputter().outputString(this)) .append("]") // JCLIC modification //.toString(); .substring(0); } } extensions/xml/jdom-1.0/src/org/jdom/Content.java000066400000000000000000000145261335566474600221210ustar00rootroot00000000000000/*-- $Id: Content.java,v 1.1.1.1 2005/12/02 14:16:47 fbusquets Exp $ Copyright (C) 2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.io.*; /** * Superclass for JDOM objects which can be legal child content * of {@link org.jdom.Parent} nodes. * * @see org.jdom.Comment * @see org.jdom.DocType * @see org.jdom.Element * @see org.jdom.EntityRef * @see org.jdom.Parent * @see org.jdom.ProcessingInstruction * @see org.jdom.Text * * @author Bradley S. Huffman * @author Jason Hunter * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:47 $ */ public abstract class Content implements Cloneable, Serializable { protected Parent parent = null; protected Content() {} /** * Detaches this child from its parent or does nothing if the child * has no parent. * * @return this child detached */ public Content detach() { if (parent != null) { parent.removeContent(this); } return this; } /** * Return this child's parent, or null if this child is currently * not attached. The parent can be either an {@link Element} * or a {@link Document}. * * @return this child's parent or null if none */ public Parent getParent() { return parent; } /** * A convenience method that returns any parent element for this element, * or null if the element is unattached or is a root element. This was the * original behavior of getParent() in JDOM Beta 9 which began returning * Parent in Beta 10. This method provides a convenient upgrade path for * JDOM Beta 10 and 1.0 users. * * @return the containing Element or null if unattached or a root element */ public Element getParentElement() { Parent parent = getParent(); return (Element) ((parent instanceof Element) ? parent : null); } /** * Sets the parent of this Content. The caller is responsible for removing * any pre-existing parentage. * * @param parent new parent element * @return the target element */ protected Content setParent(Parent parent) { this.parent = parent; return this; } /** * Return this child's owning document or null if the branch containing * this child is currently not attached to a document. * * @return this child's owning document or null if none */ public Document getDocument() { if (parent == null) return null; return parent.getDocument(); } /** * Returns the XPath 1.0 string value of this child. * * @return xpath string value of this child. */ public abstract String getValue(); /** * Returns a deep, unattached copy of this child and its descendants * detached from any parent or document. * * @return a detached deep copy of this child and descendants */ public Object clone() { try { Content c = (Content)super.clone(); c.parent = null; return c; } catch (CloneNotSupportedException e) { //Can not happen .... //e.printStackTrace(); return null; } } /** * This tests for equality of this Content object to the supplied object. * Content items are considered equal only if they are referentially equal * (i.e. the same object). User code may choose to compare objects * based on their properties instead. * * @param ob Object to compare to. * @return boolean - whether the Content is * equal to the supplied Object. */ public final boolean equals(Object ob) { return (ob == this); } /** * This returns the hash code for this Content item. * * @return int - hash code. */ public final int hashCode() { return super.hashCode(); } } extensions/xml/jdom-1.0/src/org/jdom/ContentList.java000066400000000000000000001050671335566474600227560ustar00rootroot00000000000000/*-- $Id: ContentList.java,v 1.1.1.1 2005/12/02 14:16:48 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; import org.jdom.filter.*; /** * A non-public list implementation holding only legal JDOM content, including * content for Document or Element nodes. Users see this class as a simple List * implementation. * * @see CDATA * @see Comment * @see Element * @see EntityRef * @see ProcessingInstruction * @see Text * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:48 $ * @author Alex Rosen * @author Philippe Riand * @author Bradley S. Huffman */ final class ContentList extends AbstractList implements java.io.Serializable { private static final String CVS_ID = "@(#) $RCSfile: ContentList.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:48 $ $Name: $"; private static final int INITIAL_ARRAY_SIZE = 5; /** * Used inner class FilterListIterator to help hasNext and * hasPrevious the next index of our cursor (must be here * for JDK1.1). */ private static final int CREATE = 0; private static final int HASPREV = 1; private static final int HASNEXT = 2; private static final int PREV = 3; private static final int NEXT = 4; private static final int ADD = 5; private static final int REMOVE = 6; /** Our backing list */ // protected ArrayList list; private Content elementData[]; private int size; /** Document or Element this list belongs to */ private Parent parent; /** Force either a Document or Element parent */ ContentList(Parent parent) { this.parent = parent; } /** * Package internal method to support building from sources that are * 100% trusted. * * @param c content to add without any checks */ final void uncheckedAddContent(Content c) { c.parent = parent; ensureCapacity(size + 1); elementData[size++] = c; modCount++; } /** * Inserts the specified object at the specified position in this list. * Shifts the object currently at that position (if any) and any * subsequent objects to the right (adds one to their indices). * * @param index The location to set the value to. * @param obj The object to insert into the list. * throws IndexOutOfBoundsException if index < 0 || index > size() */ public void add(int index, Object obj) { if (obj == null) { throw new IllegalAddException("Cannot add null object"); } if ((obj instanceof Content)) { add(index, (Content) obj); } else { throw new IllegalAddException("Class " + obj.getClass().getName() + " is of unrecognized type and cannot be added"); } } /** * @see org.jdom.ContentList#add(int, org.jdom.Content) */ private void documentCanContain(int index, Content child) throws IllegalAddException { if (child instanceof Element) { if (indexOfFirstElement() >= 0) { throw new IllegalAddException( "Cannot add a second root element, only one is allowed"); } if (indexOfDocType() > index) { throw new IllegalAddException( "A root element cannot be added before the DocType"); } } if (child instanceof DocType) { if (indexOfDocType() >= 0) { throw new IllegalAddException( "Cannot add a second doctype, only one is allowed"); } int firstElt = indexOfFirstElement(); if (firstElt != -1 && firstElt < index) { throw new IllegalAddException( "A DocType cannot be added after the root element"); } } if (child instanceof CDATA) { throw new IllegalAddException("A CDATA is not allowed at the document root"); } if (child instanceof Text) { throw new IllegalAddException("A Text is not allowed at the document root"); } if (child instanceof EntityRef) { throw new IllegalAddException("An EntityRef is not allowed at the document root"); } } private static void elementCanContain(int index, Content child) throws IllegalAddException { if (child instanceof DocType) { throw new IllegalAddException( "A DocType is not allowed except at the document level"); } } /** * Check and add the Element to this list at * the given index. * * @param index index where to add Element * @param child Element to add */ void add(int index, Content child) { if (child == null) { throw new IllegalAddException("Cannot add null object"); } if (parent instanceof Document) { documentCanContain(index, child); } else { elementCanContain(index, child); } if (child.getParent() != null) { Parent p = child.getParent(); if (p instanceof Document) { throw new IllegalAddException((Element)child, "The Content already has an existing parent document"); } else { throw new IllegalAddException( "The Content already has an existing parent \"" + ((Element)p).getQualifiedName() + "\""); } } if (child == parent) { throw new IllegalAddException( "The Element cannot be added to itself"); } // Detect if we have and c.add(a) if ((parent instanceof Element && child instanceof Element) && ((Element) child).isAncestor((Element)parent)) { throw new IllegalAddException( "The Element cannot be added as a descendent of itself"); } if (index<0 || index>size) { throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); } child.setParent(parent); ensureCapacity(size+1); if( index==size ) { elementData[size++] = child; } else { System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = child; size++; } modCount++; } /** * Add the specified collecton to the end of this list. * * @param collection The collection to add to the list. * @return true if the list was modified as a result of * the add. */ public boolean addAll(Collection collection) { return addAll(size(), collection); } /** * Inserts the specified collecton at the specified position in this list. * Shifts the object currently at that position (if any) and any * subsequent objects to the right (adds one to their indices). * * @param index The offset to start adding the data in the collection * @param collection The collection to insert into the list. * @return true if the list was modified as a result of * the add. * throws IndexOutOfBoundsException if index < 0 || index > size() */ public boolean addAll(int index, Collection collection) { if (index<0 || index>size) { throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); } if ((collection == null) || (collection.size() == 0)) { return false; } ensureCapacity(size() + collection.size()); int count = 0; try { Iterator i = collection.iterator(); while (i.hasNext()) { Object obj = i.next(); add(index + count, obj); count++; } } catch (RuntimeException exception) { for (int i = 0; i < count; i++) { remove(index); } throw exception; } return true; } /** * Clear the current list. */ public void clear() { if (elementData != null) { for (int i = 0; i < size; i++) { Content obj = elementData[i]; removeParent(obj); } elementData = null; size = 0; } modCount++; } /** * Clear the current list and set it to the contents * of the Collection. * object. * * @param collection The collection to use. */ void clearAndSet(Collection collection) { Content[] old = elementData; int oldSize = size; elementData = null; size = 0; if ((collection != null) && (collection.size() != 0)) { ensureCapacity(collection.size()); try { addAll(0, collection); } catch (RuntimeException exception) { elementData = old; size = oldSize; throw exception; } } if (old != null) { for (int i = 0; i < oldSize; i++) { removeParent(old[i]); } } modCount++; } /** * Increases the capacity of this ContentList instance, * if necessary, to ensure that it can hold at least the number of * items specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity. */ void ensureCapacity(int minCapacity) { if( elementData==null ) { elementData = new Content[Math.max(minCapacity, INITIAL_ARRAY_SIZE)]; } else { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; elementData = new Content[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, size); } } } /** * Return the object at the specified offset. * * @param index The offset of the object. * @return The Object which was returned. */ public Object get(int index) { if (index<0 || index>=size) { throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); } return elementData[index]; } /** * Return a view of this list based on the given filter. * * @param filter Filter for this view. * @return a list representing the rules of the Filter. */ List getView(Filter filter) { return new FilterList(filter); } /** * Return the index of the first Element in the list. If the parent * is a Document then the element is the root element. * If the list contains no Elements, it returns -1. * * @return index of first element, or -1 if one doesn't exist */ int indexOfFirstElement() { if( elementData!=null ) { for (int i = 0; i < size; i++) { if (elementData[i] instanceof Element) { return i; } } } return -1; } /** * Return the index of the DocType element in the list. If the list contains * no DocType, it returns -1. * * @return index of the DocType, or -1 if it doesn't * exist */ int indexOfDocType() { if (elementData != null) { for (int i = 0; i < size; i++) { if (elementData[i] instanceof DocType) { return i; } } } return -1; } /** * Remove the object at the specified offset. * * @param index The offset of the object. * @return The Object which was removed. */ public Object remove(int index) { if (index<0 || index>=size) throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); Content old = elementData[index]; removeParent(old); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index,numMoved); elementData[--size] = null; // Let gc do its work modCount++; return old; } /** Remove the parent of a Object */ private static void removeParent(Content c) { c.setParent(null); } /** * Set the object at the specified location to the supplied * object. * * @param index The location to set the value to. * @param obj The location to set the value to. * @return The object which was replaced. * throws IndexOutOfBoundsException if index < 0 || index >= size() */ public Object set(int index, Object obj) { if (index<0 || index>=size) throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); if ((obj instanceof Element) && (parent instanceof Document)) { int root = indexOfFirstElement(); if ((root >= 0) && (root != index)) { throw new IllegalAddException( "Cannot add a second root element, only one is allowed"); } } if ((obj instanceof DocType) && (parent instanceof Document)) { int docTypeIndex = indexOfDocType(); if ((docTypeIndex >= 0) && (docTypeIndex != index)) { throw new IllegalAddException( "Cannot add a second doctype, only one is allowed"); } } Object old = remove(index); try { add(index, obj); } catch (RuntimeException exception) { add(index, old); throw exception; } return old; } /** * Return the number of items in this list * * @return The number of items in this list. */ public int size() { return size; } /** * Return this list as a String * * @return The number of items in this list. */ public String toString() { return super.toString(); } /** Give access of ContentList.modCount to FilterList */ private int getModCount() { return modCount; } /* * * * * * * * * * * * * FilterList * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * FilterList * * * * * * * * * * * * * * * */ /** * FilterList represents legal JDOM content, including content * for Documents or Elements. */ class FilterList extends AbstractList implements java.io.Serializable { /** The Filter */ Filter filter; /** Current number of items in this view */ int count = 0; /** Expected modCount in our backing list */ int expected = -1; // Implementation Note: Directly after size() is called, expected // is sync'd with ContentList.modCount and count provides // the true size of this view. Before the first call to // size() or if the backing list is modified outside this // FilterList, both might contain bogus values and should // not be used without first calling size(); /** * Create a new instance of the FilterList with the specified Filter. */ FilterList(Filter filter) { this.filter = filter; } /** * Inserts the specified object at the specified position in this list. * Shifts the object currently at that position (if any) and any * subsequent objects to the right (adds one to their indices). * * @param index The location to set the value to. * @param obj The object to insert into the list. * throws IndexOutOfBoundsException if index < 0 || index > size() */ public void add(int index, Object obj) { if (filter.matches(obj)) { int adjusted = getAdjustedIndex(index); ContentList.this.add(adjusted, obj); expected++; count++; } else throw new IllegalAddException("Filter won't allow the " + obj.getClass().getName() + " '" + obj + "' to be added to the list"); } /** * Return the object at the specified offset. * * @param index The offset of the object. * @return The Object which was returned. */ public Object get(int index) { int adjusted = getAdjustedIndex(index); return ContentList.this.get(adjusted); } public Iterator iterator() { return new FilterListIterator(filter, 0); } public ListIterator listIterator() { return new FilterListIterator(filter, 0); } public ListIterator listIterator(int index) { return new FilterListIterator(filter, index); } /** * Remove the object at the specified offset. * * @param index The offset of the object. * @return The Object which was removed. */ public Object remove(int index) { int adjusted = getAdjustedIndex(index); Object old = ContentList.this.get(adjusted); if (filter.matches(old)) { old = ContentList.this.remove(adjusted); expected++; count--; } else { throw new IllegalAddException("Filter won't allow the " + (old.getClass()).getName() + " '" + old + "' (index " + index + ") to be removed"); } return old; } /** * Set the object at the specified location to the supplied * object. * * @param index The location to set the value to. * @param obj The location to set the value to. * @return The object which was replaced. * throws IndexOutOfBoundsException if index < 0 || index >= size() */ public Object set(int index, Object obj) { Object old = null; if (filter.matches(obj)) { int adjusted = getAdjustedIndex(index); old = ContentList.this.get(adjusted); if (!filter.matches(old)) { throw new IllegalAddException("Filter won't allow the " + (old.getClass()).getName() + " '" + old + "' (index " + index + ") to be removed"); } old = ContentList.this.set(adjusted, obj); expected += 2; } else { throw new IllegalAddException("Filter won't allow index " + index + " to be set to " + (obj.getClass()).getName()); } return old; } /** * Return the number of items in this list * * @return The number of items in this list. */ public int size() { // Implementation Note: Directly after size() is called, expected // is sync'd with ContentList.modCount and count provides // the true size of this view. Before the first call to // size() or if the backing list is modified outside this // FilterList, both might contain bogus values and should // not be used without first calling size(); if (expected == ContentList.this.getModCount()) { return count; } count = 0; for (int i = 0; i < ContentList.this.size(); i++) { Object obj = ContentList.this.elementData[i]; if (filter.matches(obj)) { count++; } } expected = ContentList.this.getModCount(); return count; } /** * Return the adjusted index * * @param index Index of in this view. * @return True index in backing list */ final private int getAdjustedIndex(int index) { int adjusted = 0; for (int i = 0; i < ContentList.this.size; i++) { Object obj = ContentList.this.elementData[i]; if (filter.matches(obj)) { if (index == adjusted) { return i; } adjusted++; } } if (index == adjusted) { return ContentList.this.size; } return ContentList.this.size + 1; } } /* * * * * * * * * * * * * FilterListIterator * * * * * * * * * * * */ /* * * * * * * * * * * * * FilterListIterator * * * * * * * * * * * */ class FilterListIterator implements ListIterator { /** The Filter that applies */ Filter filter; /** The last operation performed */ int lastOperation; /** Initial start index in backing list */ int initialCursor; /** Index in backing list of next object */ int cursor; /** Index in backing list of last object returned */ int last; /** Expected modCount in our backing list */ int expected; /** * Default constructor */ FilterListIterator(Filter filter, int start) { this.filter = filter; initialCursor = initializeCursor(start); last = -1; expected = ContentList.this.getModCount(); lastOperation = CREATE; } /** * Returns true if this list iterator has a next element. */ public boolean hasNext() { checkConcurrentModification(); switch(lastOperation) { case CREATE: cursor = initialCursor; break; case PREV: cursor = last; break; case ADD: case NEXT: cursor = moveForward(last + 1); break; case REMOVE: cursor = moveForward(last); break; case HASPREV: cursor = moveForward(cursor + 1); break; case HASNEXT: break; default: throw new IllegalStateException("Unknown operation"); } if (lastOperation != CREATE) { lastOperation = HASNEXT; } return (cursor < ContentList.this.size()) ? true : false; } /** * Returns the next element in the list. */ public Object next() { checkConcurrentModification(); if (hasNext()) { last = cursor; } else { last = ContentList.this.size(); throw new NoSuchElementException(); } lastOperation = NEXT; return ContentList.this.get(last); } /** * Returns true if this list iterator has more * elements when traversing the list in the reverse direction. */ public boolean hasPrevious() { checkConcurrentModification(); switch(lastOperation) { case CREATE: cursor = initialCursor; int size = ContentList.this.size(); if (cursor >= size) { cursor = moveBackward(size - 1); } break; case PREV: case REMOVE: cursor = moveBackward(last - 1); break; case HASNEXT: cursor = moveBackward(cursor - 1); break; case ADD: case NEXT: cursor = last; break; case HASPREV: break; default: throw new IllegalStateException("Unknown operation"); } if (lastOperation != CREATE) { lastOperation = HASPREV; } return (cursor < 0) ? false : true; } /** * Returns the previous element in the list. */ public Object previous() { checkConcurrentModification(); if (hasPrevious()) { last = cursor; } else { last = -1; throw new NoSuchElementException(); } lastOperation = PREV; return ContentList.this.get(last); } /** * Returns the index of the element that would be returned by a * subsequent call to next. */ public int nextIndex() { checkConcurrentModification(); hasNext(); int count = 0; for (int i = 0; i < ContentList.this.size(); i++) { if (filter.matches(ContentList.this.get(i))) { if (i == cursor) { return count; } count++; } } expected = ContentList.this.getModCount(); return count; } /** * Returns the index of the element that would be returned by a * subsequent call to previous. (Returns -1 if the * list iterator is at the beginning of the list.) */ public int previousIndex() { checkConcurrentModification(); if (hasPrevious()) { int count = 0; for (int i = 0; i < ContentList.this.size(); i++) { if (filter.matches(ContentList.this.get(i))) { if (i == cursor) { return count; } count++; } } } return -1; } /** * Inserts the specified element into the list. */ public void add(Object obj) { checkConcurrentModification(); if (filter.matches(obj)) { last = cursor + 1; ContentList.this.add(last, obj); } else { throw new IllegalAddException("Filter won't allow add of " + (obj.getClass()).getName()); } expected = ContentList.this.getModCount(); lastOperation = ADD; } /** * Removes from the list the last element that was returned by * next or previous. * the last call to next or previous. */ public void remove() { checkConcurrentModification(); if ((last < 0) || (lastOperation == REMOVE)) { throw new IllegalStateException("no preceeding call to " + "prev() or next()"); } if (lastOperation == ADD) { throw new IllegalStateException("cannot call remove() " + "after add()"); } Object old = ContentList.this.get(last); if (filter.matches(old)) { ContentList.this.remove(last); } else throw new IllegalAddException("Filter won't allow " + (old.getClass()).getName() + " (index " + last + ") to be removed"); expected = ContentList.this.getModCount(); lastOperation = REMOVE; } /** * Replaces the last element returned by next or * previous with the specified element. */ public void set(Object obj) { checkConcurrentModification(); if ((lastOperation == ADD) || (lastOperation == REMOVE)) { throw new IllegalStateException("cannot call set() after " + "add() or remove()"); } if (last < 0) { throw new IllegalStateException("no preceeding call to " + "prev() or next()"); } if (filter.matches(obj)) { Object old = ContentList.this.get(last); if (!filter.matches(old)) { throw new IllegalAddException("Filter won't allow " + (old.getClass()).getName() + " (index " + last + ") to be removed"); } ContentList.this.set(last, obj); } else { throw new IllegalAddException("Filter won't allow index " + last + " to be set to " + (obj.getClass()).getName()); } expected = ContentList.this.getModCount(); // Don't set lastOperation } /** * Returns index in the backing list by moving forward start * objects that match our filter. */ private int initializeCursor(int start) { if (start < 0) { throw new IndexOutOfBoundsException("Index: " + start); } int count = 0; for (int i = 0; i < ContentList.this.size(); i++) { Object obj = ContentList.this.get(i); if (filter.matches(obj)) { if (start == count) { return i; } count++; } } if (start > count) { throw new IndexOutOfBoundsException("Index: " + start + " Size: " + count); } return ContentList.this.size(); } /** * Returns index in the backing list of the next object matching * our filter, starting at the given index and moving forwards. */ private int moveForward(int start) { if (start < 0) { start = 0; } for (int i = start; i < ContentList.this.size(); i++) { Object obj = ContentList.this.get(i); if (filter.matches(obj)) { return i; } } return ContentList.this.size(); } /** * Returns index in the backing list of the next object matching * our filter, starting at the given index and moving backwards. */ private int moveBackward(int start) { if (start >= ContentList.this.size()) { start = ContentList.this.size() - 1; } for (int i = start; i >= 0; --i) { Object obj = ContentList.this.get(i); if (filter.matches(obj)) { return i; } } return -1; } /** * Check if are backing list is being modified by someone else. */ private void checkConcurrentModification() { if (expected != ContentList.this.getModCount()) { throw new ConcurrentModificationException(); } } } } extensions/xml/jdom-1.0/src/org/jdom/DataConversionException.java000066400000000000000000000073651335566474600253100ustar00rootroot00000000000000/*-- $Id: DataConversionException.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * Thrown when a data conversion from a string to value type fails, such as * can happen with the {@link Attribute} convenience getter functions. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter */ public class DataConversionException extends JDOMException { private static final String CVS_ID = "@(#) $RCSfile: DataConversionException.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * Constructs an exception where the named construct couldn't be converted * to the named data type. * * @param name name of the construct whose value failed conversion * @param dataType type the conversion was attempting to create */ public DataConversionException(String name, String dataType) { super(new StringBuilder() .append("The XML construct ") .append(name) .append(" could not be converted to a ") .append(dataType) // JCLIC modification //.toString() .substring(0) ); } } extensions/xml/jdom-1.0/src/org/jdom/DefaultJDOMFactory.java000066400000000000000000000147531335566474600240770ustar00rootroot00000000000000/*-- $Id: DefaultJDOMFactory.java,v 1.1.1.1 2005/12/02 14:16:47 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; /** * Creates the standard top-level JDOM classes (Element, Document, Comment, * etc). A subclass of this factory might construct custom classes. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:47 $ * @author Ken Rune Holland * @author Phil Nelson * @author Bradley S. Huffman */ public class DefaultJDOMFactory implements JDOMFactory { private static final String CVS_ID = "@(#) $RCSfile: DefaultJDOMFactory.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:47 $ $Name: $"; public DefaultJDOMFactory() { } // Allow Javadocs to inherit from JDOMFactory public Attribute attribute(String name, String value, Namespace namespace) { return new Attribute(name, value, namespace); } public Attribute attribute(String name, String value, int type, Namespace namespace) { return new Attribute(name, value, type, namespace); } public Attribute attribute(String name, String value) { return new Attribute(name, value); } public Attribute attribute(String name, String value, int type) { return new Attribute(name, value, type); } public CDATA cdata(String text) { return new CDATA(text); } public Text text(String text) { return new Text(text); } public Comment comment(String text) { return new Comment(text); } public DocType docType(String elementName, String publicID, String systemID) { return new DocType(elementName, publicID, systemID); } public DocType docType(String elementName, String systemID) { return new DocType(elementName, systemID); } public DocType docType(String elementName) { return new DocType(elementName); } public Document document(Element rootElement, DocType docType) { return new Document(rootElement, docType); } public Document document(Element rootElement, DocType docType, String baseURI) { return new Document(rootElement, docType, baseURI); } public Document document(Element rootElement) { return new Document(rootElement); } public Element element(String name, Namespace namespace) { return new Element(name, namespace); } public Element element(String name) { return new Element(name); } public Element element(String name, String uri) { return new Element(name, uri); } public Element element(String name, String prefix, String uri) { return new Element(name, prefix, uri); } public ProcessingInstruction processingInstruction(String target, Map data) { return new ProcessingInstruction(target, data); } public ProcessingInstruction processingInstruction(String target, String data) { return new ProcessingInstruction(target, data); } public EntityRef entityRef(String name) { return new EntityRef(name); } public EntityRef entityRef(String name, String publicID, String systemID) { return new EntityRef(name, publicID, systemID); } public EntityRef entityRef(String name, String systemID) { return new EntityRef(name, systemID); } // ===================================================================== // List manipulation // ===================================================================== public void addContent(Parent parent, Content child) { if (parent instanceof Document) { ((Document) parent).addContent(child); } else { ((Element) parent).addContent(child); } } public void setAttribute(Element parent, Attribute a) { parent.setAttribute(a); } public void addNamespaceDeclaration(Element parent, Namespace additional) { parent.addNamespaceDeclaration(additional); } } extensions/xml/jdom-1.0/src/org/jdom/DescendantIterator.java000066400000000000000000000135301335566474600242630ustar00rootroot00000000000000/*-- $Id: DescendantIterator.java,v 1.1.1.1 2005/12/02 14:16:45 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; import org.jdom.Content; import org.jdom.Element; import org.jdom.Parent; /** * Traverse all a parent's descendants (all children at any level below * the parent). * * @author Bradley S. Huffman * @author Jason Hunter * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:45 $ */ class DescendantIterator implements Iterator { private Iterator iterator; private Iterator nextIterator; private List stack = new ArrayList(); private static final String CVS_ID = "@(#) $RCSfile: DescendantIterator.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:45 $ $Name: $"; /** * Iterator for the descendants of the supplied object. * * @param parent document or element whose descendants will be iterated */ DescendantIterator(Parent parent) { if (parent == null) { throw new IllegalArgumentException("parent parameter was null"); } this.iterator = parent.getContent().iterator(); } /** * Returns true> if the iteration has more {@link Content} descendants. * * @return true is the iterator has more descendants */ public boolean hasNext() { if (iterator != null && iterator.hasNext()) return true; if (nextIterator != null && nextIterator.hasNext()) return true; if (stackHasAnyNext()) return true; return false; } /** * Returns the next {@link Content} descendant. * * @return the next descendant */ public Object next() { if (!hasNext()) { throw new NoSuchElementException(); } // If we need to descend, go for it and record where we are. // We do the shuffle here on the next next() call so remove() is easy // to code up. if (nextIterator != null) { push(iterator); iterator = nextIterator; nextIterator = null; } // If this iterator is finished, try moving up the stack while (!iterator.hasNext()) { if (stack.size() > 0) { iterator = pop(); } else { throw new NoSuchElementException("Somehow we lost our iterator"); } } Content child = (Content) iterator.next(); if (child instanceof Element) { nextIterator = ((Element)child).getContent().iterator(); } return child; } /** * Detaches the last {@link org.jdom.Content} returned by the last call to * next from it's parent. Note: this does not affect * iteration and all children, siblings, and any node following the * removed node (in document order) will be visited. */ public void remove() { iterator.remove(); } private Iterator pop() { int stackSize = stack.size(); if (stackSize == 0) { throw new NoSuchElementException("empty stack"); } return (Iterator) stack.remove(stackSize - 1); } private void push(Iterator itr) { stack.add(itr); } private boolean stackHasAnyNext() { int size = stack.size(); for (int i = 0; i < size; i++) { Iterator itr = (Iterator) stack.get(i); if (itr.hasNext()) { return true; } } return false; } } extensions/xml/jdom-1.0/src/org/jdom/DocType.java000066400000000000000000000230501335566474600220460ustar00rootroot00000000000000/*-- $Id: DocType.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * An XML DOCTYPE declaration. Method allow the user to get and set the * root element name, public id, and system id. * * @author Brett McLaughlin * @author Jason Hunter * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ */ public class DocType extends Content { private static final String CVS_ID = "@(#) $RCSfile: DocType.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** The element being constrained */ protected String elementName; /** The public ID of the DOCTYPE */ protected String publicID; /** The system ID of the DOCTYPE */ protected String systemID; /** The internal subset of the DOCTYPE */ protected String internalSubset; /** * Default, no-args constructor for implementations to use if needed. */ protected DocType() {} /* * XXX: * We need to take care of entities and notations here. */ /** * This will create the DocType with * the specified element name and a reference to an * external DTD. * * @param elementName String name of * element being constrained. * @param publicID String public ID of * referenced DTD * @param systemID String system ID of * referenced DTD * @throws IllegalDataException if the given system ID is not a legal * system literal or the public ID is not a legal public ID. * @throws IllegalNameException if the given root element name is not a * legal XML element name. */ public DocType(String elementName, String publicID, String systemID) { setElementName(elementName); setPublicID(publicID); setSystemID(systemID); } /** * This will create the DocType with * the specified element name and reference to an * external DTD. * * @param elementName String name of * element being constrained. * @param systemID String system ID of * referenced DTD * @throws IllegalDataException if the given system ID is not a legal * system literal. * @throws IllegalNameException if the given root element name is not a * legal XML element name. */ public DocType(String elementName, String systemID) { this(elementName, null, systemID); } /** * This will create the DocType with * the specified element name * * @param elementName String name of * element being constrained. * @throws IllegalNameException if the given root element name is not a * legal XML element name. */ public DocType(String elementName) { this(elementName, null, null); } /** * This will retrieve the element name being constrained. * * @return String - element name for DOCTYPE */ public String getElementName() { return elementName; } /** * This will set the root element name declared by this * DOCTYPE declaration. * * @return DocType DocType this DocType object * @param elementName String name of * root element being constrained. * @throws IllegalNameException if the given root element name is not a * legal XML element name. */ public DocType setElementName(String elementName) { // This can contain a colon so we use checkXMLName() // instead of checkElementName() String reason = Verifier.checkXMLName(elementName); if (reason != null) { throw new IllegalNameException(elementName, "DocType", reason); } this.elementName = elementName; return this; } /** * This will retrieve the public ID of an externally * referenced DTD, or an empty String if * none is referenced. * * @return String - public ID of referenced DTD. */ public String getPublicID() { return publicID; } /** * This will set the public ID of an externally * referenced DTD. * * @param publicID id to set * @return DocType DocType this DocType object * @throws IllegalDataException if the given public ID is not a legal * public ID. */ public DocType setPublicID(String publicID) { String reason = Verifier.checkPublicID(publicID); if (reason != null) { throw new IllegalDataException(publicID, "DocType", reason); } this.publicID = publicID; return this; } /** * This will retrieve the system ID of an externally * referenced DTD, or an empty String if * none is referenced. * * @return String - system ID of referenced DTD. */ public String getSystemID() { return systemID; } /** * This will set the system ID of an externally * referenced DTD. * * @param systemID id to set * @return systemID String system ID of * referenced DTD. * @throws IllegalDataException if the given system ID is not a legal * system literal. */ public DocType setSystemID(String systemID) { String reason = Verifier.checkSystemLiteral(systemID); if (reason != null) { throw new IllegalDataException(systemID, "DocType", reason); } this.systemID = systemID; return this; } /** * Returns the empty string since doctypes don't have an XPath * 1.0 string value. * @return the empty string */ public String getValue() { return ""; // doctypes don't have an XPath string value } /** * This sets the data for the internal subset. * * @param newData data for the internal subset, as a * String. */ public void setInternalSubset(String newData) { internalSubset = newData; } /** * This returns the data for the internal subset. * * @return String - the internal subset */ public String getInternalSubset() { return internalSubset; } /** * This returns a String representation of the * DocType, suitable for debugging. * * @return String - information about the * DocType */ public String toString() { return new StringBuilder() .append("[DocType: ") .append(new org.jdom.output.XMLOutputter().outputString(this)) .append("]") // JCLIC modification //.toString(); .substring(0); } } extensions/xml/jdom-1.0/src/org/jdom/Document.java000066400000000000000000000655211335566474600222660ustar00rootroot00000000000000/*-- $Id: Document.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; import org.jdom.filter.*; /** * An XML document. Methods allow access to the root element as well as the * {@link DocType} and other document-level information. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter * @author Jools Enticknap * @author Bradley S. Huffman */ public class Document implements Parent { private static final String CVS_ID = "@(#) $RCSfile: Document.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This document's content including comments, PIs, a possible * DocType, and a root element. * Subclassers have to track content using their own * mechanism. */ ContentList content = new ContentList(this); /** * See http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/core.html#baseURIs-Considerations */ protected String baseURI = null; // Supports the setProperty/getProperty calls private HashMap propertyMap = null; /** * Creates a new empty document. A document must have a root element, * so this document will not be well-formed and accessor methods will * throw an IllegalStateException if this document is accessed before a * root element is added. This method is most useful for build tools. */ public Document() {} /** * This will create a new Document, * with the supplied {@link Element} * as the root element, the supplied * {@link DocType} declaration, and the specified * base URI. * * @param rootElement Element for document root. * @param docType DocType declaration. * @param baseURI the URI from which this doucment was loaded. * @throws IllegalAddException if the given docType object * is already attached to a document or the given * rootElement already has a parent */ public Document(Element rootElement, DocType docType, String baseURI) { if (rootElement != null) { setRootElement(rootElement); } if (docType != null) { setDocType(docType); } if (baseURI != null) { setBaseURI(baseURI); } } /** * This will create a new Document, * with the supplied {@link Element} * as the root element and the supplied * {@link DocType} declaration. * * @param rootElement Element for document root. * @param docType DocType declaration. * @throws IllegalAddException if the given DocType object * is already attached to a document or the given * rootElement already has a parent */ public Document(Element rootElement, DocType docType) { this(rootElement, docType, null); } /** * This will create a new Document, * with the supplied {@link Element} * as the root element, and no {@link DocType} * declaration. * * @param rootElement Element for document root * @throws IllegalAddException if the given rootElement already has * a parent. */ public Document(Element rootElement) { this(rootElement, null, null); } /** * This will create a new Document, * with the supplied list of content, and a * {@link DocType} declaration only if the content * contains a DocType instance. A null list is treated the * same as the no-arg constructor. * * @param content List of starter content * @throws IllegalAddException if the List contains more than * one Element or objects of illegal types. */ public Document(List content) { setContent(content); } public int getContentSize() { return content.size(); } public int indexOf(Content child) { return content.indexOf(child); } // /** // * Starting at the given index (inclusive), return the index of // * the first child matching the supplied filter, or -1 // * if none is found. // * // * @return index of child, or -1 if none found. // */ // private int indexOf(int start, Filter filter) { // int size = getContentSize(); // for (int i = start; i < size; i++) { // if (filter.matches(getContent(i))) { // return i; // } // } // return -1; // } /** * This will return true if this document has a * root element, false otherwise. * * @return true if this document has a root element, * false otherwise. */ public boolean hasRootElement() { return (content.indexOfFirstElement() < 0) ? false : true; } /** * This will return the root Element * for this Document * * @return Element - the document's root element * @throws IllegalStateException if the root element hasn't been set */ public Element getRootElement() { int index = content.indexOfFirstElement(); if (index < 0) { throw new IllegalStateException("Root element not set"); } return (Element) content.get(index); } /** * This sets the root {@link Element} for the * Document. If the document already has a root * element, it is replaced. * * @param rootElement Element to be new root. * @return Document - modified Document. * @throws IllegalAddException if the given rootElement already has * a parent. */ public Document setRootElement(Element rootElement) { int index = content.indexOfFirstElement(); if (index < 0) { content.add(rootElement); } else { content.set(index, rootElement); } return this; } /** * Detach the root {@link Element} from this document. * * @return removed root Element */ public Element detachRootElement() { int index = content.indexOfFirstElement(); if (index < 0) return null; return (Element) removeContent(index); } /** * This will return the {@link DocType} * declaration for this Document, or * null if none exists. * * @return DocType - the DOCTYPE declaration. */ public DocType getDocType() { int index = content.indexOfDocType(); if (index < 0) { return null; } else { return (DocType) content.get(index); } } /** * This will set the {@link DocType} * declaration for this Document. Note * that a DocType can only be attached to one Document. * Attempting to set the DocType to a DocType object * that already belongs to a Document will result in an * IllegalAddException being thrown. * * @param docType DocType declaration. * @return object on which the method was invoked * @throws IllegalAddException if the given docType is * already attached to a Document. */ public Document setDocType(DocType docType) { if (docType == null) { // Remove any existing doctype int docTypeIndex = content.indexOfDocType(); if (docTypeIndex >= 0) content.remove(docTypeIndex); return this; } if (docType.getParent() != null) { throw new IllegalAddException(docType, "The DocType already is attached to a document"); } // Add DocType to head if new, replace old otherwise int docTypeIndex = content.indexOfDocType(); if (docTypeIndex < 0) { content.add(0, docType); } else { content.set(docTypeIndex, docType); } return this; } /** * Appends the child to the end of the content list. * * @param child child to append to end of content list * @return the document on which the method was called * @throws IllegalAddException if the given child already has a parent. */ public Document addContent(Content child) { content.add(child); return this; } /** * Appends all children in the given collection to the end of * the content list. In event of an exception during add the * original content will be unchanged and the objects in the supplied * collection will be unaltered. * * @param c collection to append * @return the document on which the method was called * @throws IllegalAddException if any item in the collection * already has a parent or is of an illegal type. */ public Document addContent(Collection c) { content.addAll(c); return this; } /** * Inserts the child into the content list at the given index. * * @param index location for adding the collection * @param child child to insert * @return the parent on which the method was called * @throws IndexOutOfBoundsException if index is negative or beyond * the current number of children * @throws IllegalAddException if the given child already has a parent. */ public Document addContent(int index, Content child) { content.add(index, child); return this; } /** * Inserts the content in a collection into the content list * at the given index. In event of an exception the original content * will be unchanged and the objects in the supplied collection will be * unaltered. * * @param index location for adding the collection * @param c collection to insert * @return the parent on which the method was called * @throws IndexOutOfBoundsException if index is negative or beyond * the current number of children * @throws IllegalAddException if any item in the collection * already has a parent or is of an illegal type. */ public Document addContent(int index, Collection c) { content.addAll(index, c); return this; } public List cloneContent() { int size = getContentSize(); List list = new ArrayList(size); for (int i = 0; i < size; i++) { Content child = getContent(i); list.add(child.clone()); } return list; } public Content getContent(int index) { return (Content) content.get(index); } // public Content getChild(Filter filter) { // int i = indexOf(0, filter); // return (i < 0) ? null : getContent(i); // } /** * This will return all content for the Document. * The returned list is "live" in document order and changes to it * affect the document's actual content. * *

* Sequential traversal through the List is best done with a Iterator * since the underlying implement of List.size() may require walking the * entire list. *

* * @return List - all Document content * @throws IllegalStateException if the root element hasn't been set */ public List getContent() { if (!hasRootElement()) throw new IllegalStateException("Root element not set"); return content; } /** * Return a filtered view of this Document's content. * *

* Sequential traversal through the List is best done with a Iterator * since the underlying implement of List.size() may require walking the * entire list. *

* * @param filter Filter to apply * @return List - filtered Document content * @throws IllegalStateException if the root element hasn't been set */ public List getContent(Filter filter) { if (!hasRootElement()) throw new IllegalStateException("Root element not set"); return content.getView(filter); } /** * Removes all child content from this parent. * * @return list of the old children detached from this parent */ public List removeContent() { List old = new ArrayList(content); content.clear(); return old; } /** * Remove all child content from this parent matching the supplied filter. * * @param filter filter to select which content to remove * @return list of the old children detached from this parent */ public List removeContent(Filter filter) { List old = new ArrayList(); Iterator itr = content.getView(filter).iterator(); while (itr.hasNext()) { Content child = (Content) itr.next(); old.add(child); itr.remove(); } return old; } /** * This sets the content of the Document. The supplied * List should contain only objects of type Element, * Comment, and ProcessingInstruction. * *

* When all objects in the supplied List are legal and before the new * content is added, all objects in the old content will have their * parentage set to null (no parent) and the old content list will be * cleared. This has the effect that any active list (previously obtained * with a call to {@link #getContent}) will also * change to reflect the new content. In addition, all objects in the * supplied List will have their parentage set to this document, but the * List itself will not be "live" and further removals and additions will * have no effect on this document content. If the user wants to continue * working with a "live" list, then a call to setContent should be * followed by a call to {@link #getContent} to * obtain a "live" version of the content. *

* *

* Passing a null or empty List clears the existing content. *

* *

* In event of an exception the original content will be unchanged and * the objects in the supplied content will be unaltered. *

* * @param newContent List of content to set * @return this document modified * @throws IllegalAddException if the List contains objects of * illegal types or with existing parentage. */ public Document setContent(Collection newContent) { content.clearAndSet(newContent); return this; } /** * *

* Sets the effective URI from which this document was loaded, * and against which relative URLs in this document will be resolved. *

* * @param uri the base URI of this document */ public final void setBaseURI(String uri) { this.baseURI = uri; // XXX We don't check the URI } /** *

* Returns the URI from which this document was loaded, * or null if this is not known. *

* * @return the base URI of this document */ public final String getBaseURI() { return baseURI; } /* * Replace the current child the given index with the supplied child. *

* In event of an exception the original content will be unchanged and * the supplied child will be unaltered. *

* * @param index - index of child to replace. * @param child - child to add. * @throws IllegalAddException if the supplied child is already attached * or not legal content for this parent. * @throws IndexOutOfBoundsException if index is negative or greater * than the current number of children. */ public Document setContent(int index, Content child) { content.set(index, child); return this; } /** * Replace the child at the given index whith the supplied * collection. *

* In event of an exception the original content will be unchanged and * the content in the supplied collection will be unaltered. *

* * @param index - index of child to replace. * @param collection - collection of content to add. * @return object on which the method was invoked * @throws IllegalAddException if the collection contains objects of * illegal types. * @throws IndexOutOfBoundsException if index is negative or greater * than the current number of children. */ public Document setContent(int index, Collection collection) { content.remove(index); content.addAll(index, collection); return this; } public boolean removeContent(Content child) { return content.remove(child); } public Content removeContent(int index) { return (Content) content.remove(index); } /** * Set this document's content to be the supplied child. *

* If the supplied child is legal content for a Document and before * it is added, all content in the current content list will * be cleared and all current children will have their parentage set to * null. *

* This has the effect that any active list (previously obtained with * a call to one of the {@link #getContent} methods will also change * to reflect the new content. In addition, all content in the supplied * collection will have their parentage set to this Document. If the user * wants to continue working with a "live" list of this Document's * child, then a call to setContent should be followed by a call to one * of the {@link #getContent} methods to obtain a "live" * version of the children. *

* Passing a null child clears the existing content. *

* In event of an exception the original content will be unchanged and * the supplied child will be unaltered. * * @param child new content to replace existing content * @return the parent on which the method was called * @throws IllegalAddException if the supplied child is already attached * or not legal content for this parent */ public Document setContent(Content child) { content.clear(); content.add(child); return this; } /** * This returns a String representation of the * Document, suitable for debugging. If the XML * representation of the Document is desired, * {@link org.jdom.output.XMLOutputter#outputString(Document)} * should be used. * * @return String - information about the * Document */ @Override public String toString() { StringBuilder stringForm = new StringBuilder() .append("[Document: "); DocType docType = getDocType(); if (docType != null) { stringForm.append(docType.toString()) .append(", "); } else { stringForm.append(" No DOCTYPE declaration, "); } Element rootElement = getRootElement(); if (rootElement != null) { stringForm.append("Root is ") .append(rootElement.toString()); } else { stringForm.append(" No root element"); // shouldn't happen } stringForm.append("]"); return stringForm // JCLIC modification //.toString(); .substring(0); } /** * This tests for equality of this Document to the supplied * Object. * * @param ob Object to compare to * @return boolean whether the Document is * equal to the supplied Object */ public final boolean equals(Object ob) { return (ob == this); } /** * This returns the hash code for this Document. * * @return int hash code */ public final int hashCode() { return super.hashCode(); } /** * This will return a deep clone of this Document. * * @return Object clone of this Document */ public Object clone() { Document doc = null; try { doc = (Document) super.clone(); } catch (CloneNotSupportedException ce) { // Can't happen } // The clone has a reference to this object's content list, so // owerwrite with a empty list doc.content = new ContentList(doc); // Add the cloned content to clone for (int i = 0; i < content.size(); i++) { Object obj = content.get(i); if (obj instanceof Element) { Element element = (Element)((Element)obj).clone(); doc.content.add(element); } else if (obj instanceof Comment) { Comment comment = (Comment)((Comment)obj).clone(); doc.content.add(comment); } else if (obj instanceof ProcessingInstruction) { ProcessingInstruction pi = (ProcessingInstruction) ((ProcessingInstruction)obj).clone(); doc.content.add(pi); } else if (obj instanceof DocType) { DocType dt = (DocType) ((DocType)obj).clone(); doc.content.add(dt); } } return doc; } /** * Returns an iterator that walks over all descendants in document order. * * @return an iterator to walk descendants */ public Iterator getDescendants() { return new DescendantIterator(this); } /** * Returns an iterator that walks over all descendants in document order * applying the Filter to return only elements that match the filter rule. * With filters you can match only Elements, only Comments, Elements or * Comments, only Elements with a given name and/or prefix, and so on. * * @param filter filter to select which descendants to see * @return an iterator to walk descendants within a filter */ public Iterator getDescendants(Filter filter) { return new FilterIterator(new DescendantIterator(this), filter); } public Parent getParent() { return null; // documents never have parents } /** * @see org.jdom.Parent#getDocument() */ public Document getDocument() { return this; } /** * Assigns an arbitrary object to be associated with this document under * the given "id" string. Null values are permitted. Strings beginning * with "http://www.jdom.org/ are reserved for JDOM use. * * @param id the id of the stored object * @param value the object to store */ public void setProperty(String id, Object value) { if (propertyMap == null) { propertyMap = new HashMap(); } propertyMap.put(id, value); } /** * Returns the object associated with this document under the given "id" * string, or null if there is no binding or if the binding explicitly * stored a null value. * * @param id the id of the stored object to return * @return the object associated with the given id */ public Object getProperty(String id) { if (propertyMap == null) return null; return propertyMap.get(id); } } extensions/xml/jdom-1.0/src/org/jdom/Element.java000066400000000000000000001627101335566474600220770ustar00rootroot00000000000000/*-- $Id: Element.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.io.*; import java.util.*; import org.jdom.filter.*; /** * An XML element. Methods allow the user to get and manipulate its child * elements and content, directly access the element's textual content, * manipulate its attributes, and manage namespaces. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter * @author Lucas Gonze * @author Kevin Regan * @author Dan Schaffer * @author Yusuf Goolamabbas * @author Kent C. Johnson * @author Jools Enticknap * @author Alex Rosen * @author Bradley S. Huffman */ public class Element extends Content implements Parent { private static final String CVS_ID = "@(#) $RCSfile: Element.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; private static final int INITIAL_ARRAY_SIZE = 5; /** The local name of the element */ protected String name; /** The namespace of the element */ protected transient Namespace namespace; /** Additional namespace declarations to store on this element; useful * during output */ protected transient List additionalNamespaces; // See http://lists.denveronline.net/lists/jdom-interest/2000-September/003030.html // for a possible memory optimization here (using a RootElement subclass) /** * The attributes of the element. Subclassers have to * track attributes using their own mechanism. */ AttributeList attributes = new AttributeList(this); /** * The content of the element. Subclassers have to * track content using their own mechanism. */ ContentList content = new ContentList(this); /** * This protected constructor is provided in order to support an Element * subclass that wants full control over variable initialization. It * intentionally leaves all instance variables null, allowing a lightweight * subclass implementation. The subclass is responsible for ensuring all the * get and set methods on Element behave as documented. *

* When implementing an Element subclass which doesn't require full control * over variable initialization, be aware that simply calling super() (or * letting the compiler add the implicit super() call) will not initialize * the instance variables which will cause many of the methods to throw a * NullPointerException. Therefore, the constructor for these subclasses * should call one of the public constructors so variable initialization is * handled automatically. */ protected Element() { } /** * Creates a new element with the supplied (local) name and namespace. If * the provided namespace is null, the element will have no namespace. * * @param name local name of the element * @param namespace namespace for the element * @throws IllegalNameException if the given name is illegal as an element * name */ public Element(String name, Namespace namespace) { setName(name); setNamespace(namespace); } /** * Create a new element with the supplied (local) name and no namespace. * * @param name local name of the element * @throws IllegalNameException if the given name is illegal as an element * name. */ public Element(String name) { this(name, (Namespace) null); } /** * Creates a new element with the supplied (local) name and a namespace * given by a URI. The element will be put into the unprefixed (default) * namespace. * * @param name name of the element * @param uri namespace URI for the element * @throws IllegalNameException if the given name is illegal as an element * name or the given URI is illegal as a * namespace URI */ public Element(String name, String uri) { this(name, Namespace.getNamespace("", uri)); } /** * Creates a new element with the supplied (local) name and a namespace * given by the supplied prefix and URI combination. * * @param name local name of the element * @param prefix namespace prefix * @param uri namespace URI for the element * @throws IllegalNameException if the given name is illegal as an element * name, the given prefix is illegal as a * namespace prefix, or the given URI is * illegal as a namespace URI */ public Element(String name, String prefix, String uri) { this(name, Namespace.getNamespace(prefix, uri)); } /** * Returns the (local) name of the element (without any namespace prefix). * * @return local element name */ public String getName() { return name; } /** * Sets the (local) name of the element. * * @param name the new (local) name of the element * @return the target element * @throws IllegalNameException if the given name is illegal as an Element * name */ public Element setName(String name) { String reason = Verifier.checkElementName(name); if (reason != null) { throw new IllegalNameException(name, "element", reason); } this.name = name; return this; } /** * Returns the element's {@link Namespace}. * * @return the element's namespace */ public Namespace getNamespace() { return namespace; } /** * Sets the element's {@link Namespace}. If the provided namespace is null, * the element will have no namespace. * * @param namespace the new namespace * @return the target element */ public Element setNamespace(Namespace namespace) { if (namespace == null) { namespace = Namespace.NO_NAMESPACE; } this.namespace = namespace; return this; } /** * Returns the namespace prefix of the element or an empty string if none * exists. * * @return the namespace prefix */ public String getNamespacePrefix() { return namespace.getPrefix(); } /** * Returns the namespace URI mapped to this element's prefix (or the * in-scope default namespace URI if no prefix). If no mapping is found, an * empty string is returned. * * @return the namespace URI for this element */ public String getNamespaceURI() { return namespace.getURI(); } /** * Returns the {@link Namespace} corresponding to the given prefix in scope * for this element. This involves searching up the tree, so the results * depend on the current location of the element. Returns null if there is * no namespace in scope with the given prefix at this point in the * document. * * @param prefix namespace prefix to look up * @return the Namespace for this prefix at this * location, or null if none */ public Namespace getNamespace(String prefix) { if (prefix == null) { return null; } if (prefix.equals("xml")) { // Namespace "xml" is always bound. return Namespace.XML_NAMESPACE; } // Check if the prefix is the prefix for this element if (prefix.equals(getNamespacePrefix())) { return getNamespace(); } // Scan the additional namespaces if (additionalNamespaces != null) { for (int i = 0; i < additionalNamespaces.size(); i++) { Namespace ns = (Namespace) additionalNamespaces.get(i); if (prefix.equals(ns.getPrefix())) { return ns; } } } // If we still don't have a match, ask the parent if (parent instanceof Element) { return ((Element)parent).getNamespace(prefix); } return null; } /** * Returns the full name of the element, in the form * [namespacePrefix]:[localName]. If the element does not have a namespace * prefix, then the local name is returned. * * @return qualified name of the element (including * namespace prefix) */ public String getQualifiedName() { // Note: Any changes here should be reflected in // XMLOutputter.printQualifiedName() if (namespace.getPrefix().equals("")) { return getName(); } return new StringBuilder(namespace.getPrefix()) .append(':') .append(name) // JCLIC modification //.toString(); .substring(0); } /** * Adds a namespace declarations to this element. This should not be * used to add the declaration for this element itself; that should be * assigned in the construction of the element. Instead, this is for adding * namespace declarations on the element not relating directly to itself. * It's used during output to for stylistic reasons move namespace * declarations higher in the tree than they would have to be. * * @param additional namespace to add * @throws IllegalAddException if the namespace prefix collides with another * namespace prefix on the element */ public void addNamespaceDeclaration(Namespace additional) { // Verify the new namespace prefix doesn't collide with another // declared namespace, an attribute prefix, or this element's prefix String reason = Verifier.checkNamespaceCollision(additional, this); if (reason != null) { throw new IllegalAddException(this, additional, reason); } if (additionalNamespaces == null) { additionalNamespaces = new ArrayList(INITIAL_ARRAY_SIZE); } additionalNamespaces.add(additional); } /** * Removes an additional namespace declarations from this element. This * should not be used to remove the declaration for this element * itself; that should be handled in the construction of the element. * Instead, this is for removing namespace declarations on the element not * relating directly to itself. If the declaration is not present, this * method does nothing. * * @param additionalNamespace namespace to remove */ public void removeNamespaceDeclaration(Namespace additionalNamespace) { if (additionalNamespaces == null) { return; } additionalNamespaces.remove(additionalNamespace); } /** * Returns a list of the additional namespace declarations on this element. * This includes only additional namespace, not the namespace of the element * itself, which can be obtained through {@link #getNamespace()}. If there * are no additional declarations, this returns an empty list. Note, the * returned list is unmodifiable. * * @return a List of the additional namespace * declarations */ public List getAdditionalNamespaces() { // Not having the returned list be live allows us to avoid creating a // new list object when XMLOutputter calls this method on an element // with an empty list. if (additionalNamespaces == null) { return Collections.EMPTY_LIST; } return Collections.unmodifiableList(additionalNamespaces); } /** * Returns the XPath 1.0 string value of this element, which is the * complete, ordered content of all text node descendants of this element * (i.e. the text that's left after all references are resolved * and all other markup is stripped out.) * * @return a concatentation of all text node descendants */ public String getValue() { StringBuilder buffer = new StringBuilder(); Iterator itr = getContent().iterator(); while (itr.hasNext()) { Content child = (Content) itr.next(); if (child instanceof Element || child instanceof Text) { buffer.append(child.getValue()); } } return buffer // JCLIC modification //.toString(); .substring(0); } /** * Returns whether this element is a root element. This can be used in * tandem with {@link #getParent} to determine if an element has any * "attachments" to a parent element or document. * * @return whether this is a root element */ public boolean isRootElement() { return parent instanceof Document; } public int getContentSize() { return content.size(); } public int indexOf(Content child) { return content.indexOf(child); } // private int indexOf(int start, Filter filter) { // int size = getContentSize(); // for (int i = start; i < size; i++) { // if (filter.matches(getContent(i))) { // return i; // } // } // return -1; // } /** * Returns the textual content directly held under this element as a string. * This includes all text within this single element, including whitespace * and CDATA sections if they exist. It's essentially the concatenation of * all {@link Text} and {@link CDATA} nodes returned by {@link #getContent}. * The call does not recurse into child elements. If no textual value exists * for the element, an empty string is returned. * * @return text content for this element, or empty * string if none */ public String getText() { if (content.size() == 0) { return ""; } // If we hold only a Text or CDATA, return it directly if (content.size() == 1) { Object obj = content.get(0); if (obj instanceof Text) { return ((Text) obj).getText(); } else { return ""; } } // Else build String up StringBuilder textContent = new StringBuilder(); boolean hasText = false; for (int i = 0; i < content.size(); i++) { Object obj = content.get(i); if (obj instanceof Text) { textContent.append(((Text) obj).getText()); hasText = true; } } if (!hasText) { return ""; } else { return textContent // JCLIC modification //.toString(); .substring(0); } } /** * Returns the textual content of this element with all surrounding * whitespace removed. If no textual value exists for the element, or if * only whitespace exists, the empty string is returned. * * @return trimmed text content for this element, or * empty string if none */ public String getTextTrim() { return getText().trim(); } /** * Returns the textual content of this element with all surrounding * whitespace removed and internal whitespace normalized to a single space. * If no textual value exists for the element, or if only whitespace exists, * the empty string is returned. * * @return normalized text content for this element, or * empty string if none */ public String getTextNormalize() { return Text.normalizeString(getText()); } /** * Returns the textual content of the named child element, or null if * there's no such child. This method is a convenience because calling * getChild().getText() can throw a NullPointerException. * * @param name the name of the child * @return text content for the named child, or null if * no such child */ public String getChildText(String name) { Element child = getChild(name); if (child == null) { return null; } return child.getText(); } /** * Returns the trimmed textual content of the named child element, or null * if there's no such child. See {@link #getTextTrim()} for * details of text trimming. * * @param name the name of the child * @return trimmed text content for the named child, or * null if no such child */ public String getChildTextTrim(String name) { Element child = getChild(name); if (child == null) { return null; } return child.getTextTrim(); } /** * Returns the normalized textual content of the named child element, or * null if there's no such child. See {@link * #getTextNormalize()} for details of text normalizing. * * @param name the name of the child * @return normalized text content for the named child, * or null if no such child */ public String getChildTextNormalize(String name) { Element child = getChild(name); if (child == null) { return null; } return child.getTextNormalize(); } /** * Returns the textual content of the named child element, or null if * there's no such child. * * @param name the name of the child * @param ns the namespace of the child * @return text content for the named child, or null if * no such child */ public String getChildText(String name, Namespace ns) { Element child = getChild(name, ns); if (child == null) { return null; } return child.getText(); } /** * Returns the trimmed textual content of the named child element, or null * if there's no such child. * * @param name the name of the child * @param ns the namespace of the child * @return trimmed text content for the named child, or * null if no such child */ public String getChildTextTrim(String name, Namespace ns) { Element child = getChild(name, ns); if (child == null) { return null; } return child.getTextTrim(); } /** * Returns the normalized textual content of the named child element, or * null if there's no such child. * * @param name the name of the child * @param ns the namespace of the child * @return normalized text content for the named child, * or null if no such child */ public String getChildTextNormalize(String name, Namespace ns) { Element child = getChild(name, ns); if (child == null) { return null; } return child.getTextNormalize(); } /** * Sets the content of the element to be the text given. All existing text * content and non-text context is removed. If this element should have both * textual content and nested elements, use {@link #setContent} * instead. Setting a null text value is equivalent to setting an empty * string value. * * @param text new text content for the element * @return the target element * @throws IllegalDataException if the assigned text contains an illegal * character such as a vertical tab (as * determined by {@link * org.jdom.Verifier#checkCharacterData}) */ public Element setText(String text) { content.clear(); if (text != null) { addContent(new Text(text)); } return this; } /** * This returns the full content of the element as a List which * may contain objects of type Text, Element, * Comment, ProcessingInstruction, * CDATA, and EntityRef. * The List returned is "live" in document order and modifications * to it affect the element's actual contents. Whitespace content is * returned in its entirety. * *

* Sequential traversal through the List is best done with an Iterator * since the underlying implement of List.size() may require walking the * entire list. *

* * @return a List containing the mixed content of the * element: may contain Text, * {@link Element}, {@link Comment}, * {@link ProcessingInstruction}, * {@link CDATA}, and * {@link EntityRef} objects. */ public List getContent() { return content; } /** * Return a filter view of this Element's content. * *

* Sequential traversal through the List is best done with a Iterator * since the underlying implement of List.size() may require walking the * entire list. *

* * @param filter Filter to apply * @return List - filtered Element content */ public List getContent(Filter filter) { return content.getView(filter); } /** * Removes all child content from this parent. * * @return list of the old children detached from this parent */ public List removeContent() { List old = new ArrayList(content); content.clear(); return old; } /** * Remove all child content from this parent matching the supplied filter. * * @param filter filter to select which content to remove * @return list of the old children detached from this parent */ public List removeContent(Filter filter) { List old = new ArrayList(); Iterator itr = content.getView(filter).iterator(); while (itr.hasNext()) { Content child = (Content) itr.next(); old.add(child); itr.remove(); } return old; } /** * This sets the content of the element. The supplied List should * contain only objects of type Element, Text, * CDATA, Comment, * ProcessingInstruction, and EntityRef. * *

* When all objects in the supplied List are legal and before the new * content is added, all objects in the old content will have their * parentage set to null (no parent) and the old content list will be * cleared. This has the effect that any active list (previously obtained * with a call to {@link #getContent} or {@link #getChildren}) will also * change to reflect the new content. In addition, all objects in the * supplied List will have their parentage set to this element, but the * List itself will not be "live" and further removals and additions will * have no effect on this elements content. If the user wants to continue * working with a "live" list, then a call to setContent should be * followed by a call to {@link #getContent} or {@link #getChildren} to * obtain a "live" version of the content. *

* *

* Passing a null or empty List clears the existing content. *

* *

* In event of an exception the original content will be unchanged and * the objects in the supplied content will be unaltered. *

* * @param newContent List of content to set * @return this element modified * @throws IllegalAddException if the List contains objects of * illegal types or with existing parentage. */ public Element setContent(Collection newContent) { content.clearAndSet(newContent); return this; } /** * Replace the current child the given index with the supplied child. *

* In event of an exception the original content will be unchanged and * the supplied child will be unaltered. *

* * @param index - index of child to replace. * @param child - child to add. * @return element on which this method was invoked * @throws IllegalAddException if the supplied child is already attached * or not legal content for this parent. * @throws IndexOutOfBoundsException if index is negative or greater * than the current number of children. */ public Element setContent(int index, Content child) { content.set(index, child); return this; } /** * Replace the child at the given index whith the supplied * collection. *

* In event of an exception the original content will be unchanged and * the content in the supplied collection will be unaltered. *

* * @param index - index of child to replace. * @param collection - collection of content to add. * @return object on which this method was invoked * @throws IllegalAddException if the collection contains objects of * illegal types. * @throws IndexOutOfBoundsException if index is negative or greater * than the current number of children. */ public Parent setContent(int index, Collection collection) { content.remove(index); content.addAll(index, collection); return this; } /** * This adds text content to this element. It does not replace the * existing content as does setText(). * * @param str String to add * @return this element modified * @throws IllegalDataException if str contains an * illegal character such as a vertical tab (as determined * by {@link org.jdom.Verifier#checkCharacterData}) */ public Element addContent(String str) { return addContent(new Text(str)); } /** * Appends the child to the end of the element's content list. * * @param child child to append to end of content list * @return the element on which the method was called * @throws IllegalAddException if the given child already has a parent. */ public Element addContent(Content child) { content.add(child); return this; } /** * Appends all children in the given collection to the end of * the content list. In event of an exception during add the * original content will be unchanged and the objects in the supplied * collection will be unaltered. * * @param collection collection to append * @return the element on which the method was called * @throws IllegalAddException if any item in the collection * already has a parent or is of an inappropriate type. */ public Element addContent(Collection collection) { content.addAll(collection); return this; } /** * Inserts the child into the content list at the given index. * * @param index location for adding the collection * @param child child to insert * @return the parent on which the method was called * @throws IndexOutOfBoundsException if index is negative or beyond * the current number of children * @throws IllegalAddException if the given child already has a parent. */ public Element addContent(int index, Content child) { content.add(index, child); return this; } /** * Inserts the content in a collection into the content list * at the given index. In event of an exception the original content * will be unchanged and the objects in the supplied collection will be * unaltered. * * @param index location for adding the collection * @param c collection to insert * @return the parent on which the method was called * @throws IndexOutOfBoundsException if index is negative or beyond * the current number of children * @throws IllegalAddException if any item in the collection * already has a parent or is of an inappropriate type. */ public Element addContent(int index, Collection c) { content.addAll(index, c); return this; } public List cloneContent() { int size = getContentSize(); List list = new ArrayList(size); for (int i = 0; i < size; i++) { Content child = getContent(i); list.add(child.clone()); } return list; } public Content getContent(int index) { return (Content) content.get(index); } // public Content getChild(Filter filter) { // int i = indexOf(0, filter); // return (i < 0) ? null : getContent(i); // } public boolean removeContent(Content child) { return content.remove(child); } public Content removeContent(int index) { return (Content) content.remove(index); } /** * Set this element's content to be the supplied child. *

* If the supplied child is legal content for this parent and before * it is added, all content in the current content list will * be cleared and all current children will have their parentage set to * null. *

* This has the effect that any active list (previously obtained with * a call to one of the {@link #getContent} methods will also change * to reflect the new content. In addition, all content in the supplied * collection will have their parentage set to this parent. If the user * wants to continue working with a "live" list of this parent's * child, then a call to setContent should be followed by a call to one * of the {@link #getContent} methods to obtain a "live" * version of the children. *

* Passing a null child clears the existing content. *

* In event of an exception the original content will be unchanged and * the supplied child will be unaltered. * * @param child new content to replace existing content * @return the parent on which the method was called * @throws IllegalAddException if the supplied child is already attached * or not legal content for an Element */ public Element setContent(Content child) { content.clear(); content.add(child); return this; } /** * Determines if this element is the ancestor of another element. * * @param element Element to check against * @return true if this element is the ancestor of the * supplied element */ public boolean isAncestor(Element element) { Object p = element.getParent(); while (p instanceof Element) { if (p == this) { return true; } p = ((Element) p).getParent(); } return false; } /** *

* This returns the complete set of attributes for this element, as a * List of Attribute objects in no particular * order, or an empty list if there are none. * The returned list is "live" and changes to it affect the * element's actual attributes. *

* * @return attributes for the element */ public List getAttributes() { return attributes; } /** *

* This returns the attribute for this element with the given name * and within no namespace, or null if no such attribute exists. *

* * @param name name of the attribute to return * @return attribute for the element */ public Attribute getAttribute(String name) { return getAttribute(name, Namespace.NO_NAMESPACE); } /** *

* This returns the attribute for this element with the given name * and within the given Namespace, or null if no such attribute exists. *

* * @param name name of the attribute to return * @param ns Namespace to search within * @return attribute for the element */ public Attribute getAttribute(String name, Namespace ns) { return (Attribute) attributes.get(name, ns); } /** *

* This returns the attribute value for the attribute with the given name * and within no namespace, null if there is no such attribute, and the * empty string if the attribute value is empty. *

* * @param name name of the attribute whose value to be returned * @return the named attribute's value, or null if no such attribute */ public String getAttributeValue(String name) { return getAttributeValue(name, Namespace.NO_NAMESPACE); } /** *

* This returns the attribute value for the attribute with the given name * and within no namespace, or the passed-in default if there is no * such attribute. *

* * @param name name of the attribute whose value to be returned * @param def a default value to return if the attribute does not exist * @return the named attribute's value, or the default if no such attribute */ public String getAttributeValue(String name, String def) { return getAttributeValue(name, Namespace.NO_NAMESPACE, def); } /** *

* This returns the attribute value for the attribute with the given name * and within the given Namespace, null if there is no such attribute, and * the empty string if the attribute value is empty. *

* * @param name name of the attribute whose valud is to be returned * @param ns Namespace to search within * @return the named attribute's value, or null if no such attribute */ public String getAttributeValue(String name, Namespace ns) { return getAttributeValue(name, ns, null); } /** *

* This returns the attribute value for the attribute with the given name * and within the given Namespace, or the passed-in default if there is no * such attribute. *

* * @param name name of the attribute whose valud is to be returned * @param ns Namespace to search within * @param def a default value to return if the attribute does not exist * @return the named attribute's value, or the default if no such attribute */ public String getAttributeValue(String name, Namespace ns, String def) { Attribute attribute = (Attribute) attributes.get(name, ns); return (attribute == null) ? def : attribute.getValue(); } /** *

* This sets the attributes of the element. The supplied List should * contain only objects of type Attribute. *

* *

* When all objects in the supplied List are legal and before the new * attributes are added, all old attributes will have their * parentage set to null (no parent) and the old attribute list will be * cleared. This has the effect that any active attribute list (previously * obtained with a call to {@link #getAttributes}) will also change to * reflect the new attributes. In addition, all attributes in the supplied * List will have their parentage set to this element, but the List itself * will not be "live" and further removals and additions will have no * effect on this elements attributes. If the user wants to continue * working with a "live" attribute list, then a call to setAttributes * should be followed by a call to {@link #getAttributes} to obtain a * "live" version of the attributes. *

* *

* Passing a null or empty List clears the existing attributes. *

* *

* In cases where the List contains duplicate attributes, only the last * one will be retained. This has the same effect as calling * {@link #setAttribute(Attribute)} sequentially. *

* *

* In event of an exception the original attributes will be unchanged and * the attributes in the supplied attributes will be unaltered. *

* * @param newAttributes List of attributes to set * @return this element modified * @throws IllegalAddException if the List contains objects * that are not instances of Attribute, * or if any of the Attribute objects have * conflicting namespace prefixes. */ public Element setAttributes(List newAttributes) { attributes.clearAndSet(newAttributes); return this; } /** *

* This sets an attribute value for this element. Any existing attribute * with the same name and namespace URI is removed. *

* * @param name name of the attribute to set * @param value value of the attribute to set * @return this element modified * @throws IllegalNameException if the given name is illegal as an * attribute name. * @throws IllegalDataException if the given attribute value is * illegal character data (as determined by * {@link org.jdom.Verifier#checkCharacterData}). */ public Element setAttribute(String name, String value) { return setAttribute(new Attribute(name, value)); } /** *

* This sets an attribute value for this element. Any existing attribute * with the same name and namespace URI is removed. *

* * @param name name of the attribute to set * @param value value of the attribute to set * @param ns namespace of the attribute to set * @return this element modified * @throws IllegalNameException if the given name is illegal as an * attribute name, or if the namespace is an unprefixed default * namespace * @throws IllegalDataException if the given attribute value is * illegal character data (as determined by * {@link org.jdom.Verifier#checkCharacterData}). * @throws IllegalAddException if the attribute namespace prefix * collides with another namespace prefix on the element. */ public Element setAttribute(String name, String value, Namespace ns) { return setAttribute(new Attribute(name, value, ns)); } /** *

* This sets an attribute value for this element. Any existing attribute * with the same name and namespace URI is removed. *

* * @param attribute Attribute to set * @return this element modified * @throws IllegalAddException if the attribute being added already has a * parent or if the attribute namespace prefix collides with another * namespace prefix on the element. */ public Element setAttribute(Attribute attribute) { attributes.add(attribute); return this; } /** *

* This removes the attribute with the given name and within no * namespace. If no such attribute exists, this method does nothing. *

* * @param name name of attribute to remove * @return whether the attribute was removed */ public boolean removeAttribute(String name) { return removeAttribute(name, Namespace.NO_NAMESPACE); } /** *

* This removes the attribute with the given name and within the * given Namespace. If no such attribute exists, this method does * nothing. *

* * @param name name of attribute to remove * @param ns namespace URI of attribute to remove * @return whether the attribute was removed */ public boolean removeAttribute(String name, Namespace ns) { return attributes.remove(name, ns); } /** *

* This removes the supplied Attribute should it exist. *

* * @param attribute Reference to the attribute to be removed. * @return whether the attribute was removed */ public boolean removeAttribute(Attribute attribute) { return attributes.remove(attribute); } /** *

* This returns a String representation of the * Element, suitable for debugging. If the XML * representation of the Element is desired, * {@link org.jdom.output.XMLOutputter#outputString(Element)} * should be used. *

* * @return String - information about the * Element */ public String toString() { StringBuilder stringForm = new StringBuilder(64) .append("[Element: <") .append(getQualifiedName()); String nsuri = getNamespaceURI(); if (!nsuri.equals("")) { stringForm .append(" [Namespace: ") .append(nsuri) .append("]"); } stringForm.append("/>]"); return stringForm // JCLIC modification //.toString(); .substring(0); } /** *

* This returns a deep clone of this element. * The new element is detached from its parent, and getParent() * on the clone will return null. *

* * @return the clone of this element */ public Object clone() { // Ken Rune Helland is our local clone() guru Element element = null; element = (Element) super.clone(); // name and namespace are references to immutable objects // so super.clone() handles them ok // Reference to parent is copied by super.clone() // (Object.clone()) so we have to remove it // Actually, super is a Content, which has already detached in the clone(). // element.parent = null; // Reference to content list and attribute lists are copyed by // super.clone() so we set it new lists if the original had lists element.content = new ContentList(element); element.attributes = new AttributeList(element); // Cloning attributes if (attributes != null) { for (int i = 0; i < attributes.size(); i++) { Object obj = attributes.get(i); Attribute attribute = (Attribute)((Attribute)obj).clone(); element.attributes.add(attribute); } } // Cloning additional namespaces if (additionalNamespaces != null) { int additionalSize = additionalNamespaces.size(); element.additionalNamespaces = new ArrayList(additionalSize); for (int i = 0; i < additionalSize; i++) { Object additional = additionalNamespaces.get(i); element.additionalNamespaces.add(additional); } } // Cloning content if (content != null) { for (int i = 0; i < content.size(); i++) { Object obj = content.get(i); if (obj instanceof Element) { Element elt = (Element)((Element)obj).clone(); element.content.add(elt); } else if (obj instanceof CDATA) { CDATA cdata = (CDATA)((CDATA)obj).clone(); element.content.add(cdata); } else if (obj instanceof Text) { Text text = (Text)((Text)obj).clone(); element.content.add(text); } else if (obj instanceof Comment) { Comment comment = (Comment)((Comment)obj).clone(); element.content.add(comment); } else if (obj instanceof ProcessingInstruction) { ProcessingInstruction pi = (ProcessingInstruction) ((ProcessingInstruction)obj).clone(); element.content.add(pi); } else if (obj instanceof EntityRef) { EntityRef entity = (EntityRef)((EntityRef)obj).clone(); element.content.add(entity); } } } // Handle additional namespaces if (additionalNamespaces != null) { // Avoid additionalNamespaces.clone() because List isn't Cloneable element.additionalNamespaces = new ArrayList(); element.additionalNamespaces.addAll(additionalNamespaces); } return element; } // Support a custom Namespace serialization so no two namespace // object instances may exist for the same prefix/uri pair private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); // We use writeObject() and not writeUTF() to minimize space // This allows for writing pointers to already written strings out.writeObject(namespace.getPrefix()); out.writeObject(namespace.getURI()); if (additionalNamespaces == null) { out.write(0); } else { int size = additionalNamespaces.size(); out.write(size); for (int i = 0; i < size; i++) { Namespace additional = (Namespace) additionalNamespaces.get(i); out.writeObject(additional.getPrefix()); out.writeObject(additional.getURI()); } } } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); namespace = Namespace.getNamespace( (String)in.readObject(), (String)in.readObject()); int size = in.read(); if (size != 0) { additionalNamespaces = new ArrayList(size); for (int i = 0; i < size; i++) { Namespace additional = Namespace.getNamespace( (String)in.readObject(), (String)in.readObject()); additionalNamespaces.add(additional); } } } /** * Returns an iterator that walks over all descendants in document order. * * @return an iterator to walk descendants */ public Iterator getDescendants() { return new DescendantIterator(this); } /** * Returns an iterator that walks over all descendants in document order * applying the Filter to return only elements that match the filter rule. * With filters you can match only Elements, only Comments, Elements or * Comments, only Elements with a given name and/or prefix, and so on. * * @param filter filter to select which descendants to see * @return an iterator to walk descendants within a filter */ public Iterator getDescendants(Filter filter) { return new FilterIterator(new DescendantIterator(this), filter); } /** * This returns a List of all the child elements * nested directly (one level deep) within this element, as * Element objects. If this target element has no nested * elements, an empty List is returned. The returned list is "live" * in document order and changes to it affect the element's actual * contents. * *

* Sequential traversal through the List is best done with a Iterator * since the underlying implement of List.size() may not be the most * efficient. *

* *

* No recursion is performed, so elements nested two levels deep * would have to be obtained with: *

     * 
     *   Iterator itr = (currentElement.getChildren()).iterator();
     *   while(itr.hasNext()) {
     *     Element oneLevelDeep = (Element)itr.next();
     *     List twoLevelsDeep = oneLevelDeep.getChildren();
     *     // Do something with these children
     *   }
     * 
     * 
*

* * @return list of child Element objects for this element */ public List getChildren() { return content.getView(new ElementFilter()); } /** * This returns a List of all the child elements * nested directly (one level deep) within this element with the given * local name and belonging to no namespace, returned as * Element objects. If this target element has no nested * elements with the given name outside a namespace, an empty List * is returned. The returned list is "live" in document order * and changes to it affect the element's actual contents. *

* Please see the notes for {@link #getChildren} * for a code example. *

* * @param name local name for the children to match * @return all matching child elements */ public List getChildren(String name) { return getChildren(name, Namespace.NO_NAMESPACE); } /** * This returns a List of all the child elements * nested directly (one level deep) within this element with the given * local name and belonging to the given Namespace, returned as * Element objects. If this target element has no nested * elements with the given name in the given Namespace, an empty List * is returned. The returned list is "live" in document order * and changes to it affect the element's actual contents. *

* Please see the notes for {@link #getChildren} * for a code example. *

* * @param name local name for the children to match * @param ns Namespace to search within * @return all matching child elements */ public List getChildren(String name, Namespace ns) { return content.getView(new ElementFilter(name, ns)); } /** * This returns the first child element within this element with the * given local name and belonging to the given namespace. * If no elements exist for the specified name and namespace, null is * returned. * * @param name local name of child element to match * @param ns Namespace to search within * @return the first matching child element, or null if not found */ public Element getChild(String name, Namespace ns) { List elements = content.getView(new ElementFilter(name, ns)); Iterator i = elements.iterator(); if (i.hasNext()) { return (Element) i.next(); } return null; } /** * This returns the first child element within this element with the * given local name and belonging to no namespace. * If no elements exist for the specified name and namespace, null is * returned. * * @param name local name of child element to match * @return the first matching child element, or null if not found */ public Element getChild(String name) { return getChild(name, Namespace.NO_NAMESPACE); } /** *

* This removes the first child element (one level deep) with the * given local name and belonging to no namespace. * Returns true if a child was removed. *

* * @param name the name of child elements to remove * @return whether deletion occurred */ public boolean removeChild(String name) { return removeChild(name, Namespace.NO_NAMESPACE); } /** *

* This removes the first child element (one level deep) with the * given local name and belonging to the given namespace. * Returns true if a child was removed. *

* * @param name the name of child element to remove * @param ns Namespace to search within * @return whether deletion occurred */ public boolean removeChild(String name, Namespace ns) { List old = content.getView(new ElementFilter(name, ns)); Iterator i = old.iterator(); if (i.hasNext()) { i.next(); i.remove(); return true; } return false; } /** *

* This removes all child elements (one level deep) with the * given local name and belonging to no namespace. * Returns true if any were removed. *

* * @param name the name of child elements to remove * @return whether deletion occurred */ public boolean removeChildren(String name) { return removeChildren(name, Namespace.NO_NAMESPACE); } /** *

* This removes all child elements (one level deep) with the * given local name and belonging to the given namespace. * Returns true if any were removed. *

* * @param name the name of child elements to remove * @param ns Namespace to search within * @return whether deletion occurred */ public boolean removeChildren(String name, Namespace ns) { boolean deletedSome = false; List old = content.getView(new ElementFilter(name, ns)); Iterator i = old.iterator(); while (i.hasNext()) { i.next(); i.remove(); deletedSome = true; } return deletedSome; } } extensions/xml/jdom-1.0/src/org/jdom/EntityRef.java000066400000000000000000000206231335566474600224130ustar00rootroot00000000000000/*-- $Id: EntityRef.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * An XML entity reference. Methods allow the user to manage its name, public * id, and system id. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter * @author Philip Nelson */ public class EntityRef extends Content { private static final String CVS_ID = "@(#) $RCSfile: EntityRef.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** The name of the EntityRef */ protected String name; /** The PublicID of the EntityRef */ protected String publicID; /** The SystemID of the EntityRef */ protected String systemID; /** * Default, no-args constructor for implementations to use if needed. */ protected EntityRef() {} /** * This will create a new EntityRef with the supplied name. * * @param name String name of element. * @throws IllegalNameException if the given name is not a legal * XML name. */ public EntityRef(String name) { this(name, null, null); } /** * This will create a new EntityRef * with the supplied name and system id. * * @param name String name of element. * @param systemID system id of the entity reference being constructed * @throws IllegalNameException if the given name is not a legal * XML name. * @throws IllegalDataException if the given system ID is not a legal * system literal. */ public EntityRef(String name, String systemID) { this(name, null, systemID); } /** * This will create a new EntityRef * with the supplied name, public id, and system id. * * @param name String name of element. * @param publicID public id of the entity reference being constructed * @param systemID system id of the entity reference being constructed * @throws IllegalDataException if the given system ID is not a legal * system literal or the the given public ID is not a * legal public ID * @throws IllegalNameException if the given name is not a legal * XML name. */ public EntityRef(String name, String publicID, String systemID) { setName(name); setPublicID(publicID); setSystemID(systemID); } /** * This returns the name of the EntityRef. * * @return String - entity name. */ public String getName() { return name; } /** * Returns the empty string since entity references don't have an XPath * 1.0 string value. * @return the empty string */ public String getValue() { return ""; // entity references don't have XPath string values } /** * This will return the publid ID of this EntityRef. * If there is no public ID, then this returns null. * * @return public ID of this EntityRef */ public String getPublicID() { return publicID; } /** * This will return the system ID of this EntityRef. * If there is no system ID, then this returns null. * * @return system ID of this EntityRef */ public String getSystemID() { return systemID; } /** * This will set the name of this EntityRef. * * @param name new name of the entity * @return this EntityRef modified. * @throws IllegalNameException if the given name is not a legal * XML name. */ public EntityRef setName(String name) { // This can contain a colon so we use checkXMLName() // instead of checkElementName() String reason = Verifier.checkXMLName(name); if (reason != null) { throw new IllegalNameException(name, "EntityRef", reason); } this.name = name; return this; } /** * This will set the public ID of this EntityRef. * * @param publicID new public id * @return this EntityRef modified. * @throws IllegalDataException if the given public ID is not a legal * public ID. */ public EntityRef setPublicID(String publicID) { String reason = Verifier.checkPublicID(publicID); if (reason != null) { throw new IllegalDataException(publicID, "EntityRef", reason); } this.publicID = publicID; return this; } /** * This will set the system ID of this EntityRef. * * @param systemID new system id * @throws IllegalDataException if the given system ID is not a legal * system literal. * @return this EntityRef modified. */ public EntityRef setSystemID(String systemID) { String reason = Verifier.checkSystemLiteral(systemID); if (reason != null) { throw new IllegalDataException(systemID, "EntityRef", reason); } this.systemID = systemID; return this; } /** * This returns a String representation of the * EntityRef, suitable for debugging. * * @return String - information about the * EntityRef */ public String toString() { return new StringBuilder() .append("[EntityRef: ") .append("&") .append(name) .append(";") .append("]") // JCLIC modification //.toString(); .substring(0); } } extensions/xml/jdom-1.0/src/org/jdom/FilterIterator.java000066400000000000000000000077451335566474600234530ustar00rootroot00000000000000/*-- $Id: FilterIterator.java,v 1.1.1.1 2005/12/02 14:16:45 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; import org.jdom.filter.*; /** * Traverse a parent's children that match the supplied filter. * * @author Bradley S. Huffman * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:45 $ */ class FilterIterator implements Iterator { private Iterator iterator; private Filter filter; private Object nextObject; private static final String CVS_ID = "@(#) $RCSfile: FilterIterator.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:45 $ $Name: $"; public FilterIterator(Iterator iterator, Filter filter) { if ((iterator == null) || (filter == null)) { throw new IllegalArgumentException("null parameter"); } this.iterator = iterator; this.filter = filter; } public boolean hasNext() { if (nextObject != null) { return true; } while (iterator.hasNext()) { Object obj = iterator.next(); if (filter.matches(obj)) { nextObject = obj; return true; } } return false; } public Object next() { if (!hasNext()) { throw new NoSuchElementException(); } Object obj = nextObject; nextObject = null; return obj; } public void remove() { // XXX Could cause probs for sure if hasNext() is // called before the remove(), although that's unlikely. iterator.remove(); } } extensions/xml/jdom-1.0/src/org/jdom/IllegalAddException.java000066400000000000000000000327571335566474600243560ustar00rootroot00000000000000/*-- $Id: IllegalAddException.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * Thrown when trying to add a illegal object to a JDOM construct. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter */ public class IllegalAddException extends IllegalArgumentException { private static final String CVS_ID = "@(#) $RCSfile: IllegalAddException.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This will create an Exception indicating * that the addition of the {@link Attribute} * to the {@link Element} is illegal. * * @param base Element that Attribute * couldn't be added to * @param added Attribute that could not be added * @param reason cause of the problem */ IllegalAddException(Element base, Attribute added, String reason) { super(new StringBuilder() .append("The attribute \"") .append(added.getQualifiedName()) .append("\" could not be added to the element \"") .append(base.getQualifiedName()) .append("\": ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link Element} * to parent is illegal. * * @param base Element that the child * couldn't be added to * @param added Element that could not be added * @param reason cause of the problem */ IllegalAddException(Element base, Element added, String reason) { super(new StringBuilder() .append("The element \"") .append(added.getQualifiedName()) .append("\" could not be added as a child of \"") .append(base.getQualifiedName()) .append("\": ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link Element} * to the {@link Document} is illegal. * * @param added Element that could not be added * @param reason cause of the problem */ IllegalAddException(Element added, String reason) { super(new StringBuilder() .append("The element \"") .append(added.getQualifiedName()) .append("\" could not be added as the root of the document: ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link ProcessingInstruction} * to the {@link Element} is illegal. * * @param base Element that the * ProcessingInstruction couldn't be added to * @param added ProcessingInstruction that could not be added * @param reason cause of the problem */ IllegalAddException(Element base, ProcessingInstruction added, String reason) { super(new StringBuilder() .append("The PI \"") .append(added.getTarget()) .append("\" could not be added as content to \"") .append(base.getQualifiedName()) .append("\": ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link ProcessingInstruction} * to the {@link Document} is illegal. * * @param added ProcessingInstruction that could not be added * @param reason cause of the problem */ IllegalAddException(ProcessingInstruction added, String reason) { super(new StringBuilder() .append("The PI \"") .append(added.getTarget()) .append("\" could not be added to the top level of the document: ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link Comment} * to the {@link Element} is illegal. * * @param base Element that the Comment * couldn't be added to * @param added Comment that could not be added * @param reason cause of the problem */ IllegalAddException(Element base, Comment added, String reason) { super(new StringBuilder() .append("The comment \"") .append(added.getText()) .append("\" could not be added as content to \"") .append(base.getQualifiedName()) .append("\": ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link CDATA} * * @param base Element that the CDATA * couldn't be added to * @param added CDATA that could not be added * @param reason cause of the problem */ IllegalAddException(Element base, CDATA added, String reason) { super(new StringBuilder() .append("The CDATA \"") .append(added.getText()) .append("\" could not be added as content to \"") .append(base.getQualifiedName()) .append("\": ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link Text} * to the {@link Element} is illegal. * * @param base Element that the Comment * couldn't be added to * @param added Text that could not be added * @param reason cause of the problem */ IllegalAddException(Element base, Text added, String reason) { super(new StringBuilder() .append("The Text \"") .append(added.getText()) .append("\" could not be added as content to \"") .append(base.getQualifiedName()) .append("\": ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link Comment} * to the {@link Document} is illegal. * * @param added Comment that could not be added * @param reason cause of the problem */ IllegalAddException(Comment added, String reason) { super(new StringBuilder() .append("The comment \"") .append(added.getText()) .append("\" could not be added to the top level of the document: ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link EntityRef} * to the {@link Element} is illegal. * * @param base Element that the EntityRef * couldn't be added to * @param added EntityRef reference that could not be added * @param reason cause of the problem */ IllegalAddException(Element base, EntityRef added, String reason) { super(new StringBuilder() .append("The entity reference\"") .append(added.getName()) .append("\" could not be added as content to \"") .append(base.getQualifiedName()) .append("\": ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link Namespace} * to the {@link Element} is illegal. * * @param base Element that the Namespace * couldn't be added to * @param added Namespace that could not be added * @param reason cause of the problem */ IllegalAddException(Element base, Namespace added, String reason) { super(new StringBuilder() .append("The namespace xmlns") .append((added.getPrefix() == null || added.getPrefix().equals("")) ? "=" : ":" + added.getPrefix() + "=") .append("\"") .append(added.getURI()) .append("\" could not be added as a namespace to \"") .append(base.getQualifiedName()) .append("\": ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the addition of the {@link DocType} * to the {@link Document} is illegal. * * @param added DocType that could not be added * @param reason cause of the problem */ IllegalAddException(DocType added, String reason) { super(new StringBuilder() .append("The DOCTYPE ") .append(added.toString()) .append(" could not be added to the document: ") .append(reason) // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception with the specified * error message. * * @param reason cause of the problem */ public IllegalAddException(String reason) { super(reason); } } extensions/xml/jdom-1.0/src/org/jdom/IllegalDataException.java000066400000000000000000000114501335566474600245220ustar00rootroot00000000000000/*-- $Id: IllegalDataException.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * Thrown when illegal text is supplied to a JDOM construct. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Elliotte Rusty Harold */ public class IllegalDataException extends IllegalArgumentException { private static final String CVS_ID = "@(#) $RCSfile: IllegalDataException.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This will create an Exception indicating * that the specified data is illegal for the construct * it was supplied to. * * @param data String data that breaks rules. * @param construct String construct that data is illegal for. * @param reason String message or reason data is illegal. */ IllegalDataException(String data, String construct, String reason) { super(new StringBuilder() .append("The data \"") .append(data) .append("\" is not legal for a JDOM ") .append(construct) .append(": ") .append(reason) .append(".") // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the specified data is illegal for the construct * it was supplied to. * * @param data String data that breaks rules. * @param construct String construct that data is illegal for. */ IllegalDataException(String data, String construct) { super(new StringBuilder() .append("The data \"") .append(data) .append("\" is not legal for a JDOM ") .append(construct) .append(".") // JCLIC modification //.toString() .substring(0) ); } /** * This will create an exceptoin with the specified error message. * * @param reason cause of the problem */ public IllegalDataException(String reason) { super(reason); } } extensions/xml/jdom-1.0/src/org/jdom/IllegalNameException.java000066400000000000000000000116731335566474600245400ustar00rootroot00000000000000/*-- $Id: IllegalNameException.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * Thrown when a name is supplied in construction of a JDOM construct whose * where the name breaks XML naming conventions. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Elliotte Rusty Harold */ public class IllegalNameException extends IllegalArgumentException { private static final String CVS_ID = "@(#) $RCSfile: IllegalNameException.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This will create an Exception indicating * that the specified name is illegal for the construct * it was supplied to. * * @param name String name that breaks rules. * @param construct String name of JDOM construct * that name was supplied to. * @param reason String message or reason name is illegal. */ IllegalNameException(String name, String construct, String reason) { super(new StringBuilder() .append("The name \"") .append(name) .append("\" is not legal for JDOM/XML ") .append(construct) .append("s: ") .append(reason) .append(".") // JCLIC modification //.toString() .substring(0) ); } /** * This will create an Exception indicating * that the specified name is illegal for the construct * it was supplied to. * * @param name String name that breaks rules. * @param construct String name of JDOM construct * that name was supplied to. */ IllegalNameException(String name, String construct) { super(new StringBuilder() .append("The name \"") .append(name) .append("\" is not legal for JDOM/XML ") .append(construct) .append("s.") // JCLIC modification //.toString() .substring(0) ); } /** * Creates an exception with the specified error message. * * @param reason cause of the problem */ public IllegalNameException(String reason) { super(reason); } } extensions/xml/jdom-1.0/src/org/jdom/IllegalTargetException.java000066400000000000000000000100571335566474600251010ustar00rootroot00000000000000/*-- $Id: IllegalTargetException.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * Thrown when a target is supplied in construction of a JDOM {@link * ProcessingInstruction}, and that name breaks XML naming conventions. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin */ public class IllegalTargetException extends IllegalArgumentException { private static final String CVS_ID = "@(#) $RCSfile: IllegalTargetException.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This will create an Exception indicating * that the specified target is illegal for the * {@link ProcessingInstruction} it was supplied to. * * @param target String target that breaks rules. * @param reason String message or reason target is illegal. */ IllegalTargetException(String target, String reason) { super(new StringBuilder() .append("The target \"") .append(target) .append("\" is not legal for JDOM/XML Processing Instructions: ") .append(reason) .append(".") // JCLIC modification //.toString() .substring(0) ); } /** * Creates an exception with the specified error message. * * @param reason cause of the problem */ public IllegalTargetException(String reason) { super(reason); } } extensions/xml/jdom-1.0/src/org/jdom/JDOMException.java000066400000000000000000000303051335566474600231100ustar00rootroot00000000000000/*-- $Id: JDOMException.java,v 1.1.1.1 2005/12/02 14:16:46 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.io.*; import java.lang.reflect.*; import java.rmi.*; import java.sql.*; import org.xml.sax.*; /** * The top level exception that JDOM classes can throw. Its subclasses add * specificity to the problems that can occur using JDOM. This single exception * can be caught to handle all JDOM specific problems (some methods may throw * {@link java.io.IOException} and such). * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:46 $ * @author Brett McLaughlin * @author Jason Hunter */ public class JDOMException extends Exception { private static final String CVS_ID = "@(#) $RCSfile: JDOMException.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:46 $ $Name: $"; /** A wrapped Throwable */ private Throwable cause; /** * This will create an Exception. */ public JDOMException() { super("Error occurred in JDOM application."); } /** * This will create an Exception with the given message. * * @param message String message indicating * the problem that occurred. */ public JDOMException(String message) { super(message); } /** * This will create an Exception with the given message * and wrap another Exception. This is useful when * the originating Exception should be held on to. * * @param message String message indicating * the problem that occurred. * @param cause Throwable that caused this * to be thrown. */ public JDOMException(String message, Throwable cause) { super(message); this.cause = cause; } /** * Intializes the cause of this exception to be the specified value. * * @param cause Throwable that caused this * to be thrown. * @return a pointer to this throwable */ // Created to match the JDK 1.4 Throwable method. public Throwable initCause(Throwable cause) { this.cause = cause; return this; } /** * This returns the message for the Exception. If * there are one or more nested exceptions, their messages * are appended. * * @return String - message for Exception. */ public String getMessage() { // Get this exception's message. String msg = super.getMessage(); Throwable parent = this; Throwable child; // Look for nested exceptions. while((child = getNestedException(parent)) != null) { // Get the child's message. String msg2 = child.getMessage(); // Special case: If a SAXException has no message of its own, but has a // nested exception, then it returns the nested exception's message as its // message. We don't want to add that message twice. if (child instanceof SAXException) { Throwable grandchild = ((SAXException)child).getException(); // If the SAXException tells us that it's message is identical to // its nested exception's message, then we skip it, so we don't // add it twice. if (grandchild != null && msg2 != null && msg2.equals(grandchild.getMessage())) { msg2 = null; } } // If we found a message for the child exception, we append it. if (msg2 != null) { if (msg != null) { msg += ": " + msg2; } else { msg = msg2; } } // Any nested JDOMException will append its own children, // so we need to break out of here. if (child instanceof JDOMException) { break; } parent = child; } // Return the completed message. return msg; } /** * This prints the stack trace of the Exception. If * there is a root cause, the stack trace of the root * Exception is printed right after. */ public void printStackTrace() { // Print the stack trace for this exception. super.printStackTrace(); Throwable parent = this; Throwable child; // Print the stack trace for each nested exception. while((child = getNestedException(parent)) != null) { System.err.print("Caused by: "); child.printStackTrace(); // Any nested JDOMException will print its own children, // so we need to break out of here. if (child instanceof JDOMException) { break; } parent = child; } } /** * Prints the stack trace of the Exception to the given * PrintStream. If there is a root cause, the stack trace of the root * Exception is printed right after. * * @param s PrintStream to print to */ public void printStackTrace(PrintStream s) { // Print the stack trace for this exception. super.printStackTrace(s); Throwable parent = this; Throwable child; // Print the stack trace for each nested exception. while((child = getNestedException(parent)) != null) { s.print("Caused by: "); child.printStackTrace(s); // Any nested JDOMException will print its own children, // so we need to break out of here. if (child instanceof JDOMException) { break; } parent = child; } } /** * Prints the stack trace of the Exception to the given * PrintWriter. If there is a root cause, the stack trace of the root * Exception is printed right after. * * @param w PrintWriter to print to */ public void printStackTrace(PrintWriter w) { // Print the stack trace for this exception. super.printStackTrace(w); Throwable parent = this; Throwable child; // Print the stack trace for each nested exception. while((child = getNestedException(parent)) != null) { w.print("Caused by: "); child.printStackTrace(w); // Any nested JDOMException will print its own children, // so we need to break out of here. if (child instanceof JDOMException) { break; } parent = child; } } /** * This will return the root cause Throwable, or null * if one does not exist. * * @return Throwable - the wrapped Throwable. */ public Throwable getCause() { return cause; } // If this Throwable has a nested (child) exception, then we return it. // Otherwise we return null. private static Throwable getNestedException(Throwable parent) { if (parent instanceof JDOMException) { return ((JDOMException)parent).getCause(); } if (parent instanceof SAXException) { return ((SAXException)parent).getException(); } if (parent instanceof SQLException) { return ((SQLException)parent).getNextException(); } if (parent instanceof InvocationTargetException) { return ((InvocationTargetException)parent).getTargetException(); } if (parent instanceof ExceptionInInitializerError) { return ((ExceptionInInitializerError)parent).getException(); } if (parent instanceof RemoteException) { return ((RemoteException)parent).detail; } // These classes are not part of standard JDK 1.1 or 1.2, so we // use reflection to access them. Throwable nestedException = getNestedException(parent, "javax.naming.NamingException", "getRootCause"); if (nestedException != null) { return nestedException; } nestedException = getNestedException(parent, "javax.servlet.ServletException", "getRootCause"); if (nestedException != null) { return nestedException; } return null; } // This method uses reflection to obtain the nest exception of a Throwable. We use reflection // because the desired class may not exist in the currently-running VM. private static Throwable getNestedException( Throwable parent, String className, String methodName) { try { // See if this Throwable is of the desired type, by using isAssignableFrom(). Class testClass = Class.forName(className); Class objectClass = parent.getClass(); if (testClass.isAssignableFrom(objectClass)) { // Use reflection to call the specified method. Class[] argClasses = new Class[0]; Method method = testClass.getMethod(methodName, argClasses); Object[] args = new Object[0]; return (Throwable)method.invoke(parent, args); } } catch(Exception ex) { // Most likely, the desired class is not available in this VM. That's fine. // Even if it's caused by something else, we don't want to display an error // here, since we're already in the process of trying to display the original // error - another error here will just confuse things. } return null; } } extensions/xml/jdom-1.0/src/org/jdom/JDOMFactory.java000066400000000000000000000302411335566474600225600ustar00rootroot00000000000000/*-- $Id: JDOMFactory.java,v 1.1.1.1 2005/12/02 14:16:47 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; /** * An interface to be used by builders when constructing JDOM objects. The * DefaultJDOMFactory creates the standard top-level JDOM classes * (Element, Document, Comment, etc). Another implementation of this factory * could be used to create custom classes. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:47 $ * @author Ken Rune Holland * @author Phil Nelson * @author Bradley S. Huffman */ public interface JDOMFactory { // **** constructing Attributes **** /** *

* This will create a new Attribute with the * specified (local) name and value, and in the provided * {@link org.jdom.Namespace}. *

* * @param name String name of Attribute. * @param value String value for new attribute. */ public Attribute attribute(String name, String value, Namespace namespace); /** * This will create a new Attribute with the * specified (local) name, value, and type, and in the provided * {@link org.jdom.Namespace}. * * @param name String name of Attribute. * @param value String value for new attribute. * @param type int type for new attribute. * @param namespace Namespace namespace for new attribute. */ public Attribute attribute(String name, String value, int type, Namespace namespace); /** * This will create a new Attribute with the * specified (local) name and value, and does not place * the attribute in a {@link org.jdom.Namespace}. *

* Note: This actually explicitly puts the * Attribute in the "empty" Namespace * ({@link org.jdom.Namespace#NO_NAMESPACE}). *

* * @param name String name of Attribute. * @param value String value for new attribute. */ public Attribute attribute(String name, String value); /** * This will create a new Attribute with the * specified (local) name, value and type, and does not place * the attribute in a {@link org.jdom.Namespace}. *

* Note: This actually explicitly puts the * Attribute in the "empty" Namespace * ({@link org.jdom.Namespace#NO_NAMESPACE}). *

* * @param name String name of Attribute. * @param value String value for new attribute. * @param type int type for new attribute. */ public Attribute attribute(String name, String value, int type); // **** constructing CDATA **** /** * This creates the CDATA with the supplied text. * * @param str String content of CDATA. */ public CDATA cdata(String str); // **** constructing Text **** /** * This creates the Text with the supplied text. * * @param str String content of Text. */ public Text text(String str); // **** constructing Comment **** /** * This creates the comment with the supplied text. * * @param text String content of comment. */ public Comment comment(String text); // **** constructing DocType /** * This will create the DocType with * the specified element name and a reference to an * external DTD. * * @param elementName String name of * element being constrained. * @param publicID String public ID of * referenced DTD * @param systemID String system ID of * referenced DTD */ public DocType docType(String elementName, String publicID, String systemID); /** * This will create the DocType with * the specified element name and reference to an * external DTD. * * @param elementName String name of * element being constrained. * @param systemID String system ID of * referenced DTD */ public DocType docType(String elementName, String systemID); /** * This will create the DocType with * the specified element name * * @param elementName String name of * element being constrained. */ public DocType docType(String elementName); // **** constructing Document /** * This will create a new Document, * with the supplied {@link org.jdom.Element} * as the root element and the supplied * {@link org.jdom.DocType} declaration. * * @param rootElement Element for document root. * @param docType DocType declaration. */ public Document document(Element rootElement, DocType docType); /** * This will create a new Document, * with the supplied {@link org.jdom.Element} * as the root element and the supplied * {@link org.jdom.DocType} declaration. * * @param rootElement Element for document root. * @param docType DocType declaration. * @param baseURI the URI from which this doucment was loaded. */ public Document document(Element rootElement, DocType docType, String baseURI); /** * This will create a new Document, * with the supplied {@link org.jdom.Element} * as the root element, and no {@link org.jdom.DocType} * declaration. * * @param rootElement Element for document root */ public Document document(Element rootElement); // **** constructing Elements **** /** * This will create a new Element * with the supplied (local) name, and define * the {@link org.jdom.Namespace} to be used. * * @param name String name of element. * @param namespace Namespace to put element in. */ public Element element(String name, Namespace namespace); /** * This will create an Element in no * {@link org.jdom.Namespace}. * * @param name String name of element. */ public Element element(String name); /** * This will create a new Element with * the supplied (local) name, and specifies the URI * of the {@link org.jdom.Namespace} the Element * should be in, resulting it being unprefixed (in the default * namespace). * * @param name String name of element. * @param uri String URI for Namespace element * should be in. */ public Element element(String name, String uri); /** * This will create a new Element with * the supplied (local) name, and specifies the prefix and URI * of the {@link org.jdom.Namespace} the Element * should be in. * * @param name String name of element. * @param uri String URI for Namespace element * should be in. */ public Element element(String name, String prefix, String uri); // **** constructing ProcessingInstruction **** /** * This will create a new ProcessingInstruction * with the specified target and data. * * @param target String target of PI. * @param data Map data for PI, in * name/value pairs */ public ProcessingInstruction processingInstruction(String target, Map data); /** * This will create a new ProcessingInstruction * with the specified target and data. * * @param target String target of PI. * @param data String data for PI. */ public ProcessingInstruction processingInstruction(String target, String data); // **** constructing EntityRef **** /** * This will create a new EntityRef * with the supplied name. * * @param name String name of element. */ public EntityRef entityRef(String name); /** * This will create a new EntityRef * with the supplied name, public ID, and system ID. * * @param name String name of element. * @param publicID String public ID of element. * @param systemID String system ID of element. */ public EntityRef entityRef(String name, String publicID, String systemID); /** * This will create a new EntityRef * with the supplied name and system ID. * * @param name String name of element. * @param systemID String system ID of element. */ public EntityRef entityRef(String name, String systemID); // ===================================================================== // List manipulation // ===================================================================== public void addContent(Parent parent, Content content); public void setAttribute(Element element, Attribute a); public void addNamespaceDeclaration(Element element, Namespace additional); } extensions/xml/jdom-1.0/src/org/jdom/Namespace.java000066400000000000000000000256141335566474600224030ustar00rootroot00000000000000/*-- $Id: Namespace.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; /** * An XML namespace representation, as well as a factory for creating XML * namespace objects. Namespaces are not Serializable, however objects that use * namespaces have special logic to handle serialization manually. These classes * call the getNamespace() method on deserialization to ensure there is one * unique Namespace object for any unique prefix/uri pair. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Elliotte Rusty Harold * @author Jason Hunter * @author Wesley Biggs */ public final class Namespace { // XXX May want to use weak references to keep the maps from growing // large with extended use // XXX We may need to make the namespaces HashMap synchronized with // reader/writer locks or perhaps make Namespace no longer a flyweight. // As written, multiple put() calls may happen from different threads // concurrently and cause a ConcurrentModificationException. See // http://lists.denveronline.net/lists/jdom-interest/2000-September/003009.html. // No one has ever reported this over the many years, so don't worry yet. private static final String CVS_ID = "@(#) $RCSfile: Namespace.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * Factory list of namespaces. * Keys are prefix&URI. * Values are Namespace objects */ private static HashMap namespaces; /** Define a Namespace for when not in a namespace */ public static final Namespace NO_NAMESPACE = new Namespace("", ""); /** Define a Namespace for the standard xml prefix. */ public static final Namespace XML_NAMESPACE = new Namespace("xml", "http://www.w3.org/XML/1998/namespace"); /** The prefix mapped to this namespace */ private String prefix; /** The URI for this namespace */ private String uri; /** * This static initializer acts as a factory contructor. * It sets up storage and required initial values. */ static { namespaces = new HashMap(); // Add the "empty" namespace namespaces.put("&", NO_NAMESPACE); namespaces.put("xml&http://www.w3.org/XML/1998/namespace", XML_NAMESPACE); } /** * This will retrieve (if in existence) or create (if not) a * Namespace for the supplied prefix and URI. * * @param prefix String prefix to map to * Namespace. * @param uri String URI of new Namespace. * @return Namespace - ready to use namespace. * @throws IllegalNameException if the given prefix and uri make up * an illegal namespace name. */ public static Namespace getNamespace(String prefix, String uri) { // Sanity checking if ((prefix == null) || (prefix.trim().equals(""))) { prefix = ""; } if ((uri == null) || (uri.trim().equals(""))) { uri = ""; } // Return existing namespace if found. The preexisting namespaces // should all be legal. In other words, an illegal namespace won't // have been placed in this. Thus we can do this test before // verifying the URI and prefix. String lookup = new StringBuilder(64) .append(prefix).append('&').append(uri) // JCLIC modification //.toString(); .substring(0); Namespace preexisting = (Namespace) namespaces.get(lookup); if (preexisting != null) { return preexisting; } // Ensure proper naming String reason; if ((reason = Verifier.checkNamespacePrefix(prefix)) != null) { throw new IllegalNameException(prefix, "Namespace prefix", reason); } if ((reason = Verifier.checkNamespaceURI(uri)) != null) { throw new IllegalNameException(uri, "Namespace URI", reason); } // Unless the "empty" Namespace (no prefix and no URI), require a URI if ((!prefix.equals("")) && (uri.equals(""))) { throw new IllegalNameException("", "namespace", "Namespace URIs must be non-null and non-empty Strings"); } // Handle XML namespace mislabels. If the user requested the correct // namespace and prefix -- xml, http://www.w3.org/XML/1998/namespace // -- then it was already returned from the preexisting namespaces. // Thus any use of the xml prefix or the // http://www.w3.org/XML/1998/namespace URI at this point must be // incorrect. if (prefix.equals("xml")) { throw new IllegalNameException(prefix, "Namespace prefix", "The xml prefix can only be bound to " + "http://www.w3.org/XML/1998/namespace"); } // The erratum to Namespaces in XML 1.0 that suggests this // next check is controversial. Not everyone accepts it. if (uri.equals("http://www.w3.org/XML/1998/namespace")) { throw new IllegalNameException(uri, "Namespace URI", "The http://www.w3.org/XML/1998/namespace must be bound to " + "the xml prefix."); } // Finally, store and return Namespace ns = new Namespace(prefix, uri); namespaces.put(lookup, ns); return ns; } /** * This will retrieve (if in existence) or create (if not) a * Namespace for the supplied URI, and make it usable * as a default namespace, as no prefix is supplied. * * @param uri String URI of new Namespace. * @return Namespace - ready to use namespace. */ public static Namespace getNamespace(String uri) { return getNamespace("", uri); } /** * This constructor handles creation of a Namespace object * with a prefix and URI; it is intentionally left private * so that it cannot be invoked by external programs/code. * * @param prefix String prefix to map to this namespace. * @param uri String URI for namespace. */ private Namespace(String prefix, String uri) { this.prefix = prefix; this.uri = uri; } /** * This returns the prefix mapped to this Namespace. * * @return String - prefix for this Namespace. */ public String getPrefix() { return prefix; } /** * This returns the namespace URI for this Namespace. * * @return String - URI for this Namespace. */ public String getURI() { return uri; } /** * This tests for equality - Two Namespaces * are equal if and only if their URIs are byte-for-byte equals. * * @param ob Object to compare to this Namespace. * @return boolean - whether the supplied object is equal to * this Namespace. */ public boolean equals(Object ob) { if (this == ob) { return true; } if (ob instanceof Namespace) { // instanceof returns false if null return uri.equals(((Namespace)ob).uri); } return false; } /** * This returns a String representation of this * Namespace, suitable for use in debugging. * * @return String - information about this instance. */ public String toString() { return "[Namespace: prefix \"" + prefix + "\" is mapped to URI \"" + uri + "\"]"; } /** * This returns a probably unique hash code for the Namespace. * If two namespaces have the same URI, they are equal and have the same * hash code, even if they have different prefixes. * * @return int - hash code for this Namespace. */ public int hashCode() { return uri.hashCode(); } } extensions/xml/jdom-1.0/src/org/jdom/Parent.java000066400000000000000000000206361335566474600217370ustar00rootroot00000000000000/*-- $Id: Parent.java,v 1.1.1.1 2005/12/02 14:16:46 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.io.Serializable; import java.util.*; import org.jdom.filter.Filter; /** * Superclass for JDOM objects which are allowed to contain * {@link Content} content. * * @see org.jdom.Content * @see org.jdom.Document * @see org.jdom.Element * * @author Bradley S. Huffman * @author Jason Hunter * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:46 $ */ public interface Parent extends Cloneable, Serializable { /** * Returns the number of children in this parent's content list. * Children may be any {@link Content} type. * * @return number of children */ int getContentSize(); /** * Returns the index of the supplied child in the content list, * or -1 if not a child of this parent. * * @param child child to search for * @return index of child, or -1 if not found */ int indexOf(Content child); // /** // * Starting at the given index (inclusive), returns the index of // * the first child matching the supplied filter, or -1 // * if none is found. // * // * @return index of child, or -1 if none found // */ // int indexOf(int index, Filter filter); /** * Returns a list containing detached clones of this parent's content list. * * @return list of cloned child content */ List cloneContent(); /** * Returns the child at the given index. * * @param index location of desired child * @return child at the given index * @throws IndexOutOfBoundsException if index is negative or beyond * the current number of children * @throws IllegalStateException if parent is a Document * and the root element is not set */ Content getContent(int index); /** * Returns the full content of this parent as a {@link java.util.List} * which contains objects of type {@link Content}. The returned list is * "live" and in document order. Any modifications * to it affect the element's actual contents. Modifications are checked * for conformance to XML 1.0 rules. *

* Sequential traversal through the List is best done with an Iterator * since the underlying implement of {@link java.util.List#size} may * require walking the entire list and indexed lookups may require * starting at the beginning each time. * * @return a list of the content of the parent * @throws IllegalStateException if parent is a Document * and the root element is not set */ List getContent(); /** * Returns as a {@link java.util.List} the content of * this parent that matches the supplied filter. The returned list is * "live" and in document order. Any modifications to it affect * the element's actual contents. Modifications are checked for * conformance to XML 1.0 rules. *

* Sequential traversal through the List is best done with an Iterator * since the underlying implement of {@link java.util.List#size} may * require walking the entire list and indexed lookups may require * starting at the beginning each time. * * @param filter filter to apply * @return a list of the content of the parent matching the filter * @throws IllegalStateException if parent is a Document * and the root element is not set */ List getContent(Filter filter); /** * Removes all content from this parent and returns the detached * children. * * @return list of the old content detached from this parent */ List removeContent(); /** * Removes from this parent all child content matching the given filter * and returns a list of the detached children. * * @param filter filter to apply * @return list of the detached children matching the filter */ List removeContent(Filter filter); /** * Removes a single child node from the content list. * * @param child child to remove * @return whether the removal occurred */ boolean removeContent(Content child); /** * Removes and returns the child at the given * index, or returns null if there's no such child. * * @param index index of child to remove * @return detached child at given index or null if no * @throws IndexOutOfBoundsException if index is negative or beyond * the current number of children */ Content removeContent(int index); /** * Obtain a deep, unattached copy of this parent and it's children. * * @return a deep copy of this parent and it's children. */ Object clone(); /** * Returns an {@link java.util.Iterator} that walks over all descendants * in document order. * * @return an iterator to walk descendants */ Iterator getDescendants(); /** * Returns an {@link java.util.Iterator} that walks over all descendants * in document order applying the Filter to return only elements that * match the filter rule. With filters you can match only Elements, * only Comments, Elements or Comments, only Elements with a given name * and/or prefix, and so on. * * @param filter filter to select which descendants to see * @return an iterator to walk descendants that match a filter */ Iterator getDescendants(Filter filter); /** * Return this parent's parent, or null if this parent is currently * not attached to another parent. This is the same method as in Content but * also added to Parent to allow more easy up-the-tree walking. * * @return this parent's parent or null if none */ Parent getParent(); /** * Return this parent's owning document or null if the branch containing * this parent is currently not attached to a document. * * @return this child's owning document or null if none */ Document getDocument(); } extensions/xml/jdom-1.0/src/org/jdom/ProcessingInstruction.java000066400000000000000000000417421335566474600250650ustar00rootroot00000000000000/*-- $Id: ProcessingInstruction.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; /** * An XML processing instruction. Methods allow the user to obtain the target of * the PI as well as its data. The data can always be accessed as a String or, * if the data appears akin to an attribute list, can be retrieved as name/value * pairs. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter * @author Steven Gould */ public class ProcessingInstruction extends Content { private static final String CVS_ID = "@(#) $RCSfile: ProcessingInstruction.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** The target of the PI */ protected String target; /** The data for the PI as a String */ protected String rawData; /** The data for the PI in name/value pairs */ protected Map mapData; /** * Default, no-args constructor for implementations * to use if needed. */ protected ProcessingInstruction() { } /** * This will create a new ProcessingInstruction * with the specified target and data. * * @param target String target of PI. * @param data Map data for PI, in * name/value pairs * @throws IllegalTargetException if the given target is illegal * as a processing instruction name. */ public ProcessingInstruction(String target, Map data) { setTarget(target); setData(data); } /** * This will create a new ProcessingInstruction * with the specified target and data. * * @param target String target of PI. * @param data String data for PI. * @throws IllegalTargetException if the given target is illegal * as a processing instruction name. */ public ProcessingInstruction(String target, String data) { setTarget(target); setData(data); } /** * This will set the target for the PI. * * @param newTarget String new target of PI. * @return ProcessingInstruction - this PI modified. */ public ProcessingInstruction setTarget(String newTarget) { String reason; if ((reason = Verifier.checkProcessingInstructionTarget(newTarget)) != null) { throw new IllegalTargetException(newTarget, reason); } target = newTarget; return this; } /** * Returns the XPath 1.0 string value of this element, which is the * data of this PI. * * @return the data of this PI */ public String getValue() { return rawData; } /** * This will retrieve the target of the PI. * * @return String - target of PI. */ public String getTarget() { return target; } /** * This will return the raw data from all instructions. * * @return String - data of PI. */ public String getData() { return rawData; } /** * This will return a List containing the names of the * "attribute" style pieces of name/value pairs in this PI's data. * * @return List - the List containing the * "attribute" names. */ public List getPseudoAttributeNames() { Set mapDataSet = mapData.entrySet(); List nameList = new ArrayList(); for (Iterator i = mapDataSet.iterator(); i.hasNext();) { String wholeSet = (i.next()).toString(); String attrName = wholeSet.substring(0,(wholeSet.indexOf("="))); nameList.add(attrName); } return nameList; } /** * This will set the raw data for the PI. * * @param data String data of PI. * @return ProcessingInstruction - this PI modified. */ public ProcessingInstruction setData(String data) { String reason = Verifier.checkProcessingInstructionData(data); if (reason != null) { throw new IllegalDataException(data, reason); } this.rawData = data; this.mapData = parseData(data); return this; } /** * This will set the name/value pairs within the passed * Map as the pairs for the data of * this PI. The keys should be the pair name * and the values should be the pair values. * * @param data new map data to use * @return ProcessingInstruction - modified PI. */ public ProcessingInstruction setData(Map data) { String temp = toString(data); String reason = Verifier.checkProcessingInstructionData(temp); if (reason != null) { throw new IllegalDataException(temp, reason); } this.rawData = temp; this.mapData = data; return this; } /** * This will return the value for a specific * name/value pair on the PI. If no such pair is * found for this PI, null is returned. * * @param name String name of name/value pair * to lookup value for. * @return String - value of name/value pair. */ public String getPseudoAttributeValue(String name) { return (String)mapData.get(name); } /** * This will set a pseudo attribute with the given name and value. * If the PI data is not already in a pseudo-attribute format, this will * replace the existing data. * * @param name String name of pair. * @param value String value for pair. * @return ProcessingInstruction this PI modified. */ public ProcessingInstruction setPseudoAttribute(String name, String value) { String reason = Verifier.checkProcessingInstructionData(name); if (reason != null) { throw new IllegalDataException(name, reason); } reason = Verifier.checkProcessingInstructionData(value); if (reason != null) { throw new IllegalDataException(value, reason); } this.mapData.put(name, value); this.rawData = toString(mapData); return this; } /** * This will remove the pseudo attribute with the specified name. * * @param name name of pseudo attribute to remove * @return boolean - whether the requested * instruction was removed. */ public boolean removePseudoAttribute(String name) { if ((mapData.remove(name)) != null) { rawData = toString(mapData); return true; } return false; } /** * This will convert the Map to a string representation. * * @param mapData Map PI data to convert * @return a string representation of the Map as appropriate for a PI */ private String toString(Map mapData) { StringBuilder rawData = new StringBuilder(); Iterator i = mapData.keySet().iterator(); while (i.hasNext()) { String name = (String)i.next(); String value = (String)mapData.get(name); rawData.append(name) .append("=\"") .append(value) .append("\" "); } // Remove last space, if we did any appending if (rawData.length() > 0) { rawData.setLength(rawData.length() - 1); } return rawData // JCLIC modification //.toString(); .substring(0); } /** * This will parse and load the instructions for the PI. * This is separated to allow it to occur once and then be reused. */ private Map parseData(String rawData) { // The parsing here is done largely "by hand" which means the code // gets a little tricky/messy. The following conditions should // now be handled correctly: // Reads OK // Reads OK // Reads OK // Reads OK // Empty Map // Empty Map // Empty Map Map data = new HashMap(); // System.out.println("rawData: " + rawData); // The inputData variable holds the part of rawData left to parse String inputData = rawData.trim(); // Iterate through the remaining inputData string while (!inputData.trim().equals("")) { //System.out.println("parseData() looking at: " + inputData); // Search for "name =", "name=" or "name1 name2..." String name = ""; String value = ""; int startName = 0; char previousChar = inputData.charAt(startName); int pos = 1; for (; pos 0 && value != null) { //if (data.containsKey(name)) { // A repeat, that's a parse error, so return a null map //return new HashMap(); //} //else { data.put(name, value); //} } } return data; } /** * This is a helper routine, only used by parseData, to extract a * quoted String from the input parameter, rawData. A quoted string * can use either single or double quotes, but they must match up. * A singly quoted string can contain an unbalanced amount of double * quotes, or vice versa. For example, the String "JDOM's the best" * is legal as is 'JDOM"s the best'. * * @param rawData the input string from which a quoted string is to * be extracted. * @return the first quoted string encountered in the input data. If * no quoted string is found, then the empty string, "", is * returned. * @see #parseData */ private static int[] extractQuotedString(String rawData) { // Remembers whether we're actually in a quoted string yet boolean inQuotes = false; // Remembers which type of quoted string we're in char quoteChar = '"'; // Stores the position of the first character inside // the quoted string (i.e. the start of the return string) int start = 0; // Iterate through the input string looking for the start // and end of the quoted string for (int pos=0; pos < rawData.length(); pos++) { char currentChar = rawData.charAt(pos); if (currentChar=='"' || currentChar=='\'') { if (!inQuotes) { // We're entering a quoted string quoteChar = currentChar; inQuotes = true; start = pos+1; } else if (quoteChar == currentChar) { // We're leaving a quoted string inQuotes = false; return new int[] { start, pos }; } // Otherwise we've encountered a quote // inside a quote, so just continue } } return null; } /** * This returns a String representation of the * ProcessingInstruction, suitable for debugging. If the XML * representation of the ProcessingInstruction is desired, * {@link org.jdom.output.XMLOutputter#outputString(ProcessingInstruction)} * should be used. * * @return String - information about the * ProcessingInstruction */ public String toString() { return new StringBuilder() .append("[ProcessingInstruction: ") .append(new org.jdom.output.XMLOutputter().outputString(this)) .append("]") // JCLIC modification //.toString(); .substring(0); } /** * This will return a clone of this ProcessingInstruction. * * @return Object - clone of this * ProcessingInstruction. */ public Object clone() { ProcessingInstruction pi = (ProcessingInstruction) super.clone(); // target and rawdata are immutable and references copied by // Object.clone() // Create a new Map object for the clone (since Map isn't Cloneable) if (mapData != null) { pi.mapData = parseData(rawData); } return pi; } } extensions/xml/jdom-1.0/src/org/jdom/Text.java000066400000000000000000000221771335566474600214340ustar00rootroot00000000000000/*-- $Id: Text.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; /** * Character-based XML content. Provides a modular, parentable method of * representing text. Text makes no guarantees about the underlying textual * representation of character data, but does expose that data as a Java String. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter * @author Bradley S. Huffman */ public class Text extends Content { private static final String CVS_ID = "@(#) $RCSfile: Text.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; static final String EMPTY_STRING = ""; /** The actual character content */ // XXX See http://www.servlets.com/archive/servlet/ReadMsg?msgId=8612 // from elharo for a description of why Java characters may not suffice // long term protected String value; /** * This is the protected, no-args constructor standard in all JDOM * classes. It allows subclassers to get a raw instance with no * initialization. */ protected Text() { } /** * This constructor creates a new Text node, with the * supplied string value as it's character content. * * @param str the node's character content. * @throws IllegalDataException if str contains an * illegal character such as a vertical tab (as determined * by {@link org.jdom.Verifier#checkCharacterData}) */ public Text(String str) { setText(str); } /** * This returns the value of this Text node as a Java * String. * * @return String - character content of this node. */ public String getText() { return value; } /** * This returns the textual content with all surrounding whitespace * removed. If only whitespace exists, the empty string is returned. * * @return trimmed text content or empty string */ public String getTextTrim() { return getText().trim(); } /** * This returns the textual content with all surrounding whitespace * removed and internal whitespace normalized to a single space. If * only whitespace exists, the empty string is returned. * * @return normalized text content or empty string */ public String getTextNormalize() { return normalizeString(getText()); } /** * This returns a new string with all surrounding whitespace * removed and internal whitespace normalized to a single space. If * only whitespace exists, the empty string is returned. *

* Per XML 1.0 Production 3 whitespace includes: #x20, #x9, #xD, #xA *

* * @param str string to be normalized. * @return normalized string or empty string */ public static String normalizeString(String str) { if (str == null) return EMPTY_STRING; char[] c = str.toCharArray(); char[] n = new char[c.length]; boolean white = true; int pos = 0; for (int i = 0; i < c.length; i++) { if (" \t\n\r".indexOf(c[i]) != -1) { if (!white) { n[pos++] = ' '; white = true; } } else { n[pos++] = c[i]; white = false; } } if (white && pos > 0) { pos--; } return new String(n, 0, pos); } /** * This will set the value of this Text node. * * @param str value for node's content. * @return the object on which the method was invoked * @throws IllegalDataException if str contains an * illegal character such as a vertical tab (as determined * by {@link org.jdom.Verifier#checkCharacterData}) */ public Text setText(String str) { String reason; if (str == null) { value = EMPTY_STRING; return this; } if ((reason = Verifier.checkCharacterData(str)) != null) { throw new IllegalDataException(str, "character content", reason); } value = str; return this; } /** * This will append character content to whatever content already * exists within this Text node. * * @param str character content to append. * @throws IllegalDataException if str contains an * illegal character such as a vertical tab (as determined * by {@link org.jdom.Verifier#checkCharacterData}) */ public void append(String str) { String reason; if (str == null) { return; } if ((reason = Verifier.checkCharacterData(str)) != null) { throw new IllegalDataException(str, "character content", reason); } if (str == EMPTY_STRING) value = str; else value += str; } /** * This will append the content of another Text node * to this node. * * @param text Text node to append. */ public void append(Text text) { if (text == null) { return; } value += text.getText(); } /** * Returns the XPath 1.0 string value of this element, which is the * text itself. * * @return the text */ public String getValue() { return value; } /** * This returns a String representation of the * Text node, suitable for debugging. If the XML * representation of the Text node is desired, * either {@link #getText} or * {@link org.jdom.output.XMLOutputter#outputString(Text)} * should be used. * * @return String - information about this node. */ public String toString() { return new StringBuilder(64) .append("[Text: ") .append(getText()) .append("]") // JCLIC modification //.toString(); .substring(0); } /** * This will return a clone of this Text node, with the * same character content, but no parent. * * @return Text - cloned node. */ public Object clone() { Text text = (Text)super.clone(); text.value = value; return text; } } extensions/xml/jdom-1.0/src/org/jdom/UncheckedJDOMFactory.java000066400000000000000000000162151335566474600243770ustar00rootroot00000000000000package org.jdom; import java.util.*; /** * Special factory for building documents without any content or structure * checking. This should only be used when you are 100% positive that the * input is absolutely correct. This factory can speed builds, but any * problems in the input will be uncaught until later when they could cause * infinite loops, malformed XML, or worse. Use with extreme caution. */ public class UncheckedJDOMFactory implements JDOMFactory { // ===================================================================== // Element Factory // ===================================================================== public Element element(String name, Namespace namespace) { Element e = new Element(); e.name = name; if (namespace == null) { namespace = Namespace.NO_NAMESPACE; } e.namespace = namespace; return e; } public Element element(String name) { Element e = new Element(); e.name = name; e.namespace = Namespace.NO_NAMESPACE; return e; } public Element element(String name, String uri) { return element(name, Namespace.getNamespace("", uri)); } public Element element(String name, String prefix, String uri) { return element(name, Namespace.getNamespace(prefix, uri)); } // ===================================================================== // Attribute Factory // ===================================================================== public Attribute attribute(String name, String value, Namespace namespace) { Attribute a = new Attribute(); a.name = name; a.value = value; if (namespace == null) { namespace = Namespace.NO_NAMESPACE; } a.namespace = namespace; return a; } public Attribute attribute(String name, String value, int type, Namespace namespace) { Attribute a = new Attribute(); a.name = name; a.type = type; a.value = value; if (namespace == null) { namespace = Namespace.NO_NAMESPACE; } a.namespace = namespace; return a; } public Attribute attribute(String name, String value) { Attribute a = new Attribute(); a.name = name; a.value = value; a.namespace = Namespace.NO_NAMESPACE; return a; } public Attribute attribute(String name, String value, int type) { Attribute a = new Attribute(); a.name = name; a.type = type; a.value = value; a.namespace = Namespace.NO_NAMESPACE; return a; } // ===================================================================== // Text Factory // ===================================================================== public Text text(String str) { Text t = new Text(); t.value = str; return t; } // ===================================================================== // CDATA Factory // ===================================================================== public CDATA cdata(String str) { CDATA c = new CDATA(); c.value = str; return c; } // ===================================================================== // Comment Factory // ===================================================================== public Comment comment(String str) { Comment c = new Comment(); c.text = str; return c; } // ===================================================================== // Processing Instruction Factory // ===================================================================== public ProcessingInstruction processingInstruction(String target, Map data) { ProcessingInstruction p = new ProcessingInstruction(); p.target = target; p.setData(data); return p; } public ProcessingInstruction processingInstruction(String target, String data) { ProcessingInstruction p = new ProcessingInstruction(); p.target = target; p.setData(data); return p; } // ===================================================================== // Entity Ref Factory // ===================================================================== public EntityRef entityRef(String name) { EntityRef e = new org.jdom.EntityRef(); e.name = name; return e; } public EntityRef entityRef(String name, String systemID) { EntityRef e = new EntityRef(); e.name = name; e.systemID = systemID; return e; } public EntityRef entityRef(String name, String publicID, String systemID) { EntityRef e = new EntityRef(); e.name = name; e.publicID = publicID; e.systemID = systemID; return e; } // ===================================================================== // DocType Factory // ===================================================================== public DocType docType(String elementName, String publicID, String systemID) { DocType d = new DocType(); d.elementName = elementName; d.publicID = publicID; d.systemID = systemID; return d; } public DocType docType(String elementName, String systemID) { return docType(elementName, null, systemID); } public DocType docType(String elementName) { return docType(elementName, null, null); } // ===================================================================== // Document Factory // ===================================================================== public Document document(Element rootElement, DocType docType, String baseURI) { Document d = new Document(); if (docType != null) { addContent(d, docType); } if (rootElement != null) { addContent(d, rootElement); } if (baseURI != null) { d.baseURI = baseURI; } return d; } public Document document(Element rootElement, DocType docType) { return document(rootElement, docType, null); } public Document document(Element rootElement) { return document(rootElement, null, null); } // ===================================================================== // List manipulation // ===================================================================== public void addContent(Parent parent, Content child) { if (parent instanceof Element) { Element elt = (Element) parent; elt.content.uncheckedAddContent(child); } else { Document doc = (Document) parent; doc.content.uncheckedAddContent(child); } } public void setAttribute(Element parent, Attribute a) { parent.attributes.uncheckedAddAttribute(a); } public void addNamespaceDeclaration(Element parent, Namespace additional) { if (parent.additionalNamespaces == null) { parent.additionalNamespaces = new ArrayList(5); //Element.INITIAL_ARRAY_SIZE } parent.additionalNamespaces.add(additional); } } extensions/xml/jdom-1.0/src/org/jdom/Verifier.java000066400000000000000000001450141335566474600222570ustar00rootroot00000000000000/*-- $Id: Verifier.java,v 1.1.1.1 2005/12/02 14:16:49 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom; import java.util.*; /** * A utility class to handle well-formedness checks on names, data, and other * verification tasks for JDOM. The class is final and may not be subclassed. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:49 $ * @author Brett McLaughlin * @author Elliotte Rusty Harold * @author Jason Hunter * @author Bradley S. Huffman */ final public class Verifier { private static final String CVS_ID = "@(#) $RCSfile: Verifier.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:49 $ $Name: $"; /** * Ensure instantation cannot occur. */ private Verifier() { } /** * This will check the supplied name to see if it is legal for use as * a JDOM {@link Element} name. * * @param name String name to check. * @return String reason name is illegal, or * null if name is OK. */ public static String checkElementName(String name) { // Check basic XML name rules first String reason; if ((reason = checkXMLName(name)) != null) { return reason; } // No colons allowed, since elements handle this internally if (name.indexOf(":") != -1) { return "Element names cannot contain colons"; } // If we got here, everything is OK return null; } /** * This will check the supplied name to see if it is legal for use as * a JDOM {@link Attribute} name. * * @param name String name to check. * @return String reason name is illegal, or * null if name is OK. */ public static String checkAttributeName(String name) { // Check basic XML name rules first String reason; if ((reason = checkXMLName(name)) != null) { return reason; } // No colons are allowed, since attributes handle this internally if (name.indexOf(":") != -1) { return "Attribute names cannot contain colons"; } // Attribute names may not be xmlns since we do this internally too if (name.equals("xmlns")) { return "An Attribute name may not be \"xmlns\"; " + "use the Namespace class to manage namespaces"; } // If we got here, everything is OK return null; } /** * This will check the supplied string to see if it only contains * characters allowed by the XML 1.0 specification. The C0 controls * (e.g. null, vertical tab, formfeed, etc.) are specifically excluded * except for carriage return, linefeed, and the horizontal tab. * Surrogates are also excluded. *

* This method is useful for checking element content and attribute * values. Note that characters * like " and < are allowed in attribute values and element content. * They will simply be escaped as " or < * when the value is serialized. *

* * @param text String value to check. * @return String reason name is illegal, or * null if name is OK. */ public static String checkCharacterData(String text) { if (text == null) { return "A null is not a legal XML value"; } // Do check for (int i = 0, len = text.length(); i= 0xD800 && ch <= 0xDBFF) { // Check if next char is the low-surrogate i++; if (i < len) { char low = text.charAt(i); if (low < 0xDC00 || low > 0xDFFF) { return "Illegal Surrogate Pair"; } // It's a good pair, calculate the true value of // the character to then fall thru to isXMLCharacter ch = 0x10000 + (ch - 0xD800) * 0x400 + (low - 0xDC00); } else { return "Surrogate Pair Truncated"; } } if (!isXMLCharacter(ch)) { // Likely this character can't be easily displayed // because it's a control so we use it'd hexadecimal // representation in the reason. return ("0x" + Integer.toHexString(ch) + " is not a legal XML character"); } } // If we got here, everything is OK return null; } /** * This will check the supplied data to see if it is legal for use as * JDOM {@link CDATA}. * * @param data String data to check. * @return String reason data is illegal, or * null is name is OK. */ public static String checkCDATASection(String data) { String reason = null; if ((reason = checkCharacterData(data)) != null) { return reason; } if (data.indexOf("]]>") != -1) { return "CDATA cannot internally contain a CDATA ending " + "delimiter (]]>)"; } // If we got here, everything is OK return null; } /** * This will check the supplied name to see if it is legal for use as * a JDOM {@link Namespace} prefix. * * @param prefix String prefix to check. * @return String reason name is illegal, or * null if name is OK. */ public static String checkNamespacePrefix(String prefix) { // Manually do rules, since URIs can be null or empty if ((prefix == null) || (prefix.equals(""))) { return null; } // Cannot start with a number char first = prefix.charAt(0); if (isXMLDigit(first)) { return "Namespace prefixes cannot begin with a number"; } // Cannot start with a $ if (first == '$') { return "Namespace prefixes cannot begin with a dollar sign ($)"; } // Cannot start with a - if (first == '-') { return "Namespace prefixes cannot begin with a hyphen (-)"; } // Cannot start with a . if (first == '.') { return "Namespace prefixes cannot begin with a period (.)"; } // Cannot start with "xml" in any character case if (prefix.toLowerCase().startsWith("xml")) { return "Namespace prefixes cannot begin with " + "\"xml\" in any combination of case"; } // Ensure legal content for (int i=0, len = prefix.length(); i{@link Namespace} URI. * * @param uri String URI to check. * @return String reason name is illegal, or * null if name is OK. */ public static String checkNamespaceURI(String uri) { // Manually do rules, since URIs can be null or empty if ((uri == null) || (uri.equals(""))) { return null; } // Cannot start with a number char first = uri.charAt(0); if (Character.isDigit(first)) { return "Namespace URIs cannot begin with a number"; } // Cannot start with a $ if (first == '$') { return "Namespace URIs cannot begin with a dollar sign ($)"; } // Cannot start with a - if (first == '-') { return "Namespace URIs cannot begin with a hyphen (-)"; } // If we got here, everything is OK return null; } /** * Check if two namespaces collide. * * @param namespace Namespace to check. * @param other Namespace to check against. * @return String reason for collision, or * null if no collision. */ public static String checkNamespaceCollision(Namespace namespace, Namespace other) { String p1,p2,u1,u2,reason; reason = null; p1 = namespace.getPrefix(); u1 = namespace.getURI(); p2 = other.getPrefix(); u2 = other.getURI(); if (p1.equals(p2) && !u1.equals(u2)) { reason = "The namespace prefix \"" + p1 + "\" collides"; } return reason; } /** * Check if {@link Attribute}'s namespace collides with a * {@link Element}'s namespace. * * @param attribute Attribute to check. * @param element Element to check against. * @return String reason for collision, or * null if no collision. */ public static String checkNamespaceCollision(Attribute attribute, Element element) { Namespace namespace = attribute.getNamespace(); String prefix = namespace.getPrefix(); if ("".equals(prefix)) { return null; } return checkNamespaceCollision(namespace, element); } /** * Check if a {@link Namespace} collides with a * {@link Element}'s namespace. * * @param namespace Namespace to check. * @param element Element to check against. * @return String reason for collision, or * null if no collision. */ public static String checkNamespaceCollision(Namespace namespace, Element element) { String reason = checkNamespaceCollision(namespace, element.getNamespace()); if (reason != null) { return reason + " with the element namespace prefix"; } reason = checkNamespaceCollision(namespace, element.getAdditionalNamespaces()); if (reason != null) { return reason; } reason = checkNamespaceCollision(namespace, element.getAttributes()); if (reason != null) { return reason; } return null; } /** * Check if a {@link Namespace} collides with a * {@link Attribute}'s namespace. * * @param namespace Namespace to check. * @param attribute Attribute to check against. * @return String reason for collision, or * null if no collision. */ public static String checkNamespaceCollision(Namespace namespace, Attribute attribute) { String reason = checkNamespaceCollision(namespace, attribute.getNamespace()); if (reason != null) { reason += " with an attribute namespace prefix on the element"; } return reason; } /** * Check if a {@link Namespace} collides with any namespace * from a list of objects. * * @param namespace Namespace to check. * @param list List to check against. * @return String reason for collision, or * null if no collision. */ public static String checkNamespaceCollision(Namespace namespace, List list) { if (list == null) { return null; } String reason = null; Iterator i = list.iterator(); while ((reason == null) && i.hasNext()) { Object obj = i.next(); if (obj instanceof Attribute) { reason = checkNamespaceCollision(namespace, (Attribute) obj); } else if (obj instanceof Element) { reason = checkNamespaceCollision(namespace, (Element) obj); } else if (obj instanceof Namespace) { reason = checkNamespaceCollision(namespace, (Namespace) obj); if (reason != null) { reason += " with an additional namespace declared" + " by the element"; } } } return reason; } /** * This will check the supplied data to see if it is legal for use as * a JDOM {@link ProcessingInstruction} target. * * @param target String target to check. * @return String reason target is illegal, or * null if target is OK. */ public static String checkProcessingInstructionTarget(String target) { // Check basic XML name rules first String reason; if ((reason = checkXMLName(target)) != null) { return reason; } // No colons allowed, per Namespace Specification Section 6 if (target.indexOf(":") != -1) { return "Processing instruction targets cannot contain colons"; } // Cannot begin with 'xml' in any case if (target.equalsIgnoreCase("xml")) { return "Processing instructions cannot have a target of " + "\"xml\" in any combination of case. (Note that the " + "\"\" declaration at the beginning of a " + "document is not a processing instruction and should not " + "be added as one; it is written automatically during " + "output, e.g. by XMLOutputter.)"; } // If we got here, everything is OK return null; } /** * This will check the supplied data to see if it is legal for use as * {@link ProcessingInstruction} data. Besides checking that * all the characters are allowed in XML, this also checks * that the data does not contain the PI end-string "?>". * * @param data String data to check. * @return String reason data is illegal, or * null if data is OK. */ public static String checkProcessingInstructionData(String data) { // Check basic XML name rules first String reason = checkCharacterData(data); if (reason == null) { if (data.indexOf("?>") >= 0) { return "Processing instructions cannot contain " + "the string \"?>\""; } } return reason; } /** * This will check the supplied data to see if it is legal for use as * JDOM {@link Comment} data. * * @param data String data to check. * @return String reason data is illegal, or * null if data is OK. */ public static String checkCommentData(String data) { String reason = null; if ((reason = checkCharacterData(data)) != null) { return reason; } if (data.indexOf("--") != -1) { return "Comments cannot contain double hyphens (--)"; } if (data.startsWith("-")) { return "Comment data cannot start with a hyphen."; } if (data.endsWith("-")) { return "Comment data cannot end with a hyphen."; } // If we got here, everything is OK return null; } // [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | // [-'()+,./:=?;*#@$_%] public static boolean isXMLPublicIDCharacter(char c) { if (c >= 'a' && c <= 'z') return true; if (c >= '?' && c <= 'Z') return true; if (c >= '\'' && c <= ';') return true; if (c == ' ') return true; if (c == '!') return true; if (c == '=') return true; if (c == '#') return true; if (c == '$') return true; if (c == '_') return true; if (c == '%') return true; if (c == '\n') return true; if (c == '\r') return true; if (c == '\t') return true; return false; } /** * This will ensure that the data for a public identifier * is legal. * * @param publicID String public ID to check. * @return String reason public ID is illegal, or * null if public ID is OK. */ public static String checkPublicID(String publicID) { String reason = null; if (publicID == null) return null; // This indicates there is no public ID for (int i = 0; i < publicID.length(); i++) { char c = publicID.charAt(i); if (!isXMLPublicIDCharacter(c)) { reason = c + " is not a legal character in public IDs"; break; } } return reason; } /** * This will ensure that the data for a system literal * is legal. * * @param systemLiteral String system literal to check. * @return String reason system literal is illegal, or * null if system literal is OK. */ public static String checkSystemLiteral(String systemLiteral) { String reason = null; if (systemLiteral == null) return null; // This indicates there is no system ID if (systemLiteral.indexOf('\'') != -1 && systemLiteral.indexOf('"') != -1) { reason = "System literals cannot simultaneously contain both single and double quotes."; } else { reason = checkCharacterData(systemLiteral); } return reason; } /** * This is a utility function for sharing the base process of checking * any XML name. * * @param name String to check for XML name compliance. * @return String reason the name is illegal, or * null if OK. */ public static String checkXMLName(String name) { // Cannot be empty or null if ((name == null) || (name.length() == 0) || (name.trim().equals(""))) { return "XML names cannot be null or empty"; } // Cannot start with a number char first = name.charAt(0); if (!isXMLNameStartCharacter(first)) { return "XML names cannot begin with the character \"" + first + "\""; } // Ensure legal content for non-first chars for (int i=1, len = name.length(); i * Checks a string to see if it is a legal RFC 2396 URI. * Both absolute and relative URIs are supported. *

* * @param uri String to check. * @return String reason the URI is illegal, or * null if OK. */ public static String checkURI(String uri) { // URIs can be null or empty if ((uri == null) || (uri.equals(""))) { return null; } for (int i = 0; i < uri.length(); i++) { char test = uri.charAt(i); if (!isURICharacter(test)) { String msgNumber = "0x" + Integer.toHexString(test); if (test <= 0x09) msgNumber = "0x0" + Integer.toHexString(test); return "URIs cannot contain " + msgNumber; } // end if if (test == '%') { // must be followed by two hexadecimal digits try { char firstDigit = uri.charAt(i+1); char secondDigit = uri.charAt(i+2); if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit)) { return "Percent signs in URIs must be followed by " + "exactly two hexadecimal digits."; } } catch (StringIndexOutOfBoundsException e) { return "Percent signs in URIs must be followed by " + "exactly two hexadecimal digits."; } } } // end for // If we got here, everything is OK return null; } /** *

*

* This is a utility function for determining whether a specified * Unicode character is a hexadecimal digit as defined in RFC 2396; * that is, one of the ASCII characters 0-9, a-f, or A-F *

* * @param c to check for hex digit. * @return true if it's allowed, false otherwise. */ public static boolean isHexDigit(char c) { // I suspect most characters passed to this method will be // correct hexadecimal digits, so I test for the true cases // first. If this proves to be a performance bottleneck // a switch statement or lookup table // might optimize this. if (c >= '0' && c <= '9') return true; if (c >= 'A' && c <= 'F') return true; if (c >= 'a' && c <= 'f') return true; return false; } /** *

* This is a utility function for determining whether * a specified Unicode character is legal in URI references * as determined by RFC 2396. *

* * @param c char to check for URI reference compliance. * @return true if it's allowed, false otherwise. */ public static boolean isURICharacter(char c) { if (c >= 'a' && c <= 'z') return true; if (c >= 'A' && c <= 'Z') return true; if (c >= '0' && c <= '9') return true; if (c == '/') return true; if (c == '-') return true; if (c == '.') return true; if (c == '?') return true; if (c == ':') return true; if (c == '@') return true; if (c == '&') return true; if (c == '=') return true; if (c == '+') return true; if (c == '$') return true; if (c == ',') return true; if (c == '%') return true; if (c == '_') return true; if (c == '!') return true; if (c == '~') return true; if (c == '*') return true; if (c == '\'') return true; if (c == '(') return true; if (c == ')') return true; return false; } /** * This is a utility function for determining whether a specified * character is a character according to production 2 of the * XML 1.0 specification. * * @param c char to check for XML compliance * @return boolean true if it's a character, * false otherwise */ public static boolean isXMLCharacter(int c) { if (c == '\n') return true; if (c == '\r') return true; if (c == '\t') return true; if (c < 0x20) return false; if (c <= 0xD7FF) return true; if (c < 0xE000) return false; if (c <= 0xFFFD) return true; if (c < 0x10000) return false; if (c <= 0x10FFFF) return true; return false; } /** * This is a utility function for determining whether a specified * character is a name character according to production 4 of the * XML 1.0 specification. * * @param c char to check for XML name compliance. * @return boolean true if it's a name character, * false otherwise. */ public static boolean isXMLNameCharacter(char c) { return (isXMLLetter(c) || isXMLDigit(c) || c == '.' || c == '-' || c == '_' || c == ':' || isXMLCombiningChar(c) || isXMLExtender(c)); } /** * This is a utility function for determining whether a specified * character is a legal name start character according to production 5 * of the XML 1.0 specification. This production does allow names * to begin with colons which the Namespaces in XML Recommendation * disallows. * * @param c char to check for XML name start compliance. * @return boolean true if it's a name start character, * false otherwise. */ public static boolean isXMLNameStartCharacter(char c) { return (isXMLLetter(c) || c == '_' || c ==':'); } /** * This is a utility function for determining whether a specified * character is a letter or digit according to productions 84 and 88 * of the XML 1.0 specification. * * @param c char to check. * @return boolean true if it's letter or digit, * false otherwise. */ public static boolean isXMLLetterOrDigit(char c) { return (isXMLLetter(c) || isXMLDigit(c)); } /** * This is a utility function for determining whether a specified character * is a letter according to production 84 of the XML 1.0 specification. * * @param c char to check for XML name compliance. * @return String true if it's a letter, false otherwise. */ public static boolean isXMLLetter(char c) { // Note that order is very important here. The search proceeds // from lowest to highest values, so that no searching occurs // above the character's value. BTW, the first line is equivalent to: // if (c >= 0x0041 && c <= 0x005A) return true; if (c < 0x0041) return false; if (c <= 0x005a) return true; if (c < 0x0061) return false; if (c <= 0x007A) return true; if (c < 0x00C0) return false; if (c <= 0x00D6) return true; if (c < 0x00D8) return false; if (c <= 0x00F6) return true; if (c < 0x00F8) return false; if (c <= 0x00FF) return true; if (c < 0x0100) return false; if (c <= 0x0131) return true; if (c < 0x0134) return false; if (c <= 0x013E) return true; if (c < 0x0141) return false; if (c <= 0x0148) return true; if (c < 0x014A) return false; if (c <= 0x017E) return true; if (c < 0x0180) return false; if (c <= 0x01C3) return true; if (c < 0x01CD) return false; if (c <= 0x01F0) return true; if (c < 0x01F4) return false; if (c <= 0x01F5) return true; if (c < 0x01FA) return false; if (c <= 0x0217) return true; if (c < 0x0250) return false; if (c <= 0x02A8) return true; if (c < 0x02BB) return false; if (c <= 0x02C1) return true; if (c == 0x0386) return true; if (c < 0x0388) return false; if (c <= 0x038A) return true; if (c == 0x038C) return true; if (c < 0x038E) return false; if (c <= 0x03A1) return true; if (c < 0x03A3) return false; if (c <= 0x03CE) return true; if (c < 0x03D0) return false; if (c <= 0x03D6) return true; if (c == 0x03DA) return true; if (c == 0x03DC) return true; if (c == 0x03DE) return true; if (c == 0x03E0) return true; if (c < 0x03E2) return false; if (c <= 0x03F3) return true; if (c < 0x0401) return false; if (c <= 0x040C) return true; if (c < 0x040E) return false; if (c <= 0x044F) return true; if (c < 0x0451) return false; if (c <= 0x045C) return true; if (c < 0x045E) return false; if (c <= 0x0481) return true; if (c < 0x0490) return false; if (c <= 0x04C4) return true; if (c < 0x04C7) return false; if (c <= 0x04C8) return true; if (c < 0x04CB) return false; if (c <= 0x04CC) return true; if (c < 0x04D0) return false; if (c <= 0x04EB) return true; if (c < 0x04EE) return false; if (c <= 0x04F5) return true; if (c < 0x04F8) return false; if (c <= 0x04F9) return true; if (c < 0x0531) return false; if (c <= 0x0556) return true; if (c == 0x0559) return true; if (c < 0x0561) return false; if (c <= 0x0586) return true; if (c < 0x05D0) return false; if (c <= 0x05EA) return true; if (c < 0x05F0) return false; if (c <= 0x05F2) return true; if (c < 0x0621) return false; if (c <= 0x063A) return true; if (c < 0x0641) return false; if (c <= 0x064A) return true; if (c < 0x0671) return false; if (c <= 0x06B7) return true; if (c < 0x06BA) return false; if (c <= 0x06BE) return true; if (c < 0x06C0) return false; if (c <= 0x06CE) return true; if (c < 0x06D0) return false; if (c <= 0x06D3) return true; if (c == 0x06D5) return true; if (c < 0x06E5) return false; if (c <= 0x06E6) return true; if (c < 0x0905) return false; if (c <= 0x0939) return true; if (c == 0x093D) return true; if (c < 0x0958) return false; if (c <= 0x0961) return true; if (c < 0x0985) return false; if (c <= 0x098C) return true; if (c < 0x098F) return false; if (c <= 0x0990) return true; if (c < 0x0993) return false; if (c <= 0x09A8) return true; if (c < 0x09AA) return false; if (c <= 0x09B0) return true; if (c == 0x09B2) return true; if (c < 0x09B6) return false; if (c <= 0x09B9) return true; if (c < 0x09DC) return false; if (c <= 0x09DD) return true; if (c < 0x09DF) return false; if (c <= 0x09E1) return true; if (c < 0x09F0) return false; if (c <= 0x09F1) return true; if (c < 0x0A05) return false; if (c <= 0x0A0A) return true; if (c < 0x0A0F) return false; if (c <= 0x0A10) return true; if (c < 0x0A13) return false; if (c <= 0x0A28) return true; if (c < 0x0A2A) return false; if (c <= 0x0A30) return true; if (c < 0x0A32) return false; if (c <= 0x0A33) return true; if (c < 0x0A35) return false; if (c <= 0x0A36) return true; if (c < 0x0A38) return false; if (c <= 0x0A39) return true; if (c < 0x0A59) return false; if (c <= 0x0A5C) return true; if (c == 0x0A5E) return true; if (c < 0x0A72) return false; if (c <= 0x0A74) return true; if (c < 0x0A85) return false; if (c <= 0x0A8B) return true; if (c == 0x0A8D) return true; if (c < 0x0A8F) return false; if (c <= 0x0A91) return true; if (c < 0x0A93) return false; if (c <= 0x0AA8) return true; if (c < 0x0AAA) return false; if (c <= 0x0AB0) return true; if (c < 0x0AB2) return false; if (c <= 0x0AB3) return true; if (c < 0x0AB5) return false; if (c <= 0x0AB9) return true; if (c == 0x0ABD) return true; if (c == 0x0AE0) return true; if (c < 0x0B05) return false; if (c <= 0x0B0C) return true; if (c < 0x0B0F) return false; if (c <= 0x0B10) return true; if (c < 0x0B13) return false; if (c <= 0x0B28) return true; if (c < 0x0B2A) return false; if (c <= 0x0B30) return true; if (c < 0x0B32) return false; if (c <= 0x0B33) return true; if (c < 0x0B36) return false; if (c <= 0x0B39) return true; if (c == 0x0B3D) return true; if (c < 0x0B5C) return false; if (c <= 0x0B5D) return true; if (c < 0x0B5F) return false; if (c <= 0x0B61) return true; if (c < 0x0B85) return false; if (c <= 0x0B8A) return true; if (c < 0x0B8E) return false; if (c <= 0x0B90) return true; if (c < 0x0B92) return false; if (c <= 0x0B95) return true; if (c < 0x0B99) return false; if (c <= 0x0B9A) return true; if (c == 0x0B9C) return true; if (c < 0x0B9E) return false; if (c <= 0x0B9F) return true; if (c < 0x0BA3) return false; if (c <= 0x0BA4) return true; if (c < 0x0BA8) return false; if (c <= 0x0BAA) return true; if (c < 0x0BAE) return false; if (c <= 0x0BB5) return true; if (c < 0x0BB7) return false; if (c <= 0x0BB9) return true; if (c < 0x0C05) return false; if (c <= 0x0C0C) return true; if (c < 0x0C0E) return false; if (c <= 0x0C10) return true; if (c < 0x0C12) return false; if (c <= 0x0C28) return true; if (c < 0x0C2A) return false; if (c <= 0x0C33) return true; if (c < 0x0C35) return false; if (c <= 0x0C39) return true; if (c < 0x0C60) return false; if (c <= 0x0C61) return true; if (c < 0x0C85) return false; if (c <= 0x0C8C) return true; if (c < 0x0C8E) return false; if (c <= 0x0C90) return true; if (c < 0x0C92) return false; if (c <= 0x0CA8) return true; if (c < 0x0CAA) return false; if (c <= 0x0CB3) return true; if (c < 0x0CB5) return false; if (c <= 0x0CB9) return true; if (c == 0x0CDE) return true; if (c < 0x0CE0) return false; if (c <= 0x0CE1) return true; if (c < 0x0D05) return false; if (c <= 0x0D0C) return true; if (c < 0x0D0E) return false; if (c <= 0x0D10) return true; if (c < 0x0D12) return false; if (c <= 0x0D28) return true; if (c < 0x0D2A) return false; if (c <= 0x0D39) return true; if (c < 0x0D60) return false; if (c <= 0x0D61) return true; if (c < 0x0E01) return false; if (c <= 0x0E2E) return true; if (c == 0x0E30) return true; if (c < 0x0E32) return false; if (c <= 0x0E33) return true; if (c < 0x0E40) return false; if (c <= 0x0E45) return true; if (c < 0x0E81) return false; if (c <= 0x0E82) return true; if (c == 0x0E84) return true; if (c < 0x0E87) return false; if (c <= 0x0E88) return true; if (c == 0x0E8A) return true; if (c == 0x0E8D) return true; if (c < 0x0E94) return false; if (c <= 0x0E97) return true; if (c < 0x0E99) return false; if (c <= 0x0E9F) return true; if (c < 0x0EA1) return false; if (c <= 0x0EA3) return true; if (c == 0x0EA5) return true; if (c == 0x0EA7) return true; if (c < 0x0EAA) return false; if (c <= 0x0EAB) return true; if (c < 0x0EAD) return false; if (c <= 0x0EAE) return true; if (c == 0x0EB0) return true; if (c < 0x0EB2) return false; if (c <= 0x0EB3) return true; if (c == 0x0EBD) return true; if (c < 0x0EC0) return false; if (c <= 0x0EC4) return true; if (c < 0x0F40) return false; if (c <= 0x0F47) return true; if (c < 0x0F49) return false; if (c <= 0x0F69) return true; if (c < 0x10A0) return false; if (c <= 0x10C5) return true; if (c < 0x10D0) return false; if (c <= 0x10F6) return true; if (c == 0x1100) return true; if (c < 0x1102) return false; if (c <= 0x1103) return true; if (c < 0x1105) return false; if (c <= 0x1107) return true; if (c == 0x1109) return true; if (c < 0x110B) return false; if (c <= 0x110C) return true; if (c < 0x110E) return false; if (c <= 0x1112) return true; if (c == 0x113C) return true; if (c == 0x113E) return true; if (c == 0x1140) return true; if (c == 0x114C) return true; if (c == 0x114E) return true; if (c == 0x1150) return true; if (c < 0x1154) return false; if (c <= 0x1155) return true; if (c == 0x1159) return true; if (c < 0x115F) return false; if (c <= 0x1161) return true; if (c == 0x1163) return true; if (c == 0x1165) return true; if (c == 0x1167) return true; if (c == 0x1169) return true; if (c < 0x116D) return false; if (c <= 0x116E) return true; if (c < 0x1172) return false; if (c <= 0x1173) return true; if (c == 0x1175) return true; if (c == 0x119E) return true; if (c == 0x11A8) return true; if (c == 0x11AB) return true; if (c < 0x11AE) return false; if (c <= 0x11AF) return true; if (c < 0x11B7) return false; if (c <= 0x11B8) return true; if (c == 0x11BA) return true; if (c < 0x11BC) return false; if (c <= 0x11C2) return true; if (c == 0x11EB) return true; if (c == 0x11F0) return true; if (c == 0x11F9) return true; if (c < 0x1E00) return false; if (c <= 0x1E9B) return true; if (c < 0x1EA0) return false; if (c <= 0x1EF9) return true; if (c < 0x1F00) return false; if (c <= 0x1F15) return true; if (c < 0x1F18) return false; if (c <= 0x1F1D) return true; if (c < 0x1F20) return false; if (c <= 0x1F45) return true; if (c < 0x1F48) return false; if (c <= 0x1F4D) return true; if (c < 0x1F50) return false; if (c <= 0x1F57) return true; if (c == 0x1F59) return true; if (c == 0x1F5B) return true; if (c == 0x1F5D) return true; if (c < 0x1F5F) return false; if (c <= 0x1F7D) return true; if (c < 0x1F80) return false; if (c <= 0x1FB4) return true; if (c < 0x1FB6) return false; if (c <= 0x1FBC) return true; if (c == 0x1FBE) return true; if (c < 0x1FC2) return false; if (c <= 0x1FC4) return true; if (c < 0x1FC6) return false; if (c <= 0x1FCC) return true; if (c < 0x1FD0) return false; if (c <= 0x1FD3) return true; if (c < 0x1FD6) return false; if (c <= 0x1FDB) return true; if (c < 0x1FE0) return false; if (c <= 0x1FEC) return true; if (c < 0x1FF2) return false; if (c <= 0x1FF4) return true; if (c < 0x1FF6) return false; if (c <= 0x1FFC) return true; if (c == 0x2126) return true; if (c < 0x212A) return false; if (c <= 0x212B) return true; if (c == 0x212E) return true; if (c < 0x2180) return false; if (c <= 0x2182) return true; if (c == 0x3007) return true; // ideographic if (c < 0x3021) return false; if (c <= 0x3029) return true; // ideo if (c < 0x3041) return false; if (c <= 0x3094) return true; if (c < 0x30A1) return false; if (c <= 0x30FA) return true; if (c < 0x3105) return false; if (c <= 0x312C) return true; if (c < 0x4E00) return false; if (c <= 0x9FA5) return true; // ideo if (c < 0xAC00) return false; if (c <= 0xD7A3) return true; return false; } /** * This is a utility function for determining whether a specified character * is a combining character according to production 87 * of the XML 1.0 specification. * * @param c char to check. * @return boolean true if it's a combining character, * false otherwise. */ public static boolean isXMLCombiningChar(char c) { // CombiningChar if (c < 0x0300) return false; if (c <= 0x0345) return true; if (c < 0x0360) return false; if (c <= 0x0361) return true; if (c < 0x0483) return false; if (c <= 0x0486) return true; if (c < 0x0591) return false; if (c <= 0x05A1) return true; if (c < 0x05A3) return false; if (c <= 0x05B9) return true; if (c < 0x05BB) return false; if (c <= 0x05BD) return true; if (c == 0x05BF) return true; if (c < 0x05C1) return false; if (c <= 0x05C2) return true; if (c == 0x05C4) return true; if (c < 0x064B) return false; if (c <= 0x0652) return true; if (c == 0x0670) return true; if (c < 0x06D6) return false; if (c <= 0x06DC) return true; if (c < 0x06DD) return false; if (c <= 0x06DF) return true; if (c < 0x06E0) return false; if (c <= 0x06E4) return true; if (c < 0x06E7) return false; if (c <= 0x06E8) return true; if (c < 0x06EA) return false; if (c <= 0x06ED) return true; if (c < 0x0901) return false; if (c <= 0x0903) return true; if (c == 0x093C) return true; if (c < 0x093E) return false; if (c <= 0x094C) return true; if (c == 0x094D) return true; if (c < 0x0951) return false; if (c <= 0x0954) return true; if (c < 0x0962) return false; if (c <= 0x0963) return true; if (c < 0x0981) return false; if (c <= 0x0983) return true; if (c == 0x09BC) return true; if (c == 0x09BE) return true; if (c == 0x09BF) return true; if (c < 0x09C0) return false; if (c <= 0x09C4) return true; if (c < 0x09C7) return false; if (c <= 0x09C8) return true; if (c < 0x09CB) return false; if (c <= 0x09CD) return true; if (c == 0x09D7) return true; if (c < 0x09E2) return false; if (c <= 0x09E3) return true; if (c == 0x0A02) return true; if (c == 0x0A3C) return true; if (c == 0x0A3E) return true; if (c == 0x0A3F) return true; if (c < 0x0A40) return false; if (c <= 0x0A42) return true; if (c < 0x0A47) return false; if (c <= 0x0A48) return true; if (c < 0x0A4B) return false; if (c <= 0x0A4D) return true; if (c < 0x0A70) return false; if (c <= 0x0A71) return true; if (c < 0x0A81) return false; if (c <= 0x0A83) return true; if (c == 0x0ABC) return true; if (c < 0x0ABE) return false; if (c <= 0x0AC5) return true; if (c < 0x0AC7) return false; if (c <= 0x0AC9) return true; if (c < 0x0ACB) return false; if (c <= 0x0ACD) return true; if (c < 0x0B01) return false; if (c <= 0x0B03) return true; if (c == 0x0B3C) return true; if (c < 0x0B3E) return false; if (c <= 0x0B43) return true; if (c < 0x0B47) return false; if (c <= 0x0B48) return true; if (c < 0x0B4B) return false; if (c <= 0x0B4D) return true; if (c < 0x0B56) return false; if (c <= 0x0B57) return true; if (c < 0x0B82) return false; if (c <= 0x0B83) return true; if (c < 0x0BBE) return false; if (c <= 0x0BC2) return true; if (c < 0x0BC6) return false; if (c <= 0x0BC8) return true; if (c < 0x0BCA) return false; if (c <= 0x0BCD) return true; if (c == 0x0BD7) return true; if (c < 0x0C01) return false; if (c <= 0x0C03) return true; if (c < 0x0C3E) return false; if (c <= 0x0C44) return true; if (c < 0x0C46) return false; if (c <= 0x0C48) return true; if (c < 0x0C4A) return false; if (c <= 0x0C4D) return true; if (c < 0x0C55) return false; if (c <= 0x0C56) return true; if (c < 0x0C82) return false; if (c <= 0x0C83) return true; if (c < 0x0CBE) return false; if (c <= 0x0CC4) return true; if (c < 0x0CC6) return false; if (c <= 0x0CC8) return true; if (c < 0x0CCA) return false; if (c <= 0x0CCD) return true; if (c < 0x0CD5) return false; if (c <= 0x0CD6) return true; if (c < 0x0D02) return false; if (c <= 0x0D03) return true; if (c < 0x0D3E) return false; if (c <= 0x0D43) return true; if (c < 0x0D46) return false; if (c <= 0x0D48) return true; if (c < 0x0D4A) return false; if (c <= 0x0D4D) return true; if (c == 0x0D57) return true; if (c == 0x0E31) return true; if (c < 0x0E34) return false; if (c <= 0x0E3A) return true; if (c < 0x0E47) return false; if (c <= 0x0E4E) return true; if (c == 0x0EB1) return true; if (c < 0x0EB4) return false; if (c <= 0x0EB9) return true; if (c < 0x0EBB) return false; if (c <= 0x0EBC) return true; if (c < 0x0EC8) return false; if (c <= 0x0ECD) return true; if (c < 0x0F18) return false; if (c <= 0x0F19) return true; if (c == 0x0F35) return true; if (c == 0x0F37) return true; if (c == 0x0F39) return true; if (c == 0x0F3E) return true; if (c == 0x0F3F) return true; if (c < 0x0F71) return false; if (c <= 0x0F84) return true; if (c < 0x0F86) return false; if (c <= 0x0F8B) return true; if (c < 0x0F90) return false; if (c <= 0x0F95) return true; if (c == 0x0F97) return true; if (c < 0x0F99) return false; if (c <= 0x0FAD) return true; if (c < 0x0FB1) return false; if (c <= 0x0FB7) return true; if (c == 0x0FB9) return true; if (c < 0x20D0) return false; if (c <= 0x20DC) return true; if (c == 0x20E1) return true; if (c < 0x302A) return false; if (c <= 0x302F) return true; if (c == 0x3099) return true; if (c == 0x309A) return true; return false; } /** * This is a utility function for determining whether a specified * character is an extender according to production 88 of the XML 1.0 * specification. * * @param c char to check. * @return String true if it's an extender, false otherwise. */ public static boolean isXMLExtender(char c) { if (c < 0x00B6) return false; // quick short circuit // Extenders if (c == 0x00B7) return true; if (c == 0x02D0) return true; if (c == 0x02D1) return true; if (c == 0x0387) return true; if (c == 0x0640) return true; if (c == 0x0E46) return true; if (c == 0x0EC6) return true; if (c == 0x3005) return true; if (c < 0x3031) return false; if (c <= 0x3035) return true; if (c < 0x309D) return false; if (c <= 0x309E) return true; if (c < 0x30FC) return false; if (c <= 0x30FE) return true; return false; } /** * This is a utility function for determining whether a specified * Unicode character * is a digit according to production 88 of the XML 1.0 specification. * * @param c char to check for XML digit compliance * @return boolean true if it's a digit, false otherwise */ public static boolean isXMLDigit(char c) { if (c < 0x0030) return false; if (c <= 0x0039) return true; if (c < 0x0660) return false; if (c <= 0x0669) return true; if (c < 0x06F0) return false; if (c <= 0x06F9) return true; if (c < 0x0966) return false; if (c <= 0x096F) return true; if (c < 0x09E6) return false; if (c <= 0x09EF) return true; if (c < 0x0A66) return false; if (c <= 0x0A6F) return true; if (c < 0x0AE6) return false; if (c <= 0x0AEF) return true; if (c < 0x0B66) return false; if (c <= 0x0B6F) return true; if (c < 0x0BE7) return false; if (c <= 0x0BEF) return true; if (c < 0x0C66) return false; if (c <= 0x0C6F) return true; if (c < 0x0CE6) return false; if (c <= 0x0CEF) return true; if (c < 0x0D66) return false; if (c <= 0x0D6F) return true; if (c < 0x0E50) return false; if (c <= 0x0E59) return true; if (c < 0x0ED0) return false; if (c <= 0x0ED9) return true; if (c < 0x0F20) return false; if (c <= 0x0F29) return true; return false; } } extensions/xml/jdom-1.0/src/org/jdom/adapters/000077500000000000000000000000001335566474600214375ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/jdom/adapters/AbstractDOMAdapter.java000066400000000000000000000155651335566474600257220ustar00rootroot00000000000000/*-- $Id: AbstractDOMAdapter.java,v 1.1.1.1 2005/12/02 14:16:49 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.adapters; import java.io.*; import java.lang.reflect.*; import org.jdom.*; import org.w3c.dom.*; import org.w3c.dom.Document; /** * A DOMAdapter utility abstract base class. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:49 $ * @author Brett McLaughlin * @author Jason Hunter */ public abstract class AbstractDOMAdapter implements DOMAdapter { private static final String CVS_ID = "@(#) $RCSfile: AbstractDOMAdapter.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:49 $ $Name: $"; /** * This creates a new {@link Document} from an * existing InputStream by letting a DOM * parser handle parsing using the supplied stream. * * @param filename file to parse. * @param validate boolean to indicate if validation should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(File filename, boolean validate) throws IOException, JDOMException { return getDocument(new FileInputStream(filename), validate); } /** * This creates a new {@link Document} from an * existing InputStream by letting a DOM * parser handle parsing using the supplied stream. * * @param in InputStream to parse. * @param validate boolean to indicate if validation should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public abstract Document getDocument(InputStream in, boolean validate) throws IOException, JDOMException; /** * This creates an empty Document object based * on a specific parser implementation. * * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public abstract Document createDocument() throws JDOMException; /** * This creates an empty Document object based * on a specific parser implementation with the given DOCTYPE. * If the doctype parameter is null, the behavior is the same as * calling createDocument(). * * @param doctype Initial DocType of the document. * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public Document createDocument(DocType doctype) throws JDOMException { if (doctype == null) { return createDocument(); } DOMImplementation domImpl = createDocument().getImplementation(); DocumentType domDocType = domImpl.createDocumentType( doctype.getElementName(), doctype.getPublicID(), doctype.getSystemID()); // Set the internal subset if possible setInternalSubset(domDocType, doctype.getInternalSubset()); return domImpl.createDocument("http://temporary", doctype.getElementName(), domDocType); } /** * This attempts to change the DocumentType to have the given internal DTD * subset value. This is not a standard ability in DOM, so it's only * available with some parsers. Subclasses can alter the mechanism by * which the attempt is made to set the value. * * @param dt DocumentType to be altered * @param s String to use as the internal DTD subset */ protected void setInternalSubset(DocumentType dt, String s) { if (dt == null || s == null) return; // Default behavior is to attempt a setInternalSubset() call using // reflection. This method is not part of the DOM spec, but it's // available on Xerces 1.4.4+. It's not currently in Crimson. try { Class dtclass = dt.getClass(); Method setInternalSubset = dtclass.getMethod( "setInternalSubset", new Class[] {java.lang.String.class}); setInternalSubset.invoke(dt, new Object[] {s}); } catch (Exception e) { // ignore } } } extensions/xml/jdom-1.0/src/org/jdom/adapters/CrimsonDOMAdapter.java000066400000000000000000000135601335566474600255620ustar00rootroot00000000000000/*-- $Id: CrimsonDOMAdapter.java,v 1.1.1.1 2005/12/02 14:16:49 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.adapters; import java.io.*; import java.lang.reflect.*; import org.jdom.*; import org.w3c.dom.Document; import org.xml.sax.*; /** * An adapter for the Apache Crimson DOM parser. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:49 $ * @author Jason Hunter */ public class CrimsonDOMAdapter extends AbstractDOMAdapter { private static final String CVS_ID = "@(#) $RCSfile: CrimsonDOMAdapter.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:49 $ $Name: $"; /** * This creates a new {@link Document} from an * existing InputStream by letting a DOM * parser handle parsing using the supplied stream. * * @param in InputStream to parse. * @param validate boolean to indicate if validation should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(InputStream in, boolean validate) throws IOException, JDOMException { try { Class[] parameterTypes = new Class[2]; parameterTypes[0] = Class.forName("java.io.InputStream"); parameterTypes[1] = boolean.class; Object[] args = new Object[2]; args[0] = in; args[1] = new Boolean(false); // Load the parser class and invoke the parse method Class parserClass = Class.forName("org.apache.crimson.tree.XmlDocument"); Method createXmlDocument = parserClass.getMethod("createXmlDocument", parameterTypes); Document doc = (Document)createXmlDocument.invoke(null, args); return doc; } catch (InvocationTargetException e) { Throwable targetException = e.getTargetException(); if (targetException instanceof org.xml.sax.SAXParseException) { SAXParseException parseException = (SAXParseException)targetException; throw new JDOMException("Error on line " + parseException.getLineNumber() + " of XML document: " + parseException.getMessage(), parseException); } else if (targetException instanceof IOException) { IOException ioException = (IOException) targetException; throw ioException; } else { throw new JDOMException(targetException.getMessage(), targetException); } } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage(), e); } } /** * This creates an empty Document object based * on a specific parser implementation. * * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public Document createDocument() throws JDOMException { try { return (Document)Class.forName( "org.apache.crimson.tree.XmlDocument") .newInstance(); } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage() + " when creating document", e); } } } extensions/xml/jdom-1.0/src/org/jdom/adapters/DOMAdapter.java000066400000000000000000000116161335566474600242270ustar00rootroot00000000000000/*-- $Id: DOMAdapter.java,v 1.1.1.1 2005/12/02 14:16:49 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.adapters; import java.io.*; import org.jdom.*; import org.w3c.dom.Document; /** * Defines a standard set of adapter methods for interfacing with a DOM parser * and obtaining a DOM {@link org.w3c.dom.Document org.w3c.dom.Document} object. * Implementing classes map these calls to DOM parser-specific calls, allowing * any third-party parser to be used with JDOM. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:49 $ * @author Brett McLaughlin * @author Jason Hunter */ public interface DOMAdapter { /** * This creates a new Document from a * given filename by letting a DOM parser handle parsing from the file. * * @param filename file to parse. * @param validate boolean to indicate if validation * should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(File filename, boolean validate) throws IOException, JDOMException; /** * This creates a new Document from an * existing InputStream by letting a DOM * parser handle parsing using the supplied stream. * * @param in InputStream to parse. * @param validate boolean to indicate if validation * should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(InputStream in, boolean validate) throws IOException, JDOMException; /** * This creates an empty Document object based * on a specific parser implementation. * * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public Document createDocument() throws JDOMException; /** * This creates an empty Document object based * on a specific parser implementation with the given DOCTYPE. * * @param doctype Initial DocType of the document. * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public Document createDocument(DocType doctype) throws JDOMException; } extensions/xml/jdom-1.0/src/org/jdom/adapters/JAXPDOMAdapter.java000066400000000000000000000202011335566474600247000ustar00rootroot00000000000000/*-- $Id: JAXPDOMAdapter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.adapters; import java.io.*; import java.lang.reflect.*; import org.jdom.*; import org.jdom.input.*; import org.w3c.dom.Document; /** * An adapter for any parser supporting the Sun JAXP APIs. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Jason Hunter */ public class JAXPDOMAdapter extends AbstractDOMAdapter { private static final String CVS_ID = "@(#) $RCSfile: JAXPDOMAdapter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This creates a new {@link Document} from an * existing InputStream by letting a JAXP * parser handle parsing using the supplied stream. * * @param in InputStream to parse. * @param validate boolean to indicate if validation * should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(InputStream in, boolean validate) throws IOException, JDOMException { try { // Try using JAXP... // Note we need DOM Level 2 and thus JAXP 1.1. Class.forName("javax.xml.transform.Transformer"); // Try JAXP 1.1 calls to build the document Class factoryClass = Class.forName("javax.xml.parsers.DocumentBuilderFactory"); // factory = DocumentBuilderFactory.newInstance(); Method newParserInstance = factoryClass.getMethod("newInstance", (Class)null); Object factory = newParserInstance.invoke((Object)null, (Object[])null); // factory.setValidating(validate); Method setValidating = factoryClass.getMethod("setValidating", new Class[]{boolean.class}); setValidating.invoke(factory, new Object[]{new Boolean(validate)}); // factory.setNamespaceAware(true); Method setNamespaceAware = factoryClass.getMethod("setNamespaceAware", new Class[]{boolean.class}); setNamespaceAware.invoke(factory, new Object[]{Boolean.TRUE}); // jaxpParser = factory.newDocumentBuilder(); Method newDocBuilder = factoryClass.getMethod("newDocumentBuilder", (Class)null); Object jaxpParser = newDocBuilder.invoke(factory, (Object[])null); // jaxpParser.setErrorHandler(null); Class parserClass = jaxpParser.getClass(); Method setErrorHandler = parserClass.getMethod("setErrorHandler", new Class[]{org.xml.sax.ErrorHandler.class}); setErrorHandler.invoke(jaxpParser, new Object[]{new BuilderErrorHandler()}); // domDoc = jaxpParser.parse(in); Method parse = parserClass.getMethod( "parse", new Class[]{InputStream.class}); org.w3c.dom.Document domDoc = (org.w3c.dom.Document) parse.invoke(jaxpParser, new Object[]{in}); return domDoc; } catch (InvocationTargetException e) { Throwable targetException = e.getTargetException(); if (targetException instanceof IOException) { throw (IOException) targetException; } else { throw new JDOMException(targetException.getMessage(), targetException); } } catch (Exception e) { throw new JDOMException("Reflection failed while parsing a document with JAXP", e); } // Allow all exceptions to pass through } /** * This creates an empty Document object based * on a specific parser implementation. * * @return Document - created DOM Document. * @throws JDOMException when errors occur in parsing. */ public Document createDocument() throws JDOMException { try { // We need DOM Level 2 and thus JAXP 1.1. // If JAXP 1.0 is all that's available then we error out. Class.forName("javax.xml.transform.Transformer"); // Try JAXP 1.1 calls to build the document Class factoryClass = Class.forName("javax.xml.parsers.DocumentBuilderFactory"); // factory = DocumentBuilderFactory.newInstance(); Method newParserInstance = factoryClass.getMethod("newInstance", (Class)null); Object factory = newParserInstance.invoke((Object)null, (Object[])null); // jaxpParser = factory.newDocumentBuilder(); Method newDocBuilder = factoryClass.getMethod("newDocumentBuilder", (Class)null); Object jaxpParser = newDocBuilder.invoke(factory, (Object[])null); // domDoc = jaxpParser.newDocument(); Class parserClass = jaxpParser.getClass(); Method newDoc = parserClass.getMethod("newDocument", (Class)null); org.w3c.dom.Document domDoc = (org.w3c.dom.Document) newDoc.invoke(jaxpParser, (Object[])null); return domDoc; } catch (Exception e) { throw new JDOMException("Reflection failed while creating new JAXP document", e); } } } extensions/xml/jdom-1.0/src/org/jdom/adapters/OracleV1DOMAdapter.java000066400000000000000000000140211335566474600255550ustar00rootroot00000000000000/*-- $Id: OracleV1DOMAdapter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.adapters; import java.io.*; import java.lang.reflect.*; import org.jdom.*; import org.w3c.dom.Document; import org.xml.sax.*; /** * An adapter for the Oracle Version 1 DOM parser. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter */ public class OracleV1DOMAdapter extends AbstractDOMAdapter { private static final String CVS_ID = "@(#) $RCSfile: OracleV1DOMAdapter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This creates a new {@link Document} from an * existing InputStream by letting a DOM * parser handle parsing using the supplied stream. * * @param in InputStream to parse. * @param validate boolean to indicate if validation should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(InputStream in, boolean validate) throws IOException, JDOMException { try { // Load the parser class Class parserClass = Class.forName("oracle.xml.parser.XMLParser"); Object parser = parserClass.newInstance(); // Parse the document Method parse = parserClass.getMethod("parse", new Class[] {org.xml.sax.InputSource.class}); parse.invoke(parser, new Object[] {new InputSource(in)}); // Get the Document object Method getDocument = parserClass.getMethod("getDocument", (Class)null); Document doc = (Document)getDocument.invoke(parser, (Object[])null); return doc; } catch (InvocationTargetException e) { Throwable targetException = e.getTargetException(); if (targetException instanceof org.xml.sax.SAXParseException) { SAXParseException parseException = (SAXParseException) targetException; throw new JDOMException("Error on line " + parseException.getLineNumber() + " of XML document: " + parseException.getMessage(), parseException); } else if (targetException instanceof IOException) { IOException ioException = (IOException) targetException; throw ioException; } else { throw new JDOMException(targetException.getMessage(), targetException); } } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage(), e); } } /** * This creates an empty Document object based * on a specific parser implementation. * * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public Document createDocument() throws JDOMException { try { return (Document)Class.forName( "oracle.xml.parser.XMLDocument") .newInstance(); } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage() + " when creating document", e); } } } extensions/xml/jdom-1.0/src/org/jdom/adapters/OracleV2DOMAdapter.java000066400000000000000000000140251335566474600255620ustar00rootroot00000000000000/*-- $Id: OracleV2DOMAdapter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.adapters; import java.io.*; import java.lang.reflect.*; import org.jdom.*; import org.w3c.dom.Document; import org.xml.sax.*; /** * An adapter for the Oracle Version 2 DOM parser. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter */ public class OracleV2DOMAdapter extends AbstractDOMAdapter { private static final String CVS_ID = "@(#) $RCSfile: OracleV2DOMAdapter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This creates a new {@link Document} from an * existing InputStream by letting a DOM * parser handle parsing using the supplied stream. * * @param in InputStream to parse. * @param validate boolean to indicate if validation should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(InputStream in, boolean validate) throws IOException, JDOMException { try { // Load the parser class Class parserClass = Class.forName("oracle.xml.parser.v2.DOMParser"); Object parser = parserClass.newInstance(); // Parse the document Method parse = parserClass.getMethod("parse", new Class[] {org.xml.sax.InputSource.class}); parse.invoke(parser, new Object[] {new InputSource(in)}); // Get the Document object Method getDocument = parserClass.getMethod("getDocument", (Class)null); Document doc = (Document)getDocument.invoke(parser, (Object[])null); return doc; } catch (InvocationTargetException e) { Throwable targetException = e.getTargetException(); if (targetException instanceof org.xml.sax.SAXParseException) { SAXParseException parseException = (SAXParseException)targetException; throw new JDOMException("Error on line " + parseException.getLineNumber() + " of XML document: " + parseException.getMessage(), parseException); } else if (targetException instanceof IOException) { IOException ioException = (IOException) targetException; throw ioException; } else { throw new JDOMException(targetException.getMessage(), targetException); } } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage(), e); } } /** * This creates an empty Document object based * on a specific parser implementation. * * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public Document createDocument() throws JDOMException { try { return (Document)Class.forName( "oracle.xml.parser.v2.XMLDocument") .newInstance(); } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage() + " when creating document", e); } } } extensions/xml/jdom-1.0/src/org/jdom/adapters/XML4JDOMAdapter.java000066400000000000000000000162171335566474600250100ustar00rootroot00000000000000/*-- $Id: XML4JDOMAdapter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.adapters; import java.io.*; import java.lang.reflect.*; import org.jdom.*; import org.jdom.input.*; import org.w3c.dom.Document; import org.xml.sax.*; /** * An adapter for the IBM XML4J DOM parser. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter */ public class XML4JDOMAdapter extends AbstractDOMAdapter { private static final String CVS_ID = "@(#) $RCSfile: XML4JDOMAdapter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This creates a new {@link Document} from an * existing InputStream by letting a DOM * parser handle parsing using the supplied stream. * * @param in InputStream to parse. * @param validate boolean to indicate if validation should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(InputStream in, boolean validate) throws IOException, JDOMException { try { /* * IBM XML4J actually uses the Xerces parser, so this is * all Xerces specific code. */ // Load the parser class Class parserClass = Class.forName("org.apache.xerces.parsers.DOMParser"); Object parser = parserClass.newInstance(); // Set validation Method setFeature = parserClass.getMethod("setFeature", new Class[] {java.lang.String.class, boolean.class}); setFeature.invoke(parser, new Object[] {"http://xml.org/sax/features/validation", new Boolean(validate)}); // Set namespaces setFeature.invoke(parser, new Object[] {"http://xml.org/sax/features/namespaces", new Boolean(false)}); // Set the error handler if (validate) { Method setErrorHandler = parserClass.getMethod("setErrorHandler", new Class[] {ErrorHandler.class}); setErrorHandler.invoke(parser, new Object[] {new BuilderErrorHandler()}); } // Parse the document Method parse = parserClass.getMethod("parse", new Class[] {org.xml.sax.InputSource.class}); parse.invoke(parser, new Object[]{new InputSource(in)}); // Get the Document object Method getDocument = parserClass.getMethod("getDocument", (Class)null); Document doc = (Document)getDocument.invoke(parser, (Object[])null); return doc; } catch (InvocationTargetException e) { Throwable targetException = e.getTargetException(); if (targetException instanceof org.xml.sax.SAXParseException) { SAXParseException parseException = (SAXParseException)targetException; throw new JDOMException("Error on line " + parseException.getLineNumber() + " of XML document: " + parseException.getMessage(), parseException); } else if (targetException instanceof IOException) { IOException ioException = (IOException) targetException; throw ioException; } else { throw new JDOMException(targetException.getMessage(), targetException); } } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage(), e); } } /** * This creates an empty Document object based * on a specific parser implementation. * * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public Document createDocument() throws JDOMException { try { return (Document)Class.forName( "org.apache.xerces.dom.DocumentImpl") .newInstance(); } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage() + " while creating document", e); } } } extensions/xml/jdom-1.0/src/org/jdom/adapters/XercesDOMAdapter.java000066400000000000000000000157101335566474600254000ustar00rootroot00000000000000/*-- $Id: XercesDOMAdapter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.adapters; import java.io.*; import java.lang.reflect.*; import org.jdom.*; import org.jdom.input.*; import org.w3c.dom.Document; import org.xml.sax.*; /** * An adapter for the Apache Xerces DOM parser. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter */ public class XercesDOMAdapter extends AbstractDOMAdapter { private static final String CVS_ID = "@(#) $RCSfile: XercesDOMAdapter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * This creates a new {@link Document} from an * existing InputStream by letting a DOM * parser handle parsing using the supplied stream. * * @param in InputStream to parse. * @param validate boolean to indicate if validation * should occur. * @return Document - instance ready for use. * @throws IOException when I/O error occurs. * @throws JDOMException when errors occur in parsing. */ public Document getDocument(InputStream in, boolean validate) throws IOException, JDOMException { try { // Load the parser class Class parserClass = Class.forName("org.apache.xerces.parsers.DOMParser"); Object parser = parserClass.newInstance(); // Set validation Method setFeature = parserClass.getMethod( "setFeature", new Class[] {java.lang.String.class, boolean.class}); setFeature.invoke(parser, new Object[] {"http://xml.org/sax/features/validation", new Boolean(validate)}); // Set namespaces true setFeature.invoke(parser, new Object[] {"http://xml.org/sax/features/namespaces", new Boolean(true)}); // Set the error handler if (validate) { Method setErrorHandler = parserClass.getMethod( "setErrorHandler", new Class[] {ErrorHandler.class}); setErrorHandler.invoke(parser, new Object[] {new BuilderErrorHandler()}); } // Parse the document Method parse = parserClass.getMethod( "parse", new Class[] {org.xml.sax.InputSource.class}); parse.invoke(parser, new Object[]{new InputSource(in)}); // Get the Document object Method getDocument = parserClass.getMethod("getDocument", (Class)null); Document doc = (Document)getDocument.invoke(parser, (Object[])null); return doc; } catch (InvocationTargetException e) { Throwable targetException = e.getTargetException(); if (targetException instanceof org.xml.sax.SAXParseException) { SAXParseException parseException = (SAXParseException)targetException; throw new JDOMException("Error on line " + parseException.getLineNumber() + " of XML document: " + parseException.getMessage(), e); } else if (targetException instanceof IOException) { IOException ioException = (IOException) targetException; throw ioException; } else { throw new JDOMException(targetException.getMessage(), e); } } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage(), e); } } /** * This creates an empty Document object based * on a specific parser implementation. * * @return Document - created DOM Document. * @throws JDOMException when errors occur. */ public Document createDocument() throws JDOMException { try { return (Document)Class.forName( "org.apache.xerces.dom.DocumentImpl").newInstance(); } catch (Exception e) { throw new JDOMException(e.getClass().getName() + ": " + e.getMessage() + " when creating document", e); } } } extensions/xml/jdom-1.0/src/org/jdom/filter/000077500000000000000000000000001335566474600211215ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/jdom/filter/AbstractFilter.java000066400000000000000000000061701335566474600247010ustar00rootroot00000000000000/*-- $Id: AbstractFilter.java,v 1.1.1.1 2005/12/02 14:16:51 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.filter; /** * Partial implementation of {@link Filter}. * * @author Bradley S. Huffman * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:51 $ */ public abstract class AbstractFilter implements Filter { private static final String CVS_ID = "@(#) $RCSfile: AbstractFilter.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:51 $"; public Filter negate() { return new NegateFilter(this); } public Filter or(Filter filter) { return new OrFilter(this, filter); } public Filter and(Filter filter) { return new AndFilter(this, filter); } } extensions/xml/jdom-1.0/src/org/jdom/filter/AndFilter.java000066400000000000000000000112501335566474600236330ustar00rootroot00000000000000/*-- $Id: AndFilter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.filter; /** * Allow two filters to be chained together with a logical * and operation. * * @author Bradley S. Huffman * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ */ final class AndFilter extends AbstractFilter { private static final String CVS_ID = "@(#) $RCSfile: AndFilter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $"; // Filter for left side of logical and. private Filter left; // Filter for right side of logical and. private Filter right; /** * Match if only both supplied filters match. * * @param left left side of logical and * @param right right side of logical and * @throws IllegalArgumentException if either supplied filter is null */ public AndFilter(Filter left, Filter right) { if ((left == null) || (right == null)) { throw new IllegalArgumentException("null filter not allowed"); } this.left = left; this.right = right; } public boolean matches(Object obj) { return left.matches(obj) && right.matches(obj); } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof AndFilter) { AndFilter filter = (AndFilter) obj; if ((left.equals(filter.left) && right.equals(filter.right)) || (left.equals(filter.right) && right.equals(filter.left))) { return true; } } return false; } public int hashCode() { return (31 * left.hashCode()) + right.hashCode(); } public String toString() { return new StringBuilder(64) .append("[AndFilter: ") .append(left.toString()) .append(",\n") .append(" ") .append(right.toString()) .append("]") // JCLIC modification //.toString(); .substring(0); } } extensions/xml/jdom-1.0/src/org/jdom/filter/ContentFilter.java000066400000000000000000000252571335566474600245570ustar00rootroot00000000000000/*-- $Id: ContentFilter.java,v 1.1.1.1 2005/12/02 14:16:51 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.filter; import org.jdom.*; /** * A general purpose Filter able to represent all legal JDOM objects or a * specific subset. Filtering is accomplished by way of a filtering mask in * which each bit represents whether a JDOM object is visible or not. * For example to view all Text and CDATA nodes in the content of element x. *

 *      Filter filter = new ContentFilter(ContentFilter.TEXT |
 *                                        ContentFilter.CDATA);
 *      List content = x.getContent(filter);
 * 
*

* For those who don't like bit-masking, set methods are provided as an * alternative. For example to allow everything except Comment nodes. *


 *      Filter filter =  new ContentFilter();
 *      filter.setCommentVisible(false);
 *      List content = x.getContent(filter);
 * 
*

* The default is to allow all valid JDOM objects. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:51 $ * @author Bradley S. Huffman */ public class ContentFilter extends AbstractFilter { private static final String CVS_ID = "@(#) $RCSfile: ContentFilter.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:51 $ $Name: $"; /** Mask for JDOM {@link Element} objects */ public static final int ELEMENT = 1; /** Mask for JDOM {@link CDATA} objects */ public static final int CDATA = 2; /** Mask for JDOM {@link Text} objects */ public static final int TEXT = 4; /** Mask for JDOM {@link Comment} objects */ public static final int COMMENT = 8; /** Mask for JDOM {@link ProcessingInstruction} objects */ public static final int PI = 16; /** Mask for JDOM {@link EntityRef} objects */ public static final int ENTITYREF = 32; /** Mask for JDOM {@link Document} object */ public static final int DOCUMENT = 64; /** Mask for JDOM {@link DocType} object */ public static final int DOCTYPE = 128; /** The JDOM object mask */ private int filterMask; /** * Default constructor that allows any legal JDOM objects. */ public ContentFilter() { setDefaultMask(); } /** * Set whether all JDOM objects are visible or not. * * @param allVisible true all JDOM objects are visible, * false all JDOM objects are hidden. */ public ContentFilter(boolean allVisible) { if (allVisible) { setDefaultMask(); } else { filterMask &= ~filterMask; } } /** * Filter out JDOM objects according to a filtering mask. * * @param mask Mask of JDOM objects to allow. */ public ContentFilter(int mask) { setFilterMask(mask); } /** * Return current filtering mask. * * @return the current filtering mask */ public int getFilterMask() { return filterMask; } /** * Set filtering mask. * * @param mask the new filtering mask */ public void setFilterMask(int mask) { setDefaultMask(); filterMask &= mask; } /** * Set this filter to allow all legal JDOM objects. */ public void setDefaultMask() { filterMask = ELEMENT | CDATA | TEXT | COMMENT | PI | ENTITYREF | DOCUMENT | DOCTYPE; } /** * Set filter to match only JDOM objects that are legal * document content. */ public void setDocumentContent() { filterMask = ELEMENT | COMMENT | PI | DOCTYPE; } /** * Set filter to match only JDOM objects that are legal * element content. */ public void setElementContent() { filterMask = ELEMENT | CDATA | TEXT | COMMENT | PI | ENTITYREF; } /** * Set visiblity of Element objects. * * @param visible whether Elements are visible, true * if yes, false if not */ public void setElementVisible(boolean visible) { if (visible) { filterMask |= ELEMENT; } else { filterMask &= ~ELEMENT; } } /** * Set visiblity of CDATA objects. * * @param visible whether CDATA nodes are visible, true * if yes, false if not */ public void setCDATAVisible(boolean visible) { if (visible) { filterMask |= CDATA; } else { filterMask &= ~CDATA; } } /** * Set visiblity of Text objects. * * @param visible whether Text nodes are visible, true * if yes, false if not */ public void setTextVisible(boolean visible) { if (visible) { filterMask |= TEXT; } else { filterMask &= ~TEXT; } } /** * Set visiblity of Comment objects. * * @param visible whether Comments are visible, true * if yes, false if not */ public void setCommentVisible(boolean visible) { if (visible) { filterMask |= COMMENT; } else { filterMask &= ~COMMENT; } } /** * Set visiblity of ProcessingInstruction objects. * * @param visible whether ProcessingInstructions are visible, * true if yes, false if not */ public void setPIVisible(boolean visible) { if (visible) { filterMask |= PI; } else { filterMask &= ~PI; } } /** * Set visiblity of EntityRef objects. * * @param visible whether EntityRefs are visible, true * if yes, false if not */ public void setEntityRefVisible(boolean visible) { if (visible) { filterMask |= ENTITYREF; } else { filterMask &= ~ENTITYREF; } } /** * Set visiblity of DocType objects. * * @param visible whether the DocType is visible, true * if yes, false if not */ public void setDocTypeVisible(boolean visible) { if (visible) { filterMask |= DOCTYPE; } else { filterMask &= ~DOCTYPE; } } /** * Check to see if the object matches according to the filter mask. * * @param obj The object to verify. * @return true if the objected matched a predfined * set of rules. */ public boolean matches(Object obj) { if (obj instanceof Element) { return (filterMask & ELEMENT) != 0; } else if (obj instanceof CDATA) { // must come before Text check return (filterMask & CDATA) != 0; } else if (obj instanceof Text) { return (filterMask & TEXT) != 0; } else if (obj instanceof Comment) { return (filterMask & COMMENT) != 0; } else if (obj instanceof ProcessingInstruction) { return (filterMask & PI) != 0; } else if (obj instanceof EntityRef) { return (filterMask & ENTITYREF) != 0; } else if (obj instanceof Document) { return (filterMask & DOCUMENT) != 0; } else if (obj instanceof DocType) { return (filterMask & DOCTYPE) != 0; } return false; } /** * Returns whether the two filters are equivalent (i.e. the * matching mask values are identical). * * @param obj the object to compare against * @return whether the two filters are equal */ public boolean equals(Object obj) { // Generated by IntelliJ if (this == obj) return true; if (!(obj instanceof ContentFilter)) return false; final ContentFilter filter = (ContentFilter) obj; if (filterMask != filter.filterMask) return false; return true; } public int hashCode() { // Generated by IntelliJ return filterMask; } } extensions/xml/jdom-1.0/src/org/jdom/filter/ElementFilter.java000066400000000000000000000142521335566474600245270ustar00rootroot00000000000000/*-- $Id: ElementFilter.java,v 1.1.1.1 2005/12/02 14:16:51 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.filter; import java.io.*; import org.jdom.*; /** * A Filter that only matches {@link org.jdom.Element} objects. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:51 $ * @author Jools Enticknap * @author Bradley S. Huffman */ public class ElementFilter extends AbstractFilter { private static final String CVS_ID = "@(#) $RCSfile: ElementFilter.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:51 $ $Name: $"; /** The element name */ private String name; /** The element namespace */ private transient Namespace namespace; /** * Select only the Elements. */ public ElementFilter() {} /** * Select only the Elements with the supplied name in any Namespace. * * @param name The name of the Element. */ public ElementFilter(String name) { this.name = name; } /** * Select only the Elements with the supplied Namespace. * * @param namespace The namespace the Element lives in. */ public ElementFilter(Namespace namespace) { this.namespace = namespace; } /** * Select only the Elements with the supplied name and Namespace. * * @param name The name of the Element. * @param namespace The namespace the Element lives in. */ public ElementFilter(String name, Namespace namespace) { this.name = name; this.namespace = namespace; } /** * Check to see if the object matches a predefined set of rules. * * @param obj The object to verify. * @return true if the objected matched a predfined * set of rules. */ public boolean matches(Object obj) { if (obj instanceof Element) { Element el = (Element) obj; return (this.name == null || this.name.equals(el.getName())) && (this.namespace == null || this.namespace.equals(el.getNamespace())); } return false; } /** * Returns whether the two filters are equivalent (i.e. the * matching names and namespace are equivalent). * * @param obj the object to compare against * @return whether the two filters are equal */ public boolean equals(Object obj) { // Generated by IntelliJ if (this == obj) return true; if (!(obj instanceof ElementFilter)) return false; final ElementFilter filter = (ElementFilter) obj; if (name != null ? !name.equals(filter.name) : filter.name != null) return false; if (namespace != null ? !namespace.equals(filter.namespace) : filter.namespace != null) return false; return true; } public int hashCode() { // Generated by IntelliJ int result; result = (name != null ? name.hashCode() : 0); result = 29 * result + (namespace != null ? namespace.hashCode() : 0); return result; } // Support a custom Namespace serialization so no two namespace // object instances may exist for the same prefix/uri pair private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); // We use writeObject() and not writeUTF() to minimize space // This allows for writing pointers to already written strings out.writeObject(namespace.getPrefix()); out.writeObject(namespace.getURI()); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); namespace = Namespace.getNamespace( (String) in.readObject(), (String) in.readObject()); } } extensions/xml/jdom-1.0/src/org/jdom/filter/Filter.java000066400000000000000000000060711335566474600232150ustar00rootroot00000000000000/*-- $Id: Filter.java,v 1.1.1.1 2005/12/02 14:16:51 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.filter; /** * A generalized filter to restrict visibility or mutability on a list. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:51 $ * @author Jools Enticknap * @author Bradley S. Huffman */ public interface Filter extends java.io.Serializable { /** * Check to see if the object matches a predefined set of rules. * * @param obj The object to verify. * @return true if the object matches a predfined * set of rules. */ public boolean matches(Object obj); } extensions/xml/jdom-1.0/src/org/jdom/filter/NegateFilter.java000066400000000000000000000077631335566474600243520ustar00rootroot00000000000000/*-- $Id: NegateFilter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.filter; /** * Filter that is the logical negation operation of another filter. * * * @author Bradley S. Huffman * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ */ final class NegateFilter extends AbstractFilter { private static final String CVS_ID = "@(#) $RCSfile: NegateFilter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $"; // Underlying filter. private Filter filter; /** * Match if the supplied filter does not match. * * @param filter filter to use. */ public NegateFilter(Filter filter) { this.filter = filter; } public boolean matches(Object obj) { return !filter.matches(obj); } public Filter negate() { return filter; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof NegateFilter) { return filter.equals(((NegateFilter) obj).filter); } return false; } public int hashCode() { return ~filter.hashCode(); } public String toString() { return new StringBuilder(64) .append("[NegateFilter: ") .append(filter.toString()) .append("]") // JCLIC modification //.toString(); .substring(0); } } extensions/xml/jdom-1.0/src/org/jdom/filter/OrFilter.java000066400000000000000000000112361335566474600235150ustar00rootroot00000000000000/*-- $Id: OrFilter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.filter; /** * Allow two filters to be chained together with a logical * or operation. * * @author Bradley S. Huffman * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ */ final class OrFilter extends AbstractFilter { private static final String CVS_ID = "@(#) $RCSfile: OrFilter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $"; /** Filter for left side of logical or */ private Filter left; /** Filter for right side of logical or */ private Filter right; /** * Match if either of the supplied filters. * * @param left left side of logical or * @param right right side of logical or * @throws IllegalArgumentException if either supplied filter is null */ public OrFilter(Filter left, Filter right) { if ((left == null) || (right == null)) { throw new IllegalArgumentException("null filter not allowed"); } this.left = left; this.right = right; } public boolean matches(Object obj) { return left.matches(obj) || right.matches(obj); } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof OrFilter) { OrFilter filter = (OrFilter) obj; if ((left.equals(filter.left) && right.equals(filter.right)) || (left.equals(filter.right) && right.equals(filter.left))) { return true; } } return false; } public int hashCode() { return (31 * left.hashCode()) + right.hashCode(); } public String toString() { return new StringBuilder(64) .append("[OrFilter: ") .append(left.toString()) .append(",\n") .append(" ") .append(right.toString()) .append("]") // JCLIC modification //.toString(); .substring(0); } } extensions/xml/jdom-1.0/src/org/jdom/input/000077500000000000000000000000001335566474600207735ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/jdom/input/BuilderErrorHandler.java000066400000000000000000000106441335566474600255410ustar00rootroot00000000000000/*-- $Id: BuilderErrorHandler.java,v 1.1.1.1 2005/12/02 14:16:50 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.input; import org.xml.sax.*; /** * The standard JDOM error handler implementation. * * @author Jason Hunter * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:50 $ */ public class BuilderErrorHandler implements ErrorHandler { private static final String CVS_ID = "@(#) $RCSfile: BuilderErrorHandler.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:50 $ $Name: $"; /** * This method is called when a warning has occurred; this indicates * that while no XML rules were broken, something appears to be * incorrect or missing. * The implementation of this method here is a "no op". * * @param exception SAXParseException that occurred. * @throws SAXException when things go wrong */ public void warning(SAXParseException exception) throws SAXException { // nothing } /** * This method is called in response to an error that has occurred; * this indicates that a rule was broken, typically in validation, but * that parsing could reasonably continue. * The implementation of this method here is to rethrow the exception. * * @param exception SAXParseException that occurred. * @throws SAXException when things go wrong */ public void error(SAXParseException exception) throws SAXException { throw exception; } /** * This method is called in response to a fatal error; this indicates that * a rule has been broken that makes continued parsing either impossible * or an almost certain waste of time. * The implementation of this method here is to rethrow the exception. * * @param exception SAXParseException that occurred. * @throws SAXException when things go wrong */ public void fatalError(SAXParseException exception) throws SAXException { throw exception; } } extensions/xml/jdom-1.0/src/org/jdom/input/DOMBuilder.java000066400000000000000000000314471335566474600235750ustar00rootroot00000000000000/*-- $Id: DOMBuilder.java,v 1.1.1.1 2005/12/02 14:16:50 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.input; import org.jdom.*; import org.jdom.Document; import org.jdom.Element; import org.w3c.dom.*; /** * Builds a JDOM {@link org.jdom.Document org.jdom.Document} from a pre-existing * DOM {@link org.w3c.dom.Document org.w3c.dom.Document}. Also handy for testing * builds from files to sanity check {@link SAXBuilder}. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:50 $ * @author Brett McLaughlin * @author Jason Hunter * @author Philip Nelson * @author Kevin Regan * @author Yusuf Goolamabbas * @author Dan Schaffer * @author Bradley S. Huffman */ public class DOMBuilder { private static final String CVS_ID = "@(#) $RCSfile: DOMBuilder.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:50 $ $Name: $"; /** Adapter class to use */ private String adapterClass; /** The factory for creating new JDOM objects */ private JDOMFactory factory = new DefaultJDOMFactory(); /** * This creates a new DOMBuilder which will attempt to first locate * a parser via JAXP, then will try to use a set of default parsers. * The underlying parser will not validate. */ public DOMBuilder() { } /** * This creates a new DOMBuilder using the specified DOMAdapter * implementation as a way to choose the underlying parser. * The underlying parser will not validate. * * @param adapterClass String name of class * to use for DOM building. */ public DOMBuilder(String adapterClass) { this.adapterClass = adapterClass; } /* * This sets a custom JDOMFactory for the builder. Use this to build * the tree with your own subclasses of the JDOM classes. * * @param factory JDOMFactory to use */ public void setFactory(JDOMFactory factory) { this.factory = factory; } /** * Returns the current {@link org.jdom.JDOMFactory} in use. * @return the factory in use */ public JDOMFactory getFactory() { return factory; } /** * This will build a JDOM tree from an existing DOM tree. * * @param domDocument org.w3c.dom.Document object * @return Document - JDOM document object. */ public Document build(org.w3c.dom.Document domDocument) { Document doc = factory.document(null); buildTree(domDocument, doc, null, true); return doc; } /** * This will build a JDOM Element from an existing DOM Element * * @param domElement org.w3c.dom.Element object * @return Element - JDOM Element object */ public org.jdom.Element build(org.w3c.dom.Element domElement) { Document doc = factory.document(null); buildTree(domElement, doc, null, true); return doc.getRootElement(); } /** * This takes a DOM Node and builds up * a JDOM tree, recursing until the DOM tree is exhausted * and the JDOM tree results. * * @param node Code to examine. * @param doc JDOM Document being built. * @param current Element that is current parent. * @param atRoot boolean indicating whether at root level. */ private void buildTree(Node node, Document doc, Element current, boolean atRoot) { // Recurse through the tree switch (node.getNodeType()) { case Node.DOCUMENT_NODE: NodeList nodes = node.getChildNodes(); for (int i=0, size=nodes.getLength(); i= 0) { prefix = nodeName.substring(0, colon); localName = nodeName.substring(colon + 1); } // Get element's namespace Namespace ns = null; String uri = node.getNamespaceURI(); if (uri == null) { ns = (current == null) ? Namespace.NO_NAMESPACE : current.getNamespace(prefix); } else { ns = Namespace.getNamespace(prefix, uri); } Element element = factory.element(localName, ns); if (atRoot) { // If at root, set as document root doc.setRootElement(element); // XXX should we use a factory call? } else { // else add to parent element factory.addContent(current, element); } // Add namespaces NamedNodeMap attributeList = node.getAttributes(); int attsize = attributeList.getLength(); for (int i = 0; i < attsize; i++) { Attr att = (Attr) attributeList.item(i); String attname = att.getName(); if (attname.startsWith("xmlns")) { String attPrefix = ""; colon = attname.indexOf(':'); if (colon >= 0) { attPrefix = attname.substring(colon + 1); } String attvalue = att.getValue(); Namespace declaredNS = Namespace.getNamespace(attPrefix, attvalue); // Add as additional namespaces if it's different // than this element's namespace (perhaps we should // also have logic not to mark them as additional if // it's been done already, but it probably doesn't // matter) if (prefix.equals(attPrefix)) { element.setNamespace(declaredNS); } else { factory.addNamespaceDeclaration(element, declaredNS); } } } // Add attributes for (int i = 0; i < attsize; i++) { Attr att = (Attr) attributeList.item(i); String attname = att.getName(); if ( !attname.startsWith("xmlns")) { String attPrefix = ""; String attLocalName = attname; colon = attname.indexOf(':'); if (colon >= 0) { attPrefix = attname.substring(0, colon); attLocalName = attname.substring(colon + 1); } String attvalue = att.getValue(); // Get attribute's namespace Namespace attns = null; if ("".equals(attPrefix)) { attns = Namespace.NO_NAMESPACE; } else { attns = element.getNamespace(attPrefix); } Attribute attribute = factory.attribute(attLocalName, attvalue, attns); factory.setAttribute(element, attribute); } } // Recurse on child nodes // The list should never be null nor should it ever contain // null nodes, but some DOM impls are broken NodeList children = node.getChildNodes(); if (children != null) { int size = children.getLength(); for (int i = 0; i < size; i++) { Node item = children.item(i); if (item != null) { buildTree(item, doc, element, false); } } } break; case Node.TEXT_NODE: String data = node.getNodeValue(); factory.addContent(current, factory.text(data)); break; case Node.CDATA_SECTION_NODE: String cdata = node.getNodeValue(); factory.addContent(current, factory.cdata(cdata)); break; case Node.PROCESSING_INSTRUCTION_NODE: if (atRoot) { factory.addContent(doc, factory.processingInstruction(node.getNodeName(), node.getNodeValue())); } else { factory.addContent(current, factory.processingInstruction(node.getNodeName(), node.getNodeValue())); } break; case Node.COMMENT_NODE: if (atRoot) { factory.addContent(doc, factory.comment(node.getNodeValue())); } else { factory.addContent(current, factory.comment(node.getNodeValue())); } break; case Node.ENTITY_REFERENCE_NODE: EntityRef entity = factory.entityRef(node.getNodeName()); factory.addContent(current, entity); break; case Node.ENTITY_NODE: // ?? break; case Node.DOCUMENT_TYPE_NODE: DocumentType domDocType = (DocumentType)node; String publicID = domDocType.getPublicId(); String systemID = domDocType.getSystemId(); String internalDTD = domDocType.getInternalSubset(); DocType docType = factory.docType(domDocType.getName()); docType.setPublicID(publicID); docType.setSystemID(systemID); docType.setInternalSubset(internalDTD); factory.addContent(doc, docType); break; } } } extensions/xml/jdom-1.0/src/org/jdom/input/JAXPParserFactory.java000066400000000000000000000157651335566474600251230ustar00rootroot00000000000000/*-- $Id: JAXPParserFactory.java,v 1.1.1.1 2005/12/02 14:16:50 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.input; import java.util.*; import javax.xml.parsers.*; import org.jdom.*; import org.xml.sax.*; /** * A non-public utility class to allocate JAXP SAX parsers. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:50 $ * @author Laurent Bihanic */ class JAXPParserFactory { // package protected private static final String CVS_ID = "@(#) $RCSfile: JAXPParserFactory.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:50 $ $Name: $"; /** JAXP 1.2 schema language property id. */ private static final String JAXP_SCHEMA_LANGUAGE_PROPERTY = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; /** JAXP 1.2 schema location property id. */ private static final String JAXP_SCHEMA_LOCATION_PROPERTY = "http://java.sun.com/xml/jaxp/properties/schemaSource"; /** * Private constructor to forbid allocating instances of this utility * class. */ private JAXPParserFactory() { // Never called. } /* Implementor's note regarding createParser() design: The features and properties are normally set in SAXBuilder, but we take them in createParser() as well because some features or properties may need to be applied during the JAXP parser construction. Today, for example, properties is used as it's the only way to configure schema validation: JAXP defines schema validation properties but SAX does not. This reflects in the Apache Xerces implementation where the SAXParser implementation supports the JAXP properties but the XMLReader does not. Hence, configuring schema validation must be done on the SAXParser object which is only visible in JAXParserFactory. Features is also passed in case some future JAXP release defines JAXP-specific features. */ /** * Creates a SAX parser allocated through the configured JAXP SAX * parser factory. * * @param validating whether a validating parser is requested. * @param features the user-defined SAX features. * @param properties the user-defined SAX properties. * * @return a configured XMLReader. * * @throws JDOMException if any error occurred when allocating or * configuring the JAXP SAX parser. */ public static XMLReader createParser(boolean validating, Map features, Map properties) throws JDOMException { try { SAXParser parser = null; // Allocate and configure JAXP SAX parser factory. SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(validating); factory.setNamespaceAware(true); try { // Allocate parser. parser = factory.newSAXParser(); } catch (ParserConfigurationException e) { throw new JDOMException("Could not allocate JAXP SAX Parser", e); } // Set user-defined JAXP properties (if any) setProperty(parser, properties, JAXP_SCHEMA_LANGUAGE_PROPERTY); setProperty(parser, properties, JAXP_SCHEMA_LOCATION_PROPERTY); // Return configured SAX XMLReader. return parser.getXMLReader(); } catch (SAXException e) { throw new JDOMException("Could not allocate JAXP SAX Parser", e); } } /** * Sets a property on a JAXP SAX parser object if and only if it * is declared in the user-defined properties. * * @param parser the JAXP SAX parser to configure. * @param properties the user-defined SAX properties. * @param name the name of the property to set. * * @throws JDOMException if any error occurred while configuring * the property. */ private static void setProperty(SAXParser parser, Map properties, String name) throws JDOMException { try { if (properties.containsKey(name)) { parser.setProperty(name, properties.get(name)); } } catch (SAXNotSupportedException e) { throw new JDOMException( name + " property not supported for JAXP parser " + parser.getClass().getName()); } catch (SAXNotRecognizedException e) { throw new JDOMException( name + " property not recognized for JAXP parser " + parser.getClass().getName()); } } } extensions/xml/jdom-1.0/src/org/jdom/input/JDOMParseException.java000066400000000000000000000147071335566474600252520ustar00rootroot00000000000000/*-- $Id: JDOMParseException.java,v 1.1.1.1 2005/12/02 14:16:50 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.input; import org.jdom.*; import org.xml.sax.*; /** * Thrown during parse errors, with information about where the parse error * occurred as well as access to the partially built document. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:50 $ * @author Laurent Bihanic */ public class JDOMParseException extends JDOMException { private static final String CVS_ID = "@(#) $RCSfile: JDOMParseException.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:50 $ $Name: $"; /** * The portion of the document that was successfully built before * the parse error occurred. */ private final Document partialDocument; /** * This will create a parse Exception with the given * message and wrap the Exception that cause a document * parse to fail. * * @param message String message indicating * the problem that occurred. * @param cause Throwable that caused this * to be thrown. */ public JDOMParseException(String message, Throwable cause) { this(message, cause, null); } /** * This will create a parse Exception with the given * message and the partial document and wrap the * Exception that cause a document parse to fail. * * @param message String message indicating * the problem that occurred. * @param cause Throwable that caused this * to be thrown. * @param partialDocument Document the portion of * the input XML document that was * successfully built. */ public JDOMParseException(String message, Throwable cause, Document partialDocument) { super(message, cause); this.partialDocument = partialDocument; } /** * Returns the partial document that was successfully built before * the error occurred. * * @return the partial document or null if none. */ public Document getPartialDocument() { return partialDocument; } /** * Returns the public identifier of the entity where the * parse error occurred. * * @return a string containing the public identifier, or * null if the information is not available. */ public String getPublicId() { return (getCause() instanceof SAXParseException)? ((SAXParseException)getCause()).getPublicId(): null; } /** * Returns the system identifier of the entity where the * parse error occurred. * * @return a string containing the system identifier, or * null if the information is not available. */ public String getSystemId() { return (getCause() instanceof SAXParseException)? ((SAXParseException)getCause()).getSystemId(): null; } /** * Returns the line number of the end of the text where the * parse error occurred. *

* The first line in the document is line 1.

* * @return an integer representing the line number, or -1 * if the information is not available. */ public int getLineNumber() { return (getCause() instanceof SAXParseException)? ((SAXParseException)getCause()).getLineNumber(): -1; } /** * Returns the column number of the end of the text where the * parse error occurred. *

* The first column in a line is position 1.

* * @return an integer representing the column number, or -1 * if the information is not available. */ public int getColumnNumber() { return (getCause() instanceof SAXParseException)? ((SAXParseException)getCause()).getColumnNumber(): -1; } } extensions/xml/jdom-1.0/src/org/jdom/input/SAXBuilder.java000066400000000000000000001105151335566474600236030ustar00rootroot00000000000000/*-- $Id: SAXBuilder.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.input; import java.io.*; import java.lang.reflect.*; import java.net.*; import java.util.*; import org.jdom.*; import org.xml.sax.*; import org.xml.sax.helpers.XMLReaderFactory; /** * Builds a JDOM document from files, streams, readers, URLs, or a SAX {@link * org.xml.sax.InputSource} instance using a SAX parser. The builder uses a * third-party SAX parser (chosen by JAXP by default, or you can choose * manually) to handle the parsing duties and simply listens to the SAX events * to construct a document. Details which SAX does not provide, such as * whitespace outside the root element, are not represented in the JDOM * document. Information about SAX can be found at http://www.saxproject.org. *

* Known issues: Relative paths for a {@link DocType} or {@link EntityRef} may * be converted by the SAX parser into absolute paths. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Jason Hunter * @author Brett McLaughlin * @author Dan Schaffer * @author Philip Nelson * @author Alex Rosen */ public class SAXBuilder { private static final String CVS_ID = "@(#) $RCSfile: SAXBuilder.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** * Default parser class to use. This is used when no other parser * is given and JAXP isn't available. */ private static final String DEFAULT_SAX_DRIVER = "org.apache.xerces.parsers.SAXParser"; /** Whether validation should occur */ private boolean validate; /** Whether expansion of entities should occur */ private boolean expand = true; /** Adapter class to use */ private String saxDriverClass; /** ErrorHandler class to use */ private ErrorHandler saxErrorHandler = null; /** EntityResolver class to use */ private EntityResolver saxEntityResolver = null; /** DTDHandler class to use */ private DTDHandler saxDTDHandler = null; /** XMLFilter instance to use */ private XMLFilter saxXMLFilter = null; /** The factory for creating new JDOM objects */ private JDOMFactory factory = new DefaultJDOMFactory(); /** Whether to ignore ignorable whitespace */ private boolean ignoringWhite = false; /** User-specified features to be set on the SAX parser */ private HashMap features = new HashMap(5); /** User-specified properties to be set on the SAX parser */ private HashMap properties = new HashMap(5); /** * Whether parser reuse is allowed. *

Default: true

*/ private boolean reuseParser = true; /** The current SAX parser, if parser reuse has been activated. */ private XMLReader saxParser = null; /** * Creates a new SAXBuilder which will attempt to first locate * a parser via JAXP, then will try to use a set of default * SAX Drivers. The underlying parser will not validate. */ public SAXBuilder() { this(false); } /** * Creates a new SAXBuilder which will attempt to first locate * a parser via JAXP, then will try to use a set of default * SAX Drivers. The underlying parser will validate or not * according to the given parameter. * * @param validate boolean indicating if * validation should occur. */ public SAXBuilder(boolean validate) { this.validate = validate; } /** * Creates a new SAXBuilder using the specified SAX parser. * The underlying parser will not validate. * * @param saxDriverClass String name of SAX Driver * to use for parsing. */ public SAXBuilder(String saxDriverClass) { this(saxDriverClass, false); } /** * Creates a new SAXBuilder using the specified SAX parser. * The underlying parser will validate or not * according to the given parameter. * * @param saxDriverClass String name of SAX Driver * to use for parsing. * @param validate boolean indicating if * validation should occur. */ public SAXBuilder(String saxDriverClass, boolean validate) { this.saxDriverClass = saxDriverClass; this.validate = validate; } /** * Returns the driver class assigned in the constructor, or null if none. * * @return the driver class assigned in the constructor */ public String getDriverClass() { return saxDriverClass; } /** * Returns the current {@link org.jdom.JDOMFactory} in use. * @return the factory in use */ public JDOMFactory getFactory() { return factory; } /** * This sets a custom JDOMFactory for the builder. Use this to build * the tree with your own subclasses of the JDOM classes. * * @param factory JDOMFactory to use */ public void setFactory(JDOMFactory factory) { this.factory = factory; } /** * Returns whether validation is to be performed during the build. * * @return whether validation is to be performed during the build */ public boolean getValidation() { return validate; } /** * This sets validation for the builder. * * @param validate boolean indicating whether validation * should occur. */ public void setValidation(boolean validate) { this.validate = validate; } /** * Returns the {@link ErrorHandler} assigned, or null if none. * @return the ErrorHandler assigned, or null if none */ public ErrorHandler getErrorHandler() { return saxErrorHandler; } /** * This sets custom ErrorHandler for the Builder. * * @param errorHandler ErrorHandler */ public void setErrorHandler(ErrorHandler errorHandler) { saxErrorHandler = errorHandler; } /** * Returns the {@link EntityResolver} assigned, or null if none. * * @return the EntityResolver assigned */ public EntityResolver getEntityResolver() { return saxEntityResolver; } /** * This sets custom EntityResolver for the Builder. * * @param entityResolver EntityResolver */ public void setEntityResolver(EntityResolver entityResolver) { saxEntityResolver = entityResolver; } /** * Returns the {@link DTDHandler} assigned, or null if none. * * @return the DTDHandler assigned */ public DTDHandler getDTDHandler() { return saxDTDHandler; } /** * This sets custom DTDHandler for the Builder. * * @param dtdHandler DTDHandler */ public void setDTDHandler(DTDHandler dtdHandler) { saxDTDHandler = dtdHandler; } /** * Returns the {@link XMLFilter} used during parsing, or null if none. * * @return the XMLFilter used during parsing */ public XMLFilter getXMLFilter() { return saxXMLFilter; } /** * This sets a custom {@link org.xml.sax.XMLFilter} for the builder. * * @param xmlFilter the filter to use */ public void setXMLFilter(XMLFilter xmlFilter) { saxXMLFilter = xmlFilter; } /** * Returns whether element content whitespace is to be ignored during the * build. * * @return whether element content whitespace is to be ignored during the * build */ public boolean getIgnoringElementContentWhitespace() { return ignoringWhite; } /** * Specifies whether or not the parser should elminate whitespace in * element content (sometimes known as "ignorable whitespace") when * building the document. Only whitespace which is contained within * element content that has an element only content model will be * eliminated (see XML Rec 3.2.1). For this setting to take effect * requires that validation be turned on. The default value of this * setting is false. * * @param ignoringWhite Whether to ignore ignorable whitespace */ public void setIgnoringElementContentWhitespace(boolean ignoringWhite) { this.ignoringWhite = ignoringWhite; } /** * Returns whether the contained SAX parser instance is reused across * multiple parses. The default is true. * * @return whether the contained SAX parser instance is reused across * multiple parses */ public boolean getReuseParser() { return reuseParser; } /** * Specifies whether this builder shall reuse the same SAX parser * when performing subsequent parses or allocate a new parser for * each parse. The default value of this setting is * true (parser reuse). *

* Note: As SAX parser instances are not thread safe, * the parser reuse feature should not be used with SAXBuilder instances * shared among threads.

* * @param reuseParser Whether to reuse the SAX parser. */ public void setReuseParser(boolean reuseParser) { this.reuseParser = reuseParser; this.saxParser = null; } /** * This sets a feature on the SAX parser. See the SAX documentation for *

*

* NOTE: SAXBuilder requires that some particular features of the SAX parser be * set up in certain ways for it to work properly. The list of such features * may change in the future. Therefore, the use of this method may cause * parsing to break, and even if it doesn't break anything today it might * break parsing in a future JDOM version, because what JDOM parsers require * may change over time. Use with caution. *

* * @param name The feature name, which is a fully-qualified URI. * @param value The requested state of the feature (true or false). */ public void setFeature(String name, boolean value) { // Save the specified feature for later. features.put(name, new Boolean(value)); } /** * This sets a property on the SAX parser. See the SAX documentation for * more information. *

* NOTE: SAXBuilder requires that some particular properties of the SAX parser be * set up in certain ways for it to work properly. The list of such properties * may change in the future. Therefore, the use of this method may cause * parsing to break, and even if it doesn't break anything today it might * break parsing in a future JDOM version, because what JDOM parsers require * may change over time. Use with caution. *

* * @param name The property name, which is a fully-qualified URI. * @param value The requested value for the property. */ public void setProperty(String name, Object value) { // Save the specified property for later. properties.put(name, value); } /** * This builds a document from the supplied * input source. * * @param in InputSource to read from * @return Document resultant Document object * @throws JDOMException when errors occur in parsing * @throws IOException when an I/O error prevents a document * from being fully parsed */ public Document build(InputSource in) throws JDOMException, IOException { SAXHandler contentHandler = null; try { // Create and configure the content handler. contentHandler = createContentHandler(); configureContentHandler(contentHandler); XMLReader parser = this.saxParser; if (parser == null) { // Create and configure the parser. parser = createParser(); // Install optional filter if (saxXMLFilter != null) { // Connect filter chain to parser XMLFilter root = saxXMLFilter; while (root.getParent() instanceof XMLFilter) { root = (XMLFilter)root.getParent(); } root.setParent(parser); // Read from filter parser = saxXMLFilter; } // Configure parser configureParser(parser, contentHandler); if (reuseParser == true) { this.saxParser = parser; } } else { // Reset content handler as SAXHandler instances cannot // be reused configureParser(parser, contentHandler); } // Parse the document. parser.parse(in); return contentHandler.getDocument(); } catch (SAXParseException e) { Document doc = contentHandler.getDocument(); if (doc.hasRootElement() == false) { doc = null; } String systemId = e.getSystemId(); if (systemId != null) { throw new JDOMParseException("Error on line " + e.getLineNumber() + " of document " + systemId, e, doc); } else { throw new JDOMParseException("Error on line " + e.getLineNumber(), e, doc); } } catch (SAXException e) { throw new JDOMParseException("Error in building: " + e.getMessage(), e, contentHandler.getDocument()); } finally { // Explicitly nullify the handler to encourage GC // It's a stack var so this shouldn't be necessary, but it // seems to help on some JVMs contentHandler = null; } } /** * This creates the SAXHandler that will be used to build the Document. * * @return SAXHandler - resultant SAXHandler object. */ protected SAXHandler createContentHandler() { SAXHandler contentHandler = new SAXHandler(factory); return contentHandler; } /** * This configures the SAXHandler that will be used to build the Document. *

* The default implementation simply passes through some configuration * settings that were set on the SAXBuilder: setExpandEntities() and * setIgnoringElementContentWhitespace(). *

*/ protected void configureContentHandler(SAXHandler contentHandler) { // Setup pass through behavior contentHandler.setExpandEntities(expand); contentHandler.setIgnoringElementContentWhitespace(ignoringWhite); } /** * This creates the XMLReader to be used for reading the XML document. *

* The default behavior is to (1) use the saxDriverClass, if it has been * set, (2) try to obtain a parser from JAXP, if it is available, and * (3) if all else fails, use a hard-coded default parser (currently * the Xerces parser). Subclasses may override this method to determine * the parser to use in a different way. *

* * @return XMLReader - resultant XMLReader object. */ protected XMLReader createParser() throws JDOMException { XMLReader parser = null; if (saxDriverClass != null) { // The user knows that they want to use a particular class try { parser = XMLReaderFactory.createXMLReader(saxDriverClass); // Configure parser setFeaturesAndProperties(parser, true); } catch (SAXException e) { throw new JDOMException("Could not load " + saxDriverClass, e); } } else { // Try using JAXP... // Note we need JAXP 1.1, and if JAXP 1.0 is all that's // available then the getXMLReader call fails and we skip // to the hard coded default parser try { // Get factory class and method. Class factoryClass = Class.forName("org.jdom.input.JAXPParserFactory"); Method createParser = factoryClass.getMethod("createParser", new Class[] { boolean.class, Map.class, Map.class }); // Create SAX parser. parser = (XMLReader)createParser.invoke(null, new Object[] { new Boolean(validate), features, properties }); // Configure parser setFeaturesAndProperties(parser, false); } catch (JDOMException e) { throw e; } catch (NoClassDefFoundError e) { // The class loader failed to resolve the dependencies // of org.jdom.input.JAXPParserFactory. This probably means // that no JAXP parser is present in its class path. // => Ignore and try allocating default SAX parser instance. } catch (Exception e) { // Ignore and try allocating default SAX parser instance. } } // Check to see if we got a parser yet, if not, try to use a // hard coded default if (parser == null) { try { parser = XMLReaderFactory.createXMLReader(DEFAULT_SAX_DRIVER); // System.out.println("using default " + DEFAULT_SAX_DRIVER); saxDriverClass = parser.getClass().getName(); // Configure parser setFeaturesAndProperties(parser, true); } catch (SAXException e) { throw new JDOMException("Could not load default SAX parser: " + DEFAULT_SAX_DRIVER, e); } } return parser; } /** * This configures the XMLReader to be used for reading the XML document. *

* The default implementation sets various options on the given XMLReader, * such as validation, DTD resolution, entity handlers, etc., according * to the options that were set (e.g. via setEntityResolver) * and set various SAX properties and features that are required for JDOM * internals. These features may change in future releases, so change this * behavior at your own risk. *

*/ protected void configureParser(XMLReader parser, SAXHandler contentHandler) throws JDOMException { // Setup SAX handlers. parser.setContentHandler(contentHandler); if (saxEntityResolver != null) { parser.setEntityResolver(saxEntityResolver); } if (saxDTDHandler != null) { parser.setDTDHandler(saxDTDHandler); } else { parser.setDTDHandler(contentHandler); } if (saxErrorHandler != null) { parser.setErrorHandler(saxErrorHandler); } else { parser.setErrorHandler(new BuilderErrorHandler()); } // Setup lexical reporting. boolean lexicalReporting = false; try { parser.setProperty("http://xml.org/sax/handlers/LexicalHandler", contentHandler); lexicalReporting = true; } catch (SAXNotSupportedException e) { // No lexical reporting available } catch (SAXNotRecognizedException e) { // No lexical reporting available } // Some parsers use alternate property for lexical handling (grr...) if (!lexicalReporting) { try { parser.setProperty( "http://xml.org/sax/properties/lexical-handler", contentHandler); lexicalReporting = true; } catch (SAXNotSupportedException e) { // No lexical reporting available } catch (SAXNotRecognizedException e) { // No lexical reporting available } } // Try setting the DeclHandler if entity expansion is off if (!expand) { try { parser.setProperty( "http://xml.org/sax/properties/declaration-handler", contentHandler); } catch (SAXNotSupportedException e) { // No lexical reporting available } catch (SAXNotRecognizedException e) { // No lexical reporting available } } } private void setFeaturesAndProperties(XMLReader parser, boolean coreFeatures) throws JDOMException { // Set any user-specified features on the parser. Iterator iter = features.keySet().iterator(); while (iter.hasNext()) { String name = (String)iter.next(); Boolean value = (Boolean)features.get(name); internalSetFeature(parser, name, value.booleanValue(), name); } // Set any user-specified properties on the parser. iter = properties.keySet().iterator(); while (iter.hasNext()) { String name = (String)iter.next(); internalSetProperty(parser, name, properties.get(name), name); } if (coreFeatures) { // Set validation. try { internalSetFeature(parser, "http://xml.org/sax/features/validation", validate, "Validation"); } catch (JDOMException e) { // If validation is not supported, and the user is requesting // that we don't validate, that's fine - don't throw an // exception. if (validate) throw e; } // Setup some namespace features. internalSetFeature(parser, "http://xml.org/sax/features/namespaces", true, "Namespaces"); internalSetFeature(parser, "http://xml.org/sax/features/namespace-prefixes", true, "Namespace prefixes"); } // Set entity expansion // Note SAXHandler can work regardless of how this is set, but when // entity expansion it's worth it to try to tell the parser not to // even bother with external general entities. // Apparently no parsers yet support this feature. // XXX It might make sense to setEntityResolver() with a resolver // that simply ignores external general entities try { if (parser.getFeature("http://xml.org/sax/features/external-general-entities") != expand) { parser.setFeature("http://xml.org/sax/features/external-general-entities", expand); } } catch (SAXNotRecognizedException e) { /* Ignore... */ } catch (SAXNotSupportedException e) { /* Ignore... */ } } /** * Tries to set a feature on the parser. If the feature cannot be set, * throws a JDOMException describing the problem. */ private void internalSetFeature(XMLReader parser, String feature, boolean value, String displayName) throws JDOMException { try { parser.setFeature(feature, value); } catch (SAXNotSupportedException e) { throw new JDOMException( displayName + " feature not supported for SAX driver " + parser.getClass().getName()); } catch (SAXNotRecognizedException e) { throw new JDOMException( displayName + " feature not recognized for SAX driver " + parser.getClass().getName()); } } /** *

* Tries to set a property on the parser. If the property cannot be set, * throws a JDOMException describing the problem. *

*/ private void internalSetProperty(XMLReader parser, String property, Object value, String displayName) throws JDOMException { try { parser.setProperty(property, value); } catch (SAXNotSupportedException e) { throw new JDOMException( displayName + " property not supported for SAX driver " + parser.getClass().getName()); } catch (SAXNotRecognizedException e) { throw new JDOMException( displayName + " property not recognized for SAX driver " + parser.getClass().getName()); } } /** *

* This builds a document from the supplied * input stream. *

* * @param in InputStream to read from * @return Document resultant Document object * @throws JDOMException when errors occur in parsing * @throws IOException when an I/O error prevents a document * from being fully parsed. */ public Document build(InputStream in) throws JDOMException, IOException { return build(new InputSource(in)); } /** *

* This builds a document from the supplied * filename. *

* * @param file File to read from * @return Document resultant Document object * @throws JDOMException when errors occur in parsing * @throws IOException when an I/O error prevents a document * from being fully parsed */ public Document build(File file) throws JDOMException, IOException { try { URL url = fileToURL(file); return build(url); } catch (MalformedURLException e) { throw new JDOMException("Error in building", e); } } /** *

* This builds a document from the supplied * URL. *

* * @param url URL to read from. * @return Document - resultant Document object. * @throws JDOMException when errors occur in parsing * @throws IOException when an I/O error prevents a document * from being fully parsed. */ public Document build(URL url) throws JDOMException, IOException { String systemID = url.toExternalForm(); return build(new InputSource(systemID)); } /** *

* This builds a document from the supplied * input stream. *

* * @param in InputStream to read from. * @param systemId base for resolving relative URIs * @return Document resultant Document object * @throws JDOMException when errors occur in parsing * @throws IOException when an I/O error prevents a document * from being fully parsed */ public Document build(InputStream in, String systemId) throws JDOMException, IOException { InputSource src = new InputSource(in); src.setSystemId(systemId); return build(src); } /** *

* This builds a document from the supplied * Reader. It's the programmer's responsibility to make sure * the reader matches the encoding of the file. It's often easier * and safer to use an InputStream rather than a Reader, and to let the * parser auto-detect the encoding from the XML declaration. *

* * @param characterStream Reader to read from * @return Document resultant Document object * @throws JDOMException when errors occur in parsing * @throws IOException when an I/O error prevents a document * from being fully parsed */ public Document build(Reader characterStream) throws JDOMException, IOException { return build(new InputSource(characterStream)); } /** *

* This builds a document from the supplied * Reader. It's the programmer's responsibility to make sure * the reader matches the encoding of the file. It's often easier * and safer to use an InputStream rather than a Reader, and to let the * parser auto-detect the encoding from the XML declaration. *

* * @param characterStream Reader to read from. * @param systemId base for resolving relative URIs * @return Document resultant Document object * @throws JDOMException when errors occur in parsing * @throws IOException when an I/O error prevents a document * from being fully parsed */ public Document build(Reader characterStream, String systemId) throws JDOMException, IOException { InputSource src = new InputSource(characterStream); src.setSystemId(systemId); return build(src); } /** *

* This builds a document from the supplied * URI. *

* @param systemId URI for the input * @return Document resultant Document object * @throws JDOMException when errors occur in parsing * @throws IOException when an I/O error prevents a document * from being fully parsed */ public Document build(String systemId) throws JDOMException, IOException { return build(new InputSource(systemId)); } // /** // * Imitation of File.toURL(), a JDK 1.2 method, reimplemented // * here to work with JDK 1.1. // * // * @see java.io.File // * // * @param f the file to convert // * @return the file path converted to a file: URL // */ // protected URL fileToURL(File f) throws MalformedURLException { // String path = f.getAbsolutePath(); // if (File.separatorChar != '/') { // path = path.replace(File.separatorChar, '/'); // } // if (!path.startsWith("/")) { // path = "/" + path; // } // if (!path.endsWith("/") && f.isDirectory()) { // path = path + "/"; // } // return new URL("file", "", path); // } /** Custom File.toUrl() implementation to handle special chars in file names * * @param file file object whose path will be converted * @return URL form of the file, with special characters handled * @throws MalformedURLException if there's a problem constructing a URL */ private static URL fileToURL(File file) throws MalformedURLException { StringBuilder buffer = new StringBuilder(); String path = file.getAbsolutePath(); // Convert non-URL style file separators if (File.separatorChar != '/') { path = path.replace(File.separatorChar, '/'); } // Make sure it starts at root if (!path.startsWith("/")) { buffer.append('/'); } // Copy, converting URL special characters as we go int len = path.length(); for (int i = 0; i < len; i++) { char c = path.charAt(i); if (c == ' ') buffer.append("%20"); else if (c == '#') buffer.append("%23"); else if (c == '%') buffer.append("%25"); else if (c == '&') buffer.append("%26"); else if (c == ';') buffer.append("%3B"); else if (c == '<') buffer.append("%3C"); else if (c == '=') buffer.append("%3D"); else if (c == '>') buffer.append("%3E"); else if (c == '?') buffer.append("%3F"); else if (c == '~') buffer.append("%7E"); else buffer.append(c); } // Make sure directories end with slash if (!path.endsWith("/") && file.isDirectory()) { buffer.append('/'); } // Return URL return new URL("file", "", buffer // JCLIC modification //.toString() .substring(0) ); } /** * Returns whether or not entities are being expanded into normal text * content. * * @return whether entities are being expanded */ public boolean getExpandEntities() { return expand; } /** *

* This sets whether or not to expand entities for the builder. * A true means to expand entities as normal content. A false means to * leave entities unexpanded as EntityRef objects. The * default is true. *

*

* When this setting is false, the internal DTD subset is retained; when * this setting is true, the internal DTD subset is not retained. *

*

* Note that Xerces (at least up to 1.4.4) has a bug where entities * in attribute values will be misreported if this flag is turned off, * resulting in entities to appear within element content. When turning * entity expansion off either avoid entities in attribute values, or * use another parser like Crimson. * http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6111 *

* * @param expand boolean indicating whether entity expansion * should occur. */ public void setExpandEntities(boolean expand) { this.expand = expand; } } extensions/xml/jdom-1.0/src/org/jdom/input/SAXHandler.java000066400000000000000000001031431335566474600235710ustar00rootroot00000000000000/*-- $Id: SAXHandler.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.input; import java.util.*; import org.jdom.*; import org.xml.sax.*; import org.xml.sax.ext.*; import org.xml.sax.helpers.*; /** * A support class for {@link SAXBuilder}. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter * @author Philip Nelson * @author Bradley S. Huffman * @author phil@triloggroup.com */ public class SAXHandler extends DefaultHandler implements LexicalHandler, DeclHandler, DTDHandler { private static final String CVS_ID = "@(#) $RCSfile: SAXHandler.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** Hash table to map SAX attribute type names to JDOM attribute types. */ private static final Map attrNameToTypeMap = new HashMap(13); /** Document object being built */ private Document document; /** Element object being built */ private Element currentElement; /** Indicator of where in the document we are */ private boolean atRoot; /** Indicator of whether we are in the DocType. Note that the DTD consists * of both the internal subset (inside the tag) and the * external subset (in a separate .dtd file). */ private boolean inDTD = false; /** Indicator of whether we are in the internal subset */ private boolean inInternalSubset = false; /** Indicator of whether we previously were in a CDATA */ private boolean previousCDATA = false; /** Indicator of whether we are in a CDATA */ private boolean inCDATA = false; /** Indicator of whether we should expand entities */ private boolean expand = true; /** Indicator of whether we are actively suppressing (non-expanding) a current entity */ private boolean suppress = false; /** How many nested entities we're currently within */ private int entityDepth = 0; // XXX may not be necessary anymore? /** Temporary holder for namespaces that have been declared with * startPrefixMapping, but are not yet available on the element */ private List declaredNamespaces; /** Temporary holder for the internal subset */ private StringBuilder internalSubset = new StringBuilder(); /** Temporary holder for Text and CDATA */ private TextBuffer textBuffer = new TextBuffer(); /** The external entities defined in this document */ private Map externalEntities; /** The JDOMFactory used for JDOM object creation */ private JDOMFactory factory; /** Whether to ignore ignorable whitespace */ private boolean ignoringWhite = false; /** The SAX Locator object provided by the parser */ private Locator locator; /** * Class initializer: Populate a table to translate SAX attribute * type names into JDOM attribute type value (integer). *

* Note that all the mappings defined below are compliant with * the SAX 2.0 specification exception for "ENUMERATION" with is * specific to Crimson 1.1.X and Xerces 2.0.0-betaX which report * attributes of enumerated types with a type "ENUMERATION" * instead of the expected "NMTOKEN". *

*

* Note also that Xerces 1.4.X is not SAX 2.0 compliant either * but handling its case requires * {@link #getAttributeType specific code}. *

*/ static { attrNameToTypeMap.put("CDATA", new Integer(Attribute.CDATA_TYPE)); attrNameToTypeMap.put("ID", new Integer(Attribute.ID_TYPE)); attrNameToTypeMap.put("IDREF", new Integer(Attribute.IDREF_TYPE)); attrNameToTypeMap.put("IDREFS", new Integer(Attribute.IDREFS_TYPE)); attrNameToTypeMap.put("ENTITY", new Integer(Attribute.ENTITY_TYPE)); attrNameToTypeMap.put("ENTITIES", new Integer(Attribute.ENTITIES_TYPE)); attrNameToTypeMap.put("NMTOKEN", new Integer(Attribute.NMTOKEN_TYPE)); attrNameToTypeMap.put("NMTOKENS", new Integer(Attribute.NMTOKENS_TYPE)); attrNameToTypeMap.put("NOTATION", new Integer(Attribute.NOTATION_TYPE)); attrNameToTypeMap.put("ENUMERATION", new Integer(Attribute.ENUMERATED_TYPE)); } /** * This will create a new SAXHandler that listens to SAX * events and creates a JDOM Document. The objects will be constructed * using the default factory. */ public SAXHandler() { this(null); } /** * This will create a new SAXHandler that listens to SAX * events and creates a JDOM Document. The objects will be constructed * using the provided factory. * * @param factory JDOMFactory to be used for constructing * objects */ public SAXHandler(JDOMFactory factory) { if (factory != null) { this.factory = factory; } else { this.factory = new DefaultJDOMFactory(); } atRoot = true; declaredNamespaces = new ArrayList(); externalEntities = new HashMap(); document = this.factory.document(null); } /** * Pushes an element onto the tree under construction. Allows subclasses * to put content under a dummy root element which is useful for building * content that would otherwise be a non-well formed document. * * @param element root element under which content will be built */ protected void pushElement(Element element) { if (atRoot) { document.setRootElement(element); // XXX should we use a factory call? atRoot = false; } else { factory.addContent(currentElement, element); } currentElement = element; } /** * Returns the document. Should be called after parsing is complete. * * @return Document - Document that was built */ public Document getDocument() { return document; } /** * Returns the factory used for constructing objects. * * @return JDOMFactory - the factory used for * constructing objects. * * @see #SAXHandler(org.jdom.JDOMFactory) */ public JDOMFactory getFactory() { return factory; } /** * This sets whether or not to expand entities during the build. * A true means to expand entities as normal content. A false means to * leave entities unexpanded as EntityRef objects. The * default is true. * * @param expand boolean indicating whether entity expansion * should occur. */ public void setExpandEntities(boolean expand) { this.expand = expand; } /** * Returns whether or not entities will be expanded during the * build. * * @return boolean - whether entity expansion * will occur during build. * * @see #setExpandEntities */ public boolean getExpandEntities() { return expand; } /** * Specifies whether or not the parser should elminate whitespace in * element content (sometimes known as "ignorable whitespace") when * building the document. Only whitespace which is contained within * element content that has an element only content model will be * eliminated (see XML Rec 3.2.1). For this setting to take effect * requires that validation be turned on. The default value of this * setting is false. * * @param ignoringWhite Whether to ignore ignorable whitespace */ public void setIgnoringElementContentWhitespace(boolean ignoringWhite) { this.ignoringWhite = ignoringWhite; } /** * Returns whether or not the parser will elminate whitespace in * element content (sometimes known as "ignorable whitespace") when * building the document. * * @return boolean - whether ignorable whitespace will * be ignored during build. * * @see #setIgnoringElementContentWhitespace */ public boolean getIgnoringElementContentWhitespace() { return ignoringWhite; } public void startDocument() { if (locator != null) { document.setBaseURI(locator.getSystemId()); } } /** * This is called when the parser encounters an external entity * declaration. * * @param name entity name * @param publicID public id * @param systemID system id * @throws SAXException when things go wrong */ public void externalEntityDecl(String name, String publicID, String systemID) throws SAXException { // Store the public and system ids for the name externalEntities.put(name, new String[]{publicID, systemID}); if (!inInternalSubset) return; internalSubset.append(" \n"); } /** * This handles an attribute declaration in the internal subset. * * @param eName String element name of attribute * @param aName String attribute name * @param type String attribute type * @param valueDefault String default value of attribute * @param value String value of attribute * @throws SAXException */ public void attributeDecl(String eName, String aName, String type, String valueDefault, String value) throws SAXException { if (!inInternalSubset) return; internalSubset.append(" \n"); } /** * Handle an element declaration in a DTD. * * @param name String name of element * @param model String model of the element in DTD syntax * @throws SAXException */ public void elementDecl(String name, String model) throws SAXException { // Skip elements that come from the external subset if (!inInternalSubset) return; internalSubset.append(" \n"); } /** * Handle an internal entity declaration in a DTD. * * @param name String name of entity * @param value String value of the entity * @throws SAXException */ public void internalEntityDecl(String name, String value) throws SAXException { // Skip entities that come from the external subset if (!inInternalSubset) return; internalSubset.append(" \n"); } /** * This will indicate that a processing instruction has been encountered. * (The XML declaration is not a processing instruction and will not * be reported.) * * @param target String target of PI * @param data String containing all data sent to the PI. * This typically looks like one or more attribute value * pairs. * @throws SAXException when things go wrong */ public void processingInstruction(String target, String data) throws SAXException { if (suppress) return; flushCharacters(); if (atRoot) { factory.addContent(document, factory.processingInstruction(target, data)); } else { factory.addContent(getCurrentElement(), factory.processingInstruction(target, data)); } } /** * This indicates that an unresolvable entity reference has been * encountered, normally because the external DTD subset has not been * read. * * @param name String name of entity * @throws SAXException when things go wrong */ public void skippedEntity(String name) throws SAXException { // We don't handle parameter entity references. if (name.startsWith("%")) return; flushCharacters(); factory.addContent(getCurrentElement(), factory.entityRef(name)); } /** * This will add the prefix mapping to the JDOM * Document object. * * @param prefix String namespace prefix. * @param uri String namespace URI. */ public void startPrefixMapping(String prefix, String uri) throws SAXException { if (suppress) return; Namespace ns = Namespace.getNamespace(prefix, uri); declaredNamespaces.add(ns); } /** * This reports the occurrence of an actual element. It will include * the element's attributes, with the exception of XML vocabulary * specific attributes, such as * xmlns:[namespace prefix] and * xsi:schemaLocation. * * @param namespaceURI String namespace URI this element * is associated with, or an empty * String * @param localName String name of element (with no * namespace prefix, if one is present) * @param qName String XML 1.0 version of element name: * [namespace prefix]:[localName] * @param atts Attributes list for this element * @throws SAXException when things go wrong */ public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if (suppress) return; Element element = null; if ((namespaceURI != null) && (!namespaceURI.equals(""))) { String prefix = ""; // Determine any prefix on the Element if (!qName.equals(localName)) { int split = qName.indexOf(":"); prefix = qName.substring(0, split); } Namespace elementNamespace = Namespace.getNamespace(prefix, namespaceURI); element = factory.element(localName, elementNamespace); } else { element = factory.element(localName); } // Take leftover declared namespaces and add them to this element's // map of namespaces if (declaredNamespaces.size() > 0) { transferNamespaces(element); } // Handle attributes for (int i=0, len=atts.getLength(); i{@link Element}
and * transfer its namespaces to the global namespace storage. * * @param element Element to read namespaces from. */ private void transferNamespaces(Element element) { Iterator i = declaredNamespaces.iterator(); while (i.hasNext()) { Namespace ns = (Namespace)i.next(); if (ns != element.getNamespace()) { element.addNamespaceDeclaration(ns); } } declaredNamespaces.clear(); } /** * This will report character data (within an element). * * @param ch char[] character array with character data * @param start int index in array where data starts. * @param length int length of data. * @throws SAXException */ public void characters(char[] ch, int start, int length) throws SAXException { if (suppress || (length == 0)) return; if (previousCDATA != inCDATA) { flushCharacters(); } textBuffer.append(ch, start, length); } /** * Capture ignorable whitespace as text. If * setIgnoringElementContentWhitespace(true) has been called then this * method does nothing. * * @param ch [] - char array of ignorable whitespace * @param start int - starting position within array * @param length int - length of whitespace after start * @throws SAXException when things go wrong */ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { if (!ignoringWhite) { characters(ch, start, length); } } /** * This will flush any characters from SAX character calls we've * been buffering. * * @throws SAXException when things go wrong */ protected void flushCharacters() throws SAXException { flushCharacters(textBuffer.toString()); textBuffer.clear(); } /** * Flush the given string into the document. This is a protected method * so subclassers can control text handling without knowledge of the * internals of this class. * * @param data string to flush */ protected void flushCharacters(String data) throws SAXException { if (data.length() == 0) { previousCDATA = inCDATA; return; } /** * This is commented out because of some problems with * the inline DTDs that Xerces seems to have. if (!inDTD) { if (inEntity) { getCurrentElement().setContent(factory.text(data)); } else { getCurrentElement().addContent(factory.text(data)); } */ if (previousCDATA) { factory.addContent(getCurrentElement(), factory.cdata(data)); } else { factory.addContent(getCurrentElement(), factory.text(data)); } previousCDATA = inCDATA; } /** * Indicates the end of an element * (</[element name]>) is reached. Note that * the parser does not distinguish between empty * elements and non-empty elements, so this will occur uniformly. * * @param namespaceURI String URI of namespace this * element is associated with * @param localName String name of element without prefix * @param qName String name of element in XML 1.0 form * @throws SAXException when things go wrong */ public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (suppress) return; flushCharacters(); if (!atRoot) { Parent p = currentElement.getParent(); if (p instanceof Document) { atRoot = true; } else { currentElement = (Element) p; } } else { throw new SAXException( "Ill-formed XML document (missing opening tag for " + localName + ")"); } } /** * This will signify that a DTD is being parsed, and can be * used to ensure that comments and other lexical structures * in the DTD are not added to the JDOM Document * object. * * @param name String name of element listed in DTD * @param publicID String public ID of DTD * @param systemID String system ID of DTD */ public void startDTD(String name, String publicID, String systemID) throws SAXException { flushCharacters(); // Is this needed here? factory.addContent(document, factory.docType(name, publicID, systemID)); inDTD = true; inInternalSubset = true; } /** * This signifies that the reading of the DTD is complete. * * @throws SAXException */ public void endDTD() throws SAXException { document.getDocType().setInternalSubset(internalSubset.toString()); inDTD = false; inInternalSubset = false; } public void startEntity(String name) throws SAXException { entityDepth++; if (expand || entityDepth > 1) { // Short cut out if we're expanding or if we're nested return; } // A "[dtd]" entity indicates the beginning of the external subset if (name.equals("[dtd]")) { inInternalSubset = false; return; } // Ignore DTD references, and translate the standard 5 if ((!inDTD) && (!name.equals("amp")) && (!name.equals("lt")) && (!name.equals("gt")) && (!name.equals("apos")) && (!name.equals("quot"))) { if (!expand) { String pub = null; String sys = null; String[] ids = (String[]) externalEntities.get(name); if (ids != null) { pub = ids[0]; // may be null, that's OK sys = ids[1]; // may be null, that's OK } /** * if no current element, this entity belongs to an attribute * in these cases, it is an error on the part of the parser * to call startEntity but this will help in some cases. * See org/xml/sax/ext/LexicalHandler.html#startEntity(java.lang.String) * for more information */ if (!atRoot) { flushCharacters(); EntityRef entity = factory.entityRef(name, pub, sys); // no way to tell if the entity was from an attribute or element so just assume element factory.addContent(getCurrentElement(), entity); } suppress = true; } } } public void endEntity(String name) throws SAXException { entityDepth--; if (entityDepth == 0) { // No way are we suppressing if not in an entity, // regardless of the "expand" value suppress = false; } if (name.equals("[dtd]")) { inInternalSubset = true; } } /** * Report a CDATA section * * @throws SAXException */ public void startCDATA() throws SAXException { if (suppress) return; inCDATA = true; } /** * Report a CDATA section */ public void endCDATA() throws SAXException { if (suppress) return; previousCDATA = true; inCDATA = false; } /** * This reports that a comments is parsed. If not in the * DTD, this comment is added to the current JDOM * Element, or the Document itself * if at that level. * * @param ch ch[] array of comment characters. * @param start int index to start reading from. * @param length int length of data. * @throws SAXException */ public void comment(char[] ch, int start, int length) throws SAXException { if (suppress) return; flushCharacters(); String commentText = new String(ch, start, length); if (inDTD && inInternalSubset && (expand == false)) { internalSubset.append(" \n"); return; } if ((!inDTD) && (!commentText.equals(""))) { if (atRoot) { factory.addContent(document, factory.comment(commentText)); } else { factory.addContent(getCurrentElement(), factory.comment(commentText)); } } } /** * Handle the declaration of a Notation in a DTD * * @param name name of the notation * @param publicID the public ID of the notation * @param systemID the system ID of the notation */ public void notationDecl(String name, String publicID, String systemID) throws SAXException { if (!inInternalSubset) return; internalSubset.append(" \n"); } /** * Handler for unparsed entity declarations in the DTD * * @param name String of the unparsed entity decl * @param publicID String of the unparsed entity decl * @param systemID String of the unparsed entity decl * @param notationName String of the unparsed entity decl */ public void unparsedEntityDecl(String name, String publicID, String systemID, String notationName) throws SAXException { if (!inInternalSubset) return; internalSubset.append(" \n"); } /** * Appends an external ID to the internal subset buffer. Either publicID * or systemID may be null, but not both. * * @param publicID the public ID * @param systemID the system ID */ private void appendExternalId(String publicID, String systemID) { if (publicID != null) { internalSubset.append(" PUBLIC \"") .append(publicID) .append('\"'); } if (systemID != null) { if (publicID == null) { internalSubset.append(" SYSTEM "); } else { internalSubset.append(' '); } internalSubset.append('\"') .append(systemID) .append('\"'); } } /** * Returns the being-parsed element. * * @return Element - element being built. * @throws SAXException */ public Element getCurrentElement() throws SAXException { if (currentElement == null) { throw new SAXException( "Ill-formed XML document (multiple root elements detected)"); } return currentElement; } /** * Returns the the JDOM Attribute type value from the SAX 2.0 * attribute type string provided by the parser. * * @param typeName String the SAX 2.0 attribute * type string. * * @return int the JDOM attribute type. * * @see Attribute#setAttributeType * @see Attributes#getType */ private static int getAttributeType(String typeName) { Integer type = (Integer)(attrNameToTypeMap.get(typeName)); if (type == null) { if (typeName != null && typeName.length() > 0 && typeName.charAt(0) == '(') { // Xerces 1.4.X reports attributes of enumerated type with // a type string equals to the enumeration definition, i.e. // starting with a parenthesis. return Attribute.ENUMERATED_TYPE; } else { return Attribute.UNDECLARED_TYPE; } } else { return type.intValue(); } } /** * Receives an object for locating the origin of SAX document * events. This method is invoked by the SAX parser. *

* {@link org.jdom.JDOMFactory} implementations can use the * {@link #getDocumentLocator} method to get access to the * {@link Locator} during parse. *

* * @param locator Locator an object that can return * the location of any SAX document event. */ public void setDocumentLocator(Locator locator) { this.locator = locator; } /** * Provides access to the {@link Locator} object provided by the * SAX parser. * * @return Locator an object that can return * the location of any SAX document event. */ public Locator getDocumentLocator() { return locator; } } extensions/xml/jdom-1.0/src/org/jdom/input/TextBuffer.java000066400000000000000000000147371335566474600237300ustar00rootroot00000000000000/*-- $Id: TextBuffer.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.input; /** * A non-public utility class similar to StringBuffer but optimized for XML * parsing where the common case is that you get only one chunk of characters * per text section. TextBuffer stores the first chunk of characters in a * String, which can just be returned directly if no second chunk is received. * Subsequent chunks are stored in a supplemental char array (like StringBuffer * uses). In this case, the returned text will be the first String chunk, * concatenated with the subsequent chunks stored in the char array. This * provides optimal performance in the common case, while still providing very * good performance in the uncommon case. Furthermore, avoiding StringBuffer * means that no extra unused char array space will be kept around after parsing * is through. * * Updated for JClic: replace StringBuffer by StringBuilder * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Bradley S. Huffman * @author Alex Rosen */ class TextBuffer { private static final String CVS_ID = "@(#) $RCSfile: TextBuffer.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** The first part of the text value (the "prefix"). If null, the * text value is the empty string. */ private String prefixString; /** The rest of the text value (the "suffix"). Only the first * code>arraySize characters are valid. */ private char[] array; /** The size of the rest of the text value. If zero, then only * code>prefixString contains the text value. */ private int arraySize; /** Constructor */ TextBuffer() { array = new char[4096]; // initial capacity arraySize = 0; } /** Append the specified text to the text value of this buffer. */ void append(char[] source, int start, int count) { if (prefixString == null) { // This is the first chunk, so we'll store it in the prefix string prefixString = new String(source, start, count); } else { // This is a subsequent chunk, so we'll add it to the char array ensureCapacity(arraySize + count); System.arraycopy(source, start, array, arraySize, count); arraySize += count; } } /** Returns the size of the text value. */ int size() { if (prefixString == null) { return 0; } else { return prefixString.length() + arraySize; } } /** Clears the text value and prepares the TextBuffer for reuse. */ void clear() { arraySize = 0; prefixString = null; } /** Returns the text value stored in the buffer. */ public String toString() { if (prefixString == null) { return ""; } String str = ""; if (arraySize == 0) { // Char array is empty, so the text value is just prefixString. str = prefixString; } else { // Char array is not empty, so the text value is prefixString // plus the char array. str = new StringBuilder(prefixString.length() + arraySize) .append(prefixString) .append(array, 0, arraySize) // JCLIC modification //.toString(); .substring(0); } return str; } // Ensure that the char array has room for at least "csize" characters. private void ensureCapacity(int csize) { int capacity = array.length; if (csize > capacity) { char[] old = array; int nsize = capacity; while (csize > nsize) { nsize += (capacity/2); } array = new char[nsize]; System.arraycopy(old, 0, array, 0, arraySize); } } } extensions/xml/jdom-1.0/src/org/jdom/output/000077500000000000000000000000001335566474600211745ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/jdom/output/DOMOutputter.java000066400000000000000000000417001335566474600244140ustar00rootroot00000000000000/*-- $Id: DOMOutputter.java,v 1.1.1.1 2005/12/02 14:16:52 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.output; import java.util.*; import org.jdom.*; import org.jdom.adapters.*; /** * Outputs a JDOM {@link org.jdom.Document org.jdom.Document} as a DOM {@link * org.w3c.dom.Document org.w3c.dom.Document}. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:52 $ * @author Brett McLaughlin * @author Jason Hunter * @author Matthew Merlo * @author Dan Schaffer * @author Yusuf Goolamabbas * @author Bradley S. Huffman */ public class DOMOutputter { private static final String CVS_ID = "@(#) $RCSfile: DOMOutputter.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:52 $ $Name: $"; /** Default adapter class */ private static final String DEFAULT_ADAPTER_CLASS = "org.jdom.adapters.XercesDOMAdapter"; /** Adapter to use for interfacing with the DOM implementation */ private String adapterClass; /** * This creates a new DOMOutputter which will attempt to first locate * a DOM implementation to use via JAXP, and if JAXP does not exist or * there's a problem, will fall back to the default parser. */ public DOMOutputter() { // nothing } /** * This creates a new DOMOutputter using the specified DOMAdapter * implementation as a way to choose the underlying parser. * * @param adapterClass String name of class * to use for DOM output */ public DOMOutputter(String adapterClass) { this.adapterClass = adapterClass; } /** * This converts the JDOM Document parameter to a * DOM Document, returning the DOM version. The DOM implementation * is the one chosen in the constructor. * * @param document Document to output. * @return an org.w3c.dom.Document version */ public org.w3c.dom.Document output(Document document) throws JDOMException { NamespaceStack namespaces = new NamespaceStack(); org.w3c.dom.Document domDoc = null; try { // Assign DOCTYPE during construction DocType dt = document.getDocType(); domDoc = createDOMDocument(dt); // Add content Iterator itr = document.getContent().iterator(); while (itr.hasNext()) { Object node = itr.next(); if (node instanceof Element) { Element element = (Element) node; org.w3c.dom.Element domElement = output(element, domDoc, namespaces); // Add the root element, first check for existing root org.w3c.dom.Element root = domDoc.getDocumentElement(); if (root == null) { // Normal case domDoc.appendChild(domElement); // normal case } else { // Xerces 1.3 creates new docs with a // XXX: Need to address DOCTYPE mismatch still domDoc.replaceChild(domElement, root); } } else if (node instanceof Comment) { Comment comment = (Comment) node; org.w3c.dom.Comment domComment = domDoc.createComment(comment.getText()); domDoc.appendChild(domComment); } else if (node instanceof ProcessingInstruction) { ProcessingInstruction pi = (ProcessingInstruction) node; org.w3c.dom.ProcessingInstruction domPI = domDoc.createProcessingInstruction( pi.getTarget(), pi.getData()); domDoc.appendChild(domPI); } else if (node instanceof DocType) { // We already dealt with the DocType above } else { throw new JDOMException( "Document contained top-level content with type:" + node.getClass().getName()); } } } catch (Throwable e) { throw new JDOMException("Exception outputting Document", e); } return domDoc; } private org.w3c.dom.Document createDOMDocument(DocType dt) throws JDOMException { if (adapterClass != null) { // The user knows that they want to use a particular impl try { DOMAdapter adapter = (DOMAdapter)Class.forName(adapterClass).newInstance(); // System.out.println("using specific " + adapterClass); return adapter.createDocument(dt); } catch (ClassNotFoundException e) { // e.printStackTrace(); } catch (IllegalAccessException e) { // e.printStackTrace(); } catch (InstantiationException e) { // e.printStackTrace(); } } else { // Try using JAXP... try { DOMAdapter adapter = (DOMAdapter)Class.forName( "org.jdom.adapters.JAXPDOMAdapter").newInstance(); // System.out.println("using JAXP"); return adapter.createDocument(dt); } catch (ClassNotFoundException e) { // e.printStackTrace(); } catch (IllegalAccessException e) { // e.printStackTrace(); } catch (InstantiationException e) { // e.printStackTrace(); } } // If no DOM doc yet, try to use a hard coded default try { DOMAdapter adapter = (DOMAdapter) Class.forName(DEFAULT_ADAPTER_CLASS).newInstance(); return adapter.createDocument(dt); // System.out.println("Using default " + // DEFAULT_ADAPTER_CLASS); } catch (ClassNotFoundException e) { // e.printStackTrace(); } catch (IllegalAccessException e) { // e.printStackTrace(); } catch (InstantiationException e) { // e.printStackTrace(); } throw new JDOMException("No JAXP or default parser available"); } private org.w3c.dom.Element output(Element element, org.w3c.dom.Document domDoc, NamespaceStack namespaces) throws JDOMException { try { int previouslyDeclaredNamespaces = namespaces.size(); org.w3c.dom.Element domElement = null; if (element.getNamespace() == Namespace.NO_NAMESPACE) { // No namespace, use createElement domElement = domDoc.createElement(element.getQualifiedName()); } else { domElement = domDoc.createElementNS( element.getNamespaceURI(), element.getQualifiedName()); } // Add namespace attributes, beginning with the element's own // Do this only if it's not the XML namespace and it's // not the NO_NAMESPACE with the prefix "" not yet mapped // (we do output xmlns="" if the "" prefix was already used // and we need to reclaim it for the NO_NAMESPACE) Namespace ns = element.getNamespace(); if (ns != Namespace.XML_NAMESPACE && !(ns == Namespace.NO_NAMESPACE && namespaces.getURI("") == null)) { String prefix = ns.getPrefix(); String uri = namespaces.getURI(prefix); if (!ns.getURI().equals(uri)) { // output a new namespace decl namespaces.push(ns); String attrName = getXmlnsTagFor(ns); domElement.setAttribute(attrName, ns.getURI()); } } // Add additional namespaces also Iterator itr = element.getAdditionalNamespaces().iterator(); while (itr.hasNext()) { Namespace additional = (Namespace)itr.next(); String prefix = additional.getPrefix(); String uri = namespaces.getURI(prefix); if (!additional.getURI().equals(uri)) { String attrName = getXmlnsTagFor(additional); domElement.setAttribute(attrName, additional.getURI()); namespaces.push(additional); } } // Add attributes to the DOM element itr = element.getAttributes().iterator(); while (itr.hasNext()) { Attribute attribute = (Attribute) itr.next(); domElement.setAttributeNode(output(attribute, domDoc)); Namespace ns1 = attribute.getNamespace(); if ((ns1 != Namespace.NO_NAMESPACE) && (ns1 != Namespace.XML_NAMESPACE)) { String prefix = ns1.getPrefix(); String uri = namespaces.getURI(prefix); if (!ns1.getURI().equals(uri)) { // output a new decl String attrName = getXmlnsTagFor(ns1); domElement.setAttribute(attrName, ns1.getURI()); namespaces.push(ns1); } } // Crimson doesn't like setAttributeNS() for non-NS attribs if (attribute.getNamespace() == Namespace.NO_NAMESPACE) { // No namespace, use setAttribute domElement.setAttribute(attribute.getQualifiedName(), attribute.getValue()); } else { domElement.setAttributeNS(attribute.getNamespaceURI(), attribute.getQualifiedName(), attribute.getValue()); } } // Add content to the DOM element itr = element.getContent().iterator(); while (itr.hasNext()) { Object node = itr.next(); if (node instanceof Element) { Element e = (Element) node; org.w3c.dom.Element domElt = output(e, domDoc, namespaces); domElement.appendChild(domElt); } else if (node instanceof String) { String str = (String) node; org.w3c.dom.Text domText = domDoc.createTextNode(str); domElement.appendChild(domText); } else if (node instanceof CDATA) { CDATA cdata = (CDATA) node; org.w3c.dom.CDATASection domCdata = domDoc.createCDATASection(cdata.getText()); domElement.appendChild(domCdata); } else if (node instanceof Text) { Text text = (Text) node; org.w3c.dom.Text domText = domDoc.createTextNode(text.getText()); domElement.appendChild(domText); } else if (node instanceof Comment) { Comment comment = (Comment) node; org.w3c.dom.Comment domComment = domDoc.createComment(comment.getText()); domElement.appendChild(domComment); } else if (node instanceof ProcessingInstruction) { ProcessingInstruction pi = (ProcessingInstruction) node; org.w3c.dom.ProcessingInstruction domPI = domDoc.createProcessingInstruction( pi.getTarget(), pi.getData()); domElement.appendChild(domPI); } else if (node instanceof EntityRef) { EntityRef entity = (EntityRef) node; org.w3c.dom.EntityReference domEntity = domDoc.createEntityReference(entity.getName()); domElement.appendChild(domEntity); } else { throw new JDOMException( "Element contained content with type:" + node.getClass().getName()); } } // Remove declared namespaces from stack while (namespaces.size() > previouslyDeclaredNamespaces) { namespaces.pop(); } return domElement; } catch (Exception e) { throw new JDOMException("Exception outputting Element " + element.getQualifiedName(), e); } } private org.w3c.dom.Attr output(Attribute attribute, org.w3c.dom.Document domDoc) throws JDOMException { org.w3c.dom.Attr domAttr = null; try { if (attribute.getNamespace() == Namespace.NO_NAMESPACE) { // No namespace, use createAttribute domAttr = domDoc.createAttribute(attribute.getQualifiedName()); } else { domAttr = domDoc.createAttributeNS(attribute.getNamespaceURI(), attribute.getQualifiedName()); } domAttr.setValue(attribute.getValue()); } catch (Exception e) { throw new JDOMException("Exception outputting Attribute " + attribute.getQualifiedName(), e); } return domAttr; } /** * This will handle adding any {@link Namespace} * attributes to the DOM tree. * * @param ns Namespace to add definition of */ private static String getXmlnsTagFor(Namespace ns) { String attrName = "xmlns"; if (!ns.getPrefix().equals("")) { attrName += ":"; attrName += ns.getPrefix(); } return attrName; } } extensions/xml/jdom-1.0/src/org/jdom/output/EscapeStrategy.java000066400000000000000000000057221335566474600247700ustar00rootroot00000000000000/*-- $Id: EscapeStrategy.java,v 1.1.1.1 2005/12/02 14:16:53 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.output; /** * Logic to determine which characters should be formatted as character * entities. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:53 $ * @author Alex Rosen * @author Bradley S. Huffman * @author Jason Hunter */ public interface EscapeStrategy { /** * Test whether the supplied character should be formatted literally * or as a character entity. */ public boolean shouldEscape(char ch); } extensions/xml/jdom-1.0/src/org/jdom/output/Format.java000066400000000000000000000525061335566474600232770ustar00rootroot00000000000000/*-- $Id: Format.java,v 1.2 2013-03-01 23:21:46 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.output; import java.lang.reflect.Method; /** * Class to encapsulate XMLOutputter format options. * Typical users can use the standard format configurations obtained by * {@link #getRawFormat} (no whitespace changes), * {@link #getPrettyFormat} (whitespace beautification), and * {@link #getCompactFormat} (whitespace normalization). *

* Several modes are available to effect the way textual content is printed. * See the documentation for {@link TextMode} for details. * * @version $Revision: 1.2 $, $Date: 2013-03-01 23:21:46 $ * @author Jason Hunter */ public class Format implements Cloneable { private static final String CVS_ID = "@(#) $RCSfile: Format.java,v $ $Revision: 1.2 $ $Date: 2013-03-01 23:21:46 $ $Name: $"; /** * Returns a new Format object that performs no whitespace changes, uses * the UTF-8 encoding, doesn't expand empty elements, includes the * declaration and encoding, and uses the default entity escape strategy. * Tweaks can be made to the returned Format instance without affecting * other instances. * @return a Format with no whitespace changes */ public static Format getRawFormat() { return new Format(); } /** * Returns a new Format object that performs whitespace beautification with * 2-space indents, uses the UTF-8 encoding, doesn't expand empty elements, * includes the declaration and encoding, and uses the default entity * escape strategy. * Tweaks can be made to the returned Format instance without affecting * other instances. * * @return a Format with whitespace beautification */ public static Format getPrettyFormat() { Format f = new Format(); f.setIndent(STANDARD_INDENT); f.setTextMode(TextMode.TRIM); return f; } /** * Returns a new Format object that performs whitespace normalization, uses * the UTF-8 encoding, doesn't expand empty elements, includes the * declaration and encoding, and uses the default entity escape strategy. * Tweaks can be made to the returned Format instance without affecting * other instances. * * @return a Format with whitespace normalization */ public static Format getCompactFormat() { Format f = new Format(); f.setTextMode(TextMode.NORMALIZE); return f; } /** standard value to indent by, if we are indenting */ private static final String STANDARD_INDENT = " "; /** standard string with which to end a line */ private static final String STANDARD_LINE_SEPARATOR = "\r\n"; /** standard encoding */ private static final String STANDARD_ENCODING = "UTF-8"; /** The default indent is no spaces (as original document) */ String indent = null; /** New line separator */ String lineSeparator = STANDARD_LINE_SEPARATOR; /** The encoding format */ String encoding = STANDARD_ENCODING; /** Whether or not to output the XML declaration * - default is false */ boolean omitDeclaration = false; /** Whether or not to output the encoding in the XML declaration * - default is false */ boolean omitEncoding = false; /** Whether or not to expand empty elements to * <tagName></tagName> - default is false */ boolean expandEmptyElements = false; /** Whether TrAX output escaping disabling/enabling PIs are ignored * or processed - default is false */ boolean ignoreTrAXEscapingPIs = false; /** text handling mode */ TextMode mode = TextMode.PRESERVE; /** entity escape logic */ EscapeStrategy escapeStrategy = new DefaultEscapeStrategy(encoding); /** * Creates a new Format instance with default (raw) behavior. */ private Format() { } /** * Sets the {@link EscapeStrategy} to use for character escaping. * * @param strategy the EscapeStrategy to use * @return a pointer to this Format for chaining */ public Format setEscapeStrategy(EscapeStrategy strategy) { escapeStrategy = strategy; return this; } /** * Returns the current escape strategy * * @return the current escape strategy */ public EscapeStrategy getEscapeStrategy() { return escapeStrategy; } /** * This will set the newline separator (lineSeparator). * The default is \r\n. Note that if the "newlines" * property is false, this value is irrelevant. To make it output * the system default line ending string, call * setLineSeparator(System.getProperty("line.separator")) * *

* To output "UNIX-style" documents, call * setLineSeparator("\n"). To output "Mac-style" * documents, call setLineSeparator("\r"). DOS-style * documents use CR-LF ("\r\n"), which is the default. *

* *

* Note that this only applies to newlines generated by the * outputter. If you parse an XML document that contains newlines * embedded inside a text node, and you do not set TextMode.NORMALIZE, * then the newlines will be output * verbatim, as "\n" which is how parsers normalize them. *

* * @see #setTextMode * * @param separator String line separator to use. * @return a pointer to this Format for chaining */ public Format setLineSeparator(String separator) { this.lineSeparator = separator; return this; } /** * Returns the current line separator. * * @return the current line separator */ public String getLineSeparator() { return lineSeparator; } /** * This will set whether the XML declaration * (<?xml version="1.0" * encoding="UTF-8"?>) * includes the encoding of the document. It is common to omit * this in uses such as WML and other wireless device protocols. * * @param omitEncoding boolean indicating whether or not * the XML declaration should indicate the document encoding. * @return a pointer to this Format for chaining */ public Format setOmitEncoding(boolean omitEncoding) { this.omitEncoding = omitEncoding; return this; } /** * Returns whether the XML declaration encoding will be omitted. * * @return whether the XML declaration encoding will be omitted */ public boolean getOmitEncoding() { return omitEncoding; } /** * This will set whether the XML declaration * (<?xml version="1.0"?gt;) * will be omitted or not. It is common to omit this in uses such * as SOAP and XML-RPC calls. * * @param omitDeclaration boolean indicating whether or not * the XML declaration should be omitted. * @return a pointer to this Format for chaining */ public Format setOmitDeclaration(boolean omitDeclaration) { this.omitDeclaration = omitDeclaration; return this; } /** * Returns whether the XML declaration will be omitted. * * @return whether the XML declaration will be omitted */ public boolean getOmitDeclaration() { return omitDeclaration; } /** * This will set whether empty elements are expanded from * <tagName/> to * <tagName></tagName>. * * @param expandEmptyElements boolean indicating whether or not * empty elements should be expanded. * @return a pointer to this Format for chaining */ public Format setExpandEmptyElements(boolean expandEmptyElements) { this.expandEmptyElements = expandEmptyElements; return this; } /** * Returns whether empty elements are expanded. * * @return whether empty elements are expanded */ public boolean getExpandEmptyElements() { return expandEmptyElements; } /** * This will set whether JAXP TrAX processing instructions for * disabling/enabling output escaping are ignored. Disabling * output escaping allows using XML text as element content and * outputing it verbatim, i.e. as element children would be. *

* When processed, these processing instructions are removed from * the generated XML text and control whether the element text * content is output verbatim or with escaping of the pre-defined * entities in XML 1.0. The text to be output verbatim shall be * surrounded by the * <?javax.xml.transform.disable-output-escaping ?> * and <?javax.xml.transform.enable-output-escaping ?> * PIs.

*

* When ignored, the processing instructions are present in the * generated XML text and the pre-defined entities in XML 1.0 are * escaped. *

* Default: false.

* * @param ignoreTrAXEscapingPIs boolean indicating * whether or not TrAX ouput escaping PIs are ignored. * * @see javax.xml.transform.Result#PI_ENABLE_OUTPUT_ESCAPING * @see javax.xml.transform.Result#PI_DISABLE_OUTPUT_ESCAPING */ public void setIgnoreTrAXEscapingPIs(boolean ignoreTrAXEscapingPIs) { this.ignoreTrAXEscapingPIs = ignoreTrAXEscapingPIs; } /** * Returns whether JAXP TrAX processing instructions for * disabling/enabling output escaping are ignored. * * @return whether or not TrAX ouput escaping PIs are ignored. */ public boolean getIgnoreTrAXEscapingPIs() { return ignoreTrAXEscapingPIs; } /** * This sets the text output style. Options are available as static * {@link TextMode} instances. The default is {@link TextMode#PRESERVE}. * * @return a pointer to this Format for chaining */ public Format setTextMode(Format.TextMode mode) { this.mode = mode; return this; } /** * Returns the current text output style. * * @return the current text output style */ public Format.TextMode getTextMode() { return mode; } /** * This will set the indent String to use; this * is usually a String of empty spaces. If you pass * null, or the empty string (""), then no indentation will * happen. Default: none (null) * * @param indent String to use for indentation. * @return a pointer to this Format for chaining */ public Format setIndent(String indent) { // if passed the empty string, change it to null, for marginal // performance gains later (can compare to null first instead // of calling equals()) if ("".equals(indent)) { indent = null; } this.indent = indent; return this; } /** * Returns the indent string in use. * * @return the indent string in use */ public String getIndent() { return indent; } /** * Sets the output encoding. The name should be an accepted XML * encoding. * * @param encoding the encoding format. Use XML-style names like * "UTF-8" or "ISO-8859-1" or "US-ASCII" * @return a pointer to this Format for chaining */ public Format setEncoding(String encoding) { this.encoding = encoding; escapeStrategy = new DefaultEscapeStrategy(encoding); return this; } /** * Returns the configured output encoding. * * @return the output encoding */ public String getEncoding() { return encoding; } protected Object clone() { Format format = null; try { format = (Format) super.clone(); } catch (CloneNotSupportedException ce) { } return format; } /** * Handle common charsets quickly and easily. Use reflection * to query the JDK 1.4 CharsetEncoder class for unknown charsets. * If JDK 1.4 isn't around, default to no special encoding. */ class DefaultEscapeStrategy implements EscapeStrategy { private int bits; Object encoder; Method canEncode; public DefaultEscapeStrategy(String encoding) { if ("UTF-8".equalsIgnoreCase(encoding) || "UTF-16".equalsIgnoreCase(encoding)) { bits = 16; } else if ("ISO-8859-1".equalsIgnoreCase(encoding) || "Latin1".equalsIgnoreCase(encoding)) { bits = 8; } else if ("US-ASCII".equalsIgnoreCase(encoding) || "ASCII".equalsIgnoreCase(encoding)) { bits = 7; } else { bits = 0; //encoder = Charset.forName(encoding).newEncoder(); try { Class charsetClass = Class.forName("java.nio.charset.Charset"); Class encoderClass = Class.forName("java.nio.charset.CharsetEncoder"); Method forName = charsetClass.getMethod("forName", new Class[]{String.class}); Object charsetObj = forName.invoke(null, new Object[]{encoding}); // MODIFIED: Added (Class[]) and (Object[]) cast sentences in "null" parameters // to avoid warnings during compilation Method newEncoder = charsetClass.getMethod("newEncoder", (Class[])null); encoder = newEncoder.invoke(charsetObj, (Object[])null); canEncode = encoderClass.getMethod("canEncode", new Class[]{char.class}); } catch (Exception ignored) { } } } public boolean shouldEscape(char ch) { if (bits == 16) { return false; } if (bits == 8) { if ((int) ch > 255) return true; else return false; } if (bits == 7) { if ((int) ch > 127) return true; else return false; } else { if (canEncode != null && encoder != null) { try { Boolean val = (Boolean) canEncode.invoke(encoder, new Object[]{new Character(ch)}); return !val.booleanValue(); } catch (Exception ignored) { } } // Return false if we don't know. This risks not escaping // things which should be escaped, but also means people won't // start getting loads of unnecessary escapes. return false; } } } /** * Class to signify how text should be handled on output. The following * table provides details. * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Text Mode * * Resulting behavior. *
* PRESERVE (Default) * * All content is printed in the format it was created, no whitespace * or line separators are are added or removed. *
* TRIM_FULL_WHITE * * Content between tags consisting of all whitespace is not printed. * If the content contains even one non-whitespace character, it is * printed verbatim, whitespace and all. *
* TRIM * * Same as TrimAllWhite, plus leading/trailing whitespace are * trimmed. *
* NORMALIZE * * Same as TextTrim, plus addition interior whitespace is compressed * to a single space. *
* * In most cases textual content is aligned with the surrounding tags * (after the appropriate text mode is applied). In the case where the only * content between the start and end tags is textual, the start tag, text, * and end tag are all printed on the same line. If the document being * output already has whitespace, it's wise to turn on TRIM mode so the * pre-existing whitespace can be trimmed before adding new whitespace. *

* When a element has a xml:space attribute with the value of "preserve", * all formating is turned off and reverts back to the default until the * element and its contents have been printed. If a nested element contains * another xml:space with the value "default" formatting is turned back on * for the child element and then off for the remainder of the parent * element. */ public static class TextMode { /** * Mode for literal text preservation. */ public static final TextMode PRESERVE = new TextMode("PRESERVE"); /** * Mode for text trimming (left and right trim). */ public static final TextMode TRIM = new TextMode("TRIM"); /** * Mode for text normalization (left and right trim plus internal * whitespace is normalized to a single space. * @see org.jdom.Element#getTextNormalize */ public static final TextMode NORMALIZE = new TextMode("NORMALIZE"); /** * Mode for text trimming of content consisting of nothing but * whitespace but otherwise not changing output. */ public static final TextMode TRIM_FULL_WHITE = new TextMode("TRIM_FULL_WHITE"); private final String name; private TextMode(String name) { this.name = name; } public String toString() { return name; } } } extensions/xml/jdom-1.0/src/org/jdom/output/JDOMLocator.java000066400000000000000000000100601335566474600241110ustar00rootroot00000000000000/*-- $Id: JDOMLocator.java,v 1.1.1.1 2005/12/02 14:16:52 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.output; import org.xml.sax.*; import org.xml.sax.helpers.*; /** * An implementation of the SAX {@link Locator} interface that * exposes the JDOM node being processed by SAXOutputter. * * @author Laurent Bihanic * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:52 $ */ public class JDOMLocator extends LocatorImpl { private static final String CVS_ID = "@(#) $RCSfile: JDOMLocator.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:52 $ $Name: $"; /** The JDOM node being processed by SAXOutputter. */ private Object node; /** * Default no-arg constructor. */ JDOMLocator() { // package protected super(); } /** * Copy contructor. * * @param locator Locator to copy location * information from. */ JDOMLocator(Locator locator) { // package protected super(locator); if (locator instanceof JDOMLocator) { this.setNode(((JDOMLocator)locator).getNode()); } } /** * Returns the JDOM node being processed by SAXOutputter. * * @return the JDOM node being processed by SAXOutputter. */ public Object getNode() { return this.node; } /** * Sets the being-processed node. * * @param node Object node currently processed * by SAXOutputter. */ void setNode(Object node) { // package protected this.node = node; } } extensions/xml/jdom-1.0/src/org/jdom/output/NamespaceStack.java000066400000000000000000000127411335566474600247260ustar00rootroot00000000000000/*-- $Id: NamespaceStack.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.output; import java.util.*; import org.jdom.Namespace; /** * A non-public utility class used by both {@link XMLOutputter} and * {@link SAXOutputter} to manage namespaces in a JDOM Document * during output. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Elliotte Rusty Harolde * @author Fred Trimble * @author Brett McLaughlin */ class NamespaceStack { private static final String CVS_ID = "@(#) $RCSfile: NamespaceStack.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; /** The prefixes available */ private Stack prefixes; /** The URIs available */ private Stack uris; /** * This creates the needed storage. */ NamespaceStack() { prefixes = new Stack(); uris = new Stack(); } /** * This will add a new {@link Namespace} * to those currently available. * * @param ns Namespace to add. */ public void push(Namespace ns) { prefixes.push(ns.getPrefix()); uris.push(ns.getURI()); } /** * This will remove the topmost (most recently added) * {@link Namespace}, and return its prefix. * * @return String - the popped namespace prefix. */ public String pop() { String prefix = (String)prefixes.pop(); uris.pop(); return prefix; } /** * This returns the number of available namespaces. * * @return int - size of the namespace stack. */ public int size() { return prefixes.size(); } /** * Given a prefix, this will return the namespace URI most * rencently (topmost) associated with that prefix. * * @param prefix String namespace prefix. * @return String - the namespace URI for that prefix. */ public String getURI(String prefix) { int index = prefixes.lastIndexOf(prefix); if (index == -1) { return null; } String uri = (String)uris.elementAt(index); return uri; } /** * This will print out the size and current stack, from the * most recently added {@link Namespace} to * the "oldest," all to System.out. */ public String toString() { StringBuilder buf = new StringBuilder(); String sep = System.getProperty("line.separator"); buf.append("Stack: " + prefixes.size() + sep); for (int i = 0; i < prefixes.size(); i++) { buf.append(prefixes.elementAt(i) + "&" + uris.elementAt(i) + sep); } return buf // JCLIC modification //.toString(); .substring(0); } } extensions/xml/jdom-1.0/src/org/jdom/output/SAXOutputter.java000066400000000000000000001461031335566474600244330ustar00rootroot00000000000000/*-- $Id: SAXOutputter.java,v 1.2 2013-03-01 23:21:46 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.output; import java.io.*; import java.lang.reflect.*; import java.util.*; import org.jdom.*; import org.xml.sax.*; import org.xml.sax.ext.*; import org.xml.sax.helpers.*; /** * Outputs a JDOM document as a stream of SAX2 events. *

* Most ContentHandler callbacks are supported. Both * ignorableWhitespace() and skippedEntity() have not * been implemented. The {@link JDOMLocator} class returned by * {@link #getLocator} exposes the current node being operated * upon. *

* At this time, it is not possible to access notations and unparsed entity * references in a DTD from JDOM. Therefore, DTDHandler callbacks * have not been implemented yet. *

* The ErrorHandler callbacks have not been implemented, since * these are supposed to be invoked when the document is parsed and at this * point the document exists in memory and is known to have no errors.

* * @version $Revision: 1.2 $, $Date: 2013-03-01 23:21:46 $ * @author Brett McLaughlin * @author Jason Hunter * @author Fred Trimble * @author Bradley S. Huffman */ public class SAXOutputter { private static final String CVS_ID = "@(#) $RCSfile: SAXOutputter.java,v $ $Revision: 1.2 $ $Date: 2013-03-01 23:21:46 $ $Name: $"; /** Shortcut for SAX namespaces core feature */ private static final String NAMESPACES_SAX_FEATURE = "http://xml.org/sax/features/namespaces"; /** Shortcut for SAX namespace-prefixes core feature */ private static final String NS_PREFIXES_SAX_FEATURE = "http://xml.org/sax/features/namespace-prefixes"; /** Shortcut for SAX validation core feature */ private static final String VALIDATION_SAX_FEATURE = "http://xml.org/sax/features/validation"; /** Shortcut for SAX-ext. lexical handler property */ private static final String LEXICAL_HANDLER_SAX_PROPERTY = "http://xml.org/sax/properties/lexical-handler"; /** Shortcut for SAX-ext. declaration handler property */ private static final String DECL_HANDLER_SAX_PROPERTY = "http://xml.org/sax/properties/declaration-handler"; /** * Shortcut for SAX-ext. lexical handler alternate property. * Although this property URI is not the one defined by the SAX * "standard", some parsers use it instead of the official one. */ private static final String LEXICAL_HANDLER_ALT_PROPERTY = "http://xml.org/sax/handlers/LexicalHandler"; /** Shortcut for SAX-ext. declaration handler alternate property */ private static final String DECL_HANDLER_ALT_PROPERTY = "http://xml.org/sax/handlers/DeclHandler"; /** * Array to map JDOM attribute type (as entry index) to SAX * attribute type names. */ private static final String[] attrTypeToNameMap = new String[] { "CDATA", // Attribute.UNDEFINED_ATTRIBUTE, as per SAX 2.0 spec. "CDATA", // Attribute.CDATA_TYPE "ID", // Attribute.ID_TYPE "IDREF", // Attribute.IDREF_TYPE "IDREFS", // Attribute.IDREFS_TYPE "ENTITY", // Attribute.ENTITY_TYPE "ENTITIES", // Attribute.ENTITIES_TYPE "NMTOKEN", // Attribute.NMTOKEN_TYPE "NMTOKENS", // Attribute.NMTOKENS_TYPE "NOTATION", // Attribute.NOTATION_TYPE "NMTOKEN", // Attribute.ENUMERATED_TYPE, as per SAX 2.0 spec. }; /** registered ContentHandler */ private ContentHandler contentHandler; /** registered ErrorHandler */ private ErrorHandler errorHandler; /** registered DTDHandler */ private DTDHandler dtdHandler; /** registered EntityResolver */ private EntityResolver entityResolver; /** registered LexicalHandler */ private LexicalHandler lexicalHandler; /** registered DeclHandler */ private DeclHandler declHandler; /** * Whether to report attribute namespace declarations as xmlns attributes. * Defaults to false as per SAX specifications. * * @see * SAX namespace specifications */ private boolean declareNamespaces = false; /** * Whether to report DTD events to DeclHandlers and LexicalHandlers. * Defaults to true. */ private boolean reportDtdEvents = true; /** * A SAX Locator that points at the JDOM node currently being * outputted. */ private JDOMLocator locator = null; /** * This will create a SAXOutputter without any * registered handler. The application is then responsible for * registering them using the setXxxHandler() methods. */ public SAXOutputter() { } /** * This will create a SAXOutputter with the * specified ContentHandler. * * @param contentHandler contains ContentHandler * callback methods */ public SAXOutputter(ContentHandler contentHandler) { this(contentHandler, null, null, null, null); } /** * This will create a SAXOutputter with the * specified SAX2 handlers. At this time, only ContentHandler * and EntityResolver are supported. * * @param contentHandler contains ContentHandler * callback methods * @param errorHandler contains ErrorHandler callback methods * @param dtdHandler contains DTDHandler callback methods * @param entityResolver contains EntityResolver * callback methods */ public SAXOutputter(ContentHandler contentHandler, ErrorHandler errorHandler, DTDHandler dtdHandler, EntityResolver entityResolver) { this(contentHandler, errorHandler, dtdHandler, entityResolver, null); } /** * This will create a SAXOutputter with the * specified SAX2 handlers. At this time, only ContentHandler * and EntityResolver are supported. * * @param contentHandler contains ContentHandler * callback methods * @param errorHandler contains ErrorHandler callback methods * @param dtdHandler contains DTDHandler callback methods * @param entityResolver contains EntityResolver * callback methods * @param lexicalHandler contains LexicalHandler callbacks. */ public SAXOutputter(ContentHandler contentHandler, ErrorHandler errorHandler, DTDHandler dtdHandler, EntityResolver entityResolver, LexicalHandler lexicalHandler) { this.contentHandler = contentHandler; this.errorHandler = errorHandler; this.dtdHandler = dtdHandler; this.entityResolver = entityResolver; this.lexicalHandler = lexicalHandler; } /** * This will set the ContentHandler. * * @param contentHandler contains ContentHandler * callback methods. */ public void setContentHandler(ContentHandler contentHandler) { this.contentHandler = contentHandler; } /** * Returns the registered ContentHandler. * * @return the current ContentHandler or * null if none was registered. */ public ContentHandler getContentHandler() { return this.contentHandler; } /** * This will set the ErrorHandler. * * @param errorHandler contains ErrorHandler callback methods. */ public void setErrorHandler(ErrorHandler errorHandler) { this.errorHandler = errorHandler; } /** * Return the registered ErrorHandler. * * @return the current ErrorHandler or * null if none was registered. */ public ErrorHandler getErrorHandler() { return this.errorHandler; } /** * This will set the DTDHandler. * * @param dtdHandler contains DTDHandler callback methods. */ public void setDTDHandler(DTDHandler dtdHandler) { this.dtdHandler = dtdHandler; } /** * Return the registered DTDHandler. * * @return the current DTDHandler or * null if none was registered. */ public DTDHandler getDTDHandler() { return this.dtdHandler; } /** * This will set the EntityResolver. * * @param entityResolver contains EntityResolver callback methods. */ public void setEntityResolver(EntityResolver entityResolver) { this.entityResolver = entityResolver; } /** * Return the registered EntityResolver. * * @return the current EntityResolver or * null if none was registered. */ public EntityResolver getEntityResolver() { return this.entityResolver; } /** * This will set the LexicalHandler. * * @param lexicalHandler contains lexical callback methods. */ public void setLexicalHandler(LexicalHandler lexicalHandler) { this.lexicalHandler = lexicalHandler; } /** * Return the registered LexicalHandler. * * @return the current LexicalHandler or * null if none was registered. */ public LexicalHandler getLexicalHandler() { return this.lexicalHandler; } /** * This will set the DeclHandler. * * @param declHandler contains declaration callback methods. */ public void setDeclHandler(DeclHandler declHandler) { this.declHandler = declHandler; } /** * Return the registered DeclHandler. * * @return the current DeclHandler or * null if none was registered. */ public DeclHandler getDeclHandler() { return this.declHandler; } /** * Returns whether attribute namespace declarations shall be reported as * "xmlns" attributes. * * @return whether attribute namespace declarations shall be reported as * "xmlns" attributes. */ public boolean getReportNamespaceDeclarations() { return declareNamespaces; } /** * This will define whether attribute namespace declarations shall be * reported as "xmlns" attributes. This flag defaults to false * and behaves as the "namespace-prefixes" SAX core feature. * * @param declareNamespaces whether attribute namespace declarations * shall be reported as "xmlns" attributes. */ public void setReportNamespaceDeclarations(boolean declareNamespaces) { this.declareNamespaces = declareNamespaces; } /** * Returns whether DTD events will be reported. * * @return whether DTD events will be reported */ public boolean getReportDTDEvents() { return reportDtdEvents; } /** * This will define whether to report DTD events to SAX DeclHandlers * and LexicalHandlers if these handlers are registered and the * document to output includes a DocType declaration. * * @param reportDtdEvents whether to notify DTD events. */ public void setReportDTDEvents(boolean reportDtdEvents) { this.reportDtdEvents = reportDtdEvents; } /** * This will set the state of a SAX feature. *

* All XMLReaders are required to support setting to true and to false. *

*

* SAXOutputter currently supports the following SAX core features: *

*
http://xml.org/sax/features/namespaces
*
description: true indicates * namespace URIs and unprefixed local names for element and * attribute names will be available
*
access: read/write, but always * true!
*
http://xml.org/sax/features/namespace-prefixes
*
description: true indicates * XML 1.0 names (with prefixes) and attributes (including xmlns* * attributes) will be available
*
access: read/write
*
http://xml.org/sax/features/validation
*
description: controls whether SAXOutputter * is reporting DTD-related events; if true, the * DocType internal subset will be parsed to fire DTD events
*
access: read/write, defaults to * true
*
*

* * @param name String the feature name, which is a * fully-qualified URI. * @param value boolean the requested state of the * feature (true or false). * * @throws SAXNotRecognizedException when SAXOutputter does not * recognize the feature name. * @throws SAXNotSupportedException when SAXOutputter recognizes * the feature name but cannot set the requested value. */ public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException { if (NS_PREFIXES_SAX_FEATURE.equals(name)) { // Namespace prefix declarations. this.setReportNamespaceDeclarations(value); } else { if (NAMESPACES_SAX_FEATURE.equals(name)) { if (value != true) { // Namespaces feature always supported by SAXOutputter. throw new SAXNotSupportedException(name); } // Else: true is OK! } else { if (VALIDATION_SAX_FEATURE.equals(name)) { // Report DTD events. this.setReportDTDEvents(value); } else { // Not a supported feature. throw new SAXNotRecognizedException(name); } } } } /** * This will look up the value of a SAX feature. * * @param name String the feature name, which is a * fully-qualified URI. * @return boolean the current state of the feature * (true or false). * * @throws SAXNotRecognizedException when SAXOutputter does not * recognize the feature name. * @throws SAXNotSupportedException when SAXOutputter recognizes * the feature name but determine its value at this time. */ public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { if (NS_PREFIXES_SAX_FEATURE.equals(name)) { // Namespace prefix declarations. return (this.declareNamespaces); } else { if (NAMESPACES_SAX_FEATURE.equals(name)) { // Namespaces feature always supported by SAXOutputter. return (true); } else { if (VALIDATION_SAX_FEATURE.equals(name)) { // Report DTD events. return (this.reportDtdEvents); } else { // Not a supported feature. throw new SAXNotRecognizedException(name); } } } } /** * This will set the value of a SAX property. * This method is also the standard mechanism for setting extended * handlers. *

* SAXOutputter currently supports the following SAX properties: *

*
http://xml.org/sax/properties/lexical-handler
*
data type: * org.xml.sax.ext.LexicalHandler
*
description: An optional extension handler for * lexical events like comments.
*
access: read/write
*
http://xml.org/sax/properties/declaration-handler
*
data type: * org.xml.sax.ext.DeclHandler
*
description: An optional extension handler for * DTD-related events other than notations and unparsed entities.
*
access: read/write
*
*

* * @param name String the property name, which is a * fully-qualified URI. * @param value Object the requested value for the property. * * @throws SAXNotRecognizedException when SAXOutputter does not recognize * the property name. * @throws SAXNotSupportedException when SAXOutputter recognizes the * property name but cannot set the requested value. */ public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException { if ((LEXICAL_HANDLER_SAX_PROPERTY.equals(name)) || (LEXICAL_HANDLER_ALT_PROPERTY.equals(name))) { this.setLexicalHandler((LexicalHandler)value); } else { if ((DECL_HANDLER_SAX_PROPERTY.equals(name)) || (DECL_HANDLER_ALT_PROPERTY.equals(name))) { this.setDeclHandler((DeclHandler)value); } else { throw new SAXNotRecognizedException(name); } } } /** * This will look up the value of a SAX property. * * @param name String the property name, which is a * fully-qualified URI. * @return Object the current value of the property. * * @throws SAXNotRecognizedException when SAXOutputter does not recognize * the property name. * @throws SAXNotSupportedException when SAXOutputter recognizes the * property name but cannot determine its value at this time. */ public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { if ((LEXICAL_HANDLER_SAX_PROPERTY.equals(name)) || (LEXICAL_HANDLER_ALT_PROPERTY.equals(name))) { return this.getLexicalHandler(); } else { if ((DECL_HANDLER_SAX_PROPERTY.equals(name)) || (DECL_HANDLER_ALT_PROPERTY.equals(name))) { return this.getDeclHandler(); } else { throw new SAXNotRecognizedException(name); } } } /** * This will output the JDOM Document, firing off the * SAX events that have been registered. * * @param document JDOM Document to output. * * @throws JDOMException if any error occurred. */ public void output(Document document) throws JDOMException { if (document == null) { return; } // contentHandler.setDocumentLocator() documentLocator(document); // contentHandler.startDocument() startDocument(); // Fire DTD events if (this.reportDtdEvents) { dtdEvents(document); } // Handle root element, as well as any root level // processing instructions and comments Iterator i = document.getContent().iterator(); while (i.hasNext()) { Object obj = i.next(); // update locator locator.setNode(obj); if (obj instanceof Element) { // process root element and its content element(document.getRootElement(), new NamespaceStack()); } else if (obj instanceof ProcessingInstruction) { // contentHandler.processingInstruction() processingInstruction((ProcessingInstruction) obj); } else if (obj instanceof Comment) { // lexicalHandler.comment() comment(((Comment) obj).getText()); } } // contentHandler.endDocument() endDocument(); } /** * This will output a list of JDOM nodes as a document, firing * off the SAX events that have been registered. *

* Warning: This method may output ill-formed XML * documents if the list contains top-level objects that are not * legal at the document level (e.g. Text or CDATA nodes, multiple * Element nodes, etc.). Thus, it should only be used to output * document portions towards ContentHandlers capable of accepting * such ill-formed documents (such as XSLT processors).

* * @param nodes List of JDOM nodes to output. * * @throws JDOMException if any error occurred. * * @see #output(org.jdom.Document) */ public void output(List nodes) throws JDOMException { if ((nodes == null) || (nodes.size() == 0)) { return; } // contentHandler.setDocumentLocator() documentLocator(null); // contentHandler.startDocument() startDocument(); // Process node list. elementContent(nodes, new NamespaceStack()); // contentHandler.endDocument() endDocument(); } /** * This will output a single JDOM element as a document, firing * off the SAX events that have been registered. * * @param node the Element node to output. * * @throws JDOMException if any error occurred. */ public void output(Element node) throws JDOMException { if (node == null) { return; } // contentHandler.setDocumentLocator() documentLocator(null); // contentHandler.startDocument() startDocument(); // Output node. elementContent(node, new NamespaceStack()); // contentHandler.endDocument() endDocument(); } /** * This will output a list of JDOM nodes as a fragment of an XML * document, firing off the SAX events that have been registered. *

* Warning: This method does not call the * {@link ContentHandler#setDocumentLocator}, * {@link ContentHandler#startDocument} and * {@link ContentHandler#endDocument} callbacks on the * {@link #setContentHandler ContentHandler}. The user shall * invoke these methods directly prior/after outputting the * document fragments.

* * @param nodes List of JDOM nodes to output. * * @throws JDOMException if any error occurred. * * @see #outputFragment(org.jdom.Content) */ public void outputFragment(List nodes) throws JDOMException { if ((nodes == null) || (nodes.size() == 0)) { return; } // Output node list as a document fragment. elementContent(nodes, new NamespaceStack()); } /** * This will output a single JDOM nodes as a fragment of an XML * document, firing off the SAX events that have been registered. *

* Warning: This method does not call the * {@link ContentHandler#setDocumentLocator}, * {@link ContentHandler#startDocument} and * {@link ContentHandler#endDocument} callbacks on the * {@link #setContentHandler ContentHandler}. The user shall * invoke these methods directly prior/after outputting the * document fragments.

* * @param node the Content node to output. * * @throws JDOMException if any error occurred. * * @see #outputFragment(java.util.List) */ public void outputFragment(Content node) throws JDOMException { if (node == null) { return; } // Output single node as a document fragment. elementContent(node, new NamespaceStack()); } /** * This parses a DTD declaration to fire the related events towards * the registered handlers. * * @param document JDOM Document the DocType is to * process. */ private void dtdEvents(Document document) throws JDOMException { DocType docType = document.getDocType(); // Fire DTD-related events only if handlers have been registered. if ((docType != null) && ((dtdHandler != null) || (declHandler != null))) { // Build a dummy XML document that only references the DTD... String dtdDoc = new XMLOutputter().outputString(docType); try { // And parse it to fire DTD events. createDTDParser().parse(new InputSource( new StringReader(dtdDoc))); // We should never reach this point as the document is // ill-formed; it does not have any root element. } catch (SAXParseException e) { // Expected exception: There's no root element in document. } catch (SAXException e) { throw new JDOMException("DTD parsing error", e); } catch (IOException e) { throw new JDOMException("DTD parsing error", e); } } } /** *

* This method tells you the line of the XML file being parsed. * For an in-memory document, it's meaningless. The location * is only valid for the current parsing lifecycle, but * the document has already been parsed. Therefore, it returns * -1 for both line and column numbers. *

* * @param document JDOM Document. */ private void documentLocator(Document document) { locator = new JDOMLocator(); String publicID = null; String systemID = null; if (document != null) { DocType docType = document.getDocType(); if (docType != null) { publicID = docType.getPublicID(); systemID = docType.getSystemID(); } } locator.setPublicId(publicID); locator.setSystemId(systemID); locator.setLineNumber(-1); locator.setColumnNumber(-1); contentHandler.setDocumentLocator(locator); } /** *

* This method is always the second method of all callbacks in * all handlers to be invoked (setDocumentLocator is always first). *

*/ private void startDocument() throws JDOMException { try { contentHandler.startDocument(); } catch (SAXException se) { throw new JDOMException("Exception in startDocument", se); } } /** *

* Always the last method of all callbacks in all handlers * to be invoked. *

*/ private void endDocument() throws JDOMException { try { contentHandler.endDocument(); // reset locator locator = null; } catch (SAXException se) { throw new JDOMException("Exception in endDocument", se); } } /** *

* This will invoke the ContentHandler.processingInstruction * callback when a processing instruction is encountered. *

* * @param pi ProcessingInstruction containing target and data. */ private void processingInstruction(ProcessingInstruction pi) throws JDOMException { if (pi != null) { String target = pi.getTarget(); String data = pi.getData(); try { contentHandler.processingInstruction(target, data); } catch (SAXException se) { throw new JDOMException( "Exception in processingInstruction", se); } } } /** *

* This will recursively invoke all of the callbacks for a particular * element. *

* * @param element Element used in callbacks. * @param namespaces List stack of Namespaces in scope. */ private void element(Element element, NamespaceStack namespaces) throws JDOMException { // used to check endPrefixMapping int previouslyDeclaredNamespaces = namespaces.size(); // contentHandler.startPrefixMapping() Attributes nsAtts = startPrefixMapping(element, namespaces); // contentHandler.startElement() startElement(element, nsAtts); // handle content in the element elementContent(element.getContent(), namespaces); // update locator locator.setNode(element); // contentHandler.endElement() endElement(element); // contentHandler.endPrefixMapping() endPrefixMapping(namespaces, previouslyDeclaredNamespaces); } /** *

* This will invoke the ContentHandler.startPrefixMapping * callback * when a new namespace is encountered in the Document. *

* * @param element Element used in callbacks. * @param namespaces List stack of Namespaces in scope. * * @return Attributes declaring the namespaces local to * element or null. */ private Attributes startPrefixMapping(Element element, NamespaceStack namespaces) throws JDOMException { AttributesImpl nsAtts = null; // The namespaces as xmlns attributes Namespace ns = element.getNamespace(); if (ns != Namespace.XML_NAMESPACE) { String prefix = ns.getPrefix(); String uri = namespaces.getURI(prefix); if (!ns.getURI().equals(uri)) { namespaces.push(ns); nsAtts = this.addNsAttribute(nsAtts, ns); try { contentHandler.startPrefixMapping(prefix, ns.getURI()); } catch (SAXException se) { throw new JDOMException( "Exception in startPrefixMapping", se); } } } // Fire additional namespace declarations List additionalNamespaces = element.getAdditionalNamespaces(); if (additionalNamespaces != null) { Iterator itr = additionalNamespaces.iterator(); while (itr.hasNext()) { ns = (Namespace)itr.next(); String prefix = ns.getPrefix(); String uri = namespaces.getURI(prefix); if (!ns.getURI().equals(uri)) { namespaces.push(ns); nsAtts = this.addNsAttribute(nsAtts, ns); try { contentHandler.startPrefixMapping(prefix, ns.getURI()); } catch (SAXException se) { throw new JDOMException( "Exception in startPrefixMapping", se); } } } } return nsAtts; } /** *

* This will invoke the endPrefixMapping callback in the * ContentHandler when a namespace is goes out of scope * in the Document. *

* * @param namespaces List stack of Namespaces in scope. * @param previouslyDeclaredNamespaces number of previously declared * namespaces */ private void endPrefixMapping(NamespaceStack namespaces, int previouslyDeclaredNamespaces) throws JDOMException { while (namespaces.size() > previouslyDeclaredNamespaces) { String prefix = namespaces.pop(); try { contentHandler.endPrefixMapping(prefix); } catch (SAXException se) { throw new JDOMException("Exception in endPrefixMapping", se); } } } /** *

* This will invoke the startElement callback * in the ContentHandler. *

* * @param element Element used in callbacks. * @param nsAtts List of namespaces to declare with * the element or null. */ private void startElement(Element element, Attributes nsAtts) throws JDOMException { String namespaceURI = element.getNamespaceURI(); String localName = element.getName(); String rawName = element.getQualifiedName(); // Allocate attribute list. AttributesImpl atts = (nsAtts != null)? new AttributesImpl(nsAtts): new AttributesImpl(); List attributes = element.getAttributes(); Iterator i = attributes.iterator(); while (i.hasNext()) { Attribute a = (Attribute) i.next(); atts.addAttribute(a.getNamespaceURI(), a.getName(), a.getQualifiedName(), getAttributeTypeName(a.getAttributeType()), a.getValue()); } try { contentHandler.startElement(namespaceURI, localName, rawName, atts); } catch (SAXException se) { throw new JDOMException("Exception in startElement", se); } } /** *

* This will invoke the endElement callback * in the ContentHandler. *

* * @param element Element used in callbacks. */ private void endElement(Element element) throws JDOMException { String namespaceURI = element.getNamespaceURI(); String localName = element.getName(); String rawName = element.getQualifiedName(); try { contentHandler.endElement(namespaceURI, localName, rawName); } catch (SAXException se) { throw new JDOMException("Exception in endElement", se); } } /** *

* This will invoke the callbacks for the content of an element. *

* * @param content element content as a List of nodes. * @param namespaces List stack of Namespaces in scope. */ private void elementContent(List content, NamespaceStack namespaces) throws JDOMException { for (Iterator i=content.iterator(); i.hasNext(); ) { Object obj = i.next(); if (obj instanceof Content) { this.elementContent((Content)obj, namespaces); } else { // Not a valid element child. This could happen with // application-provided lists which may contain non // JDOM objects. handleError(new JDOMException( "Invalid element content: " + obj)); } } } /** *

* This will invoke the callbacks for the content of an element. *

* * @param node a Content node. * @param namespaces List stack of Namespaces in scope. */ private void elementContent(Content node, NamespaceStack namespaces) throws JDOMException { // update locator locator.setNode(node); if (node instanceof Element) { element((Element) node, namespaces); } else if (node instanceof CDATA) { cdata(((CDATA) node).getText()); } else if (node instanceof Text) { // contentHandler.characters() characters(((Text) node).getText()); } else if (node instanceof ProcessingInstruction) { // contentHandler.processingInstruction() processingInstruction((ProcessingInstruction) node); } else if (node instanceof Comment) { // lexicalHandler.comment() comment(((Comment) node).getText()); } else if (node instanceof EntityRef) { // contentHandler.skippedEntity() entityRef((EntityRef) node); } else { // Not a valid element child. This could happen with // application-provided lists which may contain non // JDOM objects. handleError(new JDOMException("Invalid element content: " + node)); } } /** *

* This will be called for each chunk of CDATA section encountered. *

* * @param cdataText all text in the CDATA section, including whitespace. */ private void cdata(String cdataText) throws JDOMException { try { if (lexicalHandler != null) { lexicalHandler.startCDATA(); characters(cdataText); lexicalHandler.endCDATA(); } else { characters(cdataText); } } catch (SAXException se) { throw new JDOMException("Exception in CDATA", se); } } /** *

* This will be called for each chunk of character data encountered. *

* * @param elementText all text in an element, including whitespace. */ private void characters(String elementText) throws JDOMException { char[] c = elementText.toCharArray(); try { contentHandler.characters(c, 0, c.length); } catch (SAXException se) { throw new JDOMException("Exception in characters", se); } } /** *

* This will be called for each chunk of comment data encontered. *

* * @param commentText all text in a comment, including whitespace. */ private void comment(String commentText) throws JDOMException { if (lexicalHandler != null) { char[] c = commentText.toCharArray(); try { lexicalHandler.comment(c, 0, c.length); } catch (SAXException se) { throw new JDOMException("Exception in comment", se); } } } /** *

* This will invoke the ContentHandler.skippedEntity * callback when an entity reference is encountered. *

* * @param entity EntityRef. */ private void entityRef(EntityRef entity) throws JDOMException { if (entity != null) { try { // No need to worry about appending a '%' character as // we do not support parameter entities contentHandler.skippedEntity(entity.getName()); } catch (SAXException se) { throw new JDOMException("Exception in entityRef", se); } } } /** *

* Appends a namespace declaration in the form of a xmlns attribute to * an attribute list, crerating this latter if needed. *

* * @param atts AttributeImpl where to add the attribute. * @param ns Namespace the namespace to declare. * * @return AttributeImpl the updated attribute list. */ private AttributesImpl addNsAttribute(AttributesImpl atts, Namespace ns) { if (this.declareNamespaces) { if (atts == null) { atts = new AttributesImpl(); } atts.addAttribute("", // namespace "", // local name "xmlns:" + ns.getPrefix(), // qualified name "CDATA", // type ns.getURI()); // value } return atts; } /** *

* Returns the SAX 2.0 attribute type string from the type of * a JDOM Attribute. *

* * @param type int the type of the JDOM attribute. * * @return String the SAX 2.0 attribute type string. * * @see org.jdom.Attribute#getAttributeType * @see org.xml.sax.Attributes#getType */ private static String getAttributeTypeName(int type) { if ((type < 0) || (type >= attrTypeToNameMap.length)) { type = Attribute.UNDECLARED_TYPE; } return attrTypeToNameMap[type]; } /** *

* Notifies the registered {@link ErrorHandler SAX error handler} * (if any) of an input processing error. The error handler can * choose to absorb the error and let the processing continue. *

* * @param exception JDOMException containing the * error information; will be wrapped in a * {@link SAXParseException} when reported to * the SAX error handler. * * @throws JDOMException if no error handler has been registered * or if the error handler fired a * {@link SAXException}. */ private void handleError(JDOMException exception) throws JDOMException { if (errorHandler != null) { try { errorHandler.error(new SAXParseException( exception.getMessage(), null, exception)); } catch (SAXException se) { if (se.getException() instanceof JDOMException) { throw (JDOMException)(se.getException()); } else { throw new JDOMException(se.getMessage(), se); } } } else { throw exception; } } /** *

* Creates a SAX XMLReader. *

* * @return XMLReader a SAX2 parser. * * @throws Exception if no parser can be created. */ protected XMLReader createParser() throws Exception { XMLReader parser = null; // Try using JAXP... // Note we need JAXP 1.1, and if JAXP 1.0 is all that's // available then the getXMLReader call fails and we skip // to the hard coded default parser try { Class factoryClass = Class.forName("javax.xml.parsers.SAXParserFactory"); // MODIFIED: Added (Class[]) and (Object[]) cast sentences in "null" parameters // to avoid warnings during compilation // factory = SAXParserFactory.newInstance(); Method newParserInstance = factoryClass.getMethod("newInstance", (Class[])null); Object factory = newParserInstance.invoke(null, (Object[])null); // jaxpParser = factory.newSAXParser(); Method newSAXParser = factoryClass.getMethod("newSAXParser", (Class[])null); Object jaxpParser = newSAXParser.invoke(factory, (Object[])null); // parser = jaxpParser.getXMLReader(); Class parserClass = jaxpParser.getClass(); Method getXMLReader = parserClass.getMethod("getXMLReader", (Class[])null); parser = (XMLReader)getXMLReader.invoke(jaxpParser, (Object[])null); } catch (ClassNotFoundException e) { //e.printStackTrace(); } catch (InvocationTargetException e) { //e.printStackTrace(); } catch (NoSuchMethodException e) { //e.printStackTrace(); } catch (IllegalAccessException e) { //e.printStackTrace(); } // Check to see if we got a parser yet, if not, try to use a // hard coded default if (parser == null) { parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser"); } return parser; } /** *

* This will create a SAX XMLReader capable of parsing a DTD and * configure it so that the DTD parsing events are routed to the * handlers registered onto this SAXOutputter. *

* * @return XMLReader a SAX2 parser. * * @throws JDOMException if no parser can be created. */ private XMLReader createDTDParser() throws JDOMException { XMLReader parser = null; // Get a parser instance try { parser = createParser(); } catch (Exception ex1) { throw new JDOMException("Error in SAX parser allocation", ex1); } // Register handlers if (this.getDTDHandler() != null) { parser.setDTDHandler(this.getDTDHandler()); } if (this.getEntityResolver() != null) { parser.setEntityResolver(this.getEntityResolver()); } if (this.getLexicalHandler() != null) { try { parser.setProperty(LEXICAL_HANDLER_SAX_PROPERTY, this.getLexicalHandler()); } catch (SAXException ex1) { try { parser.setProperty(LEXICAL_HANDLER_ALT_PROPERTY, this.getLexicalHandler()); } catch (SAXException ex2) { // Forget it! } } } if (this.getDeclHandler() != null) { try { parser.setProperty(DECL_HANDLER_SAX_PROPERTY, this.getDeclHandler()); } catch (SAXException ex1) { try { parser.setProperty(DECL_HANDLER_ALT_PROPERTY, this.getDeclHandler()); } catch (SAXException ex2) { // Forget it! } } } // Absorb errors as much as possible, per Laurent parser.setErrorHandler(new DefaultHandler()); return parser; } /** * Returns a JDOMLocator object referencing the node currently * being processed by this outputter. The returned object is a * snapshot of the location information and can thus safely be * memorized for later use. *

* This method allows direct access to the location information * maintained by SAXOutputter without requiring to implement * XMLFilter. (In SAX, locators are only available * though the ContentHandler interface).

*

* Note that location information is only available while * SAXOutputter is outputting nodes. Hence this method should * only be used by objects taking part in the output processing * such as ErrorHandlers. * * @return a JDOMLocator object referencing the node currently * being processed or null if no output * operation is being performed. */ public JDOMLocator getLocator() { return (locator != null)? new JDOMLocator(locator): null; } } extensions/xml/jdom-1.0/src/org/jdom/output/XMLOutputter.java000066400000000000000000001625441335566474600244470ustar00rootroot00000000000000/*-- $Id: XMLOutputter.java,v 1.2 2013-09-20 15:11:33 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.output; import java.io.*; import java.util.*; import javax.xml.transform.Result; import org.jdom.*; /** * Outputs a JDOM document as a stream of bytes. The outputter can manage many * styles of document formatting, from untouched to pretty printed. The default * is to output the document content exactly as created, but this can be changed * by setting a new Format object. For pretty-print output, use * {@link Format#getPrettyFormat()}. For whitespace-normalized * output, use {@link Format#getCompactFormat()}. *

* There are {@link #output output(...)} methods to print any of * the standard JDOM classes, including Document and Element, to either a Writer * or an OutputStream. Warning: When outputting to a Writer, make sure * the writer's encoding matches the encoding setting in the Format object. This * ensures the encoding in which the content is written (controlled by the * Writer configuration) matches the encoding placed in the document's XML * declaration (controlled by the XMLOutputter). Because a Writer cannot be * queried for its encoding, the information must be passed to the Format * manually in its constructor or via the * {@link Format#setEncoding} method. The default encoding is * UTF-8. *

* The methods {@link #outputString outputString(...)} are for * convenience only; for top performance you should call one of the {@link * #output output(...)} methods and pass in your own Writer or * OutputStream if possible. *

* XML declarations are always printed on their own line followed by a line * seperator (this doesn't change the semantics of the document). To omit * printing of the declaration use * {@link Format#setOmitDeclaration}. To omit printing of the * encoding in the declaration use {@link Format#setOmitEncoding}. * Unfortunatly there is currently no way to know the original encoding of the * document. *

* Empty elements are by default printed as <empty/>, but this can be * configured with {@link Format#setExpandEmptyElements} to cause * them to be expanded to <empty></empty>. * * @version $Revision: 1.2 $, $Date: 2013-09-20 15:11:33 $ * @author Brett McLaughlin * @author Jason Hunter * @author Jason Reid * @author Wolfgang Werner * @author Elliotte Rusty Harold * @author David & Will (from Post Tool Design) * @author Dan Schaffer * @author Alex Chaffee * @author Bradley S. Huffman */ public class XMLOutputter implements Cloneable { private static final String CVS_ID = "@(#) $RCSfile: XMLOutputter.java,v $ $Revision: 1.2 $ $Date: 2013-09-20 15:11:33 $ $Name: $"; // For normal output private Format userFormat = Format.getRawFormat(); // For xml:space="preserve" protected static final Format preserveFormat = Format.getRawFormat(); // What's currently in use protected Format currentFormat = userFormat; /** Whether output escaping is enabled for the being processed * Element - default is true */ private boolean escapeOutput = true; // * * * * * * * * * * Constructors * * * * * * * * * * // * * * * * * * * * * Constructors * * * * * * * * * * /** * This will create an XMLOutputter with the default * {@link Format} matching {@link Format#getRawFormat}. */ public XMLOutputter() { } /** * This will create an XMLOutputter with the specified * format characteristics. Note the format object is cloned internally * before use. */ public XMLOutputter(Format format) { userFormat = (Format) format.clone(); currentFormat = userFormat; } /** * This will create an XMLOutputter with all the * options as set in the given XMLOutputter. Note * that XMLOutputter two = (XMLOutputter)one.clone(); * would work equally well. * * @param that the XMLOutputter to clone */ public XMLOutputter(XMLOutputter that) { this.userFormat = (Format) that.userFormat.clone(); currentFormat = userFormat; } // * * * * * * * * * * Set parameters methods * * * * * * * * * * // * * * * * * * * * * Set parameters methods * * * * * * * * * * /** * Sets the new format logic for the outputter. Note the Format * object is cloned internally before use. * * @param newFormat the format to use for output */ public void setFormat(Format newFormat) { this.userFormat = (Format) newFormat.clone(); this.currentFormat = userFormat; } /** * Returns the current format in use by the outputter. Note the * Format object returned is a clone of the one used internally. */ public Format getFormat() { return (Format) userFormat.clone(); } // * * * * * * * * * * Output to a OutputStream * * * * * * * * * * // * * * * * * * * * * Output to a OutputStream * * * * * * * * * * /** * This will print the Document to the given output stream. * The characters are printed using the encoding specified in the * constructor, or a default of UTF-8. * * @param doc Document to format. * @param out OutputStream to use. * @throws IOException - if there's any problem writing. */ public void output(Document doc, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(doc, writer); // output() flushes } /** * Print out the {@link DocType}. * * @param doctype DocType to output. * @param out OutputStream to use. */ public void output(DocType doctype, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(doctype, writer); // output() flushes } /** * Print out an {@link Element}, including * its {@link Attribute}s, and all * contained (child) elements, etc. * * @param element Element to output. * @param out Writer to use. */ public void output(Element element, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(element, writer); // output() flushes } /** * This will handle printing out an {@link * Element}'s content only, not including its tag, and * attributes. This can be useful for printing the content of an * element that contains HTML, like "<description>JDOM is * <b>fun>!</description>". * * @param element Element to output. * @param out OutputStream to use. */ public void outputElementContent(Element element, OutputStream out) throws IOException { Writer writer = makeWriter(out); outputElementContent(element, writer); // output() flushes } /** * This will handle printing out a list of nodes. * This can be useful for printing the content of an element that * contains HTML, like "<description>JDOM is * <b>fun>!</description>". * * @param list List of nodes. * @param out OutputStream to use. */ public void output(List list, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(list, writer); // output() flushes } /** * Print out a {@link CDATA} node. * * @param cdata CDATA to output. * @param out OutputStream to use. */ public void output(CDATA cdata, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(cdata, writer); // output() flushes } /** * Print out a {@link Text} node. Perfoms * the necessary entity escaping and whitespace stripping. * * @param text Text to output. * @param out OutputStream to use. */ public void output(Text text, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(text, writer); // output() flushes } /** * Print out a {@link Comment}. * * @param comment Comment to output. * @param out OutputStream to use. */ public void output(Comment comment, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(comment, writer); // output() flushes } /** * Print out a {@link ProcessingInstruction}. * * @param pi ProcessingInstruction to output. * @param out OutputStream to use. */ public void output(ProcessingInstruction pi, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(pi, writer); // output() flushes } /** * Print out a {@link EntityRef}. * * @param entity EntityRef to output. * @param out OutputStream to use. */ public void output(EntityRef entity, OutputStream out) throws IOException { Writer writer = makeWriter(out); output(entity, writer); // output() flushes } /** * Get an OutputStreamWriter, using prefered encoding * (see {@link Format#setEncoding}). */ private Writer makeWriter(OutputStream out) throws java.io.UnsupportedEncodingException { return makeWriter(out, userFormat.encoding); } /** * Get an OutputStreamWriter, use specified encoding. */ private static Writer makeWriter(OutputStream out, String enc) throws java.io.UnsupportedEncodingException { // "UTF-8" is not recognized before JDK 1.1.6, so we'll translate // into "UTF8" which works with all JDKs. if ("UTF-8".equals(enc)) { enc = "UTF8"; } Writer writer = new BufferedWriter( (new OutputStreamWriter( new BufferedOutputStream(out), enc) )); return writer; } // * * * * * * * * * * Output to a Writer * * * * * * * * * * // * * * * * * * * * * Output to a Writer * * * * * * * * * * /** * This will print the Document to the given Writer. * *

* Warning: using your own Writer may cause the outputter's * preferred character encoding to be ignored. If you use * encodings other than UTF-8, we recommend using the method that * takes an OutputStream instead. *

* * @param doc Document to format. * @param out Writer to use. * @throws IOException - if there's any problem writing. */ public void output(Document doc, Writer out) throws IOException { printDeclaration(out, doc, userFormat.encoding); // Print out root element, as well as any root level // comments and processing instructions, // starting with no indentation List content = doc.getContent(); int size = content.size(); for (int i = 0; i < size; i++) { Object obj = content.get(i); if (obj instanceof Element) { printElement(out, doc.getRootElement(), 0, createNamespaceStack()); } else if (obj instanceof Comment) { printComment(out, (Comment) obj); } else if (obj instanceof ProcessingInstruction) { printProcessingInstruction(out, (ProcessingInstruction) obj); } else if (obj instanceof DocType) { printDocType(out, doc.getDocType()); // Always print line separator after declaration, helps the // output look better and is semantically inconsequential out.write(currentFormat.lineSeparator); } else { // XXX if we get here then we have a illegal content, for // now we'll just ignore it } newline(out); indent(out, 0); } // Output final line separator // We output this no matter what the newline flags say out.write(currentFormat.lineSeparator); out.flush(); } /** * Print out the {@link DocType}. * * @param doctype DocType to output. * @param out Writer to use. */ public void output(DocType doctype, Writer out) throws IOException { printDocType(out, doctype); out.flush(); } /** * Print out an {@link Element}, including * its {@link Attribute}s, and all * contained (child) elements, etc. * * @param element Element to output. * @param out Writer to use. */ public void output(Element element, Writer out) throws IOException { // If this is the root element we could pre-initialize the // namespace stack with the namespaces printElement(out, element, 0, createNamespaceStack()); out.flush(); } /** * This will handle printing out an {@link * Element}'s content only, not including its tag, and * attributes. This can be useful for printing the content of an * element that contains HTML, like "<description>JDOM is * <b>fun>!</description>". * * @param element Element to output. * @param out Writer to use. */ public void outputElementContent(Element element, Writer out) throws IOException { List content = element.getContent(); printContentRange(out, content, 0, content.size(), 0, createNamespaceStack()); out.flush(); } /** * This will handle printing out a list of nodes. * This can be useful for printing the content of an element that * contains HTML, like "<description>JDOM is * <b>fun>!</description>". * * @param list List of nodes. * @param out Writer to use. */ public void output(List list, Writer out) throws IOException { printContentRange(out, list, 0, list.size(), 0, createNamespaceStack()); out.flush(); } /** * Print out a {@link CDATA} node. * * @param cdata CDATA to output. * @param out Writer to use. */ public void output(CDATA cdata, Writer out) throws IOException { printCDATA(out, cdata); out.flush(); } /** * Print out a {@link Text} node. Perfoms * the necessary entity escaping and whitespace stripping. * * @param text Text to output. * @param out Writer to use. */ public void output(Text text, Writer out) throws IOException { printText(out, text); out.flush(); } /** * Print out a {@link Comment}. * * @param comment Comment to output. * @param out Writer to use. */ public void output(Comment comment, Writer out) throws IOException { printComment(out, comment); out.flush(); } /** * Print out a {@link ProcessingInstruction}. * * @param pi ProcessingInstruction to output. * @param out Writer to use. */ public void output(ProcessingInstruction pi, Writer out) throws IOException { boolean currentEscapingPolicy = currentFormat.ignoreTrAXEscapingPIs; // Output PI verbatim, disregarding TrAX escaping PIs. currentFormat.setIgnoreTrAXEscapingPIs(true); printProcessingInstruction(out, pi); currentFormat.setIgnoreTrAXEscapingPIs(currentEscapingPolicy); out.flush(); } /** * Print out a {@link EntityRef}. * * @param entity EntityRef to output. * @param out Writer to use. */ public void output(EntityRef entity, Writer out) throws IOException { printEntityRef(out, entity); out.flush(); } // * * * * * * * * * * Output to a String * * * * * * * * * * // * * * * * * * * * * Output to a String * * * * * * * * * * /** * Return a string representing a document. Uses an internal * StringWriter. Warning: a String is Unicode, which may not match * the outputter's specified encoding. * * @param doc Document to format. */ public String outputString(Document doc) { StringWriter out = new StringWriter(); try { output(doc, out); // output() flushes } catch (IOException e) { } return out.toString(); } /** * Return a string representing a DocType. Warning: a String is * Unicode, which may not match the outputter's specified * encoding. * * @param doctype DocType to format. */ public String outputString(DocType doctype) { StringWriter out = new StringWriter(); try { output(doctype, out); // output() flushes } catch (IOException e) { } return out.toString(); } /** * Return a string representing an element. Warning: a String is * Unicode, which may not match the outputter's specified * encoding. * * @param element Element to format. */ public String outputString(Element element) { StringWriter out = new StringWriter(); try { output(element, out); // output() flushes } catch (IOException e) { } return out.toString(); } /** * Return a string representing a list of nodes. The list is * assumed to contain legal JDOM nodes. * * @param list List to format. */ public String outputString(List list) { StringWriter out = new StringWriter(); try { output(list, out); // output() flushes } catch (IOException e) { } return out.toString(); } /** * Return a string representing a CDATA node. Warning: a String is * Unicode, which may not match the outputter's specified * encoding. * * @param cdata CDATA to format. */ public String outputString(CDATA cdata) { StringWriter out = new StringWriter(); try { output(cdata, out); // output() flushes } catch (IOException e) { } return out.toString(); } /** * Return a string representing a Text node. Warning: a String is * Unicode, which may not match the outputter's specified * encoding. * * @param text Text to format. */ public String outputString(Text text) { StringWriter out = new StringWriter(); try { output(text, out); // output() flushes } catch (IOException e) { } return out.toString(); } /** * Return a string representing a comment. Warning: a String is * Unicode, which may not match the outputter's specified * encoding. * * @param comment Comment to format. */ public String outputString(Comment comment) { StringWriter out = new StringWriter(); try { output(comment, out); // output() flushes } catch (IOException e) { } return out.toString(); } /** * Return a string representing a PI. Warning: a String is * Unicode, which may not match the outputter's specified * encoding. * * @param pi ProcessingInstruction to format. */ public String outputString(ProcessingInstruction pi) { StringWriter out = new StringWriter(); try { output(pi, out); // output() flushes } catch (IOException e) { } return out.toString(); } /** * Return a string representing an entity. Warning: a String is * Unicode, which may not match the outputter's specified * encoding. * * @param entity EntityRef to format. */ public String outputString(EntityRef entity) { StringWriter out = new StringWriter(); try { output(entity, out); // output() flushes } catch (IOException e) { } return out.toString(); } // * * * * * * * * * * Internal printing methods * * * * * * * * * * // * * * * * * * * * * Internal printing methods * * * * * * * * * * /** * This will handle printing of the declaration. * Assumes XML version 1.0 since we don't directly know. * * @param doc Document whose declaration to write. * @param out Writer to use. * @param encoding The encoding to add to the declaration */ protected void printDeclaration(Writer out, Document doc, String encoding) throws IOException { // Only print the declaration if it's not being omitted if (!userFormat.omitDeclaration) { // Assume 1.0 version out.write(""); // Print new line after decl always, even if no other new lines // Helps the output look better and is semantically // inconsequential out.write(currentFormat.lineSeparator); } } /** * This handle printing the DOCTYPE declaration if one exists. * * @param docType Document whose declaration to write. * @param out Writer to use. */ protected void printDocType(Writer out, DocType docType) throws IOException { String publicID = docType.getPublicID(); String systemID = docType.getSystemID(); String internalSubset = docType.getInternalSubset(); boolean hasPublic = false; out.write(""); } /** * This will handle printing of comments. * * @param comment Comment to write. * @param out Writer to use. */ protected void printComment(Writer out, Comment comment) throws IOException { out.write(""); } /** * This will handle printing of processing instructions. * * @param pi ProcessingInstruction to write. * @param out Writer to use. */ protected void printProcessingInstruction(Writer out, ProcessingInstruction pi ) throws IOException { String target = pi.getTarget(); boolean piProcessed = false; if (currentFormat.ignoreTrAXEscapingPIs == false) { if (target.equals(Result.PI_DISABLE_OUTPUT_ESCAPING)) { escapeOutput = false; piProcessed = true; } else if (target.equals(Result.PI_ENABLE_OUTPUT_ESCAPING)) { escapeOutput = true; piProcessed = true; } } if (piProcessed == false) { String rawData = pi.getData(); // Write or if no data then just if (!"".equals(rawData)) { out.write(""); } else { out.write(""); } } } /** * This will handle printing a {@link EntityRef}. * Only the entity reference such as &entity; * will be printed. However, subclasses are free to override * this method to print the contents of the entity instead. * * @param entity EntityRef to output. * @param out Writer to use. */ protected void printEntityRef(Writer out, EntityRef entity) throws IOException { out.write("&"); out.write(entity.getName()); out.write(";"); } /** * This will handle printing of {@link CDATA} text. * * @param cdata CDATA to output. * @param out Writer to use. */ protected void printCDATA(Writer out, CDATA cdata) throws IOException { String str = (currentFormat.mode == Format.TextMode.NORMALIZE) ? cdata.getTextNormalize() : ((currentFormat.mode == Format.TextMode.TRIM) ? cdata.getText().trim() : cdata.getText()); out.write(""); } /** * This will handle printing of {@link Text} strings. * * @param text Text to write. * @param out Writer to use. */ protected void printText(Writer out, Text text) throws IOException { String str = (currentFormat.mode == Format.TextMode.NORMALIZE) ? text.getTextNormalize() : ((currentFormat.mode == Format.TextMode.TRIM) ? text.getText().trim() : text.getText()); out.write(escapeElementEntities(str)); } /** * This will handle printing a string. Escapes the element entities, * trims interior whitespace, etc. if necessary. */ private void printString(Writer out, String str) throws IOException { if (currentFormat.mode == Format.TextMode.NORMALIZE) { str = Text.normalizeString(str); } else if (currentFormat.mode == Format.TextMode.TRIM) { str = str.trim(); } out.write(escapeElementEntities(str)); } /** * This will handle printing of a {@link Element}, * its {@link Attribute}s, and all contained (child) * elements, etc. * * @param element Element to output. * @param out Writer to use. * @param level int level of indention. * @param namespaces List stack of Namespaces in scope. */ protected void printElement(Writer out, Element element, int level, NamespaceStack namespaces) throws IOException { List attributes = element.getAttributes(); List content = element.getContent(); // Check for xml:space and adjust format settings String space = null; if (attributes != null) { space = element.getAttributeValue("space", Namespace.XML_NAMESPACE); } Format previousFormat = currentFormat; if ("default".equals(space)) { currentFormat = userFormat; } else if ("preserve".equals(space)) { currentFormat = preserveFormat; } // Print the beginning of the tag plus attributes and any // necessary namespace declarations out.write("<"); printQualifiedName(out, element); // Mark our namespace starting point int previouslyDeclaredNamespaces = namespaces.size(); // Print the element's namespace, if appropriate printElementNamespace(out, element, namespaces); // Print out additional namespace declarations printAdditionalNamespaces(out, element, namespaces); // Print out attributes if (attributes != null) printAttributes(out, attributes, element, namespaces); // Depending on the settings (newlines, textNormalize, etc), we may // or may not want to print all of the content, so determine the // index of the start of the content we're interested // in based on the current settings. int start = skipLeadingWhite(content, 0); int size = content.size(); if (start >= size) { // Case content is empty or all insignificant whitespace if (currentFormat.expandEmptyElements) { out.write(">"); } else { out.write(" />"); } } else { out.write(">"); // For a special case where the content is only CDATA // or Text we don't want to indent after the start or // before the end tag. if (nextNonText(content, start) < size) { // Case Mixed Content - normal indentation newline(out); printContentRange(out, content, start, size, level + 1, namespaces); newline(out); indent(out, level); } else { // Case all CDATA or Text - no indentation printTextRange(out, content, start, size); } out.write(""); } // remove declared namespaces from stack while (namespaces.size() > previouslyDeclaredNamespaces) { namespaces.pop(); } // Restore our format settings currentFormat = previousFormat; } /** * This will handle printing of content within a given range. * The range to print is specified in typical Java fashion; the * starting index is inclusive, while the ending index is * exclusive. * * @param content List of content to output * @param start index of first content node (inclusive. * @param end index of last content node (exclusive). * @param out Writer to use. * @param level int level of indentation. * @param namespaces List stack of Namespaces in scope. */ private void printContentRange(Writer out, List content, int start, int end, int level, NamespaceStack namespaces) throws IOException { boolean firstNode; // Flag for 1st node in content Object next; // Node we're about to print int first, index; // Indexes into the list of content index = start; while (index < end) { firstNode = (index == start) ? true : false; next = content.get(index); // // Handle consecutive CDATA, Text, and EntityRef nodes all at once // if ((next instanceof Text) || (next instanceof EntityRef)) { first = skipLeadingWhite(content, index); // Set index to next node for loop index = nextNonText(content, first); // If it's not all whitespace - print it! if (first < index) { if (!firstNode) newline(out); indent(out, level); printTextRange(out, content, first, index); } continue; } // // Handle other nodes // if (!firstNode) { newline(out); } indent(out, level); if (next instanceof Comment) { printComment(out, (Comment)next); } else if (next instanceof Element) { printElement(out, (Element)next, level, namespaces); } else if (next instanceof ProcessingInstruction) { printProcessingInstruction(out, (ProcessingInstruction)next); } else { // XXX if we get here then we have a illegal content, for // now we'll just ignore it (probably should throw // a exception) } index++; } /* while */ } /** * This will handle printing of a sequence of {@link CDATA} * or {@link Text} nodes. It is an error to have any other * pass this method any other type of node. * * @param content List of content to output * @param start index of first content node (inclusive). * @param end index of last content node (exclusive). * @param out Writer to use. */ private void printTextRange(Writer out, List content, int start, int end ) throws IOException { String previous; // Previous text printed Object node; // Next node to print String next; // Next text to print previous = null; // Remove leading whitespace-only nodes start = skipLeadingWhite(content, start); int size = content.size(); if (start < size) { // And remove trialing whitespace-only nodes end = skipTrailingWhite(content, end); for (int i = start; i < end; i++) { node = content.get(i); // Get the unmangled version of the text // we are about to print if (node instanceof Text) { next = ((Text) node).getText(); } else if (node instanceof EntityRef) { next = "&" + ((EntityRef) node).getValue() + ";"; } else { throw new IllegalStateException("Should see only " + "CDATA, Text, or EntityRef"); } // This may save a little time if (next == null || "".equals(next)) { continue; } // Determine if we need to pad the output (padding is // only need in trim or normalizing mode) if (previous != null) { // Not 1st node if (currentFormat.mode == Format.TextMode.NORMALIZE || currentFormat.mode == Format.TextMode.TRIM) { if ((endsWithWhite(previous)) || (startsWithWhite(next))) { out.write(" "); } } } // Print the node if (node instanceof CDATA) { printCDATA(out, (CDATA) node); } else if (node instanceof EntityRef) { printEntityRef(out, (EntityRef) node); } else { printString(out, next); } previous = next; } } } /** * This will handle printing of any needed {@link Namespace} * declarations. * * @param ns Namespace to print definition of * @param out Writer to use. */ private void printNamespace(Writer out, Namespace ns, NamespaceStack namespaces) throws IOException { String prefix = ns.getPrefix(); String uri = ns.getURI(); // Already printed namespace decl? if (uri.equals(namespaces.getURI(prefix))) { return; } out.write(" xmlns"); if (!prefix.equals("")) { out.write(":"); out.write(prefix); } out.write("=\""); out.write(uri); out.write("\""); namespaces.push(ns); } /** * This will handle printing of a {@link Attribute} list. * * @param attributes List of Attribute objcts * @param out Writer to use */ protected void printAttributes(Writer out, List attributes, Element parent, NamespaceStack namespaces) throws IOException { // I do not yet handle the case where the same prefix maps to // two different URIs. For attributes on the same element // this is illegal; but as yet we don't throw an exception // if someone tries to do this // Set prefixes = new HashSet(); for (int i = 0; i < attributes.size(); i++) { Attribute attribute = (Attribute) attributes.get(i); Namespace ns = attribute.getNamespace(); if ((ns != Namespace.NO_NAMESPACE) && (ns != Namespace.XML_NAMESPACE)) { printNamespace(out, ns, namespaces); } out.write(" "); printQualifiedName(out, attribute); out.write("="); out.write("\""); out.write(escapeAttributeEntities(attribute.getValue())); out.write("\""); } } private void printElementNamespace(Writer out, Element element, NamespaceStack namespaces) throws IOException { // Add namespace decl only if it's not the XML namespace and it's // not the NO_NAMESPACE with the prefix "" not yet mapped // (we do output xmlns="" if the "" prefix was already used and we // need to reclaim it for the NO_NAMESPACE) Namespace ns = element.getNamespace(); if (ns == Namespace.XML_NAMESPACE) { return; } if ( !((ns == Namespace.NO_NAMESPACE) && (namespaces.getURI("") == null))) { printNamespace(out, ns, namespaces); } } private void printAdditionalNamespaces(Writer out, Element element, NamespaceStack namespaces) throws IOException { List list = element.getAdditionalNamespaces(); if (list != null) { for (int i = 0; i < list.size(); i++) { Namespace additional = (Namespace)list.get(i); printNamespace(out, additional, namespaces); } } } // * * * * * * * * * * Support methods * * * * * * * * * * // * * * * * * * * * * Support methods * * * * * * * * * * /** * This will print a new line only if the newlines flag was set to * true. * * @param out Writer to use */ private void newline(Writer out) throws IOException { if (currentFormat.indent != null) { out.write(currentFormat.lineSeparator); } } /** * This will print indents (only if the newlines flag was * set to true, and indent is non-null). * * @param out Writer to use * @param level current indent level (number of tabs) */ private void indent(Writer out, int level) throws IOException { if (currentFormat.indent == null || currentFormat.indent.equals("")) { return; } for (int i = 0; i < level; i++) { out.write(currentFormat.indent); } } // Returns the index of the first non-all-whitespace CDATA or Text, // index = content.size() is returned if content contains // all whitespace. // @param start index to begin search (inclusive) private int skipLeadingWhite(List content, int start) { if (start < 0) { start = 0; } int index = start; int size = content.size(); if (currentFormat.mode == Format.TextMode.TRIM_FULL_WHITE || currentFormat.mode == Format.TextMode.NORMALIZE || currentFormat.mode == Format.TextMode.TRIM) { while (index < size) { if (!isAllWhitespace(content.get(index))) { return index; } index++; } } return index; } // Return the index + 1 of the last non-all-whitespace CDATA or // Text node, index < 0 is returned // if content contains all whitespace. // @param start index to begin search (exclusive) private int skipTrailingWhite(List content, int start) { int size = content.size(); if (start > size) { start = size; } int index = start; if (currentFormat.mode == Format.TextMode.TRIM_FULL_WHITE || currentFormat.mode == Format.TextMode.NORMALIZE || currentFormat.mode == Format.TextMode.TRIM) { while (index >= 0) { if (!isAllWhitespace(content.get(index - 1))) break; --index; } } return index; } // Return the next non-CDATA, non-Text, or non-EntityRef node, // index = content.size() is returned if there is no more non-CDATA, // non-Text, or non-EntiryRef nodes // @param start index to begin search (inclusive) private static int nextNonText(List content, int start) { if (start < 0) { start = 0; } int index = start; int size = content.size(); while (index < size) { Object node = content.get(index); if (!((node instanceof Text) || (node instanceof EntityRef))) { return index; } index++; } return size; } // Determine if a Object is all whitespace private boolean isAllWhitespace(Object obj) { String str = null; if (obj instanceof String) { str = (String) obj; } else if (obj instanceof Text) { str = ((Text) obj).getText(); } else if (obj instanceof EntityRef) { return false; } else { return false; } for (int i = 0; i < str.length(); i++) { if (!isWhitespace(str.charAt(i))) return false; } return true; } // Determine if a string starts with a XML whitespace. private boolean startsWithWhite(String str) { if ((str != null) && (str.length() > 0) && isWhitespace(str.charAt(0))) { return true; } return false; } // Determine if a string ends with a XML whitespace. private boolean endsWithWhite(String str) { if ((str != null) && (str.length() > 0) && isWhitespace(str.charAt(str.length() - 1))) { return true; } return false; } // Determine if a character is a XML whitespace. // XXX should this method be in Verifier private static boolean isWhitespace(char c) { if (c==' ' || c=='\n' || c=='\t' || c=='\r' ){ return true; } return false; } /** * This will take the pre-defined entities in XML 1.0 and * convert their character representation to the appropriate * entity reference, suitable for XML attributes. It does not convert * the single quote (') because it's not necessary as the outputter * writes attributes surrounded by double-quotes. * * @param str String input to escape. * @return String with escaped content. */ public String escapeAttributeEntities(String str) { StringBuilder buffer; char ch; String entity; EscapeStrategy strategy = currentFormat.escapeStrategy; buffer = null; for (int i = 0; i < str.length(); i++) { ch = str.charAt(i); switch(ch) { case '<' : entity = "<"; break; case '>' : entity = ">"; break; /* case '\'' : entity = "'"; break; */ case '\"' : entity = """; break; case '&' : entity = "&"; break; case '\r' : entity = " "; break; case '\t' : entity = " "; break; case '\n' : entity = " "; break; default : if (strategy.shouldEscape(ch)) { entity = "&#x" + Integer.toHexString(ch) + ";"; } else { entity = null; } break; } if (buffer == null) { if (entity != null) { // An entity occurred, so we'll have to use StringBuffer // (allocate room for it plus a few more entities). buffer = new StringBuilder(str.length() + 20); // Copy previous skipped characters and fall through // to pickup current character buffer.append(str.substring(0, i)); buffer.append(entity); } } else { if (entity == null) { buffer.append(ch); } else { buffer.append(entity); } } } // If there were any entities, return the escaped characters // that we put in the StringBuffer. Otherwise, just return // the unmodified input string. return (buffer == null) ? str : buffer // JCLIC modification //.toString(); .substring(0); } /** * This will take the three pre-defined entities in XML 1.0 * (used specifically in XML elements) and convert their character * representation to the appropriate entity reference, suitable for * XML element content. * * @param str String input to escape. * @return String with escaped content. */ public String escapeElementEntities(String str) { if (escapeOutput == false) return str; StringBuilder buffer; char ch; String entity; EscapeStrategy strategy = currentFormat.escapeStrategy; buffer = null; for (int i = 0; i < str.length(); i++) { ch = str.charAt(i); switch(ch) { case '<' : entity = "<"; break; case '>' : entity = ">"; break; case '&' : entity = "&"; break; case '\r' : entity = " "; break; case '\n' : entity = currentFormat.lineSeparator; break; default : if (strategy.shouldEscape(ch)) { entity = "&#x" + Integer.toHexString(ch) + ";"; } else { entity = null; } break; } if (buffer == null) { if (entity != null) { // An entity occurred, so we'll have to use StringBuffer // (allocate room for it plus a few more entities). buffer = new StringBuilder(str.length() + 20); // Copy previous skipped characters and fall through // to pickup current character buffer.append(str.substring(0, i)); buffer.append(entity); } } else { if (entity == null) { buffer.append(ch); } else { buffer.append(entity); } } } // If there were any entities, return the escaped characters // that we put in the StringBuffer. Otherwise, just return // the unmodified input string. return (buffer == null) ? str : buffer // JCLIC modification //.toString(); .substring(0); } /** * Returns a copy of this XMLOutputter. */ public Object clone() { // Implementation notes: Since all state of an XMLOutputter is // embodied in simple private instance variables, Object.clone // can be used. Note that since Object.clone is totally // broken, we must catch an exception that will never be // thrown. try { return super.clone(); } catch (java.lang.CloneNotSupportedException e) { // even though this should never ever happen, it's still // possible to fool Java into throwing a // CloneNotSupportedException. If that happens, we // shouldn't swallow it. throw new RuntimeException(e.toString()); } } /** * Return a string listing of the settings for this * XMLOutputter instance. * * @return a string listing the settings for this XMLOutputter instance */ public String toString() { StringBuilder buffer = new StringBuilder(); for (int i = 0; i < userFormat.lineSeparator.length(); i++) { char ch = userFormat.lineSeparator.charAt(i); switch (ch) { case '\r': buffer.append("\\r"); break; case '\n': buffer.append("\\n"); break; case '\t': buffer.append("\\t"); break; default: buffer.append("[" + ((int)ch) + "]"); break; } } return ( "XMLOutputter[omitDeclaration = " + userFormat.omitDeclaration + ", " + "encoding = " + userFormat.encoding + ", " + "omitEncoding = " + userFormat.omitEncoding + ", " + "indent = '" + userFormat.indent + "'" + ", " + "expandEmptyElements = " + userFormat.expandEmptyElements + ", " + "lineSeparator = '" + buffer // JCLIC modification //.toString() .substring(0) + "', " + "textMode = " + userFormat.mode + "]" ); } /** * Factory for making new NamespaceStack objects. The NamespaceStack * created is actually an inner class extending the package protected * NamespaceStack, as a way to make NamespaceStack "friendly" toward * subclassers. */ private NamespaceStack createNamespaceStack() { // actually returns a XMLOutputter.NamespaceStack (see below) return new NamespaceStack(); } /** * Our own null subclass of NamespaceStack. This plays a little * trick with Java access protection. We want subclasses of * XMLOutputter to be able to override protected methods that * declare a NamespaceStack parameter, but we don't want to * declare the parent NamespaceStack class as public. */ protected class NamespaceStack extends org.jdom.output.NamespaceStack { } // Support method to print a name without using elt.getQualifiedName() // and thus avoiding a StringBuffer creation and memory churn private void printQualifiedName(Writer out, Element e) throws IOException { if (e.getNamespace().getPrefix().length() == 0) { out.write(e.getName()); } else { out.write(e.getNamespace().getPrefix()); out.write(':'); out.write(e.getName()); } } // Support method to print a name without using att.getQualifiedName() // and thus avoiding a StringBuffer creation and memory churn private void printQualifiedName(Writer out, Attribute a) throws IOException { String prefix = a.getNamespace().getPrefix(); if ((prefix != null) && (!prefix.equals(""))) { out.write(prefix); out.write(':'); out.write(a.getName()); } else { out.write(a.getName()); } } // * * * * * * * * * * Deprecated methods * * * * * * * * * * /* The methods below here are deprecations of protected methods. We * don't usually deprecate protected methods, so they're commented out. * They're left here in case this mass deprecation causes people trouble. * Since we're getting close to 1.0 it's actually better for people to * raise issues early though. */ } extensions/xml/jdom-1.0/src/org/jdom/transform/000077500000000000000000000000001335566474600216475ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/jdom/transform/JDOMResult.java000066400000000000000000000546331335566474600244550ustar00rootroot00000000000000/*-- $Id: JDOMResult.java,v 1.1.1.1 2005/12/02 14:16:51 fbusquets Exp $ Copyright (C) 2001-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.transform; import java.util.*; import javax.xml.transform.sax.*; import org.jdom.*; import org.jdom.input.*; import org.xml.sax.*; import org.xml.sax.ext.*; import org.xml.sax.helpers.*; /** * A holder for an XSL Transformation result, generally a list of nodes * although it can be a JDOM Document also. As stated by the XSLT 1.0 * specification, the result tree generated by an XSL transformation is not * required to be a well-formed XML document. The result tree may have "any * sequence of nodes as children that would be possible for an * element node". *

* The following example shows how to apply an XSL Transformation * to a JDOM document and get the transformation result in the form * of a list of JDOM nodes: *


 *   public static List transform(Document doc, String stylesheet)
 *                                        throws JDOMException {
 *     try {
 *       Transformer transformer = TransformerFactory.newInstance()
 *                             .newTransformer(new StreamSource(stylesheet));
 *       JDOMSource in = new JDOMSource(doc);
 *       JDOMResult out = new JDOMResult();
 *       transformer.transform(in, out);
 *       return out.getResult();
 *     }
 *     catch (TransformerException e) {
 *       throw new JDOMException("XSLT Transformation failed", e);
 *     }
 *   }
 * 
* * @see org.jdom.transform.JDOMSource * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:51 $ * @author Laurent Bihanic * @author Jason Hunter */ public class JDOMResult extends SAXResult { private static final String CVS_ID = "@(#) $RCSfile: JDOMResult.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:51 $ $Name: $"; /** * If {@link javax.xml.transform.TransformerFactory#getFeature} * returns true when passed this value as an * argument, the Transformer natively supports JDOM. *

* Note: This implementation does not override * the {@link SAXResult#FEATURE} value defined by its superclass * to be considered as a SAXResult by Transformer implementations * not natively supporting JDOM.

*/ public final static String JDOM_FEATURE = "http://org.jdom.transform.JDOMResult/feature"; /** * The result of a transformation, as set by Transformer * implementations that natively support JDOM, as a JDOM document * or a list of JDOM nodes. */ private Object result = null; /** * Whether the application queried the result (as a list or a * document) since it was last set. */ private boolean queried = false; /** * The custom JDOM factory to use when building the transformation * result or null to use the default JDOM classes. */ private JDOMFactory factory = null; /** * Public default constructor. */ public JDOMResult() { // Allocate custom builder object... DocumentBuilder builder = new DocumentBuilder(); // And use it as ContentHandler and LexicalHandler. super.setHandler(builder); super.setLexicalHandler(builder); } /** * Sets the object(s) produced as result of an XSL Transformation. *

* Note: This method shall be used by the * {@link javax.xml.transform.Transformer} implementations that * natively support JDOM to directly set the transformation * result rather than considering this object as a * {@link SAXResult}. Applications should not use this * method.

* * @param result the result of a transformation as a * {@link java.util.List list} of JDOM nodes * (Elements, Texts, Comments, PIs...). * * @see #getResult */ public void setResult(List result) { this.result = result; this.queried = false; } /** * Returns the result of an XSL Transformation as a list of JDOM * nodes. *

* If the result of the transformation is a JDOM document, * this method converts it into a list of JDOM nodes; any * subsequent call to {@link #getDocument} will return * null.

* * @return the transformation result as a (possibly empty) list of * JDOM nodes (Elements, Texts, Comments, PIs...). */ public List getResult() { List nodes = Collections.EMPTY_LIST; // Retrieve result from the document builder if not set. this.retrieveResult(); if (result instanceof List) { nodes = (List)result; } else { if ((result instanceof Document) && (queried == false)) { List content = ((Document)result).getContent(); nodes = new ArrayList(content.size()); while (content.size() != 0) { Object o = content.remove(0); nodes.add(o); } result = nodes; } } queried = true; return (nodes); } /** * Sets the document produced as result of an XSL Transformation. *

* Note: This method shall be used by the * {@link javax.xml.transform.Transformer} implementations that * natively support JDOM to directly set the transformation * result rather than considering this object as a * {@link SAXResult}. Applications should not use this * method.

* * @param document the JDOM document result of a transformation. * * @see #setResult * @see #getDocument */ public void setDocument(Document document) { this.result = document; this.queried = false; } /** * Returns the result of an XSL Transformation as a JDOM document. *

* If the result of the transformation is a list of nodes, * this method attempts to convert it into a JDOM document. If * successful, any subsequent call to {@link #getResult} will * return an empty list.

*

* Warning: The XSLT 1.0 specification states that * the output of an XSL transformation is not a well-formed XML * document but a list of nodes. Applications should thus use * {@link #getResult} instead of this method or at least expect * null documents to be returned. * * @return the transformation result as a JDOM document or * null if the result of the transformation * can not be converted into a well-formed document. * * @see #getResult */ public Document getDocument() { Document doc = null; // Retrieve result from the document builder if not set. this.retrieveResult(); if (result instanceof Document) { doc = (Document)result; } else { if ((result instanceof List) && (queried == false)) { // Try to create a document from the result nodes try { JDOMFactory f = this.getFactory(); if (f == null) { f = new DefaultJDOMFactory(); } doc = f.document(null); doc.setContent((List)result); result = doc; } catch (RuntimeException ex1) { // Some of the result nodes are not valid children of a // Document node. => return null. } } } queried = true; return (doc); } /** * Sets a custom JDOMFactory to use when building the * transformation result. Use a custom factory to build the tree * with your own subclasses of the JDOM classes. * * @param factory the custom JDOMFactory to use or * null to use the default JDOM * classes. * * @see #getFactory */ public void setFactory(JDOMFactory factory) { this.factory = factory; } /** * Returns the custom JDOMFactory used to build the transformation * result. * * @return the custom JDOMFactory used to build the * transformation result or null if the * default JDOM classes are being used. * * @see #setFactory */ public JDOMFactory getFactory() { return this.factory; } /** * Checks whether a transformation result has been set and, if not, * retrieves the result tree being built by the document builder. */ private void retrieveResult() { if (result == null) { this.setResult(((DocumentBuilder)this.getHandler()).getResult()); } } //------------------------------------------------------------------------- // SAXResult overwritten methods //------------------------------------------------------------------------- /** * Sets the target to be a SAX2 ContentHandler. * * @param handler Must be a non-null ContentHandler reference. */ public void setHandler(ContentHandler handler) { } /** * Sets the SAX2 LexicalHandler for the output. *

* This is needed to handle XML comments and the like. If the * lexical handler is not set, an attempt should be made by the * transformer to cast the ContentHandler to a LexicalHandler.

* * @param handler A non-null LexicalHandler for * handling lexical parse events. */ public void setLexicalHandler(LexicalHandler handler) { } //========================================================================= // FragmentHandler nested class //========================================================================= private static class FragmentHandler extends SAXHandler { /** * A dummy root element required by SAXHandler that can only * cope with well-formed documents. */ private Element dummyRoot = new Element("root", null, null); /** * Public constructor. */ public FragmentHandler(JDOMFactory factory) { super(factory); // Add a dummy root element to the being-built document as XSL // transformation can output node lists instead of well-formed // documents. this.pushElement(dummyRoot); } /** * Returns the result of an XSL Transformation. * * @return the transformation result as a (possibly empty) list of * JDOM nodes (Elements, Texts, Comments, PIs...). */ public List getResult() { // Flush remaining text content in case the last text segment is // outside an element. try { this.flushCharacters(); } catch (SAXException e) { /* Ignore... */ } return this.getDetachedContent(dummyRoot); } /** * Returns the content of a JDOM Element detached from it. * * @param elt the element to get the content from. * * @return a (possibly empty) list of JDOM nodes, detached from * their parent. */ private List getDetachedContent(Element elt) { List content = elt.getContent(); List nodes = new ArrayList(content.size()); while (content.size() != 0) { Object o = content.remove(0); nodes.add(o); } return (nodes); } } //========================================================================= // DocumentBuilder inner class //========================================================================= private class DocumentBuilder extends XMLFilterImpl implements LexicalHandler { /** * The actual JDOM document builder. */ private FragmentHandler saxHandler = null; /** * Whether the startDocument event was received. Some XSLT * processors such as Oracle's do not fire this event. */ private boolean startDocumentReceived = false; /** * Public default constructor. */ public DocumentBuilder() { } /** * Returns the result of an XSL Transformation. * * @return the transformation result as a (possibly empty) list of * JDOM nodes (Elements, Texts, Comments, PIs...) or * null if no new transformation occurred * since the result of the previous one was returned. */ public List getResult() { List result = null; if (this.saxHandler != null) { // Retrieve result from SAX content handler. result = this.saxHandler.getResult(); // Detach the (non-reusable) SAXHandler instance. this.saxHandler = null; // And get ready for the next transformation. this.startDocumentReceived = false; } return result; } private void ensureInitialization() throws SAXException { // Trigger document initialization if XSLT processor failed to // fire the startDocument event. if (this.startDocumentReceived == false) { this.startDocument(); } } //----------------------------------------------------------------------- // XMLFilterImpl overwritten methods //----------------------------------------------------------------------- /** * [SAX ContentHandler interface support] Processes a * start of document event. *

* This implementation creates a new JDOM document builder and * marks the current result as "under construction".

* * @throws SAXException if any error occurred while creating * the document builder. */ public void startDocument() throws SAXException { this.startDocumentReceived = true; // Reset any previously set result. setResult(null); // Create the actual JDOM document builder and register it as // ContentHandler on the superclass (XMLFilterImpl): this // implementation will take care of propagating the LexicalHandler // events. this.saxHandler = new FragmentHandler(getFactory()); super.setContentHandler(this.saxHandler); // And propagate event. super.startDocument(); } /** * [SAX ContentHandler interface support] Receives * notification of the beginning of an element. *

* This implementation ensures that startDocument() has been * called prior processing an element. * * @param nsURI the Namespace URI, or the empty string if * the element has no Namespace URI or if * Namespace processing is not being performed. * @param localName the local name (without prefix), or the * empty string if Namespace processing is * not being performed. * @param qName the qualified name (with prefix), or the * empty string if qualified names are not * available. * @param atts The attributes attached to the element. If * there are no attributes, it shall be an * empty Attributes object. * * @throws SAXException if any error occurred while creating * the document builder. */ public void startElement(String nsURI, String localName, String qName, Attributes atts) throws SAXException { this.ensureInitialization(); super.startElement(nsURI, localName, qName, atts); } /** * [SAX ContentHandler interface support] Begins the * scope of a prefix-URI Namespace mapping. */ public void startPrefixMapping(String prefix, String uri) throws SAXException { this.ensureInitialization(); super.startPrefixMapping(prefix, uri); } /** * [SAX ContentHandler interface support] Receives * notification of character data. */ public void characters(char ch[], int start, int length) throws SAXException { this.ensureInitialization(); super.characters(ch, start, length); } /** * [SAX ContentHandler interface support] Receives * notification of ignorable whitespace in element content. */ public void ignorableWhitespace(char ch[], int start, int length) throws SAXException { this.ensureInitialization(); super.ignorableWhitespace(ch, start, length); } /** * [SAX ContentHandler interface support] Receives * notification of a processing instruction. */ public void processingInstruction(String target, String data) throws SAXException { this.ensureInitialization(); super.processingInstruction(target, data); } /** * [SAX ContentHandler interface support] Receives * notification of a skipped entity. */ public void skippedEntity(String name) throws SAXException { this.ensureInitialization(); super.skippedEntity(name); } //----------------------------------------------------------------------- // LexicalHandler interface support //----------------------------------------------------------------------- /** * [SAX LexicalHandler interface support] Reports the * start of DTD declarations, if any. * * @param name the document type name. * @param publicId the declared public identifier for the * external DTD subset, or null * if none was declared. * @param systemId the declared system identifier for the * external DTD subset, or null * if none was declared. * * @throws SAXException The application may raise an exception. */ public void startDTD(String name, String publicId, String systemId) throws SAXException { this.ensureInitialization(); this.saxHandler.startDTD(name, publicId, systemId); } /** * [SAX LexicalHandler interface support] Reports the end * of DTD declarations. * * @throws SAXException The application may raise an exception. */ public void endDTD() throws SAXException { this.saxHandler.endDTD(); } /** * [SAX LexicalHandler interface support] Reports the * beginning of some internal and external XML entities. * * @param name the name of the entity. If it is a parameter * entity, the name will begin with '%', and if it * is the external DTD subset, it will be "[dtd]". * * @throws SAXException The application may raise an exception. */ public void startEntity(String name) throws SAXException { this.ensureInitialization(); this.saxHandler.startEntity(name); } /** * [SAX LexicalHandler interface support] Reports the end * of an entity. * * @param name the name of the entity that is ending. * * @throws SAXException The application may raise an exception. */ public void endEntity(String name) throws SAXException { this.saxHandler.endEntity(name); } /** * [SAX LexicalHandler interface support] Reports the * start of a CDATA section. * * @throws SAXException The application may raise an exception. */ public void startCDATA() throws SAXException { this.ensureInitialization(); this.saxHandler.startCDATA(); } /** * [SAX LexicalHandler interface support] Reports the end * of a CDATA section. * * @throws SAXException The application may raise an exception. */ public void endCDATA() throws SAXException { this.saxHandler.endCDATA(); } /** * [SAX LexicalHandler interface support] Reports an XML * comment anywhere in the document. * * @param ch an array holding the characters in the comment. * @param start the starting position in the array. * @param length the number of characters to use from the array. * * @throws SAXException The application may raise an exception. */ public void comment(char ch[], int start, int length) throws SAXException { this.ensureInitialization(); this.saxHandler.comment(ch, start, length); } } } extensions/xml/jdom-1.0/src/org/jdom/transform/JDOMSource.java000066400000000000000000000373711335566474600244370ustar00rootroot00000000000000/*-- $Id: JDOMSource.java,v 1.1.1.1 2005/12/02 14:16:51 fbusquets Exp $ Copyright (C) 2001-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.transform; import java.io.*; import java.util.*; import javax.xml.transform.sax.*; import org.jdom.*; import org.jdom.output.*; import org.xml.sax.*; /** * A holder for an XML Transformation source: a Document, Element, or list of * nodes. *

* The is provides input to a * {@link javax.xml.transform.Transformer JAXP TrAX Transformer}. *

* The following example shows how to apply an XSL Transformation * to a JDOM document and get the transformation result in the form * of a list of JDOM nodes: *


 *   public static List transform(Document doc, String stylesheet)
 *                                        throws JDOMException {
 *     try {
 *       Transformer transformer = TransformerFactory.newInstance()
 *                             .newTransformer(new StreamSource(stylesheet));
 *       JDOMSource in = new JDOMSource(doc);
 *       JDOMResult out = new JDOMResult();
 *       transformer.transform(in, out);
 *       return out.getResult();
 *     }
 *     catch (TransformerException e) {
 *       throw new JDOMException("XSLT Transformation failed", e);
 *     }
 *   }
 * 
* * @see org.jdom.transform.JDOMResult * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:51 $ * @author Laurent Bihanic * @author Jason Hunter */ public class JDOMSource extends SAXSource { private static final String CVS_ID = "@(#) $RCSfile: JDOMSource.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:51 $ $Name: $"; /** * If {@link javax.xml.transform.TransformerFactory#getFeature} * returns true when passed this value as an * argument, the Transformer natively supports JDOM. *

* Note: This implementation does not override * the {@link SAXSource#FEATURE} value defined by its superclass * to be considered as a SAXSource by Transformer implementations * not natively supporting JDOM. *

*/ public final static String JDOM_FEATURE = "http://org.jdom.transform.JDOMSource/feature"; /** * The XMLReader object associated to this source or * null if no XMLReader has yet been requested. * * @see #getXMLReader */ private XMLReader xmlReader = null; /** * Creates a JDOM TrAX source wrapping a JDOM document. * * @param source the JDOM document to use as source for the * transformations * * @throws IllegalArgumentException if source is * null. */ public JDOMSource(Document source) { setDocument(source); } /** * Creates a JDOM TrAX source wrapping a list of JDOM nodes. * * @param source the JDOM nodes to use as source for the * transformations * * @throws IllegalArgumentException if source is * null. */ public JDOMSource(List source) { setNodes(source); } /** * Creates a JDOM TrAX source wrapping a JDOM element. * * @param source the JDOM element to use as source for the * transformations * * @throws IllegalArgumentException if source is * null. */ public JDOMSource(Element source) { List nodes = new ArrayList(); nodes.add(source); setNodes(nodes); } /** * Sets the source document used by this TrAX source. * * @param source the JDOM document to use as source for the * transformations * * @throws IllegalArgumentException if source is * null. * * @see #getDocument */ public void setDocument(Document source) { super.setInputSource(new JDOMInputSource(source)); } /** * Returns the source document used by this TrAX source. * * @return the source document used by this TrAX source or * null if the source is a node list. * * @see #setDocument */ public Document getDocument() { Object src = ((JDOMInputSource)getInputSource()).getSource(); Document doc = null; if (src instanceof Document) { doc = (Document)src; } return doc; } /** * Sets the source node list used by this TrAX source. * * @param source the JDOM nodes to use as source for the * transformations * * @throws IllegalArgumentException if source is * null. * * @see #getNodes */ public void setNodes(List source) { super.setInputSource(new JDOMInputSource(source)); } /** * Returns the source node list used by this TrAX source. * * @return the source node list used by this TrAX source or * null if the source is a JDOM document. * * @see #setDocument */ public List getNodes() { Object src = ((JDOMInputSource)getInputSource()).getSource(); List nodes = null; if (src instanceof List) { nodes = (List)src; } return nodes; } //------------------------------------------------------------------------- // SAXSource overwritten methods //------------------------------------------------------------------------- /** * Sets the SAX InputSource to be used for the Source. *

* As this implementation only supports JDOM document as data * source, this method always throws an * {@link UnsupportedOperationException}. *

* * @param inputSource a valid InputSource reference. * * @throws UnsupportedOperationException always! */ public void setInputSource(InputSource inputSource) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } /** * Set the XMLReader to be used for the Source. *

* As this implementation only supports JDOM document as data * source, this method throws an * {@link UnsupportedOperationException} if the provided reader * object does not implement the SAX {@link XMLFilter} * interface. Otherwise, the JDOM document reader will be * attached as parent of the filter chain.

* * @param reader a valid XMLReader or XMLFilter reference. * * @throws UnsupportedOperationException if reader * is not a SAX * {@link XMLFilter}. * @see #getXMLReader */ public void setXMLReader(XMLReader reader) throws UnsupportedOperationException { if (reader instanceof XMLFilter) { // Connect the filter chain to a document reader. XMLFilter filter = (XMLFilter)reader; while (filter.getParent() instanceof XMLFilter) { filter = (XMLFilter)(filter.getParent()); } filter.setParent(new DocumentReader()); // Read XML data from filter chain. this.xmlReader = reader; } else { throw new UnsupportedOperationException(); } } /** * Returns the XMLReader to be used for the Source. *

* This implementation returns a specific XMLReader reading * the XML data from the source JDOM document. *

* * @return an XMLReader reading the XML data from the source * JDOM document. */ public XMLReader getXMLReader() { if (this.xmlReader == null) { this.xmlReader = new DocumentReader(); } return this.xmlReader; } //========================================================================= // JDOMInputSource nested class //========================================================================= /** * A subclass of the SAX InputSource interface that wraps a JDOM * Document. *

* This class is nested in JDOMSource as it is not intented to * be used independently of its friend: DocumentReader. *

* * @see org.jdom.Document */ private static class JDOMInputSource extends InputSource { /** * The source as a JDOM document or a list of JDOM nodes. */ private Object source = null; /** * Builds a InputSource wrapping the specified JDOM Document. * * @param document the source document. */ public JDOMInputSource(Document document) { this.source = document; } /** * Builds a InputSource wrapping a list of JDOM nodes. * * @param nodes the source JDOM nodes. */ public JDOMInputSource(List nodes) { this.source = nodes; } /** * Returns the source. * * @return the source as a JDOM document or a list of JDOM nodes. */ public Object getSource() { return source; } //------------------------------------------------------------------------- // InputSource overwritten methods //------------------------------------------------------------------------- /** * Sets the character stream for this input source. *

* This implementation always throws an * {@link UnsupportedOperationException} as the only source * stream supported is the source JDOM document. *

* * @param characterStream a character stream containing * an XML document. * * @throws UnsupportedOperationException always! */ public void setCharacterStream(Reader characterStream) throws UnsupportedOperationException { throw new UnsupportedOperationException(); } /** * Gets the character stream for this input source. *

* Note that this method is only provided to make this * InputSource implementation acceptable by any XML * parser. As it generates an in-memory string representation * of the JDOM document, it is quite inefficient from both * speed and memory consumption points of view. *

* * @return a Reader to a string representation of the * source JDOM document. */ public Reader getCharacterStream() { Object src = this.getSource(); Reader reader = null; if (src instanceof Document) { // Get an in-memory string representation of the document // and return a reader on it. reader = new StringReader( new XMLOutputter().outputString((Document)src)); } else { if (src instanceof List) { reader = new StringReader( new XMLOutputter().outputString((List)src)); } // Else: No source, no reader! } return reader; } } //========================================================================= // DocumentReader nested class //========================================================================= /** * An implementation of the SAX2 XMLReader interface that presents * a SAX view of a JDOM Document. The actual generation of the * SAX events is delegated to JDOM's SAXOutputter. * * @see org.jdom.Document * @see org.jdom.output.SAXOutputter */ private static class DocumentReader extends SAXOutputter implements XMLReader { /** * Public default constructor. */ public DocumentReader() { super(); } //---------------------------------------------------------------------- // SAX XMLReader interface support //---------------------------------------------------------------------- /** * Parses an XML document from a system identifier (URI). *

* This implementation does not support reading XML data from * system identifiers, only from JDOM documents. Hence, * this method always throws a {@link SAXNotSupportedException}. *

* * @param systemId the system identifier (URI). * * @throws SAXNotSupportedException always! */ public void parse(String systemId) throws SAXNotSupportedException { throw new SAXNotSupportedException( "Only JDOM Documents are supported as input"); } /** * Parses an XML document. *

* The methods accepts only JDOMInputSources * instances as input sources. *

* * @param input the input source for the top-level of the * XML document. * * @throws SAXException any SAX exception, * possibly wrapping * another exception. * @throws SAXNotSupportedException if the input source does * not wrap a JDOM document. */ public void parse(InputSource input) throws SAXException { if (input instanceof JDOMInputSource) { try { Object source = ((JDOMInputSource)input).getSource(); if (source instanceof Document) { this.output((Document)source); } else { this.output((List)source); } } catch (JDOMException e) { throw new SAXException(e.getMessage(), e); } } else { throw new SAXNotSupportedException( "Only JDOM Documents are supported as input"); } } } } extensions/xml/jdom-1.0/src/org/jdom/transform/XSLTransformException.java000066400000000000000000000062761335566474600267460ustar00rootroot00000000000000/*-- $Id: XSLTransformException.java,v 1.1.1.1 2005/12/02 14:16:50 fbusquets Exp $ Copyright (C) 2003-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.transform; import org.jdom.JDOMException; /** * Thrown when an XSL stylesheet fails to compile or an XSL transform fails * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:50 $ * @author Jason Hunter */ public class XSLTransformException extends JDOMException { private static final String CVS_ID = "@(#) $RCSfile: XSLTransformException.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:50 $ $Name: $"; public XSLTransformException() { } public XSLTransformException(String message) { super(message); } public XSLTransformException(String message, Exception cause) { super(message, cause); } } extensions/xml/jdom-1.0/src/org/jdom/transform/XSLTransformer.java000066400000000000000000000232361335566474600254110ustar00rootroot00000000000000/*-- $Id: XSLTransformer.java,v 1.1.1.1 2005/12/02 14:16:51 fbusquets Exp $ Copyright (C) 2001-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.transform; import java.util.*; import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.StreamSource; import org.jdom.*; /** * A convenience class to handle simple transformations. The JAXP TrAX classes * have more bells and whistles and can be used with {@link JDOMSource} and * {@link JDOMResult} for advanced uses. This class handles the common case and * presents a simple interface. XSLTransformer is thread safe and may be * used from multiple threads. * *

 * XSLTransformer transformer = new XSLTransformer("file.xsl");
 *
 * Document x2 = transformer.transform(x);  // x is a Document
 * Document y2 = transformer.transform(y);  // y is a Document
 * 
* * JDOM relies on TrAX to perform the transformation. * The javax.xml.transform.TransformerFactory Java system property * determines which XSLT engine TrAX uses. Its value should be * the fully qualified name of the implementation of the abstract * javax.xml.transform.TransformerFactory class. * Values of this property for popular XSLT processors include: *

*
  • Saxon 6.x: com.icl.saxon.TransformerFactoryImpl
  • *
  • Saxon 7.x: net.sf.saxon.TransformerFactoryImpl
  • *
  • Xalan: org.apache.xalan.processor.TransformerFactoryImpl
  • *
  • jd.xslt: jd.xml.xslt.trax.TransformerFactoryImpl
  • *
  • Oracle: oracle.xml.jaxp.JXSAXTransformerFactory
  • *
*

* This property can be set in all the usual ways a Java system property * can be set. TrAX picks from them in this order:

*
    *
  1. Invoking System.setProperty( "javax.xml.transform.TransformerFactory", * "classname")
  2. *
  3. The value specified at the command line using the * -Djavax.xml.transform.TransformerFactory=classname * option to the java interpreter
  4. *
  5. The class named in the lib/jaxp.properties properties file * in the JRE directory, in a line like this one: *
    javax.xml.parsers.DocumentBuilderFactory=classname
  6. *
  7. The class named in the * META-INF/services/javax.xml.transform.TransformerFactory file * in the JAR archives available to the runtime
  8. *
  9. Finally, if all of the above options fail, * a default implementation is chosen. In Sun's JDK 1.4, this is * Xalan 2.2d10.
  10. *
* @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:51 $ * @author Jason Hunter * @author Elliotte Rusty Harold */ public class XSLTransformer { private static final String CVS_ID = "@(#) $RCSfile: XSLTransformer.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:51 $ $Name: $"; private Templates templates; // Internal constructor to support the other constructors private XSLTransformer(Source stylesheet) throws XSLTransformException { try { templates = TransformerFactory.newInstance() .newTemplates(stylesheet); } catch (TransformerException e) { throw new XSLTransformException("Could not construct XSLTransformer", e); } } /** * Creates a transformer for a given stylesheet system id. * * @param stylesheetSystemId source stylesheet as a Source object * @throws XSLTransformException if there's a problem in the TrAX back-end */ public XSLTransformer(String stylesheetSystemId) throws XSLTransformException { this(new StreamSource(stylesheetSystemId)); } /** *

* This will create a new XSLTransformer by * reading the stylesheet from the specified * InputStream. *

* * @param stylesheet InputStream from which the stylesheet is read. * @throws XSLTransformException when an IOException, format error, or * something else prevents the stylesheet from being compiled */ public XSLTransformer(InputStream stylesheet) throws XSLTransformException { this(new StreamSource(stylesheet)); } /** *

* This will create a new XSLTransformer by * reading the stylesheet from the specified * Reader. *

* * @param stylesheet Reader from which the stylesheet is read. * @throws XSLTransformException when an IOException, format error, or * something else prevents the stylesheet from being compiled */ public XSLTransformer(Reader stylesheet) throws XSLTransformException { this(new StreamSource(stylesheet)); } /** *

* This will create a new XSLTransformer by * reading the stylesheet from the specified * File. *

* * @param stylesheet File from which the stylesheet is read. * @throws XSLTransformException when an IOException, format error, or * something else prevents the stylesheet from being compiled */ public XSLTransformer(File stylesheet) throws XSLTransformException { this(new StreamSource(stylesheet)); } /** *

* This will create a new XSLTransformer by * reading the stylesheet from the specified * Document. *

* * @param stylesheet Document containing the stylesheet. * @throws XSLTransformException when the supplied Document * is not syntactically correct XSLT */ public XSLTransformer(Document stylesheet) throws XSLTransformException { this(new JDOMSource(stylesheet)); } /** * Transforms the given input nodes to a list of output nodes. * * @param inputNodes input nodes * @return transformed output nodes * @throws XSLTransformException if there's a problem in the transformation */ public List transform(List inputNodes) throws XSLTransformException { JDOMSource source = new JDOMSource(inputNodes); JDOMResult result = new JDOMResult(); try { templates.newTransformer().transform(source, result); return result.getResult(); } catch (TransformerException e) { throw new XSLTransformException("Could not perform transformation", e); } } /** * Transforms the given document to an output document. * * @param inputDoc input document * @return transformed output document * @throws XSLTransformException if there's a problem in the transformation */ public Document transform(Document inputDoc) throws XSLTransformException { JDOMSource source = new JDOMSource(inputDoc); JDOMResult result = new JDOMResult(); try { templates.newTransformer().transform(source, result); return result.getDocument(); } catch (TransformerException e) { throw new XSLTransformException("Could not perform transformation", e); } } } extensions/xml/jdom-1.0/src/org/jdom/xpath/000077500000000000000000000000001335566474600207605ustar00rootroot00000000000000extensions/xml/jdom-1.0/src/org/jdom/xpath/JaxenXPath.java000066400000000000000000000275551335566474600236530ustar00rootroot00000000000000/*-- $Id: JaxenXPath.java,v 1.1.1.1 2005/12/02 14:16:53 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.xpath; import java.util.*; import org.jaxen.*; import org.jaxen.jdom.*; import org.jdom.*; /** * A non-public concrete XPath implementation for Jaxen. * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:53 $ * @author Laurent Bihanic */ class JaxenXPath extends XPath { // package protected private static final String CVS_ID = "@(#) $RCSfile: JaxenXPath.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:53 $ $Name: $"; /** * The compiled XPath object to select nodes. This attribute can * not be made final as it needs to be set upon object * deserialization. */ private transient JDOMXPath xPath; /** * The current context for XPath expression evaluation. */ private Object currentContext; /** * Creates a new XPath wrapper object, compiling the specified * XPath expression. * * @param expr the XPath expression to wrap. * * @throws JDOMException if the XPath expression is invalid. */ public JaxenXPath(String expr) throws JDOMException { setXPath(expr); } /** * Evaluates the wrapped XPath expression and returns the list * of selected items. * * @param context the node to use as context for evaluating * the XPath expression. * * @return the list of selected items, which may be of types: {@link Element}, * {@link Attribute}, {@link Text}, {@link CDATA}, * {@link Comment}, {@link ProcessingInstruction}, Boolean, * Double, or String. * * @throws JDOMException if the evaluation of the XPath * expression on the specified context * failed. */ public List selectNodes(Object context) throws JDOMException { try { currentContext = context; return xPath.selectNodes(context); } catch (JaxenException ex1) { throw new JDOMException("XPath error while evaluating \"" + xPath.toString() + "\": " + ex1.getMessage(), ex1); } finally { currentContext = null; } } /** * Evaluates the wrapped XPath expression and returns the first * entry in the list of selected nodes (or atomics). * * @param context the node to use as context for evaluating * the XPath expression. * * @return the first selected item, which may be of types: {@link Element}, * {@link Attribute}, {@link Text}, {@link CDATA}, * {@link Comment}, {@link ProcessingInstruction}, Boolean, * Double, String, or null if no item was selected. * * @throws JDOMException if the evaluation of the XPath * expression on the specified context * failed. */ public Object selectSingleNode(Object context) throws JDOMException { try { currentContext = context; return xPath.selectSingleNode(context); } catch (JaxenException ex1) { throw new JDOMException("XPath error while evaluating \"" + xPath.toString() + "\": " + ex1.getMessage(), ex1); } finally { currentContext = null; } } /** * Returns the string value of the first node selected by applying * the wrapped XPath expression to the given context. * * @param context the element to use as context for evaluating * the XPath expression. * * @return the string value of the first node selected by applying * the wrapped XPath expression to the given context. * * @throws JDOMException if the XPath expression is invalid or * its evaluation on the specified context * failed. */ public String valueOf(Object context) throws JDOMException { try { currentContext = context; return xPath.stringValueOf(context); } catch (JaxenException ex1) { throw new JDOMException("XPath error while evaluating \"" + xPath.toString() + "\": " + ex1.getMessage(), ex1); } finally { currentContext = null; } } /** * Returns the number value of the first item selected by applying * the wrapped XPath expression to the given context. * * @param context the element to use as context for evaluating * the XPath expression. * * @return the number value of the first item selected by applying * the wrapped XPath expression to the given context, * null if no node was selected or the * special value {@link java.lang.Double#NaN} * (Not-a-Number) if the selected value can not be * converted into a number value. * * @throws JDOMException if the XPath expression is invalid or * its evaluation on the specified context * failed. */ public Number numberValueOf(Object context) throws JDOMException { try { currentContext = context; return xPath.numberValueOf(context); } catch (JaxenException ex1) { throw new JDOMException("XPath error while evaluating \"" + xPath.toString() + "\": " + ex1.getMessage(), ex1); } finally { currentContext = null; } } /** * Defines an XPath variable and sets its value. * * @param name the variable name. * @param value the variable value. * * @throws IllegalArgumentException if name is not * a valid XPath variable name * or if the value type is not * supported by the underlying * implementation */ public void setVariable(String name, Object value) throws IllegalArgumentException { Object o = xPath.getVariableContext(); if (o instanceof SimpleVariableContext) { ((SimpleVariableContext)o).setVariableValue(null, name, value); } } /** * Adds a namespace definition to the list of namespaces known of * this XPath expression. *

* Note: In XPath, there is no such thing as a * 'default namespace'. The empty prefix always resolves * to the empty namespace URI.

* * @param namespace the namespace. */ public void addNamespace(Namespace namespace) { try { xPath.addNamespace(namespace.getPrefix(), namespace.getURI()); } catch (JaxenException ex1) { /* Can't happen here. */ } } /** * Returns the wrapped XPath expression as a string. * * @return the wrapped XPath expression as a string. */ public String getXPath() { return (xPath.toString()); } /** * Compiles and sets the XPath expression wrapped by this object. * * @param expr the XPath expression to wrap. * * @throws JDOMException if the XPath expression is invalid. */ private void setXPath(String expr) throws JDOMException { try { xPath = new JDOMXPath(expr); xPath.setNamespaceContext(new NSContext()); } catch (Exception ex1) { throw new JDOMException( "Invalid XPath expression: \"" + expr + "\"", ex1); } } public String toString() { return (xPath.toString()); } public boolean equals(Object o) { if (o instanceof JaxenXPath) { JaxenXPath x = (JaxenXPath)o; return (super.equals(o) && xPath.toString().equals(x.xPath.toString())); } return false; } public int hashCode() { return xPath.hashCode(); } private class NSContext extends SimpleNamespaceContext { public NSContext() { super(); } /** * [Jaxen NamespaceContext interface support] Translates * the provided namespace prefix into the matching bound * namespace URI. * * @param prefix the namespace prefix to resolve. * * @return the namespace URI matching the prefix. */ public String translateNamespacePrefixToUri(String prefix) { if ((prefix == null) || (prefix.length() == 0)) { return null; } String uri = super.translateNamespacePrefixToUri(prefix); if (uri == null) { Object ctx = currentContext; if (ctx != null) { Element elt = null; // Get closer element node if (ctx instanceof Element) { elt = (Element)ctx; } else if (ctx instanceof Attribute) { elt = ((Attribute)ctx).getParent(); } else if (ctx instanceof Content) { elt = ((Content) ctx).getParentElement(); } else if (ctx instanceof Document) { elt = ((Document)ctx).getRootElement(); } if (elt != null) { Namespace ns = elt.getNamespace(prefix); if (ns != null) { uri = ns.getURI(); } } } } return uri; } } } extensions/xml/jdom-1.0/src/org/jdom/xpath/XPath.java000066400000000000000000000413661335566474600226610ustar00rootroot00000000000000/*-- $Id: XPath.java,v 1.1.1.1 2005/12/02 14:16:53 fbusquets Exp $ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact . 4. Products derived from this software may not be called "JDOM", nor may "JDOM" appear in their name, without prior written permission from the JDOM Project Management . In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: "This product includes software developed by the JDOM Project (http://www.jdom.org/)." Alternatively, the acknowledgment may be graphical using the logos available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the JDOM Project and was originally created by Jason Hunter and Brett McLaughlin . For more information on the JDOM Project, please see . */ package org.jdom.xpath; import java.io.*; import java.lang.reflect.*; import java.util.*; import org.jdom.*; /** * A utility class for performing XPath calls on JDOM nodes, with a factory * interface for obtaining a first XPath instance. Users operate against this * class while XPath vendors can plug-in implementations underneath. Users * can choose an implementation using either {@link #setXPathClass} or * the system property "org.jdom.xpath.class". * * @version $Revision: 1.1.1.1 $, $Date: 2005/12/02 14:16:53 $ * @author Laurent Bihanic */ public abstract class XPath implements Serializable { private static final String CVS_ID = "@(#) $RCSfile: XPath.java,v $ $Revision: 1.1.1.1 $ $Date: 2005/12/02 14:16:53 $ $Name: $"; /** * The name of the system property from which to retrieve the * name of the implementation class to use. *

* The property name is: * "org.jdom.xpath.class".

*/ private final static String XPATH_CLASS_PROPERTY = "org.jdom.xpath.class"; /** * The default implementation class to use if none was configured. */ private final static String DEFAULT_XPATH_CLASS = "org.jdom.xpath.JaxenXPath"; /** * The constructor to instanciate a new XPath concrete * implementation. * * @see #newInstance */ private static Constructor constructor = null; /** * Creates a new XPath wrapper object, compiling the specified * XPath expression. * * @param path the XPath expression to wrap. * * @throws JDOMException if the XPath expression is invalid. */ public static XPath newInstance(String path) throws JDOMException { try { if (constructor == null) { // First call => Determine implementation. String className; try { className = System.getProperty(XPATH_CLASS_PROPERTY, DEFAULT_XPATH_CLASS); } catch (SecurityException ex1) { // Access to system property denied. => Use default impl. className = DEFAULT_XPATH_CLASS; } setXPathClass(Class.forName(className)); } // Allocate and return new implementation instance. return (XPath)constructor.newInstance(new Object[] { path }); } catch (JDOMException ex1) { throw ex1; } catch (InvocationTargetException ex2) { // Constructor threw an error on invocation. Throwable t = ex2.getTargetException(); throw (t instanceof JDOMException)? (JDOMException)t: new JDOMException(t.toString(), t); } catch (Exception ex3) { // Any reflection error (probably due to a configuration mistake). throw new JDOMException(ex3.toString(), ex3); } } /** * Sets the concrete XPath subclass to use when allocating XPath * instances. * * @param aClass the concrete subclass of XPath. * * @throws IllegalArgumentException if aClass is * null. * @throws JDOMException if aClass is * not a concrete subclass * of XPath. */ public static void setXPathClass(Class aClass) throws JDOMException { if (aClass == null) { throw new IllegalArgumentException("aClass"); } try { if ((XPath.class.isAssignableFrom(aClass)) && (Modifier.isAbstract(aClass.getModifiers()) == false)) { // Concrete subclass of XPath => Get constructor constructor = aClass.getConstructor(new Class[] { String.class }); } else { throw new JDOMException(aClass.getName() + " is not a concrete JDOM XPath implementation"); } } catch (JDOMException ex1) { throw ex1; } catch (Exception ex2) { // Any reflection error (probably due to a configuration mistake). throw new JDOMException(ex2.toString(), ex2); } } /** * Evaluates the wrapped XPath expression and returns the list * of selected items. * * @param context the node to use as context for evaluating * the XPath expression. * * @return the list of selected items, which may be of types: {@link Element}, * {@link Attribute}, {@link Text}, {@link CDATA}, * {@link Comment}, {@link ProcessingInstruction}, Boolean, * Double, or String. * * @throws JDOMException if the evaluation of the XPath * expression on the specified context * failed. */ abstract public List selectNodes(Object context) throws JDOMException; /** * Evaluates the wrapped XPath expression and returns the first * entry in the list of selected nodes (or atomics). * * @param context the node to use as context for evaluating * the XPath expression. * * @return the first selected item, which may be of types: {@link Element}, * {@link Attribute}, {@link Text}, {@link CDATA}, * {@link Comment}, {@link ProcessingInstruction}, Boolean, * Double, String, or null if no item was selected. * * @throws JDOMException if the evaluation of the XPath * expression on the specified context * failed. */ abstract public Object selectSingleNode(Object context) throws JDOMException; /** * Returns the string value of the first node selected by applying * the wrapped XPath expression to the given context. * * @param context the element to use as context for evaluating * the XPath expression. * * @return the string value of the first node selected by applying * the wrapped XPath expression to the given context. * * @throws JDOMException if the XPath expression is invalid or * its evaluation on the specified context * failed. */ abstract public String valueOf(Object context) throws JDOMException; /** * Returns the number value of the first node selected by applying * the wrapped XPath expression to the given context. * * @param context the element to use as context for evaluating * the XPath expression. * * @return the number value of the first node selected by applying * the wrapped XPath expression to the given context, * null if no node was selected or the * special value {@link java.lang.Double#NaN} * (Not-a-Number) if the selected value can not be * converted into a number value. * * @throws JDOMException if the XPath expression is invalid or * its evaluation on the specified context * failed. */ abstract public Number numberValueOf(Object context) throws JDOMException; /** * Defines an XPath variable and sets its value. * * @param name the variable name. * @param value the variable value. * * @throws IllegalArgumentException if name is not * a valid XPath variable name * or if the value type is not * supported by the underlying * implementation */ abstract public void setVariable(String name, Object value); /** * Adds a namespace definition to the list of namespaces known of * this XPath expression. *

* Note: In XPath, there is no such thing as a * 'default namespace'. The empty prefix always resolves * to the empty namespace URI.

* * @param namespace the namespace. */ abstract public void addNamespace(Namespace namespace); /** * Adds a namespace definition (prefix and URI) to the list of * namespaces known of this XPath expression. *

* Note: In XPath, there is no such thing as a * 'default namespace'. The empty prefix always resolves * to the empty namespace URI.

* * @param prefix the namespace prefix. * @param uri the namespace URI. * * @throws IllegalNameException if the prefix or uri are null or * empty strings or if they contain * illegal characters. */ public void addNamespace(String prefix, String uri) { addNamespace(Namespace.getNamespace(prefix, uri)); } /** * Returns the wrapped XPath expression as a string. * * @return the wrapped XPath expression as a string. */ abstract public String getXPath(); /** * Evaluates an XPath expression and returns the list of selected * items. *

* Note: This method should not be used when the * same XPath expression needs to be applied several times (on the * same or different contexts) as it requires the expression to be * compiled before being evaluated. In such cases, * {@link #newInstance allocating} an XPath wrapper instance and * {@link #selectNodes(java.lang.Object) evaluating} it several * times is way more efficient. *

* * @param context the node to use as context for evaluating * the XPath expression. * @param path the XPath expression to evaluate. * * @return the list of selected items, which may be of types: {@link Element}, * {@link Attribute}, {@link Text}, {@link CDATA}, * {@link Comment}, {@link ProcessingInstruction}, Boolean, * Double, or String. * * @throws JDOMException if the XPath expression is invalid or * its evaluation on the specified context * failed. */ public static List selectNodes(Object context, String path) throws JDOMException { return newInstance(path).selectNodes(context); } /** * Evaluates the wrapped XPath expression and returns the first * entry in the list of selected nodes (or atomics). *

* Note: This method should not be used when the * same XPath expression needs to be applied several times (on the * same or different contexts) as it requires the expression to be * compiled before being evaluated. In such cases, * {@link #newInstance allocating} an XPath wrapper instance and * {@link #selectSingleNode(java.lang.Object) evaluating} it * several times is way more efficient. *

* * @param context the element to use as context for evaluating * the XPath expression. * @param path the XPath expression to evaluate. * * @return the first selected item, which may be of types: {@link Element}, * {@link Attribute}, {@link Text}, {@link CDATA}, * {@link Comment}, {@link ProcessingInstruction}, Boolean, * Double, String, or null if no item was selected. * * @throws JDOMException if the XPath expression is invalid or * its evaluation on the specified context * failed. */ public static Object selectSingleNode(Object context, String path) throws JDOMException { return newInstance(path).selectSingleNode(context); } //------------------------------------------------------------------------- // Serialization support //------------------------------------------------------------------------- /** * [Serialization support] Returns the alternative object * to write to the stream when serializing this object. This * method returns an instance of a dedicated nested class to * serialize XPath expressions independently of the concrete * implementation being used. *

* Note: Subclasses are not allowed to override * this method to ensure valid serialization of all * implementations.

* * @return an XPathString instance configured with the wrapped * XPath expression. * * @throws ObjectStreamException never. */ protected final Object writeReplace() throws ObjectStreamException { return new XPathString(this.getXPath()); } /** * The XPathString is dedicated to serialize instances of * XPath subclasses in a implementation-independent manner. *

* XPathString ensures that only string data are serialized. Upon * deserialization, XPathString relies on XPath factory method to * to create instances of the concrete XPath wrapper currently * configured.

*/ private final static class XPathString implements Serializable { /** * The XPath expression as a string. */ private String xPath = null; /** * Creates a new XPathString instance from the specified * XPath expression. * * @param xpath the XPath expression. */ public XPathString(String xpath) { super(); this.xPath = xpath; } /** * [Serialization support] Resolves the read XPathString * objects into XPath implementations. * * @return an instance of a concrete implementation of * XPath. * * @throws ObjectStreamException if no XPath could be built * from the read object. */ private Object readResolve() throws ObjectStreamException { try { return XPath.newInstance(this.xPath); } catch (JDOMException ex1) { throw new InvalidObjectException( "Can't create XPath object for expression \"" + this.xPath + "\": " + ex1.toString()); } } } } i18n/000077500000000000000000000000001335566474600116605ustar00rootroot00000000000000i18n/README000066400000000000000000000056501335566474600125460ustar00rootroot00000000000000JClic internationalization README INTRODUCTION JClic, as many Java apps, uses the Java Internationalization API [1] to display text expressions in different languages. This API uses files with extension ".properties" to store the messages. Due to its modular design, JClic makes use of 10 different ".properties" files, located in deep path levels on the "src" directory, like: "src/core/edu/xtec/resources/messages/JClicMessages.properties". This makes complicated to start a new translation and maintain it in successive releases. Launchpad Translations [2] (formerly known as Rosetta) is a web-base translation system integrated in the Launchpad free software development platform. It's very useful and easy to use for translators, because tracks all changes and allows to reuse expressions already translated in other projects. Launchpad Translations are based on the GNU gettext system [3]. This system makes use of files with extension ".po" to store messages. ".po" files have different format and coding conventions than ".properties". The utilities in this section allow to convert the original ".properties" files located in the src directory of JClic into ".po" files, in order to make possible the use of Lanunchpad Translations, and implement also the inverse path converting the ".po" files returned by Launchpad to ".properties". SYSTEM REQUIREMENTS - Apache Ant 1.6 or later - tar command available - po2prop and prop2po utilities from Translate toolkit (http://translate.sourceforge.net/wiki/toolkit/index) PREPARING THE APACHE ANT EXTENSIONS Start compiling the Ant extensions located in i18n/customAntTasks. Go to this directory and call "ant" without parameters. This will generate a file named "transToolsAntTasks.jar" Register this file as an Ant extension. See Apache Ant documentation for more information about how to achieve: http://ant.apache.org/manual/using.html#external-tasks PREPARING .po FILES FROM .properties Go to i18n/toLaunchpad and call "ant". This will generate the "po" directory with subdirectories for all JClic modules. The .po and.pot files will be placed into this directories. RECOVERING .po FILES FROM LAUNCHPAD Request the JClic translations in Launchpad. It will give you a file called "launchpad-export.tar,gz". Place this file into the directory i18n/fromLaunchpad, go to this directory and launch "ant". This will extract the returned ".po" files and, if they are different from the existing ones, they will be converted to .properties and copyied into the "src" directory. You can also place individual .po files into i18n/fromLaunchpad/po and call "ant" to complete the conversion process. Note that .po files returned from Launchpad can have different names than the expected by JClic. For example, jclicmessages-ca.po must be translated to JClicMessages_ca.po. 1: http://java.sun.com/javase/technologies/core/basic/intl/ 2: https://launchpad.net/rosetta 3: http://www.gnu.org/software/gettext/ i18n/customAntTasks/000077500000000000000000000000001335566474600146435ustar00rootroot00000000000000i18n/customAntTasks/build.xml000066400000000000000000000106021335566474600164630ustar00rootroot00000000000000 Copyright © ${year} Francesc Busquets (fbusquets@xtec.net) & Departament d'Educació de la Generalitat de Catalunya (info@xtec.net)
Licensed under the terms of the GNU General Public License

]]>
i18n/customAntTasks/src/000077500000000000000000000000001335566474600154325ustar00rootroot00000000000000i18n/customAntTasks/src/edu/000077500000000000000000000000001335566474600162075ustar00rootroot00000000000000i18n/customAntTasks/src/edu/xtec/000077500000000000000000000000001335566474600171525ustar00rootroot00000000000000i18n/customAntTasks/src/edu/xtec/ant/000077500000000000000000000000001335566474600177345ustar00rootroot00000000000000i18n/customAntTasks/src/edu/xtec/ant/Po2Prop.java000066400000000000000000000144561335566474600221120ustar00rootroot00000000000000/* * Po2Prop.java * */ package edu.xtec.ant; import org.apache.tools.ant.*; import org.apache.tools.ant.types.*; import org.apache.tools.ant.util.FileUtils; import java.io.File; import java.util.Vector; import org.apache.tools.ant.util.JavaEnvUtils; import org.apache.tools.ant.taskdefs.ExecTask; import java.util.Enumeration; import java.io.IOException; /** * @author fbusquet */ public class Po2Prop extends Task { // Original source code /** * The name of the po file. */ protected File inputFile; protected File checkAgainstFile; protected File checkAgainstDir; /** * The template file. */ protected File templateFile; protected File outputFile; protected File destDir; protected boolean verbose; protected boolean preserveTimestamps; /** * the filesets of the .po to convert */ protected Vector filesets = new Vector(); protected FileUtils fileUtils = FileUtils.newFileUtils(); /** * the .po file to convert; required */ public void setInputFile(final File inputFile) { this.inputFile = inputFile; } /** * set the preserveTimestamps value */ public void setPreserveTimestamps(boolean preserveTimestamps) { this.preserveTimestamps = preserveTimestamps; } /** * the .po file to check against; optional */ public void setCheckAgainstFile(final File checkAgainstFile) { this.checkAgainstFile = checkAgainstFile; } /** * the .directory containing .po files to check against */ public void setCheckAgainstDir(final File checkAgainstDir) { this.checkAgainstDir = checkAgainstDir; } /** * template location; required */ public void setTemplateFile(final File templateFile) { this.templateFile = templateFile; } /** * name of exported .properties file; optional */ public void setOutputFile(final File outputFile) { this.outputFile = outputFile; } /** * Sets the destination directory. * @param destDir the destination directory */ public void setDestDir(File destDir) { this.destDir = destDir; } /** * Adds a set of files to convert */ public void addFileset(final FileSet set) { filesets.addElement(set); } /** * Convert the files */ public void execute() throws BuildException { if (null == inputFile && null == filesets) { throw new BuildException("a .po file must be set through inputFile attribute " + "or nested filesets"); } if (null != inputFile) { doOneFile(inputFile, outputFile, checkAgainstFile); return; } else { //Assume null != filesets // deal with the filesets for (int i = 0; i < filesets.size(); i++) { FileSet fs = (FileSet) filesets.elementAt(i); DirectoryScanner ds = fs.getDirectoryScanner(getProject()); String[] inputFiles = ds.getIncludedFiles(); for (int j = 0; j < inputFiles.length; j++) { doOneFile(new File(fs.getDir(getProject()), inputFiles[j]), null, null); } } } } /** * convert one file */ private void doOneFile(File inputFile, File outputFile, File checkAgainstFile) throws BuildException { if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { throw new BuildException("The Po2Prop task is only available on " + "JDK versions 1.2 or greater"); } if(outputFile==null){ if(destDir==null){ destDir=inputFile.getParentFile(); } String justFName=inputFile.getName(); int lastDot=justFName.lastIndexOf('.'); if(lastDot>0) justFName=justFName.substring(0, lastDot); outputFile=new File(destDir, justFName+".properties"); } if(checkAgainstFile==null && checkAgainstDir!=null && inputFile!=null){ checkAgainstFile=new File(checkAgainstDir, inputFile.getName()); } if (isUpToDate(inputFile, outputFile, checkAgainstFile)) { return; } final ExecTask cmd = (ExecTask) getProject().createTask("exec"); cmd.setExecutable("po2prop"); if (null != templateFile) { cmd.createArg().setValue("--template="+templateFile.toString()); } if (null != inputFile) { cmd.createArg().setValue("--input="+inputFile.toString()); } if (null != outputFile) { cmd.createArg().setValue("--output="+outputFile.toString()); } log("Converting properties: " + inputFile.getAbsolutePath()); cmd.setFailonerror(true); cmd.setTaskName(getTaskName()); cmd.execute(); if(preserveTimestamps){ outputFile.setLastModified(inputFile.lastModified()); } } protected boolean isUpToDate(File inputFile, File outputFile, File checkAgainstFile) throws BuildException { if (null == inputFile) { return false; } if (null != outputFile) { if (!inputFile.exists()) { return false; } if (null!=checkAgainstFile && checkAgainstFile.exists()){ if(checkAgainstFile.lastModified() >= inputFile.lastModified()){ return true; } else{ try { if(fileUtils.contentEquals(inputFile, checkAgainstFile, true)) return true; } catch(Exception ex){ throw new BuildException(ex); } } } if (!outputFile.exists()) { return false; } if (inputFile.equals(outputFile)) { return false; } if (outputFile.lastModified() >= inputFile.lastModified()) { return true; } } return false; } } i18n/customAntTasks/src/edu/xtec/ant/Prop2Po.java000066400000000000000000000146331335566474600221070ustar00rootroot00000000000000/* * Prop2Po.java * */ package edu.xtec.ant; import org.apache.tools.ant.*; import org.apache.tools.ant.types.*; import org.apache.tools.ant.util.FileUtils; import java.io.File; import java.util.Vector; import org.apache.tools.ant.util.JavaEnvUtils; import org.apache.tools.ant.taskdefs.ExecTask; import java.util.Enumeration; import java.io.IOException; /** * @author fbusquet */ public class Prop2Po extends Task { // Original source code /** * The name of the properties file. */ protected File inputFile; /** * The .properties template file. */ protected File templateFile; protected File outputFile; protected File backupFile; protected File destDir; protected File backupDir; protected boolean verbose; protected boolean makePot; protected boolean preserveTimestamps; /** * the filesets of the .properties to convert */ protected Vector filesets = new Vector(); protected FileUtils fileUtils = FileUtils.newFileUtils(); /** * set the preserveTimestamps value */ public void setPreserveTimestamps(boolean preserveTimestamps) { this.preserveTimestamps = preserveTimestamps; } /** * the .properties file to convert; required */ public void setInputFile(final File inputFile) { this.inputFile = inputFile; } /** * template location; required */ public void setTemplateFile(final File templateFile) { this.templateFile = templateFile; } /** * name of exported PO file; optional */ public void setOutputFile(final File outputFile) { this.outputFile = outputFile; } /** * name of the backup file; optional */ public void setBackupFile(final File backupFile) { this.backupFile = backupFile; } /** * Sets the destination directory. * @param destDir the destination directory */ public void setDestDir(File destDir) { this.destDir = destDir; } /** * Sets the backup directory. * @param backupDir the backup directory */ public void setBackupDir(File backupDir) { this.backupDir = backupDir; } /** * export a POT template * ; optional: default false */ public void setMakePot(final boolean makePot) { this.makePot = makePot; } /** * Adds a set of files to convert */ public void addFileset(final FileSet set) { filesets.addElement(set); } // Completely rewrited /** * Convert the files */ public void execute() throws BuildException { if (null == inputFile && null == filesets) { throw new BuildException("a properties file must be set through inputFile attribute " + "or nested filesets"); } if (null != inputFile) { doOneFile(inputFile, outputFile, backupFile); return; } else { //Assume null != filesets // deal with the filesets for (int i = 0; i < filesets.size(); i++) { FileSet fs = (FileSet) filesets.elementAt(i); DirectoryScanner ds = fs.getDirectoryScanner(getProject()); String[] inputFiles = ds.getIncludedFiles(); for (int j = 0; j < inputFiles.length; j++) { doOneFile(new File(fs.getDir(getProject()), inputFiles[j]), null, null); } } } } /** * convert one file */ private void doOneFile(File inputFile, File outputFile, File backupFile) throws BuildException { if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { throw new BuildException("The Prop2Po task is only available on " + "JDK versions 1.2 or greater"); } if(outputFile==null){ if(destDir==null){ destDir=inputFile.getParentFile(); } String justFName=inputFile.getName(); int lastDot=justFName.lastIndexOf('.'); if(lastDot>0) justFName=justFName.substring(0, lastDot); String ext=makePot ? ".pot" : ".po"; outputFile=new File(destDir, justFName+ext); } if(backupFile==null && backupDir!=null){ backupFile=new File(backupDir, outputFile.getName()); if(backupFile.equals(outputFile)) backupFile=null; } if (isUpToDate(inputFile, outputFile)) { return; } final ExecTask cmd = (ExecTask) getProject().createTask("exec"); cmd.setExecutable("prop2po"); if (makePot) { cmd.createArg().setValue("-P"); } if (null != templateFile) { cmd.createArg().setValue("--template="+templateFile.toString()); } if (null != inputFile) { cmd.createArg().setValue(inputFile.toString()); } if (null != outputFile) { cmd.createArg().setValue(outputFile.toString()); } log("Converting properties: " + inputFile.getAbsolutePath()); cmd.setFailonerror(true); cmd.setTaskName(getTaskName()); cmd.execute(); if(preserveTimestamps){ outputFile.setLastModified(inputFile.lastModified()); } if(backupFile!=null) { log("Creating backup of "+outputFile.getName()+" in "+backupFile.getParent().toString()); try{ fileUtils.copyFile(outputFile, backupFile, null, true, true); } catch(Exception ex){ throw new BuildException(ex); } } } protected boolean isUpToDate(File inputFile, File outputFile) { if (null == inputFile) { return false; } if (null != outputFile) { if (!inputFile.exists()) { return false; } if (!outputFile.exists()) { return false; } if (inputFile.equals(outputFile)) { return false; } if (outputFile.lastModified() >= inputFile.lastModified()) { return true; } } return false; } } i18n/fromLaunchpad/000077500000000000000000000000001335566474600144435ustar00rootroot00000000000000i18n/fromLaunchpad/build.xml000066400000000000000000000330111335566474600162620ustar00rootroot00000000000000 i18n/fromLaunchpad/po/000077500000000000000000000000001335566474600150615ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-activities/000077500000000000000000000000001335566474600203075ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-activities/listactivities_ar.po000066400000000000000000000102721335566474600243730ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-03-26 09:11+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" i18n/fromLaunchpad/po/jclic-activities/listactivities_ast.po000066400000000000000000000165371335566474600245720ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-10-18 17:30+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Asociación complexa|Nesta triba de xera preséntense tamién dos conxuntos " "d'información, pero éstos puen tener un númberu estremáu d'elementos y ente " "ellos pueden dase delles tribes de rellación: Ún a ún, dellos a ún, " "elementos ensin asociar..." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Asociación simple|Preséntense dos conxuntos d'información que tienen el " "mesmu númberu d'elementos. A cada elementu del conxuntu imaxe correspuende " "namás qu'un elementu del conxuntu orixe." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Guetar pareyes|Cada una de las pieces que formen l' oxetu apaez anubrida dos " "vegaes dientro de la ventana de xuegu. En cada xugada destápense un par de " "pieces, que se'escuende otra vuelta si nun son idéntiques. L'oxetivu ya " "atopar toles pareyes." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Xera d'esploración|Amuésase una información d'aniciu y al facer clic nella " "apaez, pa cada elementu, una determinada pieza d'información." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Xera d'identificación|Preséntase namás qu'un conxuntu d'información y hai " "que calcar naquellos elementos que cumplan un condición determinada." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Pantalla d'información|Amuésase un conxuntu d'informacióny, opcionalmente, " "úfrese la posibilidá d'activar el conteníu multimedia arreyáu a cada " "elementu." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Puzzle doble|Amuésense dos paneles. Nún apaez la información desordenada y " "l'otru ta ermu. Hai que reconstruyir l'oxetu nel panel ermu arrastrando les " "pieces d'una nuna." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Puzzle d'intercambiu|Nun panel únicu mécese tola información. En cada xugada " "se intercambien les posiciones de dos pieces fasta ordenar l'oxetu." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Puzzle de furacu|Nun panel únicu faise desapaecer una pieza y mécense les " "demás. En cada xugada pue movese una de les pieces que llenden col furacu, " "fasta teneles toes nel orde orixinal." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Rempuesta escrita|Amuésase un conxuntu d'información y, pa caún de los " "elementos, hai qu'escribir el testu que correspuenda." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Testu: enllenar furacos|Nun testu escuéyense delles pallabres, lletres y/o " "frases que s'escuende o camuflen. La resolución de caún de los elementos " "escondíos pue plantegase de menes estremaes: escribiendo nun espaciu ermu, " "corrixiendo una espresión que contién errores o seleicionando nuna llista " "ente posibles rempuestes." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Testu: identificar elementos|L'usuariu tien de señalar calcando col mur " "determinaes pallabres, lletres, cifres, símbolos o signod de puntuación." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Testu: ordenar elementos|Nel intre de diseñar la xera seleiciónense nel " "testu delles pallabres o párrafos que se van mecer ente ellos. L'usuariu " "tien de volver a ponelo n'orde." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Testu: completar testu|Nun testu faense desapaecer dellos elementos " "(lletres, pallabres, signos de puntuación, frases) y l'usuariu tien de " "completalu." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Crucigrama|Hai que dir enllenando el panel de pallabres a partir de les " "definiciones. Les definiciones puen ser testuales, gráfiques o sonores. El " "programa amuesa automáticamente les definiciones de les dos pallabres que se " "crucen na posición onde s'atope'l cursor en cada momentu." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Sopa de lletres|Hai qu'atopar les pallabres escondíes nuna caxella de " "lletres. Les celdes neutres de la caxella (les que nun pertenecen a pallabra " "denguna) enllénense con carauteres seleicionaos al azar en cada xugada." i18n/fromLaunchpad/po/jclic-activities/listactivities_ca.po000066400000000000000000000163201335566474600243540ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-11 17:43+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Associació complexa|En aquest tipus d'activitat es presenten també dos " "conjunts d'informació, però aquests poden tenir un nombre diferent " "d'elements i entre ells es poden donar diversos tipus de relació, p. ex.: un a un, " "diversos a un, elements sense assignar..." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Associació simple|Es presenten dos conjunts d'informació que tenen el mateix " "nombre d'elements. A cada element del conjunt origen correspon un i només un " "element del conjunt imatge." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Joc de memòria|Cada una de les peces que formen l'objecte apareix amagat " "dues vegades dins de la finestra de joc. En cada tirada es destapen un " "parell de peces, que es tornen a amagar si no són idèntiques. L'objectiu és " "destapar totes les parelles." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Activitat d'exploracio|Es mostra una informació inicial i en fer clic damunt " "seu es mostra, per a cada element, una determinada peça d'informació." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Activitat d'identificació|Es presenta només un conjunt d'informació i cal " "fer clic damunt aquells elements que compleixin una determinada condició." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Pantalla d'informació|Es mostra un conjunt d'informació i, opcionalment, " "s'ofereix la possibilitat d'activar el contingut multimèdia que porti cada " "element." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Puzzle doble|Es mostren dos plafons. En un hi ha la informació desordenada i " "l'altre està buit. Cal reconstruir l'objecte en el plafó buit portant-hi les " "peces una per una." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Puzzle d'intercanvi|En un únic plafó es barreja la informació. En cada " "tirada es commuten les posicions de dues peces, fins a ordenar l'objecte." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Puzzle de forat|En un únic plafó es fa desaparèixer una peça i es barregen " "les restants. En cada tirada es pot desplaçar una de les peces veïnes al " "forat, fins a tenir-les totes en l'ordre original." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Resposta escrita|Es mostra un conjunt d'informació i, per a cadascun dels " "seus elements, cal escriure el text corresponent." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Text: Omplir forats|En un text se seleccionen determinades paraules, lletres " "i frases que s'amaguen o es camuflen i l'usuari ha de completar. La " "resolució de cadascun dels elements amagats es pot plantejar de maneres " "diferents: escrivint en un espai buit, corregint una expressió que conté " "errades o seleccionant en una llista de diverses respostes possibles." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Text: Identificar elements|L'usuari ha d'assenyalar amb un clic de ratolí " "determinades paraules, lletres, xifres, símbols o signes de puntuació." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Text: Ordenar elements|En el moment de dissenyar l'activitat se seleccionen " "en el text algunes paraules o paràgrafs que es barrejaran entre si. L'usuari " "ha de tornar a posar-ho en ordre." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Text: Completar text|En un text es fan desaparèixer determinades parts " "(lletres, paraules, signes de puntuació, frases) i l'usuari ha de completar-" "lo." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Mots encreuats|Cal anar omplint el tauler de paraules a partir de les seves " "definicions. Les definicions poden ser textuals, gràfiques o sonores. El " "programa mostra automàticament les definicions de les dues paraules que es " "creuen en la posició on es trobi el cursor en cada moment." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Sopa de lletres|Cal trobar les paraules amagades en una graella de lletres. " "Les caselles neutres de la graella (aquelles que no pertanyen a cap paraula) " "s'omplen amb caràcters seleccionats a l'atzar en cada jugada." i18n/fromLaunchpad/po/jclic-activities/listactivities_cs.po000066400000000000000000000160221335566474600243750ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-10-03 06:31+0000\n" "Last-Translator: Zbyněk Schwarz \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Komplexní asociace|V této aktivitě jsou dvě sady informací, které mohou mít " "rozdílný počet částí a rozdílné vztahy mezi nimi, např.: jeden-k-jedné, " "několik k jedné, části bez vztahu apod." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Jednoduchá asociace|V této aktivitě jsou dvě sady informací, které mají " "stejný počet částí. Každá část původní sady odpovídá jedné a pouze jedné " "části obrázkové sady." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Hledání párů|Pexeso. Každá z částí se objeví dvakrát, ale lícem dolů. V " "každém kole se obrátí dvě karty a otočí se lícem dolu, když nejsou stejné. " "Cílem je najít všechny páry." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Prozkoumat aktivity|Počáteční údaj je zobrazen, po kliknutí na něj bude daný " "údaj uveden u každé položky." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Identifikovat buňky|Existuje jen jeden soubor informací a musíte kliknout na " "ty části, které splňují určité podmínky." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Informační obrazovka|Jedna sada informací je zobrazena s možností aktivace " "multimediálního obsahu každé části informace." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "ždého z prvkůDvojitá skládačka|Jsou zobrazeny dvě mřížky. Jedna obsahuje " "zpřeházené informace a druhá je prázdná. Objekt musí být v prázdné mřížce " "sestaven přetažením jednotlivých kousků." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Výměna puzzlí| Tyto informace jsou prohozeny ve stejném panelu.V každém jsou " "dvě pozice prohozeny, než jsou objekty seřazeny." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Skládačka s dírou|Ve stejném panelu chybí jeden kousek a ostatní jsou " "zamíchány. V každém tahu je jeden kousek vedle prázdného místa posunut, " "dokud nejsou všechny zpátky v původním pořadí." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Písemná odpověď|Soubor informací je zobrazen a odpovídající text pro každou " "část musí být v písemné formě." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Text: Vyplnit mezery|Uživatel musí dokončit jistá slova, písmena a fráze, " "které byly v textu skryty či zamaskovány. Řešení každého z prvků může být " "nastaveno různě: zápisem do prázdného místa; opravou fráze, která obsahuje " "chybu; nebo výběrem ze seznamu různých možných odpovědí." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Text: Určit prvky|Uživatel musí kliknutím myši poukázat jistá slova, " "písmena, číslice, symboly, nebo interpunkční znaménka." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Text: Pořadí prvků|Při výběru navrhování této činnosti některé ze slov nebo " "odstavců textu jsou vybrané pro zamíchání dokola. Uživatel je má dát do " "pořádku." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Text: Doplnit text | Různé části textu (písmena, slova, interpunkční " "znaménka, nebo fráze) jsou vyřazeny a uživatel ho musí dokončit." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Křížovky|Tabulka slov musí být dokončena podle jejich definic. Definicí může " "být text, grafika nebo zvuk. Program automaticky zobrazí definice dvou slov, " "která se protínají v pozici kurzoru." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Hledání slov|Skrytá slova lze nalézt v mřížce písmen. Neutrální buňky v " "mřížce (ty bez slov) jsou doplněny náhodně vybranými znaky." i18n/fromLaunchpad/po/jclic-activities/listactivities_de.po000066400000000000000000000156641335566474600243730ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-03-04 17:19+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Mehrfache Zuordnung|Zwei Informationstafeln mit einer unterschiedlichen " "Anzahl von Elementen zwischen denen verschiedene Arten von Beziehungen " "bestehen. z.B: eins-zu-eins; mehrere zu eins; Elemente ohne Bezug usw." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Einfache Zuordnung|Zwei Informationstafeln die aus gleich vielen Elementen " "bestehen. Jedes Element auf Tafel 1 entspricht einem Bild auf Tafel 2" #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Paare finden|Jedes Element kommt 2 Mal vor. Bei jedem Spielgang müssen zwei " "verdeckte Spielkarten umgedreht und wieder zurückgelegt werden, wenn sie " "nicht zusammenpassen. Ziel ist, alle zusammengehörigen Paare zu finden." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Forschendes Lernen|Ein kleiner Teil der Information ist zu sehen, beim " "Anklicken jedes Elements wird ein weiteres Element angezeigt" #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Suchübung|Eine einzige Informationstafel. Die Übenden müssen die Teile davon " "anklicken, die eine bestimmte Bedingung erfüllen." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Darstellung von Information|Eine Informationstafel wird angezeigt. Zu jedem " "einzelnen Element können Multimediaelemente aktiviert werden." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Puzzle: Ordnen|Zwei Spielfelder werden angezeigt. Eines enthält vermischte " "Puzzlesteine, die andere ist leer. Das Bild soll auf dem leeren Spielfeld " "durch Ziehen der Steine mit der Maus richtig rekonstruiert werden." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Puzzle: Austauschen| Die Puzzlesteine innerhalb selben Spielfelds sind " "ertauscht. Man muss so lange jeweils zwei Steine gegenander austauschen, bis " "das Bild richtig erscheint." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Puzzle: Verschieben|Auf dem Spielfeld fehlt ein Stein, die anderen Steine " "sind vermischt. In jedem Spielgang muss einer der Steine neben dem Leerfeld " "verschoben werden, bis sich alle Steine wieder an der richtigen Stelle " "befinden." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Begriff eingeben|Ein Informationsblock wird angezeigt. Fehlende Textteile " "müssen schriftlich ergänzt werden." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Text: Lückentext|Der Spieler/die Spielerin muss in einem Text fehlende oder " "verborgene Wörter, Buchstaben und Sätze ergänzen. Es gibt verschiedene " "Lösungsmöglichkeiten: Fehlende Elemente eintragen, Fehler korrigieren oder " "Auswahl aus mehreren möglichen Antworten auf einer Liste." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Text: Wörter finden| Der Spieler/die Spielerin muss Wörter, Buchstaben, " "Zahlen, Symbole oder Satztzeichen mit der Maus anklicken." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Text: Wörter ordnen| Beim Erstellen dieser Übung werden Wörter oder Absätze " "vertauscht. Die Spieler/in muss sie wieder in die richtige Reihenfolge " "bringen." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Text\\: Text ergänzen|Verschiedene Elemente eines Textes (Buchstaben, " "Wörter, Satzzeichen oder Sätze) fehlen. Der/die Übende muss sie ergänzen." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Kreuzworträtsel|Das Rätsel muss anhand von Definitionen gelöst werden. Diese " "können aus Text, Grafiken oder Sounddateien bestehen. Die Definition der " "beiden Begriffe, die sich an der Stelle, wo sich der Cursor befindet " "kreuzen, wird vom Programm automatisch angezeigt." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Wortsuchübung|In einer Tabelle müssen versteckte Begriffe gesucht werden. " "Leerzellen (ohne Worter) in der Tabelle werden mit durch Zufallsprinzip " "ausgewählten Buchstaben gefüllt." i18n/fromLaunchpad/po/jclic-activities/listactivities_el.po000066400000000000000000000234241335566474600243740ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-04-09 11:38+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Σύνθετη σχέση|Σε αυτή τη δραστηριότητα υπάρχουν δύο σύνολα πληροφοριών, αλλά " "ενδέχεται να έχουν διαφορετικό αριθμό τμημάτων ή να σχετίζονται με " "διαφορετικούς τύπους σχέσεων, για παράδειγμα: ένα προς ένα, πολλά προς ένα, " "τμήματα χωρίς σχέσεις, κλπ." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Απλή σχέση|Υπάρχουν δύο σύνολα πληροφοριών που έχουν τον ίδιο αριθμό " "τμημάτων. Κάθε τμήμα από το αρχικό σύνολο αντιστοιχεί σε ένα, και μόνον ένα, " "τμήμα του άλλου συνόλου." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Εύρεση ζευγών|Κάθε ένα από το κομμάτια εμφανίζεται δύο φορές, αλλά γυρισμένο " "από την πίσω όψη. Σε κάθε βήμα δύο κομμάτια είναι δυνατόν να " "αναποδογυριστούν, αλλά αν δεν είναι τα ίδια επιστρέφουν στην αρχική τους " "θέση." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Δραστηριότητα εξερεύνησης| Εμφανίζεται ένα αρχικό τμήμα πληροφορίας και αν " "κάνουμε κλικ σε αυτό εμφανίζεται ένα τμήμα δοσμένης πληροφορίας για κάθε " "στοιχείο." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Ταύτιση κελιών|Υπάρχει μόνο ένα σύνολο πληροφοριών, όπου πρέπει να γίνει " "κλικ σε κάθε ένα τμήμα του συνόλου ώστε να αναδιαταχθούν όλα τα τμήματα στη " "σωστή τους θέση." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Πληροφορίες οθόνης|Εμφανίζεται ένα συνολο πληροφοριών, όπου υπάρχει η " "δυνατότητα ενεργοποίησης πολυμεσικού περιεχομένου για κάθε τμήμα της " "πληροφορίας." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Διπλό παζλ|Εμφανίζονται δύο πλέγματα. Το ένα περιέχει τα τμήματα της " "πληροφορίας ανακατεμένα, ενώ το άλλο είναι άδειο. Σκοπός είναι η αναδιάταξη " "των τμημάτων στο άδειο πλέγμα με μετακίνησή τους σε αυτό." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Παζλ ανταλλαγής|Τα τμήματα της πληροφορίας είναι ανακατωμένα στο ίδιο " "πλαίσιο. Σε κάθε βήμα, δύο τμήματα ανταλλάσσουν τις θέσεις τους μέχρι να " "βρεθεί η σωστή τους θέση." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Παζλ με ένα κενό|Μέσα στο πλαίσιο της πληροφορίας λείπει ένα τμήμα της, ενώ " "τα άλλα είναι ανακατωμένα. Σε κάθε βήμα ένα από τα κομμάτια που βρίσκονται " "γύρω από το κενό μετακινείται, μέχρι να βρεθεί η σωστή θέση όλων των " "τμημάτων." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Γραπτή απάντηση|Εμφανίζεται ένα σύνολο πληροφοριών και για κάθε τμήμα πρέπει " "να δοθεί η αντίστοιχη γραπτή απάντηση." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Κείμενο: συμπλήρωση κενών|Ο χρήστης πρέπει να συμπληρώσει ορισμένες λέξεις, " "γράμματα ή φράσεις που λείπουν ή είναι παραλλαγμένες σε ένα κείμενο. Η λύση " "για κάθε ένα στοιχείο μπορεί να οριστεί με διαφορετικούς τρόπους: με γράψιμο " "σε ένα κενό διάστημα, διόρθωση μιας φράσης που περιέχει λάθη, επιλογή από " "μια λίστα με πιθανές απαντήσεις." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Κείμενο: ταυτοποίηση στοιχείων|Ο χρήστης πρέπει να δείξει με κλικ του " "ποντικιoύ λέξεις, γράμματα, αριθμούς ή σημεία στίξης." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Κείμενο: διάταξη στοιχείων|Κατά το σχεδιασμό αυτής της δραστηριότητας " "μερικές λέξεις ή παράγραφοι του κειμένου επιλέχθηκαν να είναι ανακατεμένες. " "Ο χρήστης πρέπει να τις βάλει στη σωστή σειρά." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Κείμενο: συμπλήρωση κειμένου| Τμήματα ενός κειμένου (γράμματα, λέξεις, " "σημεία στίξης, φράσεις) έχουν εξαιρεθεί και ο χρήστης πρέπει να τα " "συμπληρώσει." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Σταυρόλεξα|Το σταυρόλεξο πρέπει να συμπληρωθεί σύμφωνα με τους ορισμούς των " "λέξεων. Οι ορισμοί μπορεί να είναι κείμενο, γραφικό ή ήχος. Το πρόγραμμα " "δείχνει αυτόματα τους ορισμούς των δυο λέξεων που τέμνονται στο σημείο που " "βρίσκεται ο κέρσορας." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Αναζήτηση λέξεων|Οι λέξεις πρέπει να βρεθούν στο πλέγμα των γραμμάτων. Τα " "ουδέτερα κελιά του πλέγματος (αυτά που δεν έχουν λέξεις) συμπληρώνονται με " "τυχαίους χαρακτήρες." i18n/fromLaunchpad/po/jclic-activities/listactivities_es.po000066400000000000000000000165141335566474600244050ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-11 17:43+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Asociación compleja|En este tipo de activitat se presentan también dos " "conjuntos de información, pero éstos pueden tener un número diferente de " "elementos y entre ellos se pueden dar diversos tipos de relación: Uno a uno, " "diversos a uno, elementos sin asignar..." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Asociación simple|Se presentan dos conjuntos de información que tienen el " "mismo número de elementos. A cada elemento del conjunto imagen corresponde " "sólo un elemento del conjunto origen." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Juego de memoria|Cada una de las piezas que forman el objeto aparece " "escondido dos veces dentro de la ventana de juego. En cada jugada se " "destapan un par de piezas, que se vuelven a esconder si no son idénticas. El " "objetivo es localizar todas las parejas." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Actividad de exploración|Se muestra una información inicial y al hacer clic " "en ella aparece, para cada elemento, una determinada pieza de información." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Actividad de identificación|Se presenta sólo un conjunto de información y " "hay que hacer clic en aquellos elementos que cumplan una determinada " "condición." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Pantalla de información|Se muestra un conjunto de información y, " "opcionalmente, se ofrece la posibilidad de activar el contenido multimedia " "asociado a cada elemento." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Puzzle doble|Se muestran dos paneles. En uno aparece la información " "desordenada y el otro está vacío. Hay que reconstruir el objeto en el panel " "vacío arrastrando las piezas una por una." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Puzzle de intercambio|En un único panel se mezcla la información. En cada " "jugada se conmutan las posiciones de dos piezas hasta ordenar el objeto." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Puzzle de agujero|En un único panel se hace desaparecer una pieza y se " "mezclan las restantes. En cada jugada se puede desplazar una de las piezas " "que limitan con el agujero, hasta tenerlas todas en el orden original." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Respuesta escrita|Se muestra un conjunto de información y, para cada uno de " "sus elementos, hay que escribir el texto correspondiente." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Texto: rellenar agujeros|En un texto se seleccionan determinadas palabras, " "letras y frases que se esconden o se camuflan. La resolución de cada uno de " "los elementos escondidos se puede plantear de maneras diferentes: " "Escribiendo en un espacio vacío, corrigiendo una expresión que contiene " "errores o seleccionando en una lista entre distintas respuestas posibles." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Texto: identificar elementos|El usuario debe señalar con un clic del ratón " "determinadas palabras, letras, cifras, símbolos o signos de puntuación." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Texto: ordenar elementos|En el momento de diseñar la actividad se " "seleccionan en el texto algunas palabras o párrafos que se mezclarán entre " "sí. El usuario ha de intentar volver a ponerlo en orden." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Texto: completar texto|En un texto se hacen desaparecer determinados " "elementos (letras, palabras, signos de puntuación, frases) y el usuario debe " "completarlo." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Crucigrama|Hay que ir rellenando el panel de palabras a partir de sus " "definiciones. Las definiciones pueden ser textuales, gráficas o sonoras. El " "programa muestra automáticamente las definiciones de las dos palabras que se " "cruzan en la posición donde se encuentre el cursor en cada momento." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Sopa de letras|Hay que encontrar las palabras escondidas en una parrilla de " "letras. Las casillas neutras de la parrilla (aquéllas que no pertenecen a " "ninguna palabra) se rellenan con caracteres seleccionados al azar en cada " "jugada." i18n/fromLaunchpad/po/jclic-activities/listactivities_eu.po000066400000000000000000000161131335566474600244020ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-02-18 15:55+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Elkarketa berezia|Honek ere bi informazio multzo ditu baina zati kopuru " "ezberdina izan dezakete eta zatien harteko lotura ere ezberdina izan " "daiteke: lehenengoko bati bigarreneko bakarra, lehenengoko bati bigarreneko " "hainbat, loturarik gabeak, e.a." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Elkarketa arrunta|Zati kopuru bera duten bi informazio multzo daude. " "Lehenengoaren zati bakoitzari bigarrenaren zati bakarra dagokio eta ez " "gehiago." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Bikoteak egin| Zati bakoitza bi aldiz agertuko da buruz behera. Bakoitzean " "bi zati giratuko dira gora eta berriz ere buruz bera jarriko dira ez badute " "bikotea osatzen. Helburua bikote guztiak aurkitzea da." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Ikertu-jarduera| Informazioaren lehen zatia ematen da eta horretan sakatuta " "elementu bakoitzerako informazio zati zehatz bat erakusten da." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Identifikazu atalak| Informazio atal batzuk daude eta berauetan sakatuta " "adierazi behar duzu zeintzuk betetzen duten baldintza zehatz bat." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Informazioa pantailan| Informazio atal batzuk daude eta aukera dago atal " "bakoitzerako multimedia edukia aktibatzeko bertan sakatuta." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Puzzle bikoitza| Bi taula erakusten dira. Lehenengoak informazioa nahastuta " "du eta bigarrena hutsik dago. Helburua hutsik dagoen taula osatzea da " "lehenengoko piezak banan banan arrastaka eramanda." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Zatiak ordenatu|Informazioa nahastuta dago panel berean. Saiakera bakoitzean " "bi zati mugituko dira guztiak ordenatuta geratu arte." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Puzzle mugikorra|Panel batean informazio-piezak nahastuta daude eta bat " "kanpoan dago gainera. Piezak hutsik dagoen tartea erabilita mugitu egin " "behar dira bere posiziora eramateko eta kanpoan dagoen piezarentzat bere " "lekua libre uzteko." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Idatzi erantzuna|Informazio atalak erakusten dira eta horiei dagokien testua " "idatzi egin behar da." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Testua: hutsuneak bete|Erabiltzaileak testuan ezkutatu edo kamuflatu diren " "hitzak, letrak edo esaldiak osatu behar ditu. Elementu bakoitzaren soluzioa " "era ezberdinetan eman daiteke: hutsunea bete, akatsak dituen esaldia zuzendu " "edo erantzun multzo batetik aukeratu." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Testua: Identifikatu elementuak|Erabiltzaileak hitzak, hizkiak, zenbakiak, " "sinboloak edo puntuazio-markak identifikatu behar ditu saguarekin markatuta." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Testua: Elementuak ordenatu|Jarduera hau diseinatzean, hainbat hitz edo " "paragrafo aukeratzen dira testutik eta nahastu egiten dira bertan. " "Erabiltzaileak berriz ere bere lekura eraman beharko ditu." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Testua: Testua osatu|Testuaren hainbat zati (hizkiak, hitzak, puntuazio-" "markak edo esaldiak) testutik ateratzen dira eta erabiltzaileak osatu egin " "behar du." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Hitz gurutzatuak|Hitzen taula definizioen bitartez osatu behar da. " "Definizioa testua, grafikoa edo soinu bidezkoa izan daiteke. Programak " "automatikoki erakusten ditu kurtsorearen kokapenean gurutzatzen diren bi " "hitzen definizioak." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Bilatu hitza|Ezkutuko hitzak letra taula batean daude. Taulako laukitxoetan " "dauden hizki neutralak (hitzarenak ez direnak) ausaz aukeratuko dira." i18n/fromLaunchpad/po/jclic-activities/listactivities_fr.po000066400000000000000000000160661335566474600244070ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-03-04 17:19+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Association complexe|Dans cette activité il y a aussi deux jeux " "d'information, mais ils peuvent avoir des nombres de cases différentes et " "peuvent avoir des relations différentes entre elles ex : un vers un, " "plusieurs vers un, parties sans relations etc..." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Association simple|Il y a deux jeux d'information qui ont le même nombre de " "cellules. A chaque partie correspond une et une seule concordance dans le " "second jeu." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Jeu mémory|Chaque pièce apparaît deux fois, mais face cachée. A chaque fois " "que deux pièces sont retournées and are turned back over if they are not the " "same. L'objectif est de retrouver toutes les paires." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Activité d'exploration|Une pièce initiale d'information est montrée et, en " "cliquant dessus, une pièce donnée d'information est montrée pour chaque " "élément." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Identification de cellules|Il y a juste un jeu d'information et vous avez " "juste à cliquer sur les parties qui remplissent certaines conditions." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Ecran d'information|Un jeu d'information est mmontré et il y a une option " "d'activation de contenu multimédia pour chaque pièce d'information." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Double puzzle| Deux grilles sont montrées. Une contient les informations en " "désordre et la seconde est vide. L'objectif est de réarranger la grille vide " "en prenant les pièces une à une." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Puzzle d'échange|The information is swapped within the same panel. In each " "go two pieces swap position until the object is reordered." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Puzzle à trou|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Réponse écrite|Un jeu d'information est montré et le texte correspondant à " "chaque partie doit être écrit." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Text: Remplir les blancs|L'utilisateur doit compléter certains mots, lettres " "et phrases qui ont été cachés ou camouflés dans le texte. La solution pour " "chaque élément peut être définie de différentes manières : remplir un champ " "vide, corriger une phrase contenant des erreurs, ou en sélectionnant une " "réponse dans une liste de réponses possibles." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Text: Identifier des éléments|L'utilisateur doit pointer ceratains mots, " "lettres, nombres, symboles ou marques de ponctuation en cliquant avec la " "souris." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Text: Mise en ordre d'éléments|Dans cette activité, certains mots ou " "paragraphes d'un texte sont sélectionnés et mélangés. L'utilisateur doit les " "remettre en ordre." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Text: Texte à compléter|Différentes parties d'un texte (lettres, mots, " "signes de ponctuation, ou phrases) sont retirées et l'utilisateur doit le " "compléter." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Mots croisés|Le tableau de mots doit être complété en accord avec les " "définitions. Les définitions peuvent être du texte, graphique ou son. Le " "programme montre automatiquement les définitions des deux mots qui croisent " "une position du curseur." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Recherche de mots|Les mots cachés doivent être trouvés dans une grille de " "lettres. Les cellules neutres dans la grille(celles qui n'ont pas de mots) " "sont complétées avec des lettres choisie au hasard." i18n/fromLaunchpad/po/jclic-activities/listactivities_gl.po000066400000000000000000000162011335566474600243710ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-12-21 20:02+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Asociación complexa|Neste tipo de actividade preséntanse tamén dous " "conxuntos de información, pero estes poden ter un número diferente de " "elementos e entre eles pódense dar diversos tipos de relacións: Un a un, " "varios a un, elementos sen asignar..." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Asociación simple|Preséntanse dous conxuntos de información que teñen o " "mesmo número de elementos. A cada elemento do conxunto orixe corresponde un " "e só un elemento do conxunto imaxe." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Xogo de memoria|Cada unha das pezas que forman o obxecto preséntase dúas " "veces e agochadas na xanela de xogo. En cada tirada descóbrense un par de " "pezas, que se volven a agochar se non foren idénticas. O obxectivo é " "descobrir todas as parellas." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Actividade de exploración|Móstrase unha información inicial e cando se preme " "nela aparece, para cada elemento, unha determinada peza de información." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Actividade de identificación|Preséntase só un conxunto de información e hai " "que premer nos elementos que cumpriren unha determinada condición." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Pantalla de información|Móstrase un conxunto de información e, " "opcionalmente, ofrécese a posibilidade de activar o contido multimedia " "asociado a cada elemento." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Quebracabezas dobre|Móstranse dous paneis. Nun aparece a información " "desordenada e o outro está baleiro. Hai que reconstruír o obxecto neste " "último arrastrando as pezas unha a unha." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Quebracabezas de intercambio|Nun único panel mestúrase a información. En " "cada xogada intercámbianse as posicións de dúas pezas ata ordenar o obxecto." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Quebracabezas de burato|Nun único panel faise desaparecer unha peza e " "mestúranse as restantes. En cada xogada pódese desprazar unha das pezas " "veciñas do burato, ata telas todas na orde orixinal." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Resposta escrita|Móstrase un conxunto de información e, para cada elemento, " "hai que escribir o texto correspondente ou de resposta." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Texto: encher buratos|Nun texto escóllense determinadas palabras, letras e " "frases que se agochan ou camuflan. A resolución de cada un dos elementos " "agochados pódese efectuar de xeitos diferentes: Escribindo nun espacio " "baleiro, corrixindo unha expresión que contén erros ou escolléndoa nunha " "lista entre distintas respostas posíbeis." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Texto: identificar elementos|O usuario ten que sinalar cun clic do rato " "palabras, letras, cifras, símbolos ou signos de puntuación." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Texto: ordenar elementos|No deseño da actividade escóllense no texto " "palabras ou parágrafos que se barallan. O usuario ten de intentar volver a " "pólo en orde." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Texto: completar texto|Nun texto fanse desaparecer algúns elementos (letras, " "palabras, signos de puntuación, frases) e o usuario ten de completalo." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Encrucillado|Hai que ir enchendo o panel de palabras a partir das " "definicións. As definicións poden ser textuais, gráficas ou sonoras. O " "programa mostra automaticamente as definicións das dúas palabras que se " "cruzan na posición actual do cursor." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Sopa de letras|Hai que encontrar as palabras escondidas nunha cuadrícula de " "letras. As celas neutras desta grella (as que non pertencen a ningunha " "palabra) énchense con caracteres escolleitos ao chou en cada xogada." i18n/fromLaunchpad/po/jclic-activities/listactivities_it.po000066400000000000000000000155601335566474600244120ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-29 14:29+0000\n" "Last-Translator: giomu2 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Associazione complessa|In questa attività ci sono due serie di informazioni, " "ma queste possono avere un diverso numero di parti e possono esserci " "differenti tipi di relazioni tra esse; es.: uno ad uno, vari con uno, parti " "con una relazione, etc." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Associazione semplice|Ci sono due serie di informazioni che hanno lo stesso " "numero di parti. Ciascuna parte della serie originale corrisponde a una, e " "solo una, parte dell'altra serie." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Memory|Ciascuno dei pezzi appare due volte, ma in fase di preparazione basta " "specificare una sola volta il contenuto di ogni cella. L'obiettivo del gioco " "è trovare le coppie." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Esplorazione|Un pezzo iniziale dell'informazione è mostrato e, cliccando su " "essa, un atro pezzo di informazione è mostrato per ciascun elemento." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Identificare celle|C'è una sola serie di informazioni: bisogna cliccare su " "quelle parti che rispondono a specifiche condizioni." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Schermata informativa|Una serie di informazioni viene mostrata e si possono " "attivare contenuti multimediali per ciascun pezzo di informazione." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Puzzle doppio|Sono mostrate due griglie. Una contiene le informazioni in " "disordine e l'altra è vuota. L'obiettivo del gioco è ricostruire le " "informazioni nella griglia vuota trascinando i pezzi uno ad uno." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Puzzle a scambio|Le informazioni sono inserite in un unico pannello. I pezzi " "vengono scambiati di posizione, fino al riordino completo delle informazioni." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Puzzle a buchi|Trascinamento di pezzi tagliati dal pannello originale." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Scrivi la risposta|Una serie di informazioni viene mostrata e deve essere " "scritto un testo corrispondente per ciascuna parte di essa." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Testo: Riempi gli spazi|L'utente deve completare determinate parole, lettere " "e frasi che sono state nascoste o camuffate in un testo. La soluzione di " "ciascun elemento può avvenire in diversi modi: scrittura nello spazio " "bianco; correzione di una frase con errori; selezione da una lista di " "possibili risposte." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Testo: Identifica gli elementi|L'utente deve cliccare su parole, lettere, " "numeri, simboli o segni di punteggiatura." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Testo: Ordina gli elementi|L'utente deve mettere in ordine le parole o i " "paragrafi presentati in disordine." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Testo: Completa il testo|L'utente deve completare un testo nel quale alcune " "parti (lettere, parole, segni di punteggiatura o frasi) sono state tolte." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Cruciverba|La tabella delle parole viene completata secondo le relative " "definizioni. Le definizioni possono essere testi, immagini o suoni. Il " "programma mostra automaticamente le definizioni alla selezione delle caselle." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Crucipuzzle|Ricerca di parole nascoste in una griglia di lettere. Le celle " "neutre della griglia vengono completate con caratteri scelti a caso." i18n/fromLaunchpad/po/jclic-activities/listactivities_nl.po000066400000000000000000000157161335566474600244120ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-02-04 19:57+0000\n" "Last-Translator: Heureka \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Complexe associatie|In deze activiteit zijn er ook twee groepen informatie, " "maar deze kunnen verschillen in aantal en er kunnen verschillende type " "relaties zijn tussen de twee groepen zoals: een op een, verschillende op " "een, geen relatie, enzovoorts." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Simpele associatie|Er zijn twee groepen informatie, met evenveel elementen " "in elke groep. Elk element van de ene groep komt precies overeen met een " "element in de andere groep." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Duo's zoeken|Elk element komt twee keer voor, je ziet alleen de achterkant. " "Bij elke beurt worden er twee elementen zichtbaar gemaakt en terug " "onzichtbaar als ze niet gelijk zijn. Je moet alle duo's vinden." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Exploreren activiteit|Er wordt een lijst met informatie getoond, en als je " "op een element klikt, wordt er bijkomende uitleg gegeven." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Identificeer cellen|Er is een lijst met informatie en je moet op deze delen " "klikken die aan een bepaalde voorwaarde voldoen." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Informatie scherm|Er is een lijst met informatie en er is de optie om " "multimedia te vertonen voor elk element." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Dubbele puzzel|Er worden twee tabellen getoond. Een bevat de informatie die " "doorheen is geschud en de ander is leeg. Het doel is de lege tabel te vullen " "in de juiste volgorde door de stukken een voor een te verslepen." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Verwissel puzzel|De informatie is in dezelfde tabel door elkaar gehaald. Bij " "elke beurt moet je twee delen omwisselen totdat de puzzel is opgelost." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Gat puzzel|In dezelfde tabel ontbreekt een stukje en de andere zijn door " "elkaar geschud. Bij elke beurt wordt een stukje in de opening geschoven tot " "de puzzel gemaakt is.." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Geschreven antwoord|Er wordt informatie getoond en de overeenstemmende tekst " "moet geschreven worden." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Tekst: Invuloefening|De gebruiker moet sommige woorden, letters en zinnen " "die weggelaten zijn vervolledigen. De oplossing kan op verschillende " "manieren gegeven worden: invullen op een lege plaats, verbeteren van fouten " "of kiezen uit een aantal oplossingen." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Tekst: Identifier elementen|De gebruiker moet sommige woorden, letters, " "cijfers, symbolen of leestekens aanklikken met de muis." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Tekst: Elementen ordenen|Sommige woorden of alinea's zijn door elkaar gezet. " "De gebruiker moet ze weer in de juiste volgorde zetten." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Tekst: Vervolledig tekst|Verschillende delen van een tekst (letters, " "woorden, leestekens of zinnen) zijn weggelaten en de gebruiker moet de tekst " "vervolledigen." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Kruiswoordraadsel|Het kruiswoordraadsel moet ingevuld worden door gebruik te " "maken van de definities. De definities mogen met tekst, afbeeldingen of " "geluiden. Het programma geeft de twee definities van de woorden waar er een " "letter wordt ingevuld." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Woordzoeker|De verborgen woorden moeten gezocht worden in een rooster met " "letters. De cellen die geen letters van woorden bevatten, worden willekeurig " "opgevuld." i18n/fromLaunchpad/po/jclic-activities/listactivities_pt.po000066400000000000000000000162311335566474600244150ustar00rootroot00000000000000# Portuguese translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-28 11:34+0000\n" "Last-Translator: Rui Fernandes \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Associação complexa|Neste tipo de actividade dois conjuntos (painéis) são " "associados entre si. Cada painel pode conter uma quantidade distinta de " "células e as relações podem ser: um-para-um, muitos para um, partes sem uma " "relação, etc." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Associação simples|Dois conjuntos de informação (painéis) com a mesma " "quantidade de células. Cada parte do conjunto original corresponde a uma - e " "somente uma - parte do segundo conjunto." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Jogo de memória|Cada uma das peças (de uma imagem escolhida) possui o seu " "par, todas com as faces voltadas para baixo. A cada tentativa, duas peças " "serão mostradas. Caso não formem um par (não sejam iguais), voltam-se de " "face para baixo. O objectivo é encontrar todos os pares." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "Exploração|Clicar sobre partes do painel mostra informações." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Identificar células|Existe um painel de informações. Clique nas partes que " "correspondem a determinada condição." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Ecrã de informação|Um conjunto de informações é mostrado. Existe a opção de " "activar um conteúdo da mediateca para cada parte da informação." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Quebra-cabeças duplo|São exibidos dois painéis. Um contém a informação " "desordenada e o outro está vazio. O objecto deve ser reorganizado no painel " "vazio arrastando cada peça." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Quebra-cabeças de troca|A informação é baralhada dentro do mesmo painel. A " "cada tentativa, duas peças trocam de posição até que o utilizador consiga " "colocar tudo em ordem." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Quebra-cabeças com lacuna|As peças (menos uma) surgem baralhadas num mesmo " "painel. Uma das peças contígua ao espaço vazio é movida até que todas sejam " "colocadas em ordem." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Resposta escrita|Um painel de informações é mostrado e o texto " "correspondente para cada uma das partes deve ser escrito." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Texto: Preencher lacunas|O utilizador completa palavras, letras e frases que " "foram escondidas ou camufladas num texto. A resolução de cada um dos " "elementos pode ser feita de diferentes modos: escrever num espaço em branco " "(lacuna); corrigir a frase que contém erros; ou seleccionar a resposta " "correcta a partir de uma lista." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Texto: Identificar elementos|O utilizador destaca algumas palavras, letras, " "números, símbolos ou pontuação com um clique." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Texto: Ordenar elementos|O utilizador ordena correctamente as palavras (ou " "parágrafos inteiros) de um texto previamente desordenadas." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Texto: Completar texto|Várias partes de um texto (letras, palavras, " "pontuação, ou frases) são retiradas e o utilizador deve completá-las." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Palavras Cruzadas|Completar a grelha de acordo com as definições. As " "definições podem ser mostradas como texto, imagens ou som. O jClic exibe " "automaticamente as definições de duas palavras que cruzam a posição do " "cursor." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Sopa de letras|As palavras escondidas devem ser encontradas numa grelha de " "letras. As células neutras na grelha (as que não têm palavras) são " "completadas com caracteres escolhidos aleatoriamente ou definidos pelo autor." i18n/fromLaunchpad/po/jclic-activities/listactivities_pt_BR.po000066400000000000000000000163321335566474600250020ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-03-04 17:19+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Associação complexa|Nesta atividade há dois conjuntos de informação, mas " "estes conjuntos podem ter um número diferente de elementos e podem existir " "diferentes tipos de relação entre eles, por exemplo: um-para-um, vários para " "um, partes sem uma relação, etc." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Associação simples|Há dois conjuntos de informação que possuem o mesmo " "número de partes. Cada parte do conjunto original corresponde a uma, e " "somente uma, parte do segundo conjunto." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Jogo da memória|Cada um dos pedaços (de uma imagem selecionada) aparece duas " "vezes, mas com a face voltada para baixo. A cada tentativa dois pedaços são " "revelados e têm sua face novamente voltada para baixo se não forem iguais. O " "objetivo é encontrar todos os pares." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Atividade de exploração|Um pedaço inicial de informação é mostrado e, ao " "clique do mouse, uma pequena informação é fornecida para cada elemento." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Atividade de identificação|Há somente um conjunto de informações e você deve " "clicar nas partes que corresponderem a uma certa condição." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Tela de informação|Um conjunto de informações é exibido e existe a opção de " "ativar um conteúdo de multimídia para cada parte da informação." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Quebra-cabeças duplo|Duas grades são exibidas. Uma contém a informação " "desordenada e outra está vazia. O objeto tem de ser reorganizado na grade " "vazia arrastando-se as partes da informação, uma a uma." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Quebra-cabeças de troca|A informação é embaralhada dentro do mesmo painel. A " "cada tentativa dois pedaços trocam de posição até que o objeto estiver " "reordenado." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Quebra-cabeças de lacuna|Num mesmo painel um pedaço está faltando e os " "outros estão embaralhados. A cada tentativa um dos pedaços próximo à lacuna " "é movido até que todos os pedaços retornem à ordem original." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Resposta escrita|Um conjunto de informações é exibido e o texto " "correspondente para cada uma das partes deve ser escrito." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Texto: Preencha as lacunas|O usuário deve completar certas palavras, letras " "e frases que foram escondidas ou camufladas em um texto. A solução para cada " "um dos elementos deve ser estabelecida de diferentes maneiras: escrita em um " "espaço em branco; corrigindo a frase que contém erros; ou selecionando a " "partir de uma lista de várias possíveis respostas." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Texto: Identifique os elementos|O usuário deve destacar algumas palavras, " "letras, números, símbolos ou pontuação com o clique do mouse." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Texto: Ordenar elementos|Ao preparar esta atividade algumas das palavras ou " "parágrafos de um texto são selecionadas para serem embaralhadas. O usuário " "deve ordená-las corretamente." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Texto: Completar o texto|Várias partes de um texto (letras, palavras, " "pontuação, ou frases) são retiradas e o usuário deve completá-las." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Palavras Cruzadas|A tabela de palavras deve ser completada de acordo com " "suas definições. As definições podem ser exibidas na forma de texto, imagens " "ou som. O programa automaticamente exibe as definições de duas palavras que " "cruzam a posição do cursor." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Caça-palavras|As palavras escondidas devem ser encontradas em uma grade de " "letras. As células neutras na grade (aquelas sem palavras) são completadas " "com caracteres escolhidos aleatoriamente." i18n/fromLaunchpad/po/jclic-activities/listactivities_ru.po000066400000000000000000000222371335566474600244230ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2013-11-15 01:02+0000\n" "Last-Translator: Nikolay Tyunin \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Сложные ассоциации|В этом задании также есть два набора информации, но эти " "могут иметь разное количество частей, а также могут иметь разный тип связи " "(один к одному, много к одному, лишняя часть и т.д.)." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Простые ассоциации|Есть два набора информации с одинаковым количеством " "частей. Каждая часть из оригинального набора соответствует одной части из " "набора изображений." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Нахождение пар|Каждый из кусков появляется дважды, но верх ногами. При " "каждой попытке два куска переворачиваются и, если они не одинаковы, " "переворачиваются назад. Нужно найти все пары" #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Исследование активности| Начальная часть информации показана и при нажатии " "на неё, данная часть информации будет показана для каждого элемента." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Идентифкация ячейки|Существует только один набор информации, и вы должны " "нажать на те части, которые соответствуют некоторыму условию." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Экран информации| Показана часть информации, также существует возможность " "активации мультимедиа контента для каждой части информации." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Двойная головоломка|Показаны поля.Одно из них содержит неупорядоченную " "информацию, другое пусто. Объект должен быть перемещен в пустое поле " "перемещением частей одна за другой." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Головоломка с замещением| Информация изменилась в пределах одной панели. " "Каждая из частей поменяет позицию, пока не будет переупорядочена." #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Головоломка с пустотами | В той же самой панели одна часть отсутствует , а " "другие переставлены. Каждая из них продолжается после пробела и " "передвинута, пока они не вернутся в первоначальный порядок." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Письменный ответ | набор информации показан и соответствующий текст для " "каждой из его частей должен быть написан." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Текст: восполнить пробелы| Пользователь должен завершить определенные слова, " "буквы и фразы, которые были скрыты или замаскированы в тексте. Решение для " "каждого из элементов может быть установлено по-разному: запись в пробеле; " "исправление фразы, которая содержит ошибки; или выбор из списка различных " "возможных ответов." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Текст: Определение элементов | пользователь должен указать на некоторые " "слова, буквы, цифры, символы и знаки препинания с щелчком мыши." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Текст: Упорядочьте элементы | При выполнении этого действия некоторые из " "слов или абзацы текста выбраны, чтобы быть перемешанными вокруг. " "Пользователь должен отложить их в порядке." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Текст: Полный текст | Различные части текста (буквы, слова, знаки " "препинания, или фразы) стираются, и пользователь должен завершить ее." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Пересечение слов | Таблица слов должна быть завершена согласно ее " "определениям. Определения могут быть текстом, графикой или звуком. Программа " "автоматически показывает определения двух слов, которые пересекаются в " "позиции курсора." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Поиск слова| Скрытые слова должны быть найдены в поле букв. Пустые поля (без " "слов) заполняются случайными знаками." i18n/fromLaunchpad/po/jclic-activities/listactivities_vec.po000066400000000000000000000164151335566474600245530ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-22 15:58+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "Sociasion conplèsa|Inte sta atività ghe xé anca do set de inforamsion, ma " "cuesti i pol ver un nùmaro de parte difarente e ghe pol ser tipi difarenti " "de reƚasion fra de ƚori, ex.: uno-a-uno, parte sensa reƚasion, ect..." #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "" "Sociasion sòlia|Ghe xé do set de informasion che i gà el steso nùmaro de " "parte. Ògni parte da 'l set de orìxene ƚa coresponde a una, e nòma che una, " "parte de 'l set imàxene." #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "" "Catar pèri|Ognun de i tòchi i vien mostrài do vòlte, ma sotosora. A ògni " "turno, se rabalta do tòchi e i torna sotosora se no i xé conpagni. 'L " "obietivo el xé de catar tuti i pèri." #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "" "Atività de esplorasion|Se mostra inanso na sčianta de informasion e, co se " "clica un elemento, altra informasion ƚa vien mostrada par àgni elemento." #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "" "Intiva caxèƚe|Ghe xé nòma che un set de informasion e se gà da clicar so " "cheƚe parte che ƚe conbina co' na condision precixa." #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "" "Schermada de informasion|Se mostra un set de informasion e ghe xé l'opsion " "de ativar el contenudo multimedial par ògni parte de informasion." #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "" "Dopio puzzle|Se mostra do grèƚe. Una ƚa gà drento ƚa informasion " "dexordenada, e cheƚaltra ƚa xé voda. El ogèto el gà da ser resistemà inte ƚa " "grèƚa voda a strasinando i tòchi uno par vòlta." #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "" "Puzzle a sostitusion|Ƚa informasion ƚa xé spostada inte 'l steso panèƚo. A " "ògni turno do tòchi i se scanbia poxision un co' staltro fin che el ogèto el " "xé ordenà" #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "" "Puzzle a vodo|Inte 'l steso panèƚo manca un tòco e cheƚaltri i xé smisiài. A " "ògni turno un de i tòchi darente el vodo el vien spostà ffinché tuti i xé in " "órdene." #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "" "Respòsta scrita|Se mostra un set de informasion e se gà da scrìvar el tèsto " "corispondente a ognuna de ƚe so parte." #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "Tèsto: Inpenisi i vodi|'L utente el gà da conpletar de ƚe paròƚe, létare e " "fraxe che ƚe xé stàe sconte o imascaràe inte un tèsto. Ƚa soƚusion de ognun " "de i elementi ƚa pol ser mesa insenbre in mòdi difarenti: a scrivendo inte " "un spasio vodo; a coreexindo na fraxa che ƚa gà indrento erori; o desernindo " "da na lista de varie respòste alternadive." #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "" "Tèsto: Identìfega elementi|'L utente el gà da pontar calche paròƚa, létare, " "nùmari, glifi, o segni de puntexadura co' un clik de 'l mouse." #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "" "Tèsto: Meti in órdene|Co se dixegna sta atività calcheduna de ƚe paròƚe o " "paràgrafi de un tèsto i vien seƚesionài par èsar insenbrài a caxo. El utente " "el gà da rimétarli da novo in sèsto." #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "" "Tèsto: Conplèta el tèsto|Varie parte de un tèsto (létare, paròƚe, segni de " "pontexadura, o fraxe) i xé cavài fora e el utente el gà da conpletarlo." #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "" "Paròƚe in croxe|Ƚa tavèƚa de paròƚe ƚa gà da ser conpletada drio ƚe so " "pròpie definision. Ƚe definision ƚe pol èsar tèsti, gràfeghe o sonòri. El " "programa el mostra da so pòsta ƚe definision de ƚe do paròƚe che ƚe se " "incroxa inte ƚa poxision de 'l cursor." #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "" "Serca de paròƚe|Ƚe paròƚe sconte ƚe gà da ser catàe inte na grèƚa de létare. " "Ƚe caxèƚe neutraƚi inte ƚa grèƚa (cueƚe sensa paròƚe) ƚe vien conpletàe co' " "caràteri a caxo." i18n/fromLaunchpad/po/jclic-activities/listactivities_zh_TW.po000066400000000000000000000145361335566474600250330ustar00rootroot00000000000000# Chinese (Traditional) translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-03-26 01:18+0000\n" "Last-Translator: Cho Chin-Ping \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @associations.ComplexAssociation msgid "" "Complex association|In this activity there are also two sets of information, " "but these may have a different number of parts and there may be different " "types of relation between them e.g.: one-to-one, various to one, parts " "without a relation, etc." msgstr "" "複雜的關係|在這個活動中也有兩組資訊,但這些可能有不同的選項數,而且他們之間的關係可能有不同的類型\r\n" ",例如:一對一,多對一,部分無關,等等。" #: @associations.SimpleAssociation msgid "" "Simple association|There are two sets of information that have the same " "number of parts. Each part from the original set corresponds to one, and " "only one, part of the image set." msgstr "簡單的關係|在這個活動中有兩組相同數目的資訊。每個部分從對應到相關的另一個,並且只有一個,圖像的一部分。" #: @memory.MemoryGame msgid "" "Finding pairs|Each of the pieces appear twice, but face down. In each go two " "pieces are turned over and are turned back over if they are not the same. " "The objective is to find all the pairs." msgstr "配對|這些碎片成雙成對,但是是覆蓋的。假若相同的話就會翻開,不同的話就會蓋回去。目標是找出所有配對。" #: @panels.Explore msgid "" "Explore activity|An initial piece of information is shown and, upon clicking " "on it, a given piece of information is shown for each element." msgstr "探索活動|一個初始信息會被顯示,點擊後,顯示每個元素的信息。" #: @panels.Identify msgid "" "Identify cells|There is just one set of information and you have to click on " "those parts that meet a certain condition." msgstr "確認細胞|這只是一組資訊並且你需要點擊這些部份來滿足特定的條件。" #: @panels.InformationScreen msgid "" "Information screen|One set of information is shown and there is the option " "of activating the multimedia content for each piece of information." msgstr "資訊屏幕|其中一組資料顯示,並有運作中多媒體內容的每一條資訊的選項。" #: @puzzles.DoublePuzzle msgid "" "Double puzzle|Two grids are shown. One contains the disordered information " "and the other is empty. The object has to be rearranged in the empty grid by " "dragging the pieces one by one." msgstr "雙層拼圖|顯示兩個網格。一個包含無序的訊息,另一個是空的。物件必須一個一個拖曳到空的網格中重新排序。" #: @puzzles.ExchangePuzzle msgid "" "Exchange puzzle|The information is swapped within the same panel. In each go " "two pieces swap position until the object is reordered." msgstr "互換拼圖|在同一個版面上交換資訊。一次交換兩個訊息的位子直到它被重新排序整齊。" #: @puzzles.HolePuzzle msgid "" "Hole puzzle|In the same panel one piece is missing and the others are " "shuffled. In each go one of the pieces next to the empty space is moved " "until they are back in the original order." msgstr "拼圖填空|少了一塊的面板被打亂。把每一塊拼在空格旁邊,直到恢復原來的順序。" #: @text.WrittenAnswer msgid "" "Written answer|A set of information is shown and the corresponding text for " "each of its parts must be written." msgstr "書面回答|顯示出一組訊息,必須寫入它每部分相對應的文字。" #: @text.FillInBlanks msgid "" "Text: Fill-in blanks|The user has to complete certain words, letters and " "phrases that have been hidden or camouflaged in a text. The solution of each " "of the elements may be set up in different ways: writing in a blank space; " "correcting a phrase that contains errors; or selecting from a list of " "various possible answers." msgstr "" "文字:填空|使用者需完成在本文內被隱藏或偽裝的特定單詞,字母,片語。每題的解法可能有多種方法:填空格;更正含錯的片語;或是從一列可能的答案中選出最佳的答案" "。" #: @text.Identify msgid "" "Text: Identify elements|The user has to point out some words, letters, " "numbers, symbols or punctuation marks with a click of the mouse." msgstr "文字:辨認元素| 使用者利用滑鼠點擊單詞,字母,數字,符號或標點符號。" #: @text.Order msgid "" "Text: Order elements|When designing this activity some of the words or " "paragraphs of a text are selected to be shuffled around. The user has to put " "them back in order." msgstr "文字:排序元素| 在設計這項活動時,選取文章內的一些字或是段落並打亂他們。讓使用者重新排出正確的順序。" #: @text.Complete msgid "" "Text: Complete text|Various parts of a text (letters, words, punctuation " "signs, or phrases) are taken out and the user has to complete it." msgstr "文字:完成文章|文章的數個部份(文字,單詞,標點符號或是片語)被拿出,讓使用者去完成它。" #: @textGrid.CrossWord msgid "" "Crosswords|The word table has to be completed according to its definitions. " "The definitions may be text, graphics or sound. The programme automatically " "shows the definitions of the two words which cross in the cursor position." msgstr "填字|詞彙表必須由每個辭彙的定義來完成。定義可能是文字,圖片或聲音。程式會自動顯示游標所指兩個詞的定義" #: @textGrid.WordSearch msgid "" "Word search|The hidden words have to be found in a grid of letters. The " "neutral cells in the grid (those with no word) are completed with characters " "chosen at random." msgstr "尋找文字|隱藏的文字必須在交錯的字母中。在網格中的空格(無字的格子)已經用隨機選擇的字元填寫完成。" i18n/fromLaunchpad/po/jclic-author/000077500000000000000000000000001335566474600174455ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-author/AuthorMessages_ar.po000066400000000000000000001671241335566474600234340ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2008-07-13 15:30+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "" #: edit_act_code msgid "Code:" msgstr "" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" #: edit_act_reportActions msgid "Report user actions" msgstr "" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "" #: edit_act_maxTime msgid "Max time:" msgstr "" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" #: edit_act_countdown msgid "Countdown" msgstr "" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "" #: edit_act_maxActions msgid "Max tries:" msgstr "" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "" #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "" #: edit_act_helpBtn msgid "Help" msgstr "" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "" #: edit_act_infoBtn msgid "Information" msgstr "" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "" #: edit_act_mainWindow msgid "Main window:" msgstr "" #: edit_act_gameWindow msgid "Game window:" msgstr "" #: edit_act_margin msgid "Margin:" msgstr "" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "" #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "" #: edit_gradient_startColor msgid "Start color:" msgstr "" #: edit_gradient_endColor msgid "End color:" msgstr "" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "" #: edit_gradient_cycles msgid "Cycles:" msgstr "" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "" #: edit_gradient_orientation msgid "Orientation:" msgstr "" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "" #: edit_act_gradient msgid "Gradient:" msgstr "" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "" #: edit_color_opacity msgid "Opacity" msgstr "" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "" #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "" #: edit_act_image msgid "Image:" msgstr "" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "" #: edit_act_tiledBgImg msgid "Tiled" msgstr "" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "" #: edit_act_transparent msgid "Transparent" msgstr "" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "" #: edit_act_image_tooltip msgid "Select an image" msgstr "" #: edit_act_text msgid "Text:" msgstr "" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "" #: edit_font_face msgid "Typeface:" msgstr "" #: edit_font_size msgid "Size:" msgstr "" #: edit_font_bold msgid "Bold" msgstr "" #: edit_font_italic msgid "Italic" msgstr "" #: edit_font_underline msgid "Underline" msgstr "" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "" #: edit_cell_title msgid "Cell contents" msgstr "" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "" #: edit_act_msg_initial msgid "Initial message:" msgstr "" #: edit_act_msg_final msgid "Final message:" msgstr "" #: edit_act_msg_prev msgid "Previous message:" msgstr "" #: edit_act_msg_error msgid "Error message:" msgstr "" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" #: edit_align msgid "Align:" msgstr "" #: edit_act_textColor msgid "Text color:" msgstr "" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "" #: edit_act_shadowColor msgid "Shadow color:" msgstr "" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "" #: edit_act_shadow msgid "Shadow" msgstr "" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "" #: edit_act_borderColor msgid "Border color:" msgstr "" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "" #: edit_act_altColor msgid "Alternative color:" msgstr "" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" #: edit_cell_marked msgid "Marked" msgstr "" #: edit_cell_disabled msgid "Disabled" msgstr "" #: edit_cell_alt msgid "Alternative" msgstr "" #: edit_cell_textMargin msgid "Internal margin:" msgstr "" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "" #: edit_cell_borderWidth msgid "Border width:" msgstr "" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "" #: edit_cell_markerWidth msgid "Marker width:" msgstr "" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "" #: edit_act_testAction msgid "Preview activity" msgstr "" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "" #: edit_act_panels_options msgid "Options" msgstr "" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "" #: edit_act_panels_panel msgid "Panel" msgstr "" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "" #: edit_media_exists_1 msgid "The file" msgstr "" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "" #: edit_act_shaper msgid "Shaper:" msgstr "" #: edit_act_shaper_err msgid "Shaper error:" msgstr "" #: edit_act_num_cols msgid "Columns:" msgstr "" #: edit_act_num_rows msgid "Rows:" msgstr "" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "" #: edit_act_toothRandom msgid "Random distribution" msgstr "" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "" #: edit_act_panels_text msgid "Text" msgstr "" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "" #: action_saveFile_caption msgid "Save..." msgstr "" #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "" #: action_saveFile_tooltip msgid "Save the current project" msgstr "" #: action_docTree_caption msgid "Document tree..." msgstr "" #: action_docTree_keys msgid "T*" msgstr "" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "" #: edit_docTree_title msgid "Document tree" msgstr "" #: edit_media_referencedBy msgid "Referenced by:" msgstr "" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "" #: edit_mc_type_unknown msgid "Unknown" msgstr "" #: edit_mc_type_sound msgid "Play sound" msgstr "" #: edit_mc_type_video msgid "Play video" msgstr "" #: edit_mc_type_midi msgid "Play MIDI" msgstr "" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "" #: edit_mc_type_record msgid "Record sound" msgstr "" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "" #: edit_mc_type_run_external msgid "Run program" msgstr "" #: edit_mc_type_url msgid "Show URL" msgstr "" #: edit_mc_type_exit msgid "End" msgstr "" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "" #: edit_mc_level msgid "Priority level:" msgstr "" #: edit_mc_file msgid "File:" msgstr "" #: edit_mc_externalParam msgid "Parameters:" msgstr "" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "" #: edit_mc_recBuffer msgid "Record tape:" msgstr "" #: edit_mc_stretch msgid "Stretch size" msgstr "" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "" #: edit_mc_location_from_box msgid "Cell" msgstr "" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "" #: edit_mc_location_from_frame msgid "Frame" msgstr "" #: edit_mc_loop msgid "Loop playback" msgstr "" #: edit_mc_autostart msgid "Auto start" msgstr "" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "" #: edit_mc_title msgid "Multimedia and active content" msgstr "" #: edit_mc_label msgid "Active content:" msgstr "" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "" #: edit_mc_pos_window msgid "Centered over window" msgstr "" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "" #: edit_act_panels_controls msgid "Controls" msgstr "" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "" #: edit_act_gridLayout msgid "Grid layout:" msgstr "" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "" #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" #: edit_act_showAllArrows msgid "Show all arrows" msgstr "" #: edit_act_alt msgid "Alternative content:" msgstr "" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "" #: edit_act_alt_toggle msgid "ALT" msgstr "" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "" #: edit_act_grid msgid "Grid" msgstr "" #: edit_act_grid_A msgid "Grid A" msgstr "" #: edit_act_grid_B msgid "Grid B" msgstr "" #: edit_act_grid_layout msgid "Layout" msgstr "" #: edit_act_grid_relationship msgid "Relationship" msgstr "" #: edit_seq_activity_header msgid "activity" msgstr "" #: edit_seq_tag_header msgid "tag" msgstr "" #: edit_seq_jump_header msgid "jump to" msgstr "" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "" #: edit_seq_auto msgid "Move on automatically" msgstr "" #: edit_seq_delay msgid "Delay:" msgstr "" #: edit_seq_action_fwd msgid "Go forward" msgstr "" #: edit_seq_action_back msgid "Go bak" msgstr "" #: edit_seq_action_jump msgid "Jump to..." msgstr "" #: edit_seq_action_stop msgid "Stop" msgstr "" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "" #: edit_seq_action_exit msgid "Exit JClic" msgstr "" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "" #: edit_seq_action msgid "Action:" msgstr "" #: edit_seq_button_enabled msgid "Show button" msgstr "" #: edit_seq_project msgid "JClic Project:" msgstr "" #: edit_act_absolute msgid "Absolute position" msgstr "" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "" #: edit_seq_newElement msgid "New sequence element..." msgstr "" #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "" #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" #: edit_seq_jump_msg msgid "Jump target:" msgstr "" #: edit_seq_jump_title msgid "Jump target" msgstr "" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "" #: edit_act_prompt_class msgid "Type of activity:" msgstr "" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "" #: edit_act_newActivity_class msgid "Java class name:" msgstr "" #: edit_text_act_format msgid "Format" msgstr "" #: edit_text_act_answer msgid "Answer" msgstr "" #: edit_text_act_popup msgid "Pop up" msgstr "" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "" #: edit_list_newValue msgid "New text:" msgstr "" #: edit_list_addElement msgid "Add new list element" msgstr "" #: edit_list_modifyValue msgid "Modify selected text" msgstr "" #: edit_text_act_target msgid "Target" msgstr "" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "" #: edit_text_act_fillingChar msgid "Filling character" msgstr "" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "" #: edit_text_act_iniLen msgid "Initial length:" msgstr "" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" #: edit_text_act_iniText msgid "Initial text:" msgstr "" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "" #: edit_text_act_list msgid "Show a list of options:" msgstr "" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" #: edit_text_act_check_title msgid "Correction options" msgstr "" #: edit_text_act_popup_no msgid "No pop up" msgstr "" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "" #: edit_text_act_mainStyle msgid "Main style:" msgstr "" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "" #: edit_text_act_colors msgid "Colors:" msgstr "" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "" #: edit_text_act_styleSample_target msgid "target" msgstr "" #: edit_text_act_styleSample_error msgid "error" msgstr "" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "" #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "" #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "" #: edit_text_act_edit_target msgid "Target..." msgstr "" #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "" #: edit_text_act_checkCase msgid "Match case" msgstr "" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "" #: edit_text_act_checkOptions msgid "Criteria" msgstr "" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "" #: edit_text_act_check_bt msgid "Correction..." msgstr "" #: edit_text_act_checkButton msgid "Correction button" msgstr "" #: edit_text_act_checkProgress msgid "Progress" msgstr "" #: edit_text_act_typeBtn msgid "Type..." msgstr "" #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "" #: edit_text_act_orderWords msgid "Order words" msgstr "" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "" #: edit_text_act_type_title msgid "Activity type" msgstr "" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" #: edit_text_act_identWords msgid "Identify words" msgstr "" #: edit_text_act_identChars msgid "Identify characters" msgstr "" #: edit_media_change_name msgid "Change name..." msgstr "" #: edit_media_change_file msgid "Change file..." msgstr "" #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "" #: edit_media_type msgid "Media type:" msgstr "" #: edit_media_size msgid "File size:" msgstr "" #: edit_media_show_type msgid "Files of type:" msgstr "" #: edit_media_preview msgid "Preview media" msgstr "" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "" #: edit_media_rename msgid "Change resource name" msgstr "" #: edit_media_rename_title msgid "Rename" msgstr "" #: edit_media_rename_prompt msgid "New name:" msgstr "" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "" #: err_media_chfile_different msgid "File must be of same type" msgstr "" #: edit_media_font_error msgid "Unable to load font!" msgstr "" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "" #: edit_media_refresh_file msgid "Update media content from file" msgstr "" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "" #: edit_project_title_tooltip msgid "Project's title" msgstr "" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "" #: edit_project_tooltip msgid "Edit project properties" msgstr "" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "" #: edit_project_description_tooltip msgid "General description of the project" msgstr "" #: edit_project_area msgid "Areas:" msgstr "" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "" #: edit_project_level msgid "Levels:" msgstr "" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "" #: edit_project_descriptors msgid "Descriptors:" msgstr "" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "" #: edit_project_languages msgid "Languages:" msgstr "" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "" #: edit_project_languages_modify msgid "Change the selected language" msgstr "" #: edit_project_languages_add msgid "Add language" msgstr "" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "" #: edit_project_author_rol msgid "Rol:" msgstr "" #: edit_project_author_organization msgid "Organization:" msgstr "" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "" #: edit_project_author_info msgid "Author info:" msgstr "" #: edit_project_author_add msgid "Add author to list" msgstr "" #: edit_project_author_edit msgid "Edit author info" msgstr "" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "" #: edit_project_org_name_tooltip msgid "School name" msgstr "" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "" #: edit_project_org_url_tooltip msgid "School website" msgstr "" #: edit_project_org_address msgid "Address:" msgstr "" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "" #: edit_project_org_pc msgid "PC:" msgstr "" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "" #: edit_project_org_city msgid "City:" msgstr "" #: edit_project_org_city_tooltip msgid "School city" msgstr "" #: edit_project_org_country msgid "Country:" msgstr "" #: edit_project_org_state msgid "State:" msgstr "" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "" #: edit_project_org msgid "School/s:" msgstr "" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "" #: edit_project_org_info msgid "Organization info:" msgstr "" #: edit_project_org_add msgid "Add organization" msgstr "" #: edit_project_org_edit msgid "Edit organization data" msgstr "" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "" #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "" #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "" #: edit_project_rev_date msgid "Date:" msgstr "" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "" #: edit_project_rev msgid "Revisions:" msgstr "" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "" #: edit_project_rev_add msgid "Add revision record" msgstr "" #: edit_project_rev_edit msgid "Edit revision record" msgstr "" #: edit_project_rev_info msgid "Revision data" msgstr "" #: edit_media_objects msgid "objects" msgstr "" #: edit_media_object msgid "object" msgstr "" #: edit_evsounds_start msgid "Start of activity:" msgstr "" #: edit_evsounds_click msgid "Click on object:" msgstr "" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "" #: edit_evsounds_default msgid "default sound" msgstr "" #: edit_evsounds_disabled msgid "disabled" msgstr "" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" #: action_newProject_caption msgid "New project..." msgstr "" #: action_newProject_keys msgid "NN" msgstr "" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "" #: edit_arith_op_with msgid "With:" msgstr "" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "" #: edit_arith_op_fromList msgid "One from the list:" msgstr "" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "" #: edit_arith_op_decimals msgid "Decimals:" msgstr "" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "" #: edit_arith_op_dec1 msgid "#.#" msgstr "" #: edit_arith_op_dec2 msgid "#.##" msgstr "" #: edit_arith_firstOp msgid "First operand" msgstr "" #: edit_arith_secondOp msgid "Second operand" msgstr "" #: edit_arith_title msgid "Arith2 for JClic" msgstr "" #: edit_arith_operations msgid "Operations:" msgstr "" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "" #: edit_arith_operations_plus msgid "Plus" msgstr "" #: edit_arith_operations_minus msgid "Minus" msgstr "" #: edit_arith_operations_multiply msgid "Multiply" msgstr "" #: edit_arith_operations_divide msgid "Divide" msgstr "" #: edit_arith_unknown msgid "Unknown:" msgstr "" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "" #: edit_arith_result msgid "Result:" msgstr "" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "" #: edit_arith_result_random msgid "Random" msgstr "" #: edit_arith_result_asc msgid "Ascending" msgstr "" #: edit_arith_result_order msgid "Order by result:" msgstr "" #: edit_arith_result_desc msgid "Descending" msgstr "" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "" #: edit_arith_cond msgid "Conditions:" msgstr "" #: edit_arith_cond_ind msgid "Indifferent" msgstr "" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "" #: edit_autocp msgid "Automatic content generator:" msgstr "" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" #: edit_autocp_block msgid "Content generator" msgstr "" #: edit_autocp_btn msgid "Settings..." msgstr "" #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "" #: edit_data msgid "Edit data" msgstr "" #: edit_act msgid "Activity edit" msgstr "" #: edit_acp msgid "Content provider edit" msgstr "" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "" #: edit_project_author_group msgid "Creation" msgstr "" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "" #: m_Edit msgid "Edit" msgstr "" #: m_Edit_Mnemonic msgid "E" msgstr "" #: edit_media_preview_keys msgid "P*" msgstr "" #: edit_act_newActivity msgid "New activity..." msgstr "" #: edit_act_newActivity_keys msgid "A*" msgstr "" #: edit_act_testAction_keys msgid "P#10" msgstr "" #: edit_seq_newElement_keys msgid "S*" msgstr "" #: m_Insert msgid "Insert" msgstr "" #: m_Insert_Mnemonic msgid "I" msgstr "" #: m_View msgid "View" msgstr "" #: m_View_Mnemonic msgid "V" msgstr "" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "" #: action_editProject_keys msgid "PP" msgstr "" #: action_editProject_tooltip msgid "Edit project settings" msgstr "" #: action_editMedia_caption msgid "Media" msgstr "" #: action_editMedia_keys msgid "MM" msgstr "" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "" #: edit_project_descriptors_block msgid "Descriptors" msgstr "" #: edit_media_new msgid "New media object..." msgstr "" #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "" #: edit_media_new_keys msgid "M*" msgstr "" #: edit_seq_threshold msgid "Score threshold:" msgstr "" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" #: edit_seq_time msgid "Time threshold:" msgstr "" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "" #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" #: edit_seq_condJump msgid "Conditional jumps" msgstr "" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "" #: edit_color_dlgTitle msgid "Select color" msgstr "" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "" #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "" #: edit_act_copy_attributes msgid "Attributes" msgstr "" #: edit_act_copy_dest msgid "Apply to:" msgstr "" #: edit_act_copy_style_main msgid "Main window" msgstr "" #: edit_act_copy_style_play msgid "Play window" msgstr "" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "" #: edit_act_copyAttributes_keys msgid "T" msgstr "" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "" #: edit_new_project_name msgid "Project name:" msgstr "" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "" #: edit_new_project_title msgid "Create new JClic project" msgstr "" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "" #: edit_act_copy_margin msgid "Margin" msgstr "" #: edit_act_copy_bgColor msgid "Background color" msgstr "" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "" #: edit_act_copy_bgImage msgid "Background image" msgstr "" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "" #: edit_act_copy_position msgid "Position" msgstr "" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "" #: edit_act_copy_skin msgid "Skin" msgstr "" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "" #: edit_act_copy_maxTime msgid "Max. time" msgstr "" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "" #: edit_act_copy_btnHelp msgid "Help button" msgstr "" #: edit_act_copy_btnInfo msgid "Information button" msgstr "" #: edit_act_copy_grids msgid "Grids" msgstr "" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "" #: edit_act_copy_text msgid "Text activities" msgstr "" #: edit_act_copy_fontFace msgid "Font face" msgstr "" #: edit_act_copy_fontSize msgid "Font size" msgstr "" #: edit_act_copy_fontStyle msgid "Font style" msgstr "" #: edit_act_copy_textColour msgid "Main text colour" msgstr "" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "" #: edit_act_changeType msgid "Change activity type" msgstr "" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" #: edit_act_newActivity_other msgid "Other..." msgstr "" #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" #: applet_codebase msgid "Location of JClic code:" msgstr "" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" #: applet_prev_text msgid "HTML code before:" msgstr "" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "" #: applet_post_text msgid "HTML code after:" msgstr "" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "" #: applet_size msgid "Applet size:" msgstr "" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "" #: applet_page_title msgid "Page title:" msgstr "" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "" #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "" #: action_createHTML_caption msgid "Create web page..." msgstr "" #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "" #: action_createHTML_keys msgid "H*" msgstr "" #: settings_applet msgid "Applet" msgstr "" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "" #: applet_exitUrl msgid "On exit, go to:" msgstr "" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "" #: applet_infoFrame msgid "Info frame name:" msgstr "" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" #: action_createInstaller_caption msgid "Create project installer..." msgstr "" #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "" #: installer_caption msgid "Edit project installer script" msgstr "" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "" #: installer_authors msgid "Autors:" msgstr "" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "" #: installer_files msgid "Files to be copied:" msgstr "" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "" #: installer_files_available msgid "Available files" msgstr "" #: installer_files_selected msgid "Selected files" msgstr "" #: installer_files_add msgid ">> add >>" msgstr "" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "" #: installer_files_remove msgid "<< remove <<" msgstr "" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "" #: installer_button msgid "Launch button" msgstr "" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "" #: installer_button_project msgid "Main project:" msgstr "" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "" #: installer_button_icon msgid "Icon:" msgstr "" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" #: applet_page_full msgid "Full-page applet" msgstr "" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "" #: edit_text_align_left msgid "Align text left" msgstr "" #: edit_text_align_center msgid "Center text" msgstr "" #: edit_text_align_right msgid "Align text right" msgstr "" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "" #: edit_text_act_content msgid "Content" msgstr "" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "" #: edit_cell_size msgid "Cell size:" msgstr "" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "" #: edit_media_refreshAll msgid "Update all media content" msgstr "" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "" #: edit_media_refreshAll_keys msgid "R*" msgstr "" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "" #: edit_media_exportAll msgid "Export all media" msgstr "" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "" #: edit_media_exportAll_keys msgid "X*" msgstr "" #: edit_shape_select msgid "Select" msgstr "" #: edit_shape_addPoint msgid "Add point" msgstr "" #: edit_shape_deletePoint msgid "Delete" msgstr "" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "" #: edit_shape_toLine msgid "Convert to line" msgstr "" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "" #: edit_shape_rLeft msgid "Rotate left" msgstr "" #: edit_shape_rRight msgid "Rotate right" msgstr "" #: edit_shape_expand msgid "Expand" msgstr "" #: edit_shape_contract msgid "Contract" msgstr "" #: edit_shape_zoomIn msgid "Zoom in" msgstr "" #: edit_shape_zoomOut msgid "Zoom out" msgstr "" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "" #: edit_shape_showPoints msgid "Show points" msgstr "" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "" #: edit_shape_gridSize msgid "Grid size:" msgstr "" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "" #: edit_shape_elements msgid "Defined elements" msgstr "" #: edit_shape_elemName msgid "Name of the selected element" msgstr "" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "" #: edit_mc_sequence msgid "Sequence:" msgstr "" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "" #: edit_mc_project msgid "Project:" msgstr "" #: edit_mc_activity_selection msgid "Choose activity" msgstr "" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "" #: edit_act_arrowColor msgid "Arrow color:" msgstr "" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" #: edit_act_editActivity msgid "Edit..." msgstr "" #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "" #: action_saveFileAs_caption msgid "Save as..." msgstr "" #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "" #: edit_act_behavior_drag msgid "Drag objects" msgstr "" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "" #: edit_act_behavior_order msgid "Check solving order" msgstr "" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "" #: edit_act_scramble msgid "Scramble" msgstr "" #: action_importActivities_caption msgid "Import activities..." msgstr "" #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" #: import_importing msgid "Importing..." msgstr "" #: import_checkdep msgid "Checking dependencies..." msgstr "" #: import_impmedia msgid "Importing media\\:" msgstr "" #: import_impact msgid "Importing activity\\:" msgstr "" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "" #: edit_tagRep_tags msgid "Tag marks" msgstr "" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "" #: edit_tagRep_file msgid "File" msgstr "" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" #: edit_tagRep_charset msgid "Charset\\:" msgstr "" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "" #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "" #: edit_tagRep_title msgid "Tag replacing" msgstr "" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "" #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" #: img_max_size msgid "Maximum size of images:" msgstr "" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "" #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "" #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_ast.po000066400000000000000000002435661335566474600236260ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # Xandru Armesto , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2011-06-09 05:26+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Descripción" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nome de la xera" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nome:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Descripción de la xera" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Informes" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Incluyir esta xera nos informes" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Incluyir los resultaos d'esta xera nos informes d'usuariu" #: edit_act_code msgid "Code:" msgstr "Códigu:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Códigu opcional utilizáu p'agrupar y peñerar na base de datos d'informes." #: edit_act_reportActions msgid "Report user actions" msgstr "Rexistrar tamién les aiciones" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Rexistrar los detalles de toles aiciones feches polos usuarios." #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Cuntadores" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Cuntador de tiempu" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Amosar/anubrir el contador de tiempu." #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Cuntador de intentos" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Amosar/anubrir el contador de intentos." #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Cuntador d'aciertos" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Amosar/anubrir el contador d'aciertos." #: edit_act_maxTime msgid "Max time:" msgstr "Tiempu máximu:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Tiempu máximu pa resolver la xera, en segundos. El 0 significa tiempu " "ilimitáu." #: edit_act_countdown msgid "Countdown" msgstr "Cuenta atrás" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "El cuntador entama col valor máximu, decreciendo fasta 0." #: edit_act_maxActions msgid "Max tries:" msgstr "Intentos máx.:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Númberu máximu d'intentos permitíos, o 0 pa ilimitáu." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Botones" #: edit_act_helpBtn msgid "Help" msgstr "Aida" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Amosar/anubrir el botón d'aida" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Amosar la solución" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Amosar esti mensaxe:" #: edit_act_infoBtn msgid "Information" msgstr "Información" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Amosar/anubrir el botón d'información" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Amosar esta URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Executar el comandu:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Direición de la páxina web que se va amosar al calcar nel botón " "d'información." #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "" "Llínia de comandos que va executar al calcar nel botón d'información." #: edit_act_mainWindow msgid "Main window:" msgstr "Ventana principal:" #: edit_act_gameWindow msgid "Game window:" msgstr "Ventana de xuegu:" #: edit_act_margin msgid "Margin:" msgstr "Marxe:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Espaciu vertical y horizontal ente oxetos visuales." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Color de fondu:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Camudar el color de fondu." #: edit_gradient_startColor msgid "Start color:" msgstr "Color d'aniciu:" #: edit_gradient_endColor msgid "End color:" msgstr "Color final:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Escoyeta del color d'aniciu" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Escoyeta del color final" #: edit_gradient_cycles msgid "Cycles:" msgstr "Ciclos:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Númberu de repeticiones del gradiente sobro la superficie a pintar." #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientación:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Orientación del gradiente, midida en graos sobro la horizontal." #: edit_act_gradient msgid "Gradient:" msgstr "Gradiente:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Usar un gradiente de colores" #: edit_color_opacity msgid "Opacity" msgstr "Opacidá" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Axusta'l valor de la canal alfa (opacidá) de color." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Gradiente" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Usar los valores por defeutu (gradiente nulu)" #: edit_act_image msgid "Image:" msgstr "Imaxe:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Descripción" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nome y descripción" #: edit_act_tiledBgImg msgid "Tiled" msgstr "En mosaicu" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Pinta tola superficie cola imaxe, repitiéndola a lo llargo de les exes X ya " "Y tantes vegaes como faiga falta." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Vista previa:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Borde" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Dibuxar una llinia de berbesu al rodiu de la ventana" #: edit_act_transparent msgid "Transparent" msgstr "Tresparente" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "La ventana tien el fondu tresparente" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Anchor:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Altor:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Anchu del oxetu, en píxeles" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Altor del oxetu, en píxeles" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Centrada" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "El oxetu asítiase centráu respeutu de la ventana principal" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Posición horizontal absoluta" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Posición vertical absoluta" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interface d'usuariu" #: edit_act_image_tooltip msgid "Select an image" msgstr "Esbillar una imaxe" #: edit_act_text msgid "Text:" msgstr "Testu:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Testu que se va amosar nesti oxetu" #: edit_font_face msgid "Typeface:" msgstr "Triba:" #: edit_font_size msgid "Size:" msgstr "Tamañu:" #: edit_font_bold msgid "Bold" msgstr "Negrina" #: edit_font_italic msgid "Italic" msgstr "Cursiva" #: edit_font_underline msgid "Underline" msgstr "Sorrayáu" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Estilu:" #: edit_cell_title msgid "Cell contents" msgstr "Conteníos de la caxella" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Mensaxes" #: edit_act_msg_initial msgid "Initial message:" msgstr "Mensax d'aniciu:" #: edit_act_msg_final msgid "Final message:" msgstr "Mensax final:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Mensax previu:" #: edit_act_msg_error msgid "Error message:" msgstr "Mensax de fallu:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Mensax que s'amuesa al entamjar la xera" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Mensax que s'amuesa al finar la xera" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Mensax que s'amuesa al finar la xera con fallos" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Mensax que s'amuesa enantes d'entamar (namás en delles tribes de xeres)" #: edit_align msgid "Align:" msgstr "Orientación:" #: edit_act_textColor msgid "Text color:" msgstr "Color del testu:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Color utilizáu pa dibuxar el testu" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Color de la solombra:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Color utilizáu na solombra del testu, si esiste." #: edit_act_shadow msgid "Shadow" msgstr "Solombra" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Dibuxar el testu con solombra" #: edit_act_borderColor msgid "Border color:" msgstr "Color del berbesu:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Color utilizáu pa dibuxar el berbesu de la caxella" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Color de estáu inactivu:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Color utilizáu cuando la caxella ta desactivada" #: edit_act_altColor msgid "Alternative color:" msgstr "Color alternativu:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Color col que s'amuesa el conteníu alternativu de les caxelles una vegada " "solucionadas." #: edit_cell_marked msgid "Marked" msgstr "Marcada" #: edit_cell_disabled msgid "Disabled" msgstr "Desactivada" #: edit_cell_alt msgid "Alternative" msgstr "Alternativa" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Marxe internu:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Espaciu ente los berbesos de la celda y el testu." #: edit_cell_borderWidth msgid "Border width:" msgstr "Anchor del berbesu:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Anchor del trazu utilizáu pa dibuxar el berbesu." #: edit_cell_markerWidth msgid "Marker width:" msgstr "Anchor del marcador:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Anchor del trazu utilizáu pa dibuxar el berbesu cuando la caxella " "s'alcuentra marcada o escoyida." #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Vista previa n'estáu \"alternativa\"" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Vista previa n'estáu \"desactivada\"" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Vista previa n'estáu \"marcada\"" #: edit_act_testAction msgid "Preview activity" msgstr "Vista previa de la xera" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Prebar cómo furrula la xera" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Descripción" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Títulu y descripción de la xera" #: edit_act_panels_options msgid "Options" msgstr "Opciones" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opciones de la xera" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Ventana" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Aspeutu, tamañu y posición de la ventana na que corre la xera" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Mensaxes" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Conteníu de los mensaxes de la xera" #: edit_act_panels_panel msgid "Panel" msgstr "Panel" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Conteníu del panel" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Estilu" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Axustar el color, triba y tamañu de lletra de les caxelles" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Estilu:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Evitar sobreposición imaxe/testu" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Intentar evitar que testu ya imaxe se solapen" #: edit_media_exists_1 msgid "The file" msgstr "El ficheru" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "yá s'alcuentra na mediateca!" #: edit_act_shaper msgid "Shaper:" msgstr "Xenerador de formes:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Error nel xenerador de formes:" #: edit_act_num_cols msgid "Columns:" msgstr "Columnes:" #: edit_act_num_rows msgid "Rows:" msgstr "Fileres:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Altor de los dientes:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Anchor de los dientes:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Distribución aleatoria" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Propiedaes del xenerador de formes" #: edit_act_panels_text msgid "Text" msgstr "Testu" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Testu de la xera" #: action_saveFile_caption msgid "Save..." msgstr "Guardar..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Guardar el proyeutu actual" #: action_docTree_caption msgid "Document tree..." msgstr "Árbol del documentu..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Amosar el documentu del proyeutu en forma d'árbol" #: edit_docTree_title msgid "Document tree" msgstr "Árbol del documentu" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Referenciáu por:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Atención:

Esti proyeutu " "enllaza con otros proyeutos.
¿Quies esplorar los enllaces y cargar tolos " "ficheros rellacionaos?

(Recomiéndase responder cuando se ta " "importando un paquete de xeres de Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Triba:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Desconocíu" #: edit_mc_type_sound msgid "Play sound" msgstr "Interpretar soníu" #: edit_mc_type_video msgid "Play video" msgstr "Interpretar video" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Interpretar MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Interpretar CD audio" #: edit_mc_type_record msgid "Record sound" msgstr "Grabar soníu" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Interpretar grabación" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Dir a la xera" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Dir a la secuencia" #: edit_mc_type_run_external msgid "Run program" msgstr "Arrancar un programa" #: edit_mc_type_url msgid "Show URL" msgstr "Amosar la URL" #: edit_mc_type_exit msgid "End" msgstr "Finar" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Volver" #: edit_mc_level msgid "Priority level:" msgstr "Nivel de prioridá:" #: edit_mc_file msgid "File:" msgstr "Ficheru:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parámetros:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Dende:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Fasta:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Duración máx.:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Cinta de grabación:" #: edit_mc_stretch msgid "Stretch size" msgstr "Axustar tamañu" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Allugamientu:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Dende:" #: edit_mc_location_from_box msgid "Cell" msgstr "Celda" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Ventana" #: edit_mc_location_from_frame msgid "Frame" msgstr "Marcu" #: edit_mc_loop msgid "Loop playback" msgstr "Repetir indefinidamente" #: edit_mc_autostart msgid "Auto start" msgstr "Arranque automáticu" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Capturar mur" #: edit_mc_title msgid "Multimedia and active content" msgstr "Conteníu activu y multimedia" #: edit_mc_label msgid "Active content:" msgstr "Conteníu activu:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Escoyeta del oxetu multimedia" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Mediateca de recursos" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Centráu na celda" #: edit_mc_pos_window msgid "Centered over window" msgstr "Centráu na ventana" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Especificar posición:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "¡Los datos o la d'árbol son incorrectos.!" #: edit_act_panels_controls msgid "Controls" msgstr "Controles" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opciones de botones y cuntadores" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Triba:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Configuración de la rexella:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Posición relativa de los paneles A y B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Resolución inversa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "La xera consideraráse resuelta cuando tolos elementos de \"B\" tean " "empareyaos." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Amosar toles fleches" #: edit_act_alt msgid "Alternative content:" msgstr "Conteníu alternativu:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Conteníu que s'amuesa nes caxelles yá resueltes y nes non asignaes." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Editar el conteníu alternativu" #: edit_act_grid msgid "Grid" msgstr "Panel" #: edit_act_grid_A msgid "Grid A" msgstr "Panel A" #: edit_act_grid_B msgid "Grid B" msgstr "Panel B" #: edit_act_grid_layout msgid "Layout" msgstr "Distribución" #: edit_act_grid_relationship msgid "Relationship" msgstr "Rellaciones" #: edit_seq_activity_header msgid "activity" msgstr "xera" #: edit_seq_tag_header msgid "tag" msgstr "etiqueta" #: edit_seq_jump_header msgid "jump to" msgstr "blincu a" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Xera:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Etiqueta:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Descripción:" #: edit_seq_auto msgid "Move on automatically" msgstr "Avance automáticu" #: edit_seq_delay msgid "Delay:" msgstr "Retardu:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Dir p'alantre" #: edit_seq_action_back msgid "Go bak" msgstr "Dir p'atrás" #: edit_seq_action_jump msgid "Jump to..." msgstr "Blincar a..." #: edit_seq_action_stop msgid "Stop" msgstr "Parar" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Tornar" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Colar de JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Flecha p'alantre:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Flecha p'atrás:" #: edit_seq_action msgid "Action:" msgstr "Aición:" #: edit_seq_button_enabled msgid "Show button" msgstr "Amosar botón" #: edit_seq_project msgid "JClic Project:" msgstr "Proyeutu JClic:" #: edit_act_absolute msgid "Absolute position" msgstr "Posición absoluta" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "L'oxetu va asitiase nes coordenaes X ya Y que se conseñen" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Allugamientu:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Nuevu elementu de secuencia..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Inxertar un nuevu elementu na secuencia de xera" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Escueyi una xera pal nuevu elementu de secuencia." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "¡No se pue criar un elementu nuevu de secuencia ensin conseñar la xera!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "¡Nesti proyeutu nun hai xera denguna! Nun se puen criar elementos de " "secuencia nun proyeutu baleru." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Destín del blincu:" #: edit_seq_jump_title msgid "Jump target" msgstr "Destín del blincu" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Amestar una xera nueva al proyeutu" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Triba de xera:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nome:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Escueyi la triba de xera que quies criar y pon-y un nome:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "¡Hai qu'escoyer una triba de xera!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "¡Hai qu'indicar un nome pa la xera!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "¡Nun se pudo criar la xera!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Nome de la clas Java:" #: edit_text_act_format msgid "Format" msgstr "Formatu" #: edit_text_act_answer msgid "Answer" msgstr "Rempuesta" #: edit_text_act_popup msgid "Pop up" msgstr "Ventana emerxente" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Rempuestes correutes:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Amestar un elementu nuevu a la llista" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Editar l'elementu escoyíu" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Esborrar l'elementu escoyíu de la llista" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Mover p'arriba" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Mover p'abaxo" #: edit_list_newValue msgid "New text:" msgstr "Testu nuevu:" #: edit_list_addElement msgid "Add new list element" msgstr "Amestar un elementu nuevu a la llista" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Camudar el testu escoyíu" #: edit_text_act_target msgid "Target" msgstr "Destín" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Llargor máximu:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Númberu máximu de carauteres permitíos na rempuesta." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Caráuter de rellenu" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Caráuter utilizáu pa indicar la incógnita" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Llargor d'ainiciu:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Númberu de carauteres de rellenu que se van amosar nel aniciu la xera." #: edit_text_act_iniText msgid "Initial text:" msgstr "Testu d'aniciu:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Testu que se va amosar na incógnita al entamar la xera." #: edit_text_act_list msgid "Show a list of options:" msgstr "Amosar una llista de opciones:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "Amosar la llista d'opciones que l'usuariu tien d'escoyer." #: edit_text_act_check_title msgid "Correction options" msgstr "Opciones d'evaluación" #: edit_text_act_popup_no msgid "No pop up" msgstr "Ensin ventana emerxente" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Ventana emerxente automática" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Ventana emerxente cuando hai fallos" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Ventana emerxente calcando F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Triba:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Retardu d'apaición:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Tiempu máximu:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Namás interpretar soníu" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "Pa criar una incógnita nueva fai falta escoyer un fragmentu de testu." #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" "El testu de les incógnites nun puede incluyir retornos de párrafu nin " "tabulaciones." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "¡Les incógnites nun se puen solapar" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "¡Les incógnites nun pueden tener caxelles!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Color del papel:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Editar los estilos del documentu..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Estilu principal:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Espaciu de tabulador:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Espacios ente marques de tabulación:" #: edit_text_act_colors msgid "Colors:" msgstr "Colores:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Colores de les incógnitas:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Colores d'errores:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Vista preliminar:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Testu normal" #: edit_text_act_styleSample_target msgid "target" msgstr "incógnita" #: edit_text_act_styleSample_error msgid "error" msgstr "error" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "testu normal" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "testu normal." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Atención: esta aición va suprimir la incógnita escoyida. ¿De xuru que lo " "quies facer?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Pantalla previa..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Nun amosar testu dengún enantes d'entamar la xera" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Amosar el testu completu del exerciciu" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Amosar esti testu:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Tiempu máximu:" #: edit_text_act_edit_target msgid "Target..." msgstr "Incógnita..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Amosar botón d'evaluación" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Testu del botón:" #: edit_text_act_checkCase msgid "Match case" msgstr "Comprobar mayúscules / minúscules" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Considerar acentos y carauteres especiales" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Considerar les marques de puntuación" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Permitir espacios repetíos" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Criterios" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Pasar automáticamente a la incógnita siguiente" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Pasar namás si se respuende correcho" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Conseñar los fallos lletra a lletra" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Parámetros del algoritmu d'analís:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Pasos:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Campu d'esploración:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Comprobar" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Analís de les rempuestes" #: edit_text_act_check_bt msgid "Correction..." msgstr "Correición..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Botón de correición" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progresu" #: edit_text_act_typeBtn msgid "Type..." msgstr "Triba..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ordenar párrafos" #: edit_text_act_orderWords msgid "Order words" msgstr "Ordenar palabres" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Baraxar palabres ente párrafos" #: edit_text_act_type_title msgid "Activity type" msgstr "Triba de xera" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Esta aición va esborrar toles incógnites definíes. ¿De xuru que lo quies " "facer?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identificar palabres" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identificar carauteres" #: edit_media_change_name msgid "Change name..." msgstr "Camudar nome..." #: edit_media_change_file msgid "Change file..." msgstr "Camudar el ficheru..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Guardar nel ficheru ZIP" #: edit_media_type msgid "Media type:" msgstr "Triba de recursu:" #: edit_media_size msgid "File size:" msgstr "Tamañu del ficheru:" #: edit_media_show_type msgid "Files of type:" msgstr "Triba de ficheros:" #: edit_media_preview msgid "Preview media" msgstr "Previsualizar oxetu" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Previsualización del recursu multimedia" #: edit_media_rename msgid "Change resource name" msgstr "Camudar el nome del recursu" #: edit_media_rename_title msgid "Rename" msgstr "Renomar" #: edit_media_rename_prompt msgid "New name:" msgstr "Nome nuevu:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "¡Nome de recursu non válidu!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Yá hai otru recursu con esti nome. Los recursos tienen de tener un nome " "únicu nel proyeutu." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "¡Ficheru incorreutu!" #: err_media_chfile_different msgid "File must be of same type" msgstr "El ficheru tien de ser de la mesma triba" #: edit_media_font_error msgid "Unable to load font!" msgstr "¡Nun se pudo cargar la fonte de lletra!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Guardar el ficheru (extrayelu del ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Anovar el conteníu del recursu dende'l ficheru" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Esti nun ye un ficheru \"real\", sinón un oxetu allugáu nel interior de un " "contenedor ZIP. Pa usar esta función fai falta qu'esista un ficheru col " "mesmu nome na carpeta onde s'atopa'l ficheru ZIP." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Xeres" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Secuencies" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Mediateca" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Xestión de les imáxenes y otros recursos usaos nel proyeutu." #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Creación y edición de les xeres del proyeutu" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Creación y edición de secuencies de xeres" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Títulu:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Títulu del proyeutu" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Proyeutu" #: edit_project_tooltip msgid "Edit project properties" msgstr "Edición de les propiedaes del proyeutu" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Descripción:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Descripción xeneral del proyeutu" #: edit_project_area msgid "Areas:" msgstr "Áries:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Áries curriculares pa les que s'empobina'l proyeutu" #: edit_project_level msgid "Levels:" msgstr "Niveles:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Niveles y ciclos educativos pa los que s'empobina'l proyeutu" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descriptores:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descriptores del proyeutu (separtaos por comes)" #: edit_project_languages msgid "Languages:" msgstr "Llingües:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Llingües usaes nel proyeutu" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Camudar la llingua escoyida" #: edit_project_languages_add msgid "Add language" msgstr "Amestar llingua" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Códigos de llingua ISO-639:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autores:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Persones que participaren na creación del proyeutu" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nome:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "Corréu electrónicu:" #: edit_project_author_rol msgid "Rol:" msgstr "Papel:" #: edit_project_author_organization msgid "Organization:" msgstr "Organización:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nome del autor/a (campu obligatorio)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Direición de corréu electrónicu del autor/a (opcional)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Papel de la persona nel proyeutu: autor, collaborador, illustrador, " "soníos... (opcional)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Escuela, universidá, asociación... (campu opcional)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Páxina web personal (campu opcional)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Otres carauterístiques (campu opcional)" #: edit_project_author_info msgid "Author info:" msgstr "Datos del autor/a:" #: edit_project_author_add msgid "Add author to list" msgstr "Amestar un autor a la llista" #: edit_project_author_edit msgid "Edit author info" msgstr "Camudar los datos del autor/a" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nome:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nome de la escuela" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "Corréu electrónicu:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Direición de corréu electrónicu de la escuela" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Direición web de la escuela" #: edit_project_org_address msgid "Address:" msgstr "Direición:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Direición postal de la escuela" #: edit_project_org_pc msgid "PC:" msgstr "CP:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Códigu postal" #: edit_project_org_city msgid "City:" msgstr "Ciudá:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Ciudá de la escuela" #: edit_project_org_country msgid "Country:" msgstr "País:" #: edit_project_org_state msgid "State:" msgstr "Estáu:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_org msgid "School/s:" msgstr "Escuela/es:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Escuela u otra institución que participare nel proyeutu" #: edit_project_org_info msgid "Organization info:" msgstr "Datos de la organización:" #: edit_project_org_add msgid "Add organization" msgstr "Amestar organización" #: edit_project_org_edit msgid "Edit organization data" msgstr "Camudar los datos de la organización" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "País, federación, xunión..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Estáu federal, comunidá, rexón..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Otros datos..." #: edit_project_rev_date msgid "Date:" msgstr "Data:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Data de la revisión" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autores/as:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autores/as de la revisión" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Descripción:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Breve descripción de los cambeos realizados" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Información adicional" #: edit_project_rev msgid "Revisions:" msgstr "Revisiones:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Historial de los cambeos principales fechos nel proyeutu" #: edit_project_rev_add msgid "Add revision record" msgstr "Amestar un rexistru de revisión" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Camudar el rexistru de la revisión" #: edit_project_rev_info msgid "Revision data" msgstr "Datos de la revisión" #: edit_media_objects msgid "objects" msgstr "oxetos" #: edit_media_object msgid "object" msgstr "oxetu" #: edit_evsounds_start msgid "Start of activity:" msgstr "Aniciu de xera:" #: edit_evsounds_click msgid "Click on object:" msgstr "Calcar nun oxetu:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Aición errónea:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Aición correuta:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Xera finada con fallos:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Xera finada correutamente:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Error: La descripción nun quedar erma" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Edición de los soníos d'eventos" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Soníos d'eventos:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Coseñar soníos específicos pa cada eventu de JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Soníos d'eventos:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Coseñar soníos específicos pa cada eventu de JClic" #: edit_evsounds_default msgid "default sound" msgstr "soníu por defeutu" #: edit_evsounds_disabled msgid "disabled" msgstr "desactiváu" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Activa o desactiva'l soníu pa esti eventu" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Calcar pa escoyer el soníu arreyáu a esti eventu, o desmarcar pa usar el " "soníu por defeutu" #: action_newProject_caption msgid "New project..." msgstr "Proyeutu nuevu..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Criar un proyeutu JClic nuevu" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Dende:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Valor mínimu del operador" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Fasta:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Valor máximu del operador" #: edit_arith_op_with msgid "With:" msgstr "Con:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Si se marca, l'operador pue tener tamién esti valor" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Ún de la llista:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Llista de posibles valores del operador" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Decimales:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Númberu de decimales del operando" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (enteru)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#,#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#,##" #: edit_arith_firstOp msgid "First operand" msgstr "Primer operando" #: edit_arith_secondOp msgid "Second operand" msgstr "Segundu operando" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 pa JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operaciones:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Selecciona la triba d'operaciones a efectuar" #: edit_arith_operations_plus msgid "Plus" msgstr "Sumes" #: edit_arith_operations_minus msgid "Minus" msgstr "Restes" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Multiplicaciones" #: edit_arith_operations_divide msgid "Divide" msgstr "Divisiones" #: edit_arith_unknown msgid "Unknown:" msgstr "Incógnita:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Escueyi l'elementu que va facer d'incógnita" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "El resultáu ye la incógnita" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "El segundu operador ye la incógnita" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "El primer operador ye la incógnita" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "La operación ye la incógnita" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Escribir la expressión entamando pel resultáu" #: edit_arith_result msgid "Result:" msgstr "Resultáu:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Ensin llevar" #: edit_arith_result_random msgid "Random" msgstr "Aleatoriu" #: edit_arith_result_asc msgid "Ascending" msgstr "Ascendente" #: edit_arith_result_order msgid "Order by result:" msgstr "Ordenar per resultáu:" #: edit_arith_result_desc msgid "Descending" msgstr "Descendente" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Evitar duplicaos" #: edit_arith_cond msgid "Conditions:" msgstr "Condiciones:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indiferente" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "El primer operador tien de ser mayor que'l segundu" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "El primer operador tien de ser menor que'l segundu" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Otres condiciones" #: edit_autocp msgid "Automatic content generator:" msgstr "xenerador automáticu de conteníu:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" "Escoyeta de la triba de xenerador automáticu de conteníu pa esta xera." #: edit_autocp_block msgid "Content generator" msgstr "Xenerador de conteníu" #: edit_autocp_btn msgid "Settings..." msgstr "Preferencies..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Configuración de los parámetros del xenerador de conteníu" #: edit_data msgid "Edit data" msgstr "Edición de datos" #: edit_act msgid "Activity edit" msgstr "Edición de la xera" #: edit_acp msgid "Content provider edit" msgstr "Edición del xenerador de conteníu" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "¡Error de creación del xenerador automáticu de conteníu!" #: edit_project_author_group msgid "Creation" msgstr "Creación" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Descripción" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interfaz d'usuariu" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Descripción:" #: m_Edit msgid "Edit" msgstr "Edición" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Xera nueva..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Inxertar" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Ver" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Proyeutu" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Editar les propiedaes del proyeutu" #: action_editMedia_caption msgid "Media" msgstr "Mediateca" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Edición de la mediateca del proyeutu" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Xeres" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Edición de les xeres" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Secuencies" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Edición de les secuencies de xeres" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "Esti proyeutu camudó. ¿Quies guardar los cambeos?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descriptores" #: edit_media_new msgid "New media object..." msgstr "Oxetu multimedia nuevu..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Amestar una imaxe o un oxetu multimedia a la mediateca" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Umbral de puntuación:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Siguir esti camín cuando la puntuación global seya mayor o igual que..." #: edit_seq_time msgid "Time threshold:" msgstr "Umbral de tiempu:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Pa siguir esti camín hai que tener feches les xeres nun tiempu inferior a..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "" "Sigui esti camín siempres que la puntuación global seya inferior a..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Sigui esti camín siempres que'l tiempu emplegáu nes xeres seya superior a..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Blincos condicionales" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Conseñar blincos que s'executen namás si se dan unes condiciones determinaes" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Conseñar les condiciones pa blincar a un nivel superior" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Blincu inferior:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Blincu superior:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Conseñar les condiciones pa blincar a un nivel inferior" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Aición asociada al botón \"siguiente\"" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Aición asociada al botón \"anterior\"" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Conseñar el destín del blincu" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Aición a facer" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Xera asociada a esti elementu de la secuencia" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Etiqueta emplegada pa referise a esti elementu de la secuencia (campu " "opcional)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Descripción del elementu de secuencia (campu opcional)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Activar o desactivar el botón de pasu de xera" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Avanzar automáticamente al acabar la xera" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Númberu de segundos a esperar enantes de facer el pasu automáticu" #: edit_color_dlgTitle msgid "Select color" msgstr "Escoyeta del color" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Por favor, espere mientres se camuda'l nome del recursu..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Anchor:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Anchor de les caxelles (en píxeles)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Altor:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Altor de les caxelles (en píxeles)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Pallabres tapecíes:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Llista de les palabres tapecíes nel panel" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Usar el panel B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "El conteníu del segundu panel va ser amosáu según se vayan atopando les " "palabres" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Escoyeta de la triba de xenerador de formes del panel" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Númberu de columnes del panel" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Númberu de fileres del panel" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Separtadores tresparentes" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Amosar los separtadores (caxelles prietes) como furacos tresparentes" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Mestures\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Númberu de vegaes que se mecerán les pieces" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Copiar atributos a..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Atributos:" #: edit_act_copy_dest msgid "Apply to:" msgstr "Aplicar a:" #: edit_act_copy_style_main msgid "Main window" msgstr "Ventana principal" #: edit_act_copy_style_play msgid "Play window" msgstr "Ventana de xuegu" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Xeres a camudar:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Copiar atributos" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Copiar a otres xeres dellos de los atributos d'esta xera" #: edit_new_project_name msgid "Project name:" msgstr "Nome del proyeutu:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Nome curtiu y descriptivu del proyeutu" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nome del ficheru:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nome del ficheru del proyeutu, ensin estensión" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Carpeta:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nome de la carpeta na que se va guardar el proyeutu" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Restolar..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Creación d'un proyeutu JClic nuevu" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Error: Tanto'l proyeutu como'l ficheru y la carpeta tienen de tener nomes " "válidos." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Nesta carpeta yá hai otru proyeutu Clic3.0 o JClic. Pa evitar tracamundios " "recomiéndase caltener cada proyeutu nuna carpeta independiente, anque nun ye " "imprescindible. ¿De xuru que quies criar el proyeutu nuevu nesta carpeta?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Error: ¡Nun fue ha criase la carpeta conseñada!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Error: ¡Nun s'escoyó xera nenguna. Pa usar esta función hai qu' escoyer na " "llista la xera o xeres a les que se van aplicara los atributos conseñaos." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Copiando atributos a:" #: edit_act_copy_margin msgid "Margin" msgstr "Marxe" #: edit_act_copy_bgColor msgid "Background color" msgstr "Color de fondu" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Gradiente" #: edit_act_copy_bgImage msgid "Background image" msgstr "Imaxe de fondu" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Berbesu" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Fondu tresparente" #: edit_act_copy_position msgid "Position" msgstr "Posición" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Mensaxes" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Estilu del mensaxe d'aniciu" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Estilu del mensaxe final" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Estilu del mensaxe de fallu" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Informes" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Incluyir la xera nos informes" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Rexistrar aiciones" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interfaz d'usuariu" #: edit_act_copy_skin msgid "Skin" msgstr "Entornu visual" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Soníos d'eventu" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Cuntadores" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Cuntador de tiempu" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Tiempu máximu" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Cuntador d'intentos" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Númberu máximu d'intentos" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Cuntador d'aciertos" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Númberu de vegaes qu'hai que baraxar" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Botones" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Botón d'aida" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Botón d'información" #: edit_act_copy_grids msgid "Grids" msgstr "Paneles" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Estilu del panel A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Estilu del panel B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Estilu de los paneles de testu" #: edit_act_copy_text msgid "Text activities" msgstr "Xeres de testu" #: edit_act_copy_fontFace msgid "Font face" msgstr "Triba de lletra" #: edit_act_copy_fontSize msgid "Font size" msgstr "Tamañu de lletra" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Estilu de lletra" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Color del testu principal" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Escueyi les xeres del proyeutu JClic que van ser importaes" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Color de los fallos" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Espaciu de tabulador" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Estilu del mensax previu" #: edit_act_changeType msgid "Change activity type" msgstr "Camudar la triba de xera" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Nome completu de la clas que se va emplegar pa construir la xera (¡namás pa " "usuarios avanzaos!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Otres..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Los usuarios/es avanzaos/es pueden criar tamién otres tribes de xeres JClic " "nun rexistraes. Escribi debaxo'l nome completu de la clas, precedida pol del " "paquete (por exemplu: \"com.acme.activities.FooActivity\"). Les xeres nueves " "tienen d'estender edu.xtec.jclic.Activity, y tienen de ser accesibles al " "cargador de clases de la máquina virtual de Java." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nome de la xera" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Cada xera tien de tener un nome único nel proyeutu" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Atención: " "El cambéu de la triba pue causar la perda de dellos de los atributos y " "oxetos de la xera que se ta editando. ¡Utilice la función con munchu " "cuidáu!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Allugamientu del códigu JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" "URL qu'apunta a una carpeta na que tean allugaos los ficheros del programa " "de JClic" #: applet_prev_text msgid "HTML code before:" msgstr "Códigu HTML previu:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Testu o códigu HTML que va aparecer enantes del applet" #: applet_post_text msgid "HTML code after:" msgstr "Códigu HTML posterior:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Testu o códigu HTML que va aparecer dempués del applet" #: applet_size msgid "Applet size:" msgstr "Tamañu del applet:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Anchor y altor del applet, en valores absolutos o porcentuales." #: applet_page_title msgid "Page title:" msgstr "Títulu de la páxina:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "" "Testu que se va amosar na parte superior de la ventana del restolador" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "La páxina web \"%s\" crióse con ésitu." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "¿Quies abrirla agora col restolador?" #: action_createHTML_caption msgid "Create web page..." msgstr "Criar páxina web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Creación d'una páxina HTML con un applet JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "Creación d'una páxina HTML con un applet que tenga esti proyeutu." #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nome del ficheru:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nome del ficheru HTML a criar" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Valores por defeutu usados na creación de páxines web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Color de fondu:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Color de fondu de la páxina web" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Centráu" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Allugar el applet centráu horizontalmente" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Anchor del applet (en valor absolutu o porcentual)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Altor del applet (en valor absolutu o porcentual)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Al colar, dir pa:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL pa onde se va empobinar la navegación al colar de JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Marcu d'información:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Nome del marcu emplegáu p'amosar el conteníu incluyíu nel botón \"info\"" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Criar instalador del proyeutu..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Creación d'un ficheru d'instalación del proyeutu pa JClic player" #: installer_caption msgid "Edit project installer script" msgstr "Edición del ficheru d'instalación del proyeutu" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Títulu:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Títulu del proyeutu que se va amosar nel asistente d'instalación" #: installer_authors msgid "Autors:" msgstr "Autores/as:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autores/as del proyeutu (testu curtiu)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Carpeta:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Nome de carpeta que va suxerir l'asistente d'instalación" #: installer_files msgid "Files to be copied:" msgstr "Ficheros a copiar:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Ficheros que se van copiar na instalación" #: installer_files_available msgid "Available files" msgstr "Ficheros disponibles" #: installer_files_selected msgid "Selected files" msgstr "Ficheros seleicionaos" #: installer_files_add msgid ">> add >>" msgstr ">> amestar >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Amestar el ficheru escoyíu a la llista" #: installer_files_remove msgid "<< remove <<" msgstr "<< quitar <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Quitar el ficheru escoyíu de la llista" #: installer_button msgid "Launch button" msgstr "Botón d'activación" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Propiedaes del botón que se va amosar na biblioteca de proyeutos" #: installer_button_project msgid "Main project:" msgstr "Proyeutu principal:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Proyeutu JClic asociáu al botón" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Etiqueta:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Etiqueta de testu curtia, que va apaecer dientro del botón" #: installer_button_icon msgid "Icon:" msgstr "Iconu:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Imaxe que va amosar el botón. Dexar ermo pa usar l'iconu por defeutu de " "JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Descripción" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Testu d'aida emerxente que va amosar el botón" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Error: Hai que conseñar el títulu del proyeutu" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Error: Hai que conseñar el nome de la carpeta" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Error: Nun tien escoyíu ficheru dengún" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "" "Error: Hai que conseñar el testu de la etiqueta del botón d'activación" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Error: El proyeutu asociáu al botón d'activación nun s'alcuentra ente los " "ficheros a copiar" #: applet_page_full msgid "Full-page applet" msgstr "L'applet ocupa tola páxina" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "L'applet tien dimensiones específiques" #: edit_text_align_left msgid "Align text left" msgstr "Alliniar el testu a la esquierda" #: edit_text_align_center msgid "Center text" msgstr "Testu centráu" #: edit_text_align_right msgid "Align text right" msgstr "Alliniar el testu a la drecha" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Criar una incógnita o suprimila" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Inxertar una celda" #: edit_text_act_content msgid "Content" msgstr "Conteníu" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Estilu" #: edit_cell_size msgid "Cell size:" msgstr "Dimensiones de la celda:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Les xeres siguientes enxamás van llegar a executase, darréu que nun apaecen " "en secuencia d'actividades del proyeutu denguna:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "Los oxetos siguientes de la mediateca nun s'empleguen direutamente en xera " "denguna:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "¿Quies amestales al final de la secuencia cabera de xeres?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "¿Quies esborralos?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Esborrar de oxetos multimedia nun emplegaos" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Xeres güérfanes" #: edit_media_refreshAll msgid "Update all media content" msgstr "Anovar el conteníu de tolos recursos" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Anovar tolos recursos volviendo a cargar los ficheros" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Anovando recursos..." #: edit_media_exportAll msgid "Export all media" msgstr "Esportar tolos recursos" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Grabar en ficheros el conteníu de tolos recursos" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Esbillar" #: edit_shape_addPoint msgid "Add point" msgstr "Amestar un puntu" #: edit_shape_deletePoint msgid "Delete" msgstr "Esborrar" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Dibuxar un rectángulo" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Dibuxar una elipse" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Dibuxar un polígonu" #: edit_shape_toLine msgid "Convert to line" msgstr "Convertir nuna llinia" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Convertir nuna curva Bézier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Convertir nuna curva cuádrica" #: edit_shape_rLeft msgid "Rotate left" msgstr "Xirar a la esquierda" #: edit_shape_rRight msgid "Rotate right" msgstr "Xirar a la drecha" #: edit_shape_expand msgid "Expand" msgstr "Espander" #: edit_shape_contract msgid "Contract" msgstr "Contrayer" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Averar" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Alloñar" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Xunta puntos averaos" #: edit_shape_showPoints msgid "Show points" msgstr "Amosar puntos" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Amosar/Anubrir los puntos" #: edit_shape_gridSize msgid "Grid size:" msgstr "Tamañu de la rexella:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Amosar / Anubrir la rexella" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Radiu del imán:" #: edit_shape_elements msgid "Defined elements" msgstr "Elementos definíos" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Nome del elementu escoyíu" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Radiu d'aición del imán, cuando ta activáu" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Tamañu de la rexella" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Xera:" #: edit_mc_sequence msgid "Sequence:" msgstr "Secuencia:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Proyeutu:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Escoyeta de la xera" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Escoyeta de la secuencia" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "¡Datos insuficientes!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Color de les fleches:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Color utilizáu pol editor pa dibuxar les fleches (nun ye esauto, darréu que " "s'emplega una máscara XOR de bits)" #: edit_act_editActivity msgid "Edit..." msgstr "Editar..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Editar la xera escoyida" #: action_saveFileAs_caption msgid "Save as..." msgstr "Guardar como..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Guardar el proyeutu con un nome distinto" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Comportamientu" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Comportamientu" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Arrastrar" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Arrastrar los oxetos en llugar de xunilos con una llinia" #: edit_act_behavior_order msgid "Check solving order" msgstr "Comprobar orde de resolución" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Les celdes tienen de resolvese n'orde" #: edit_act_scramble msgid "Scramble" msgstr "Baraxar" #: action_importActivities_caption msgid "Import activities..." msgstr "Importar xeres..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importar xeres d'otru proyeutu" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "El ficheru escoyíu correspuende a esti proyeutu. La importación de xeres " "namás se pue facer ente proyeutos estremaos. Por favor, escueyi otru " "proyeutu." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "Escueyi una o más xeres pa importales a esti proyeutu\\:" #: import_importing msgid "Importing..." msgstr "Importando..." #: import_checkdep msgid "Checking dependencies..." msgstr "Comprobando dependencies..." #: import_impmedia msgid "Importing media\\:" msgstr "Importando medios\\:" #: import_impact msgid "Importing activity\\:" msgstr "Importando la xera\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Escueyi'l proyeutu JClic del que quies importar xeres" #: edit_tagRep_tags msgid "Tag marks" msgstr "Marques d'etiquetes" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Marca d'aniciu\\:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Marca qu'indica aniciu d'etiqueta" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Marca final\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Marca qu'indica final d'etiqueta" #: edit_tagRep_file msgid "File" msgstr "Ficheru" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Ficheru o URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Nome o URL del ficheru que contién los valores que van sostituyir les " "etiquetes" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Codificación\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Triba de codificación emplegada nel ficheru" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Guetar..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Guetar nel sistema de ficheros" #: edit_tagRep_title msgid "Tag replacing" msgstr "Sostitución d'etiquetes" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Llimpiar estilos de testu..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Atención: Esta aición va llimpiar los atributos especiales de caráuter " "qu'esisten nel documentu, tornándolu al estilu principal. Esta operación nun " "se pue desfacer. ¿Quies realizala?" #: img_max_size msgid "Maximum size of images:" msgstr "Tamañu máximu de les imáxenes:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Anchor máximu de les imáxenes al importales a la mediteca." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Altor máximu de les imáxenes al importales a la mediteca." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "La imaxe \"%s\" tien un tamañu de %s pixels. Esto supera la llende permitida " "por JClic Author (%s). ¿Quies redimensionala?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_ca.po000066400000000000000000002433451335566474600234150ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2010-01-22 17:57+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Descripció" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nom de l'activitat" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nom:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Descripció de l'activitat" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Informes" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Inclou aquesta activitat als informes" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Inclou els resultats d'aquesta activitat en els informes d'usuari" #: edit_act_code msgid "Code:" msgstr "Codi:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Codi opcional utilitzat per agrupar i filtrar en la base de dades d'informes." #: edit_act_reportActions msgid "Report user actions" msgstr "Enregistra també les accions" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Enregistra els detalls de totes les accions efectuades pels usuaris." #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Comptadors" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Comptador de temps" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Mostra o amaga el comptador de temps" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Comptador d'intents" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Mostra o amaga el comptador d'intents." #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Comptador d'encerts" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Mostra o amaga el comptador d'encerts." #: edit_act_maxTime msgid "Max time:" msgstr "Temps màxim:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Temps màxim per a resoldre l'activitat, en segons. El zero significa temps " "il·limitat." #: edit_act_countdown msgid "Countdown" msgstr "Compte enrere" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "El comptador comença al valor màxim, decreixent fins a zero." #: edit_act_maxActions msgid "Max tries:" msgstr "Intents màx.:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Nombre màxim d'intents permesos, o zero per a il·limitat." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Botons" #: edit_act_helpBtn msgid "Help" msgstr "Ajuda" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Mostra o amaga el botó d'ajuda" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Mostra la solució" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Mostra aquest missatge:" #: edit_act_infoBtn msgid "Information" msgstr "Informació" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Mostrar o amagar el botó d'informació" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Mostrar aquest URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Executa l'ordre:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Adreça de la pàgina web que es mostrarà en fer clic al botó d'informació." #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Línia d'ordres que s'executarà en fer clic al botó d'informació." #: edit_act_mainWindow msgid "Main window:" msgstr "Finestra principal:" #: edit_act_gameWindow msgid "Game window:" msgstr "Finestra de joc:" #: edit_act_margin msgid "Margin:" msgstr "Marge:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Espai horitzontal i vertical entre objectes visuals." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Color de fons:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Canvia el color de fons." #: edit_gradient_startColor msgid "Start color:" msgstr "Color inicial:" #: edit_gradient_endColor msgid "End color:" msgstr "Color final:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Selecció del color inicial" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Selecció del color final" #: edit_gradient_cycles msgid "Cycles:" msgstr "Cicles:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Nombre de repeticions del degradat sobre la superfície a pintar" #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientació:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Orientació del degradat, mesurada en graus sobre l'horitzontal" #: edit_act_gradient msgid "Gradient:" msgstr "Degradat:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Utilitza un degradat de colors" #: edit_color_opacity msgid "Opacity" msgstr "Opacitat" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Ajusta el valor del canal alfa (opacitat) del color." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Degradat" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Utilitza els valors per defecte (degradat nul)" #: edit_act_image msgid "Image:" msgstr "Imatge:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Descripció" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nom i descripció" #: edit_act_tiledBgImg msgid "Tiled" msgstr "En mosaic" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Pinta tota la superfície amb la imatge, repetint-la al llarg dels eixos X i " "Y tantes vegades com calgui." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Vista preliminar:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Vora" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Dibuixar una línia de vora al voltant de la finestra" #: edit_act_transparent msgid "Transparent" msgstr "Transparent" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "La finestra té el fons transparent" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Amplada:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Alçada:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Amplada de l'objecte, mesurada en pícsels" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Alçada de l'objecte, mesurada en pícsels" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Centrada" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "L'objecte se situa centrat respecte a la finestra principal" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Posició horitzontal absoluta" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Posició vertical absoluta" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interfície d'usuari" #: edit_act_image_tooltip msgid "Select an image" msgstr "Selecciona una imatge" #: edit_act_text msgid "Text:" msgstr "Text:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Text que es mostrarà en aquest objecte" #: edit_font_face msgid "Typeface:" msgstr "Tipus:" #: edit_font_size msgid "Size:" msgstr "Mida:" #: edit_font_bold msgid "Bold" msgstr "Negreta" #: edit_font_italic msgid "Italic" msgstr "Cursiva" #: edit_font_underline msgid "Underline" msgstr "Subratllat" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Estil:" #: edit_cell_title msgid "Cell contents" msgstr "Contingut de la casella" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Missatges" #: edit_act_msg_initial msgid "Initial message:" msgstr "Missatge inicial:" #: edit_act_msg_final msgid "Final message:" msgstr "Missatge final:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Missatge previ:" #: edit_act_msg_error msgid "Error message:" msgstr "Missatge d'error:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Missatge que es mostra en iniciar-se l'activitat" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Missatge que es mostra en acabar l'activitat" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Missatge que es mostra quan l'activitat acaba amb errors" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Missatge que es mostra abans de començar (només en alguns tipus d'activitats)" #: edit_align msgid "Align:" msgstr "Orientació:" #: edit_act_textColor msgid "Text color:" msgstr "Color del text:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Color emprat per dibuixar el text" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Color de l'ombra:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Color emprat en l'ombra del text, si n'hi ha." #: edit_act_shadow msgid "Shadow" msgstr "Ombra" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Dibuixa el text amb ombra" #: edit_act_borderColor msgid "Border color:" msgstr "Color de la vora:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Color utilitzat per a dibuixar la vora de la casella" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Color d'estat inactiu:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Color emprat quan la casella es troba desactivada" #: edit_act_altColor msgid "Alternative color:" msgstr "Color alternatiu:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Color amb què es mostra el contingut alternatiu de les caselles un cop " "solucionades." #: edit_cell_marked msgid "Marked" msgstr "Marcada" #: edit_cell_disabled msgid "Disabled" msgstr "Desactivada" #: edit_cell_alt msgid "Alternative" msgstr "Alternativa" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Marge intern:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Espai entre les vores de la cel·la i el text." #: edit_cell_borderWidth msgid "Border width:" msgstr "Gruix de la vora:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Gruix del traç utilitzat per a dibuixar la vora." #: edit_cell_markerWidth msgid "Marker width:" msgstr "Gruix del marcador:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Gruix del traç utilitzat per dibuixar la vora quan la casella es troba " "marcada o seleccionada" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Vista preliminar de la casella en estat \"alternatiu\"" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Vista preliminar en estat \"desactivat\"" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Vista preliminar en estat \"marcat\"" #: edit_act_testAction msgid "Preview activity" msgstr "Mostra l'activitat" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Prova el funcionament de l'activitat" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Descripció" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Títol i descripció de l'activitat" #: edit_act_panels_options msgid "Options" msgstr "Opcions" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opcions de l'activitat" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Finestra" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Aspecte, mida i posició de la finestra on corre l'activitat." #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Missatges" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Contingut dels missatges de l'activitat" #: edit_act_panels_panel msgid "Panel" msgstr "Plafó" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Contingut del plafó" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Estil" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Ajusta els colors, tipus i mida de lletra de les caselles" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Estil:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Evita la sobreposició imatge/text" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Intenta evitar que el text trepitgi la imatge." #: edit_media_exists_1 msgid "The file" msgstr "El fitxer" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "ja es troba a la mediateca!" #: edit_act_shaper msgid "Shaper:" msgstr "Retallador:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Error del retallador:" #: edit_act_num_cols msgid "Columns:" msgstr "Columnes:" #: edit_act_num_rows msgid "Rows:" msgstr "Files:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Alçada de les dents:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Amplada de les dents:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Distribució aleatòria" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Propietats del generador de formes" #: edit_act_panels_text msgid "Text" msgstr "Text" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Text de l'activitat" #: action_saveFile_caption msgid "Save..." msgstr "Desa..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "DD" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Desa el projecte" #: action_docTree_caption msgid "Document tree..." msgstr "Arbre del document..." #: action_docTree_keys msgid "T*" msgstr "A*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Mostra el document del projecte en forma d'arbre" #: edit_docTree_title msgid "Document tree" msgstr "Arbre del document" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Referenciat per:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Atenció:

Aquest projecte " "enllaça amb altres projectes.
Voleu que el JClic explori els enllaços i " "carregui tots els materials relacionats?

(Es recomana respondre SI " "si esteu important un paquet d'activitats Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Tipus:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Desconegut" #: edit_mc_type_sound msgid "Play sound" msgstr "Interpreta so" #: edit_mc_type_video msgid "Play video" msgstr "Interpreta vídeo" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Interpreta MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Interpreta CD àudio" #: edit_mc_type_record msgid "Record sound" msgstr "Enregistra so" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Interpreta un enregistrament" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Vés a l'activitat" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Vés a la seqüència" #: edit_mc_type_run_external msgid "Run program" msgstr "Executa un programa" #: edit_mc_type_url msgid "Show URL" msgstr "Mostra l'URL" #: edit_mc_type_exit msgid "End" msgstr "Acaba" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Torna" #: edit_mc_level msgid "Priority level:" msgstr "Nivell de prioritat:" #: edit_mc_file msgid "File:" msgstr "Fitxer:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Paràmetres:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Des de:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Fins a:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Durada màx.:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Cinta d'enregistrament:" #: edit_mc_stretch msgid "Stretch size" msgstr "Comprimeix-lo si no hi cap" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Posició:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Des de:" #: edit_mc_location_from_box msgid "Cell" msgstr "Cel·la" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Finestra" #: edit_mc_location_from_frame msgid "Frame" msgstr "Marc" #: edit_mc_loop msgid "Loop playback" msgstr "Repeteix indefinidament" #: edit_mc_autostart msgid "Auto start" msgstr "Engega automàticament" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Captura ratolí" #: edit_mc_title msgid "Multimedia and active content" msgstr "Contingut actiu i multimèdia" #: edit_mc_label msgid "Active content:" msgstr "Contingut actiu:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Selecció de l'objecte multimèdia" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Biblioteca de recursos" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Centrat a la cel·la" #: edit_mc_pos_window msgid "Centered over window" msgstr "Centrat a la finestra" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Posició absoluta:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "L'estructura o les dades de l'arbre són incorrectes!" #: edit_act_panels_controls msgid "Controls" msgstr "Controls" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opcions de botons i comptadors" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Tipus:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Distribució dels plafons:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Posició relativa dels plafons A i B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Resolució inversa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "L'activitat es considerarà resolta quan tots els elements de \"B\" hagin " "estat aparellats." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Mostra totes les fletxes" #: edit_act_alt msgid "Alternative content:" msgstr "Contingut alternatiu:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Contingut que es mostra en les caselles ja resoltes o no assignades." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Edita el contingut alternatiu" #: edit_act_grid msgid "Grid" msgstr "Plafó" #: edit_act_grid_A msgid "Grid A" msgstr "Plafó A" #: edit_act_grid_B msgid "Grid B" msgstr "Plafó B" #: edit_act_grid_layout msgid "Layout" msgstr "Distribució" #: edit_act_grid_relationship msgid "Relationship" msgstr "Relacions" #: edit_seq_activity_header msgid "activity" msgstr "activitat" #: edit_seq_tag_header msgid "tag" msgstr "etiqueta" #: edit_seq_jump_header msgid "jump to" msgstr "saltar a" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Activitat:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Etiqueta:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Descripció:" #: edit_seq_auto msgid "Move on automatically" msgstr "Avanç automàtic" #: edit_seq_delay msgid "Delay:" msgstr "Retard:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Avançar" #: edit_seq_action_back msgid "Go bak" msgstr "Retrocedir" #: edit_seq_action_jump msgid "Jump to..." msgstr "Saltar a..." #: edit_seq_action_stop msgid "Stop" msgstr "Aturar-se" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Tornar" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Sortir del JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Fletxa endavant:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Fletxa enrere:" #: edit_seq_action msgid "Action:" msgstr "Acció:" #: edit_seq_button_enabled msgid "Show button" msgstr "Mostra botó" #: edit_seq_project msgid "JClic Project:" msgstr "Projecte JClic:" #: edit_act_absolute msgid "Absolute position" msgstr "Posició absoluta" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "L'objecte se situarà a les coordenades X i Y que especifiqueu" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Posició:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Nou element de seqüència..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Insereix un nou element a la seqüència d'activitats" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Selecciona una activitat per al nou element de seqüència." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "No es pot crear un nou element de seqüència sense indicar l'activitat." #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "En aquest projecte no hi ha cap activitat! No es poden crear elements de " "seqüència en un projecte buit." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Destí del salt:" #: edit_seq_jump_title msgid "Jump target" msgstr "Destí del salt" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Afegeix una nova activitat al projecte" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Tipus d'activitat:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nom:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Seleccioneu el tipus d'activitat que voleu crear i doneu-li un nom:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Cal seleccionar un tipus d'activitat!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Heu d'indicar un nom per l'activitat!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "No s'ha pogut crear l'activitat!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Classe Java:" #: edit_text_act_format msgid "Format" msgstr "Format" #: edit_text_act_answer msgid "Answer" msgstr "Resposta" #: edit_text_act_popup msgid "Pop up" msgstr "Finestra emergent" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Respostes vàlides:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Afegeix un nou element a la llista" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Modifica l'element seleccionat" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Elimina l'element seleccionat de la llista" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Mou amunt" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Mou avall" #: edit_list_newValue msgid "New text:" msgstr "Nou text:" #: edit_list_addElement msgid "Add new list element" msgstr "Afegeix un nou element de text" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Modifica el text seleccionat" #: edit_text_act_target msgid "Target" msgstr "Incògnita" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Longitud màxima:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Nombre màxim de caràcters de la resposta." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Caràcter de farciment" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Caràcter emprat per a indicar la incògnita" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Longitud inicial:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Nombre de caràcters de farciment que es mostraran en iniciar-se l'activitat." #: edit_text_act_iniText msgid "Initial text:" msgstr "Text inicial:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Text que es mostrarà a la incògnita en iniciar l'activitat." #: edit_text_act_list msgid "Show a list of options:" msgstr "Mostra una llista d'opcions:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "L'usuari haurà de seleccionar una opció en una llista." #: edit_text_act_check_title msgid "Correction options" msgstr "Opcions d'avaluació" #: edit_text_act_popup_no msgid "No pop up" msgstr "Sense finestra emergent" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Aparició automàtica" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Aparició en errors" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Aparició amb F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Tipus:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Retard d'aparició:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Temps màxim:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Només interpreta so" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "Per crear una nova incògnita cal que seleccioneu un fragment de text!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" "El text de les incògnites no pot incloure retorns de paràgraf ni tabuladors." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Les incògnites no es poden superposar!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Les incògnites no poden contenir cel·les!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Color del paper:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Edita els estils del document..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Estil principal:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Amplada del tabulador:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Espais entre marques de tabulador:" #: edit_text_act_colors msgid "Colors:" msgstr "Colors:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Colors de les incògnites:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Colors d'error:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Visualització prèvia:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Text normal" #: edit_text_act_styleSample_target msgid "target" msgstr "incògnita" #: edit_text_act_styleSample_error msgid "error" msgstr "error" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "text normal" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "text normal." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Atenció: aquesta acció suprimirà la incògnita actualment seleccionada. Segur " "que vols fer-ho?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Finestra prèvia..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "No mostris cap text abans d'iniciar l'activitat" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Mostra el text complet de l'exercici" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Mostra aquest text:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Temps màxim:" #: edit_text_act_edit_target msgid "Target..." msgstr "Incògnita..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Mostra el botó d'avaluació" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Text del botó:" #: edit_text_act_checkCase msgid "Match case" msgstr "Comprova majúscules / minúscules" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Considera accents i caràcters especials" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Considera els símbols de puntuació" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Permet espais repetits" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Criteris" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Salta automàticament a la següent incògnita" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Avança només si es respon correctament" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Indica la posició dels errors" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Paràmetres de l'algorisme d'anàlisi:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Passos:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Camp d'exploració:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Avaluació" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Anàlisi de les respostes" #: edit_text_act_check_bt msgid "Correction..." msgstr "Avaluació..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Botó d'avaluació" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progrés" #: edit_text_act_typeBtn msgid "Type..." msgstr "Tipus..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ordenar paràgrafs" #: edit_text_act_orderWords msgid "Order words" msgstr "Ordenar paraules" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Barreja paraules entre paràgrafs" #: edit_text_act_type_title msgid "Activity type" msgstr "Tipus d'activitat" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Aquesta acció suprimirà totes les incògnites actualment definides. Segur que " "vols fer-ho?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identificar paraules" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identificar caràcters" #: edit_media_change_name msgid "Change name..." msgstr "Canvia el nom..." #: edit_media_change_file msgid "Change file..." msgstr "Canvia el fitxer..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Desar-lo en el fitxer ZIP" #: edit_media_type msgid "Media type:" msgstr "Tipus de recurs:" #: edit_media_size msgid "File size:" msgstr "Mida del fitxer:" #: edit_media_show_type msgid "Files of type:" msgstr "Tipus de fitxers:" #: edit_media_preview msgid "Preview media" msgstr "Mostra l'objecte" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Visualització del recurs" #: edit_media_rename msgid "Change resource name" msgstr "Canvi del nom del recurs" #: edit_media_rename_title msgid "Rename" msgstr "Canvi de nom" #: edit_media_rename_prompt msgid "New name:" msgstr "Nou nom:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Nom de recurs no vàlid!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Ja hi ha un altre recurs amb aquest nom! Cada recurs ha de tenir un nom únic " "en el projecte." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Fitxer incorrecte!" #: err_media_chfile_different msgid "File must be of same type" msgstr "El fitxer ha de ser del mateix tipus" #: edit_media_font_error msgid "Unable to load font!" msgstr "No ha estat possible carregar el tipus de lletra!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Desa el fitxer (extreu-lo del ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Actualitza el contingut del recurs des del fitxer" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Aquest no és un fitxer \"real\", sinó un objecte situat dins d'un contenidor " "ZIP. Per fer servir aquesta funció cal que hi hagi un fitxer amb el mateix " "nom a la carpeta on es troba el fitxer ZIP." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Activitats" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Seqüències" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Mediateca" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Gestió de les Imatges i altres recursos emprats en el projecte." #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Creació i modificació de les activitats del projecte" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Creació i modificació de seqüències d'activitats" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Títol:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Títol del projecte" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Projecte" #: edit_project_tooltip msgid "Edit project properties" msgstr "Edició de les propietats del projecte" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Descripció:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Descripció general del projecte" #: edit_project_area msgid "Areas:" msgstr "Àrees:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Àrees curriculars a les quals s'orienta el projecte" #: edit_project_level msgid "Levels:" msgstr "Nivells:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Nivells i cicles educatius als quals s'adreça el projecte" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descriptors:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descriptors del projecte (separats per comes)" #: edit_project_languages msgid "Languages:" msgstr "Idiomes:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Idiomes emprats en el projecte" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Canvia l'idioma seleccionat" #: edit_project_languages_add msgid "Add language" msgstr "Afegeix un idioma" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Codis d'idioma ISO-639:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autors/es:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Persones que han contribuït a la creació del projecte" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nom:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "Correu electrònic:" #: edit_project_author_rol msgid "Rol:" msgstr "Rol:" #: edit_project_author_organization msgid "Organization:" msgstr "Organització:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Comentaris:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nom de l'autor/a (camp obligatori)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Adreça de correu electrònic de l'autor/a (opcional)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Rol de la persona en el projecte: autor/a, col·laborador/a, dibuixos, " "sons... (camp opcional)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Escola, universitat, associació... (camp opcional)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Pàgina web personal (camp opcional)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Altres característiques (camp opcional)" #: edit_project_author_info msgid "Author info:" msgstr "Dades de l'autor/a:" #: edit_project_author_add msgid "Add author to list" msgstr "Afegeix un autor a la llista" #: edit_project_author_edit msgid "Edit author info" msgstr "Modifica les dades de l'autor/a" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nom:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nom de l'escola" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "Correu electrònic:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Adreça de correu electrònic de l'escola" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Adreça web de l'escola" #: edit_project_org_address msgid "Address:" msgstr "Adreça:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Adreça postal de l'escola" #: edit_project_org_pc msgid "PC:" msgstr "CP:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Codi postal" #: edit_project_org_city msgid "City:" msgstr "Localitat:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Localitat de l'escola" #: edit_project_org_country msgid "Country:" msgstr "País:" #: edit_project_org_state msgid "State:" msgstr "Estat:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Comentaris:" #: edit_project_org msgid "School/s:" msgstr "Centre/s:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Escoles i altres institucions que han participat en el projecte" #: edit_project_org_info msgid "Organization info:" msgstr "Dades de l'organització:" #: edit_project_org_add msgid "Add organization" msgstr "Afegir una nova organització" #: edit_project_org_edit msgid "Edit organization data" msgstr "Modificar les dades de l'organització" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Estat, país, federació..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Estat federal, nacionalitat, comunitat, regió..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Altres dades..." #: edit_project_rev_date msgid "Date:" msgstr "Data:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Data de la revisió" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autors/es:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autors/es de la revisió" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Descripció:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Breu descripció dels canvis realitzats" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Comentaris:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Informació addicional" #: edit_project_rev msgid "Revisions:" msgstr "Revisions:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Historial de les principals modificacions realitzades al projecte" #: edit_project_rev_add msgid "Add revision record" msgstr "Afegir un registre de revisió" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Modificació de les dades de la revisió" #: edit_project_rev_info msgid "Revision data" msgstr "Dades de la revisió" #: edit_media_objects msgid "objects" msgstr "objectes" #: edit_media_object msgid "object" msgstr "objecte" #: edit_evsounds_start msgid "Start of activity:" msgstr "Inici d'activitat:" #: edit_evsounds_click msgid "Click on object:" msgstr "Fer clic a un objecte:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Acció errònia:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Acció correcta:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Activitat acabada amb errors:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Activitat acabada correctament:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Error: La descripció no es pot deixar en blanc" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Edita els sons d'esdeveniment" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Sons d'esdeveniment:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Assigna sons específics per a cada esdeveniment del JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Sons d'esdeveniment:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Assigna sons específics per a cada esdeveniment del JClic" #: edit_evsounds_default msgid "default sound" msgstr "so per defecte" #: edit_evsounds_disabled msgid "disabled" msgstr "desactivat" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Activa o desactiva el so per aquest esdeveniment" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Cliqueu per a seleccionar un so per aquest esdeveniment, o desmarqueu per emprar el " "so per defecte" #: action_newProject_caption msgid "New project..." msgstr "Nou projecte..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Crea un nou projecte JClic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Des de:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Valor mínim de l'operand" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Fins a:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Valor màxim de l'operand" #: edit_arith_op_with msgid "With:" msgstr "Amb:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Si es marca, l'operand pot tenir també aquest valor" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Un de la llista:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Llista de possibles valors de l'operand" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Decimals:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Nombre de decimals de l'operand" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (enter)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#,#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#,##" #: edit_arith_firstOp msgid "First operand" msgstr "Primer operand" #: edit_arith_secondOp msgid "Second operand" msgstr "Segon operand" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 pel JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operacions:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Seleccioneu el tipus d'operacions a efectuar" #: edit_arith_operations_plus msgid "Plus" msgstr "Sumes" #: edit_arith_operations_minus msgid "Minus" msgstr "Restes" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Multiplicacions" #: edit_arith_operations_divide msgid "Divide" msgstr "Divisions" #: edit_arith_unknown msgid "Unknown:" msgstr "Incògnita:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Seleccioneu l'element que farà d'incògnita" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "La incògnita és el resultat" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "La incògnita és el segon operand" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "El primer operand és la incògnita" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "L'operació és la incògnita" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Escriu l'expressió començant pel resultat" #: edit_arith_result msgid "Result:" msgstr "Resultat:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Sense \"portar-ne\"" #: edit_arith_result_random msgid "Random" msgstr "Aleatori" #: edit_arith_result_asc msgid "Ascending" msgstr "Ascendent" #: edit_arith_result_order msgid "Order by result:" msgstr "Ordena per resultat:" #: edit_arith_result_desc msgid "Descending" msgstr "Descendent" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Evitar duplicats" #: edit_arith_cond msgid "Conditions:" msgstr "Condicions:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indiferent" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "El primer operand ha de ser més gran que el segon" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "El primer operand ha de ser menor que el segon" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Altres condicions" #: edit_autocp msgid "Automatic content generator:" msgstr "Generador automàtic de contingut:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" "Selecció del tipus de generador automàtic de contingut per aquesta activitat." #: edit_autocp_block msgid "Content generator" msgstr "Generador de contingut" #: edit_autocp_btn msgid "Settings..." msgstr "Configuració..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Configura els paràmetres del generador de contingut" #: edit_data msgid "Edit data" msgstr "Edició de dades" #: edit_act msgid "Activity edit" msgstr "Edició de l'activitat" #: edit_acp msgid "Content provider edit" msgstr "Edició del generador de contingut" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Error en crear el generador automàtic de contingut!" #: edit_project_author_group msgid "Creation" msgstr "Creació" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Descripció" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interfície d'usuari" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Descripció:" #: m_Edit msgid "Edit" msgstr "Edita" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "V*" #: edit_act_newActivity msgid "New activity..." msgstr "Nova activitat..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "M#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Insereix" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Visualitza" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Projecte" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Edita les propietats del projecte" #: action_editMedia_caption msgid "Media" msgstr "Mediateca" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Edita la biblioteca de recursos multimèdia del projecte" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Activitats" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Edita les activitats" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Seqüències" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Edita les seqüències d'activitats" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "El projecte actual ha estat modificat. Voleu desar els canvis?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descriptors" #: edit_media_new msgid "New media object..." msgstr "Nou objecte multimèdia..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Afegeix una imatge o un objecte multimèdia a la mediateca" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Llindar de puntuació:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Vés per aquest camí quan la puntuació global sigui igual o superior a..." #: edit_seq_time msgid "Time threshold:" msgstr "Llindar de temps:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Per seguir aquest camí cal haver realitzat les activitats en un temps " "inferior a..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "" "Segueix aquest camí sempre que la puntuació global sigui inferior a..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Segueix aquest camí sempre que el temps emprat en les activitats sigui " "superior a..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Salts condicionals" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Especifica salts que seran executats només si es donen determinades " "condicions" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Indica les condicions per saltar a un nivell superior" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Salt inferior:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Salt superior:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Indica les condicions per saltar a un nivell inferior" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Acció assignada al botó d'avançar" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Acció assignada al botó de retrocedir" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Indica el destí del salt" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Acció a realitzar" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Activitat associada a aquest element de seqüència" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Etiqueta emprada per referir-se a aquest element de seqüència (camp opcional)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Descripció de l'element de seqüència (camp opcional)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Activa o desactiva el botó de pas d'activitat" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Avançar automàticament en acabar l'activitat" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Nombre de segons a esperar abans de realitzar el pas automàtic" #: edit_color_dlgTitle msgid "Select color" msgstr "Selecció del color" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Si us plau, espereu mentre es canvia el nom del recurs..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Amplada:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Amplada de les cel·les (en píxels)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Alçada:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Alçada de les cel·les (en píxels)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Paraules amagades:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Llista de les paraules que s'han amagat al plafó" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Emprar el plafó B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "Fes servir un segon plafó, que es mostrarà a mesura que es trobin les " "paraules" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Selecció del tipus de generador de formes del plafó" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Nombre de columnes del plafó" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Nombre de files del plafó" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Separadors transparents" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Mostra els separadors (cel·les negres) com a forats transparents" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Barreges:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Nombre de vegades que es barrejaran les peces" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Copia atributs a..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Atributs" #: edit_act_copy_dest msgid "Apply to:" msgstr "Aplica a:" #: edit_act_copy_style_main msgid "Main window" msgstr "Finestra principal" #: edit_act_copy_style_play msgid "Play window" msgstr "Finestra de joc" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Activitats a modificar:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Copia atributs" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Copia a altres activitats alguns dels atributs de l'activitat actual" #: edit_new_project_name msgid "Project name:" msgstr "Nom del projecte:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Nom curt i descriptiu del projecte" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nom del fitxer:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nom del fitxer del projecte, sense extensió" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Carpeta:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nom de la carpeta on es guardarà el projecte" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Navega..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Creació d'un nou projecte JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Error: Tant el projecte com el fitxer i la carpeta han de tenir noms vàlids." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "En aquesta carpeta ja hi ha un altre projecte Clic3.0 o JClic. Per evitar " "confusions es recomana mantenir cada projecte en una carpeta independent, " "tot i que això no és un requisit imprescindible. Realment voleu crear el nou " "projecte en aquesta carpeta?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Error: Ha estat impossible crear la carpeta que heu indicat!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "No heu seleccionat cap activitat! Per fer servir aquesta funció cal " "seleccionar a la llista l'activitat o activitats a les quals s'aplicaran els " "atributs indicats." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Copiant atributs a:" #: edit_act_copy_margin msgid "Margin" msgstr "Marge" #: edit_act_copy_bgColor msgid "Background color" msgstr "Color de fons" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Degradat" #: edit_act_copy_bgImage msgid "Background image" msgstr "Imatge de fons" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Vora" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Fons transparent" #: edit_act_copy_position msgid "Position" msgstr "Posició" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Missatges" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Estil del missatge inicial" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Estil del missatge final" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Estil del missatge d'error" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Informes" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Incloure l'activitat als informes" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Enregistrar accions" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interfície d'usuari" #: edit_act_copy_skin msgid "Skin" msgstr "Entorn visual" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Sons d'esdeveniment" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Comptadors" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Comptador de temps" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Temps màxim" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Comptador d'intents" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Nombre màxim d'intents" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Comptador d'encerts" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Nombre de vegades que cal barrejar" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Botons" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Botó d'ajuda" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Botó d'informació" #: edit_act_copy_grids msgid "Grids" msgstr "Plafons" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Estil del plafó A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Estil del plafó B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Estil dels plafons de text" #: edit_act_copy_text msgid "Text activities" msgstr "Activitats de text" #: edit_act_copy_fontFace msgid "Font face" msgstr "Tipus de lletra" #: edit_act_copy_fontSize msgid "Font size" msgstr "Mida de lletra" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Estil de lletra" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Color del text principal" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Color de les incògnites" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Color dels errors" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Espai entre tabuladors" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Estil del missatge previ" #: edit_act_changeType msgid "Change activity type" msgstr "Canvia el tipus d'activitat" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Nom complet de la classe que es farà servir per construir l'activitat " "(usuaris avançats!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Altres..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Els usuaris/es avançats/es poden crear també altres tipus d'activitats JClic " "no registrades. Escriviu a sota el nom complet de la classe, precedida pel " "del paquet (per exemple: \"com.acme.activities.FooActivity\"). Les noves " "activitats han d'estendre edu.xtec.jclic.Activity, i han de ser accessibles " "al carregador de classes de la màquina virtual de Java." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nom de l'activitat:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Cada activitat ha de tenir un nom únic en el projecte" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Atenció: El " "canvi de tipus pot comportar la pèrdua d'alguns objectes i atributs de " "l'activitat que s'està editant. Feu servir aquesta funció amb " "cura!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Ubicació del codi JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" "URL que apunta a una carpeta on estiguin ubicats els fitxers de programa i " "els scripts del JClic" #: applet_prev_text msgid "HTML code before:" msgstr "Codi HTML previ:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Text o codi HTML que apareixerà abans de l'applet" #: applet_post_text msgid "HTML code after:" msgstr "Codi HTML posterior:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Text o codi HTML que apareixerà després de l'applet" #: applet_size msgid "Applet size:" msgstr "Mida de l'applet:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Amplada i alçada de l'applet, en valor absolut o percentual." #: applet_page_title msgid "Page title:" msgstr "Títol de la pàgina:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Text que es mostrarà a dalt de la finestra del navegador" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "La pàgina web \"%s\" ha estat creada amb èxit." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Voleu obrir-la ara amb el navegador?" #: action_createHTML_caption msgid "Create web page..." msgstr "Crea una pàgina web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Creació d'una pàgina HTML amb un applet JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "Crea una pàgina HTML amb un applet que contingui el projecte actual" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nom del fitxer:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nom del fitxer HTML que es crearà" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Valors per defecte emprats en la creació de pàgines web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Color de fons:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Color de fons de la pàgina web" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Centrat" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Situa l'applet centrat horitzontalment" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Amplada de l'applet (en valor absolut o percentual)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Alçada de l'applet (en valor absolut o percentual)" #: applet_exitUrl msgid "On exit, go to:" msgstr "En sortir, anar a:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL cap on es redirigirà la navegació en sortir del JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Marc d'informació:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "Nom del marc emprat per mostrar el contingut lligat al botó \"informació\"" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Crea un instal·lador del projecte..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Crea un fitxer d'instal·lació del projecte per al JClic player" #: installer_caption msgid "Edit project installer script" msgstr "Edició del fitxer d'instal·lació del projecte" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Títol:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Títol del projecte que es mostrarà a l'assistent d'instal·lació" #: installer_authors msgid "Autors:" msgstr "Autors/es:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autors/es del projecte (text curt)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Carpeta:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Nom de carpeta que suggerirà l'assistent d'instal·lació" #: installer_files msgid "Files to be copied:" msgstr "Fitxers a copiar:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Fitxers que es copiaran durant la instal·lació" #: installer_files_available msgid "Available files" msgstr "Fitxers disponibles" #: installer_files_selected msgid "Selected files" msgstr "Fitxers seleccionats" #: installer_files_add msgid ">> add >>" msgstr ">> afegeix >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Afegeix el fitxer seleccionat a la llista" #: installer_files_remove msgid "<< remove <<" msgstr "<< treu <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Treu el fitxer seleccionat de la llista" #: installer_button msgid "Launch button" msgstr "Botó d'activació" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Propietats del botó que es mostrarà a la biblioteca de projectes" #: installer_button_project msgid "Main project:" msgstr "Projecte principal:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Projecte JClic associat al botó" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Etiqueta:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Breu etiqueta de text, que apareixerà dins del botó" #: installer_button_icon msgid "Icon:" msgstr "Icona:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Imatge que mostrarà el botó. Deixeu-ho en blanc per mostrar la icona per " "defecte del JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Descripció" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Text d'ajuda emergent que mostrarà el botó" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Error: Cal indicar el títol del projecte" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Error: Cal indicar el nom de la carpeta on s'instal·larà el projecte" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Error: No heu seleccionat cap fitxer" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Error: Cal indicar el text del botó d'activació" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Error: El projecte assignat al botó d'activació no es troba a la llista de " "fitxers a copiar" #: applet_page_full msgid "Full-page applet" msgstr "L'applet ocupa tota la pàgina" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "L'applet té unes dimensions específiques" #: edit_text_align_left msgid "Align text left" msgstr "Alinear el text a l'esquerra" #: edit_text_align_center msgid "Center text" msgstr "Text centrat" #: edit_text_align_right msgid "Align text right" msgstr "Alinear el text a la dreta" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Crea una incògnita o suprimeix-la" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Insereix una cel·la" #: edit_text_act_content msgid "Content" msgstr "Contingut" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Estil" #: edit_cell_size msgid "Cell size:" msgstr "Dimensions:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Les següents activitats mai no arribaran a executar-se, ja que no " "apareixen a cap seqüència d'activitats del projecte:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "Els següents objectes de la mediateca no es fan servir directament en cap " "activitat:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "Voleu afegir-les al final de la darrera sequència d'activitats?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Voleu eliminar-los?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Retirada d'objectes multimèdia no utilitzats" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Activitats òrfenes" #: edit_media_refreshAll msgid "Update all media content" msgstr "Actualitza el contingut de tots els recursos" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Actualitza tots els recursos tornant a carregar els seus fitxers" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Actualitzant recursos..." #: edit_media_exportAll msgid "Export all media" msgstr "Exporta tots els recursos" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Enregistra en fitxers el contingut de tots els recursos" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Selecciona" #: edit_shape_addPoint msgid "Add point" msgstr "Afegeix un punt" #: edit_shape_deletePoint msgid "Delete" msgstr "Elimina" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Dibuixa un rectangle" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Dibuixa una el·lipse" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Dibuixa un polígon" #: edit_shape_toLine msgid "Convert to line" msgstr "Converteix en línia" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Converteix en corba de Bézier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Converteix en quàdrica" #: edit_shape_rLeft msgid "Rotate left" msgstr "Gira a l'esquerra" #: edit_shape_rRight msgid "Rotate right" msgstr "Gira a la dreta" #: edit_shape_expand msgid "Expand" msgstr "Expandeix" #: edit_shape_contract msgid "Contract" msgstr "Contreu" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Apropa" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Allunya" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Ajunta punts propers" #: edit_shape_showPoints msgid "Show points" msgstr "Mostra punts" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Mostra/Amaga els punts" #: edit_shape_gridSize msgid "Grid size:" msgstr "Reixeta:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Mostra o amaga la reixeta" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Radi de l'imant:" #: edit_shape_elements msgid "Defined elements" msgstr "Elements definits" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Nom de l'element seleccionat" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Radi d'acció de l'imant quan es troba activat" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Mida de la reixeta" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Activitat:" #: edit_mc_sequence msgid "Sequence:" msgstr "Seqüència:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Projecte:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Selecció de l'activitat" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Selecció de la seqüència" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Dades insuficients!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Color de les fletxes:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Color emprat per l'editor per dibuixar les fletxes (no és exacte, ja que es " "fa servir una màscara XOR de bits)" #: edit_act_editActivity msgid "Edit..." msgstr "Edita..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Edita l'activitat seleccionada" #: action_saveFileAs_caption msgid "Save as..." msgstr "Anomena i desa..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Desa el projecte amb un nom diferent" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Comportament" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Comportament" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Arrossega" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Arrossega els objectes en comptes d'unir-los amb una línia" #: edit_act_behavior_order msgid "Check solving order" msgstr "Comprova l'ordre de resolució" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Les caselles s'han de resoldre ordenadament" #: edit_act_scramble msgid "Scramble" msgstr "Barreja" #: action_importActivities_caption msgid "Import activities..." msgstr "Importa activitats..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importa activitats d'un altre projecte" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "El fitxer que heu seleccionat correspon al projecte actual. La importació " "d'activitats només es pot fer entre projectes diferents. Si us plau, " "seleccioneu un altre fitxer de projecte." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" "Seleccioneu una o més activitats per a importar-les al projecte actual:" #: import_importing msgid "Importing..." msgstr "S'està important..." #: import_checkdep msgid "Checking dependencies..." msgstr "S'estan comprovant les dependències..." #: import_impmedia msgid "Importing media\\:" msgstr "S'estan important recursos:" #: import_impact msgid "Importing activity\\:" msgstr "S'està important l'activitat:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Seleccioneu el projecte JClic del qual desitgeu importar activitats" #: edit_tagRep_tags msgid "Tag marks" msgstr "Marques d'etiqueta" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Marca d'inici:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Marca que indica inici d'etiqueta" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Marca d'acabament:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Marca que indica acabament d'etiqueta" #: edit_tagRep_file msgid "File" msgstr "Fitxer" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Fitxer o URL:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Nom o URL del fitxer que conté els valors que substituiran les etiquetes" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Codificació:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Tipus de codificació emprada en el fitxer" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Navega..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Navega pel sistema de fitxers" #: edit_tagRep_title msgid "Tag replacing" msgstr "Substitució d'etiquetes" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Neteja estils de text..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Atenció: Aquesta acció netejarà els atributs especials de caràcter aplicats " "al document, retornant-lo al seu estil principal. L'operació no es pot " "desfer. Voleu fer-ho?" #: img_max_size msgid "Maximum size of images:" msgstr "Mida màxima de les imatges:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Amplada màxima de les imatges que s'importen a la mediateca." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Alçada màxima de les imatges que s'importen a la mediateca." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "La imatge \"%s\" té unes dimensions de %s píxels, que excedeixen el màxim " "permès pel JClic Author (%s). Voleu redimensionar-la?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_cs.po000066400000000000000000002402441335566474600234320ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2011-10-02 07:47+0000\n" "Last-Translator: Zbyněk Schwarz \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Popis" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Název aktivity" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Název:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Popis aktivity" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Sestavy" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Zahrň aktivity v Sestavách" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Zahrň výsledky aktivity v uživatelských sestavách" #: edit_act_code msgid "Code:" msgstr "Kód" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "Volitelný kód se používá pro skupiny a vyhledávání v databázi zpráv." #: edit_act_reportActions msgid "Report user actions" msgstr "Report uživatelských akcí" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Zaznamenat detaily o všech akcích provedených uživateli" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Počítadla" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Počítadlo času" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Skrýt/zobrazit časové počítadlo" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Počítadlo pokusů" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Skrýt/zobrazit počítadlo pokusů" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Počítadlo skóre" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Skrýt/zobrazit počítadlo skóre." #: edit_act_maxTime msgid "Max time:" msgstr "Maximální čas:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Maximální čas k vyřešení činnosti, v sekundách, nebo 0 pro neomezenou dobu." #: edit_act_countdown msgid "Countdown" msgstr "Odpočet" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "Čítač začíná na maximální hodnotě, klesající na 0." #: edit_act_maxActions msgid "Max tries:" msgstr "Max pokusů:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Povolen maximální počet pokusů, nebo 0 pro neomezené pokusy." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Tlačítka" #: edit_act_helpBtn msgid "Help" msgstr "Nápověda" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Skrýt/zobrazit tlačítko pomoci" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Zobrazit řešení" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Ukázat tuto zprávu:" #: edit_act_infoBtn msgid "Information" msgstr "Informace" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Ukaž/Skryj informační tlačítko" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Zobratiz tuto internetovou adresu:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Vykonat tento příkaz:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "Adresu internetové stránky zobrazíte, když kliknete na info tlačítko" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Příkazová řádka bude spuštěnana při kliknutí na info tlačítko." #: edit_act_mainWindow msgid "Main window:" msgstr "Vlastní okno:" #: edit_act_gameWindow msgid "Game window:" msgstr "Herní okno:" #: edit_act_margin msgid "Margin:" msgstr "Okraj:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Horizontální a vertikální rozestup mezi vizuálními objekty." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Barva pozadí:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Změnit barvu pozadí." #: edit_gradient_startColor msgid "Start color:" msgstr "Spustit barvu:" #: edit_gradient_endColor msgid "End color:" msgstr "Konec barvy:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Výběr počáteční barvy" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Výběr konečné barvy" #: edit_gradient_cycles msgid "Cycles:" msgstr "Cykly:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Počet opakování přechodu na barevném povrchu" #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientace:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Spádová orientace, měřená ve stupních nad horizontálou" #: edit_act_gradient msgid "Gradient:" msgstr "Přechod:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Použijte spád barev" #: edit_color_opacity msgid "Opacity" msgstr "Průhlednost" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Nastavit hodnotu odstínu (krycí) barvy." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Přechod" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Použít výchozí hodnoty (nulový spád)" #: edit_act_image msgid "Image:" msgstr "Obrázek:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Popiska" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Název a popisek" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Dlaždice" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Vymalovat všechny plochy obrázkem, podle potřeby opakovat podél osy X a Y." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Náhled:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Okraj" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Nakreslit okrajovou čáru kolem okna" #: edit_act_transparent msgid "Transparent" msgstr "Průhledný" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "Okno má průhledné pozadí" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Šířka:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Výška:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Šířka objektu, měřená v pixelech" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Výška objektu, měřená v pixelech" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Ve středu" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "Objekt bude soustředěn v hlavním okně" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Úplná horizontální poloha" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Úplně svislé umístění" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Uživatelské rozhraní" #: edit_act_image_tooltip msgid "Select an image" msgstr "Zvolit obrázek" #: edit_act_text msgid "Text:" msgstr "Text:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Text musí být uveden v tomto objektu" #: edit_font_face msgid "Typeface:" msgstr "Písmo:" #: edit_font_size msgid "Size:" msgstr "Velikost:" #: edit_font_bold msgid "Bold" msgstr "Tučně" #: edit_font_italic msgid "Italic" msgstr "Kurziva" #: edit_font_underline msgid "Underline" msgstr "Podtržené" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Styl:" #: edit_cell_title msgid "Cell contents" msgstr "Obsah políčka" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Zprávy" #: edit_act_msg_initial msgid "Initial message:" msgstr "Počáteční zpráva:" #: edit_act_msg_final msgid "Final message:" msgstr "Konečná zpráva:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Předchozí zpráva:" #: edit_act_msg_error msgid "Error message:" msgstr "Chybová zpráva:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Zpráva se zobrazí při začátku aktivity" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Zpráva se zobrazí při dokončení aktivity" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Zpráva se zobrazí když činnost skončí s chybami" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Zpráva zobrazená před spuštěním činnosti (pouze v určitých typech činností)" #: edit_align msgid "Align:" msgstr "Zarovnat:" #: edit_act_textColor msgid "Text color:" msgstr "Barva textu:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Barva použitá pro vykreslení textu" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Barva stínu:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Barva použitá pro vykreslení stínu textu, pokud je použit" #: edit_act_shadow msgid "Shadow" msgstr "Stín" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Vykreslený text se stínem" #: edit_act_borderColor msgid "Border color:" msgstr "Barva ohraničení:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Barva použitá pro vykreslení ohraničení buňky" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Barva neaktivního stavu:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Barva použitá, když je buňka vypnutá" #: edit_act_altColor msgid "Alternative color:" msgstr "Alternativní barva:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Barva použitá pro vykreslení alternativního obsahu v řešených buňkách." #: edit_cell_marked msgid "Marked" msgstr "Označená" #: edit_cell_disabled msgid "Disabled" msgstr "Vypnuto" #: edit_cell_alt msgid "Alternative" msgstr "Alternativní" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Vnitřní okraj:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Množství prostoru mezi okrajem buňky a textem." #: edit_cell_borderWidth msgid "Border width:" msgstr "Šířka okraje:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Šířka tahu použitá k vykreslení standardního okraje" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Šířka zvýraznění:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Šířka tahu použitá k vykreslení okraje když je buňka označena nebo vybrána" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Náhled v \"alternativním\" stavu" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Náhled ve \"vypnutém\" stavu" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Náhled v \"označeném\" stavu" #: edit_act_testAction msgid "Preview activity" msgstr "Náhled činnosti" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Náhled a test činnosti" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Popisek" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Název a popis činnosti" #: edit_act_panels_options msgid "Options" msgstr "Volby" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Nastavení činnosti" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Okno" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Vzhled, velikost a umístění okna činnosti" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Zprávy" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Obsah zpráv o činnosti" #: edit_act_panels_panel msgid "Panel" msgstr "Panel" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Obsah panelu" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Styl" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Nastavit barvu, písmo a velikost buňky" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Styl:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Vyvarovat se textu překrývající obrázek" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Pokusit se vyvarovat textu překrývající obrázek" #: edit_media_exists_1 msgid "The file" msgstr "Soubor" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "již existuje v médiální knihovně!" #: edit_act_shaper msgid "Shaper:" msgstr "Formovač:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Chyba formovače:" #: edit_act_num_cols msgid "Columns:" msgstr "Sloupce:" #: edit_act_num_rows msgid "Rows:" msgstr "Řádky:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Výška zubu:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Šířka zubu:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Náhodné rozdělení" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Vlastnosti formovače" #: edit_act_panels_text msgid "Text" msgstr "Text" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Text činnosti" #: action_saveFile_caption msgid "Save..." msgstr "Uložit..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Uložit aktuální projekt" #: action_docTree_caption msgid "Document tree..." msgstr "Strom dokumentu..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Zobrazit dokument projektu jako strom" #: edit_docTree_title msgid "Document tree" msgstr "Strom dokumentu" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Odkazováno od:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Varování:

Tentorojekt je " "propojen s jinými projekty.
Chcete si odkazy prohlédnout a načíst všechny " "související soubory?

(Při importu činností Clic 3.0 je doporučeno " "odpovědět ANO)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Typ:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Neznámý" #: edit_mc_type_sound msgid "Play sound" msgstr "Přehrát zvuk" #: edit_mc_type_video msgid "Play video" msgstr "Přehrát video" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Přehrát MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Přehrát zvukové CD" #: edit_mc_type_record msgid "Record sound" msgstr "Zaznamenat zvuk" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Přehrát nahraný zvuk" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Jít na aktivitu" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Jít na sekvenci" #: edit_mc_type_run_external msgid "Run program" msgstr "Spustit program" #: edit_mc_type_url msgid "Show URL" msgstr "Zobrazit URL" #: edit_mc_type_exit msgid "End" msgstr "Konec" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Zpět" #: edit_mc_level msgid "Priority level:" msgstr "Úroveň priority:" #: edit_mc_file msgid "File:" msgstr "Soubor:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parametry:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Z:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Do:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Max. délka:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Nahrávací páska:" #: edit_mc_stretch msgid "Stretch size" msgstr "Velikost roztažení" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Umístění:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Z:" #: edit_mc_location_from_box msgid "Cell" msgstr "Buňka" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Okno" #: edit_mc_location_from_frame msgid "Frame" msgstr "Okno" #: edit_mc_loop msgid "Loop playback" msgstr "Přehrávání smyčky" #: edit_mc_autostart msgid "Auto start" msgstr "Automatický start" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Chytit myš" #: edit_mc_title msgid "Multimedia and active content" msgstr "Multimédia a aktivní obsah" #: edit_mc_label msgid "Active content:" msgstr "Aktivní obsah:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Výběr multimediálního objektu" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Knihovna médií" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Vystředěno nad buňkou" #: edit_mc_pos_window msgid "Centered over window" msgstr "Vystředěno nad oknem" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Určete pozici:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Nesprávná struktura stromu nebo data!" #: edit_act_panels_controls msgid "Controls" msgstr "Ovládání" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Možnosti pro tlačítka a počítadla" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Typ:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Rozvržení mřížky:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Vzájemná poloha panelů A a B" #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Obrácené rozlišení" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "Činnost je vyřešena, když všechny přidělené prvky z \"B\" se shodují." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Zobrazit všechny šipky" #: edit_act_alt msgid "Alternative content:" msgstr "Alternativní obsah:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Obsah zobrazený ve vyřešených buňkách a nepřidělených buňkách." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Upravit alternativní obsah" #: edit_act_grid msgid "Grid" msgstr "Mřížka" #: edit_act_grid_A msgid "Grid A" msgstr "Mřížka A" #: edit_act_grid_B msgid "Grid B" msgstr "Mřížka B" #: edit_act_grid_layout msgid "Layout" msgstr "Rozvržení" #: edit_act_grid_relationship msgid "Relationship" msgstr "Vztah" #: edit_seq_activity_header msgid "activity" msgstr "aktivita" #: edit_seq_tag_header msgid "tag" msgstr "značka" #: edit_seq_jump_header msgid "jump to" msgstr "přeskočit na" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Aktivita:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Popisek:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Popis:" #: edit_seq_auto msgid "Move on automatically" msgstr "Posunout automaticky" #: edit_seq_delay msgid "Delay:" msgstr "Prodleva:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Další" #: edit_seq_action_back msgid "Go bak" msgstr "Jít zpět" #: edit_seq_action_jump msgid "Jump to..." msgstr "Přeskočit na..." #: edit_seq_action_stop msgid "Stop" msgstr "Zastavit" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Vrátit" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Ukončit JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Šipka dopředu:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Šipka dozadu:" #: edit_seq_action msgid "Action:" msgstr "Akce:" #: edit_seq_button_enabled msgid "Show button" msgstr "Zobrazit tlačítko" #: edit_seq_project msgid "JClic Project:" msgstr "JClic projekt:" #: edit_act_absolute msgid "Absolute position" msgstr "Absolutní pozice" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "Objekt bude umístěn v zadaných souřadnicích X a Y" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Umístění:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Nový prvek sekvence..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Vložit nový prvek do sekvence činnosti" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Vyberte, prosím, aktivitu pro nový prvek sekvence." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "Nelze vytvořit nový prvek sekvence bez činnosti!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Tento projekt nemá žádné činnosti! Nelze vytvořit prvky sekvence bez " "prázdného objektu." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Cíl skoku:" #: edit_seq_jump_title msgid "Jump target" msgstr "Cíl skoku" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Přidat novou činnost do projektu" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Typ činnosti:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Název:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Vyberte, prosím, typ činnosti pro vytvoření a zadejte její název:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Musíte zvolit typ činnosti!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Musíte zadat název pro činnosti!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Nelze vytvořit akivitu!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Jméno třídy Java:" #: edit_text_act_format msgid "Format" msgstr "Formát" #: edit_text_act_answer msgid "Answer" msgstr "Odpověď" #: edit_text_act_popup msgid "Pop up" msgstr "Vyskočit" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Platné odpovědi" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Přidat nový prvek seznamu" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Upravit vybraný prvek seznamu" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Smazat vybraný prvek seznamu" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Přesunout nahoru" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Přesunout dolů" #: edit_list_newValue msgid "New text:" msgstr "Nový text:" #: edit_list_addElement msgid "Add new list element" msgstr "Přidat nový prvek seznamu" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Změnit vybraný text" #: edit_text_act_target msgid "Target" msgstr "Cíl" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Max. délka:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Maximální počet znaků v odpovědi" #: edit_text_act_fillingChar msgid "Filling character" msgstr "Vyplňující znak" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Znak použitý k určení mezery" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Počáteční délka:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "Počet vyplňujících znaků, které budou zobrazeny na začátku činnosti." #: edit_text_act_iniText msgid "Initial text:" msgstr "Počáteční text:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Text zobrazený v mezeře na začátku činnosti." #: edit_text_act_list msgid "Show a list of options:" msgstr "Zobrazit seznam možností:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "Zobrazit seznam možností, z nichž uživatel musí jednu vybrat." #: edit_text_act_check_title msgid "Correction options" msgstr "Možnosti opravy" #: edit_text_act_popup_no msgid "No pop up" msgstr "Žádné vyskakování" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Vyskočit automaticky" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Vyskočit při chybách" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Vyskočit pomocí F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Typ:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Zpoždění vyskočení:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Max. čas:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Pouze zvuk" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "Musíte zvolit část textu, abyste vytvořili nový cílový text!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "Cílový text nemůže obsahovat odstavec ani záložky" #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Cíle nemohou být vnořené!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Cíle nemohou obsahovat buňky" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Barva papíru:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Upravit styly dokumentu..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Hlavní styl:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Mezera záložky:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Mezery mezi značkami záložek:" #: edit_text_act_colors msgid "Colors:" msgstr "Barvy:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Cílové barvy:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Chybové barvy:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Náhled:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Standardní text" #: edit_text_act_styleSample_target msgid "target" msgstr "cíl" #: edit_text_act_styleSample_error msgid "error" msgstr "chyba" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "standardní text" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "standardní text." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Varování: Tato činnost potlačí současný zvolený cíl. Chcete pokračovat?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Předchozí obrazovka..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Nezobrazovat žádný text před začátkem činnosti" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Zobrazit dokončený text cvičení" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Zobrazit tento text:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Max. čas:" #: edit_text_act_edit_target msgid "Target..." msgstr "Cíl..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Zobrazit tlačítko opravy" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Text tlačítka:" #: edit_text_act_checkCase msgid "Match case" msgstr "Shoda s velikostí písmen" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Zvažovat znaménka a zvláštní znaky" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Zvažovat interpunkční znaménka" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Povolit opakované mezery" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Kritéria" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Přesunout na dakší cíl při vyplnění" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Přesunout se pouze po správném odhadu" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Ukázat chyby písmeno po písmeně" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Parametry algoritmu analýzy:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Kroky:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Pole průzkumu:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Zkontrolovat" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Analýza odpovědi" #: edit_text_act_check_bt msgid "Correction..." msgstr "Oprava..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Tlačítko opravy" #: edit_text_act_checkProgress msgid "Progress" msgstr "Postup" #: edit_text_act_typeBtn msgid "Type..." msgstr "Typ..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Seřadit odstavce" #: edit_text_act_orderWords msgid "Order words" msgstr "Seřadit slova" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Zamíchat slova mezi paragrafy" #: edit_text_act_type_title msgid "Activity type" msgstr "Typ činnosti" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "Tato činnost smaže všechny existující cíle. Chcete pokračovat?" #: edit_text_act_identWords msgid "Identify words" msgstr "Rozpoznat slova" #: edit_text_act_identChars msgid "Identify characters" msgstr "Rozpoznat znaky" #: edit_media_change_name msgid "Change name..." msgstr "Změnit název..." #: edit_media_change_file msgid "Change file..." msgstr "Uměnit soubor..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Uložit do souboru ZIP" #: edit_media_type msgid "Media type:" msgstr "Typ média:" #: edit_media_size msgid "File size:" msgstr "Velikost souboru:" #: edit_media_show_type msgid "Files of type:" msgstr "Soubory typu:" #: edit_media_preview msgid "Preview media" msgstr "Náhled média" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Náhled zdroje média" #: edit_media_rename msgid "Change resource name" msgstr "Změnit název zdroje" #: edit_media_rename_title msgid "Rename" msgstr "Přejmenovat" #: edit_media_rename_prompt msgid "New name:" msgstr "Nové jméno:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Neplatný název zdroje!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Zdroj s tímto jménem již existuje! Každý zdroj musí mít jedinečné jméno." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Neplatný soubor!" #: err_media_chfile_different msgid "File must be of same type" msgstr "Soubor musí být stejného typu" #: edit_media_font_error msgid "Unable to load font!" msgstr "Nelze načíst písmo!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Uložit soubor (extrahovat ze ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Aktualizovat obsah média ze souboru" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Toto není \"skutečný\" soubor, ale objekt umístěný v kontejneru ZIP. Abyste " "tuto funkci mohli použít, musí být ve složce, kde se nachází soubor ZIP, " "umístěn soubor se stejným názvem." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Činnosti" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Sledy" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Knihovna médií" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Spravovat obrázky a soubory jiných médií použitých v projektu" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Vytvořit a upravit činnosti projektu" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Upravit a vytvořit sled činností" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Název:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Název projektu" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Projekt" #: edit_project_tooltip msgid "Edit project properties" msgstr "Upravit vlastnosti projektu" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Popis:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Celkový popis projektu" #: edit_project_area msgid "Areas:" msgstr "Oblasti:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Oblasti učiva projektu" #: edit_project_level msgid "Levels:" msgstr "Úrovně:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Vzdělávací úrovně projektu" #: edit_project_descriptors msgid "Descriptors:" msgstr "Popisovače:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Popisovače projektu (oddělené čárkou)" #: edit_project_languages msgid "Languages:" msgstr "Jazyky:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Jazyky použité v projektu" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Změnit vybraný jazyk" #: edit_project_languages_add msgid "Add language" msgstr "Přidat jazyk" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Kódy jazyků ISO-639:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autoři:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Lidé zapojení do vytváření tohoto projektu" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Jméno:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_author_rol msgid "Rol:" msgstr "Role:" #: edit_project_author_organization msgid "Organization:" msgstr "Organizace:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Komentáře:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Jméno autora (povinné)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "E-mail autora (nepovinné)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Role osoby v projektu: autor, spolupracovník, kresby, zvuky... (nepovinné)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Škola, univerzita, asociace... (nepovinné)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Osobní internetová stránka (nepovinné)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Pole pro další informace (nepovinné)" #: edit_project_author_info msgid "Author info:" msgstr "Informace o autorovi:" #: edit_project_author_add msgid "Add author to list" msgstr "Přidat autora do seznamu" #: edit_project_author_edit msgid "Edit author info" msgstr "Upravit informace o autorovi" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Jméno:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Jméno školy" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "e-mailová adresa školy" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Internetová stránka školy" #: edit_project_org_address msgid "Address:" msgstr "Adresa:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Poštovní adresa" #: edit_project_org_pc msgid "PC:" msgstr "PC:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "PSČ" #: edit_project_org_city msgid "City:" msgstr "Město:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Město školy" #: edit_project_org_country msgid "Country:" msgstr "Země:" #: edit_project_org_state msgid "State:" msgstr "Stát:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Komentáře:" #: edit_project_org msgid "School/s:" msgstr "Škola/y:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Škola nebo jiná instituce zapojená do tohoto projektu" #: edit_project_org_info msgid "Organization info:" msgstr "Informao organizaci:" #: edit_project_org_add msgid "Add organization" msgstr "Přidat organizaci" #: edit_project_org_edit msgid "Edit organization data" msgstr "Upravit data organizace" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Země, federace, sdružení..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Federální stát, komunita, kraj..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Jiné informace..." #: edit_project_rev_date msgid "Date:" msgstr "Datum:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Datum revize" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autoři:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autoři revize" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Popis:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Krátký popis provedených změn" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Komentáře:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Jiné důležité informace" #: edit_project_rev msgid "Revisions:" msgstr "Revize:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Historie hlavních změn provedených v projektu" #: edit_project_rev_add msgid "Add revision record" msgstr "Přidat záznam revize" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Upravit záznam revize" #: edit_project_rev_info msgid "Revision data" msgstr "Data revize" #: edit_media_objects msgid "objects" msgstr "objekty" #: edit_media_object msgid "object" msgstr "objekt" #: edit_evsounds_start msgid "Start of activity:" msgstr "Začátek činnosti:" #: edit_evsounds_click msgid "Click on object:" msgstr "Kliknutí na objekt:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Chybná činnost:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Správna činnost:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Činnost dokončena s chybami:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Činnost dokončena v pořádku:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Chyba: Popisné pole nemohou být zanechána prázdná!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Upravit zvuky událostí" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Zvuky událostí:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Nastavit určité zvuky pro každou událost JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Zvuky událostí:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Nastavit určité zvuky pro každou událost JClic" #: edit_evsounds_default msgid "default sound" msgstr "výchozí zvuk" #: edit_evsounds_disabled msgid "disabled" msgstr "zakázáno" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Povolit nebo zakázat zvuk pro tuto událost" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Klikněte pro vybrání zvuku pro tuto událost, nebo odškrtněte pro použití " "výchozího zvuku" #: action_newProject_caption msgid "New project..." msgstr "Nový projekt..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Vytvořit nový projekt JClic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Od:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Minimální hodnota operátoru" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Do:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Maximální hodnota operátoru" #: edit_arith_op_with msgid "With:" msgstr "S:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Pokud je zaškrtnuto, operátor může také mí tuto hodnotu" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Jeden ze seznamu:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Seznam možných hodnot pro operátora" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Desetinná čísla:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Počet desetinných čísel operandu" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (celé číslo)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "První operand" #: edit_arith_secondOp msgid "Second operand" msgstr "Druhý operand" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 pro JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operace:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Vyberte druh operací k provedení" #: edit_arith_operations_plus msgid "Plus" msgstr "Plus" #: edit_arith_operations_minus msgid "Minus" msgstr "Mínus" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Násobit" #: edit_arith_operations_divide msgid "Divide" msgstr "Dělit" #: edit_arith_unknown msgid "Unknown:" msgstr "Neznámá:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Vyberte položku, která se bude chovat jako neznámá" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "Výsledek je neznámý" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "Druhý operátor je neznámá" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "První operátor je neznámá" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "Operátor je neznámá" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Napsat výsledek na začátku výrazu" #: edit_arith_result msgid "Result:" msgstr "Výsledek:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Nepřenášet" #: edit_arith_result_random msgid "Random" msgstr "Náhodné" #: edit_arith_result_asc msgid "Ascending" msgstr "Vzestupně" #: edit_arith_result_order msgid "Order by result:" msgstr "Seřadit podle výsledku:" #: edit_arith_result_desc msgid "Descending" msgstr "Sestupně" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Zamezit duplikátům" #: edit_arith_cond msgid "Conditions:" msgstr "Podmínky:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Neutrální" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "První operátor musí být větší než druhý" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "První operátor musí být menší než druhý" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Jiné podmínky" #: edit_autocp msgid "Automatic content generator:" msgstr "Automatický generátor obsahu:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "Vyberte typ automatického generátoru obsahu pro tuto činnost." #: edit_autocp_block msgid "Content generator" msgstr "Generátor obsahu" #: edit_autocp_btn msgid "Settings..." msgstr "Nastavení..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Nastavení poskytovatele obsahu" #: edit_data msgid "Edit data" msgstr "Upravit data" #: edit_act msgid "Activity edit" msgstr "Úprava činnosti" #: edit_acp msgid "Content provider edit" msgstr "Úprava poskytovatele obsahu" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Chyba při vytváření poskytovatele obsahu!" #: edit_project_author_group msgid "Creation" msgstr "Tvorba" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Popis" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Uživatelské rozhraní" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Popis:" #: m_Edit msgid "Edit" msgstr "Upravit" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Nová činnost..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Vložit" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Zobrazit" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Projekt" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Upravit nastavení projektu" #: action_editMedia_caption msgid "Media" msgstr "Média" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Upravit knihovnu multimédií projektu" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Činnosti" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Upravit činnosti" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Sledy" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Upravit sledy činností" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "Současný projekt byl změněn. Chcete změny uložit?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Popisovače" #: edit_media_new msgid "New media object..." msgstr "Nový mediální objekt..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Přidat nový obrázek nebo multimediální objekt do knihovny" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Hranice skóre:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "Jít touto cestou, pokud je globální skóre rovno nebo větší než..." #: edit_seq_time msgid "Time threshold:" msgstr "Časová hranice:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Aby se šlo touto cestou, strávený čas na činnostech musí být menší než..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Jít touto cestou, pokud je globální skóre menší než..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "Jít touto cestou, když je čas strávený na činnostech větší než..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Podmíněné skoky" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Nastavit zvláštní skoky, které budou provedeny pouze za určitých podmínek" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Nastavit podmínky pro skok na vyšší úroveň" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Skok níže:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Skok výše:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Nastavit podmínky pro skok na nižší úroveň" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Přidělená činnost pro tlačítko \"další\"" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Přidělená činnost pro tlačítko \"předchozí\"" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Nastavit cíl skoku" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Činnosti, které budou provedeny" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Přidělená činnost pro tento prvek sekvence" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "Značka použitá pro odkaz na tento prvek sekvence (nepovinné pole)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Popis prvku sekvence (nepovinné pole)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Povolit nebo zakázat tlačítko šipky" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Při dokončení činnosti automaticky pokračovat" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Koli kvteřin počkat, před automatickým pokračováním" #: edit_color_dlgTitle msgid "Select color" msgstr "Vyberte barvu" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Počkejte prosím, než bude zdroj přejmenován..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Šířka:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Šířka buňky (v pixelech)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Výška:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Výška buňky (v pixelech)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Skrytá slova:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Seznam skrytých slov umístěných v panelu" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Použít panel B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "Obsah druhého panelu bude zobrazován jak budou slova nacházena" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Vyberte typ tvarovače, který bude v panelu použit" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Počet sloupců v panelu" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Počet řádků v panelu" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Průhledné oddělovače" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Chovat se k oddělovačům (černým rámečkům) jako k průhledným dírám" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Míchá\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Kolikrát zamíchat" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Kopírovat vlastnosti do..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Vlastnosti" #: edit_act_copy_dest msgid "Apply to:" msgstr "Použít na:" #: edit_act_copy_style_main msgid "Main window" msgstr "Hlavní okno" #: edit_act_copy_style_play msgid "Play window" msgstr "Okno hry" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Činnosti ke změně:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Kopírovat vlastnosti" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Kopírovat vlastnosti současné činnosti do jiných činností" #: edit_new_project_name msgid "Project name:" msgstr "Název projektu:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Krátký, popisný název projektu" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Název souboru:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Název souboru projektu, bez přípony" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Složka:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Název složky, kde bude projekt uložen" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Procházet…" #: edit_new_project_title msgid "Create new JClic project" msgstr "Vytvořit nový projekt JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "Chyba: Projekt, soubor a složka musí mít platné, neprázdné názvy." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Tato složka již obsahuje jiný projekt Clic 3.0 nebo JClic. Aby se zabránilo " "zmatkům, je doporučeno, aby byl každý projekt udržován v samostatné složce, " "ale není to pevné pravidlo. Opravdu chcete nový projekt vytvořit v této " "složce?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Chyba: Nelze vytvořit určenou složku!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Chyba: Nebyla vybrána žádná činnost! Abyste mohli tuto funkci použít, musíte " "vybrat ze seznamu činnosti či činností v kterých budou určené vlastnosti " "použity." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Kopíruji vlastnosti do:" #: edit_act_copy_margin msgid "Margin" msgstr "Okraj" #: edit_act_copy_bgColor msgid "Background color" msgstr "Barva pozadí" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Přechod" #: edit_act_copy_bgImage msgid "Background image" msgstr "Obrázek pozadí" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Ohraničení" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Průhledné pozadí" #: edit_act_copy_position msgid "Position" msgstr "Pozice" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Zprávy" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Styl úvodní zprávy" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Styl konečné zprávy" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Styl chybové zprávy" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Hlášení" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Zahrnout činnost v záznamech" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Zaznamenat činnosti" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Uživatelské rozhraní" #: edit_act_copy_skin msgid "Skin" msgstr "Vzhled" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Zvuky událostí" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Počítadla" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Počítadlo času" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Max. čas" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Počítadlo pokusů" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Max. pokusů" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Počítadlo skóre" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Kolikrát zamíchat" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Tlačítka" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Tlačítko nápovědy" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Tlačítko informací" #: edit_act_copy_grids msgid "Grids" msgstr "Mřížky" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Styl mřížky A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Styl mřížky B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Styl textových mřížek" #: edit_act_copy_text msgid "Text activities" msgstr "Textové činnosti" #: edit_act_copy_fontFace msgid "Font face" msgstr "Řez písma" #: edit_act_copy_fontSize msgid "Font size" msgstr "Velikost písma" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Styl písma" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Hlavní barva textu" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Vyberte projekt JClic z které budou činnosti importovány" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Chybové barvy" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Mezera karty" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Styl předchozí zprávy" #: edit_act_changeType msgid "Change activity type" msgstr "Změnit typ činnosti" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Úplný název třídy, která bude použita k sestavení činnosti (pouze pro " "pokročilé uživatele!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Další…" #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Pokročilí uživatelé mohou také vytvořit neregistrované typy činností JClic. " "Stačí níže napsat úplný název třídy a balík jako předponu (např. " "\"com.acme.činnosti.činnost\"). Třídy činnosti musí rozšiřovat " "edu.xtec.jclic.Activity, a musí být přístupné zavaděči tříd JVM." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Název činnosti:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Každá třída musí mít v projektu jedinečné jméno" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Varování: " "Změna typu činnosti může způsobit ztrátu některých vlastností a objektů " "současné činnosti. Používejte opatrně!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Umístění kódu JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "URL odkazující na složku se soubory a skripty programu JClic" #: applet_prev_text msgid "HTML code before:" msgstr "Kód HTML vepředu:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Text nebo kód HTML, který bude umístěn před apletem" #: applet_post_text msgid "HTML code after:" msgstr "Kód HTML vzadu:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Text nebo kód HTML, který bude umístěn za apletem" #: applet_size msgid "Applet size:" msgstr "Velikost apletu:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Šířka a výška apletu, v absolutních nebo procentuálních hodnotách." #: applet_page_title msgid "Page title:" msgstr "Název stránky:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Text, který bude zobrazen v horní části okna prohlížeče" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "Internetová stránka \"%s\" byla úspěšně vytvořena." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Chcete ji nyní v prohlížeči otevřít ?" #: action_createHTML_caption msgid "Create web page..." msgstr "Vytvořit internetovou stránku..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Vytvorení stránky HTML pomocí apletu JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "Vytvořit stránku HTML pomocí apletu obsahující současný projekt" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Název souboru:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Název vytvářeného HTML souboru" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Aplet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Výchozí hodnoty použité pro vytvoření stránky" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Barva pozadí:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Barva pozadí stránky HTML" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Na střed" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Umístit aplet vodorovně na střed" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Šířka apletu (absolutní nebo procentuální)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Výška apletu (absolutní nebo procentuální)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Při ukončení přejít na:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL, kam bude navigace přesměrována po ukončení JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Název informačního rámečku" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Název rámečku, který je použit k zobrazení obsahu souvisejícího s tlačítkem " "\"info\"" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Vytvořit instalátor projektu..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Vytvořit skript instalátoru projektu pro přehrávač JClic" #: installer_caption msgid "Edit project installer script" msgstr "Upravit skript instalátoru projektu" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Název:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Název projektu, který bude zobrazen v průvodci instalací" #: installer_authors msgid "Autors:" msgstr "Autoří:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autor/ři projektu (krátky text)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Složka:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Název složky, který bude navrhnut průvodcem instalací" #: installer_files msgid "Files to be copied:" msgstr "Soubory ke zkopírování:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Soubory ke zkopírování instalátorem" #: installer_files_available msgid "Available files" msgstr "Dostupné soubory" #: installer_files_selected msgid "Selected files" msgstr "Zvolené soubory" #: installer_files_add msgid ">> add >>" msgstr ">> přidat >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Přidat vybraný soubor do seznamu" #: installer_files_remove msgid "<< remove <<" msgstr "<< odstranit <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Odstranit vybraný soubor ze seznamu" #: installer_button msgid "Launch button" msgstr "Tlačítko spuštění" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Vlastnosti tlačítka, který bude zobrazen v kniovně projektů" #: installer_button_project msgid "Main project:" msgstr "Hlavní projekt:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Projekt JClic, který bude tlačítkem spuštěn" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Štítek:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Krátký textový štítek, který bude zobrazen uvnitř tlačítka" #: installer_button_icon msgid "Icon:" msgstr "Ikona:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Obrázek, který bude použit jako ikona tlačítka. Nechejte prázdné pro použití " "výchozí ikony JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Popis" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Popisek, který bude tlačítkem zobrazen" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Chyba: Chybí název projektu" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Chyba: Chybí název složky" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Chyba: Nebyly vybrány žádné soubory" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Chyba: Chybí textový štítek tlačítka spuštění" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Chyba: Projekt přidělený ke tlačítku spuštění není v seznamu souborů ke " "zkopírování" #: applet_page_full msgid "Full-page applet" msgstr "Aplet na celou stránku" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "Aplet s určitými rozměry" #: edit_text_align_left msgid "Align text left" msgstr "Zarovnat text doleva" #: edit_text_align_center msgid "Center text" msgstr "Text na střed" #: edit_text_align_right msgid "Align text right" msgstr "Zarovnat text doprava" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Vytvořit nebo odstranit cíl" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Vložit buňku" #: edit_text_act_content msgid "Content" msgstr "Obsah" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Styl" #: edit_cell_size msgid "Cell size:" msgstr "Velikost buňky:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Následující činnosti se neobjevili v žádných pořadích činností , takže " "nebudou nikdy zobrazeny:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "Následující objekty médií nejsou v žádné činnosti použity přímo:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "Chcete je přidat na konec posledního pořadí činností?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Chcete je odstranit?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Odstranění nepoužitých objektů médií" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Osiřelé činnosti" #: edit_media_refreshAll msgid "Update all media content" msgstr "Aktualizovat všechen mediální obsah" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Aktualizovat všechny objekty médií, znovu načtením jejich souborů" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Aktualizace médií..." #: edit_media_exportAll msgid "Export all media" msgstr "Exportovat všechna média" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Veškerý obsah prvků médií uložit do souborů" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Vybrat" #: edit_shape_addPoint msgid "Add point" msgstr "Přidat bod" #: edit_shape_deletePoint msgid "Delete" msgstr "Smazat" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Nakreslit obdelník" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Nakreslit elipsu" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Nakreslit mnohoúhelník" #: edit_shape_toLine msgid "Convert to line" msgstr "Převést na čáru" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Převést na Beziérovu křivku" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Převést na kvadratickou křivku" #: edit_shape_rLeft msgid "Rotate left" msgstr "Otočit doleva" #: edit_shape_rRight msgid "Rotate right" msgstr "Otočit doprava" #: edit_shape_expand msgid "Expand" msgstr "Zvětšit" #: edit_shape_contract msgid "Contract" msgstr "Zmenšit" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Přiblížit" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Oddálit" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Spojit nejbližší body" #: edit_shape_showPoints msgid "Show points" msgstr "Zobrazit body" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Zobrazit/Skrýt body" #: edit_shape_gridSize msgid "Grid size:" msgstr "Velikost mřížky:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Zobrazit / Skrýt mřížku" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Poloměr magnetu:" #: edit_shape_elements msgid "Defined elements" msgstr "Určené prvky" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Název tvoleného prvku" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Dosah magnetu, pokud je povolen" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Velikost mřížky" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Činnost:" #: edit_mc_sequence msgid "Sequence:" msgstr "Pořadí:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Projekt:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Zvolte činnost" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Zvolte pořadí" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Nedostatečná data:" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Barva šipky:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Barva použitá editorem pro vykreslení šípek (nepřesné, protože je použita " "XOR maska bitu)" #: edit_act_editActivity msgid "Edit..." msgstr "Upravit..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Upravit vybranou činnost" #: action_saveFileAs_caption msgid "Save as..." msgstr "Uložit jako..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Uložit současný projekt pod jiným názvem" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Chování" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Chování" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Táhnout objekty" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Táhnout objekty místo použití spojovací čáry" #: edit_act_behavior_order msgid "Check solving order" msgstr "Zkontrolovat pořadí řešení" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Buňky musí být řešeny popořadě" #: edit_act_scramble msgid "Scramble" msgstr "Zamíchat" #: action_importActivities_caption msgid "Import activities..." msgstr "Importovat činnosti..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importovat činnosti z jiného projektu" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "Vybraný soubor odpovídá současnému projektu. Činnosti mohou být importovány " "pouze mezi různými projekty. Prosíme, vyberte soubor jiného projektu." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" "Vyberte jednu nebo více činnosti pro import do současného projektu\\:" #: import_importing msgid "Importing..." msgstr "Importování..." #: import_checkdep msgid "Checking dependencies..." msgstr "Kontrola závislostí..." #: import_impmedia msgid "Importing media\\:" msgstr "Import médií\\:" #: import_impact msgid "Importing activity\\:" msgstr "Import činností\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Vyberte projekt JClic z které budou činnosti importovány" #: edit_tagRep_tags msgid "Tag marks" msgstr "Označení značek" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Počáteční označení\\:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Označení použité na začátku značek" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Konečné označení\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Označení použité na konci značek" #: edit_tagRep_file msgid "File" msgstr "Soubor" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Soubor nebo URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "Název nebo URL souboru obsahující hodnoty, které nahradí značky" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Znaková sada\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Kódování znaků použité v souboru" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Procházet..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Procházet souborový systém" #: edit_tagRep_title msgid "Tag replacing" msgstr "Nahrazení značek" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Vyčistit styly textu..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Varování\\: Tato činnost vyčistí určené vlastnosti znaků použité v " "dokumentu, což ho nastaví zpátky na jeho hlavní styl. Tuto činnost nelze " "vrátit zpět. Chcete toto provést?" #: img_max_size msgid "Maximum size of images:" msgstr "Maximální velikost obrázků:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Maximální šírka obrázků importovaných do knihovny médií." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Maximální výška obrázků importovaných do knihovny médií." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "Obrázek \"%s\" má velikost %s pixelů. To překračuje maximálně povolenou " "velikost od Autora JClic (%s). Chcete velikost změnit?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_de.po000066400000000000000000002404641335566474600234210ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2014-07-06 15:34+0000\n" "Last-Translator: Tobias Bannert \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Beschreibung" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Name der Übung" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Name:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Beschreibung der Übung" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Berichte" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Aktuelle Übung in Bericht aufnehmen" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Ergebnis dieser Übung in Userbericht aufnehmen" #: edit_act_code msgid "Code:" msgstr "Code:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "Optionaler Code zum Gruppieren und Suchen in der Berichtdatenbank." #: edit_act_reportActions msgid "Report user actions" msgstr "Bericht über Aktionen der User" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Details aller User-Aktionen aufzeichnen" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Zähler" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Zeituhr:" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Zeituhr anzeigen/verbergen" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Versuche zählen" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Zähler anzeigen/verbergen" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Ergebniszähler" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Ergebniszähler anzeigen/verbergen" #: edit_act_maxTime msgid "Max time:" msgstr "Zeitlimit:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Zeitlimit zum Lösen der Aufgabe in Sekunden oder 0 für unbegrenzte " "Übungsdauer eingeben." #: edit_act_countdown msgid "Countdown" msgstr "Countdown" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "Zähler zählt vom Maximalwert auf Null herunter" #: edit_act_maxActions msgid "Max tries:" msgstr "Höchstanzahl zulässiger Versuche:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "" "Höchstanzahl von Versuchen oder 0 für unbegrenzte Anzahl von Versuchen " "eingeben" #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Knöpfe" #: edit_act_helpBtn msgid "Help" msgstr "Hilfe" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Hilfeknopf anzeigen/verbergen" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Lösung anzeigen" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Diese Nachricht anzeigen:" #: edit_act_infoBtn msgid "Information" msgstr "Information" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Infoknopf anzeigen/verbergen" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Folgenden URL anzeigen:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Folgenden Befehl ausführen:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "Beim Klick auf den Infoknopf wird diese Internetseite angezeigt" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Befehl ausführen, bei Klick auf den Infoknopf." #: edit_act_mainWindow msgid "Main window:" msgstr "Hauptfenster:" #: edit_act_gameWindow msgid "Game window:" msgstr "Spielfenster:" #: edit_act_margin msgid "Margin:" msgstr "Rahmen:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Horizontaler und vertikaler Abstand zwischen angezeigten Objekten." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Hintergrundfarbe:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Hintergrundfarbe ändern." #: edit_gradient_startColor msgid "Start color:" msgstr "Startfarbe:" #: edit_gradient_endColor msgid "End color:" msgstr "Endfarbe :" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Auswahl der Startfarbe" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Auswahl der Endfarbe" #: edit_gradient_cycles msgid "Cycles:" msgstr "Zyklen:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Anzahl der Wiederholungen des Farbverlaufs auf der Arbeitsfläche" #: edit_gradient_orientation msgid "Orientation:" msgstr "Ausrichtung:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Winkel des Farbverlaufs über der Horizontalen" #: edit_act_gradient msgid "Gradient:" msgstr "Farbverlauf:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Farbverlauf anwenden" #: edit_color_opacity msgid "Opacity" msgstr "Transparenz" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Wert für transparente alpha-Farbe:." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Farbverlauf" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Standardeinstellungen verwenden (Null Gradient)" #: edit_act_image msgid "Image:" msgstr "Grafik:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Beschreibung" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Name und Beschreibung" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Kacheln" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Gesamte Oberfläche mit Grafik kacheln, die sich entlang der XY-Achse so oft " "wie benötigt wiederholt." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Vorschau:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Rahmen" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Linie als Fensterrahmen" #: edit_act_transparent msgid "Transparent" msgstr "Transparent" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "Fenster mit transparentem Hintergrund" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Breite:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Höhe:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Breite des Objekts in Pixel" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Objekthöhe in Pixel" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Zentriert" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "Objekt wird oberhalb des Hauptfensters zentriert" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Absolute horizontale Position" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Absolute vertikale Position" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Benutzeroberfläche" #: edit_act_image_tooltip msgid "Select an image" msgstr "Grafik auswählen" #: edit_act_text msgid "Text:" msgstr "Text:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Angezeigter Text innerhalb des Objekts" #: edit_font_face msgid "Typeface:" msgstr "Schriftart:" #: edit_font_size msgid "Size:" msgstr "Schritgröße:" #: edit_font_bold msgid "Bold" msgstr "Fett" #: edit_font_italic msgid "Italic" msgstr "Kursiv" #: edit_font_underline msgid "Underline" msgstr "Unterstrich" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Stil:" #: edit_cell_title msgid "Cell contents" msgstr "Zellinhalt" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Nachrichten" #: edit_act_msg_initial msgid "Initial message:" msgstr "Nachricht am Beginn:" #: edit_act_msg_final msgid "Final message:" msgstr "Nachricht am Ende:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Vorhergehende Nachricht:" #: edit_act_msg_error msgid "Error message:" msgstr "Fehlermeldung:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Angezeigte Nachricht beim Starten der Übung" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Angezeigte Nachricht am Ende der Übung" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Angezeigter Text, wenn Übung fehlerhaft beendet wurde" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Nachricht, die vor dem Starten der Übung angezeigt wird (nur bei einigen " "Übungsvarianten)" #: edit_align msgid "Align:" msgstr "Ausrichtung:" #: edit_act_textColor msgid "Text color:" msgstr "Textfarbe:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Gewünschte Textfarbe" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Farbe des Schattens:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Farbe für Textschatten, wenn verfügbar" #: edit_act_shadow msgid "Shadow" msgstr "Schatten" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Schrift mit Schatten versehen" #: edit_act_borderColor msgid "Border color:" msgstr "Rahmenfarbe:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Farbe des Zellrahmens" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Farbe für Inaktivität:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Farbe für deaktivierte Zellen" #: edit_act_altColor msgid "Alternative color:" msgstr "Alternative Farbe:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "Farbe der alternativen Inhalte in bearbeiteten Zellen" #: edit_cell_marked msgid "Marked" msgstr "Markiert" #: edit_cell_disabled msgid "Disabled" msgstr "Deaktiviert" #: edit_cell_alt msgid "Alternative" msgstr "Alternative" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Innerer Rahmen:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Abstand zwischen Zellrand und Text." #: edit_cell_borderWidth msgid "Border width:" msgstr "Rahmenbreite:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Breite für Standardrand" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Breite des Textmarkers:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "Strichbreite des Rahmens wenn die Zelle markiert der ausgewählt ist." #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Vorschau: alternative Ansicht" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Vorschau: deaktiviert" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Vorschau: markiert" #: edit_act_testAction msgid "Preview activity" msgstr "Vorherige Übung" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Übung in der Vorschau testen" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Beschreibung" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Titel und Beschreibung der Übung" #: edit_act_panels_options msgid "Options" msgstr "Optionen" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Übungsoptionen" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Fenster" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Erscheinungsbild, Größe und Position des Übungsfensters" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Nachrichten" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Inhalt der Nachrichten" #: edit_act_panels_panel msgid "Panel" msgstr "Leiste" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Inhalt der Tafel" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Stil" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Farbe, Schriftart und Schriftgröße der Zelle einstellen" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Stil:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Text darf Bild nicht überlagern" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Versuchen Sie zu vermeiden, dass der Text die Grafik überlagert" #: edit_media_exists_1 msgid "The file" msgstr "Datei" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "bereits in der Mediathek vorhanden" #: edit_act_shaper msgid "Shaper:" msgstr "Formengenerator:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Fehler bei Formauswahl:" #: edit_act_num_cols msgid "Columns:" msgstr "Spalten:" #: edit_act_num_rows msgid "Rows:" msgstr "Zeilen:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Zahnhöhe:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Zahnbreite:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Zufallsprinzip" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Formeigenschaften" #: edit_act_panels_text msgid "Text" msgstr "Text" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Text der Übung" #: action_saveFile_caption msgid "Save..." msgstr "Speichern..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Aktuelles Projekt speichern" #: action_docTree_caption msgid "Document tree..." msgstr "Dokumentstruktur..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Projektdokumente in Baumansicht anzeigen" #: edit_docTree_title msgid "Document tree" msgstr "Dokumentenstruktur" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Quellenangabe:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Achtung:

Projekt ist mit " "anderen Projekten verlinkt.
Möchten Sie alle verlinkten Dateien " "importieren?

(Es wird empfohlen mitJA zu antworten, wenn Clic 3.0-" "Übungen importiert werden)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Typ:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Unbekannt" #: edit_mc_type_sound msgid "Play sound" msgstr "Sound abspielen" #: edit_mc_type_video msgid "Play video" msgstr "Video abspielen" #: edit_mc_type_midi msgid "Play MIDI" msgstr "MIDI abspielen" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Audio CD abspielen" #: edit_mc_type_record msgid "Record sound" msgstr "Sound aufnehmen" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Soundaufnahme abspielen" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Zu Übung gehen" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Zu Sequenz gehen" #: edit_mc_type_run_external msgid "Run program" msgstr "Programm starten" #: edit_mc_type_url msgid "Show URL" msgstr "URL anzeigen" #: edit_mc_type_exit msgid "End" msgstr "Ende" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Zurück" #: edit_mc_level msgid "Priority level:" msgstr "Prioritätsstufe:" #: edit_mc_file msgid "File:" msgstr "Datei:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parameter:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Aus:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Bis:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Maximale Länge:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Aufnahme:" #: edit_mc_stretch msgid "Stretch size" msgstr "Komprimieren wenn zu groß" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Position:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Aus:" #: edit_mc_location_from_box msgid "Cell" msgstr "Zelle" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Fenster" #: edit_mc_location_from_frame msgid "Frame" msgstr "Frame" #: edit_mc_loop msgid "Loop playback" msgstr "Sound Durchlauf" #: edit_mc_autostart msgid "Auto start" msgstr "Autostart" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Mausefalle" #: edit_mc_title msgid "Multimedia and active content" msgstr "Multimedia und Active X-Files" #: edit_mc_label msgid "Active content:" msgstr "Aktiver Inhalt:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Multimedia Objekt auswählen" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Mediathek" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Zentriert über Zelle" #: edit_mc_pos_window msgid "Centered over window" msgstr "Zentriert über Fenster" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Position angeben:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Falscher Pfad oder Datei!" #: edit_act_panels_controls msgid "Controls" msgstr "Kontrolle" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Optionen für Knöpfe und Zähler" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Typ:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Erscheinungsbild der Tafel:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Relative Position der Tafeln A und B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Umgekehrte Auflösung" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "Die Übung ist erfolgreich beendet, wenn alle angegebenen Elemente von \"B\" " "richtig zugeordnet wurden." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Alle Pfeile anzeigen" #: edit_act_alt msgid "Alternative content:" msgstr "Alternativer Text:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "" "Angezeigte Inhalte der zu bearbeitenden und nicht zu bearbeitenden Zellen" #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Alternativen Text bearbeiten" #: edit_act_grid msgid "Grid" msgstr "Tafel" #: edit_act_grid_A msgid "Grid A" msgstr "Tafel A" #: edit_act_grid_B msgid "Grid B" msgstr "Tafel B" #: edit_act_grid_layout msgid "Layout" msgstr "Layout" #: edit_act_grid_relationship msgid "Relationship" msgstr "Verhältnis" #: edit_seq_activity_header msgid "activity" msgstr "Übung" #: edit_seq_tag_header msgid "tag" msgstr "Textmarke" #: edit_seq_jump_header msgid "jump to" msgstr "Gehe zu" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Übung:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Textmarke:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Beschreibung:" #: edit_seq_auto msgid "Move on automatically" msgstr "Automatisch zur nächsten Übung" #: edit_seq_delay msgid "Delay:" msgstr "Verzögerung:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Weiter" #: edit_seq_action_back msgid "Go bak" msgstr "Zurück" #: edit_seq_action_jump msgid "Jump to..." msgstr "Gehe zu..." #: edit_seq_action_stop msgid "Stop" msgstr "Stopp" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Zurück zu..." #: edit_seq_action_exit msgid "Exit JClic" msgstr "JClic verlassen" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Pfeil vorwärts:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Pfeil zurück:" #: edit_seq_action msgid "Action:" msgstr "Aktion:" #: edit_seq_button_enabled msgid "Show button" msgstr "Knopf anzeigen" #: edit_seq_project msgid "JClic Project:" msgstr "JClic Projekt:" #: edit_act_absolute msgid "Absolute position" msgstr "Absolute Position" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "Position des Objekts durch XY-Koordinaten definiert" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Position:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Neues Element der Lernsequenz..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Neues Element in Lernsequenz einfügen" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Übung für neues Element der Lernsequenz auswählen." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "Es kann keine neue Element der Lernsequenz ohne Übungen erstellt werden!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Projekt enthält keine Übungen. In einem leeren Projekt können keine " "Lernsequenzen erstellt werden." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Ziel:" #: edit_seq_jump_title msgid "Jump target" msgstr "Ziel" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Neue Übung zum Projekt hinzufügen" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Übungstyp:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Name:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "" "Wählen Sie einen Übungstyp aus und geben Sie einen Namen für die neue Übung " "ein:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Sie müssen einen Übungstyp auswählen!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Sie müssen einen Übungsnamen angeben!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Übung kann nicht erstellt werden!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Bezeichnung der Java-Klasse:" #: edit_text_act_format msgid "Format" msgstr "Format" #: edit_text_act_answer msgid "Answer" msgstr "Antwort" #: edit_text_act_popup msgid "Pop up" msgstr "Pop up-Fenster" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Gültige Antworten:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Neues Element aus der Liste hinzufügen" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Ausgewähltes Element bearbeiten" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Ausgewähltes Element aus der Liste löschen" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Hinauf verschieben" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Hinunter verschieben" #: edit_list_newValue msgid "New text:" msgstr "Neuer Text:" #: edit_list_addElement msgid "Add new list element" msgstr "Neues Element aus der Liste hinzufügen" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Textauswahl bearbeiten" #: edit_text_act_target msgid "Target" msgstr "Ziel" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Maximale Länge:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Höchstanzahl der Buchstaben in der Antwort" #: edit_text_act_fillingChar msgid "Filling character" msgstr "Schriftart für Lücken" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Schriftart zum Ausfüllen der Lücken auswählen" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Ausgangslänge:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "Anzahl der Buchstaben, die zu Beginn der Übung angezeigt werden." #: edit_text_act_iniText msgid "Initial text:" msgstr "Starttext:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Text, der bei Beginn der Übung in der Lücke angezeigt wird." #: edit_text_act_list msgid "Show a list of options:" msgstr "Liste mit Optionen anzeigen:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "Liste mit Optionen anzeigen, aus denen der User auswählen kann." #: edit_text_act_check_title msgid "Correction options" msgstr "Evaluationskriterien" #: edit_text_act_popup_no msgid "No pop up" msgstr "Keine Pop-up-Fenster" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Pop up-Fenster automatisch öffnen" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Pop up-Fenster bei Fehlern" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Pop up-Fenster mit F1 öffnen" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Typ:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Verzögerung vor Öffnen des Pop up-Fensters:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Max. Dauer:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Nur Sound" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "Textfragment auswählen um neuen Zieltext zu erstellen!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "Zieltext darf keinen Umbruch oder oder Einzug beinhalten" #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Verschachtelung nicht erlaubt!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Zieltext darf keine Tabelle beinhalten!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Hintergrundfarbe:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Dokumentlayout bearbeiten" #: edit_text_act_mainStyle msgid "Main style:" msgstr "Standardeigenschaften:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Tabulatorabstand:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Abstand zwischen Tabstopps:" #: edit_text_act_colors msgid "Colors:" msgstr "Farben:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Zielfarben:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Farbe für falsche Eingabe:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Voransicht:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Standardtext" #: edit_text_act_styleSample_target msgid "target" msgstr "Ziel" #: edit_text_act_styleSample_error msgid "error" msgstr "Fehler" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "Standardtext" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "Standardtext" #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Achtung: Dieser Schritt löscht das ausgewählte Ziel. Möchten Sie fortfahren?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Vorherige Ansicht..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Vor Übungsstart keinen Text anzeigen" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Kompletten Übungstext anzeigen" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Diesen Text anzeigen:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Max. Dauer:" #: edit_text_act_edit_target msgid "Target..." msgstr "Ziel..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "»Korrigieren«-Knopf anzeigen" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Knopftext:" #: edit_text_act_checkCase msgid "Match case" msgstr "Groß- und Kleinschreibung überprüfen" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Akzente und Sonderzeichen berücksichtigen" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Satzzeichen berücksichtigen" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Mehrfach-Leerstellen zulassen" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Kriterien" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Nach Ausfüllen zur nächsten Frage weitergehen" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Nur bei richtiger Antwort weiter" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Falsche Wörter buchstabieren" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Parameter der Algorhythmen analysieren:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Schritte:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Bearbeitungsfeld:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Check" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Analyse der Antworten" #: edit_text_act_check_bt msgid "Correction..." msgstr "Korrektur..." #: edit_text_act_checkButton msgid "Correction button" msgstr "»Korrigieren«-Knopf" #: edit_text_act_checkProgress msgid "Progress" msgstr "Fortschritt" #: edit_text_act_typeBtn msgid "Type..." msgstr "Typ..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Absätze ordnen" #: edit_text_act_orderWords msgid "Order words" msgstr "Wörter ordnen" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Wörter in Absätzen vermischen" #: edit_text_act_type_title msgid "Activity type" msgstr "Übungstyp" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Durch diesen Schritt löschen Sie alle aktuellen Zieldefinitionen. Wollen Sie " "fortfahren?" #: edit_text_act_identWords msgid "Identify words" msgstr "Wörter finden" #: edit_text_act_identChars msgid "Identify characters" msgstr "Buchstaben finden" #: edit_media_change_name msgid "Change name..." msgstr "Umbenennen..." #: edit_media_change_file msgid "Change file..." msgstr "Datei ändern..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Gezippt speichern" #: edit_media_type msgid "Media type:" msgstr "Medientyp:" #: edit_media_size msgid "File size:" msgstr "Dateigröße:" #: edit_media_show_type msgid "Files of type:" msgstr "Dateityp:" #: edit_media_preview msgid "Preview media" msgstr "Objekt in der Vorschau ansehen" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Mediendatei in der Vorschau ansehen" #: edit_media_rename msgid "Change resource name" msgstr "Datei umbenennen" #: edit_media_rename_title msgid "Rename" msgstr "Umbenennen" #: edit_media_rename_prompt msgid "New name:" msgstr "Neuer Name:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Ungültiger Dateiname!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Datei gleichen Namens bereits vorhanden. Jede Datei muss einen eigenen " "unverwechselbaren Namen besitzen." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Ungültiger Dateiname!" #: err_media_chfile_different msgid "File must be of same type" msgstr "Gleicher Dateityp erforderlich" #: edit_media_font_error msgid "Unable to load font!" msgstr "Schrift kann nicht geladen werden!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Datei speichern (entzippen)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Multimediadatei durch Datei aktualisieren" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Das ist keine \"echte\" Datei, sondern ein Objekt aus einem ZIP-Ordner. Um " "diese Anwendung nutzen zu können, muss eine gleichnamige Datei im selben " "Ordner wie die gezippte Datei befinden." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Übungen" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Sequenzen" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Mediathek" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Grafiken und andere Multimediadateien des Projekts verwalten" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Übungen zu Projekt erstellen und bearbeiten" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Lernsequenzen erstellen und bearbeiten" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Titel:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Projekttitel" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Projekt" #: edit_project_tooltip msgid "Edit project properties" msgstr "Projekteigenschaften bearbeiten" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Beschreibung:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Kurze Projektbeschreibung" #: edit_project_area msgid "Areas:" msgstr "Fächer:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Fächer:" #: edit_project_level msgid "Levels:" msgstr "Levels:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Lehrplanbezug des Projekts" #: edit_project_descriptors msgid "Descriptors:" msgstr "Schlüsselwörter:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Schlüsselwörter (durch Beistriche getrennt)" #: edit_project_languages msgid "Languages:" msgstr "Sprachen:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Projektsprachen" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Spracheinstellung ändern" #: edit_project_languages_add msgid "Add language" msgstr "Sprache hinzufügen" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "ISO-639 Sprachcodes:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autor/innen:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Projektteilnehmer/innen" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Name:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "e-Mail:" #: edit_project_author_rol msgid "Rol:" msgstr "Funktion:" #: edit_project_author_organization msgid "Organization:" msgstr "Organisation:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Kommentar:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Name des Autors/der Autorin (muss angegeben werden)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "e-Mail des Autors/der Autorin (kann frei gelassen werden)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Projektfunktion: Autor/in, Mitarbeiter/in, Zeichnungen, Sound ... (kann frei " "bleiben)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Schule, Universität, Verein ... (kann frei bleiben)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Private Homepage (kann frei gelassen werden)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Feld für weitere Informationen (kann frei bleiben)" #: edit_project_author_info msgid "Author info:" msgstr "Zum Autor/zu Autorin:" #: edit_project_author_add msgid "Add author to list" msgstr "Autor/in zur Liste hinzufügen" #: edit_project_author_edit msgid "Edit author info" msgstr "Autor Info bearbeiten" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Name:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Name der Schule" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "e-Mail:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "e-Mail Adresse der Schule" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Schulhomepage" #: edit_project_org_address msgid "Address:" msgstr "Adresse:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Postadresse:" #: edit_project_org_pc msgid "PC:" msgstr "PLZ:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Postleitzahl" #: edit_project_org_city msgid "City:" msgstr "Stadt:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Schulstandort" #: edit_project_org_country msgid "Country:" msgstr "Land:" #: edit_project_org_state msgid "State:" msgstr "Staat:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Kommentar:" #: edit_project_org msgid "School/s:" msgstr "Schule/n:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Am Projekt beteiligte Partnerschule/n oder -institution/en" #: edit_project_org_info msgid "Organization info:" msgstr "Infos zur Organisation:" #: edit_project_org_add msgid "Add organization" msgstr "Organisation hinzufügen" #: edit_project_org_edit msgid "Edit organization data" msgstr "Daten der Organisation bearbeiten" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Land, Bundesstaat, Bundesland..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Bundesland, Gemeinde, Region..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Zusatzinformationen..." #: edit_project_rev_date msgid "Date:" msgstr "Datum:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Überarbeitungsdatum" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autor/innen:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autor/innen der Überarbeitung" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Beschreibung:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Kurze Beschreibung der Änderungen" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Kommentar:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Zusätzliche Informationen" #: edit_project_rev msgid "Revisions:" msgstr "Überarbeitungen:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Protokoll der wichtigsten am Projekt vorgenommenen Änderungen" #: edit_project_rev_add msgid "Add revision record" msgstr "Überarbeitungsstatistik hinzufügen" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Überarbeitungsstatistik bearbeiten" #: edit_project_rev_info msgid "Revision data" msgstr "Überarbeitungsdatum" #: edit_media_objects msgid "objects" msgstr "Objekte" #: edit_media_object msgid "object" msgstr "Objekt" #: edit_evsounds_start msgid "Start of activity:" msgstr "Start der Übung:" #: edit_evsounds_click msgid "Click on object:" msgstr "Objekt anklicken:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Falsche Aktion:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Korrekte Aktion:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Übung fehlerhaft beendet:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Übung korrekt absolviert" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Fehler: Formularfeld muss ausgefüllt werden!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Ereignissounds bearbeiten" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Ereignissounds:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Spezielle Sounds für verschiedene Ereignisse einsetzen" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Ereignissounds:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Spezielle Sounds für jede JClic-Aktion" #: edit_evsounds_default msgid "default sound" msgstr "Standardsound" #: edit_evsounds_disabled msgid "disabled" msgstr "deaktiviert" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Sound für dieses Ereignis aktivieren oder deaktivieren." #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Ausgewählten Sound für dieses Ereignis auswählen oder Standardsound verwenden" #: action_newProject_caption msgid "New project..." msgstr "Neues Projekt..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Neues JClic-Projekt erstellen" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Von:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Mindestwert des Operators" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Bis:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Höchstwert des Operators" #: edit_arith_op_with msgid "With:" msgstr "Mit:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Wenn aktiv, kann der Operator auch diesen Wert haben" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Auswahl aus der Liste" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Anzeigen möglicher Werte des Operators" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Dezimalen:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Anzahl der Dezimalstellen des Operanden" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (integer)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "Erster Operand" #: edit_arith_secondOp msgid "Second operand" msgstr "Zweiter Operand" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 für JClic" #: edit_arith_operations msgid "Operations:" msgstr "Rechnungsarten:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Rechnungsart auswählen" #: edit_arith_operations_plus msgid "Plus" msgstr "Addieren" #: edit_arith_operations_minus msgid "Minus" msgstr "Subtrahieren" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Multiplizieren" #: edit_arith_operations_divide msgid "Divide" msgstr "Dividieren" #: edit_arith_unknown msgid "Unknown:" msgstr "Unbekannte:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Element auswählen, das eine Unbekannte sein soll" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "Resultat ist eine Unbekannte" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "Zweiter Operator ist eine Unbekannte" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "Erster Operator ist eine Unbekannte" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "Operation ist eine Unbekannte" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Ergebnis an den Anfang des Ausdrucks schreiben" #: edit_arith_result msgid "Result:" msgstr "Ergebnis" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Nicht übersteigen" #: edit_arith_result_random msgid "Random" msgstr "Zufallsprinzip" #: edit_arith_result_asc msgid "Ascending" msgstr "Aufsteigend" #: edit_arith_result_order msgid "Order by result:" msgstr "Nach Ergebnis sortieren:" #: edit_arith_result_desc msgid "Descending" msgstr "Absteigend" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Duplikate vermeiden" #: edit_arith_cond msgid "Conditions:" msgstr "Bedingungen:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Egal" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "Der erste Operator muss größer sein als der zweite" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "Der erste Operator muss kleiner sein als der zweite" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Andere Bedingungen" #: edit_autocp msgid "Automatic content generator:" msgstr "Automatischer Content-Generator:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "Content-Generator Typ für diese Übung auswählen." #: edit_autocp_block msgid "Content generator" msgstr "Content-Generator" #: edit_autocp_btn msgid "Settings..." msgstr "Einstellungen..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Einstellungen des Content-Providers konfigurieren" #: edit_data msgid "Edit data" msgstr "Daten bearbeiten" #: edit_act msgid "Activity edit" msgstr "Übung bearbeiten" #: edit_acp msgid "Content provider edit" msgstr "Content-Provider bearbeiten" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Fehler beim Eintragen des Content-Providers!" #: edit_project_author_group msgid "Creation" msgstr "Urheber" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Beschreibung" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Benutzeroberfläche" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Beschreibung:" #: m_Edit msgid "Edit" msgstr "Bearbeiten" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Neue Übung..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Einfügen" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Anzeigen" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Projekt" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Projekteinstellungen bearbeiten" #: action_editMedia_caption msgid "Media" msgstr "Multimedia" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Multimediadateien der Projektbibliothek bearbeiten" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Übungen" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Übungen bearbeiten" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Sequenzen" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Übungssequenzen bearbeiten" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "" "Am aktuellen Projekt wurden Änderungen vorgenommen. Änderungen speichern?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Schlüsselwörter" #: edit_media_new msgid "New media object..." msgstr "Neues Multimedia Objekt" #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Neue Grafik oder Multimediadatei zur Mediathek hinzufügen" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Punktelimit:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "Hier weiter, wenn Gesamtpunktezahl gleich oder höher als..." #: edit_seq_time msgid "Time threshold:" msgstr "Zeitlimit:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "Hier weiter nur wenn Übungsdauer nicht länger als..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Hier weiter, wenn Gesamtpunktezahl geringer als..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "Hier weiter, wenn Bearbeitungsdauer länger als..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "If-Anweisung" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "Spezielle Erfordernisse für Wechsel der Schwierigkeitsstufe angeben" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Voraussetzungen für Vorrücken auf höhere Stufe angeben" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Stufe tiefer:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Stufe höher:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Voraussetzungen für Wechsel auf tiefere Stufe angeben" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Dem »Weiter«-Knopf zugewiesene Aktion" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Dem »Zurück«-Knopf zugewiesene Aktion" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Ziel angeben" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Vorgeschriebene Aktion" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Diesem Teil der Sequenz zugewiesene Übung" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Textmarke dient zur Identifikation des Elements der Lernsequenz (kann frei " "bleiben)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Beschreibung des Elements der Lernsequenz (kann frei bleiben)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Pfeiltaste aktivieren/deaktivieren" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Automatisch zur nächsten Übung, wenn eine Übung beendet ist" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Wartezeit in Sekunden vor automatischem Wechsel" #: edit_color_dlgTitle msgid "Select color" msgstr "Farbe auswählen" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Datei wird umbenannt. Bitte warten..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Breite:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Zellbreite (in Pixel)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Höhe:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Zellhöhe (in Pixel)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Versteckte Wörter:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Liste der versteckten Wörter auf der Tafel anzeigen" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Tafel B verwenden" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "Der Inhalt einer zweiten Tafel wird angezeigt, sobald Wörter gefunden sind" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Form auswählen, die für die Anzeigetafel verwendet werden soll." #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Spaltenanzahl der Tabelle" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Zeilenanzahl der Tabelle" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Transparente Begrenzungen" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Begrenzungen (Blackboxes) als transparente Lücken anzeigen" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Versuche:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Erlaubte Mischversuche" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Eigenschaften in folgenden Ordner kopieren...." #: edit_act_copy_attributes msgid "Attributes" msgstr "Eigenschaften" #: edit_act_copy_dest msgid "Apply to:" msgstr "Anwenden auf:" #: edit_act_copy_style_main msgid "Main window" msgstr "Hauptfenster" #: edit_act_copy_style_play msgid "Play window" msgstr "Spielfenster" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Übungen, die bearbeitet werden sollen:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Eigenschaften der Kopie" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Eigenschaften der aktuellen Übung auf andere Übungen übertragen" #: edit_new_project_name msgid "Project name:" msgstr "Name des Projekts:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Kurzer, aussagekräftiger Name des Projekts" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Dateiname:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Name der Projektdatei ohne Dateierweiterung" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Ordner:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Name des Ordners, in dem das Projekt gespeichert werden soll" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Durchsuchen..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Neues JClic Projekt erstellen" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Fehler: Projekt, Datei und Ordner müssen gültige Bezeichnungen haben. " "Namenfelder dürfen nicht frei bleiben." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Dieser Ordner enthält bereits ein anderes Clic 3.0 oder JClic Projekt. Um " "Verwechslungen zu vermeiden, wird empfohlen, jedes einzelne Projekt in einem " "separaten Ordner zu speichern. Dies ist allerdings nicht verpflichtend. " "Möchten Sie das neue Projekt wirklich in diesem Ordner erstellen?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Fehler: Gewünschter Ordner kann nicht erstellt werden!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Fehler: Keine Übung ausgewählt! Um diese Funktion nützen zu können, müssen " "Sie aus der Liste die Aktivität(en) auswählen, auf die die gewünschten " "Eigenschaften angewendet werden sollen." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Eigenschaften in folgenden Ordner kopieren:" #: edit_act_copy_margin msgid "Margin" msgstr "Rand" #: edit_act_copy_bgColor msgid "Background color" msgstr "Hintergrundfarbe" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Farbverlauf" #: edit_act_copy_bgImage msgid "Background image" msgstr "Hintergrundbild" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Rahmen" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Transparenter Hintergrund" #: edit_act_copy_position msgid "Position" msgstr "Position" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Nachrichten" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Erscheinungsbild der Nachricht am Beginn" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Erscheinungsbild der Nachricht am Ende" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Erscheinungsbild der Fehlermeldungen" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Berichte" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Alle Aktionen in Berichte aufnehmen" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Aktionen aufzeichnen" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Benutzeroberfläche" #: edit_act_copy_skin msgid "Skin" msgstr "Skin" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Sounds:" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Zähler" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Zeituhr" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Maximale Dauer" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Versuche zählen" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Höchstanzahl zulässiger Versuche" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Zähler" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Mischversuche" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Knöpfe" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Hilfeknopf" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Infoknopf" #: edit_act_copy_grids msgid "Grids" msgstr "Tafeln" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Stil von Tafel A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Stil von Tafel B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Erscheinungsbild der Textfelder" #: edit_act_copy_text msgid "Text activities" msgstr "Textbasierte Übungen" #: edit_act_copy_fontFace msgid "Font face" msgstr "Schriftart" #: edit_act_copy_fontSize msgid "Font size" msgstr "Schriftgröße" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Schriftstil" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Standard Textfarbe" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Farbe der Zielelemente" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Anzeigefarbe der Fehler" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Tabstoppposition" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Erscheinungsbild der vorhergehenden Nachricht" #: edit_act_changeType msgid "Change activity type" msgstr "Übungstyp ändern" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Voller Name der Java-Klasse, die zum Erstellen der Übung verwendet wurde " "(nur für fortgeschrittene User!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Andere..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Fortgeschrittene User können auch eigene, unregistrierte Typen von JClic-" "Übungen erstellen. Schreiben Sie nur das Java Paket und den vollen Namen der " "Java-Klasse darunter (z.B. \"com.acme.activities.FooActivity\"). Übungs-" "Klassen müssen die Endung edu.xtec.jclic.Activity aufweisen und mit " "dem JVM classloader zu öffnen sein." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Name der Übung:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "" "Jede Übung muss einen eigenen, unverwechselbaren Namen innerhalb des " "Projekts besitzen" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Warning:Warnung: Durch das Ändern des Übungstyps können " "aktuelle Übungseigenschaften und Objekte verloren gehen. " "

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "JClic-Quellcode:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "URL verweist auf Folder mit JClic-Dateien und Skripts" #: applet_prev_text msgid "HTML code before:" msgstr "HTML-Code davor:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Text oder HTML-Code vor Erscheinen des Applets" #: applet_post_text msgid "HTML code after:" msgstr "HTML-Code danach:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Text oder HTML-Code nach Erscheinen des Applets" #: applet_size msgid "Applet size:" msgstr "Applet-Format:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Breite und Höhe des Applets (absolut oder in Prozenten)." #: applet_page_title msgid "Page title:" msgstr "Seitentitel:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Textanzeige in der Kopfzeile des Browserfensters" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "Webseite \"%s\" erfolgreich erstellt" #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Im Browser ansehen?" #: action_createHTML_caption msgid "Create web page..." msgstr "HTML-Seite erstellen..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "HTML-Seite mit JClic-Applet erstellen" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "HTML-Seite mit Applet erstellen, das das aktuelle Projekt enthält" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Dateiname:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Bezeichnung der HTML-Seite, die erstellt werden soll" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Standardeinstellungen bei der Erstellung von Webseiten verwenden" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Hintergrundfarbe:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Hintergrundfarbe der HTML-Seite" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Zentriert" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Java-Applet horizontal zentrieren" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Applet-Breite (absolut oder in Prozenten)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Applet-Höhe (absolut oder in Prozenten)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Nach dem Schließen folgende Datei aufrufen:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL, der nach dem Schließen von JClic geöffnet werden soll" #: applet_infoFrame msgid "Info frame name:" msgstr "Name des Info-Frames:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "Name des Rahmens, der geöffnet werden soll, um die Infos anzuzeigen." #: action_createInstaller_caption msgid "Create project installer..." msgstr "Project-Installer erstellen..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Projekt-Installer Script für JClic-Player erstellen" #: installer_caption msgid "Edit project installer script" msgstr "Projekt Installer Skript bearbeiten" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Titel:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Projekttitels, der von Installer angezeigt wird" #: installer_authors msgid "Autors:" msgstr "Autor/innen:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autor/innen des Projekts (Kurztext)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Ordner:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Automatisch vorgeschlagener Ordnername" #: installer_files msgid "Files to be copied:" msgstr "Dateien, die kopiert werden sollen:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Dateien, die vom Installer kopiert werden sollen" #: installer_files_available msgid "Available files" msgstr "Verfügbare Dateien" #: installer_files_selected msgid "Selected files" msgstr "Ausgewählte Dateien" #: installer_files_add msgid ">> add >>" msgstr ">> add >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Ausgewählte Datei zu der Liste hinzufügen" #: installer_files_remove msgid "<< remove <<" msgstr "<< remove <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Ausgewählte Datei aus der Liste entfernen" #: installer_button msgid "Launch button" msgstr "Startknopf" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "" "Eigenschaften des Knopfes, der in der Projektbibliothek angezeigt wird" #: installer_button_project msgid "Main project:" msgstr "Hauptprojekt:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "JClic-Projekt durch Anklicken des Knopfes starten" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Label:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Kurzer Text, der auf dem Knopf angezeigt werden soll" #: installer_button_icon msgid "Icon:" msgstr "Symbol:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Grafik als Knopfsymbol. Frei lassen, wenn JClic-Standardknopf verwendet " "werden soll." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Beschreibung" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Bei Klick auf Knopf angezeigte Kurzinfo" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Fehler: Projekttitel fehlt" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Fehler: Ordnerbezeichnung fehlt" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Fehler: Keine Dateien ausgewählt" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Fehler: Text für Startknopf fehlt" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Fehler: Das dem Startknopf zugewiesene Projekt erscheint nicht in der Liste " "der Dateien, die kopiert werden sollen" #: applet_page_full msgid "Full-page applet" msgstr "Ganzseitiges Applet" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "Benutzerdefiniertes Applet" #: edit_text_align_left msgid "Align text left" msgstr "Text linksbündig ausrichten" #: edit_text_align_center msgid "Center text" msgstr "Text zentrieren" #: edit_text_align_right msgid "Align text right" msgstr "Text rechtsbündig ausrichten" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Ziel definieren oder löschen" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Zelle einfügen" #: edit_text_act_content msgid "Content" msgstr "Inhalt" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Stil" #: edit_cell_size msgid "Cell size:" msgstr "Zellgröße:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Folgende Übungen scheinen in keiner Übungssequenz des Projekts auf und " "werden daher auch nicht angezeigt:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "Folgende Multimediadateien werden in keiner Übung verwendet:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "" "Möchten Sie diese Dateien im Anschluss an die letzte Übungssequenz " "hinzufügen?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Möchten Sie diese Dateien entfernen?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Nicht benötigte Multimediadateien werden entfernt" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Verwaiste Übuingen" #: edit_media_refreshAll msgid "Update all media content" msgstr "Multimediadateien aktualisieren" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Alle Multimediadateien aktualisieren" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Multimediadateien werden aktualisiert..." #: edit_media_exportAll msgid "Export all media" msgstr "Alle Multimediadateien exportieren" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Inhalt aller Multimediadateien als Datei abspeichern" #: edit_media_exportAll_keys msgid "X*" msgstr "*X`*" #: edit_shape_select msgid "Select" msgstr "Auswählen" #: edit_shape_addPoint msgid "Add point" msgstr "Punkt hinzufügen" #: edit_shape_deletePoint msgid "Delete" msgstr "Löschen" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Rechteck zeichnen" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Ellipse zeichnen" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Polygon zeichnen" #: edit_shape_toLine msgid "Convert to line" msgstr "In Linie umwandeln" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "In Bezier-Kurve konvertieren" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "In quadratische Bezier-Kurve konvertieren" #: edit_shape_rLeft msgid "Rotate left" msgstr "Links drehen" #: edit_shape_rRight msgid "Rotate right" msgstr "Rechts drehen" #: edit_shape_expand msgid "Expand" msgstr "Vergrößern" #: edit_shape_contract msgid "Contract" msgstr "Verbinden" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Vergrößern" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Verkleinern" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Nähesten Punkt aufsuchen" #: edit_shape_showPoints msgid "Show points" msgstr "Punkte anzeigen" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Punkte anzeigen/verbergen" #: edit_shape_gridSize msgid "Grid size:" msgstr "Rastergröße:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Raster anzeigen/verbergen" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Magnetradius:" #: edit_shape_elements msgid "Defined elements" msgstr "Ausgewählte Objekte" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Name des ausgewählten Objekts" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Aktionsradius des Magnet-Tools, wenn aktiviert" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Rastergröße" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Übung:" #: edit_mc_sequence msgid "Sequence:" msgstr "Sequenz:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Projekt:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Übung auswählen" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Sequenz auswählen" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Unzureichende Eingabe!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Pfeilfarbe:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Vom Editor zum Zeichnen der Pfeile verwendete Farbe (Abweichungen möglich, " "da eine XOR-Bitmaskierung verwendet wird)" #: edit_act_editActivity msgid "Edit..." msgstr "Bearbeiten..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Ausgewählte Übung bearbeiten" #: action_saveFileAs_caption msgid "Save as..." msgstr "Speichern unter..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Aktuelles Projekt unter anderem Namen abspeichern" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Verhalten" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Verhalten" #: edit_act_behavior_drag msgid "Drag objects" msgstr "schleppen" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Drag objects instead of use a connection line" #: edit_act_behavior_order msgid "Check solving order" msgstr "Check solving order" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Cells must be solved in order" #: edit_act_scramble msgid "Scramble" msgstr "Mischversuche" #: action_importActivities_caption msgid "Import activities..." msgstr "Importieren von Übungen" #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "bring Aktivität aus einem anderen Projekt ein" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "die Aktivitäten können nur zwischen verschiedene Projekte importiert werden. " "Bitte wählen ein anderes Projekt aus." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" "Bitte wählen Sie die Übungen aus, die Sie in das aktuelle Projekt einfügen " "möchten\\:" #: import_importing msgid "Importing..." msgstr "Wird eingebracht..." #: import_checkdep msgid "Checking dependencies..." msgstr "Abhängigkeiten werden überprüft..." #: import_impmedia msgid "Importing media\\:" msgstr "Medien werden eingebracht\\:" #: import_impact msgid "Importing activity\\:" msgstr "Aktivität wird eingebracht\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "" "bitte wählen das Jclic Projekt aus, von welchem Aktivitäten eingebracht " "werden" #: edit_tagRep_tags msgid "Tag marks" msgstr "Etikettenmarkierung" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Startmarkierung" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "verwendete Markierung zu Beginn des Etiketts" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Endmarkierung" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Markierung am Ende des Etiketts" #: edit_tagRep_file msgid "File" msgstr "Datei" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Datei oder URL:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Name oder URL der Datei, die die Werte enthalten, die die Etiketten ersetzen." #: edit_tagRep_charset msgid "Charset\\:" msgstr "Zeichensatz\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Zeichenkodierung in dieser Datei" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Durchsuchen..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Dateisystem durchsuchen" #: edit_tagRep_title msgid "Tag replacing" msgstr "Tag ersetzen" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Lösche Textstile" #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Warnung:\\diese Aktion wird die spezifischen Zeichensatzattribute löschen, " "die zu diesem Dokument gehören und zurück zum Hauptstil zurücksetzen. Diese " "Aktion kann nicht rückgängig gemacht werden. Wollen Sie fortfahren?" #: img_max_size msgid "Maximum size of images:" msgstr "Maximale Bildgröße:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "" "Maximale Breite der Bilder, die in die Medienbibliothek importiert werden " "sollen." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "" "Maximale Höhe der Bilder, die in die Medienbibliothek importiert werden " "sollen." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "Das Bild \"%s\" hat eine Größe von %s Pixeln. Dies übersteigt das vom JClic-" "Autor erlaubte Maximum (%s). Möchten Sie das Bild verkleinern?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_el.po000066400000000000000000003145671335566474600234370ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2010-01-16 11:44+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Περιγραφή" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Ονομασία δραστηριότητας" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Όνομα :" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Περιγραφή δραστηριότητας" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Αναφορές" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Συμπερίληψη αυτής της δραστηριότητας στις αναφορές" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "" "Συμπερίληψη των αποτελεσμάτων αυτής της δραστηριότητας στις αναφορές των " "χρηστών" #: edit_act_code msgid "Code:" msgstr "Κωδικός:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Προαιρετική χρήση κωδικού για ταξινόμηση και αναζήτηση στις αναφορές της " "βάσης δεδομένων." #: edit_act_reportActions msgid "Report user actions" msgstr "Αναφορά ενεργειών χρήστη" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "" "Εγγραφή των λεπτομερειών όλων των ενεργειών που έγιναν από τους χρήστες" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Μετρητές" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Χρονόμετρο" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Εμφάνιση/απόκρυψη χρονόμετρου" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Μετρητής προσπαθειών" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Εμφάνιση/απόκρυψη μετρητή προσπαθειών" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Μετρητής βαθμολογίας" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Εμφάνιση/απόκρυψη μετρητή βαθμολογίας" #: edit_act_maxTime msgid "Max time:" msgstr "Μέγιστος χρόνος:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Μέγιστος χρόνος για τη διεκπεραίωση της δραστηριότητας σε δευτερόλεπτα, ή 0 " "για απεριόριστο χρόνο." #: edit_act_countdown msgid "Countdown" msgstr "Αντίστροφη μέτρηση" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "Ο μετρητής ξεκινά από τη μέγιστη τιμή και μειώνεται ως το 0." #: edit_act_maxActions msgid "Max tries:" msgstr "Μέγιστος αριθμός προσπαθειών:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "" "Μέγιστος αριθμός επιτρεπόμενων προσπαθειών, ή 0 για απεριόριστες προσπάθειες." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Πλήκτρα" #: edit_act_helpBtn msgid "Help" msgstr "Βοήθεια" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Εμφάνιση/απόκρυψη πλήκτρου βοήθειας" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Εμφάνιση λύσης" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Εμφάνιση αυτού του μηνύματος:" #: edit_act_infoBtn msgid "Information" msgstr "Πληροφορίες" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Εμφάνιση/Απόκρυψη πλήκτρου πληροφοριών" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Εμφάνιση αυτού του URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Εκτέλεση αυτής της εντολής:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Εμφάνιση της διεύθυνσης της ιστοσελίδας με πάτημα του πλήκτρου πληροφοριών" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Η γραμμή εντολών εκτελείται με πάτημα του πλήκτρου πληροφοριών" #: edit_act_mainWindow msgid "Main window:" msgstr "Κύριο παράθυρο:" #: edit_act_gameWindow msgid "Game window:" msgstr "Παράθυρο παιχνιδιού;" #: edit_act_margin msgid "Margin:" msgstr "Περιθώριο:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Οριζόντια και κάθετη χωρική ανάπτυξη μεταξύ των αντικειμένων." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Χρώμα φόντου:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Αλλαγή χρώματος φόντου:" #: edit_gradient_startColor msgid "Start color:" msgstr "Χρώμα αρχής:" #: edit_gradient_endColor msgid "End color:" msgstr "Χρώμα τέλους:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Επιλογή του χρώματος αρχής" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Επιλογή του χρώματος τέλους" #: edit_gradient_cycles msgid "Cycles:" msgstr "Κύκλοι:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Αριθμός επαναλήψεων διαβάθμισης στην επιφάνεια" #: edit_gradient_orientation msgid "Orientation:" msgstr "Προσανατολισμός:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Προσανατολισμός διαβάθμισης υπολογισμένος σε μοίρες οριζοντίως" #: edit_act_gradient msgid "Gradient:" msgstr "Διαβάθμιση:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Χρήση διαβάθμισης χρωμάτων" #: edit_color_opacity msgid "Opacity" msgstr "Αδιαφάνεια" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Καθορισμός της τιμής του καναλιού alpha (αδιαφάνεια) του χρώματος." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Διαβάθμιση" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Χρήση προκαθορισμένων τιμών (μηδενική διαβάθμιση)" #: edit_act_image msgid "Image:" msgstr "Εικόνα:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Περιγραφή" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Όνομα και περιγραφή" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Σε παράθεση" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Χρωματισμός της επιφάνειας της εικόνας με επανάληψη κατά μήκος των αξόνων Χ " "και Y όπου χρειάζεται." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Προεπισκόπηση:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Περίγραμμα" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Σχεδιασμός μιας γραμμής περιγράμματος γύρω από το παράθυρο" #: edit_act_transparent msgid "Transparent" msgstr "Διαφάνεια" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "Το παράθυρο έχει διαφανές φόντο" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Πλάτος:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Ύψος:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Το πλάτος του αντικειμένου υπολογισμένο σε εικονοστοιχεία" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Το ύψος του αντικειμένου υπολογισμένο σε εικονοστοιχεία" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Κεντραρισμένο" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "Το αντικείμενο θα κεντραριστεί πάνω από το κύριο παράθυρο" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Απόλυτη οριζόντια θέση" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Απόλυτη κάθετη θέση" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Διεπαφή χρήστη" #: edit_act_image_tooltip msgid "Select an image" msgstr "Επιλογή μιας εικόνας" #: edit_act_text msgid "Text:" msgstr "Κείμενο:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Κείμενο που θα εμφανίζεται μέσα στο αντικείμενο" #: edit_font_face msgid "Typeface:" msgstr "Γραμματοσειρά" #: edit_font_size msgid "Size:" msgstr "Μέγεθος:" #: edit_font_bold msgid "Bold" msgstr "Έντονα" #: edit_font_italic msgid "Italic" msgstr "Πλάγια" #: edit_font_underline msgid "Underline" msgstr "Υπογράμμιση" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Στυλ:" #: edit_cell_title msgid "Cell contents" msgstr "Περιεχόμενα κελιού" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Μηνύματα" #: edit_act_msg_initial msgid "Initial message:" msgstr "Αρχικό μήνυμα:" #: edit_act_msg_final msgid "Final message:" msgstr "Τελικό μήνυμα:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Προηγούμενο μήνυμα:" #: edit_act_msg_error msgid "Error message:" msgstr "Μήνυμα σφάλματος:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Μήνυμα που εμφανίζεται με την έναρξη της δραστηριότητας" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Μήνυμα που εμφανίζεται όταν η δραστηριότητα ολοκληρωθεί" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "" "Μήνυμα που εμφανίζεται όταν η δραστηριότητα ολοκληρώνεται με σφάλματα." #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Μήνυμα που εμφανίζεται πριν την έναρξη της δραστηριότητας (μόνο σε " "συγκεκριμένους τύπους δραστηριοτήτων)" #: edit_align msgid "Align:" msgstr "Στοίχιση:" #: edit_act_textColor msgid "Text color:" msgstr "Χρώμα κειμένου:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Χρώμα κειμένου" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Χρώμα σκίασης:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "" "Χρώμα που χρησιμοποιείται για τη σκίαση του κειμένου, όταν τίθεται σε " "εφαρμογή" #: edit_act_shadow msgid "Shadow" msgstr "Σκιά" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Κείμενο με σκιά" #: edit_act_borderColor msgid "Border color:" msgstr "Χρώμα περιγράμματος:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Χρώμα περιγράμματος κελιού" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Κατάσταση χρώματος ανενεργή" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Χρώμα που χρησιμοποιείται όταν το κελί είναι απενεργοποιημένο" #: edit_act_altColor msgid "Alternative color:" msgstr "Εναλλακτικό χρώμα:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Χρώμα που χρησιμοποιείται για την εγγραφή εναλλακτικού περιεχομένου σε " "ολοκληρωμένα κελιά" #: edit_cell_marked msgid "Marked" msgstr "Σημειωμένο" #: edit_cell_disabled msgid "Disabled" msgstr "Απενεργοποιημένο" #: edit_cell_alt msgid "Alternative" msgstr "Εναλλακτικό" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Εσωτερικό περιθώριο" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Διάστημα μεταξύ περιγράμματος και κειμένου ενός κελιού." #: edit_cell_borderWidth msgid "Border width:" msgstr "Πλάτος περιγράμματος:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Πλάτος γραμμής για το σχεδιασμό πρότυπου περιγράμματος" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Πλάτος γραφίδας;" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Πλάτος γραμμής περιγράμματος όταν το κελί είναι σημαδεμένο ή επιλεγμένο" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Προεπισκόπηση σε \"εναλλακτική\" κατάσταση" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Προεπισκόπηση σε \"απενεργοποιημένη\" κατάσταση" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Προεπισκόπηση σε \"σημειωμένη\" κατάσταση" #: edit_act_testAction msgid "Preview activity" msgstr "Προεπισκόπηση δραστηριότητας" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Προεπισκόπηση και δοκιμή δραστηριότητας" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Περιγραφή" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Τίτλος και περιγραφή της δραστηριότητας" #: edit_act_panels_options msgid "Options" msgstr "Επιλογές" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Επιλογές της δραστηριότητας" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Παράθυρο" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Αναλογία, μέγεθος και θέση του παραθύρου της δραστηριότητας" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Μηνύματα" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Περιεχόμενο μηνυμάτων της δραστηριότητας" #: edit_act_panels_panel msgid "Panel" msgstr "Πίνακας" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Περιεχόμενα πίνακα" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Στυλ" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Καθορίστε το χρώμα, τη γραμματοσειρά και το μέγεθος των κελιών" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Στυλ:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Το κείμενο να μην επικαλύπτει την εικόνα" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Αποφυγή επικάλυψης εικόνας από το κείμενο" #: edit_media_exists_1 msgid "The file" msgstr "Το αρχείο" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "υπάρχει ήδη στη βιβλιοθήκη πολυμέσων!" #: edit_act_shaper msgid "Shaper:" msgstr "Σχεδιαστής:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Σφάλμα σχεδιαστή:" #: edit_act_num_cols msgid "Columns:" msgstr "Στήλες:" #: edit_act_num_rows msgid "Rows:" msgstr "Γραμμές:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Ύψος δοντιού:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Πλάτος δοντιού:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Τυχαία διανομή" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Ιδιότητες σχεδιαστή" #: edit_act_panels_text msgid "Text" msgstr "Κείμενο" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Κείμενο δραστηριότητας" #: action_saveFile_caption msgid "Save..." msgstr "Αποθήκευση..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Αποθήκευση τρέχοντος έργου" #: action_docTree_caption msgid "Document tree..." msgstr "Δενδροειδής διάταξη έργου..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Εμφάνιση δενδροειδούς διάταξης του έργου" #: edit_docTree_title msgid "Document tree" msgstr "Δενδροειδής διάταξη έργου" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Αναφέρεται:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Προσοχή:

Αυτό το έργο " "συνδέεται με άλλα έργα.
Θέλετε να εξερευνήσετε τις συνδέσεις και να " "φορτώσετε άλλα σχετικά αρχεία;

(Προτείνεται να απαντήσετε ΝΑΙ όταν " "εισάγεται δραστηριότητες του Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Τύπος:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Άγνωστο" #: edit_mc_type_sound msgid "Play sound" msgstr "Αναπαραγωγή ήχου" #: edit_mc_type_video msgid "Play video" msgstr "Αναπαραγωγή βίντεο" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Αναπαραγωγή MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Αναπαραγωγή CD ήχου" #: edit_mc_type_record msgid "Record sound" msgstr "Ηχογράφηση ήχου" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Αναπαραγωγή ηχογραφημένου ήχου" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Μετάβαση στη δραστηριότητα" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Μετάβαση στην ακολουθία" #: edit_mc_type_run_external msgid "Run program" msgstr "Εκτέλεση προγράμματος" #: edit_mc_type_url msgid "Show URL" msgstr "Εμφάνιση URL" #: edit_mc_type_exit msgid "End" msgstr "Τέλος" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Επιστροφή" #: edit_mc_level msgid "Priority level:" msgstr "Επίπεδο προτεραιότητας:" #: edit_mc_file msgid "File:" msgstr "Αρχείο:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Παράμετροι:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Από:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Προς:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Μέγιστο μήκος:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Εγγραφή κασέτας:" #: edit_mc_stretch msgid "Stretch size" msgstr "Τέντωμα μεγέθους" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Τοποθεσία:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Από:" #: edit_mc_location_from_box msgid "Cell" msgstr "Κελί" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Παράθυρο" #: edit_mc_location_from_frame msgid "Frame" msgstr "Πλαίσιο" #: edit_mc_loop msgid "Loop playback" msgstr "Επανάληψη" #: edit_mc_autostart msgid "Auto start" msgstr "Αυτόματη εκκίνηση" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Ποντίκι σύλληψης" #: edit_mc_title msgid "Multimedia and active content" msgstr "Πολυμέσα και ενεργό περιεχόμενο" #: edit_mc_label msgid "Active content:" msgstr "Ενεργό περιεχόμενο" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Επιλογή αντικειμένου πολυμέσων" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Βιβλιοθήκη πολυμέσων" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Στοίχιση στο κέντρο του κελιού" #: edit_mc_pos_window msgid "Centered over window" msgstr "Κεντράρισμα στο παράθυρο" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Καθορισμός θέσης:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Λανθασμένη δενδροειδής δομή ή δεδομένα" #: edit_act_panels_controls msgid "Controls" msgstr "Στοιχεία ελέγχου" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Επιλογές για πλήκτρα και μετρητές" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Τύπος:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Διάταξη πλέγματος:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Σχετική θέση πίνακα Α και Β" #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Αντίστροφη ανάλυση" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "Η δραστηριότητα ολοκληρώνεται όταν όλα τα καθορισμένα στοιχεία από το \"Β\" " "έχουν συσχετιστεί" #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Εμφάνιση όλων των βελών" #: edit_act_alt msgid "Alternative content:" msgstr "Εναλλακτικό περιεχόμενο:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "" "Περιεχόμενο που εμφανίζεται σε ολοκληρωμένα και σε μη προσδιορισμένα κελιά." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Επεξεργασία εναλλακτικού περιεχομένου" #: edit_act_grid msgid "Grid" msgstr "Πλέγμα" #: edit_act_grid_A msgid "Grid A" msgstr "Πλέγμα Α" #: edit_act_grid_B msgid "Grid B" msgstr "Πλέγμα Β" #: edit_act_grid_layout msgid "Layout" msgstr "Διάταξη" #: edit_act_grid_relationship msgid "Relationship" msgstr "Σχέση" #: edit_seq_activity_header msgid "activity" msgstr "δραστηριότητα" #: edit_seq_tag_header msgid "tag" msgstr "ετικέτα" #: edit_seq_jump_header msgid "jump to" msgstr "μετάβαση σε" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Δραστηριότητα:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Ετικέτα:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Περιγραφή:" #: edit_seq_auto msgid "Move on automatically" msgstr "Αυτόματη μετακίνηση" #: edit_seq_delay msgid "Delay:" msgstr "Καθυστέρηση:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Μετάβαση μπροστά" #: edit_seq_action_back msgid "Go bak" msgstr "Πίσω" #: edit_seq_action_jump msgid "Jump to..." msgstr "Μετάβαση σε" #: edit_seq_action_stop msgid "Stop" msgstr "Διακοπή" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Επιστροφή" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Έξοδος από JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Μπροστά:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Πίσω:" #: edit_seq_action msgid "Action:" msgstr "Ενέργεια:" #: edit_seq_button_enabled msgid "Show button" msgstr "Προβολή κουμπιού" #: edit_seq_project msgid "JClic Project:" msgstr "Έργο Jclic:" #: edit_act_absolute msgid "Absolute position" msgstr "Θέση τιμής" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "" "Το αντικείμενο θα τοποθετηθεί στην καθορισμένη θέση των συντεταγμένων Χ και Υ" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Τοποθεσία:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Νέα ακολουθία στοιχείου" #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Εισαγωγή νέου στοιχείου στην ακολουθία της δραστηριότητας" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Παρακαλώ επιλέξτε μια δραστηριότητα για τη νέα ακολουθία στοιχείου" #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "Δεν μπορεί να δημιουργηθεί μια καινούργια ακολουθία χωρίς δραστηριότητα!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Το έργο δεν έχει δραστηριότητες! Αδυναμία δημιουργίας ακολουθίας στοιχείων " "σε κενό έργο." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Στόχος μετακίνησης:" #: edit_seq_jump_title msgid "Jump target" msgstr "Στόχος μετακίνησης" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Πρόσθηκη νέας δραστηριότητας στο έργο" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Τύπος δραστηριότητας" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Όνομα" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "" "Παρακαλώ επιλέξτε τον τύπο της δραστηριότητας που θα δημιουργήσετε και δώστε " "ένα όνομα:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Πρέπει να επιλέξετε τύπο δραστηριότητας!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Πρέπει να ορίσετε ένα όνομα για την δραστηριότητα!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Αδύνατη η δημιουργία δραστηριότητας" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Όνομα κατηγορίας Java:" #: edit_text_act_format msgid "Format" msgstr "Μορφή" #: edit_text_act_answer msgid "Answer" msgstr "Απάντηση" #: edit_text_act_popup msgid "Pop up" msgstr "Αναδυόμενο παράθυρο" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Έγκυρες απαντήσεις" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Προσθήκη νέας λίστας στοιχείων" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Επεξεργασία επιλεγμένης λίστας στοιχείων" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Διαγραφή επιλεγμένης λίστας στοιχείων" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Μετακίνηση πάνω" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Μετακίνηση κάτω" #: edit_list_newValue msgid "New text:" msgstr "Νέο κείμενο:" #: edit_list_addElement msgid "Add new list element" msgstr "Προσθήκη νέας λίστας στοιχείων" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Μετατροπή επιλεγμένου κειμένου" #: edit_text_act_target msgid "Target" msgstr "Προορισμός" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Μέγιστο μήκος:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Μέγιστος αριθμός χαρακτήρων της απάντησης:" #: edit_text_act_fillingChar msgid "Filling character" msgstr "Γέμισμα χαρακτήρα" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Οι χαρακτήρες χρησιμοποιούνται για να δηλώνουν το κενό" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Αρχικό μήκος:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Ο αριθμός των συμπληρωμένων χαρακτήρων θα εμφανιστεί κατά την έναρξη της " "δραστηριότητας." #: edit_text_act_iniText msgid "Initial text:" msgstr "Αρχικό κείμενο:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "" "Το κείμενο εμφανίζεται στο έγγραφο κατά την έναρξη της δραστηριότητας." #: edit_text_act_list msgid "Show a list of options:" msgstr "Εμφάνιση λίστας επιλογών:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" "Εμφάνιση λίστας επιλογών από την οποία ο χρήστης μπορεί να επιλέξει μία:" #: edit_text_act_check_title msgid "Correction options" msgstr "Επιλογές διόρθωσης" #: edit_text_act_popup_no msgid "No pop up" msgstr "Φραγή αναδυόμενων παραθύρων" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Αυτόματη ανάδυση παραθύρου" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Ανάδυση παραθύρου σε περίπτωση λάθους" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Ανάδυση παραθύρου με F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Τύπος:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Καθυστέρηση ανάδυσης παραθύρου:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Μέγιστος χρόνος:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Μόνο ήχος" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "Πρέπει να επιλέξετε ένα απόσπασμα κειμένου αν στοχεύετε στη δημιουργία ενός " "νέου κειμένου!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" "Το κείμενο δεν μπορεί να περιλαμβάνει παράγραφο που δεν διαθέτει στηλοθέτες." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Οι στόχοι δεν μπορούν να τοποθετηθούν" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Ο προορισμός δεν μπορεί να περιέχει κελιά" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Χρώμα χαρτιού:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Επεξεργασία στυλ εγγράφου..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Κύριο στυλ:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Διάστημα στηλοθέτη:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Διαστήματα μεταξύ στηλοθετών:" #: edit_text_act_colors msgid "Colors:" msgstr "Χρώματα:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Προορισμός χρωμάτων:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Χρώματα σφαλμάτων:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Προεπισκόπηση:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Τυπικό κείμενο" #: edit_text_act_styleSample_target msgid "target" msgstr "στόχος" #: edit_text_act_styleSample_error msgid "error" msgstr "σφάλμα" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "τυπικό κείμενο" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "τυπικό κείμενο." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Προειδοποίηση: Αυτή η ενέργεια θα υπερισχύσει από τον τρέχοντα επιλεγμένο " "στόχο. Θέλετε να συνεχίσετε;" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Προηγούμενη οθόνη..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Καμία εμφάνιση κειμένου πριν την έναρξη της δραστηριότητας" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Εμφάνιση πλήρους κειμένου της άσκησης." #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Εμφάνιση αυτού του κειμένου:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Μέγιστος χρόνος:" #: edit_text_act_edit_target msgid "Target..." msgstr "Στόχος..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Εμφάνιση πλήκτρου διόρθωσης" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Πλήκτρο κειμένου;" #: edit_text_act_checkCase msgid "Match case" msgstr "Ταίριασμα πεζών/κεφαλαίων" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Εξέταση τονισμού και ειδικών χαρακτήρων" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Εξέταση σημείων στίξης" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Επιτρέπονται επαναλαμβανόμενα διαστήματα" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Κριτήρια" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Μετάβαση στον επόμενο στόχο όταν συμπληρωθεί" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Μετάβαση μόνο μετά σωστή πρόβλεψη" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Επισήμανση λαθών, γράμμα προς γράμμα" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Παράμετροι ανάλυσης αλγορίθμων:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Βήματα:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Πεδίο εξερεύνησης:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Έλεγχος" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Ανάλυση απάντησης" #: edit_text_act_check_bt msgid "Correction..." msgstr "Διόρθωση..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Πλήκτρο διόρθωσης" #: edit_text_act_checkProgress msgid "Progress" msgstr "Πρόοδος" #: edit_text_act_typeBtn msgid "Type..." msgstr "Τύπος..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ταξινόμηση παραγράφων" #: edit_text_act_orderWords msgid "Order words" msgstr "Ταξινόμηση λέξεων" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Αναδιάταξη λέξεων μέσα στις παραγράφους" #: edit_text_act_type_title msgid "Activity type" msgstr "Είδος δραστηριότητας" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Αυτή η ενέργεια θα αφαιρέσει όλους τους υπάρχοντες στόχους. Θέλετε να " "συνεχίσετε;" #: edit_text_act_identWords msgid "Identify words" msgstr "Αναγνώριση λέξεων" #: edit_text_act_identChars msgid "Identify characters" msgstr "Αναγνώριση χαρακτήρων" #: edit_media_change_name msgid "Change name..." msgstr "Αλλαγή ονόματος..." #: edit_media_change_file msgid "Change file..." msgstr "Αλλαγή αρχείου..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Αποθήκευση σε συμπιεσμένο (.zip) αρχείο" #: edit_media_type msgid "Media type:" msgstr "Είδος πολυμέσου:" #: edit_media_size msgid "File size:" msgstr "Μέγεθος αρχείου:" #: edit_media_show_type msgid "Files of type:" msgstr "Τύποι αρχείων:" #: edit_media_preview msgid "Preview media" msgstr "Προεπισκόπηση πολυμέσων" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Προεπισκόπηση πηγών πολυμέσων" #: edit_media_rename msgid "Change resource name" msgstr "Αλλαγή ονόματος πηγής:" #: edit_media_rename_title msgid "Rename" msgstr "Μετονομασία" #: edit_media_rename_prompt msgid "New name:" msgstr "Νέο όνομα:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Μη έγκυρο όνομα πηγής!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Υπάρχει μια ακόμη πηγή με αυτό το όνομα! Κάθε πηγή πρέπει να έχει ένα " "μοναδικό όνομα." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Μη έγκυρο αρχείο!" #: err_media_chfile_different msgid "File must be of same type" msgstr "Το αρχείο πρέπει να είναι του ίδιου είδους" #: edit_media_font_error msgid "Unable to load font!" msgstr "Αδυναμία φόρτωσης γραμματοσειράς!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Αποθήκευση αρχείου (εξαγωγή από ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Ενημέρωση περιεχομένου πολυμέσων από αρχείο" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Αυτό δεν είναι ένα \"πραγματικό\" αρχείο, αλλά ένα αντικείμενο που βρίσκεται " "σε ένα συμπιεσμένο πακέτο. Για να χρησιμοποιήσετε αυτή τη δυνατότητα, πρέπει " "να εμφανιστεί ένα αρχείο με το ίδιο όνομα στον φάκελο όπου βρίσκεται το " "συμπιεσμένο αρχείο." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Δραστηριότητες" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Ακολουθίες" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Βιβλιοθήκη πολυμέσων" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "" "Διαχείριση εικόνων και άλλων πολυμέσων που χρησιμοποιούνται σε αυτό το έργο" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Δημιουργία και επεξεργασία δραστηριοτήτων έργου" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Δημιουργία και επεξεργασία ακολουθιών δραστηριοτήτων" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Τίτλος:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Τίτλος έργου" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Έργο" #: edit_project_tooltip msgid "Edit project properties" msgstr "Επεξεργασία ιδιοτήτων του έργου" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Περιγραφή:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Γενική περιγραφή του έργου" #: edit_project_area msgid "Areas:" msgstr "Γνωστικές περιοχές:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Διδακτικά αντικείμενα του έργου" #: edit_project_level msgid "Levels:" msgstr "Γνωστικά επίπεδα:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Εκπαιδευτικά επίπεδα του έργου" #: edit_project_descriptors msgid "Descriptors:" msgstr "Λέξεις κλειδιά:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Λέξεις κλειδιά για το έργο (διαχωρισμένες με κόμμα)" #: edit_project_languages msgid "Languages:" msgstr "Γλώσσες:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Γλώσσες που χρησιμοποιούνται στο έργο" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Αλλαγή επιλεγμένης γλώσσας" #: edit_project_languages_add msgid "Add language" msgstr "Προσθήκη γλώσσας" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "ISO-639 κωδικός γλώσσας:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Συγγραφείς:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Άτομα που συνεισέφεραν στη δημιουργία αυτού του έργου" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Όνομα" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "Ηλεκτρονική διεύθυνση:" #: edit_project_author_rol msgid "Rol:" msgstr "Ρόλος:" #: edit_project_author_organization msgid "Organization:" msgstr "Οργανισμός:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Σχόλια:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Όνομα συγγραφέα (απαιτείται)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Ηλεκτρονική διεύθυνση συγγραφέων (προαιρετικό)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Ρόλος ατόμου στο έργο: δημιουργός, συνεργάτης, προμηθευτής εικόνων, ήχων... " "(προαιρετικό)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Σχολείο, πανεπιστήμιο, σύλλογος....(προαιρετικό)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Προσωπική ιστοσελίδα (προαιρετικό)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Πεδίο για άλλες πληροφορίες (προαιρετικό)" #: edit_project_author_info msgid "Author info:" msgstr "Πληροφορίες συγγραφέα:" #: edit_project_author_add msgid "Add author to list" msgstr "Προσθήκη συγγραφέα στη λίστα" #: edit_project_author_edit msgid "Edit author info" msgstr "Επεξεργασία πληροφοριών συγγραφέα" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Όνομα:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Όνομα σχολείου" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "Ηλεκτρονική διεύθυνση:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Ηλεκτρονιθκή διεύθυνση σχολείου" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Ιστοσελίδα σχολείου" #: edit_project_org_address msgid "Address:" msgstr "Διεύθυνση:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Ταχυδρομική διεύθυνση" #: edit_project_org_pc msgid "PC:" msgstr "Η/Υ:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Ταχυδρομικός κώδικας" #: edit_project_org_city msgid "City:" msgstr "Πόλη:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Πόλη" #: edit_project_org_country msgid "Country:" msgstr "Χώρα:" #: edit_project_org_state msgid "State:" msgstr "Πολιτεία:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Σχόλια:" #: edit_project_org msgid "School/s:" msgstr "Σχολεία:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Σχολείο ή άλλο ίδρυμα που συμμετέχει στο έργο!" #: edit_project_org_info msgid "Organization info:" msgstr "Πληροφορίες οργανισμού:" #: edit_project_org_add msgid "Add organization" msgstr "Προσθήκη οργανισμού" #: edit_project_org_edit msgid "Edit organization data" msgstr "Επεξεργασία δεδομένων οργανισμού" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Χώρα, ομοσπονδία, ένωση ..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Ομοσπονδιακή πολιτεία, κοινότητα, περιοχή ..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Άλλες πληροφορίες..." #: edit_project_rev_date msgid "Date:" msgstr "Ημερομηνία" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Ημερομηνία αναθεώρησης" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Συγγραφείς:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Συγγραφείς αναθεώρησης" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Περιγραφή:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Σύντομη περιγραφή των αλλαγών που έγιναν" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Σχόλια:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Άλλες σχετικές πληροφορίες" #: edit_project_rev msgid "Revisions:" msgstr "Αναθεωρήσεις:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Ιστορικό των κυριότερων τροποποιήσεων που έγιναν στο έργο" #: edit_project_rev_add msgid "Add revision record" msgstr "Προσθήκη καταγραφής αναθεωρήσεων" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Επεξεργασία καταγραφής αναθεωρήσεων" #: edit_project_rev_info msgid "Revision data" msgstr "Δεδομένα αναθεώρησης" #: edit_media_objects msgid "objects" msgstr "αντικείμενα" #: edit_media_object msgid "object" msgstr "αντικείμενο" #: edit_evsounds_start msgid "Start of activity:" msgstr "Έναρξη δραστηριότητας:" #: edit_evsounds_click msgid "Click on object:" msgstr "Κάντε κλικ στο αντικείμενο:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Εσφαλμένη ενέργεια:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Σωστή ενέργεια:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Η δραστηριότητα ολοκληρώθηκε με λάθη:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Η δραστηριότητα ολοκληρώθηκε σωστά:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Σφάλμα: Το πεδίο περιγραφής δεν μπορεί να μείνει κενό:" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Επεξεργασία ήχου συμβάντων" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Ήχοι συμβάντων:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Καθορίστε συγκεκριμένο ήχο για κάθε συμβάν του JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Ήχοι συμβάντων:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Καθορίστε συγκεκριμένο ήχο για κάθε συμβάν του JClic" #: edit_evsounds_default msgid "default sound" msgstr "Προεπιλεγμένος ήχος" #: edit_evsounds_disabled msgid "disabled" msgstr "απενεργοποιημένο" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Ενεργοποίηση ή απενεργοποίηση ήχου για αυτό το συμβάν" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Κάνε κλικ για να επιλέξεις ήχο για αυτό το συμβάν ή αποεπέλεξε για να " "χρησιμοποιήσεις τον προεπιλεγμένο ήχο" #: action_newProject_caption msgid "New project..." msgstr "Νέο έργο" #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Δημιουργία νέου έργου Jclic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Από:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Ελάχιστη τιμή τελεστή" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Προς:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Μέγιστη τιμή τελεστή" #: edit_arith_op_with msgid "With:" msgstr "Με:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Εάν επιλεγεί, ο τελεστής μπορεί επίσης να πάρει αυτή την τιμή" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Ένα από τη λίστα:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Λίστα πιθανών τιμών τελεστών" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Δεκαδικά:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Αριθμός δεκαδικών ψηφίων τελεστή" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (ακέραιος)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "Αρχικός τελεστής" #: edit_arith_secondOp msgid "Second operand" msgstr "Δεύτερος τελεστής" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 for JClic" #: edit_arith_operations msgid "Operations:" msgstr "Πράξεις:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Επέλεξε το είδος των ενεργειών για να εκτελεστούν" #: edit_arith_operations_plus msgid "Plus" msgstr "Πρόσθεση" #: edit_arith_operations_minus msgid "Minus" msgstr "Αφαίρεση" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Πολλαπλασιασμός" #: edit_arith_operations_divide msgid "Divide" msgstr "Διαίρεση" #: edit_arith_unknown msgid "Unknown:" msgstr "Άγνωστο:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Επέλεξε το αντικείμενο που θα λειτουργεί ως ο άγνωστος" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "Το αποτέλεσμα είναι ο άγνωστος" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "Ο δεύτερος τελεστής είναι ο άγνωστος" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "Ο πρώτος τελεστής είναι ο άγνωστος" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "Άγνωστη λειτουργία" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Γράψε το αποτέλεσμα στη αρχή της έκφρασης" #: edit_arith_result msgid "Result:" msgstr "Αποτέλεσμα:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Μην μεταφέρεις" #: edit_arith_result_random msgid "Random" msgstr "Τυχαίο" #: edit_arith_result_asc msgid "Ascending" msgstr "Αύξουσα" #: edit_arith_result_order msgid "Order by result:" msgstr "Ταξινόμηση κατά αποτέλεσμα" #: edit_arith_result_desc msgid "Descending" msgstr "Φθίνουσα" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Αποφυγή διπλότυπων" #: edit_arith_cond msgid "Conditions:" msgstr "Συνθήκες:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "όμοια" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "Ο πρώτος τελεστής πρέπει να είναι μεγαλύτερος από τον δεύτερο" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "Ο πρώτος τελεστής πρέπει να είναι μικρότερος από τον δεύτερο" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Άλλες συνθήκες" #: edit_autocp msgid "Automatic content generator:" msgstr "Αυτόματος δημιουργός περιεχομένων:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" "Επιλογή τύπου δημιουργού αυτόματου περιεχομένου για αυτή τη δραστηριότητα." #: edit_autocp_block msgid "Content generator" msgstr "Δημιουργός περιεχομένων" #: edit_autocp_btn msgid "Settings..." msgstr "Ρυθμίσεις..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Διαμόρφωση ρυθμίσεων πάροχου περιεχομένου" #: edit_data msgid "Edit data" msgstr "Επεξεργασία δεδομένων" #: edit_act msgid "Activity edit" msgstr "Επεξεργασία δραστηριότητας" #: edit_acp msgid "Content provider edit" msgstr "Επεξεργασία παροχέα περιεχομένων" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Σφάλμα στη δημιουργία πάροχου περιεχομένου!" #: edit_project_author_group msgid "Creation" msgstr "Δημιουργία" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Περιγραφή" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Διεπαφή χρήστη" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Περιγραφή:" #: m_Edit msgid "Edit" msgstr "Επεξεργασία" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Νέα δραστηριότητα..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Εισαγωγή" #: m_Insert_Mnemonic msgid "I" msgstr "Ι" #: m_View msgid "View" msgstr "Προβολή" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Έργο" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Επεξεργασία ρυθμίσεων έργου" #: action_editMedia_caption msgid "Media" msgstr "Μέσα" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Επεξεργασία της βιβλιοθήκης πολυμέσων του έργου" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Δραστηριότητες" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Επεξεργασία δραστηριοτήτων" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Ακολουθίες" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Επεξεργασία ακολουθιών δραστηριοτήτων" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "Το παρόν έργο έχει τροποποιηθεί. Θέλετε να αποθηκεύσετε τις αλλαγές;" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Παιδαγωγικά χαρακτηριστικά" #: edit_media_new msgid "New media object..." msgstr "Νέο αντικείμενο πολυμέσων..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Προσθήκη νέας εικόνας ή αντικειμένου πολυμέσων στην βιβλιοθήκη" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Κατώτατο όριο βαθμολογίας:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Ακολουθήστε αυτή τη διαδρομή, όταν η συνολική βαθμολογία είναι ίση ή " "μεγαλύτερη από..." #: edit_seq_time msgid "Time threshold:" msgstr "Αφετηρία χρόνου:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Για να ακολουθήσετε αυτή τη διαδρομή, ο χρόνος που αναλώθηκε για τις " "δραστηριότητες πρέπει να είναι μικρότερος από..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "" "Ακολουθήστε αυτή τη διαδρομή όταν η συνολική βαθμολογία είναι χαμηλότερη " "από..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Ακολουθήστε αυτή τη διαδρομή, όταν ο χρόνος που αναλώθηκε για τις " "δραστηριότητες είναι μεγαλύτερος από..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Εξαρτημένα βήματα" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Καθορίστε ειδικά βήματα που πρέπει να εκτελεστούν μόνο κάτω από " "συγκεκριμένους όρους" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Καθορίστε τους όρους για μετάβαση σε ανώτερο επίπεδο" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Μετάβαση κάτω:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Μετάβαση άνω:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Καθορίστε τους όρους για μετάβαση σε κατώτερο επίπεδο" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Ενέργεια που ανατέθηκε στο πλήκτρο \"επόμενο\"" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Ενέργεια που ανατέθηκε στο πλήκτρο \"προηγούμενο\"" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Καθορίστε το στόχο της μετάβασης" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Ένέργεια που πρέπει να γίνει" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Ενέργεια που ανατέθηκε σε αυτό το στοιχείο της ακολουθίας" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Ετικέτα που χρησιμοποιείται ως παραπομπή για αυτό το στοιχείο της ακολουθίας " "(προαιρετικό πεδίο)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Περιγραφή στοιχείου ακολουθίας (προαιρετικό πεδίο)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Ενεργοποίηση ή απενεργοποίηση πλήκτρου βέλους" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Αυτόματη μετακίνηση όταν η δραστηριότητα ολοκληρώνεται" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Δευτερόλεπτα αναμονής πριν την αυτόματη μετακίνηση" #: edit_color_dlgTitle msgid "Select color" msgstr "Επιλογή χρώματος" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Παρακαλώ περιμένετε ενόσω η πηγή μετανομάζεται..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Πλάτος:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Πλάτος κελιού (σε εικονοστοιχεία)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Ύψος:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Ύψος κελιού (σε pixels)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Κρυμμένες λέξεις:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Λίστα κρυμμένων λέξεων του πίνακα" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Χρήση του πίνακα Β" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "Τα περιεχόμενα του δεύτερου πίνακα θα εμφανίζονται ως λέξεις που βρέθηκαν" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Επιλέξτε τη μορφή του σχεδιαστή που θα χρησιμοποιηθεί στον πίνακα" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Αριθμός στηλών του πίνακα" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Αριθμός γραμμών του πίνακα" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Όρια διαφάνειας" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "" "Αντιμετώπιση των ορίων (μαύρα πλαίσια) ως αδύνατα σημεία της διαφάνειας" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Μείγματα\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Πόσες φορές θα γίνει ανακάτωμα" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Αντιγραφή χαρακτηριστικών στο..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Χαρακτηριστικά" #: edit_act_copy_dest msgid "Apply to:" msgstr "Εφαρμογή σε:" #: edit_act_copy_style_main msgid "Main window" msgstr "Κύριο παράθυρο" #: edit_act_copy_style_play msgid "Play window" msgstr "Παράθυρο αναπαραγωγής" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Δραστηριότητες που πρέπει να τροποποιηθούν:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Αντιγραφή ιδιοτήτων" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "" "Αντιγραφή χαρακτηριστικών της τρέχουσας δραστηριότητας σε άλλες " "δραστηριότητες" #: edit_new_project_name msgid "Project name:" msgstr "Όνομα έργου:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Σύντομο περιγραφικό όνομα του έργου" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Όνομα αρχείου:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Όνομα αρχείου του έργου, χωρίς επέκταση" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Φάκελος:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Όνομα φακέλου όπου θα αποθηκευτεί το έργο" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Περιήγηση..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Δημιουργία νέου έργου JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Σφάλμα: Το έργο, το αρχείο και ο φάκελος πρέπει να έχουν έγκυρα ονόματα." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Αυτός ο φάκελος περιέχει ήδη ένα άλλο έργο του Clic 3.0 ή του JClic. Για να " "αποφύγετε την αναστάτωση, είναι προτιμότερο να διατηρείτε κάθε έργο σε " "ξεχωριστό φάκελο, αν και αυτό δεν είναι αυστηρός κανόνας. Θέλετε πραγματικά " "να δημιουργήσετε το νέο έργο σε αυτόν τον φάκελο;" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Σφάλμα: Αδύνατη η δημιουργία του επιλεγμένου φακέλου!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Σφάλμα: Δεν επιλέχθηκε δραστηριότητα! Για να εφαρμοστούν τα υποδεικνυόμενα " "χαρακτηριστικά, πρέπει να επιλέξετε από τη λίστα τη δραστηριότητα ή τις " "δραστηριότητες στις οποίες θα γίνει η εφαρμογή." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Αντιγραφή ιδιοτήτων στο:" #: edit_act_copy_margin msgid "Margin" msgstr "Περιθώριο" #: edit_act_copy_bgColor msgid "Background color" msgstr "Χρώμα υποβάθρου" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Διαβάθμιση" #: edit_act_copy_bgImage msgid "Background image" msgstr "Εικόνα φόντου" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Περίγραμμα" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Φόντο διαφάνειας" #: edit_act_copy_position msgid "Position" msgstr "Θέση" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Μηνύματα" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Στυλ αρχικού μηνύματος" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Στυλ τελικού μηνύματος" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Στυλ μηνύματος σφάλματος" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Αναφορές" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Συμπεριέλαβε την δραστηριότητα στις αναφορές" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Καταγραφή ενεργειών" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Διεπαφή χρήστη" #: edit_act_copy_skin msgid "Skin" msgstr "Θέμα" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Ήχοι συμβάντων" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Μετρητές" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Χρονόμετρο" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Μέγιστος χρόνος" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Μετρητής προσπαθειών" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Μέσιστες προσπάθειες" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Μετρητής βαθμολογίας" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Πόσες φορές θα γίνει το ανακάτωμα" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Πλήκτρα" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Πλήκτρο βοήθειας" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Πλήκτρο πληροφορίας" #: edit_act_copy_grids msgid "Grids" msgstr "Πλέγματα" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Στυλ πλέγματος Α" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Στυλ πλέγματος Β" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Στυλ πλεγμάτων κειμένων" #: edit_act_copy_text msgid "Text activities" msgstr "Δραστηριότητες κειμένου" #: edit_act_copy_fontFace msgid "Font face" msgstr "Στοιχείο γραμματοσειράς" #: edit_act_copy_fontSize msgid "Font size" msgstr "Μέγεθος γραμματοσειράς" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Στυλ γραμματοσειράς" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Χρώμα κύριου κειμένου" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "" "Επιλέξτε το σχέδιο εργασίας του JClic από όπου θα εισαχθούν οι δραστηριότητες" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Χρώμα σφαλμάτων" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Διάστημα στηλοθέτη" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Στυλ προηγούμενου μηνύματος" #: edit_act_changeType msgid "Change activity type" msgstr "Αλλαγή τύπου δραστηριότητας" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Πλήρες όνομα είδους που θα χρησιμοποιηθεί για τη δημιουργία της " "δραστηριότητας (μόνο για προχωρημένους χρήστες!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Άλλο..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Οι προχωρημένοι χρήστες μπορούν επίσης να δημιουργήσουν δικές τους " "δραστηριότητες για το JClic. Γράψτε το πλήρες όνομα του είδους με το πρόθημα " "του πακέτου (π.χ. \"com.acme.activities.FooActivity\"). Τα είδη των " "δραστηριοτήτων πρέπει να έχουν επέκταση edu.xtec.jclic.Activity και " "πρέπει να είναι προσπελάσιμα από τη JVM." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Ονομασία δραστηριότητας" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Κάθε δραστηριότητα πρέπει να έχει ένα μοναδικό όνομα στο έργο" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Προσοχή: Η αλλαγή του τύπου της δραστηριότητας " "μπορεί να προκαλέσει απώλεια χαρακτηριστικών και αντικειμένων της τρέχουσας " "δραστηριότητας. Χρησιμοποιήστε το με προσοχή!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Τοποθεσία κωδικού του JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" "URL που στοχεύει σε έναν φάκελο με τα αρχεία και τα σενάρια του JClic" #: applet_prev_text msgid "HTML code before:" msgstr "Κώδικας HTML πριν:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Κείμενο ή κώδικας HTML που πρέπει να τοποθετηθεί πριν την εφαρμογή" #: applet_post_text msgid "HTML code after:" msgstr "Κώδικας HTML μετά:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Κείμενο ή κώδικας HTML που πρέπει να τοποθετηθεί μετά την εφαρμογή" #: applet_size msgid "Applet size:" msgstr "Μέγεθος εφαρμογής:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Πλάτος και ύψος της εφαρμογής, σε απόλυτες ή ποσοστιαίες τιμές." #: applet_page_title msgid "Page title:" msgstr "Τίτλος σελίδας:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Κείμενο που θα εμφανίζεται στο επάνω μέρος του φυλλομετρητή" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "Η ιστοσελίδα \"%s\" έχει δημιουργηθεί με επιτυχία." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Θέλετε να το ανοίξετε με τον φυλλομετρητή τώρα;" #: action_createHTML_caption msgid "Create web page..." msgstr "Δημιουργία ιστοσελίδας.." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Δημιουργία μιας HTML ιστοσελίδας με μικροεφαρμογή του Jclic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "" "Δημιουργία μιας HTML ιστοσελίδας με μικροεφαρμογή που εμπεριέχεται στο " "τρέχον έργο" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Όνομα αρχείου:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Όνομα του HTML αρχείου που θα δημιουργηθεί" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Μικροεφαρμογή" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Προεπιλεγμένες τιμές για τη δημιουργία ιστοσελίδων" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Χρώμα φόντου:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Χρώμα φόντου HTML ιστοσελίδας" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Κεντραρισμένο" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Τοποθετήστε την εφαρμογή κεντραρισμένη οριζόντια" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Πλάτος εφαρμογής (απόλυτη ή ποσοστιαία τιμή)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Ύψος εφαρμογής (απόλυτη ή ποσοστιαία τιμή)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Κατά την έξοδο, μετάβαση σε:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "" "URL στην οποία θα ανακατευθύνεται η περιήγηση κατά την έξοδο του JClic." #: applet_infoFrame msgid "Info frame name:" msgstr "Όνομα πλαισίου πληροφοριών:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Όνομα πλαισίου που χρησιμοποιείται για την εμφάνιση περιεχομένου σχετικού με " "το πλήκτρο \"πληροφορίες" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Δημιουργία εγκαταστάτη έργου..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "" "Δημιουργία σεναρίου εγκατάστασης έργου για τον αναπαραγωγέα του JClic" #: installer_caption msgid "Edit project installer script" msgstr "Επεξεργασία σεναρίου εγκαταστάτη έργου" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Τίτλος:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Τίτλος έργου που θα εμφανιστεί στον οδηγό εγκατάστασης" #: installer_authors msgid "Autors:" msgstr "Δημιουργοί:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Δημιουργός/οί του έργου (σύντομο κείμενο)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Φάκελος:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Όνομα φακέλου που προτείνεται από τον οδηγό εγκατάστασης" #: installer_files msgid "Files to be copied:" msgstr "Άρχεια για αντιγραφή:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Αρχεία που θα αντιγραφούν από τον εγκαταστάτη" #: installer_files_available msgid "Available files" msgstr "Διαθέσιμα αρχεία" #: installer_files_selected msgid "Selected files" msgstr "Επιλεγμένα αρχεία" #: installer_files_add msgid ">> add >>" msgstr ">> προσθήκη >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Προσθήκη επιλεγμένου αρχείου στη λίστα" #: installer_files_remove msgid "<< remove <<" msgstr "<<διαγραφή<<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Διαγραφή επιλεγμένου αρχείου από τη λίστα" #: installer_button msgid "Launch button" msgstr "Κουμπί έναρξης" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "" "Οι ιδιότητες το κουμπιού παρουσιάζονται στη βιβλιοθήκη του προγράμματος" #: installer_button_project msgid "Main project:" msgstr "Κύριο έργο" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Έργο του JClic που θα φορτωθεί με το πλήκτρο" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Ετικέτα:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "" "Ετικέτα σύντομου κειμένου που θα εμφανίζεται στο εσωτερικό του πλήκτρου" #: installer_button_icon msgid "Icon:" msgstr "Εικονίδιο:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Εικόνα που θα χρησιμοποιηθεί ως εικονίδιο πλήκτρου. Αν μείνει κενό θα " "χρησιμοποιηθεί το προεπιλεγμένο εικονίδιο του JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Περιγραφή" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Συμβουλή οθόνης που εμφανίζεται με το πλήκτρο" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Σφάλμα: Λείπει ο τίτλος του έργου" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Σφάλμα: Λείπει το όνομα φακέλου" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Σφάλμα: Μη επιλεγμένα αρχεία" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Σφάλμα: Λείπει η ετικέτα κειμένου του πλήκτρου φόρτωσης" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Σφάλμα: Το έργο που έχει ανατεθεί στο πλήκτρο φόρτωσης, δεν υπάρχει στη " "λίστα των προς αντιγραφή αρχείων" #: applet_page_full msgid "Full-page applet" msgstr "Μικροεφαρμογή πλήρους σελίδας" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "Μικροεφαρμογή με καθορισμένες διαστάσεις" #: edit_text_align_left msgid "Align text left" msgstr "Στοίχιση κειμένου αριστερά" #: edit_text_align_center msgid "Center text" msgstr "Στοίχιση κειμένου στο κέντρο" #: edit_text_align_right msgid "Align text right" msgstr "Στοίχιση κειμένου δεξιά" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Δημιουργία ή αφαίρεση στόχου" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Εισαγωγή ενός κελιού" #: edit_text_act_content msgid "Content" msgstr "Περιεχόμενο" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Στυλ" #: edit_cell_size msgid "Cell size:" msgstr "Μέγεθος κελιού:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Οι δραστηριότητες που ακολουθούν δεν περιλαμβάνονται σε καμία ακολουθία " "δραστηριοτήτων του έργου. Αυτό σημαίνει πως δεν θα εμφανίζονται:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "Τα παρακάτω αντικείμενα πολυμέσων δεν χρησιμοποιούνται απευθείας σε καμία " "δραστηριότητα:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "" "Θέλεις να προστεθούν στο τέλος της ακολουθίας της τελευταίας δραστηριότητας;" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Θέλεις να τα αφαιρέσεις;" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Διαγραφή μη χρησιμοποιημένων αντικειμένων πολυμέσων" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Ορφανές δραστηριότητες" #: edit_media_refreshAll msgid "Update all media content" msgstr "Αναβάθμιση όλων των μέσων" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "" "Ενημέρωση όλων των πολυμεσικών αντικειμένων με επαναφόρτωση των αρχείων τους" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Αναβάθμιση μέσων..." #: edit_media_exportAll msgid "Export all media" msgstr "Εξαγωγή όλων των μέσων" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Αποθήκευση σε αρχείο όλων των περιεχομένων των πολυμεσικών στοιχείων" #: edit_media_exportAll_keys msgid "X*" msgstr "Χ*" #: edit_shape_select msgid "Select" msgstr "Επιλογή" #: edit_shape_addPoint msgid "Add point" msgstr "Προσθήκη σημείου" #: edit_shape_deletePoint msgid "Delete" msgstr "Διαγραφή" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Σχεδίαση τετραπλεύρου" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Σχεδίαση έλλειψης" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Σχεδίαση πολυγώνου" #: edit_shape_toLine msgid "Convert to line" msgstr "Μετατροπή σε γραμμή" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Μετατροπή σε καμπύλη Bezier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Μετατροπή σε δευτεροβάθμια καμπύλη" #: edit_shape_rLeft msgid "Rotate left" msgstr "Περιστροφή αριστερά" #: edit_shape_rRight msgid "Rotate right" msgstr "Περιστροφή δεξιά" #: edit_shape_expand msgid "Expand" msgstr "Ανάπτυξη" #: edit_shape_contract msgid "Contract" msgstr "Απομάκρυνση" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Μεγέθυνση" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Σμίκρυνση" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Σύνδεση κοντινών σημείων" #: edit_shape_showPoints msgid "Show points" msgstr "Εμφάνιση σημείων" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Εμφάνιση/Απόκρυψη σημείων" #: edit_shape_gridSize msgid "Grid size:" msgstr "Μέγεθος πλέγματος:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Εμφάνιση/Απόκρυψη πλέγματος" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Ακτίνα μαγνήτη:" #: edit_shape_elements msgid "Defined elements" msgstr "Καθορισμένα στοιχεία" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Όνομα του επιλεγμένου αντικειμένου" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Ακτίνα δράσης του μαγνήτη, όταν ενεργοποιείται" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Μέγεθος πλέγματος" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Δραστηριότητα:" #: edit_mc_sequence msgid "Sequence:" msgstr "Ακολουθία:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Έργο:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Επιλογή δραστηριότητας" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Επιλογή ακολουθίας" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Ανεπαρκή δεδομένα!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Χρώμα βέλους:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Χρώμα που χρησιμοποιείται από τον συντάκτη για τον σχεδιασμό των βελών (όχι " "ακριβώς, επειδή χρησιμοποιείται μια XOR μάσκα)" #: edit_act_editActivity msgid "Edit..." msgstr "Επεξεργασία..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Επεξεργασία της επιλεγμένης δραστηριότητας" #: action_saveFileAs_caption msgid "Save as..." msgstr "Αποθήκευση ως..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Αποθήκευση της τρέχουσας εργασίας με διαφορετικό όνομα" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Συμπεριφορά" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Συμπεριφορά" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Σύρσιμο αντικειμένων" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Σύρε τα αντικείμενα αντί να χρησιμοποιήσεις τη γραμμή ένωσης" #: edit_act_behavior_order msgid "Check solving order" msgstr "Έλεγχος σειράς λύσεων" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Τα κελιά πρέπει να λυθούν με σειρά" #: edit_act_scramble msgid "Scramble" msgstr "Ανακάτωμα όλων" #: action_importActivities_caption msgid "Import activities..." msgstr "Εισαγωγή δραστηριοτήτων..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Εισαγωγή δραστηριοτήτων από άλλο σχέδιο εργασίας" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "Το επιλεγμένο αρχείο αντιστοιχεί στο τρέχον έργο. Δραστηριότητες μπορούν να " "εισαχθούν μόνο μεταξύ διαφορετικών έργων. Παρακαλώ επιλέξτε ένα άλλο αρχείο " "έργου." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" "Επιλέξτε μια ή περισσότερες δραστηριότητες για εισαγωγή στο ενεργό σχέδιο " "εργασίας" #: import_importing msgid "Importing..." msgstr "Εισαγωγή..." #: import_checkdep msgid "Checking dependencies..." msgstr "Έλεγχος εξαρτήσεων" #: import_impmedia msgid "Importing media\\:" msgstr "Εισαγωγή μέσων" #: import_impact msgid "Importing activity\\:" msgstr "Εισαγόμενη δραστηριότητα" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "" "Επιλέξτε το σχέδιο εργασίας του JClic από όπου θα εισαχθούν οι δραστηριότητες" #: edit_tagRep_tags msgid "Tag marks" msgstr "Σημάνσεις ετικέτας" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Αρχή σήμανσης" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Σήμανση που χρησιμοποιείται στην αρχή της σήμανσης" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Τέλος σήμανσης" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Σήμανση που χρησιμοποιείται στο τέλος της σήμανσης" #: edit_tagRep_file msgid "File" msgstr "Αρχείο" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Αρχείο ή ιστοτόπος" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Όνομα ή URL του αρχείου που περιέχει τις τιμές, οι οποίες θα αντικαταστήσουν " "τις ετικέτες" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Σετ χαρακτήρων" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Κωδικοποιημένοι χαρακτήρες χρησιμοποιούνται στο αρχείο" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Περιήγηση..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Περιήγηση στο σύστημα αρχείων" #: edit_tagRep_title msgid "Tag replacing" msgstr "Αντικατάσταση ετικέτας" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Αφαίρεση στυλ κειμένου..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Προσοχή\\: Αυτή η ενέργεια θα αφαιρέσει τα ιδιαίτερα χαρακτηριστικά του " "κειμένου που εφαρμόζονται στο έγγραφο και θα εφαρμόσει το κύριο στυλ. Αυτή η " "ενέργεια δεν μπορεί να αναιρεθεί. Θέλετε οπωσδήποτε να το κάνετε;" #: img_max_size msgid "Maximum size of images:" msgstr "Μέγιστο μέγεθος εικόνων:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Μέγιστο πλάτος εικόνων που εισάγονται στη βιβλιοθήκη πολυμέσων." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Μέγιστο ύψος εικόνων που εισάγονται στη βιβλιοθήκη πολυμέσων." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "Η εικόνα \"%s\" έχει μέγεθος %s εικονοστοιχείων. Αυτό ξεπερνάει το μέγιστο " "μέγεθος που επιτρέπεται από το JClic Author (%s). Θέλετε να αλλάξετε το " "μέγεθος;" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_es.po000066400000000000000000002453011335566474600234330ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2011-10-26 04:18+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Descripción" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nombre de la actividad" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nombre:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Descripción de la actividad" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Informes" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Incluir esta actividad en los informes" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Incluir los resultados de esta actividad en los informes de usuario" #: edit_act_code msgid "Code:" msgstr "Codigo:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Código opcional utilizado para agrupar y filtrar en la base de datos de " "informes." #: edit_act_reportActions msgid "Report user actions" msgstr "Registrar también las acciones" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "" "Registrar los detalles de todas las acciones efectuadas por los usuarios." #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Contadores" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Contador de tiempo" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Mostrar u ocultar el contador de tiempo." #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Contador de intentos" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Mostrar u ocultar el contador de intentos." #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Contador de aciertos" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Mostrar u ocultar el contador de aciertos." #: edit_act_maxTime msgid "Max time:" msgstr "Tiempo máximo:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Tiempo máximo permitido para resolver la actividad, en segundos. El cero " "significa tiempo ilimitado." #: edit_act_countdown msgid "Countdown" msgstr "Cuenta atrás" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "El contador empieza al valor máximo, decreciendo hasta cero." #: edit_act_maxActions msgid "Max tries:" msgstr "Intentos máx.:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Número máximo de intentos permitidos, o cero para ilimitado." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Botones" #: edit_act_helpBtn msgid "Help" msgstr "Ayuda" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Mostrar o esconder el botón de ayuda" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Mostrar la solución" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Mostrar este mensaje:" #: edit_act_infoBtn msgid "Information" msgstr "Información" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Mostrar u ocultar el botón de información" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Mostrar esta URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Ejecutar el comando:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Dirección de la página web que se mostrará al hacer clic en el botón de " "información." #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "" "Linea de órdenes que se ejecutará al hacer clic en el botón de información." #: edit_act_mainWindow msgid "Main window:" msgstr "Ventana principal:" #: edit_act_gameWindow msgid "Game window:" msgstr "Ventana de juego:" #: edit_act_margin msgid "Margin:" msgstr "Margen:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Espacio vertical y horizontal entre objetos visuales." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Color de fondo:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Cambiar el color de fondo." #: edit_gradient_startColor msgid "Start color:" msgstr "Color inicial:" #: edit_gradient_endColor msgid "End color:" msgstr "Color final:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Selección del color inicial" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Selección del color final" #: edit_gradient_cycles msgid "Cycles:" msgstr "Ciclos:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Número de repeticiones del gradiente sobre la superficie a pintar." #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientación:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Orientación del gradiente, medida en grados sobre la horizontal." #: edit_act_gradient msgid "Gradient:" msgstr "Gradiente:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Utilizar un gradiente de colores" #: edit_color_opacity msgid "Opacity" msgstr "Opacidad" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Ajusta el valor del canal alfa (opacidad) de color." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Gradiente" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Utilizar los valores por defecto (gradiente nulo)" #: edit_act_image msgid "Image:" msgstr "Imagen:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Descripción" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nombre y descripción" #: edit_act_tiledBgImg msgid "Tiled" msgstr "En mosaico" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Pinta toda la superficie con la imagen, repitiéndola a lo largo de los ejes " "X e Y tantas veces como sea necesario." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Vista previa:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Borde" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Dibujar una linea de borde alrededor de la ventana" #: edit_act_transparent msgid "Transparent" msgstr "Transparente" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "La ventana tiene el fondo transparente" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Anchura:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Altura:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Anchura del objeto, indicada en pixels" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Altura del objeto, en pixels" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Centrada" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "El objeto se situa centrado respecto a la ventana principal" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Posición horizontal absoluta" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Posición vertical absoluta" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interfaz de usuario" #: edit_act_image_tooltip msgid "Select an image" msgstr "Seleccionar una imagen" #: edit_act_text msgid "Text:" msgstr "Texto:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Texto que se mostrará en este objeto" #: edit_font_face msgid "Typeface:" msgstr "Tipo:" #: edit_font_size msgid "Size:" msgstr "Tamaño:" #: edit_font_bold msgid "Bold" msgstr "Negrita" #: edit_font_italic msgid "Italic" msgstr "Cursiva" #: edit_font_underline msgid "Underline" msgstr "Subrayado" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Estilo:" #: edit_cell_title msgid "Cell contents" msgstr "Contenido de la casilla" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Mensajes" #: edit_act_msg_initial msgid "Initial message:" msgstr "Mensaje inicial:" #: edit_act_msg_final msgid "Final message:" msgstr "Mensaje final:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Mensaje previo:" #: edit_act_msg_error msgid "Error message:" msgstr "Mensaje de error:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Mensaje que se muestra al inicar la actividad" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Mensaje que se muestra al acabar la actividad" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Mensaje que se muestra al acabar la actividad con errores" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Mensaje que se muestra antes de empezar (solo en ciertos tipos de " "actividades)" #: edit_align msgid "Align:" msgstr "Orientación:" #: edit_act_textColor msgid "Text color:" msgstr "Color del texto:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Color utilizado para dibujar el texto" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Color de la sombra:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Color utilizado en la sombra del texto, si existe." #: edit_act_shadow msgid "Shadow" msgstr "Sombra" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Dibujar el texto con sombra" #: edit_act_borderColor msgid "Border color:" msgstr "Color del borde:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Color utilizado para dibujar el borde de la casilla" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Color de estado inactivo:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Color utilizado cuando la casilla está desactivada" #: edit_act_altColor msgid "Alternative color:" msgstr "Color alternativo:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Color con el que se muestra el contenido alternativo de las casillas una vez " "solucionadas." #: edit_cell_marked msgid "Marked" msgstr "Marcada" #: edit_cell_disabled msgid "Disabled" msgstr "Desactivada" #: edit_cell_alt msgid "Alternative" msgstr "Alternativa" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Margen interno:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Espacio entre los bordes de la celda y el texto." #: edit_cell_borderWidth msgid "Border width:" msgstr "Grosor del borde:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Grosor del trazo utilizado para dibujar el borde." #: edit_cell_markerWidth msgid "Marker width:" msgstr "Grosor del marcador:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Grosor del trazo utilizado para dibujar el borde cuando la casilla se " "encuentra marcada o seleccionada." #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Vista previa de la casilla en estado \"alternativo\"" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Vista previa en estado \"desactivado\"" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Vista previa en estado \"marcado\"" #: edit_act_testAction msgid "Preview activity" msgstr "Mostrar actividad" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Probar el funcionamiento de la actividad" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Descripción" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Título y descripción de la actividad" #: edit_act_panels_options msgid "Options" msgstr "Opciones" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opciones de la actividad" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Ventana" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "" "Aspecto, tamaño y posición de la ventana en la que corre la actividad" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Mensajes" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Contenido de los mensajes de la actividad" #: edit_act_panels_panel msgid "Panel" msgstr "Panel" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Contenido del panel" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Estilo" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Ajustar el color, tipo y tamaño de letra de las celdas" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Estilo:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Evitar sobreposición imagen/texto" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Intentar evitar que texto e imagen se solapen" #: edit_media_exists_1 msgid "The file" msgstr "El archivo" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "ya se encuentra en la mediateca!" #: edit_act_shaper msgid "Shaper:" msgstr "Recortador:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Error en el generador de formas:" #: edit_act_num_cols msgid "Columns:" msgstr "Columnas:" #: edit_act_num_rows msgid "Rows:" msgstr "Filas:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Altura de los dientes:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Anchura de los dientes:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Distribución aleatoria" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Propiedades del generador de formas" #: edit_act_panels_text msgid "Text" msgstr "Texto" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Texto de la actividad" #: action_saveFile_caption msgid "Save..." msgstr "Guardar..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "GG" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Guardar el proyecto" #: action_docTree_caption msgid "Document tree..." msgstr "Árbol del documento..." #: action_docTree_keys msgid "T*" msgstr "A*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Mostrar el documento del proyecto en forma de árbol" #: edit_docTree_title msgid "Document tree" msgstr "Árbol del documento" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Referenciado por:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Atención:

Este proyecto " "enlaza con otros proyectos.
¿Desea explorar los enlaces y cargar todos " "los archivos relacionados?

(Se recomienda responder SI cuando se " "está importando un paquete de actividades Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Tipo:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Desconocido" #: edit_mc_type_sound msgid "Play sound" msgstr "Interpretar sonido" #: edit_mc_type_video msgid "Play video" msgstr "Interpretar video" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Interpretar MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Interpretar CD audio" #: edit_mc_type_record msgid "Record sound" msgstr "Grabar sonido" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Interpretar grabación" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Ir a la actividad" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Ir a la secuencia" #: edit_mc_type_run_external msgid "Run program" msgstr "Ejecutar un programa" #: edit_mc_type_url msgid "Show URL" msgstr "Mostrar la URL" #: edit_mc_type_exit msgid "End" msgstr "Acabar" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Volver" #: edit_mc_level msgid "Priority level:" msgstr "Nivel de prioridad:" #: edit_mc_file msgid "File:" msgstr "Archivo:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parámetros:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Desde:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Hasta:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Duración máx.:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Cinta de grabación:" #: edit_mc_stretch msgid "Stretch size" msgstr "Comprimir si no cabe" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Posición:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Desde:" #: edit_mc_location_from_box msgid "Cell" msgstr "Celda" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Ventana" #: edit_mc_location_from_frame msgid "Frame" msgstr "Marco" #: edit_mc_loop msgid "Loop playback" msgstr "Repetir indefinidamente" #: edit_mc_autostart msgid "Auto start" msgstr "Arranque automático" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Capturar ratón" #: edit_mc_title msgid "Multimedia and active content" msgstr "Contenido activo y multimedia" #: edit_mc_label msgid "Active content:" msgstr "Contenido activo:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Selección del objeto multimedia" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Biblioteca de recursos" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Centrado en la celda" #: edit_mc_pos_window msgid "Centered over window" msgstr "Centrado en la ventana" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Especificar posición:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "La estructura o los datos del árbol son incorrectos." #: edit_act_panels_controls msgid "Controls" msgstr "Controles" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opciones de botones y contadores" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Tipo:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Distribución de los paneles:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Posición relativa de los paneles A y B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Resolución inversa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "La actividad se considerará resuelta cuando todos los elementos de \"B\" " "estén emparejados." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Mostrar todas las flechas" #: edit_act_alt msgid "Alternative content:" msgstr "Contenido alternativo:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "" "Contenido que se muestra en las casillas ya resueltas o no asignadas." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Editar el contenido alternativo" #: edit_act_grid msgid "Grid" msgstr "Panel" #: edit_act_grid_A msgid "Grid A" msgstr "Panel A" #: edit_act_grid_B msgid "Grid B" msgstr "Panel B" #: edit_act_grid_layout msgid "Layout" msgstr "Distribución" #: edit_act_grid_relationship msgid "Relationship" msgstr "Relaciones" #: edit_seq_activity_header msgid "activity" msgstr "actividad" #: edit_seq_tag_header msgid "tag" msgstr "etiqueta" #: edit_seq_jump_header msgid "jump to" msgstr "salto a" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Actividad:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Etiqueta:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Descripción:" #: edit_seq_auto msgid "Move on automatically" msgstr "Avance automático" #: edit_seq_delay msgid "Delay:" msgstr "Retardo:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Avanzar" #: edit_seq_action_back msgid "Go bak" msgstr "Retroceder" #: edit_seq_action_jump msgid "Jump to..." msgstr "Saltar a..." #: edit_seq_action_stop msgid "Stop" msgstr "Detenerse" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Volver" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Salir de JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Flecha adelante:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Flecha atrás:" #: edit_seq_action msgid "Action:" msgstr "Acción:" #: edit_seq_button_enabled msgid "Show button" msgstr "Mostrar botón" #: edit_seq_project msgid "JClic Project:" msgstr "Proyecto JClic:" #: edit_act_absolute msgid "Absolute position" msgstr "Posición absoluta" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "El objeto se situará en las coordenadas X e Y que se especifiquen" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Posición:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Nuevo elemento de secuencia..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Insertar un nuevo elemento en la secuencia de actividades" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Seleccione una actividad para el nuevo elemento de secuencia." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "¡No se puede crear un nuevo elemento de secuencia sin indicar la actividad!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "En este proyecto no hay ninguna actividad. No se pueden crear elementos de " "secuencia en un proyecto vacío." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Destino del salto:" #: edit_seq_jump_title msgid "Jump target" msgstr "Destino del salto" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Añadir una nueva actividad al projecto" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Tipo de actividad:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nombre:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "" "Seleccione el tipo de actividad que desea crear y asígnele un nombre:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "¡Hay que seleccionar un tipo de actividad!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "¡Hay que indicar un nombre para la actividad!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "¡No se ha podido crear la actividad!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Clase Java:" #: edit_text_act_format msgid "Format" msgstr "Formato" #: edit_text_act_answer msgid "Answer" msgstr "Respuesta" #: edit_text_act_popup msgid "Pop up" msgstr "Ventana emergente" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Respuestas válidas:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Añadir un nuevo elemento a la lista" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Modificar el elemento seleccionado" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Eliminar el elemento seleccionado de la lista" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Mover arriba" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Mover abajo" #: edit_list_newValue msgid "New text:" msgstr "Nuevo texto:" #: edit_list_addElement msgid "Add new list element" msgstr "Añadir un nuevo elemento de texto" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Modificación del texto seleccionado" #: edit_text_act_target msgid "Target" msgstr "Incógnita" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Longitud máxima:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Número máximo de caracteres permitidos en la respuesta." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Carácter de relleno" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Carácter utilizado para indicar la incógnita" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Longitud inicial:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Número de caracteres de relleno que se mostraran al inicio de la actividad." #: edit_text_act_iniText msgid "Initial text:" msgstr "Texto inicial:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Texto que se mostrará en la incógnita al iniciar la actividad." #: edit_text_act_list msgid "Show a list of options:" msgstr "Mostrar una lista de opciones:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "El usuario/a deberá elegir una opción en una lista." #: edit_text_act_check_title msgid "Correction options" msgstr "Opciones de evaluación" #: edit_text_act_popup_no msgid "No pop up" msgstr "Sin ventana emergente" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Aparición automática" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Aparición en errores" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Aparición con F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Tipo:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Retardo de aparicion:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Tiempo máximo:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Solamente interpretar sonido" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "Para crear una nueva incógnita es necesario seleccionar un fragmento de " "texto." #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" "El texto de las incógnitas no puede incluir retornos de párrafo ni " "tabuladores." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Las incógnitas no se pueden solapar" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "¡Las incógnitas no pueden contener celdas!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Color del papel:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Editar los estilos del documento..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Estilo principal:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Tab space:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Espacios entre marcas de tabulador:" #: edit_text_act_colors msgid "Colors:" msgstr "Colores:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Colores de las incógnitas:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Colores de error:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Vista preliminar:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Texto normal" #: edit_text_act_styleSample_target msgid "target" msgstr "incógnita" #: edit_text_act_styleSample_error msgid "error" msgstr "error" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "texto normal" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "texto normal." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Atención: esta acción suprimirá la incógnita actualmente seleccionada. " "¿Seguro que desea hacerlo?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Ventana previa..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "No mostrar ningún texto antes de empezar la actividad" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Mostrar el texto completo del ejercicio" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Mostrar este texto:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Tiempo màximo:" #: edit_text_act_edit_target msgid "Target..." msgstr "Incógnita..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Mostrar botón de evaluación" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Texto del botón:" #: edit_text_act_checkCase msgid "Match case" msgstr "Comprobar mayúsculas / minúsculas" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Considerar acentos y caracteres especiales" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Considerar los símbolos de puntuación" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Permitir espacios repetidos" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Criterios" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Saltar automáticamente a la siguiente incógnita" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Avanzar solo si se responde correctamente" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Indicar la posición de los errores" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Parámetros del algoritmo de análisis:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Pasos:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Campo de exploración:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Evaluación" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Análisis de las respuestas" #: edit_text_act_check_bt msgid "Correction..." msgstr "Evaluación..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Botón de evaluación" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progreso" #: edit_text_act_typeBtn msgid "Type..." msgstr "Tipo..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ordenar párrafos" #: edit_text_act_orderWords msgid "Order words" msgstr "Ordenar palabras" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Barajar palabras entre párrafos" #: edit_text_act_type_title msgid "Activity type" msgstr "Tipo de actividad" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Esta acción suprimirá todas las incógnitas actualmente definidas. ¿Seguro " "que desea hacerlo?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identificar palabras" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identificar caracteres" #: edit_media_change_name msgid "Change name..." msgstr "Cambiar nombre..." #: edit_media_change_file msgid "Change file..." msgstr "Cambiar el archivo..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Guardarlo en el archivo ZIP" #: edit_media_type msgid "Media type:" msgstr "Tipo de recurso:" #: edit_media_size msgid "File size:" msgstr "Tamaño del archivo:" #: edit_media_show_type msgid "Files of type:" msgstr "Tipo de archivos:" #: edit_media_preview msgid "Preview media" msgstr "Visualizar objeto" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Previsualización del recurso multimedia" #: edit_media_rename msgid "Change resource name" msgstr "Cambiar el nombre del recurso" #: edit_media_rename_title msgid "Rename" msgstr "Renombrar" #: edit_media_rename_prompt msgid "New name:" msgstr "Nuevo nombre:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "¡Nombre de recurso no válido!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Ya existe otro recurso con este nombre. Los recursos deben tener un nombre " "único en el proyecto." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Archivo incorrecto" #: err_media_chfile_different msgid "File must be of same type" msgstr "File must be of same type" #: edit_media_font_error msgid "Unable to load font!" msgstr "No se pudo cargar el tipo de letra." #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Guardar el archivo (extraerlo del ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Actualizar el contenido del recurso desde el archivo" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Este no es un archivo real, sino un objeto situado en el interior de un " "contenedor ZIP. Para utilizar esta función es necesario que exista un " "archivo con el mismo nombre en la carpeta donde se halla el archivo ZIP." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Actividades" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Secuencias" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Mediateca" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Gestión de las imágenes y otros recursos utilizados en el proyecto." #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Creación y edición de las actividades del proyecto" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Creación y edición de secuencias de actividades" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Título:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Título del proyecto" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Proyecto" #: edit_project_tooltip msgid "Edit project properties" msgstr "Edición de las propiedades del proyecto" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Descripción:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Descripción general del proyecto" #: edit_project_area msgid "Areas:" msgstr "Areas:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Áreas curriculares a las que se orienta el proyecto" #: edit_project_level msgid "Levels:" msgstr "Niveles:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Niveles y ciclos educativos a los que se orienta el proyecto" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descriptores:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descriptores del proyecto (separados por comas)" #: edit_project_languages msgid "Languages:" msgstr "Idiomas:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Idiomas utilizados en el proyecto" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Cambio del idioma seleccionado" #: edit_project_languages_add msgid "Add language" msgstr "Añadir idioma" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Códigos de idioma ISO-639:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autores/as:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Personas que han participado en la creación del proyecto" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nombre:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "Correo electrónico:" #: edit_project_author_rol msgid "Rol:" msgstr "Rol:" #: edit_project_author_organization msgid "Organization:" msgstr "Organización:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nombre del autor/a (campo obligatorio)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Dirección de correo electrónico del autor/a (opcional)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Rol de la persona en el proyecto: autor, colaborador, dibujos, sonidos... " "(opcional)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Escuela, universidad, asociación... (campo opcional)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Página web personal (campo opcional)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Otras características (campo opcional)" #: edit_project_author_info msgid "Author info:" msgstr "Datos del autor/a:" #: edit_project_author_add msgid "Add author to list" msgstr "Añadir un autor a la lista" #: edit_project_author_edit msgid "Edit author info" msgstr "Modificación de los datos del autor/a" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nombre:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nombre de la escuela" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "Correo electrónico:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Dirección de correo electrónico de la escuela" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Dirección web de la escuela" #: edit_project_org_address msgid "Address:" msgstr "Dirección:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Dirección postal de la escuela" #: edit_project_org_pc msgid "PC:" msgstr "CP:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Código postal" #: edit_project_org_city msgid "City:" msgstr "Localidad:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Localidad de la escuela" #: edit_project_org_country msgid "Country:" msgstr "Pais:" #: edit_project_org_state msgid "State:" msgstr "Estado:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_org msgid "School/s:" msgstr "Centro/s:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Escuelas y otras instituciones que han participado en el proyecto" #: edit_project_org_info msgid "Organization info:" msgstr "Datos de la organización:" #: edit_project_org_add msgid "Add organization" msgstr "Añadir una nueva organización" #: edit_project_org_edit msgid "Edit organization data" msgstr "Modificar los datos de la organización" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Estado, pais, federación..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Estado federal, nacionalidad, comunidad, región..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Otros datos..." #: edit_project_rev_date msgid "Date:" msgstr "Fecha:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Fecha de la revisión" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autores/as:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autores/as de la revisión" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Descripción:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Breve descripción de los cambios realizados" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Información adicional" #: edit_project_rev msgid "Revisions:" msgstr "Revisiones:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Historial de las principales modificaciones efectuadas al proyecto" #: edit_project_rev_add msgid "Add revision record" msgstr "Añadir un registro de revisión" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Edición de los datos de la revisión" #: edit_project_rev_info msgid "Revision data" msgstr "Características de la revisión" #: edit_media_objects msgid "objects" msgstr "objetos" #: edit_media_object msgid "object" msgstr "objeto" #: edit_evsounds_start msgid "Start of activity:" msgstr "Inicio de actividad:" #: edit_evsounds_click msgid "Click on object:" msgstr "Hacer clic en un objeto:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Acción errónea:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Acción correcta:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Actividad finalizada con errores:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Actividad correctamente finalizada:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Error: La descripción no se puede dejar en blanco" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Edición de los sonidos de evento" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Sonidos de evento:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Asignar sonidos específicos a cada evento de JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Sonidos de evento:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Asignar sonidos específicos a cada evento de JClic" #: edit_evsounds_default msgid "default sound" msgstr "sonido por defecto" #: edit_evsounds_disabled msgid "disabled" msgstr "desactivado" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Activa o desactiva el sonido para este evento" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Haga clic para seleccionar el sonido ligado a este evento, o desmarque para " "utilizar el sonido por defecto" #: action_newProject_caption msgid "New project..." msgstr "Nuevo proyecto..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Crear un nuevo proyecto JClic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Desde:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Valor mínimo del operando" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Hasta:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Valor máximo del operando" #: edit_arith_op_with msgid "With:" msgstr "Con:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Si se marca, el operando puede tener también este valor" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Uno de la lista:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Lista de posibles valores del operando" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Decimales:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Número de decimales del operando" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (entero)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#,#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#,##" #: edit_arith_firstOp msgid "First operand" msgstr "Primer operando" #: edit_arith_secondOp msgid "Second operand" msgstr "Segundo operando" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 para JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operaciones:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Selecciona el tipo de operaciones a efectuar" #: edit_arith_operations_plus msgid "Plus" msgstr "Sumas" #: edit_arith_operations_minus msgid "Minus" msgstr "Restas" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Multiplicaciones" #: edit_arith_operations_divide msgid "Divide" msgstr "Divisiones" #: edit_arith_unknown msgid "Unknown:" msgstr "Incógnita:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Selecciona el elemento que hará de incógnita" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "La incógnita es el resultado" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "La incógnita es el segundo operando" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "El primer operando es la incógnita" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "La operación es la incógnita" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Escribir la expressión empezando por el resultado" #: edit_arith_result msgid "Result:" msgstr "Resultado:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Sin \"llevar\"" #: edit_arith_result_random msgid "Random" msgstr "Aleatorio" #: edit_arith_result_asc msgid "Ascending" msgstr "Ascendente" #: edit_arith_result_order msgid "Order by result:" msgstr "Ordenar por resultado:" #: edit_arith_result_desc msgid "Descending" msgstr "Descendente" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Evitar duplicados" #: edit_arith_cond msgid "Conditions:" msgstr "Condiciones:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indiferente" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "El primer operando debe ser mayor que el segundo" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "El primer operando debe ser menor que el segundo" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Otras condiciones" #: edit_autocp msgid "Automatic content generator:" msgstr "Generador automático de contenido:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" "Selección del tipo de generador automático de contenido para esta actividad." #: edit_autocp_block msgid "Content generator" msgstr "Generador de contenido" #: edit_autocp_btn msgid "Settings..." msgstr "Configuración..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Configuración de los parámetros del generador de contenido" #: edit_data msgid "Edit data" msgstr "Edición de datos" #: edit_act msgid "Activity edit" msgstr "Edición de la actividad" #: edit_acp msgid "Content provider edit" msgstr "Edición del generador de contenido" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "¡Error de creación del generador automático de contenido!" #: edit_project_author_group msgid "Creation" msgstr "Creación" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Descripción" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interfaz de usuario" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Descripción:" #: m_Edit msgid "Edit" msgstr "Edición" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "V*" #: edit_act_newActivity msgid "New activity..." msgstr "Nueva actividad..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "M#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Insertar" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Ver" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Proyecto" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Editar las propiedades del proyecto" #: action_editMedia_caption msgid "Media" msgstr "Mediateca" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Edición de la biblioteca multimedia del proyecto" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Actividades" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Edición de las actividades" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Secuencias" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Edición de las secuencias de actividades" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "El proyecto actual ha sido modificado. ¿Desea guardar los cambios?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descriptores" #: edit_media_new msgid "New media object..." msgstr "Nuevo objeto multimedia..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Añadir una imagen o un objeto multimedia a la mediateca" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Umbral de puntuación:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Seguir este camino cuando la puntuación global sea mayor o igual que..." #: edit_seq_time msgid "Time threshold:" msgstr "Umbral de tiempo:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Para seguir este camino hay que haber realizado las actividades en un tiempo " "inferior a..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Sigue este camino siempre que la puntuación global sea inferior a..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Seguir este camino siempre que el tiempo empleado en las actividades sea " "superior a..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Saltos condicionales" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Especificar saltos que se ejecutaran únicamente si se dan determinadas " "condiciones" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Indicar las condiciones para saltar a un nivel superior" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Salto inferior:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Salto superior:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Indicar las condiciones para saltar a un nivel inferior" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Acción asignada al botón de avanzar" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Acción asignada al botón de retroceder" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Indicar el destino del salto" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Acción a realizar" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Actividad asociada a este elemento de secuencia" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Etiqueta utilizada para referirse a este elemento de secuencia (campo " "opcional)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Descripción del elemento de secuencia (campo opcional)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Activar o desactivar el botón de paso de actividad" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Avanzar automáticamente al acabar la actividad" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Número de segundos a esperar antes de realizar el paso automático" #: edit_color_dlgTitle msgid "Select color" msgstr "Selección del color" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Por favor, espere mientras se cambia el nombre del recurso..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Ancho:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Anchura de las celdas (en pixels)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Alto:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Altura de las celdas (en pixels)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Palabras escondidas:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Lista de las palabras escondidas en el panel" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Utilizar el panel B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "Usar un segundo panel, que se mostrará a medida que se vayan encontrando las " "palabras" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Selección del tipo de generador de formas del panel" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Número de columnas del panel" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Número de filas del panel" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Separadores transparentes" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "" "Mostrar los separadores (casillas negras) como agujeros transparentes" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Mezclas:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Número de veces que se mezclaran las piezas" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Copiar atributos a..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Atributos:" #: edit_act_copy_dest msgid "Apply to:" msgstr "Aplicar a:" #: edit_act_copy_style_main msgid "Main window" msgstr "Ventana principal" #: edit_act_copy_style_play msgid "Play window" msgstr "Ventana de juego" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Actividades a modificar:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Copiar atributos" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "" "Copiar a otras actividades algunos de los atributos de la actividad actual" #: edit_new_project_name msgid "Project name:" msgstr "Nombre del proyecto:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Nombre corto y descriptivo del proyecto" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nombre del archivo:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nombre del archivo del proyecto, sin extensión" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Carpeta:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nombre de la carpeta en la que se guardará el proyecto" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Navegar..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Creación de un nuevo proyecto JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Error: Tanto el proyecto como el archivo y la carpeta deben tener nombres " "válido." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "En esta carpeta existe ya otro proyecto Clic3.0 o JClic. Para evitar " "confusiones se recomienda mantener cada proyecto en una carpeta " "independiente, aunque no es un requisito imprescindible. ¿Realmente desea " "crear el nuevo proyecto en esta carpeta?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Error: ¡No fue posible crear la carpeta indicada!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Error: No se ha seleccionado ninguna actividad. Para utilizar esta función " "es necesario seleccionar en la lista la actividad o actividades a las que se " "aplicaran los atributos indicados." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Copiando atributos a:" #: edit_act_copy_margin msgid "Margin" msgstr "Margen" #: edit_act_copy_bgColor msgid "Background color" msgstr "Color de fondo" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Gradiente" #: edit_act_copy_bgImage msgid "Background image" msgstr "Imagen de fondo" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Borde" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Fondo transparente" #: edit_act_copy_position msgid "Position" msgstr "Posició" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Mensajes" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Estilo del mensaje inicial" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Estilo del mensaje final" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Estilo del mensaje de error" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Informes" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Incluir la actividad en los informes" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Registrar acciones" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interfaz de usuario" #: edit_act_copy_skin msgid "Skin" msgstr "Entorno visual" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Sonidos de evento" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Contadores" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Contador de tiempo" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Tiempo máximo" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Contador de intentos" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Número máximo de intentos" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Contador de aciertos" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Número de veces que hay que barajar" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Botones" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Botón de ayuda" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Botón de información" #: edit_act_copy_grids msgid "Grids" msgstr "Paneles" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Estilo del panel A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Estilo del panel B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Estilo de los paneles de texto" #: edit_act_copy_text msgid "Text activities" msgstr "Actividades de texto" #: edit_act_copy_fontFace msgid "Font face" msgstr "Tipo de letra" #: edit_act_copy_fontSize msgid "Font size" msgstr "Tamaño de letra" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Estilo de letra" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Color del texto principal" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Color de las incógnitas" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Color de los errores" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Espacio entre tabuladores" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Estilo del mensaje previo" #: edit_act_changeType msgid "Change activity type" msgstr "Cambiar el tipo de actividad" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Nombre completo de la clase que se utilizará para construir la actividad " "(usuarios avanzados!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Otras..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Los usuarios/as avanzados/as pueden crear también otros tipos de actividades " "JClic no registradas. Escriba debajo el nombre completo de la clase, " "precedida por el del paquete (por ejemplo: " "\"com.acme.activities.FooActivity\"). Las nuevas actividades deben extender " "edu.xtec.jclic.Activity, y han de ser accesibles al cargador de clases de la " "máquina virtual de Java." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nombre de la actividad" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Cada actividad debe tener un nombre único en el proyecto" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Atención: " "El cambio del tipo puede causar la pérdida de algunos de los atributos y " "objetos de la actividad que se está editando. ¡Utilice está función con " "cuidado!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Ubicación del código JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" "URL que apunta a una carpeta en la que estén ubicados los archivos de " "programa de JClic" #: applet_prev_text msgid "HTML code before:" msgstr "Código HTML previo:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Texto o código HTMl que aparecerá antes del applet" #: applet_post_text msgid "HTML code after:" msgstr "Código HTML posterior:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Texto o código HTMl que aparecerá después del applet" #: applet_size msgid "Applet size:" msgstr "Tamaño del applet:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Anchura y altura del applet, en valores absolutos o porcentuales." #: applet_page_title msgid "Page title:" msgstr "Título de la página:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "" "Texto que se mostrará en la parte superior de la ventana del navegador" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "La página web \"%s\" ha sido creada con éxito." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "¿Desea abrirla ahora con el navegador?" #: action_createHTML_caption msgid "Create web page..." msgstr "Crear página web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Creación de una página HTML con un applet JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "" "Creación de una página HTML con un applet que contenga el proyecto actual." #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nombre del archivo:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nombre del archivo HTML a crear" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Valores por defecto usados en la creación de páginas web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Color de fondo:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Color de fondo de la página web" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Centrado" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Situar el applet centrado horizontalmente" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Anchura del applet (en valor absoluto o porcentual)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Altura del applet (en valor absoluto o porcentual)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Al salir, ir a:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL hacia el que se redirigirá la navegación al salir de JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Marco de información:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Name of the frame used to show the content related to the \"info\" button" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Crear instalador del proyecto..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Creación de un archivo de instalación del proyecto para JClic player" #: installer_caption msgid "Edit project installer script" msgstr "Edición del archivo de instalación del proyecto" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Título:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Título del proyecto que se mostrará en el asistente de instalación" #: installer_authors msgid "Autors:" msgstr "Autores/as:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autores/as del proyecto (texto corto)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Carpeta:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Nombre de carpeta que sugerirá el asistente de instalación" #: installer_files msgid "Files to be copied:" msgstr "Archivos a copiar:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Archivos que se copiaran durante la instalación" #: installer_files_available msgid "Available files" msgstr "Archivos disponibles" #: installer_files_selected msgid "Selected files" msgstr "Archivos seleccionados" #: installer_files_add msgid ">> add >>" msgstr ">> añadir >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Añadir el archivo seleccionado a la lista" #: installer_files_remove msgid "<< remove <<" msgstr "<< quitar <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Quitar el archivo seleccionado de la lista" #: installer_button msgid "Launch button" msgstr "Botón de activación" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Propiedades del botón que se mostrará en la biblioteca de proyectos" #: installer_button_project msgid "Main project:" msgstr "Proyecto principal:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Proyecto JClic asociado botón" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Etiqueta:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Breve etiqueta de texto, que aparecerá dentro del botón" #: installer_button_icon msgid "Icon:" msgstr "Icono:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Imagen que mostrará el botón. Dejar en blanco para usar el icono por defecto " "de JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Descripción" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Texto de ayuda emergente que mostrará el botón" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Error: Hay que indicar el título del proyecto" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "" "Error: Hay que indicar el nombre de la carpeta en la que se instalará el " "proyecto" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Error: No ha seleccionado ningún archivo" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Error: Hay que indicar el texto del botón de activación" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Error: El proyecto asignado al botón de activación no se encuentra entre los " "archivos a copiar" #: applet_page_full msgid "Full-page applet" msgstr "El applet ocupa toda la página" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "El applet tiene unas dimensiones específicas" #: edit_text_align_left msgid "Align text left" msgstr "Alinear el texto a la izquierda" #: edit_text_align_center msgid "Center text" msgstr "Texto centrado" #: edit_text_align_right msgid "Align text right" msgstr "Alinear el texto a la derecha" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Crear una incógnita o suprimirla" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Insertar una celda" #: edit_text_act_content msgid "Content" msgstr "Contenido" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Estilo" #: edit_cell_size msgid "Cell size:" msgstr "Dimensiones:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Las siguientes actividades nunca llegaran a ejecutarse, debido a que no " "aparecen en ninguna secuencia de actividades del proyecto:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "Los siguientes objetos de la mediateca no se utilizan directamente en " "ninguna actividad:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "¿Desea añadirlas al final de la última secuencia de actividades?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "¿Desea eliminarlos?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Retirada de objetos multimedia no utilizados" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Actividades huérfanas" #: edit_media_refreshAll msgid "Update all media content" msgstr "Actualizar el contenido de todos los recursos" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Actualiza todos los recursos volviendo a cargar sus archivos" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Actualizando recursos..." #: edit_media_exportAll msgid "Export all media" msgstr "Exportar todos los recursos" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Grabar en archivos el contenido de todos los recursos" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Seleccionar" #: edit_shape_addPoint msgid "Add point" msgstr "Añadir un punto" #: edit_shape_deletePoint msgid "Delete" msgstr "Eliminar" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Dibujar un rectángulo" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Dibujar una elipse" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Dibujar un polígono" #: edit_shape_toLine msgid "Convert to line" msgstr "Convertir en línea" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Convertir en curva de Bézier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Convertir en cuádrica" #: edit_shape_rLeft msgid "Rotate left" msgstr "Girar a la izquierda" #: edit_shape_rRight msgid "Rotate right" msgstr "Girar a la derecha" #: edit_shape_expand msgid "Expand" msgstr "Expandir" #: edit_shape_contract msgid "Contract" msgstr "Contraer" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Acercar" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Alejar" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Junta puntos cercanos" #: edit_shape_showPoints msgid "Show points" msgstr "Mostrar puntos" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Mostrar/Ocultar los puntos" #: edit_shape_gridSize msgid "Grid size:" msgstr "Rejilla:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Mostrar / Ocultar la rejilla" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Radio del imán:" #: edit_shape_elements msgid "Defined elements" msgstr "Elementos definidos" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Nombre del elemento seleccionado" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Radio de acción del imán, cuando está activado" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Tamaño de la rejilla" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Actividad:" #: edit_mc_sequence msgid "Sequence:" msgstr "Secuencia:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Proyecto:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Selección de la actividad" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Selección de la secuencia" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "¡Datos insuficientes!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Color de las flechas:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Color utilizado por el editor para dibujar las flechas (no es exacto, ya que " "se utiliza una máscara XOR de bits)" #: edit_act_editActivity msgid "Edit..." msgstr "Editar..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Editar la actividad seleccionada" #: action_saveFileAs_caption msgid "Save as..." msgstr "Guardar como..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Guardar el proyecto con un nombre distinto" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Comportamiento" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Comportamiento" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Arrastrar" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Arrastrar los objetos en lugar de unirlos con una linea" #: edit_act_behavior_order msgid "Check solving order" msgstr "Comprobar orden de resolución" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Las casillas deben resolverse ordenadamente" #: edit_act_scramble msgid "Scramble" msgstr "Barajar" #: action_importActivities_caption msgid "Import activities..." msgstr "Importar actividades..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importar actividades de otro proyecto" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "El archivo que ha seleccionado corresponde al proyecto actual. La " "importación de actividades solo puede realizarse entre proyectos distintos. " "Por favor, seleccione otro archivo de proyecto." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" "Seleccione una o más actividades para importarlas al proyecto actual\\:" #: import_importing msgid "Importing..." msgstr "Importando..." #: import_checkdep msgid "Checking dependencies..." msgstr "Comprobando dependencias..." #: import_impmedia msgid "Importing media\\:" msgstr "Importando medios\\:" #: import_impact msgid "Importing activity\\:" msgstr "Importando la actividad\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Seleccione el proyecto JClic del cual desea importar actividades" #: edit_tagRep_tags msgid "Tag marks" msgstr "Marcas" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Marca de inicio\\:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Marca que indica inicio de etiqueta" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Marca final\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Marca que indica final de etiqueta" #: edit_tagRep_file msgid "File" msgstr "Archivo" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Archivo o URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Nombre o URL del archivo que contiene los valores que substituirán a las " "etiquetas" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Codificación\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Tipo de codificación utilizada en el archivo" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Buscar..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Buscar en el sistema de archivos" #: edit_tagRep_title msgid "Tag replacing" msgstr "Substitución de etiquetas" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Limpiar estilos de texto..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Atención: Esta acción limpiará los atributos especiales de carácter " "existentes en el documento, devolviéndolo a su estilo principal. La " "operación no se puede deshacer. ¿Desea realizarla?" #: img_max_size msgid "Maximum size of images:" msgstr "Tamaño máximo de las imágenes:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Anchura máxima de las imágenes al importarlas en la mediateca." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Altura máxima de las imágenes al importarlas en la mediateca." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "La imagen \"%s\" tiene unas dimensiones de %s pixels, que exceden el máximo " "permitido por JClic Author (%s). ¿Desea redimensionarla?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_eu.po000066400000000000000000002416631335566474600234440ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2010-01-18 06:49+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Deskribapena" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Jardueraren izena" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Izena:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Jardueraren deskribapena" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Txostenak" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Jarduera hau txostenetan sartu" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Jarduera honen emaitzak erabiltzaileen txostenetan sartu" #: edit_act_code msgid "Code:" msgstr "Kodea:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Aukerazko kodea txostenen datu-basean saikapenak eta bilaketak egiteko." #: edit_act_reportActions msgid "Report user actions" msgstr "Erabiltzaileen ekintzak jaso" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Erregistratu erabiltzaileek egindako ekintza guztien xehetasunak" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Kontagailuak" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Denbora-kontagailua" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Erakutsi/ezkutatu denbora-kontagailua" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Saiakera-kontagailua" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Erakutsi/ezkutatu saiakera-kontagailua" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Puntuazio-kontagailua" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Erakutsi/ezkutatu puntuazio-kontagailua" #: edit_act_maxTime msgid "Max time:" msgstr "Gehienezko denbora:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Jarduera egiteko gehienezko denbora, segundutan, edo 0 denbora-mugarik ez " "ezartzeko." #: edit_act_countdown msgid "Countdown" msgstr "Atzerako kontaketa" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "Kontagailua balore handienetik hasten da, 0raino jaitsiz." #: edit_act_maxActions msgid "Max tries:" msgstr "Gehieneko saiakerak:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Baimendutako saiakeren gehieneko kopurua, edo 0 mugagabeak izateko" #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Botoiak" #: edit_act_helpBtn msgid "Help" msgstr "Laguntza" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Erakutsi/ezkutatu laguntza-botoia" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Erakutsi erantzuna" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Erakutsi mezu hau:" #: edit_act_infoBtn msgid "Information" msgstr "Informazioa" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Erakutsi/ezkutatu informazio-botoia" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Erakutsi URL hau:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Exekutatu komandoa" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Informazio-botoiari sakatuta erakutsi beharreko web-gunearen helbidea" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Informazio-botoiari sakatuta exekutatuko den komando-lerroa" #: edit_act_mainWindow msgid "Main window:" msgstr "Leiho nagusia:" #: edit_act_gameWindow msgid "Game window:" msgstr "Jolas-leihoa:" #: edit_act_margin msgid "Margin:" msgstr "Marjina:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Ikusteko objektuen arteko espazio horizontala eta bertikala" #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Atzealdeko kolorea:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Aldatu atzealdeko kolorea" #: edit_gradient_startColor msgid "Start color:" msgstr "Hasierako kolorea:" #: edit_gradient_endColor msgid "End color:" msgstr "Amaierako kolorea:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Hasierako kolorearen aukeraketa" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Amaierako kolorearen aukeraketa" #: edit_gradient_cycles msgid "Cycles:" msgstr "Zikloak:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Gradientearen errepikapenak margotzeko azalearen gainean" #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientazioa:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Gradientearen orientazioa, gradutan neurtua horizontalarekiko" #: edit_act_gradient msgid "Gradient:" msgstr "Gradientea:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Erabili kolore-gradientea" #: edit_color_opacity msgid "Opacity" msgstr "Opakutasuna" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Kolorearen alfa kanalaren balorea (opakutasuna) zehazten du" #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Gradientea" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Berezko baloreak erabili" #: edit_act_image msgid "Image:" msgstr "Irudia:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Deskribapena" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Izena eta deskribapena" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Mosaikoan" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Irudiaren azalera osoa margotzen du, X eta Y ardatzen inguruan behar beste " "aldiz errepikatuz" #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Aurrebista:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Ertza" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Marraztu lerro bat ertzean leiho inguruan" #: edit_act_transparent msgid "Transparent" msgstr "Gardena" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "Leihoak atzeko aldea gardena du" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Zabalera" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Altuera:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Objektuaren zabalera, pixeletan neurtua" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Objektuaren altuera, pixeletan neurtua" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Zentratuta" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "Objetktuak zentratuta egon behar du leiho nagusian" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Kokapen erabat horizontala" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Kokapen erabat bertikala" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Erabiltzailearen interfazea" #: edit_act_image_tooltip msgid "Select an image" msgstr "Aukeratu irudi bat" #: edit_act_text msgid "Text:" msgstr "Testua:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Objektu honen barruan erakutsi beharreko testua" #: edit_font_face msgid "Typeface:" msgstr "Mota:" #: edit_font_size msgid "Size:" msgstr "Tamaina:" #: edit_font_bold msgid "Bold" msgstr "Lodia" #: edit_font_italic msgid "Italic" msgstr "Etzana" #: edit_font_underline msgid "Underline" msgstr "Azpimarratu" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Estiloa:" #: edit_cell_title msgid "Cell contents" msgstr "Gelaxkaren edukia" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Mezuak" #: edit_act_msg_initial msgid "Initial message:" msgstr "Hasierako mezua" #: edit_act_msg_final msgid "Final message:" msgstr "Amaierako mezua" #: edit_act_msg_prev msgid "Previous message:" msgstr "Aurreko mezua:" #: edit_act_msg_error msgid "Error message:" msgstr "Errore-mezua:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Jarduera hasten denean erakutsi beharreko mezua" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Jarduera bukatutakoan erakutsi beharreko mezua" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "" "Jarduera hainbat errorerekin bukatzen denean erakutsi beharreko mezua" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Jarduera hasi aurretik erakusten den mezua (jarduera-mota jakin batzuetan " "baino ez)" #: edit_align msgid "Align:" msgstr "Lerrokatu:" #: edit_act_textColor msgid "Text color:" msgstr "Testuaren kolorea:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Testua marrazteko erabilitako kolorea" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Itzalaren kolorea:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Testuaren itzala marrazteko erabilitako kolorea, baldin bada" #: edit_act_shadow msgid "Shadow" msgstr "Itzala" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Testua itzalarekin marraztu" #: edit_act_borderColor msgid "Border color:" msgstr "Ertzaren kolorea:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Gelaxkaren ertza marrazteko erabilitako kolorea" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Inaktibo-egoeraren kolorea" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Gelaxka desgaituta dagoenean erabilitako kolorea" #: edit_act_altColor msgid "Alternative color:" msgstr "Ordezko kolorea:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Gelaxken ordezko edukia erakusteko kolorea, behin erantzuna emandakoan" #: edit_cell_marked msgid "Marked" msgstr "Markatua" #: edit_cell_disabled msgid "Disabled" msgstr "Desgaituta" #: edit_cell_alt msgid "Alternative" msgstr "Ordezkoa" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Barneko ertza:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Gelaxkaren eta testuaren ertzen arteko espazioa" #: edit_cell_borderWidth msgid "Border width:" msgstr "Ertzaren zabalera:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Ertza margotzeko erabilitako marraren lodiera" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Markatzailearen lodiera:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Ertza margotzeko erabilitako marraren lodiera, gelaxka markatuta edo " "aukeratuta dagoenean" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Aurreikusi \"ordezkoa\" egoeran" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Aurreikusi \"desgaituta\" egoeran" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Aurreikusi \"markatuta\" egoeran" #: edit_act_testAction msgid "Preview activity" msgstr "Jarduera aurreikusi" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Jarduera aurreikusi eta probatu" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Deskribapena" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Jardueraren izenburua eta deskribapena" #: edit_act_panels_options msgid "Options" msgstr "Aukerak" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Jardueraren aukerak" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Leihoa" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Jarduera-leihoaren itxura, tamaina eta kokapena" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Mezuak" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Jarduera-mezuen edukia" #: edit_act_panels_panel msgid "Panel" msgstr "Panela" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Panelaren edukia" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Estiloa" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Aukeratu gelaxken kolorea, mota eta tamaina" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Estiloa:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Ekidin irudia eta testua gainjartzea" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Saiatu ekiditen irudia eta testua gainjartzea" #: edit_media_exists_1 msgid "The file" msgstr "Fitxategia" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "dagoeneko badago media-biltegian!" #: edit_act_shaper msgid "Shaper:" msgstr "Piezak:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Errorea piezan:" #: edit_act_num_cols msgid "Columns:" msgstr "Zutabeak:" #: edit_act_num_rows msgid "Rows:" msgstr "Lerroak:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Hortzen altuera:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Hortzen zabalera:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Ausazko banaketa" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Piezen ezaugarriak" #: edit_act_panels_text msgid "Text" msgstr "Testua" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Jardueraren testua" #: action_saveFile_caption msgid "Save..." msgstr "Gorde..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "HH" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Gorde oraingo proiektua" #: action_docTree_caption msgid "Document tree..." msgstr "Dokumentuaren zuhaitza..." #: action_docTree_keys msgid "T*" msgstr "I*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Erakutsi proiektuaren dokumentua zuhaitz moduan" #: edit_docTree_title msgid "Document tree" msgstr "Dokumentuaren zuhaitza" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Noren erreferentzia:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Kontuz:

Proiektu hau beste " "batzuekin lotuta dago.
Estekak arakatu eta lotutako fitxategi guztiak " "bilatu nahi al dituzu?

(Ez da gomendagarria BAI erantzutea Clic 3.0 " "jarduerak inportatzean)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Mota:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Ezezaguna" #: edit_mc_type_sound msgid "Play sound" msgstr "Soinua erreproduzitu" #: edit_mc_type_video msgid "Play video" msgstr "Bideoa erreproduzitu" #: edit_mc_type_midi msgid "Play MIDI" msgstr "MIDI erreproduzitu" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Audio CD-a erreproduzitu" #: edit_mc_type_record msgid "Record sound" msgstr "Grabatu soinua" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Grabatutako soinua erreproduzitu" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Joan jarduerara" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Joan sekuentziara" #: edit_mc_type_run_external msgid "Run program" msgstr "Programa abiarazi" #: edit_mc_type_url msgid "Show URL" msgstr "Erakutsi URLa" #: edit_mc_type_exit msgid "End" msgstr "Amaitu" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Itzuli" #: edit_mc_level msgid "Priority level:" msgstr "Lehentasun-maila:" #: edit_mc_file msgid "File:" msgstr "Fitxategia:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parametroak:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Hemendik:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Hona:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Geh. iraupena:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Grabazio-zinta:" #: edit_mc_stretch msgid "Stretch size" msgstr "Sartzen ez bada, konprimitu" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Kokapena:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Hemendik:" #: edit_mc_location_from_box msgid "Cell" msgstr "Gelaxka" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Leihoa" #: edit_mc_location_from_frame msgid "Frame" msgstr "Markoa" #: edit_mc_loop msgid "Loop playback" msgstr "Errepikatu etengabe" #: edit_mc_autostart msgid "Auto start" msgstr "Hasiera automatikoa" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Sagua harrapatu" #: edit_mc_title msgid "Multimedia and active content" msgstr "Eduki aktiboa eta multimedia" #: edit_mc_label msgid "Active content:" msgstr "Eduki aktiboa:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Aukeratu objektu multimedia" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Media-biltegia" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Gelaxkan zentratuta" #: edit_mc_pos_window msgid "Centered over window" msgstr "Leihoan zentratuta" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Zehaztu kokapena:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Zuhaitzaren egitura edo datuak ez dira zuzenak!" #: edit_act_panels_controls msgid "Controls" msgstr "Kontrolak" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Botoi eta kontagailuen ezarpenak" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Mota:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Panelen banaketa:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "A eta B panelen kokapen erlatiboa" #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Alderantzizko erresoluzioa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "Jarduera bukatutzat emango da \"B\"ri ezarritako elementu guztiak egindakoan." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Erakutsi gezi guztiak" #: edit_act_alt msgid "Alternative content:" msgstr "Ordezko edukia:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Burututako edo ezarri gabeko gelaxketan erakutsitako edukia" #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Editatu ordezko edukia" #: edit_act_grid msgid "Grid" msgstr "Taula" #: edit_act_grid_A msgid "Grid A" msgstr "A taula" #: edit_act_grid_B msgid "Grid B" msgstr "B taula" #: edit_act_grid_layout msgid "Layout" msgstr "Diseinua" #: edit_act_grid_relationship msgid "Relationship" msgstr "Erlazioa" #: edit_seq_activity_header msgid "activity" msgstr "jarduera" #: edit_seq_tag_header msgid "tag" msgstr "etiketa" #: edit_seq_jump_header msgid "jump to" msgstr "jauzi hona:" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Jarduera:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Etiketa:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Deskribapena:" #: edit_seq_auto msgid "Move on automatically" msgstr "Aurrera joan automatikoki" #: edit_seq_delay msgid "Delay:" msgstr "Denbora-tartea:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Joan aurrera" #: edit_seq_action_back msgid "Go bak" msgstr "Joan atzera" #: edit_seq_action_jump msgid "Jump to..." msgstr "Jauzi hona..." #: edit_seq_action_stop msgid "Stop" msgstr "Gelditu" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Itzuli" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Itxi JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Aurrera gezia:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Atzera gezia:" #: edit_seq_action msgid "Action:" msgstr "Ekintza:" #: edit_seq_button_enabled msgid "Show button" msgstr "Erakutsi botoia" #: edit_seq_project msgid "JClic Project:" msgstr "JClic Proiektua:" #: edit_act_absolute msgid "Absolute position" msgstr "Kokapen absolutua" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "Objektua adierazitako X eta Y koordenadetan ezarriko da" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Kokapena:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Sekuentzia-elementu berria..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Sartu elementu berria jarduera-sekuentzian" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Mesedez, aukeratu jarduera bat sekuentzia-elementu berrirako." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "Jarduerarik gabe ezin da sekuentzia-elementu berririk sortu!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Proiketu honek ez du jarduerarik! Ezin, beraz, elementu-sekuentziarik sortu " "hutsik dagoen proiektuan." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Jauziaren helmuga:" #: edit_seq_jump_title msgid "Jump target" msgstr "Jauziaren helmuga" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Gaineratu jarduera proiektuari" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Jarduera-mota:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Izena:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Mesedez, aukeratu sortu beharreko jarduera-mota eta eman izena:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Jarduera-mota bat aukeratu behar duzu!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Jarduerari izena eman behar diozu!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Ezin da jarduerarik sortu!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Java mota:" #: edit_text_act_format msgid "Format" msgstr "Formatua" #: edit_text_act_answer msgid "Answer" msgstr "Erantzuna" #: edit_text_act_popup msgid "Pop up" msgstr "Pop up" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Balio duten erantzunak:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Zerrrendako elementu berria gaineratu" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Editatu aukeratutako zerrendako elementua" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Ezabatu aukeratutako zerrendako elementua" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Eraman gora" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Eraman behera" #: edit_list_newValue msgid "New text:" msgstr "Testu berria:" #: edit_list_addElement msgid "Add new list element" msgstr "Gaineratu zerrendako elementu berria" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Aldatu aukeratutako testua" #: edit_text_act_target msgid "Target" msgstr "Helburua" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Geh. iraupena:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Erantzunaren gehienezko karaktere-kopurua." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Bete-lanetarako karakterea" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Zuriunea adierazteko erabilitako karaktera" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Hasierako iraupena:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Jardueraren hasieran erakutsiko diren bete-lanetarako karaktere-kopurua." #: edit_text_act_iniText msgid "Initial text:" msgstr "Hasierako testua:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Jarduera hasieran zuriunean erakutsitako testua." #: edit_text_act_list msgid "Show a list of options:" msgstr "Erakutsi aukera-zerrenda:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" "Erakutsi aukera-zerrenda. Hortik aukeratu beharko du bat erabiltzaileak." #: edit_text_act_check_title msgid "Correction options" msgstr "Zuzenketarako aukerak" #: edit_text_act_popup_no msgid "No pop up" msgstr "Pop up-ik ez" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Pop up-ak automatikoki" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Errorerako pop up-a" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Pop up-a F1ekin" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Mota:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Itxaroteko pop up-a:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Geh. denbora:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Soinua bakarrik" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "Testu zati bat aukeratu behar duzu helburu testu berria sortzeko!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "Helburu testuak ezin du paragrafo-jauzirik eta tabuladorerik izan." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Ezezagunak ezin dira pilatu" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Ezezagunek ezin dute gelaxkarik izan!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Paperaren kolorea:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Editatu dokumentuaren estiloak..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Hasierako estiloa:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Tabuladorea:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Tabuladore-marken arteko espazioak:" #: edit_text_act_colors msgid "Colors:" msgstr "Koloreak:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Ezezagunen koloreak:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Errorea koloreetan:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Aurrebista:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Testu estandarra" #: edit_text_act_styleSample_target msgid "target" msgstr "helburua" #: edit_text_act_styleSample_error msgid "error" msgstr "errorea" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "testu estandarra" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "testu estandarra." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Kontuz: Ekintza honek une honetan aukeratutako helburua kenduko du. Aurrera " "egin nahi al duzu?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Aurreko pantaila..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Ez erakutsi testurik jarduera hasi arte" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Erakutsi ariketaren testu osoa" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Erakutsi testu hau:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Geh. denbora:" #: edit_text_act_edit_target msgid "Target..." msgstr "Helburua..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Erakutsi zuzenketarako botoia" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Botoiaren testua:" #: edit_text_act_checkCase msgid "Match case" msgstr "Larria/xeheak" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Azentuak eta karaktere bereziak kontuan izan" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Kontuan hartu puntuazio-markak" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Baimendu errepikatutako espazioak" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Irizpideak" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Hurrengo ezezagunera jauzi egin automatikoki" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Erantzun zuzenarren ondoren bakarrik mugitu" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Adierazi erroreak letraz letra" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Analisi-algoritmoaren parametroak:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Pausoak:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Arakatu eremua:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Egiaztatu" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Erantzunen azterketa" #: edit_text_act_check_bt msgid "Correction..." msgstr "Zuzenketa..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Zuzenketa-botoia" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progresioa" #: edit_text_act_typeBtn msgid "Type..." msgstr "Mota..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Paragrafoen ordena" #: edit_text_act_orderWords msgid "Order words" msgstr "Hitzen ordena" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Hitzak nahastu paragrafo artean" #: edit_text_act_type_title msgid "Activity type" msgstr "Jarduera-mota" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Une honetan definitutako ezezagun guztiak ezabatuko ditu ekintza honek. Hori " "egin nahi al duzu?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identifikatu hitzak" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identifikatu karaktereak" #: edit_media_change_name msgid "Change name..." msgstr "Aldatu izena..." #: edit_media_change_file msgid "Change file..." msgstr "Aldatu fitxategia..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Gorde ZIP fitxategian" #: edit_media_type msgid "Media type:" msgstr "Media-mota:" #: edit_media_size msgid "File size:" msgstr "Fitxategiaren tamaina:" #: edit_media_show_type msgid "Files of type:" msgstr "Mota honetako fitxategiak:" #: edit_media_preview msgid "Preview media" msgstr "Aurreikusi media" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Aurreikusi media-baliabidea" #: edit_media_rename msgid "Change resource name" msgstr "Aldatu baliabidearen izena" #: edit_media_rename_title msgid "Rename" msgstr "Izena aldatu" #: edit_media_rename_prompt msgid "New name:" msgstr "Izen berria:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Baliabide-izen okerra!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Bada izen hori duen beste baliabide bat! Baliabide bakoitzak izen ezberdin " "bat behar du." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Fitxategi okerra!" #: err_media_chfile_different msgid "File must be of same type" msgstr "Fitxategiak mota berekoa izan behar du" #: edit_media_font_error msgid "Unable to load font!" msgstr "Ezin izan da letra-mota kargatu!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Fitxategia gorde (ZIPetik atera)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Baliabidearen edukia fitxategitik eguneratu" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Hau ez da \"benetako\" fitxategi bat, ZIP edukiontzi batean kokatutako " "objektu bat baizik. Funtzio hau erabiltzeko, izen bereko fitxategiak ZIP " "fitxategia dagoen direktorio berean egon behar du." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Jarduerak" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Sekuentziak" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Media-biltegia" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "" "Proiektuan erabilitako irudiak eta bestelako media fitxategiak kudeatu" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Proiektu-jarduerak sortu eta editatu" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Jarduera-sekuentziak sortu eta editatu" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Izenburua:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Proiektuaren izenburua" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Proiektua" #: edit_project_tooltip msgid "Edit project properties" msgstr "Editatu proiektuaren ezaugarriak" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Deskribapena:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Proiektuaren deskribapen orokorra" #: edit_project_area msgid "Areas:" msgstr "Atalak:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Proiektuaren kurrikulu-atalak" #: edit_project_level msgid "Levels:" msgstr "Mailak:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Proiektuaren hezkuntza-mailak" #: edit_project_descriptors msgid "Descriptors:" msgstr "Deskribatzaileak:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Proiektuaren deskribatzaileak (komaz banatuta)" #: edit_project_languages msgid "Languages:" msgstr "Hizkuntzak:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Proiektuan erabilitako hizkuntzak" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Aldatu aukeratutako hizkuntza" #: edit_project_languages_add msgid "Add language" msgstr "Gaineratu hizkuntza" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "ISO-639 hizkuntza-kodeak:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Egileak:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Proiektua sortzen ari direnak" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Izena:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "e-posta:" #: edit_project_author_rol msgid "Rol:" msgstr "Rola:" #: edit_project_author_organization msgid "Organization:" msgstr "Erakundea:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Iruzkinak:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL-a:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Egilearen izena (derrigorrezkoa)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Egilearen e-posta (aukerakoa)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Pertsonen rolak proiektuan: egilea, laguntzailea, marrazkilaria, soinuak... " "(aukerakoa)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Eskola, unibertsitatea, elkartea... (aukerakoa)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Web-orri pertsonala (aukerakoa)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Bestelako informaziorako eremua (aukerakoa)" #: edit_project_author_info msgid "Author info:" msgstr "Egilearen informazioa:" #: edit_project_author_add msgid "Add author to list" msgstr "Gaineratu egilea zerrendara" #: edit_project_author_edit msgid "Edit author info" msgstr "Editatu egilearen informazioa" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Izena:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Eskolaren izena" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "e-posta:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Eskolaren e-posta helbidea" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL-a:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Eskolaren web-gunea" #: edit_project_org_address msgid "Address:" msgstr "Helbidea" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Eskolaren posta-helbidea" #: edit_project_org_pc msgid "PC:" msgstr "PC:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Posta-kodea" #: edit_project_org_city msgid "City:" msgstr "Herria:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Eskola dagoen hiria" #: edit_project_org_country msgid "Country:" msgstr "Herrialdea/Estatua:" #: edit_project_org_state msgid "State:" msgstr "Herrialdea:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Iruzkinak:" #: edit_project_org msgid "School/s:" msgstr "Eskola/k:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Proiektuan ari den eskola edota beste erakundea" #: edit_project_org_info msgid "Organization info:" msgstr "Erakundearen informazioa:" #: edit_project_org_add msgid "Add organization" msgstr "Gaineratu erakundea" #: edit_project_org_edit msgid "Edit organization data" msgstr "Editatu erakundearen datuak" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Estatua" #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Herrialdea" #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Bestelako informazioa..." #: edit_project_rev_date msgid "Date:" msgstr "Data:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Berrikusketaren data" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Egileak:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Berrikusketaren egileak" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Deskribapena:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Egindako aldaketen deskribapen laburra" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Iruzkinak:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Bestelako informazio garrantzitsua" #: edit_project_rev msgid "Revisions:" msgstr "Berrikusketak:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Proiektuari egindako aldaketa nagusien historiala" #: edit_project_rev_add msgid "Add revision record" msgstr "Berrikusketa-erregistroa gaineratu" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Berrikusketa-erregistroa editatu" #: edit_project_rev_info msgid "Revision data" msgstr "Berrikusketa-data" #: edit_media_objects msgid "objects" msgstr "objektuak" #: edit_media_object msgid "object" msgstr "objektua" #: edit_evsounds_start msgid "Start of activity:" msgstr "Jardueraren hasiera:" #: edit_evsounds_click msgid "Click on object:" msgstr "Sakatu objetktuari:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Okerreko ekintza:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Ekintza zuzena:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Hainbat okerrekin bukatutako jarduera:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Egoki bukatutako jarduera:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Errorea: deskribapenerako eremua ezin da hutsik utzi!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Editatu ekintzaren soinuak" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Ekintzaren soinuak:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Ezarri soinu zehatzak JClic ekintza bakoitzerako" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Ekintzaren soinuak:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Ezarri soinu zehatzak JClic ekintza bakoitzerako" #: edit_evsounds_default msgid "default sound" msgstr "berezko soinua" #: edit_evsounds_disabled msgid "disabled" msgstr "ezgaituta" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Gaitu edo ezgaitu ekintza honetarako soinua" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Sakatu ekintza honetarako soinua aukeratzeko, edo markatu gabe utzi berezko " "soinua erabiltzeko" #: action_newProject_caption msgid "New project..." msgstr "Proiektu berria..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Sortu JClic proiektu berria" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Hemendik:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Operatzailearen gutxieneko balorea" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Hona:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Operatzailearen gehienezko balorea" #: edit_arith_op_with msgid "With:" msgstr "Honekin:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Markatuta, operatzaileak balore hau ere izan dezake" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Zerrendako bat:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Operatzaileak izan ditzakeen baloreen zerrenda" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Hamarrenak:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Operatzailearen hamarren-kopurua" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (osoa)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "Lehen operatzailea" #: edit_arith_secondOp msgid "Second operand" msgstr "Bigarren operatzailea" #: edit_arith_title msgid "Arith2 for JClic" msgstr "JClic-erako Arith2" #: edit_arith_operations msgid "Operations:" msgstr "Eragiketak:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Aukeratu egin beharreko eragiketa-mota" #: edit_arith_operations_plus msgid "Plus" msgstr "Plus" #: edit_arith_operations_minus msgid "Minus" msgstr "Minus" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Biderkatu" #: edit_arith_operations_divide msgid "Divide" msgstr "Zatitu" #: edit_arith_unknown msgid "Unknown:" msgstr "Ezezaguna:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Aukeratu zein elementu izango den ezezaguna" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "Emaitza da ezezaguna" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "Bigarren operatzailea da ezezaguna" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "Lehen operatzailea da ezezaguna" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "Eragiketa da ezezaguna" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Emaitza espresioaren hasieran idatzi" #: edit_arith_result msgid "Result:" msgstr "Emaitza:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "\"Eraman\" gabe" #: edit_arith_result_random msgid "Random" msgstr "Ausazkoa" #: edit_arith_result_asc msgid "Ascending" msgstr "Gorantz" #: edit_arith_result_order msgid "Order by result:" msgstr "Ordenatu emaitzaren arabera:" #: edit_arith_result_desc msgid "Descending" msgstr "Beherantz" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Ekidin bikoizpenak" #: edit_arith_cond msgid "Conditions:" msgstr "Baldintzak:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Berdin da" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "Lehenengo operatzaileak bigarrenak baino handiagoa izan behar du" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "Lehenengo operatzaileak bigarrenak baino txikiagoa izan behar du" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Bestelako baldintzak" #: edit_autocp msgid "Automatic content generator:" msgstr "Eduki-sortzaile automatikoa:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "Aukeratu jarduera honetarako eduki-sortzaile automatikoa." #: edit_autocp_block msgid "Content generator" msgstr "Eduki-sortzailea" #: edit_autocp_btn msgid "Settings..." msgstr "Ezarpenak..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Eduki-sortzailearen ezarpenak ezarri" #: edit_data msgid "Edit data" msgstr "Editatu datua" #: edit_act msgid "Activity edit" msgstr "Editatu jarduera" #: edit_acp msgid "Content provider edit" msgstr "Eduki-sortzailearen edizioa" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Errorea eduki-sortzaile automatikoa sortzean!" #: edit_project_author_group msgid "Creation" msgstr "Sorrera" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Deskribapena" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Erabiltzailearen interfazea" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Deskribapena:" #: m_Edit msgid "Edit" msgstr "Editatu" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "A*" #: edit_act_newActivity msgid "New activity..." msgstr "Jarduera berria..." #: edit_act_newActivity_keys msgid "A*" msgstr "J*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Txertatu" #: m_Insert_Mnemonic msgid "I" msgstr "T*" #: m_View msgid "View" msgstr "Ikusi" #: m_View_Mnemonic msgid "V" msgstr "I" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Proiektua" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Editatu proiektuaren ezarpenak" #: action_editMedia_caption msgid "Media" msgstr "Media" #: action_editMedia_keys msgid "MM" msgstr "BB" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Editatu proiektuaren multimedia-biltegia" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Jarduerak" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "JJ" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Jarduerak editatu" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Sekuentziak" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Jarduera-sekuentziak editatu" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "" "Oraingo proiektua aldatu egin da. Gorde egin nahi al dituzu aldaketak?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Deskribatzaileak" #: edit_media_new msgid "New media object..." msgstr "Media-objektu berria..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Gaineratu irudi edo multimedia-objektu berria biltegian" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Atalase-puntuazioa:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "Egin hau puntuazio orokorra honen berdina edo handiagoa denean..." #: edit_seq_time msgid "Time threshold:" msgstr "Atalase-denbora:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Bide honi segitzeko, jarduerak ondorengo denbora-tartea baino lehen egin " "behar izan dira:" #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Egin hau puntuazio orokorra hau baino txikiagoa denean..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Segitu bide honi, jardueretan emandako denbora hau baino luzeagoa bada:" #: edit_seq_condJump msgid "Conditional jumps" msgstr "Baldintzatutako jauziak" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "Baldintza zehatzetan egin behar diren jauzi bereziak ezarri" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Ezarri goragoko maila baterako jauzia egiteko baldintzak" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Beherako jauzia:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Gorako jauzia:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Ezarri beherako maila baterako jauzia egiteko baldintzak" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "\"Hurrengoa\" botoiari ezarritako ekintza" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "\"Aurrekoa\" botoiari ezarritako ekintza" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Jauziaren helmuga adierazi" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Egin beharreko ekintza" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Sekuentzia-elementu honi egokitutako jarduera" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Sekuentziako elementu honi erreferentzia egiteko erabilitako etiketa " "(aukerako eremua)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Sekuentzia-elementuaren deskribapena (aukerako eremua)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Jardueretan aurrera egiteko botoia gaitu edo ezgaitu" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Mugitu automatikoki jarduera bukatzean" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Zenbat segundu itxaron behar da automatikoki mugitu aurretik" #: edit_color_dlgTitle msgid "Select color" msgstr "Aukeratu kolorea" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Mesedez, itxaron baliabidea berrizendatu arte" #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Zabalera:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Gelaxkaren zabalera (pixeletan)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Altuera:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Gelaxkaren altuera (pixeletan)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Ezkutuko hitzak:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Panelean ezarritako ezkutuko hitzen zerrenda" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Erabili B panela" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "Bigarren paneleko edukian hitzak dauden daudenean erakutsiko dira" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Aukeratu panelean erabili beharreko pieza-mota" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Panelaren zutabe-kopurua" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Panelaren lerro-kopurua" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Banatzaile gardenak" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Erakutsi banatzaileak (laukitxo beltzak) zulo garden gisa" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Nahasketak\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Piezak zenbat aldiz nahastuko diren" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Kopiatu ezaugarriak hona..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Ezaugarriak" #: edit_act_copy_dest msgid "Apply to:" msgstr "Aplikatu honi:" #: edit_act_copy_style_main msgid "Main window" msgstr "Leiho nagusia" #: edit_act_copy_style_play msgid "Play window" msgstr "Jolas-leihoa" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Aldatu beharreko jarduerak:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Kopiatu ezaugarriak" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Kopiatu oraingo jardueraren ezaugarriak beste jarduera batzuei" #: edit_new_project_name msgid "Project name:" msgstr "Proiektuaren izena:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Proiektua deskribatzeko izen laburra" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Fitxategiaren izena:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Proiektu- fitxategiaren izena, luzapenik gabe" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Karpeta:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Proiektua gordetzeko karpetaren izena" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Arakatu..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Sortu JClic proiektu berria" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Errorea: Proiektu, fitxategi eta direktorioek izen onargarria izan behar " "dute." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Karpeta honek badu beste Clic 3.0 edo JClic proiektu bat dagoeneko. Ez " "nahasteko, hobe da proiektu bakoitza aparteko karpeta batean gordetzea, " "baina ez da derrigorrezkoa. Benetan gorde nahi al duzu proiektu berria " "karpeta honetan?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Errorea: ezin da sortu adierazitako karpeta!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Errorea: Ez da jarduerarik aukeratu! Funtzio hau erabiltzeko zerrendatik " "jardueraren bat aukeratu behar duzu aipatutako ezaugarriak horri/horiei " "aplikatzeko." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Kopiatu ezaugarriak hona:" #: edit_act_copy_margin msgid "Margin" msgstr "Marjina" #: edit_act_copy_bgColor msgid "Background color" msgstr "Atzeko aldearen kolorea" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Gradientea" #: edit_act_copy_bgImage msgid "Background image" msgstr "Atzeko aldearen irudia" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Ertza" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Atzeko alde gardena" #: edit_act_copy_position msgid "Position" msgstr "Kokapena" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Mezuak" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Hasierako mezuaren estiloa" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Bukaerako mezuaren estiloa" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Errore-mezuaren estiloa" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Txostenak" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Txostenetan jarduera sartu" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Ekintzak erregistratu" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Erabiltzailearen interfazea" #: edit_act_copy_skin msgid "Skin" msgstr "Itxura" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Ekintza-soinuak" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Kontagailuak" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Denbora-kontagailua" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Gehinezko denbora" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Saiakera-kontagailua" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Gehi. saiakera-kopurua" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Puntuazio-kontagailua" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Zenbat aldiz nahastu behar den" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Botoiak" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Laguntza-botoia" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Informazio-botoia" #: edit_act_copy_grids msgid "Grids" msgstr "Taulak" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "A taularen estiloa" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "B taularen estiloa" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Testu-panelen estiloa" #: edit_act_copy_text msgid "Text activities" msgstr "Testu-jarduerak" #: edit_act_copy_fontFace msgid "Font face" msgstr "Letra-tipoaren izena" #: edit_act_copy_fontSize msgid "Font size" msgstr "Letra-tamaina" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Letra-tipoaren estiloa" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Testu nagusiaren kolorea" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Aukeratu zein JClic proiektutatik inportatu behar diren jarduerak" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Errore-kolorea" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Tabuladoreen arteko espazioa" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Aurreko mezuaren estiloa" #: edit_act_changeType msgid "Change activity type" msgstr "Aldatu jarduera-mota" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Jarduera egiteko erabiliko den motaren izen osoa (erabiltzaile aurreratuak " "bakarrik!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Bestelakoa..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Erabiltzaile aurreratuek erregistratu gabeko beste JClic jarduera-mota " "batzuk ere sor ditzakete. Idatzi azpian motaren izen osoa, aurretik " "paketearena duela (adibidez, \"com.acme.activities.FooActivity\"). Jarduera-" "motek edu.xtec.jclic.Activity zabaldu behar dute eta JVM " "bilatzailearekin eskuratzeko moduan egon behar dute." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Jardueraren izena:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Jarduera bakoitzak izen bat izan behar du proiektuan" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Adi: Mota " "aldaketak editatzen ari den jardueraren ezaugarri eta objektuak galtzea ekar " "dezake. Kontu handiz erabili funtzio hau!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "JClic kodearen kokapena:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "JClic programaren fitxategiak dauden karpetara zuzenduko duen URL-a" #: applet_prev_text msgid "HTML code before:" msgstr "Aurreko HTML kodea:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Aplikazioaren aurretik ipini beharreko testua edo HTML kodea" #: applet_post_text msgid "HTML code after:" msgstr "Ondorengo HTML kodea:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Aplikazioaren ondoren ipini beharreko testua edo HTML kodea" #: applet_size msgid "Applet size:" msgstr "Aplikazioaren tamaina:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "" "Applet-aren zabalera eta altuera, balore absolutuetan edo ehunekoetan." #: applet_page_title msgid "Page title:" msgstr "Orriaren izenburua:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Nabigatzailearen leihoaren goiko aldean erakutsi beharreko testua" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "\"%s\" web-orria egoki sortu da." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Orain nabigatzailearekin irekitzea nahi al duzu?" #: action_createHTML_caption msgid "Create web page..." msgstr "Sortu web-orria..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Sortu HTML orri bat JClic aplikazioarekin" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "Sortu HTML orri bat oraingo proiektua duen aplikazioarekin" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Fitxategi-izena:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Sortu beharreko HTML fitxategiaren izena" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Aplikazioa" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Web-orria sortzeko erabilitako berezko baloreak" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Atzealdeko kolorea:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "HTML orriaren atzealdeko kolorea" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Erdian" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Applet-a erdian ipini horizontalean" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Applet-aren zabalera (balore absolutuan edo ehunekoetan)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Applet-aren altuera (balore absolutuan edo ehunekoetan)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Irtetean, joan hona:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "JClic-etik irtetean zein URL-tara zuzendu behar den nabigazioa" #: applet_infoFrame msgid "Info frame name:" msgstr "Informazio-markoaren izena:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "\"Informazioa\" botoiko edukia erakusteko markoaren izena" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Proiektuaren instalatzailea sortu..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Proiektuaren instalaziorako fitxategia sortu JClic player-erako" #: installer_caption msgid "Edit project installer script" msgstr "Editatu proiektuaren instalazio-script-a" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Izenburua:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Instalazio-laguntzailean erakutsiko den proiektuaren izenburua" #: installer_authors msgid "Autors:" msgstr "Egileak:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Proiektuaren egilea/k (izen laburra)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Karpeta:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Instalaziorako laguntzaileak aholkatuko duen karpetaren izena" #: installer_files msgid "Files to be copied:" msgstr "Kopiatu behareko fitxategiak:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Instalatzaileak kopiatu beharreko fitxategiak" #: installer_files_available msgid "Available files" msgstr "Eskura dauden fitxategiak" #: installer_files_selected msgid "Selected files" msgstr "Aukeratutako fitxategiak" #: installer_files_add msgid ">> add >>" msgstr ">>gaineratu>>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Gaineratu aukeratutako fitxategia zerrendara" #: installer_files_remove msgid "<< remove <<" msgstr "<\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Description" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nom de l'activité" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nom\\:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Description de l'activité" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Rapports" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Inclure l'activité dans les rapports" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "" "Inclure les résultats de cette activité dans les rapports utilisateur" #: edit_act_code msgid "Code:" msgstr "Code\\:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Code optionnel utilisé pour grouper et rechercher dans la base de rapports." #: edit_act_reportActions msgid "Report user actions" msgstr "Rapport des actions utilisateurs" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "" "Enregistrer le détail de toutes les actions réalisées par les utilisateurs" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Compteurs" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Chronomètre" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Montrer/cacher le chronomètre" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Compteur d'essais" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Montrer/cacher le compteur d'essais" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Score" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Montrer/cacher le score" #: edit_act_maxTime msgid "Max time:" msgstr "Temps max\\:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Temps maximum pour résoudre l'activité, en secondes, ou 0 pour temps " "illimité." #: edit_act_countdown msgid "Countdown" msgstr "Compte à rebours" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "Le compteur démarre à valeur maximale, en décroissant jusque 0." #: edit_act_maxActions msgid "Max tries:" msgstr "Max d'essais\\:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "" "Nombre maximum d'essais autorisés, ou 0 pour nombre d'essais illimités." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Boutons" #: edit_act_helpBtn msgid "Help" msgstr "Aide" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Montrer/cacher le bouton d'aide" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Montrer la solution" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Montrer ce message\\:" #: edit_act_infoBtn msgid "Information" msgstr "Information" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Montrer/Cacher le bouton d'information" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Montrer cette URL\\:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Exécuter cette commande\\:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "Adresse de site Web à montrer en cliquant sur le bouton info." #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Ligne de commande à exécuter en cliquant sur le bouton info." #: edit_act_mainWindow msgid "Main window:" msgstr "Fenêtre principale\\:" #: edit_act_gameWindow msgid "Game window:" msgstr "Fenêtre de travail\\:" #: edit_act_margin msgid "Margin:" msgstr "Marges\\:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Espacement vertical et horizontal entre les objets visuels." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Couleur d'arrière-plan\\:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Changer la couleur d'arrière-plan." #: edit_gradient_startColor msgid "Start color:" msgstr "Couleur de démmarage\\:" #: edit_gradient_endColor msgid "End color:" msgstr "Couleur terminale\\:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Sélection de la couleur de démarrage" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Sélection de la couleur terminale" #: edit_gradient_cycles msgid "Cycles:" msgstr "Cycles\\:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Numbre de répétitions du dégradé sur la surface peinte" #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientation\\:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Orientation du dégradé, mesuré en degrés depuis l'horizontale" #: edit_act_gradient msgid "Gradient:" msgstr "Dégradé\\:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Utiliser le dégradé de couleur" #: edit_color_opacity msgid "Opacity" msgstr "Opacité" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Définir la valeur de couleur du canal alpha (opacité)." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Dégradé" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Utiliser les valeurs par défaut (pas de dégradé)" #: edit_act_image msgid "Image:" msgstr "Image\\:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Description" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nom et description" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Mosaïque" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Peindre toute la surface avec l'image, en la répétant sur l'axe X et Y si " "nécessaire." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Prévisualisation\\:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Bordure" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Dessiner une ligne autour de la fenêtre" #: edit_act_transparent msgid "Transparent" msgstr "Transparence" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "La fenêtre a un arrière-plan transparent" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Largeur\\:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Hauteur\\:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Largeur de l'objet, mesurée en pixels." #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Hauteur de l'objet, mesurée en pixels." #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Centrer" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "l'objet sera centré sur la fenêtre principale" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X\\:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Position horizontale absolue" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y\\:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Position verticale absolue" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interface utilisateur" #: edit_act_image_tooltip msgid "Select an image" msgstr "Sélectionner une image" #: edit_act_text msgid "Text:" msgstr "Texte\\:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Texte à montrer dans cet objet." #: edit_font_face msgid "Typeface:" msgstr "Police\\:" #: edit_font_size msgid "Size:" msgstr "Taille\\:" #: edit_font_bold msgid "Bold" msgstr "Gras" #: edit_font_italic msgid "Italic" msgstr "Italique" #: edit_font_underline msgid "Underline" msgstr "Souligné" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Style\\:" #: edit_cell_title msgid "Cell contents" msgstr "Contenus de cellule" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Messages" #: edit_act_msg_initial msgid "Initial message:" msgstr "Message initial\\:" #: edit_act_msg_final msgid "Final message:" msgstr "Message final\\:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Message précédent\\:" #: edit_act_msg_error msgid "Error message:" msgstr "Message d'erreur\\:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Message à montrer quand l'activité débute" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Message à montrer quand l'activité se termine" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Message à montrer quand l'activité se termine avec erreurs" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Message à montrer en priorité au démérrage de l'activité (seulement dans " "certains types d'activités)" #: edit_align msgid "Align:" msgstr "Aligner\\:" #: edit_act_textColor msgid "Text color:" msgstr "Couleur du texte\\:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Couleur utilisée pour dessiner le texte\\:" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Couleur de l'ombre\\:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "" "Couleur utilisée pour dessiner l'ombre du texte, quand c'est applicable" #: edit_act_shadow msgid "Shadow" msgstr "Ombre" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Dessiner le texte avec ombre" #: edit_act_borderColor msgid "Border color:" msgstr "Couleur de bordure\\:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Couleur utilisée pour dessiner la bordure de cellule" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Couleur d'état inactif\\:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Couleur utilisée quand la cellule est désactivée" #: edit_act_altColor msgid "Alternative color:" msgstr "Couleur alternative\\:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Couleur utilisée pour dessiner les contenus alternatifs dans les cellules " "résolues." #: edit_cell_marked msgid "Marked" msgstr "Pointé" #: edit_cell_disabled msgid "Disabled" msgstr "Désactivé" #: edit_cell_alt msgid "Alternative" msgstr "Alternatif" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Marge intérieure\\:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Nombre d'espace entre la bordure de cellule et le texte." #: edit_cell_borderWidth msgid "Border width:" msgstr "Largeur de bordure\\:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Largeur du point utilisé pour dessiner la bordure standard" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Epaisseur du marqueur\\:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Largeur du point utilisée pour dessiner la bordure quand la cellule est " "sélectionée ou marquée" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Prévisualiser en état \"alternatif\"" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Prévisualiser en état \"désactivé\"" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Prévisualiser en état \"marqué\"" #: edit_act_testAction msgid "Preview activity" msgstr "Prévisualiser l'activité" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Prévisualiser et tester l'activité" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Description" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Titre et description de l'activité" #: edit_act_panels_options msgid "Options" msgstr "Options" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Options de l'activité" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Fenêtre" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Aspect, taille et position de la fenêtre d'activité" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Messages" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Contenu des messages de l'activité" #: edit_act_panels_panel msgid "Panel" msgstr "Palette" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Contenus de la palette" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Style" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Définir la couleur des cellules, fonte et taille" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Style\\:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Autoriser que le texte recouvre l'image" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Essayer d'autoriser que le texte recouvre l'image" #: edit_media_exists_1 msgid "The file" msgstr "Le fichier" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "existe déjà dans la bibliothèque multimédia\\!" #: edit_act_shaper msgid "Shaper:" msgstr "Forme\\:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Erreur de forme\\:" #: edit_act_num_cols msgid "Columns:" msgstr "Colonnes\\:" #: edit_act_num_rows msgid "Rows:" msgstr "Lignes\\:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Hauteur des dentelures\\:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Largeur de dentelure\\:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Disribution aléatoire" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Propriétés du constructeur de formes" #: edit_act_panels_text msgid "Text" msgstr "Texte" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Texte de l'activité" #: action_saveFile_caption msgid "Save..." msgstr "Enregistrer..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Enregistrer le projet courant" #: action_docTree_caption msgid "Document tree..." msgstr "Arborescence du document..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Montrer le document projet comme arborescence" #: edit_docTree_title msgid "Document tree" msgstr "Arborescence du document" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Référencé par\\:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Attention\\:

Ce projet " "se connecte avec d'autres projets.
Voulez-vous explorer les liens et " "charger tous les fichiers liés ?

(Il est conseillé de répondre OUI " "quand vous importez des activités Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Type\\:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Inconnu" #: edit_mc_type_sound msgid "Play sound" msgstr "Jouer son" #: edit_mc_type_video msgid "Play video" msgstr "Jouer vidéo" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Jouer MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Jouer un CD audio" #: edit_mc_type_record msgid "Record sound" msgstr "Enregistrer son" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Jouer un son enregistrer" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Aller à l'activité" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Aller à la séquence" #: edit_mc_type_run_external msgid "Run program" msgstr "Lancer le programme" #: edit_mc_type_url msgid "Show URL" msgstr "Montrer URL" #: edit_mc_type_exit msgid "End" msgstr "Fin" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Retour" #: edit_mc_level msgid "Priority level:" msgstr "Niveau de priorité\\:" #: edit_mc_file msgid "File:" msgstr "Fichier\\:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Paramètres\\:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "De\\:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "A\\:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Max. longueur\\:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Magnétophone\\:" #: edit_mc_stretch msgid "Stretch size" msgstr "Stretch taille" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Localisation\\:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X\\:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y\\:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "De\\:" #: edit_mc_location_from_box msgid "Cell" msgstr "Cellule" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Fenêtre" #: edit_mc_location_from_frame msgid "Frame" msgstr "CAdre" #: edit_mc_loop msgid "Loop playback" msgstr "Jouer en boucle" #: edit_mc_autostart msgid "Auto start" msgstr "Démarrage automatique" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Capturer souris" #: edit_mc_title msgid "Multimedia and active content" msgstr "Multimedia et contenu actif" #: edit_mc_label msgid "Active content:" msgstr "Contenu actif\\:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Sélection d'objet multimedia" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Librairie média" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Centré sur la cellule" #: edit_mc_pos_window msgid "Centered over window" msgstr "Centré sur la fenêtre" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Spécifier la position\\:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Structure d'arborescence ou donnée incorrect Incorrect\\!" #: edit_act_panels_controls msgid "Controls" msgstr "Contrôles" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Options pour les boutons et compteurs" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Type\\:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Echelle de la grille\\:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Position relative des panneaux A et B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Résolution inverse" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "L'activité est résolue quand tous les éléments assignés à \"B\" sont " "affichés." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Montrer toutes les flèches" #: edit_act_alt msgid "Alternative content:" msgstr "Contenu alternatif\\:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Contenu montré dans les cellules résolues et cellules non-assignées." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Editer le contenu alternatif" #: edit_act_grid msgid "Grid" msgstr "Grille" #: edit_act_grid_A msgid "Grid A" msgstr "Grille A" #: edit_act_grid_B msgid "Grid B" msgstr "Grille B" #: edit_act_grid_layout msgid "Layout" msgstr "Calque" #: edit_act_grid_relationship msgid "Relationship" msgstr "Relation" #: edit_seq_activity_header msgid "activity" msgstr "activité" #: edit_seq_tag_header msgid "tag" msgstr "Drapeau" #: edit_seq_jump_header msgid "jump to" msgstr "Sauter à" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Activité\\:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Etiquette\\:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Description\\:" #: edit_seq_auto msgid "Move on automatically" msgstr "Déplacer automatiquement" #: edit_seq_delay msgid "Delay:" msgstr "Delai\\:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Aller devant" #: edit_seq_action_back msgid "Go bak" msgstr "Aller derrière" #: edit_seq_action_jump msgid "Jump to..." msgstr "Sauter à..." #: edit_seq_action_stop msgid "Stop" msgstr "Stop" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Retourner" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Quitter JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Flêche avant\\:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Fl^che arrière\\:" #: edit_seq_action msgid "Action:" msgstr "Action\\:" #: edit_seq_button_enabled msgid "Show button" msgstr "Montrer bouton" #: edit_seq_project msgid "JClic Project:" msgstr "Projet JClic\\:" #: edit_act_absolute msgid "Absolute position" msgstr "Position absolue" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "L'objet sera placé aux coordonnées X et Y spécifiées" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Localisation\\:" #: edit_seq_newElement msgid "New sequence element..." msgstr "nouvelle séquence d'activité..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Insérer un nouvel élément dans la séquence d'activité" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Sélectionnez une activité pour la nouvelle séquence." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "Impossible de créer une nouvelle séquence d'éléments sans activité\\!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Ce projet n'a pas d'activités\\! Impossible de créer une séquence d'éléments " "dans un projet vide." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Cible de saut\\:" #: edit_seq_jump_title msgid "Jump target" msgstr "Cible de saut" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Ajouter une nouvelle activité au projet" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Type d'activité\\:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nom\\:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Sélectionnez le type d'activité à créer et donnez-lui un nom\\:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Vous devez sélectionner un type d'activité\\!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Vous devez spécifier un nom pour l'activité\\!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Impossible de créer l'activité\\!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Nom de classe Java class\\:" #: edit_text_act_format msgid "Format" msgstr "Format" #: edit_text_act_answer msgid "Answer" msgstr "Réponse" #: edit_text_act_popup msgid "Pop up" msgstr "Pop up" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Réponses valides\\:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Ajouter une nouvelle liste d'élément" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Editer la liste d'éléments sélectionnée" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Supprimer la liste d'éléments sélectionnée" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Déplacer vers le haut" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Déplacer vers le bas" #: edit_list_newValue msgid "New text:" msgstr "Nouveau texte\\:" #: edit_list_addElement msgid "Add new list element" msgstr "Ajouter une nouvelle liste d'élément" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Modifier le texte sélectionné" #: edit_text_act_target msgid "Target" msgstr "Cible" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Max. longueur\\:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Nombre maximum de caractères dans la réponse." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Caractère de remplissage" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Caractère utilisé pour indiquer les blancs" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Longueur initiale\\:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Nombre de carctères de remplissage qui seront affichés au démarrage de " "l'activité." #: edit_text_act_iniText msgid "Initial text:" msgstr "Texte initiale\\:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Texte affiché dans le blanc au démarrage de l'activité." #: edit_text_act_list msgid "Show a list of options:" msgstr "Montrer une liste des options\\:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" "Afficher une liste d'options dans laquelle l'utilisateur doit en choisir une." #: edit_text_act_check_title msgid "Correction options" msgstr "Options de correction" #: edit_text_act_popup_no msgid "No pop up" msgstr "Pas de pop up" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Pop up automatique" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Pop up si erreurs" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Pop up avec F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Type\\:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Pop up delai\\:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Max. temps\\:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Son seulement" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "Vous devez sélectionner un fragment de texte pour créer un nouveau texte " "cible\\!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" "Le texte cible ne peut pas inclure de retour chariot ni de tabulation." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Cibles ne peuvent être atteintes\\!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Les cibles ne peuvent contenir de cellules\\!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Couleur de papier\\:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Editer les styles de document..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Style principal\\:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Tabulation\\:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Espaces entre deux tabulation\\:" #: edit_text_act_colors msgid "Colors:" msgstr "Coleurs\\:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Couleur des cibles\\:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Couleur des erreurs\\:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Prévisualisation\\:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Texte standard" #: edit_text_act_styleSample_target msgid "target" msgstr "cible" #: edit_text_act_styleSample_error msgid "error" msgstr "erreur" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "texte standard" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "texte standard." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Warning\\: Cette action supprimera la cible courante sélectionnée. Voulez-" "vous continuer ?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Ecran précédent..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Ne pas afficher de texte avant de démarrer l'activité" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Afficher le texte complet de l'exercice" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Afficher ce texte\\:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Max. temps\\:" #: edit_text_act_edit_target msgid "Target..." msgstr "Cible..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Montrer le bouton de correction" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Bouton texte\\:" #: edit_text_act_checkCase msgid "Match case" msgstr "Case répondue" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Prendre en compte les accents et caractères spéciaux" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Prendre en compte les marques de ponctuation" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Autoriser les espaces répétés" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Critère" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Déplacer vers nouvelle cible quand c'est rempli" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Déplacer seulement après correcte autorisation" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Indiquer les erreurs lettre par lettre" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Paramètres de l'algorithme d'analyse\\:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Etapes\\:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Champ d'exploration\\:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Vérifier" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Analyse de la réponse" #: edit_text_act_check_bt msgid "Correction..." msgstr "Correction..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Bouton de correction" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progression" #: edit_text_act_typeBtn msgid "Type..." msgstr "Type..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Paragraphes ordonnés" #: edit_text_act_orderWords msgid "Order words" msgstr "Ranger les mots" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Shuffle words amongst paragraphs" #: edit_text_act_type_title msgid "Activity type" msgstr "Type d'activité" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Cette action effacera toutes les cibles existantes. Voulez-vous continuer ?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identifier les mots" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identifier les caractères" #: edit_media_change_name msgid "Change name..." msgstr "Changer nom..." #: edit_media_change_file msgid "Change file..." msgstr "Changee fichier..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Enregistrer dans un fichier ZIP" #: edit_media_type msgid "Media type:" msgstr "Type de support :" #: edit_media_size msgid "File size:" msgstr "Taille de fichier\\:" #: edit_media_show_type msgid "Files of type:" msgstr "Fichiers de type\\:" #: edit_media_preview msgid "Preview media" msgstr "Prévisualiser média" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Ressource média précédente" #: edit_media_rename msgid "Change resource name" msgstr "Changer nom de ressource" #: edit_media_rename_title msgid "Rename" msgstr "Renommer" #: edit_media_rename_prompt msgid "New name:" msgstr "Nouveau nom\\:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Mauvais nom de ressource\\!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Il y a une autre ressource avec ce nom\\! Chaque ressource doit avoir un nom " "unique." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Mauvais fichier\\!" #: err_media_chfile_different msgid "File must be of same type" msgstr "Le fichier doit être de même type" #: edit_media_font_error msgid "Unable to load font!" msgstr "Impossible de charger la police\\!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Enregistrer fichier (extraire depuis ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Mettre à jour le contenu media depuis un fichier" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Ce n'est pas un fichier \"real\", mais un objet localisé dans un container " "ZIP. Pour utiliser ce produit, un fichier avec le même nom doit être présent " "dans le dossier où le fichier ZIP est localisé." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Activités" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Séquences" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Librairie média" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Gère les images et autres fichiers média utilisés dans le projet." #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Créer et éditer les activités du projet." #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Créer et éditer les séquences d'activités" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Titre\\:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Titre du projet" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Projet" #: edit_project_tooltip msgid "Edit project properties" msgstr "Editer les propriétés du projet" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Description\\:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Description générale du projet" #: edit_project_area msgid "Areas:" msgstr "Domaines\\:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Domaine d'application du projet" #: edit_project_level msgid "Levels:" msgstr "Niveaux\\:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Niveaux pédagogique du projet" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descripteurs\\:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descripteurs du projet (Séparé pau une virgule)" #: edit_project_languages msgid "Languages:" msgstr "Langages\\:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Langages utilisés dans le projet projet" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Changer le langage sélectionné" #: edit_project_languages_add msgid "Add language" msgstr "Ajouter langage" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "ISO-639 langage codes\\:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Auteurs\\:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Personnes intervenant dans la création du projet" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nom\\:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "e-mail\\:" #: edit_project_author_rol msgid "Rol:" msgstr "Rôle\\:" #: edit_project_author_organization msgid "Organization:" msgstr "Organization\\:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Commentaires\\:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL\\:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nom de l'auteur (requis)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "E-mail auteur (optionnel)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Rôle de la personne dans le projet\\: auteur, collaborateur, dessinateurs, " "sons... (optionnel)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Ecole, université, association... (optionnel)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Page web personnelle (optionnel)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Champ pour d'autres informations(optionnel)" #: edit_project_author_info msgid "Author info:" msgstr "Info auteur\\:" #: edit_project_author_add msgid "Add author to list" msgstr "Ajouter auteur à la liste" #: edit_project_author_edit msgid "Edit author info" msgstr "Editer info auteur" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nom\\:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nom de l'école" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "e-mail\\:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Adresse e-mail de l'école" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL\\:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Site Web de l'école" #: edit_project_org_address msgid "Address:" msgstr "Addresse\\:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Snail-mail addresse" #: edit_project_org_pc msgid "PC:" msgstr "PC\\:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Code postal" #: edit_project_org_city msgid "City:" msgstr "Ville\\:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Ville de l'école" #: edit_project_org_country msgid "Country:" msgstr "Département\\:" #: edit_project_org_state msgid "State:" msgstr "Etat\\:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Commentaires\\:" #: edit_project_org msgid "School/s:" msgstr "Ecole/s\\:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Ecole ou autre institution intervenant dans le projet" #: edit_project_org_info msgid "Organization info:" msgstr "Organisation info\\:" #: edit_project_org_add msgid "Add organization" msgstr "Ajouter organisation" #: edit_project_org_edit msgid "Edit organization data" msgstr "Editer donnée organisation" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Région, fédération, union..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Etat, communauté, région..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Autre info..." #: edit_project_rev_date msgid "Date:" msgstr "Date\\:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Date de révision" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Auteurs\\:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Auteurs de la révision" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Description\\:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Brève description des changements effectués" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Commentaires\\:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Autres infos" #: edit_project_rev msgid "Revisions:" msgstr "Révisions\\:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Historique des principales modifications du projet" #: edit_project_rev_add msgid "Add revision record" msgstr "Ajouter un enregistrement révision" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Editer un enregistrement révision" #: edit_project_rev_info msgid "Revision data" msgstr "Donnée de révision" #: edit_media_objects msgid "objects" msgstr "objets" #: edit_media_object msgid "object" msgstr "objet" #: edit_evsounds_start msgid "Start of activity:" msgstr "Démarrer l'activité\\:" #: edit_evsounds_click msgid "Click on object:" msgstr "Cliquer sur l'objet\\:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Action erronée\\:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Action correcte\\:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Activité terminée avec erreurs\\:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Activité terminée OK\\:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Erreur\\: Le champ descriptif ne peut être laissé blanc\\!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Editer l'évènement son" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Evènement sons\\:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Définir dessons spécifiques pour chaque évènement JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Evènement sons\\:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Définir des sons spécifiques pour chaque évènement JClic" #: edit_evsounds_default msgid "default sound" msgstr "Son par défaut" #: edit_evsounds_disabled msgid "disabled" msgstr "désactivé" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Activer ou désactiver le son pour cet évènement" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Cliquez pour sélectionner un son pour cet évènement, ou désélectionnez pour " "utiliser le son pare défaut" #: action_newProject_caption msgid "New project..." msgstr "Nouveau projet..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Créer un nouveau projet JClic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "De\\:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Valeur minimale de l'opérateur" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "To\\:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Valeur maximale de l'opérateur" #: edit_arith_op_with msgid "With:" msgstr "Avec\\:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Si sélectionné, l'opérateur peut aussi avoir cette valeur" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Un de cette liste\\:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Liste de valeurs possibles pour l'opérateur" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Décimales\\:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Nombre de décimales de l'opérande" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "\\# (integer)" #: edit_arith_op_dec1 msgid "#.#" msgstr "\\#.\\#" #: edit_arith_op_dec2 msgid "#.##" msgstr "\\#.\\#\\#" #: edit_arith_firstOp msgid "First operand" msgstr "Premier opérande" #: edit_arith_secondOp msgid "Second operand" msgstr "Second opérande" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 pour JClic" #: edit_arith_operations msgid "Operations:" msgstr "Opérations\\:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Sélectionner le type d'opérations à réaliser" #: edit_arith_operations_plus msgid "Plus" msgstr "Addition" #: edit_arith_operations_minus msgid "Minus" msgstr "Soustraction" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Multiplication" #: edit_arith_operations_divide msgid "Divide" msgstr "Division" #: edit_arith_unknown msgid "Unknown:" msgstr "Inconnu\\:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Sélectionner l'item qui sera considéré comme l'inconnue" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "Le résultat est l'inconnue" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "Le second opérateur est l'inconnue" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "Le premier opérateur est l'inconnue" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "L'opération est l'inconnue" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Ecrire le résultat au début de l'expression" #: edit_arith_result msgid "Result:" msgstr "Résultat\\:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Pas de retenue" #: edit_arith_result_random msgid "Random" msgstr "Aléatoire" #: edit_arith_result_asc msgid "Ascending" msgstr "Croissant" #: edit_arith_result_order msgid "Order by result:" msgstr "Ranger par résultat\\:" #: edit_arith_result_desc msgid "Descending" msgstr "Décroissant" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Autoriser les doublons" #: edit_arith_cond msgid "Conditions:" msgstr "Conditions\\:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indifférent" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "Le premier opérateur doit être plus grand que le second" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "Le premier opérateur doit être plus petit que le second" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Autres conditions" #: edit_autocp msgid "Automatic content generator:" msgstr "Générateur de contenu automatique\\:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "Sélectionner le type de contenu automatique pour cette activité." #: edit_autocp_block msgid "Content generator" msgstr "Générateur de contenu" #: edit_autocp_btn msgid "Settings..." msgstr "Paramètres..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Configurer les paramètres du fournisseur de contenu" #: edit_data msgid "Edit data" msgstr "Editer donnée" #: edit_act msgid "Activity edit" msgstr "Editer activité" #: edit_acp msgid "Content provider edit" msgstr "Editer le fournisseur de contenu" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Erreur à la création du fournisseur de contenu\\!" #: edit_project_author_group msgid "Creation" msgstr "Création" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Description" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interface utilisateur" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Description :" #: m_Edit msgid "Edit" msgstr "Éditer" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Nouvelle activité..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P\\#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Insérer" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Vue" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Projet" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Editer les paramètres de projet" #: action_editMedia_caption msgid "Media" msgstr "Média" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Editer la librairie Média du projet" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Activités" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Editer les activités" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Séquences" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Editer les séquences d'activités" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "" "Le projet courant a été modifié. Voulez-vous enregistrer les changements ?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descripteurs" #: edit_media_new msgid "New media object..." msgstr "Nouvel objet média..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Ajouter une nouvelle image ou objet multimédia à la librairie" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Score\\:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "Prendre ce chemin quand le score global est égal ou supérieur à..." #: edit_seq_time msgid "Time threshold:" msgstr "Temps imposé\\:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Pour emprunter ce chemin, le temps passé sur les activités doit être " "inférieur à..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Prendre ce chemin quand le score global est inférieur à..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Prendre ce chemin quand le temps passé sur les activités est supérieur à..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Sauts conditionnels" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Définir des sauts spécifiques à n'exécuter que sous certaines conditions" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Définir les conditions de saut vers le niveau supérieur" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Saut inférieur\\:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Saut supérieur\\:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Définir les conditions de saut vers un niveau inférieur" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Action assignée au bouton \"suivant\"" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Action assignée au bouton \"précédent\"" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Définir la cible de saut" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Action à réaliser" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Activité assignée à cet élément de séquence" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Drapeau utilisé pour référencer cet élément de séquence (champ optionnel)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Description de l'élément de séquence (champ optionnel)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Activer ou désactiver le bouton flêche" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Se déplacer automatiquement quand l'activité est terminée" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Secondes à attendre avant le déplacement automatique" #: edit_color_dlgTitle msgid "Select color" msgstr "Sélectionner couleur" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Attendez la ressource va être renommée..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Largeur\\:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Largeur de cellule (en pixels)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Hauteur\\:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Hauteur de cellules (en pixels)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Mots cachés\\:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Liste de mots cachés placés dans le cadre" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Utiliser le cadre B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "Les contenus du second cadre seront affichés au fur et à mesure que les mots " "seront trouvés" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Sélectionner le type de forme utiliser dans le cadre" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Nombre de colonnes du cadre" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Nombre de lignes du cadre" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Délimiteurs transparents" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Traiter les délimiteurs comme des trous transparents (boites noires)" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Battages\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Nombre de temps de battage" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Copier les attributs vers..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Attributs" #: edit_act_copy_dest msgid "Apply to:" msgstr "Appliquer à\\:" #: edit_act_copy_style_main msgid "Main window" msgstr "Fenêtre principale" #: edit_act_copy_style_play msgid "Play window" msgstr "Fenêtre de travail" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Activités à modifier\\:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Copier les attributs" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Copier les attributs de l'activité courante vers d'autres activités" #: edit_new_project_name msgid "Project name:" msgstr "Nom du projet\\:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Nom court, descriptif du projet" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nom du fichier\\:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nom du fichier projet, sans extension" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Dossier\\:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nom du dossier où le dossier est stocké" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Explorer..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Créer un nouveau projet JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "Erreur\\: Projet, fichier et dossier doivent avoir des noms valides." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Ce dossier contient déjà un autre projet Clic 3.0 ou JClic. Pour éviter " "toute confusion, il est préférable de maintenir chaque projet dans un " "dossier différent, c'est une règle stricte. Voulez-vous réellement créer un " "nouveau projet dans ce dossier ?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Error\\: Impossible de créer le dossier spécifié\\!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Error\\: Pas d'activité sélectionnée\\! Pour utiliser cette fonction vous " "devez sélectionner dans la liste l'activité oules activités pour lesquels " "les attributs spécifiés seront appliqués." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Copier les attributs vers\\:" #: edit_act_copy_margin msgid "Margin" msgstr "Marges" #: edit_act_copy_bgColor msgid "Background color" msgstr "Couleur d'arrière-plan" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Dégradé" #: edit_act_copy_bgImage msgid "Background image" msgstr "Image d'arrière-plan" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Bordure" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Arrière-plan transparent" #: edit_act_copy_position msgid "Position" msgstr "Position" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Messages" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Style du message initial" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Style de message terminal" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Style de message d'erreur" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Rapports" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Inclure l'activité dans les rapports" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Enregistrer les actions" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interface utilisateur" #: edit_act_copy_skin msgid "Skin" msgstr "Habillage" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Sons évènement" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Compteurs" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Chronomètre" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Max. temps" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Compteur d'essais" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Max. essais" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Score" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Temps de mélange" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Boutons" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Bouton d'aide" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Bouton d'information" #: edit_act_copy_grids msgid "Grids" msgstr "Grilles" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Style de grille A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Style de grille B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Style de grille de textes" #: edit_act_copy_text msgid "Text activities" msgstr "Activités texte" #: edit_act_copy_fontFace msgid "Font face" msgstr "Type de police" #: edit_act_copy_fontSize msgid "Font size" msgstr "Police" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Style de police" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Couleur de texte principal" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Couleur des cibles" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Couleur d'erreurs" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Tabulation" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Style de message précédent" #: edit_act_changeType msgid "Change activity type" msgstr "Changer type d'activité" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Le nom complet de la classe doit être utilisé pour bâtir l'activité " "(utiliateurs avancés seulement\\!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Autre..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Les utilisateurs avancés peuvent aussi créer des types non-enregistrés " "d'activités JClic. Ecrivez juste le nom complet de la classe derrière, " "préfixé par le package (comme \"com.acme.activities.FooActivity\"). Les " "classes d'activités doivent être étendues edu.xtec.jclic.Activity, et " "doivent être accessibles par le JVM chargeur de classe." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nom de l'activité\\:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Chaque activité doit avoir un nom unique dans le projet" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Attention\\: Changer le type de l'activité peut causer la " "perte de quelques objets et attributs. A utiliser avec précaution\\" "!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Localisation du code Jclic\\:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" "L'URL pointe vers un dossier contenant les fichiers JClic et les scripts" #: applet_prev_text msgid "HTML code before:" msgstr "HTML code avant\\:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Texte ou code HTML à placer avant l'applet" #: applet_post_text msgid "HTML code after:" msgstr "Code HTML après\\:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Texte ou code HTML à placer après l'applet" #: applet_size msgid "Applet size:" msgstr "Taille de l'applet\\:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Largeur et hauteur de l'applet, en absolu ou en pourcentage." #: applet_page_title msgid "Page title:" msgstr "Titre de page\\:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Texte à montrer en haut de la fenêtre de l'explorer" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "La page Web \"%s\" a été créée avec succès." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Voulez-vous l'ouvrir maintenant avec l'explorer ?" #: action_createHTML_caption msgid "Create web page..." msgstr "Créer une page Web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Créer une page HTML avec l'applet JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "Créer une page HTML page avec un applet contenant le projet courant" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nom du fichier\\:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nom du fichier HTML à créer" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "" "Valeurs par défaut utilisées par défaut pour la création de pages Web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Couleur d'arrière-plan\\:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Couleur d'arrière-plan de la page HTML" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Centré" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Placer l'applet centré horizontalement" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Largeur de l'applet (absolu ou pourcentage)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Hauteur de l'applet (absolu ou pourcentage)" #: applet_exitUrl msgid "On exit, go to:" msgstr "En quittant, allez à\\:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL où rediriger la navigation en quittant JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Nom du cadre info\\:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Nom du cadre utilisé pour montrer le contenu relatif au bouton \"info\"" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Créer un installateur de projet..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Créer un script d'installation de projet pour le player JClic" #: installer_caption msgid "Edit project installer script" msgstr "Editer le script d'installation du projet" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Titre\\:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Titre du projet, à montrer dans l'installateur" #: installer_authors msgid "Autors:" msgstr "Auteurs\\:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Auteurs/s du projet (petit texte)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Dossier\\:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Nom du dossier à suggérer par l'installateur" #: installer_files msgid "Files to be copied:" msgstr "Fichiers à copier\\:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Fichiers à copier par l'installateur" #: installer_files_available msgid "Available files" msgstr "Fichiers valables" #: installer_files_selected msgid "Selected files" msgstr "Fichiers sélectionnés" #: installer_files_add msgid ">> add >>" msgstr ">> ajouter >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Ajouter le fichier sélectionné à la liste" #: installer_files_remove msgid "<< remove <<" msgstr "<< retirer <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Retirer le fichier sélectionné de la liste" #: installer_button msgid "Launch button" msgstr "Bouton de lancement" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Propriétés du bouton à montrer dans la librairie du projet" #: installer_button_project msgid "Main project:" msgstr "Projet principal\\:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Projet JClic à lancer avec le bouton" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Etiquette\\:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Petite étiquette à afficher dans le bouton" #: installer_button_icon msgid "Icon:" msgstr "Icône\\:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Image à utiliser comme icône de bouton. Laissez blanc pour utiliser l'icône " "JClic par défaut." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Description" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Tooltip à montrer avec le bouton" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Error\\: Titre du projet absent" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Error\\: Nom du dossier absent" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Error\\: Pas de fichiers sélectionnés" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Error\\: Texte du bouton de lancement absent" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Error\\: le projet assigné au bouton de lancement n'est pas dans la liste de " "fichiers à copier" #: applet_page_full msgid "Full-page applet" msgstr "Applet plein-page" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "Applet avec des dimensions spécifiques" #: edit_text_align_left msgid "Align text left" msgstr "Aligner le texte à gauche" #: edit_text_align_center msgid "Center text" msgstr "Centrer le texte" #: edit_text_align_right msgid "Align text right" msgstr "Aligner le texte à droite" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Créer ou retirer une cible" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Insérer une cellule" #: edit_text_act_content msgid "Content" msgstr "Contenu" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Style" #: edit_cell_size msgid "Cell size:" msgstr "Taille de cellule\\:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Les activités suivantes n'apparaissent dans aucune séquence d'activités du " "projet, aussi elles ne sont jamais affichées\\:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "Les objets média suivants ne sont directement utilisés dans aucune activité\\" ":" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "Voulez-vous les ajouter à la fin de la séquence d'activités ?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Voulez-vous les retirer ?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Retrait des objets média inutilisés" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Orphan activités" #: edit_media_refreshAll msgid "Update all media content" msgstr "Mettre à jour tous les contenus média" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Mettre à jour tous les objets média en rechargeant les fichiers" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Mettre à jour le média..." #: edit_media_exportAll msgid "Export all media" msgstr "Exporter tous les médias" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Enregistrer vers fichiers le contenu de tous les éléments média" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Sélectionner" #: edit_shape_addPoint msgid "Add point" msgstr "Ajouter point" #: edit_shape_deletePoint msgid "Delete" msgstr "supprimer" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Dessiner rectangle" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Dessiner ellipse" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Dessiner polygone" #: edit_shape_toLine msgid "Convert to line" msgstr "Convertir en ligne" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Convertir en courbe de bézier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Convertir en courbe quadratique" #: edit_shape_rLeft msgid "Rotate left" msgstr "Rotation à gauche" #: edit_shape_rRight msgid "Rotate right" msgstr "Rotation à droite" #: edit_shape_expand msgid "Expand" msgstr "Etendre" #: edit_shape_contract msgid "Contract" msgstr "Contracter" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Zoom in" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Zoom out" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Joindre les points proches" #: edit_shape_showPoints msgid "Show points" msgstr "Montrer les points" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Montrer/Cacher les points" #: edit_shape_gridSize msgid "Grid size:" msgstr "Taille de la grille\\:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Montrer / cacher la grile" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Magnétisme radiant\\:" #: edit_shape_elements msgid "Defined elements" msgstr "Eléments définis" #: edit_shape_elemName msgid "Name of the selected element" msgstr "nom de l'élément sélectionné" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Action du magnétisme, quand activé" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Taille de la grille" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Activité\\:" #: edit_mc_sequence msgid "Sequence:" msgstr "Séquence\\:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL\\:" #: edit_mc_project msgid "Project:" msgstr "Projet\\:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Choisir activité" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Choisir séquence" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Donnée insuffisante\\!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Couleur de flèche\\:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Couleur utilisée par l'éditeur pour dessiner les flèches (pas exactement, " "car un masque XOR est utilisé)" #: edit_act_editActivity msgid "Edit..." msgstr "Editer..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Editer l'activité sélectionnée" #: action_saveFileAs_caption msgid "Save as..." msgstr "Enregistrer sous..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Enregistrer le projet courant avec un nom différent" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Comportement" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Comportement" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Traîner" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Drag cells instead of use a connection line" #: edit_act_behavior_order msgid "Check solving order" msgstr "Check solving order" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Cells must be solved in order" #: edit_act_scramble msgid "Scramble" msgstr "Mélanger" #: action_importActivities_caption msgid "Import activities..." msgstr "Importer des activités..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importer des activités d'un autre projet" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "Le fichier choisi correspond au projet en cours. Des activités peuvent être " "importées seulement entre différents projets. Veuillez choisir un autre " "fichier." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" "Choisissez une ou plusieurs activités pour importer dans le projet en cours\\" ":" #: import_importing msgid "Importing..." msgstr "Importation..." #: import_checkdep msgid "Checking dependencies..." msgstr "Vérification des dépendances..." #: import_impmedia msgid "Importing media\\:" msgstr "Importation des médias\\:" #: import_impact msgid "Importing activity\\:" msgstr "Importation de l'activité\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Choisissez le projet de JClic dont les activités seront importées" #: edit_tagRep_tags msgid "Tag marks" msgstr "Signes utilisés pour les balises" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Signe de départ\\:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Signe utilisé pour ouvrir les balises" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Signe de fin\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Signe utilisé pour fermer les balises" #: edit_tagRep_file msgid "File" msgstr "Fichier" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Fichier ou URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Nom ou URL du fichier qui contient les valeurs qui remplaceront les balises" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Encodage des caractères\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Encodage de caractères utilisé dans le fichier" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Parcourir…" #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Parcourir le système de fichier" #: edit_tagRep_title msgid "Tag replacing" msgstr "Remplacement de balises" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Effacer les styles du texte..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Attention\\: Cette opération effacera les attributs de caractères " "personnalisés de tout le document et y restaurera le style principal. Vous " "ne pourrez pas revenir sur cette action. Souhaitez-vous la confirmer ?" #: img_max_size msgid "Maximum size of images:" msgstr "Taille maximale des images :" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "" "Largeur maximale des images importées dans la bibliothèque de médias." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "" "Hauteur maximale des images importées dans la bibliothèque de médias." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "L'image \"%s\" a une taille de %s pixels. Cette taille dépasse ce qui est " "permis par JClic Author (%s). Voulez-vous la redimensionner ?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_gl.po000066400000000000000000002431321335566474600234260ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2012-09-26 20:09+0000\n" "Last-Translator: Xosé \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Descrición" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nome da actividade" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nome:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Descrición da actividade" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Informes" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Engadir esta actividade nos informes" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Engadir os resultados desta actividade nos informes de usuario" #: edit_act_code msgid "Code:" msgstr "Código:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Código opcional empregado para agrupar e filtrar na base de datos de " "informes." #: edit_act_reportActions msgid "Report user actions" msgstr "Rexistrar tamén as accións" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Rexistrar os detalles de todas as accións feitas polos usuarios" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Contadores" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Contador de tempo" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Mostrar ou agochar o contador de tempo" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Contador de intentos" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Mostra ou agocha o contador de intentos" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Contador de acertos" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Mostrar ou agochar o contador de acertos." #: edit_act_maxTime msgid "Max time:" msgstr "Tempo máximo:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Tempo máximo para resolver a actividade, en segundos, ou cero para ilimitado." #: edit_act_countdown msgid "Countdown" msgstr "Conta atrás" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "O contador comeza no máximo valor, decrecendo ata cero." #: edit_act_maxActions msgid "Max tries:" msgstr "Intentos máx:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Número máximo de intentos permitidos, ou cero para ilimitado." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Botóns" #: edit_act_helpBtn msgid "Help" msgstr "Axuda" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Mostra ou oculta o botón de axuda" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Mostra a solución" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Mostra esta mensaxe:" #: edit_act_infoBtn msgid "Information" msgstr "Información" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Mostra ou agocha o botón de información" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Mostra este URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Executa a orde:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Enderezo da páxina web que se mostrará ao premer no botón de información" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Liña de ordes que se executará ao premer no botón de información." #: edit_act_mainWindow msgid "Main window:" msgstr "Xanela principal:" #: edit_act_gameWindow msgid "Game window:" msgstr "Xanela de xogo:" #: edit_act_margin msgid "Margin:" msgstr "Marxe:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Espazo horizontal e vertical entre obxectos visuais." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Cor de fondo:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Cambia a cor de fondo." #: edit_gradient_startColor msgid "Start color:" msgstr "Cor inicial:" #: edit_gradient_endColor msgid "End color:" msgstr "Cor final:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Selección da cor inicial" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Selección da cor final." #: edit_gradient_cycles msgid "Cycles:" msgstr "Ciclos:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Número de repeticións do gradiente sobre a superficie a pintar." #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientación:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Orientación do gradiente, medida en graos sobre a horizontal." #: edit_act_gradient msgid "Gradient:" msgstr "Gradiente:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Emprega un gradiente de cores" #: edit_color_opacity msgid "Opacity" msgstr "Opacidade" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Axusta o valor da canle alfa (opacidade) de cor." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Gradiente" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Empregar os valores predeterminados (gradiente nulo)." #: edit_act_image msgid "Image:" msgstr "Imaxe:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Descrición" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nome e descrición" #: edit_act_tiledBgImg msgid "Tiled" msgstr "En mosaico" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Pinta toda a superficie coa imaxe, repetíndoa ao longo dos eixos X e Y " "tantas veces como for necesario." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Vista previa:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Bordo" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Debuxar unha liña de bordo arredor da xanela" #: edit_act_transparent msgid "Transparent" msgstr "Transparente" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "A xanela ten o fondo transparente" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Largura:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Altura:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Largura do obxecto, indicada en píxeles" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Altura do obxecto, en píxeles" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Centrado" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "O obxecto sitúase centrado respecto á xanela principal" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Posición horizontal absoluta" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Posición vertical absoluta" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interface de usuario" #: edit_act_image_tooltip msgid "Select an image" msgstr "Selecciona unha imaxe" #: edit_act_text msgid "Text:" msgstr "Texto:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Texto que se mostrará neste obxecto" #: edit_font_face msgid "Typeface:" msgstr "Tipo:" #: edit_font_size msgid "Size:" msgstr "Tamaño:" #: edit_font_bold msgid "Bold" msgstr "Negra" #: edit_font_italic msgid "Italic" msgstr "Cursiva" #: edit_font_underline msgid "Underline" msgstr "Subliñado" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Estilo:" #: edit_cell_title msgid "Cell contents" msgstr "Contido da cela" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Mensaxes" #: edit_act_msg_initial msgid "Initial message:" msgstr "Mensaxe inicial:" #: edit_act_msg_final msgid "Final message:" msgstr "Mensaxe final:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Mensaxe previa:" #: edit_act_msg_error msgid "Error message:" msgstr "Mensaxe de erro:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Mensaxe que se mostra cando comezar a actividade" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Mensaxe que se mostra cando remata a actividade" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Mensaxe que se mostra cando remata a actividade con erros" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Mensaxe que se mostra antes de comezar a actividade (só en certos tipos de " "actividades)" #: edit_align msgid "Align:" msgstr "Aliñamento:" #: edit_act_textColor msgid "Text color:" msgstr "Cor do texto:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Cor empregada para debuxar o texto" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Cor da sombra:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Cor empregada na sombra do texto, se existe" #: edit_act_shadow msgid "Shadow" msgstr "Sombra" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Debuxar o texto con sombra" #: edit_act_borderColor msgid "Border color:" msgstr "Cor do bordo:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Cor empregada para debuxar o bordo da cela" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Cor de estado inactiva:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Cor empregada cando a cela está desactivada" #: edit_act_altColor msgid "Alternative color:" msgstr "Cor alternativa:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Cor coa que se mostra o contido alternativo das celas unha vez solucionadas" #: edit_cell_marked msgid "Marked" msgstr "Marcada" #: edit_cell_disabled msgid "Disabled" msgstr "Desactivada" #: edit_cell_alt msgid "Alternative" msgstr "Alternativa" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Marxe interna:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Espazo entre os bordos da cela e o texto" #: edit_cell_borderWidth msgid "Border width:" msgstr "Largo do bordo:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Largo do trazo empregado para debuxar o bordo" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Largo do marcador:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Largo do trazo empregado para debuxar o bordo cando a cela se atopa marcada " "ou seleccionada" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Vista previa da cela en estado «alternativo»" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Vista previa en estado «desactivado»" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Vista previa en estado «marcado»" #: edit_act_testAction msgid "Preview activity" msgstr "Mostrar a actividade:" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Probar o funcionamento da actividade" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Descrición" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Título e descrición da actividade" #: edit_act_panels_options msgid "Options" msgstr "Opcións" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opcións da actividade" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Xanela" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Aspecto, tamaño e posición da xanela na que se executa a actividade" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Mensaxes" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Contido das mensaxes da actividade" #: edit_act_panels_panel msgid "Panel" msgstr "Panel" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Contidos do panel" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Estilo" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Axustar a cor, tipo e tamaño de letra das celas" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Estilo:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Evitar superposición imaxe/texto" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Tentar evitar que texto e a imaxe se superpoñan" #: edit_media_exists_1 msgid "The file" msgstr "O ficheiro" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "xa existe na mediateca!" #: edit_act_shaper msgid "Shaper:" msgstr "Recortador:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Produciuse un erro no xerador de formas:" #: edit_act_num_cols msgid "Columns:" msgstr "Columnas:" #: edit_act_num_rows msgid "Rows:" msgstr "Filas:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Altura dos dentes:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Largura dos dentes:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Distribución ao chou" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Propiedades do xerador de formas" #: edit_act_panels_text msgid "Text" msgstr "Texto" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Texto da actividade" #: action_saveFile_caption msgid "Save..." msgstr "Gardar..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Gardar o proxecto" #: action_docTree_caption msgid "Document tree..." msgstr "Árbore do documento..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Mostra o documento do proxecto en forma de árbore" #: edit_docTree_title msgid "Document tree" msgstr "Árbore do documento" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Referenciado por:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Atención:

Este proxecto " "enlaza con outros proxectos.
Desexa explorar as ligazóns e cargar todos " "os ficheiros relacionados?

(Recoméndase responder SI cando se está " "importando un paquete de actividades Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Tipo:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Descoñecido" #: edit_mc_type_sound msgid "Play sound" msgstr "Reproducir son" #: edit_mc_type_video msgid "Play video" msgstr "Reproducir vídeo" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Reproducir MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Reproducir CD de son" #: edit_mc_type_record msgid "Record sound" msgstr "Gravar son" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Reproducir son gravado" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Ir á actividade" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Ir á secuencia" #: edit_mc_type_run_external msgid "Run program" msgstr "Executar un programa" #: edit_mc_type_url msgid "Show URL" msgstr "Mostrar URL" #: edit_mc_type_exit msgid "End" msgstr "Fin" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Volver" #: edit_mc_level msgid "Priority level:" msgstr "Nivel de prioridade:" #: edit_mc_file msgid "File:" msgstr "Ficheiro:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parámetros:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Desde:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Ata:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Lonxitude máx.:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Cinta de gravación:" #: edit_mc_stretch msgid "Stretch size" msgstr "Comprimir se non collese" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Localización:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Desde:" #: edit_mc_location_from_box msgid "Cell" msgstr "Cela" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Xanela" #: edit_mc_location_from_frame msgid "Frame" msgstr "Fotograma" #: edit_mc_loop msgid "Loop playback" msgstr "Repetir indefinidamente" #: edit_mc_autostart msgid "Auto start" msgstr "Comezo automático" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Capturar o rato" #: edit_mc_title msgid "Multimedia and active content" msgstr "Contido activo e multimedia" #: edit_mc_label msgid "Active content:" msgstr "Contido activo:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Selección do obxecto multimedia" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Mediateca" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Centrado na cela" #: edit_mc_pos_window msgid "Centered over window" msgstr "Centrado na xanela" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Especificar posición:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "A estrutura ou os datos da árbore son incorrectos!" #: edit_act_panels_controls msgid "Controls" msgstr "Controis" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opcións de botóns e contadores" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Tipo:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Distribución dos paneis:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Posición relativa dos paneis A e B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Resolución inversa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "A actividade considerarase resolta cando todos os elementos de «B» estean " "emparellados." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Mostrar todas as frechas" #: edit_act_alt msgid "Alternative content:" msgstr "Contido alternativo:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Contido que se mostra nas celas xa resoltas ou non asignadas." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Editar o contido alternativo" #: edit_act_grid msgid "Grid" msgstr "Panel" #: edit_act_grid_A msgid "Grid A" msgstr "Grella A" #: edit_act_grid_B msgid "Grid B" msgstr "Panel B" #: edit_act_grid_layout msgid "Layout" msgstr "Disposición" #: edit_act_grid_relationship msgid "Relationship" msgstr "Relacións" #: edit_seq_activity_header msgid "activity" msgstr "actividade" #: edit_seq_tag_header msgid "tag" msgstr "etiqueta" #: edit_seq_jump_header msgid "jump to" msgstr "saltar a" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Actividade:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Etiqueta:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Descrición:" #: edit_seq_auto msgid "Move on automatically" msgstr "Avance automático" #: edit_seq_delay msgid "Delay:" msgstr "Retardo:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Avanzar" #: edit_seq_action_back msgid "Go bak" msgstr "Retroceder" #: edit_seq_action_jump msgid "Jump to..." msgstr "Saltar a..." #: edit_seq_action_stop msgid "Stop" msgstr "Parar" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Volver" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Saír de JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Frecha adiante" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Frecha atrás" #: edit_seq_action msgid "Action:" msgstr "Acción:" #: edit_seq_button_enabled msgid "Show button" msgstr "Mostrar o botón" #: edit_seq_project msgid "JClic Project:" msgstr "Proxecto JClic:" #: edit_act_absolute msgid "Absolute position" msgstr "Posición absoluta" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "O obxecto situarase nas coordenadas X e Y especificadas" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Posición:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Novo elemento da secuencia..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Inserir un novo elemento na secuencia de actividades" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Seleccione unha actividade para o novo elemento de secuencia." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "Non se pode crear un novo elemento de secuencia sen indicar a actividade!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Neste proxecto non hai ningunha actividade! Non se poden empregar elementos " "de secuencia nun proxecto baleiro." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Destino do salto:" #: edit_seq_jump_title msgid "Jump target" msgstr "Destino do salto" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Engadir unha nova actividade ao proxecto" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Tipo de actividade:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nome:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Seleccione o tipo de actividade que desexe crear e déalle un nome:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "¡Hai que seleccionar un tipo de actividade!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Ten que indicar un nome para a actividade!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Non se puido crear a actividade!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Clase Java:" #: edit_text_act_format msgid "Format" msgstr "Formato" #: edit_text_act_answer msgid "Answer" msgstr "Resposta" #: edit_text_act_popup msgid "Pop up" msgstr "Xanela emerxente" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Respostas válidas:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Engadir un novo elemento á lista" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Modificar o elemento seleccionado" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Eliminar da lista o elemento seleccionado" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Subir" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Baixar" #: edit_list_newValue msgid "New text:" msgstr "Novo texto:" #: edit_list_addElement msgid "Add new list element" msgstr "Engadir un novo elemento de texto" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Modificar o texto seleccionado" #: edit_text_act_target msgid "Target" msgstr "Destino" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Lonxitude máx.:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Número máximo de caracteres permitidos na resposta." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Carácter de recheo" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Carácter empregado para indicar a incógnita" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Lonxitude inicial" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Número de caracteres de recheo que se mostrarán ao comezo da actividade." #: edit_text_act_iniText msgid "Initial text:" msgstr "Texto inicial:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Texto que se mostrará na incógnita ao comezo da actividade." #: edit_text_act_list msgid "Show a list of options:" msgstr "Mostrar unha lista de opcións:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "O usuario deberá elixir unha opción da lista." #: edit_text_act_check_title msgid "Correction options" msgstr "Opcións de avaliación" #: edit_text_act_popup_no msgid "No pop up" msgstr "Sen xanela emerxente" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Aparición automática" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Aparición en erros" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Aparición con F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Tipo:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Retardo de aparición:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Tempo máx.:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Reproducir só son" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "É necesario seleccionar un fragmento de texto para crear unha nova incógnita!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" "O texto das incógnitas non pode incluír retornos de parágrafo nin " "tabuladores." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "As incógnitas non se poden solapar!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "As incógnitas non poden conter celas!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Cor do papel:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Editar os estilos do documento..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Estilo principal:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Tab espazo:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Espazos entre marcas de tabulador:" #: edit_text_act_colors msgid "Colors:" msgstr "Cores:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Cores das incógnitas:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Cores de erro:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Vista preliminar:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Texto normal" #: edit_text_act_styleSample_target msgid "target" msgstr "incógnita" #: edit_text_act_styleSample_error msgid "error" msgstr "erro" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "texto normal" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "texto normal." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Atención: Esta acción suprimirá a incógnita actualmente seleccionada. Desexa " "facelo?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Xanela previa..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Non mostrar ningún texto antes de comezar a actividade" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Mostrar o texto completo do exercicio" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Mostrar este texto:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Tempo máx.:" #: edit_text_act_edit_target msgid "Target..." msgstr "Incógnita..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Mostrar o botón de avaliación" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Texto do botón:" #: edit_text_act_checkCase msgid "Match case" msgstr "Comprobar maiúsculas/minúsculas" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Ter en conta tiles e caracteres especiais" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Ter en conta os signos de puntuación" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Permitir espazos repetidos" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Criterios" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Saltar automaticamente á seguinte incógnita" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Avanzar só se a resposta é correcta" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Indicar a posición dos erros" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Parámetros do algoritmo de análises" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Pasos:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Campo de exploración:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Avaliación" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Análise das respostas" #: edit_text_act_check_bt msgid "Correction..." msgstr "Corrección..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Botón de avaliación" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progreso" #: edit_text_act_typeBtn msgid "Type..." msgstr "Tipo..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ordenar parágrafos" #: edit_text_act_orderWords msgid "Order words" msgstr "Ordenar palabras" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Barallar palabras entre parágrafos" #: edit_text_act_type_title msgid "Activity type" msgstr "Tipo de actividade" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Esta acción suprimirá todas as incógnitas actualmente definidas. Seguro que " "desexa facelo?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identificar palabras" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identificar caracteres" #: edit_media_change_name msgid "Change name..." msgstr "Cambiar o nome..." #: edit_media_change_file msgid "Change file..." msgstr "Cambiar o ficheiro..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Gardar no arquivo ZIP" #: edit_media_type msgid "Media type:" msgstr "Tipo de recurso:" #: edit_media_size msgid "File size:" msgstr "Tamaño do ficheiro:" #: edit_media_show_type msgid "Files of type:" msgstr "Tipo de ficheiros:" #: edit_media_preview msgid "Preview media" msgstr "Visualizar o obxecto" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Visualización do recurso" #: edit_media_rename msgid "Change resource name" msgstr "Cambiar o nome do recurso" #: edit_media_rename_title msgid "Rename" msgstr "Renomear" #: edit_media_rename_prompt msgid "New name:" msgstr "Nome novo:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Nome de recurso non válido!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Xa existe outro recurso con este nome! Cada recurso debe ter un único nome " "no proxecto." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Ficheiro incorrecto!" #: err_media_chfile_different msgid "File must be of same type" msgstr "O ficheiro debe ser do mesmo tipo" #: edit_media_font_error msgid "Unable to load font!" msgstr "Non se puido cargar o tipo de letra!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Gardar o ficheiro (extraelo desde o ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Actualizar o contido do recurso desde o ficheiro" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Isto non é un ficheiro real, senón un obxecto localizado nun contedor ZIP. " "Para empregar este recurso é preciso que exista un ficheiro co mesmo nome no " "cartafol onde está localizado o ZIP." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Actividades" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Secuencias" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Mediateca" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "" "Xestión de imaxes e outros recursos multimedia empregados no proxecto" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Creación e edición das actividades do proxecto" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Creación e edición de secuencias de actividades" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Título:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Título do proxecto" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Proxecto" #: edit_project_tooltip msgid "Edit project properties" msgstr "Edición das propiedades do proxecto" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Descrición:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Descrición xeral do proxecto" #: edit_project_area msgid "Areas:" msgstr "Áreas:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Áreas curriculares do proxecto" #: edit_project_level msgid "Levels:" msgstr "Niveis:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Niveis educativos do proxecto" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descritores:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descritores do proxecto (separados por comas)" #: edit_project_languages msgid "Languages:" msgstr "Idiomas:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Idiomas empregados no proxecto" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Cambiar o idioma seleccionado" #: edit_project_languages_add msgid "Add language" msgstr "Engadir un idioma:" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Códigos de idioma ISO-639:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autores:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Persoas que participaron na creación do proxecto" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nome:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "Correo electrónico:" #: edit_project_author_rol msgid "Rol:" msgstr "Rol:" #: edit_project_author_organization msgid "Organization:" msgstr "Organización:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nome do autor (campo obrigatorio)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Enderezo de correo electrónico do autor (opcional)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Rol da persoa no proxecto: autor, colaborador, debuxos, sons... (campo " "opcional)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Escola, universidade, asociación... (campo opcional)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Páxina web persoal (campo opcional)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Outras características (campo opcional)" #: edit_project_author_info msgid "Author info:" msgstr "Datos do autor:" #: edit_project_author_add msgid "Add author to list" msgstr "Engadir un autor á lista" #: edit_project_author_edit msgid "Edit author info" msgstr "Editar información sobre o autor" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nome:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nome da escola" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "Correo electrónico:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Enderezp de correo electrónico da escola" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Enderezo web da escola" #: edit_project_org_address msgid "Address:" msgstr "Enderezo:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Enderezo postal da escola" #: edit_project_org_pc msgid "PC:" msgstr "CP:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Código postal" #: edit_project_org_city msgid "City:" msgstr "Localidade:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Localidade da escola" #: edit_project_org_country msgid "Country:" msgstr "País:" #: edit_project_org_state msgid "State:" msgstr "Estado:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_org msgid "School/s:" msgstr "Escola/s:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Escolas e outras institucións que participaron no proxecto" #: edit_project_org_info msgid "Organization info:" msgstr "Datos da organización:" #: edit_project_org_add msgid "Add organization" msgstr "Engadir unha nova organización" #: edit_project_org_edit msgid "Edit organization data" msgstr "Modificar os datos da organización" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Estado, país, federación..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Estado federal, nacionalidade, comunidade, rexión..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Outros datos..." #: edit_project_rev_date msgid "Date:" msgstr "Data:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Data da revisión:" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autores:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autor da revisión" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Descrición:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Breve descrición dos cambios realizados" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Comentarios:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Información adicional" #: edit_project_rev msgid "Revisions:" msgstr "Revisións:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Historial das principais modificacións efectuadas no proxecto" #: edit_project_rev_add msgid "Add revision record" msgstr "Engadir un rexistro de revisión" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Modificación dos datos da revisión" #: edit_project_rev_info msgid "Revision data" msgstr "Características da revisión" #: edit_media_objects msgid "objects" msgstr "obxectos" #: edit_media_object msgid "object" msgstr "obxecto" #: edit_evsounds_start msgid "Start of activity:" msgstr "Comezo da actividade:" #: edit_evsounds_click msgid "Click on object:" msgstr "Premer nun obxecto:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Acción errónea:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Acción correcta:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Actividade rematada con erros:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Actividade rematada correctamente:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Erro: O campo da descrición non pode quedar en branco!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Edición dos sons de evento" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Sons de evento:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Asignar sons específicos a cada evento JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Sons de evento:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Poñer sons específicos a cada evento de JClic" #: edit_evsounds_default msgid "default sound" msgstr "son predeterminado" #: edit_evsounds_disabled msgid "disabled" msgstr "desactivado" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Activa ou desactiva o son para este evento" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Prema para seleccionar un son para este evento, ou desmarque para empregar o " "son predeterminado" #: action_newProject_caption msgid "New project..." msgstr "Novo proxecto..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Crea un novo proxecto JClic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Desde:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Valor mínimo do operando" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Ata:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Valor máximo do operando" #: edit_arith_op_with msgid "With:" msgstr "Con:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Se se marca, o operando pode ter tamén este valor" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Un da lista:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Lista de posíbeis valores do operando" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Decimais:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Número de decimais do operando" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (integer)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#,#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#,##" #: edit_arith_firstOp msgid "First operand" msgstr "Primeiro operando" #: edit_arith_secondOp msgid "Second operand" msgstr "Segundo operando" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 para JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operacións:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Selecciona o tipo de operacións a realizar" #: edit_arith_operations_plus msgid "Plus" msgstr "Sumas" #: edit_arith_operations_minus msgid "Minus" msgstr "Restas" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Multiplicacións" #: edit_arith_operations_divide msgid "Divide" msgstr "Divisións" #: edit_arith_unknown msgid "Unknown:" msgstr "Incógnita:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Selecciona o elemento que fará de incógnita" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "A incógnita é o resultado" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "A incógnita é o segundo operando" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "O primeiro operando é a incógnita" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "A operación é a incógnita" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Escribe a expresión comezando polo resultado" #: edit_arith_result msgid "Result:" msgstr "Resultado:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Sen «levar»" #: edit_arith_result_random msgid "Random" msgstr "Ao chou" #: edit_arith_result_asc msgid "Ascending" msgstr "Ascendente" #: edit_arith_result_order msgid "Order by result:" msgstr "Ordenar por resultado:" #: edit_arith_result_desc msgid "Descending" msgstr "Descendente" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Evitar duplicados" #: edit_arith_cond msgid "Conditions:" msgstr "Condicións:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indiferente" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "O primeiro operando debe ser maior que o segundo" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "O primeiro operando debe ser menor que o segundo" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Outras condicións" #: edit_autocp msgid "Automatic content generator:" msgstr "Xerador automático de contido:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" "Selección do tipo de xerador automático de contido para esta actividade." #: edit_autocp_block msgid "Content generator" msgstr "Xerador de contido" #: edit_autocp_btn msgid "Settings..." msgstr "Configuración..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Configuración dos parámetros do xerador de contido" #: edit_data msgid "Edit data" msgstr "Edición de datos" #: edit_act msgid "Activity edit" msgstr "Edición da actividade" #: edit_acp msgid "Content provider edit" msgstr "Edición do xerador de contido" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Produciuse un erro ne creación do xerador automático de contido!" #: edit_project_author_group msgid "Creation" msgstr "Creación" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Descrición" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interface de usuario" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Descrición:" #: m_Edit msgid "Edit" msgstr "Edición" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Nova actividade..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Inserir" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Ver" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Proxecto" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Edita as propiedades do proxecto" #: action_editMedia_caption msgid "Media" msgstr "Mediateca" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Edita a mediateca do proxecto" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Actividades" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Edita as actividades" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Secuencias" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Edita as secuencias das actividades" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "O proxecto actual foi modificado. Desexa gardar os cambios?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descritores" #: edit_media_new msgid "New media object..." msgstr "Novo obxecto multimedia..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Engadir unha nova imaxe ou obxecto multimedia á mediateca" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Límite de puntuación:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Segue este camiño cando a puntuación global for igual ou maior que..." #: edit_seq_time msgid "Time threshold:" msgstr "Límite de tempo:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Para seguir este camiño, o tempo empregado nas actividades debe ser inferior " "a..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Segue este camiño cando a puntuación global for inferior a..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Segue este camiño cando o tempo empregado nas actividades for maior que..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Saltos condicionais" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Especificar saltos especiais que se executarán unicamente se se dan " "determinadas condicións" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Indicar as condicións para saltar a un nivel superior" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Salto inferior:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Salto superior:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Indicar as condicións para saltar a un nivel inferior" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Acción asignada ao botón de «avanzar»" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Acción asignada ao botón de «retroceder»" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Indicar o destino do salto" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Acción a realizar" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Actividade asignada a este elemento da secuencia" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Etiqueta empregada para referirse a este elemento da secuencia (campo " "opcional)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Descrición do elemento da secuencia (campo opcional)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Activar ou desactivar o botón de paso de actividade" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Avanzar automaticamente ao finalizar a actividade" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Número de segundos a esperar antes de realizar o paso automático" #: edit_color_dlgTitle msgid "Select color" msgstr "Seleccionar cor" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Por favor, agarda mentres se cambia o nome do recurso..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Largo:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Largura das celas (en píxeles)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Alto:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Altura das celas (en píxeles)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Palabras agochadas:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Lista das palabras agochadas no panel" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Empregar o panel B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "Empregar un segundo panel, que se mostrará segundo se atopen as palabras" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Selección do tipo de xerador de formas do panel" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Número de columnas do panel" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Número de filas do panel" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Separadores transparentes" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Mostra os separadores (celas negras) como buratos transparentes" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Mesturas\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Número de veces que se barallarán as pezas" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Copiar atributos a..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Atributos:" #: edit_act_copy_dest msgid "Apply to:" msgstr "Aplicar a:" #: edit_act_copy_style_main msgid "Main window" msgstr "Xanela principal" #: edit_act_copy_style_play msgid "Play window" msgstr "Xanela de xogo" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Actividades a modificar:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Copiar atributos" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "" "Copiar a outras actividades algúns dos atributos da actividade actual" #: edit_new_project_name msgid "Project name:" msgstr "Nome do proxecto:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Nome curto e descritivo do proxecto" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nome de ficheiro:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nome do arquivo do proxecto, sen extensión" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Cartafol:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nome do cartafol no que se almacenará o proxecto" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Explorar..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Crear novo proxecto JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Erro: Tanto o proxecto como o ficheiro e o cartafol deben ter nomes válidos, " "non pode quedar o campo en branco." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Este cartafol xa contén outro proxecto Clic 3.0 ou JClic. Para evitar " "confusións, recoméndase manter cada proxecto nun cartafol diferenciado, se " "ben non é un requisito imprescindíbel. Realmente desexa crear o novo " "proxecto neste cartafol?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Erro: Non é posíbel crear o cartafol especificado!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Erro: Non seleccionou ningunha actividade! Para empregar esta función é " "necesario seleccionar a lista de actividade ou actividades ás que se lle " "aplicarán os atributos indicados." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Copiando atributos a:" #: edit_act_copy_margin msgid "Margin" msgstr "Marxe" #: edit_act_copy_bgColor msgid "Background color" msgstr "Cor de fondo" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Gradiente" #: edit_act_copy_bgImage msgid "Background image" msgstr "Imaxe de fondo" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Bordo" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Fondo transparente" #: edit_act_copy_position msgid "Position" msgstr "Posición" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Mensaxes" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Estilo da mensaxe inicial" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Estilo da mensaxe final" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Estilo da mensaxe de erro" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Informes" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Engadir a actividade nos informes" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Rexistrar accións" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interface de usuario" #: edit_act_copy_skin msgid "Skin" msgstr "Tema visual" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Sons de evento" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Contadores" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Contador de tempo" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Tempo máximo" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Contador de intentos" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Número máximo de intentos" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Contador de acertos" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Número de veces que hai que barallar" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Botóns" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Botón de axuda:" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Botón de información" #: edit_act_copy_grids msgid "Grids" msgstr "Paneis" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Estilo do panel A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Estilo do panel B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Estilo dos paneis de texto" #: edit_act_copy_text msgid "Text activities" msgstr "Actividades de texto" #: edit_act_copy_fontFace msgid "Font face" msgstr "Tipo de letra" #: edit_act_copy_fontSize msgid "Font size" msgstr "Tamaño de letra" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Estilo de letra" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Cor do texto principal" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Escolla o proxecto JClic a partir do cal desexa importar actividades" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Cor dos erros" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Espazo entre tabuladores" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Estilo da mensaxe previa" #: edit_act_changeType msgid "Change activity type" msgstr "Cambiar o tipo de actividade" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Nome completo da clase que se empregará para construír a actividade (só " "usuarios avanzados!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Outras..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Os usuarios/as avanzados/as poden crear tamén outros tipos de actividades " "JClic non rexistradas. Escriba debaixo o nome completo da clase, precedida " "polo do paquete (por exemplo: \"com.acme.activities.FooActivity\"). As novas " "actividades estenderán edu.xtec.jclic.Activity, e serán accesíbeis ao " "cargador de clases da Máquina Virtual de Java." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nome da actividade:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Cada actividade terá un nome único no proxecto" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Atención: O " "cambio de tipo pode causar a perda dalgúns dos atributos e obxectos da " "actividade que se está a editar. Empregue esta función con " "tino!

" #: applet_codebase msgid "Location of JClic code:" msgstr "Ubicación do código JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" "URL que apunta a un cartafol onde están os ficheiros de programa do JClic" #: applet_prev_text msgid "HTML code before:" msgstr "Código HTML previo:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Texto ou código HTML que aparecerá antes do miniaplicativo" #: applet_post_text msgid "HTML code after:" msgstr "Código HTML posterior:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Texto ou código HTML que aparecerá despois do miniaplicativo" #: applet_size msgid "Applet size:" msgstr "Tamaño do miniaplicativo:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "" "Largura e altura do miniaplicativo, en valores absolutos ou porcentuais." #: applet_page_title msgid "Page title:" msgstr "Título da páxina:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Texto que se mostrará na parte superior da xanela do navegador" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "A páxina web «%s» creouse correctamente." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Desexa abrila agora co navegador?" #: action_createHTML_caption msgid "Create web page..." msgstr "Crear páxina web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Creación dunha páxina HTML cun miniaplicativo JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "" "Creación dunha páxina HTML cun miniaplicativo que conteña o proxecto actual." #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nome do ficheiro:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nome do ficheiro HTML que se creará" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Miniaplicativo" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Valores predeterminados empregados na creación de páxinas web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Cor de fondo:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Cor de fondo da páxina web" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Centrado" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Situar o miniaplicativo centrado horizontalmente" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Largura do miniaplicativo (en valor absoluto ou porcentual)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Altura do miniaplicativo (en valor absoluto ou porcentual)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Ao saír, ir a:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL a onde se redirixirá a navegación ao saír de JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Marco de información:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Nome do marco empregado para mostrar o contido ligado ao botón «info»" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Crear instalador do proxecto..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Creación dun ficheiro de instalación do proxecto para JClic player" #: installer_caption msgid "Edit project installer script" msgstr "Edición do ficheiro de instalación do proxecto" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Título:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Título do proxecto que se mostrará no asistente da instalación" #: installer_authors msgid "Autors:" msgstr "Autores:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autor/es do proxecto (texto curto)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Cartafol:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Nome do cartafol que suxerirá o asistente da instalación" #: installer_files msgid "Files to be copied:" msgstr "Ficheiros a copiar:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Ficheiros que se copiarán durante a instalación" #: installer_files_available msgid "Available files" msgstr "Ficheiros dispoñíbeis" #: installer_files_selected msgid "Selected files" msgstr "Ficheiros seleccionados" #: installer_files_add msgid ">> add >>" msgstr ">> engadir >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Engadir o ficheiro seleccionado á lista" #: installer_files_remove msgid "<< remove <<" msgstr "<< suprimir <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Suprimir o ficheiro seleccionado da lista" #: installer_button msgid "Launch button" msgstr "Botón de activación" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Propiedades do botón que se mostrará na biblioteca de proxectos" #: installer_button_project msgid "Main project:" msgstr "Proxecto principal" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Proxecto JClic asociado ao botón" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Etiqueta" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Breve etiqueta de texto, que aparecerá dentro do botón" #: installer_button_icon msgid "Icon:" msgstr "Icona:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Imaxe que mostrará o botón. Deixar en branco para empregar o botón JClic " "predeterminado." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Descrición" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Texto de axuda emerxente que mostrará o botón" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Erro: Hai que indicar o título do proxecto" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "" "Erro: Hai que indicar o nome do cartafol no que se instalará o proxecto" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Erro: Non hai ningún ficheiro seleccionado" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Erro: Hai que indicar o texto do botón de activación" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Erro: O proxecto asignado ao botón de activación non se atopa entre os " "ficheiros a copiar" #: applet_page_full msgid "Full-page applet" msgstr "O miniaplicativo ocupa toda a páxina" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "O miniaplicativo ten unhas dimensións específicas" #: edit_text_align_left msgid "Align text left" msgstr "Aliñar o texto á esquerda" #: edit_text_align_center msgid "Center text" msgstr "Texto centrado" #: edit_text_align_right msgid "Align text right" msgstr "Aliñar o texto á dereita" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Crear unha incógnita ou suprimila" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Inserir unha cela" #: edit_text_act_content msgid "Content" msgstr "Contido" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Estilo" #: edit_cell_size msgid "Cell size:" msgstr "Tamaño da cela:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "As seguintes actividades non chegaron a executarse, posto que non aparecen " "en ningunha secuencia de actividades do proxecto:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "Os seguintes obxectos da mediateca non se empregan directamente en ninguha " "actividade:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "Desexa engadilas ao remate da última secuencia de actividades?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Desexa suprimilos?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Supresión de obxectos multimedia non empregados" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Actividades orfas:" #: edit_media_refreshAll msgid "Update all media content" msgstr "Actualizar o contido de todos os recursos" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Actualizar todos os recursos recargando os seus ficheiros" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Actualizando recursos..." #: edit_media_exportAll msgid "Export all media" msgstr "Exportar todos os recursos" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Gravar en ficheiros o contido de todos os recursos" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Seleccionar" #: edit_shape_addPoint msgid "Add point" msgstr "Engadir un punto" #: edit_shape_deletePoint msgid "Delete" msgstr "Eliminar" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Debuxar un rectángulo" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Debuxar unha elipse" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Debuxar un polígono" #: edit_shape_toLine msgid "Convert to line" msgstr "Converter en liña" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Converter en curva de Bézier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Converter en curva cuadrática" #: edit_shape_rLeft msgid "Rotate left" msgstr "Xirar á esquerda" #: edit_shape_rRight msgid "Rotate right" msgstr "Xirar á dereita" #: edit_shape_expand msgid "Expand" msgstr "Expandir" #: edit_shape_contract msgid "Contract" msgstr "Contraer" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Acercar" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Alonxar" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Axuntar puntos próximos" #: edit_shape_showPoints msgid "Show points" msgstr "Mostrar os puntos" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Mostrar/Agochar os puntos" #: edit_shape_gridSize msgid "Grid size:" msgstr "Tamaño da grella:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Mostrar / Agochar a grella" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Radio do imán:" #: edit_shape_elements msgid "Defined elements" msgstr "Elementos definidos" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Nome do elemento seleccionado" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Radio de acción do imán cando está activado" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Tamaño da grella" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Actividade:" #: edit_mc_sequence msgid "Sequence:" msgstr "Secuencia:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Proxecto:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Escoller actividade" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Escoller secuencia" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Datos insuficientes!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Cor das frechas:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Cor empregada polo editor para debuxar as frechas (non é exacto, xa que se " "emprega unha máscara XOR de bits)" #: edit_act_editActivity msgid "Edit..." msgstr "Editar..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Editar a actividade seleccionada" #: action_saveFileAs_caption msgid "Save as..." msgstr "Gardar como..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Garda o proxecto cun nome diferente" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Comportamento" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Comportamento" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Arrastrar" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Arrastrar obxectos no canto de empregar unha liña de conexión" #: edit_act_behavior_order msgid "Check solving order" msgstr "Comprobar a orde de resolución" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "As celas deben ser resoltas en orde" #: edit_act_scramble msgid "Scramble" msgstr "Barallar" #: action_importActivities_caption msgid "Import activities..." msgstr "Importar actividades..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importar actividades dende outro proxecto" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "O ficheiro seleccionado correspóndese co proxecto actual. As actividades " "poden ser importadas só entre proxectos diferentes. Escolla outro ficheiro " "de proxecto." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "Escolla unha ou máis actividades a importar no proxecto actual\\:" #: import_importing msgid "Importing..." msgstr "Importando..." #: import_checkdep msgid "Checking dependencies..." msgstr "Comprobación de dependencias..." #: import_impmedia msgid "Importing media\\:" msgstr "Importando multimedia\\:" #: import_impact msgid "Importing activity\\:" msgstr "Importando actividade\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Escolla o proxecto JClic a partir do cal desexa importar actividades" #: edit_tagRep_tags msgid "Tag marks" msgstr "Marcas de etiquetas" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Marca inicial\\:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Marca usada ao inicio das etiquetas" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Marca final\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Marca usada ao final das etiquetas" #: edit_tagRep_file msgid "File" msgstr "Ficheiro" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Ficheiro ou URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Nome ou URL do ficheiro que contén os valores que substituiran as etiquetas" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Codificación de caracteres\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Codificación de caracteres empregada no ficheiro" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Explorar..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Explorar o sistema de ficheiros" #: edit_tagRep_title msgid "Tag replacing" msgstr "Substitución de etiqueta" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Limpar estilos de texto..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Atención\\: Esta acción limpará os atributos dos caracteres específicos " "aplicados ao documento, restaurándoos ao seu estilo principal. Esta acción " "non se pode desfacer. Está seguro de querer continuar?" #: img_max_size msgid "Maximum size of images:" msgstr "Tamaño máximo das imaxes:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Largura máxima das imaxes importadas á mediateca." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Altura máxima das imaxes importadas á mediateca." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "A imaxe «%s» ten un tamaño de %s píxeles. Isto excede o máximo permitido por " "JClic Author (%s). Quere cambiar o tamaño?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_it.po000066400000000000000000002441051335566474600234410ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2010-01-15 18:03+0000\n" "Last-Translator: nilocram \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Descrizione" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nome dell'attività" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nome:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Descrizione dell'attività" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Rapporti" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Includi questa attività nei rapporti" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Includi i risultati di queste attività nei rapporti degli utenti" #: edit_act_code msgid "Code:" msgstr "Codice:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Codice opzionale usato per raggruppare e fare ricerche nel database dei " "rapporti." #: edit_act_reportActions msgid "Report user actions" msgstr "Resoconto delle attività dell'utente" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Registra i dettagli di tutte le attività eseguite dagli utenti" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Contatori" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Cronometro" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Mostra/nascondi il cronometro" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Contatore dei tentativi" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Mostra/nascondi il contatore dei tentativi" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Punteggio" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Mostra/nascondi il punteggio." #: edit_act_maxTime msgid "Max time:" msgstr "Tempo massimo:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Tempo massimo per risolvere l'attività, in secondi, o 0 per un tempo " "illimitato." #: edit_act_countdown msgid "Countdown" msgstr "Conto alla rovescia" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "Il contatore inizia con il valore massimo, decrescendo fino a 0." #: edit_act_maxActions msgid "Max tries:" msgstr "Numero massimo dei tentativi:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Massimo numero di tentativi premesso, o 0 per tentativi illimitati." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Pulsanti" #: edit_act_helpBtn msgid "Help" msgstr "Aiuto" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Mostra/nascondi il pulsante di aiuto" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Mostra la soluzione" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Mostra questo messaggio:" #: edit_act_infoBtn msgid "Information" msgstr "Informazioni" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Mostra/Nascondi il pulsante informativo" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Mostra questa URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Esegui questo comando:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Indirizzo del sito Web da mostrare quando si clicca sul pulsante informativo" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "" "Linea di comando da eseguire quando si clicca sul pulsante d'informazione." #: edit_act_mainWindow msgid "Main window:" msgstr "Finestra principale:" #: edit_act_gameWindow msgid "Game window:" msgstr "Finestra di lavoro:" #: edit_act_margin msgid "Margin:" msgstr "Margine:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Spazio orizzontale e verticale tra gli oggetti visuali." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Colore di sfondo:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Cambia il colore di sfondo." #: edit_gradient_startColor msgid "Start color:" msgstr "Colore di partenza:" #: edit_gradient_endColor msgid "End color:" msgstr "Colore finale:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Selezione del colore di partenza" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Selezione del colore finale" #: edit_gradient_cycles msgid "Cycles:" msgstr "Ripetizioni:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Numero di ripetizioni della sfumatura sulla superificie colorata" #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientamento:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "" "Orientamento della sfumatura, misurato in gradi rispetto all'orizzontale" #: edit_act_gradient msgid "Gradient:" msgstr "Sfumatura:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Usa sfumature di colore" #: edit_color_opacity msgid "Opacity" msgstr "Opacità" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Imposta il valore di canale alpha del colore (opacità)" #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Sfumatura" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Usa i valori di default (sfumatura nulla)" #: edit_act_image msgid "Image:" msgstr "Immagine:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Descrizione" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nome e descrizione" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Ripetuto" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Anteprima:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Bordo" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Disegna una linea attorno alla finestra" #: edit_act_transparent msgid "Transparent" msgstr "Trasparente" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "La finestra ha lo sfondo trasparente" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Larghezza:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Altezza:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Larghezza dell'oggetto, misurata in pixels" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Altezza dell'oggetto, misurata in pixels" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Centrato" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "L'oggetto sarà centrato sulla finestra principale" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Posizione orizzontale assoluta" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Posizione verticale assoluta" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interfaccia utente" #: edit_act_image_tooltip msgid "Select an image" msgstr "Seleziona un'immagine" #: edit_act_text msgid "Text:" msgstr "Testo:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Testo da mostrare in questo oggetto" #: edit_font_face msgid "Typeface:" msgstr "Carattere:" #: edit_font_size msgid "Size:" msgstr "Dimensione:" #: edit_font_bold msgid "Bold" msgstr "Grassetto" #: edit_font_italic msgid "Italic" msgstr "Corsivo" #: edit_font_underline msgid "Underline" msgstr "Sottolineato" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Stile:" #: edit_cell_title msgid "Cell contents" msgstr "Contenuto della cella" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Messaggi" #: edit_act_msg_initial msgid "Initial message:" msgstr "Messaggio iniziale:" #: edit_act_msg_final msgid "Final message:" msgstr "Messaggio finale:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Messaggio precedente:" #: edit_act_msg_error msgid "Error message:" msgstr "Messaggio d'errore:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Messaggio da visualizzare all'avvio dell'attività" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Messaggio da visualizzare alla conclusione dell'attività" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "" "Messaggio da visualizzare quando l'attività si conclude con degli errori" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Messaggio da visualizzare prima dell'avvio dell'attività (solo in alcuni " "tipi di attività)" #: edit_align msgid "Align:" msgstr "Allineamento:" #: edit_act_textColor msgid "Text color:" msgstr "Colore del testo:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Colore usato per disegnare il testo" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Colore dell'ombra:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "" "Colore usato per disegnare l'ombreggiatura del testo, quando applicabile" #: edit_act_shadow msgid "Shadow" msgstr "Ombreggiatura" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Disegna il testo con l'ombreggiatura" #: edit_act_borderColor msgid "Border color:" msgstr "Colore del bordo:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Colore usato per disegnare il bordo della cella" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Colore di stato inattivo:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Colore usato quando la cella è disabilitata" #: edit_act_altColor msgid "Alternative color:" msgstr "Colore alternativo:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Colore usato per disegnare il contenuto alternativo nelle celle risolte" #: edit_cell_marked msgid "Marked" msgstr "Evidenziato" #: edit_cell_disabled msgid "Disabled" msgstr "Disabilitato" #: edit_cell_alt msgid "Alternative" msgstr "Alternativa" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Margine interno:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Spazio tra il bordo della cella e il testo." #: edit_cell_borderWidth msgid "Border width:" msgstr "Larghezza del bordo:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Larghezza della punta usata per disegnare il bordo standard" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Larghezza del marcatore:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Larghezza della punta usata per disegnare il bordo quando la cella è marcata " "o selezionata" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Anteprima nello stato \"alternativa\"" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Anteprima nello stato \"disabilitato\"" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Anteprima nello stato \"marcato\"" #: edit_act_testAction msgid "Preview activity" msgstr "Anteprima dell'attività" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Anteprima e prova dell'attività" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Descrizione" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Titolo e descrizione dell'attività" #: edit_act_panels_options msgid "Options" msgstr "Opzioni" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opzioni dell'attività" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Finestra" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Aspetto, dimensioni e posizione della finestra dell'attività" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Messaggi" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Contenuto dei messaggi dell'attività" #: edit_act_panels_panel msgid "Panel" msgstr "Pannello" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Contenuti del pannello" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Stile" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Imposta il colore delle celle, font e dimensioni" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Stile:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Permetti al testo di sconfinare dall'immagine" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Permette al testo di sconfinare dall'immagine" #: edit_media_exists_1 msgid "The file" msgstr "Il file" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "già esiste nella biblioteca multimediale!" #: edit_act_shaper msgid "Shaper:" msgstr "Pezzi:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Errore dei pezzi:" #: edit_act_num_cols msgid "Columns:" msgstr "Colonne:" #: edit_act_num_rows msgid "Rows:" msgstr "Righe:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Altezza della dentatura" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Larghezza della dentatura" #: edit_act_toothRandom msgid "Random distribution" msgstr "Distribuzione casuale" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Proprietà dei pezzi" #: edit_act_panels_text msgid "Text" msgstr "Testo" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Testo dell'attività" #: action_saveFile_caption msgid "Save..." msgstr "Salva..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Salva il progetto corrente" #: action_docTree_caption msgid "Document tree..." msgstr "Albero del documento..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Mostra il documento del progetto come un albero" #: edit_docTree_title msgid "Document tree" msgstr "Albero del documento" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Referenziato da:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Attenzione\\:

Questo " "progetto si connette con altri progetti.
Vuoi esplorare i riferimenti e " "caricare tutti i files relativi?

(Conviene rispondere SI' quando si " "vogliono importare attività di Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Tipo:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Sconosciuto" #: edit_mc_type_sound msgid "Play sound" msgstr "Riproduci un suono" #: edit_mc_type_video msgid "Play video" msgstr "Riproduci un video" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Riproduci un file MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Riproduci un CD audio" #: edit_mc_type_record msgid "Record sound" msgstr "Registra un suono" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Riproduci un suono registrato" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Vai all'attività" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Vai alla sequenza" #: edit_mc_type_run_external msgid "Run program" msgstr "Esegui il programma" #: edit_mc_type_url msgid "Show URL" msgstr "Mostra l'URL" #: edit_mc_type_exit msgid "End" msgstr "Fine" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Torna al programma" #: edit_mc_level msgid "Priority level:" msgstr "Livello di priorità:" #: edit_mc_file msgid "File:" msgstr "File:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parametri:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Da:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "A:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Lunghezza max.:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Registratore:" #: edit_mc_stretch msgid "Stretch size" msgstr "Comprimi le dimensioni" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Posizione:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Da:" #: edit_mc_location_from_box msgid "Cell" msgstr "Cella" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Finestra" #: edit_mc_location_from_frame msgid "Frame" msgstr "Fotogramma" #: edit_mc_loop msgid "Loop playback" msgstr "Esecuzione continua" #: edit_mc_autostart msgid "Auto start" msgstr "Auto start" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Cattura il mouse" #: edit_mc_title msgid "Multimedia and active content" msgstr "Contenuti multimediali e attivi" #: edit_mc_label msgid "Active content:" msgstr "Contenuto attivo:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Selezione degli oggetti multimediali" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Libreria multimediale" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Centrato sulla cella" #: edit_mc_pos_window msgid "Centered over window" msgstr "Centrato sulla finestra" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Specifica la posizione:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Struttura dell'albero incorretta o dati errati!" #: edit_act_panels_controls msgid "Controls" msgstr "Controlli" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opzioni per i pulsanti e i contatori" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Tipo:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Disposizione della griglia:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Posizione relativa dei pannelli A e B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Risoluzione inversa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "L'attività è risolta quando risultano collegati tutti gli elementi assegnati " "di \"B\"." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Mostra tutte le frecce" #: edit_act_alt msgid "Alternative content:" msgstr "Contenuto alternativo:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Contenuto mostrato nelle celle risolte e nelle celle non assegnate." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Modifica il contenuto alternativo" #: edit_act_grid msgid "Grid" msgstr "Griglia" #: edit_act_grid_A msgid "Grid A" msgstr "Griglia A" #: edit_act_grid_B msgid "Grid B" msgstr "Griglia B" #: edit_act_grid_layout msgid "Layout" msgstr "Disposizione" #: edit_act_grid_relationship msgid "Relationship" msgstr "Relazioni" #: edit_seq_activity_header msgid "activity" msgstr "attività" #: edit_seq_tag_header msgid "tag" msgstr "tag" #: edit_seq_jump_header msgid "jump to" msgstr "salta a" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Attività:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Etichetta:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Descrizione:" #: edit_seq_auto msgid "Move on automatically" msgstr "Vai avanti automaticamente" #: edit_seq_delay msgid "Delay:" msgstr "Ritardo:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Vai avanti" #: edit_seq_action_back msgid "Go bak" msgstr "Vai indietro" #: edit_seq_action_jump msgid "Jump to..." msgstr "Salta a..." #: edit_seq_action_stop msgid "Stop" msgstr "Arresta" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Torna al programma" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Esci da JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Freccia avanti:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Freccia indietro:" #: edit_seq_action msgid "Action:" msgstr "Azione:" #: edit_seq_button_enabled msgid "Show button" msgstr "Mostra il pulsante" #: edit_seq_project msgid "JClic Project:" msgstr "Progetto JClic:" #: edit_act_absolute msgid "Absolute position" msgstr "Posizione assoluta" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "L'oggetto sarà posizionato alle coordinate X e Y specificate" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Posizione:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Nuovo elemento della sequenza..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Inserisci un nuovo elemento nella sequenza delle attività" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "" "Per favore seleziona un'attività per il nuovo elemento della sequenza." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "Non posso creare un nuovo elemento senza un'attività!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Questo progetto non ha attività! Non è possibile creare una sequenza di " "attività in un progetto vuoto." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Obiettivo del salto:" #: edit_seq_jump_title msgid "Jump target" msgstr "Obiettivo del salto" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Aggiungi una nuova attività al progetto" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Tipo di attività:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nome:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "" "Per favore seleziona il tipo di attività da creare e dai ad essa un nome:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Devi selezionare un tipo di attività!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Devi specificare un nome per l'attività!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Impossibile creare l'attività!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Nome di classe Java:" #: edit_text_act_format msgid "Format" msgstr "Formato" #: edit_text_act_answer msgid "Answer" msgstr "Risposta" #: edit_text_act_popup msgid "Pop up" msgstr "Pop up" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Risposte valide:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Aggiungi un nuovo elemento alla lista" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Modifica l'elemento selezionato" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Cancella l'elemento selezionato" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Sposta in alto" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Sposta in basso" #: edit_list_newValue msgid "New text:" msgstr "Nuovo testo:" #: edit_list_addElement msgid "Add new list element" msgstr "Aggiungi un nuovo elemento di testo" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Modifica il testo selezionato" #: edit_text_act_target msgid "Target" msgstr "Testo nascosto" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Lunghezza max.:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Massimo numero di caratteri nella risposta." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Carattere di riempimento" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Carattere utilizzato per indicare il testo nascosto" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Lunghezza iniziale:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Numero dei caratteri di riempimento che saranno visualizzati all'inizio " "dell'attività." #: edit_text_act_iniText msgid "Initial text:" msgstr "Testo iniziale:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "" "Testo visualizzato all'inizio dell'attività al posto del testo nascosto." #: edit_text_act_list msgid "Show a list of options:" msgstr "Mostra una lista di opzioni:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" "Mostra una lista di opzioni tra le quali l'utente è chiamato a scegliere." #: edit_text_act_check_title msgid "Correction options" msgstr "Opzioni di correzione" #: edit_text_act_popup_no msgid "No pop up" msgstr "Niente pop up" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Pop up automatico" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Pop up in caso di errori" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Pop up con F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Tipo:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Ritardo del pop up:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Tempo max:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Solo suono" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "Per creare un nuovo testo nascosto devi selezionare un frammento di testo!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "Il testo nascosto non può includere caratteri accapo o tab." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Non possono essere registrati testi nascosti!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "I testi nascosti non possono contenere celle!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Colore del foglio:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Modifica gli stili del documento..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Stile principale:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Tabulazione:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Spazi tra i tabulatori:" #: edit_text_act_colors msgid "Colors:" msgstr "Colori:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Colori del testo nascosto:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Colori degli errori:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Anteprima:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Testo standard" #: edit_text_act_styleSample_target msgid "target" msgstr "testo nascosto" #: edit_text_act_styleSample_error msgid "error" msgstr "errore" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "testo standard" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "testo standard." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Attenzione: questa azione toglierà il testo nascosto attualmente " "selezionato. Vuoi procedere?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Schermo precedente..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Non mostrare alcun testo prima dell'inizio dell'attività" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Mostra il testo completo dell'esercizio" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Mostra questo testo:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Tempo max:" #: edit_text_act_edit_target msgid "Target..." msgstr "Testo nascosto..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Mostra il pulsante di correzione" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Pulsante di testo:" #: edit_text_act_checkCase msgid "Match case" msgstr "Considera maiuscole/minuscole" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Considera accenti e caratteri speciali" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Considera la punteggiatura" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Permetti spazi ripetuti" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Criteri" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Passa alla nuova parola nascosta una volta completato il riempimento" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Passa alla nuova parola solo dopo risposta corretta" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Indica gli errori lettera per lettera" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Parametri dell'algoritmo d'analisi:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Passi:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Campo d'esplorazione:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Controllo" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Analisi della risposta" #: edit_text_act_check_bt msgid "Correction..." msgstr "Correzione..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Pulsante di correzione" #: edit_text_act_checkProgress msgid "Progress" msgstr "Avanzamento" #: edit_text_act_typeBtn msgid "Type..." msgstr "Tipo..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ordina i paragrafi" #: edit_text_act_orderWords msgid "Order words" msgstr "Ordina le parole" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Sparpaglia le parole nel paragrafo" #: edit_text_act_type_title msgid "Activity type" msgstr "Tipo di attività" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Questa azione cancellerà tutte le parole nascoste esistenti. Vuoi procedere?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identifica le parole" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identifica i caratteri" #: edit_media_change_name msgid "Change name..." msgstr "Cambia il nome..." #: edit_media_change_file msgid "Change file..." msgstr "Cambia il file..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Salva in un file ZIP" #: edit_media_type msgid "Media type:" msgstr "Tipo di file multimediale:" #: edit_media_size msgid "File size:" msgstr "Grandezza del file:" #: edit_media_show_type msgid "Files of type:" msgstr "Archivi di tipo:" #: edit_media_preview msgid "Preview media" msgstr "Anteprima del file multimediale" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Anteprima della risorsa multimediale" #: edit_media_rename msgid "Change resource name" msgstr "Cambia il nome di risorsa" #: edit_media_rename_title msgid "Rename" msgstr "Rinomina" #: edit_media_rename_prompt msgid "New name:" msgstr "Nuovo nome:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Nome di risorsa non valido!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "C'è un'altra risorsa con questo nome! Ogni risorsa deve avere un nome unico." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "File non valido!" #: err_media_chfile_different msgid "File must be of same type" msgstr "Il file deve essere dello stesso tipo" #: edit_media_font_error msgid "Unable to load font!" msgstr "Impossibile caricare il font!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Salva il file (estrai da ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Aggiorna da file il contenuto multimediale" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Questo non è un file \"reale\", ma un oggetto collocato in un contenitore " "ZIP. Per usare questa funzione, un file con lo stesso nome deve essere " "presente nella cartella dove si trova il file ZIP." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Attività" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Sequenze" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Libreria multimediale" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Gestisci immagini e altri file multimediali usati nel progetto" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Crea e modifica le attività del progetto" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Modifica e crea sequenze di attività" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Titolo:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Titolo di progetto" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Progetto" #: edit_project_tooltip msgid "Edit project properties" msgstr "Modifica le proprietà del progetto" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Descrizione:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Descrizione generale del progetto" #: edit_project_area msgid "Areas:" msgstr "Aree:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Aree curricolari del progetto" #: edit_project_level msgid "Levels:" msgstr "Livelli:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Livelli educativi del progetto" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descrittori:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descrittori del progetto (separati da virgola)" #: edit_project_languages msgid "Languages:" msgstr "Lingue:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Lingue usate nel progetto" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Cambia la lingua selezionata" #: edit_project_languages_add msgid "Add language" msgstr "Aggiungi una lingua" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Codici di lingua ISO-639:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autori:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Persone coinvolte nel progetto" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nome:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_author_rol msgid "Rol:" msgstr "Ruolo:" #: edit_project_author_organization msgid "Organization:" msgstr "Organizzazione:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Commenti:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nome dell'autore (richiesto)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "E-mail dell'autore (opzionale)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Ruolo della persona nel progetto: autore, collaboratore, disegni, suoni... " "(opzionale)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Scuola, università, associazione... (opzionale)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Pagina web personale (opzionale)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Campo per altre informazioni (opzionale)" #: edit_project_author_info msgid "Author info:" msgstr "Informazioni sull'autore:" #: edit_project_author_add msgid "Add author to list" msgstr "Aggiungi un autore alla lista" #: edit_project_author_edit msgid "Edit author info" msgstr "Modifica le informazioni sull'autore" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nome:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nome della scuola" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Indirizzo e-mail della scuola" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Sito web della scuola" #: edit_project_org_address msgid "Address:" msgstr "Indirizzo:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Indirizzo snail-mail" #: edit_project_org_pc msgid "PC:" msgstr "c.p.:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Codice postale" #: edit_project_org_city msgid "City:" msgstr "Città:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Città della scuola" #: edit_project_org_country msgid "Country:" msgstr "Nazione:" #: edit_project_org_state msgid "State:" msgstr "Stato:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Commenti:" #: edit_project_org msgid "School/s:" msgstr "Scuola/e:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Scuola o altra istituzione coinvolta nel progetto" #: edit_project_org_info msgid "Organization info:" msgstr "Info sull'organizzazione:" #: edit_project_org_add msgid "Add organization" msgstr "Aggiungi organizzazione" #: edit_project_org_edit msgid "Edit organization data" msgstr "Modifica i dati dell'organizzazione" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Stato, federazione, unione..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Stato federale, comunità, regione..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Altre informazioni..." #: edit_project_rev_date msgid "Date:" msgstr "Data:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Data della revisione" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autori:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autori della revisione" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Descrizione:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Breve descrizione dei cambiamenti apportati" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Commenti:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Altre informazioni rilevanti" #: edit_project_rev msgid "Revisions:" msgstr "Revisioni:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Storia della principali modifiche al progetto" #: edit_project_rev_add msgid "Add revision record" msgstr "Aggiungi una registrazione di revisione" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Modifica una registrazione di revisione" #: edit_project_rev_info msgid "Revision data" msgstr "Data di revisione" #: edit_media_objects msgid "objects" msgstr "oggetti" #: edit_media_object msgid "object" msgstr "oggetto" #: edit_evsounds_start msgid "Start of activity:" msgstr "Inizio dell'attività:" #: edit_evsounds_click msgid "Click on object:" msgstr "Clicca sull'oggetto" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Azione erronea:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Azione corretta:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Attività completata con errori:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Attività completata in modo esatto:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Errore: Il campo di descrizione non può essere lasciato vuoto!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Modifica i suoni dell'evento" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Suoni dell'evento:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Imposta suoni specifici per ciascun evento JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Suoni dell'evento:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Imposta suoni specifici per ciascun evento JClic" #: edit_evsounds_default msgid "default sound" msgstr "suono predefinito" #: edit_evsounds_disabled msgid "disabled" msgstr "disabilitato" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Abilita o disabilita i suoni per questo evento" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Clicca per selezionare un suono per questo evento, o deseleziona per usare " "il suono predefinito" #: action_newProject_caption msgid "New project..." msgstr "Nuovo progetto..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Crea un nuovo progetto JClic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Da:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Valore minimo dell'operatore" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "A:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Valore massimo dell'operatore" #: edit_arith_op_with msgid "With:" msgstr "Con:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Se selezionato, l'operatore può anche avere questo valore" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Uno da questa lista:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Lista dei possibili valori per l'operatore" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Decimali:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Numero di decimali dell'operando" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (integer)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "Primo operando" #: edit_arith_secondOp msgid "Second operand" msgstr "Secondo operando" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 per JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operazioni:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Seleziona il tipo di operazioni da sviluppare" #: edit_arith_operations_plus msgid "Plus" msgstr "Addizione" #: edit_arith_operations_minus msgid "Minus" msgstr "Sottrazione" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Moltiplicazione" #: edit_arith_operations_divide msgid "Divide" msgstr "Divisione" #: edit_arith_unknown msgid "Unknown:" msgstr "Incognita:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Seleziona l'elemento che agirà da incognita" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "Il risultato è l'incognita" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "Il secondo operatore è l'incognita" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "Il primo operatore è l'incognita" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "L'operazione è l'incognita" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Scrivi il risultato all'inizio dell'espressione" #: edit_arith_result msgid "Result:" msgstr "Risultato:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Non riportare" #: edit_arith_result_random msgid "Random" msgstr "Casuale" #: edit_arith_result_asc msgid "Ascending" msgstr "Crescente" #: edit_arith_result_order msgid "Order by result:" msgstr "Ordina per risultato:" #: edit_arith_result_desc msgid "Descending" msgstr "Decrescente" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Evita duplicati" #: edit_arith_cond msgid "Conditions:" msgstr "Condizioni:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indifferente" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "Il primo operatore deve essere più grande del secondo" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "Il primo operatore deve essere minore del secondo" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Altre condizioni" #: edit_autocp msgid "Automatic content generator:" msgstr "Generatore automatico di contenuti:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" "Seleziona il tipo di generatore automatico di contenuti per questa attività." #: edit_autocp_block msgid "Content generator" msgstr "Generatore di contenuti" #: edit_autocp_btn msgid "Settings..." msgstr "Parametri..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Configura i parametri del generatore di contenuti" #: edit_data msgid "Edit data" msgstr "Modifica i dati" #: edit_act msgid "Activity edit" msgstr "Modifica l'attività" #: edit_acp msgid "Content provider edit" msgstr "Modifica il generatore di contenuti" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Errore di creazione del generatore automatico di contenuti!" #: edit_project_author_group msgid "Creation" msgstr "Creazione" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Descrizione" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interfaccia utente" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Descrizione:" #: m_Edit msgid "Edit" msgstr "Modifica" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Nuova attività..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Inserisci" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Visualizza" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Progetto" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Modifica i parametri del progetto" #: action_editMedia_caption msgid "Media" msgstr "Mediateca" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Modifica la biblioteca multimediale del progetto" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Attività" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Modifica le attività" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Sequenze" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Modifica le sequenze delle attività" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "Il progetto corrente è stato modificato. Vuoi salvare i cambiamenti?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descrittori" #: edit_media_new msgid "New media object..." msgstr "Nuovo oggetto multimediale..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "" "Aggiungi una nuova immagine o un nuovo oggetto multimediale alla biblioteca" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Limite di punteggio:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Segui questo percorso quando il punteggio globale è uguale o superiore a..." #: edit_seq_time msgid "Time threshold:" msgstr "Limite di tempo:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Per seguire questo percorso, devi aver completato l'attività in un tempo " "inferiore a..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Segui questo percorso quando il punteggio globale è inferiore a..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Segui questo percorso quando il tempo impiegato nell'attività è superiore " "a..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Salti condizionali" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "Imposta salti speciali da eseguire solo con specifiche condizioni" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Imposta condizioni per il salto a un livello superiore" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Salto a livello inferiore:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Salto a livello superiore:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Imposta le condizioni per saltare a un livello inferiore" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Azione assegnata al pulsante \"successivo\"" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Azione assegnata al pulsante \"precedente\"" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Imposta la destinazione del salto" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Azione da fare" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Attività assegnata a questo elemento di sequenza" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Tag usato per riferirsi a questo elemento di sequenza (campo opzionale)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Descrizione dell'elemento di sequenza (campo opzionale)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Abilita o disabilita il pulsante freccia" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Avanza automaticamente al termine dell'attività" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Secondi di attesa prima dell'avanzamento automatico" #: edit_color_dlgTitle msgid "Select color" msgstr "Seleziona il colore" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Per favore aspetta mentre la risorsa viene rinominata..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Larghezza:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Larghezza della cella (in pixels)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Altezza:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Altezza della cella (in pixels)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Parole nascoste:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Lista delle parole nascoste inserite nel pannello" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Usa il pannello B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "I contenuti del secondo pannello saranno mostrati una volta trovate le parole" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Seleziona il tipo di generatore di forme da usare nel pannello" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Numero di colonne del pannello" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Numero di righe del pannello" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Separatori trasparenti" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Mostra i separatori (caselle nere) come spazi trasparenti" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Mescola\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Numero di mescolamenti" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Copia le caratteristiche in..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Caratteristiche" #: edit_act_copy_dest msgid "Apply to:" msgstr "Applica a:" #: edit_act_copy_style_main msgid "Main window" msgstr "Finestra principale" #: edit_act_copy_style_play msgid "Play window" msgstr "Finestra di gioco" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Attività da modificare:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Copia le caratteristiche" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Copia le caratteristiche dell'attività corrente in altre attività" #: edit_new_project_name msgid "Project name:" msgstr "Nome del progetto:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Breve nome descrittivo del progetto" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nome file:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nome del file del progetto, senza estensione" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Cartella:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nome della cartella dove il progetto sarà conservato" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Sfoglia..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Crea un nuovo progetto JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "Errore: Progetto, file e cartella devono avere nomi validi." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Questa cartella già contiene un altro progetto Clic 3.0 o JClic. Per evitare " "confusione, è preferibile tenere ogni progetto in una cartella separata, ma " "non è strettamente necessario. Vuoi realmente creare il nuovo progetto in " "questa cartella?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Errore: Impossibile creare la cartella specificata!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Errore: Nessuna attività selezionata! Per usare questa funzione devi " "selezionare nella lista una o più attività alle quali vanno applicate le " "caratteristiche indicate." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Copia delle caratteristiche in:" #: edit_act_copy_margin msgid "Margin" msgstr "Margine" #: edit_act_copy_bgColor msgid "Background color" msgstr "Colore di sfondo" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Sfumatura" #: edit_act_copy_bgImage msgid "Background image" msgstr "Immagine di sfondo" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Bordo" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Sfondo trasparente" #: edit_act_copy_position msgid "Position" msgstr "Posizione" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Messaggi" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Stile del messaggio iniziale" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Stile del messaggio finale" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Stile del messaggio di errore" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Rapporti" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Includi l'attività nei rapporti" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Registra azioni" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interfaccia utente" #: edit_act_copy_skin msgid "Skin" msgstr "Skin" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Suoni dell'evento" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Contatori" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Cronometro" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Tempo max." #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Contatore dei tentativi" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Tentativi max." #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Punteggio" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Numero di mescolamenti" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Pulsanti" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Pulsante di aiuto" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Pulsante informativo" #: edit_act_copy_grids msgid "Grids" msgstr "Griglie" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Stile della griglia A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Stile della griglia B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Stile delle griglie di testo" #: edit_act_copy_text msgid "Text activities" msgstr "Attività testuali" #: edit_act_copy_fontFace msgid "Font face" msgstr "Tipo di carattere" #: edit_act_copy_fontSize msgid "Font size" msgstr "Dimensione del carattere" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Stile del carattere" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Colore del testo principale" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Colore del testo nascosto" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Colore degli errori" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Spazio tra i tabulatori" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Stile del messaggio precedente" #: edit_act_changeType msgid "Change activity type" msgstr "Cambia il tipo di attività" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Nome completo della classe da usare per costruire l'attività (solo per " "utenti esperti!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Altro..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Gli utenti esperti possono anche creare tipi non registrati di attività " "JClic. Basta scrivere sotto il nome della classe, con il prefisso indicante " "il pacchetto (es. \"com.acme.activities.FooActivity\"). Le classi di " "attività devono estendere edu.xtec.jclic.Activity, e devono essere " "accessibili al caricatore di classi virtuali di Java." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nome dell'attività:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Ciascuna attività deve avere un nome unico nel progetto" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Attenzione: " "Il cambiamento del tipo di attività può causare la perdita di alcune " "caratteristiche e di alcuni oggetti dell'attività corrente. Usa questa " "funzione con attenzione!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Ubicazione del codice JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" "URL che punta a una cartella con i file di programma e gli scripts di JClic" #: applet_prev_text msgid "HTML code before:" msgstr "Codice HTML precedente:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Il testo o il codice HTML che apparirà prima dell'applet" #: applet_post_text msgid "HTML code after:" msgstr "Codice HTML successivo:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Il testo o il codice HTML che apparirà dopo l'applet" #: applet_size msgid "Applet size:" msgstr "Dimensioni dell'applet:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Larghezza e altezza dell'applet, in valori assoluti o percentuali." #: applet_page_title msgid "Page title:" msgstr "Titolo della pagina:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "" "Testo da mostrare nella parte superiore della finestra di navigazione" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "La pagina web \"%s\" è stata creata con successo." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Vuoi aprirla adesso con il navigatore?" #: action_createHTML_caption msgid "Create web page..." msgstr "Crea la pagina web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Creazione di una pagina HTML con l'applet JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "Crea una pagina HTML con l'applet contenente il progetto corrente" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nome file:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nome del file HTML fa creare" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Valori predefiniti usati nella creazione della pagina web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Colore di sfondo:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Colore di sfondo della pagina HTML" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Centrato" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Inserisci l'applet centrandolo orizzontalmente" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Larghezza dell'applet (assoluta o in percentuale)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Altezza dell'applet (assoluta o in percentuale)" #: applet_exitUrl msgid "On exit, go to:" msgstr "In uscita, vai a:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL dove ridirigere la navigazione all'uscita da JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Nome della schermata informativa:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Nome della schermata usata per mostrare i contenuti relativi al pulsante " "\"informazioni\"" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Crea l'installatore del progetto..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Crea uno script di installazione di progetto per il lettore JClic" #: installer_caption msgid "Edit project installer script" msgstr "Modifica lo script di installazione di progetto" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Titolo:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Titolo del progetto, da mostrare nell'assistente dell'installazione" #: installer_authors msgid "Autors:" msgstr "Autori:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autore/i del progetto (testo breve)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Cartella:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "" "Nome della cartella che sarà suggerita dall'assistente di installazione" #: installer_files msgid "Files to be copied:" msgstr "I file da copiare:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "I file da copiare nell'installazione" #: installer_files_available msgid "Available files" msgstr "File disponibili" #: installer_files_selected msgid "Selected files" msgstr "File selezionati" #: installer_files_add msgid ">> add >>" msgstr ">> aggiungi >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Aggiungi il file selezionato alla lista" #: installer_files_remove msgid "<< remove <<" msgstr "<< rimuovi <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Rimuovi il file selezionato dalla lista" #: installer_button msgid "Launch button" msgstr "Pulsante di attivazione" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Proprietà del pulsante da mostrare nella biblioteca dei progetti" #: installer_button_project msgid "Main project:" msgstr "Progetto principale:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Progetto JClic associato al pulsante" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Etichetta:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Breve etichetta di testo, da mostrare all'interno del pulsante" #: installer_button_icon msgid "Icon:" msgstr "Icona:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Immagine da usare come icona del pulsante. Lascia vuoto per usare l'icona " "predefinita di JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Descrizione" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Testo di aiuto mostrato con il pulsante" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Errore: Devi indicare il titolo del progetto" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Errore: Devi indicare in quale cartella vuoi installare il progetto" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Errore: Devi selezionare un file" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Errore: Devi indicare il testo del pulsante di attivazione" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Errore: Il progetto assegnato al pulsante di attivazione non è nella lista " "dei file da copiare" #: applet_page_full msgid "Full-page applet" msgstr "Applet a tutto schermo" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "Applet con dimensioni specifiche" #: edit_text_align_left msgid "Align text left" msgstr "Allinea il testo a sinistra" #: edit_text_align_center msgid "Center text" msgstr "Centra il testo" #: edit_text_align_right msgid "Align text right" msgstr "Allinea il testo a destra" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Crea o rimuovi un testo nascosto" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Inserisci una cella" #: edit_text_act_content msgid "Content" msgstr "Contenuto" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Stile" #: edit_cell_size msgid "Cell size:" msgstr "Dimensione della cella:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Le seguenti attività non appariranno in alcuna delle sequenze di attività, " "quindi non saranno mostrate:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "I seguenti oggetti multimediali non risultano usati in alcuna attività:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "Vuoi aggiungerli alla fine dell'ultima sequenza di attività?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Vuoi rimuoverli?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Rimozione di oggetti multimediali non usati" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Attività orfane" #: edit_media_refreshAll msgid "Update all media content" msgstr "Aggiorna tutti i contenuti multimediali" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Aggiorna tutti i contenuti multimediali richiamando i loro archivi" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Aggiornamento dei contenuti multimediali..." #: edit_media_exportAll msgid "Export all media" msgstr "Esportazione di tutti i contenuti multimediali" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Salva i file dei contenuti di tutti gli elementi multimediali" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Seleziona" #: edit_shape_addPoint msgid "Add point" msgstr "Aggiungi un punto" #: edit_shape_deletePoint msgid "Delete" msgstr "Elimina" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Disegna un rettangolo" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Disegna un'ellisse" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Disegna un poligono" #: edit_shape_toLine msgid "Convert to line" msgstr "Converti in linea" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Converti in curva di Bézier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Converti in quadratica" #: edit_shape_rLeft msgid "Rotate left" msgstr "Ruota a sinistra" #: edit_shape_rRight msgid "Rotate right" msgstr "Ruota a destra" #: edit_shape_expand msgid "Expand" msgstr "Espandi" #: edit_shape_contract msgid "Contract" msgstr "Contrai" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Zoom avanti" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Zoom indietro" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Unisci punti vicini" #: edit_shape_showPoints msgid "Show points" msgstr "Mostra punti" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Mostra/Nascondi i punti" #: edit_shape_gridSize msgid "Grid size:" msgstr "Dimensione della griglia:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Mostra / Nascondi la griglia" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Raggio del magnete:" #: edit_shape_elements msgid "Defined elements" msgstr "Elementi definiti" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Nome dell'elemento selezionato" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Raggio di azione del magnete (se abilitato)" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Dimenzioni della griglia" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Attività:" #: edit_mc_sequence msgid "Sequence:" msgstr "Sequenza:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Progetto:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Scegli l'attività" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Scegli la sequenza" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Dati insufficienti!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Colore delle frecce:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Colore usato dall'editor per disegnare le frecce (non esattamente, dato che " "viene utilizzata una maschera di bit XOR)" #: edit_act_editActivity msgid "Edit..." msgstr "Modifica..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Modifica l'attività selezionata" #: action_saveFileAs_caption msgid "Save as..." msgstr "Salva come..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Salva il progetto corrente con un nome differente" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Comportamento" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Comportamento" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Trascina gli oggetti" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Trascina gli oggetti invece di unirli con una linea" #: edit_act_behavior_order msgid "Check solving order" msgstr "Controlla l'ordine di soluzione" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Le celle devono essere risolte in ordine" #: edit_act_scramble msgid "Scramble" msgstr "Mescola" #: action_importActivities_caption msgid "Import activities..." msgstr "Importa attività..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importa attività da un altro progetto" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "Il file selezionato fa parte del progetto corrente. Possono essere importate " "attività solo tra progetti differenti. Per favore seleziona un altro file di " "progetto." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "Seleziona una o più attività da importare nel progetto corrente\\:" #: import_importing msgid "Importing..." msgstr "Importazione..." #: import_checkdep msgid "Checking dependencies..." msgstr "Verifica delle dipendenze..." #: import_impmedia msgid "Importing media\\:" msgstr "Importazione degli oggetti multimediali\\:" #: import_impact msgid "Importing activity\\:" msgstr "Importazione delle attività\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Seleziona il progetto JClic dal quale saranno importate le attività" #: edit_tagRep_tags msgid "Tag marks" msgstr "Marcatori" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Marcatore d'inizio\\:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Marcatore usato all'inizio dei tag" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Marcatore finale\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Marcatore usato alla fine dei tag" #: edit_tagRep_file msgid "File" msgstr "File" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "File o URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Nome o URL del file contenente i valori che sostituiranno le etichette" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Set di caratteri\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Set di caratteri usati nel file" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Sfoglia..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Sfoglia il sistema degli archivi" #: edit_tagRep_title msgid "Tag replacing" msgstr "Sostituzione dei tag" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Rimuovi gli stili di testo..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Attenzione\\: Questa azione rimuoverà gli specifici attributi di testo " "applicati al documento, ritornando allo stile principale. Questa azione non " "può essere annullata. Vuoi procedere?" #: img_max_size msgid "Maximum size of images:" msgstr "Dimensione massima delle immagini:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "" "Larghezza massima delle immagini importate nella libreria multimediale." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "" "Altezza massima delle immagini importate nella libreria multimediale." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "L'immagine \"%s\" ha una dimensione di %s pixel. Supera perciò il massimo " "consentito da JClic Author (%s). Vuoi ridimensionarla?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_nl.po000066400000000000000000002403431335566474600234360ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2010-01-16 15:15+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Beschrijving" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Naam van de activiteit" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Naam:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Beschrijving van de activiteit" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Rapporten" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Voeg deze activiteit toe aan de rapporten" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "" "Voeg de resultaten van deze activiteit toe aan de gebruikersrapporten" #: edit_act_code msgid "Code:" msgstr "Code:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "Optionele code om te groeperen en te zoeken in de rapporten database" #: edit_act_reportActions msgid "Report user actions" msgstr "Rapporteer acties van gebruikers" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Registreer de details van alle acties van de gebruikers" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Tellers" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Tijdsteller" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Toon/verberg de tijdsteller" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Aantal pogingen teller" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Toon/verberg de aantal pogingen teller" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Puntenteller" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Toon/verberg de puntenteller" #: edit_act_maxTime msgid "Max time:" msgstr "Max tijd:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Max tijd om de activiteit op te lossen, in seconden, of 0 zonder " "tijdsbeperking." #: edit_act_countdown msgid "Countdown" msgstr "Aftellen" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "De teller start met de maximumwaarde, en vermindert tot 0" #: edit_act_maxActions msgid "Max tries:" msgstr "Max pogingen:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Maximum aantal pogingen, of 0 voor onbeperkt" #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Knoppen" #: edit_act_helpBtn msgid "Help" msgstr "Help" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Toon/verberg help knop" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Toon oplossing" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Toon dit bericht:" #: edit_act_infoBtn msgid "Information" msgstr "Informatie" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Toon/verberg informatie knop" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Toon deze URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Voer dit commando uit:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Adres van de website die getoond moet worden als de info knop gedrukt wordt" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Commando dat uitgevoerd wordt als de info knop gedrukt wordt" #: edit_act_mainWindow msgid "Main window:" msgstr "Hoofd venster:" #: edit_act_gameWindow msgid "Game window:" msgstr "Spel venster:" #: edit_act_margin msgid "Margin:" msgstr "Marge:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Horizontale en verticale afstand tussen visuele objecten" #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Achtergrondkleur:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Verander de achtergrondkleur." #: edit_gradient_startColor msgid "Start color:" msgstr "Begin kleur:" #: edit_gradient_endColor msgid "End color:" msgstr "Eind kleur:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Selectie van de start kleur" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Selectie van de eind kleur" #: edit_gradient_cycles msgid "Cycles:" msgstr "Cycles:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Aantal herhalingen van de gradiënt over het tekenoppervlak" #: edit_gradient_orientation msgid "Orientation:" msgstr "Oriëntatie:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Oriëntatie van de gradiënt , gemeten in graden over de horizon" #: edit_act_gradient msgid "Gradient:" msgstr "Gradiënt:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Gebruik gradiënt van kleuren" #: edit_color_opacity msgid "Opacity" msgstr "Doorzichtigheid" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Zet de alpha channel (doorzichtigheid) kleur waarde." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Gradiënt" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Gebruik de standaardwaarden (geen gadient)" #: edit_act_image msgid "Image:" msgstr "Afbeelding:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Beschrijving" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Naam en beschrijving" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Getegeld" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Teken heel het oppervlak met een afbeelding, herhaal over de X en Y as " "indien nodig." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Voorbeeld:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Rand" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Teken een lijn rond het venster" #: edit_act_transparent msgid "Transparent" msgstr "Transparant" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "Venster heeft een transparante achtergrond" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Breedte:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Hoogte:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Breedte van een object, gemeten in pixels" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Hoogte van een object, gemeten in pixels" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Gecentreerd" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "Het object zal gecentreerd worden over het hoofdvenster" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Absolute horizontale positie" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Absolute verticale positie" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Gebruikers interface" #: edit_act_image_tooltip msgid "Select an image" msgstr "Kies een afbeelding" #: edit_act_text msgid "Text:" msgstr "Tekst:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Tekst die binnen dit object getoond moet worden" #: edit_font_face msgid "Typeface:" msgstr "Lettertype" #: edit_font_size msgid "Size:" msgstr "Grootte:" #: edit_font_bold msgid "Bold" msgstr "Vet" #: edit_font_italic msgid "Italic" msgstr "Schuin" #: edit_font_underline msgid "Underline" msgstr "Onderstreept" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Stijl:" #: edit_cell_title msgid "Cell contents" msgstr "Cel inhoud" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Berichten" #: edit_act_msg_initial msgid "Initial message:" msgstr "Eerste bericht" #: edit_act_msg_final msgid "Final message:" msgstr "Laatste bericht" #: edit_act_msg_prev msgid "Previous message:" msgstr "Vorig bericht" #: edit_act_msg_error msgid "Error message:" msgstr "Fout bericht:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Bericht dat getoond wordt als de activiteit begint" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Bericht dat getoond wordt als de activiteit eindigt" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Bericht dat getoond wordt als de activiteit eindigt met fouten" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Bericht dat getoond wordt als de activiteit voor de start van een activiteit " "(alleen bij sommige activiteiten)" #: edit_align msgid "Align:" msgstr "Uitlijning:" #: edit_act_textColor msgid "Text color:" msgstr "Tekstkleur:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Kleur van de tekst" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Schaduwkleur:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Kleur van de schaduw van de tekst, indien toepasbaar" #: edit_act_shadow msgid "Shadow" msgstr "Schaduw" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Teken tekst met schaduw" #: edit_act_borderColor msgid "Border color:" msgstr "Randkleur:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Kleur van de rand van de cel" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Kleur indien inactief:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Kleur als cel uitgeschakeld is" #: edit_act_altColor msgid "Alternative color:" msgstr "Alternatieve kleur:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "Kleur van alternatieve inhoud in opgeloste cellen." #: edit_cell_marked msgid "Marked" msgstr "Gemarkeerd" #: edit_cell_disabled msgid "Disabled" msgstr "Uitgeschakeld" #: edit_cell_alt msgid "Alternative" msgstr "Alternatief" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Interne marge:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Hoeveelheid ruimte tussen rand van de cel en de tekst." #: edit_cell_borderWidth msgid "Border width:" msgstr "Randbreedte:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Breedte van de standaard rand" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Breedte gemarkeerd:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "Breedte van de rand als de cel gemarkeerd is of geselecteerd" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Voorbeeld in \"alternatieve\" toestand" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Voorbeeld in \"niet toegestaan\" toestand" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Voorbeeld in \"gemarkeerde\" toestand" #: edit_act_testAction msgid "Preview activity" msgstr "Voorbeeld activiteit" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Voorbeeld en test activiteit" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Beschrijving" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Titel en beschrijving van de activiteit" #: edit_act_panels_options msgid "Options" msgstr "Opties" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opties van de activiteit" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Venster" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Verhouding, grootte en positie van het activiteit venster" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Berichten" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Inhoud van de activiteit berichten" #: edit_act_panels_panel msgid "Panel" msgstr "Paneel" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Inhoud van het paneel" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Stijl" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Kleur, lettertype en grootte van de cel" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Stijl:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Vermijd tekst afbeelding overlapt" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Probeer te vermijden dat tekst afbeelding overlapt" #: edit_media_exists_1 msgid "The file" msgstr "Het bestand" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "Bestaat reeds in media bibliotheek!" #: edit_act_shaper msgid "Shaper:" msgstr "Vormgereedschap" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Fout vormgereedschap:" #: edit_act_num_cols msgid "Columns:" msgstr "Kolommen:" #: edit_act_num_rows msgid "Rows:" msgstr "Rijen:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Tand hoogte:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Tand breedte:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Willekeurige verdeling" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Vormgereedschap eigenschappen" #: edit_act_panels_text msgid "Text" msgstr "Tekst" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Tekst van de activiteit" #: action_saveFile_caption msgid "Save..." msgstr "Opslaan..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "OO" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Bewaar het huidige project" #: action_docTree_caption msgid "Document tree..." msgstr "Document boom" #: action_docTree_keys msgid "T*" msgstr "B*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Toon het document van het project als een boom" #: edit_docTree_title msgid "Document tree" msgstr "Document boom" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Gerefereerd door:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Waarschuwing:

Dit project " "verbindt met andere projecten.
Wil je de hyperlinks volgen en al de " "bijbehorende bestanden laden?

(Je klikt best op JA als je Clic 3.0 " "activititeiten importeert)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Type:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Onbekend" #: edit_mc_type_sound msgid "Play sound" msgstr "Geluid afspelen" #: edit_mc_type_video msgid "Play video" msgstr "Video afspelen" #: edit_mc_type_midi msgid "Play MIDI" msgstr "MIDI afspelen" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "CD audio afspelen" #: edit_mc_type_record msgid "Record sound" msgstr "Geluid opnemen" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Opgenomen geluid afspelen" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Ga naar activiteit" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Ga naar volgorde" #: edit_mc_type_run_external msgid "Run program" msgstr "Programma uitvoeren" #: edit_mc_type_url msgid "Show URL" msgstr "URL adres tonen" #: edit_mc_type_exit msgid "End" msgstr "Einde" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Vorige" #: edit_mc_level msgid "Priority level:" msgstr "Prioriteitsniveau:" #: edit_mc_file msgid "File:" msgstr "Bestand:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parameter:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Van:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Tot:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Max. lengte:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Opname band:" #: edit_mc_stretch msgid "Stretch size" msgstr "Uitrek grootte" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Locatie:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Van:" #: edit_mc_location_from_box msgid "Cell" msgstr "Cel" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Venster" #: edit_mc_location_from_frame msgid "Frame" msgstr "Kader" #: edit_mc_loop msgid "Loop playback" msgstr "Doorlopen weergeven" #: edit_mc_autostart msgid "Auto start" msgstr "Automatische start" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Vang muis" #: edit_mc_title msgid "Multimedia and active content" msgstr "Multimedia en actieve inhoud" #: edit_mc_label msgid "Active content:" msgstr "Actieve inhoud" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Multimedia object keuze" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Media bibliotheek" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Gecentreerd over cel" #: edit_mc_pos_window msgid "Centered over window" msgstr "Gecentreerd over venster" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Geef positie:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Verkeerde boomstructuur of gegevens!" #: edit_act_panels_controls msgid "Controls" msgstr "Besturingselementen" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opties voor knoppen en tellers" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Type:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Raster:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Relatieve positie van de rasters A en B" #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Omgekeerde resolutie" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "De activiteit is opgelost als alle elementen van \"B\" overeenkomen." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Toon alle pijlen" #: edit_act_alt msgid "Alternative content:" msgstr "Alternatieve inhoud:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "" "Inhoud die getoond wordt in opgeloste cellen en niet toegewezen cellen" #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Bewerk de alternatieve inhoud" #: edit_act_grid msgid "Grid" msgstr "Raster" #: edit_act_grid_A msgid "Grid A" msgstr "Raster A" #: edit_act_grid_B msgid "Grid B" msgstr "Raster B" #: edit_act_grid_layout msgid "Layout" msgstr "Lay-out" #: edit_act_grid_relationship msgid "Relationship" msgstr "Relatie" #: edit_seq_activity_header msgid "activity" msgstr "activiteit" #: edit_seq_tag_header msgid "tag" msgstr "trefwoord" #: edit_seq_jump_header msgid "jump to" msgstr "springen naar" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Activiteit:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Label:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Beschrijving:" #: edit_seq_auto msgid "Move on automatically" msgstr "Ga automatisch verder" #: edit_seq_delay msgid "Delay:" msgstr "Vertraging:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Ga vooruit" #: edit_seq_action_back msgid "Go bak" msgstr "Ga terug" #: edit_seq_action_jump msgid "Jump to..." msgstr "Spring naar..." #: edit_seq_action_stop msgid "Stop" msgstr "Stoppen" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Vorige" #: edit_seq_action_exit msgid "Exit JClic" msgstr "JClic verlaten" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Vooruit pijl:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Pijl terug:" #: edit_seq_action msgid "Action:" msgstr "Actie:" #: edit_seq_button_enabled msgid "Show button" msgstr "Toon knop" #: edit_seq_project msgid "JClic Project:" msgstr "JClic Project:" #: edit_act_absolute msgid "Absolute position" msgstr "Absolute positie" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "" "Het object zal geplaatst worden op de gespecificeerde X en Y coördinaten" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Locatie:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Nieuwe volgorde element..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Voeg een nieuw element toe aan de activiteiten" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Selecteer een activiteit voor de niewe volgorde element" #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "Kan geen nieuwe volgorde element maken zonder activiteit!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Dit project heeft geen activiteiten! Kan geen volgorde elementen maken in " "een leeg project." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Sprong doel:" #: edit_seq_jump_title msgid "Jump target" msgstr "Sprong doel" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Voeg een nieuwe activiteit toe aan het project" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Type activiteit:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Naam:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Selecteer het type activiteit en geef het een naam:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Je moet een activiteit type kiezen!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Je moet een naam geven voor de activiteit!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Kan de activiteit niet maken!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Java class name:" #: edit_text_act_format msgid "Format" msgstr "Formaat" #: edit_text_act_answer msgid "Answer" msgstr "Beantwoorden" #: edit_text_act_popup msgid "Pop up" msgstr "Pop up" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Beschikbare antwoorden:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Voeg een nieuw lijst element toe" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Bewerk het geselecteerde lijst element" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Verwijder het geselecteerde lijst element" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Omhoog" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Omlaag" #: edit_list_newValue msgid "New text:" msgstr "Nieuwe tekst:" #: edit_list_addElement msgid "Add new list element" msgstr "Voeg nieuw lijst element toe" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Verander geselecteerde tekst" #: edit_text_act_target msgid "Target" msgstr "Doel" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Max. lengte:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Maximum hoeveelheid letters in het antwoord." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Opvul letter" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Letter gebruikt als spatie" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Eerste lengte:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Aantal vul letters dat getoond wordt bij het begin van de activiteit." #: edit_text_act_iniText msgid "Initial text:" msgstr "Eerste tekst:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Getoonde tekst in het begin van de activiteit." #: edit_text_act_list msgid "Show a list of options:" msgstr "Toon lijst met opties" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "Toon lijst met opties waaruit de gebruiker een moet kiezen." #: edit_text_act_check_title msgid "Correction options" msgstr "Correctie opties" #: edit_text_act_popup_no msgid "No pop up" msgstr "Geen pop up" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Pop up automatisch" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Pop up met fouten" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Pop up met F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Type:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Pop up vertraging:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Max. tijd:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Alleen geluid" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "Je moet een deel tekst kiezen om een nieuw tekst doel te maken!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "Tekst doel kan geen paragraaf tekens of tab tekens bevatten." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Doelen kunnen niet genest zijn!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Doelen kunnen geen cellen bevatten!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Papier kleur:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Bewerk dokument stijl..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Hoofd stijl" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Tab ruimte:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Ruimte tussen tab markeringen:" #: edit_text_act_colors msgid "Colors:" msgstr "Kleuren:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Doel kleuren:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Fout kleuren:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Voorbeeld:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Standaardtekst" #: edit_text_act_styleSample_target msgid "target" msgstr "doel" #: edit_text_act_styleSample_error msgid "error" msgstr "Fout" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "standaard tekst" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "standaard tekst." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Waarschuwing: Deze bewerking zal alle geselecteerde doelen onderdrukken. Wil " "je verder gaan?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Vorig scherm..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Toon geen tekst voor de start van een activiteit" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Toon de volledige tekst van de oefening" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Toon deze tekst:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Max. tijd:" #: edit_text_act_edit_target msgid "Target..." msgstr "Doel..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Toon de verbeter knop" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Knop tekst" #: edit_text_act_checkCase msgid "Match case" msgstr "Exact dezelfde tekens" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Gebruik accenten en speciale letters" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Gebruik leestekens" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Laat meerdere spaties toe" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Criteria" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Ga naar het volgend doel als alles ingevuld is" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Ga alleen verder wanneer het juist is" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Geef vergissingen aan met een letter" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Analyse van algoritme parameters:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Stappen:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Exploration veld:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Controleren" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Antwoord analyse" #: edit_text_act_check_bt msgid "Correction..." msgstr "Verbetering..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Verbeter knop" #: edit_text_act_checkProgress msgid "Progress" msgstr "Voortgang" #: edit_text_act_typeBtn msgid "Type..." msgstr "Type..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Orden paragrafen" #: edit_text_act_orderWords msgid "Order words" msgstr "Orden woorden" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Haal woorden doorheen over paragrafen" #: edit_text_act_type_title msgid "Activity type" msgstr "Activiteit type" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Deze bewerking zal alle bestaande doelen leegmaken. Wil je verder gaan?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identificeer woorden" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identificeer letters" #: edit_media_change_name msgid "Change name..." msgstr "Verander naam..." #: edit_media_change_file msgid "Change file..." msgstr "Verander bestand..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Bewaar in ZIP bestand" #: edit_media_type msgid "Media type:" msgstr "Mediumtype:" #: edit_media_size msgid "File size:" msgstr "Bestandsgrootte:" #: edit_media_show_type msgid "Files of type:" msgstr "Bestanden van het type:" #: edit_media_preview msgid "Preview media" msgstr "Voorbeeld media" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Voorbeeld media bron" #: edit_media_rename msgid "Change resource name" msgstr "Verander naam van bron" #: edit_media_rename_title msgid "Rename" msgstr "Hernoemen" #: edit_media_rename_prompt msgid "New name:" msgstr "Nieuwe naam:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Ongeldige bron naam" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Er is een andere bron met deze naam! Elke bron moet een unieke naam hebben." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Verkeerd bestand!" #: err_media_chfile_different msgid "File must be of same type" msgstr "Bestand moet hetzelfde type hebben" #: edit_media_font_error msgid "Unable to load font!" msgstr "Onmogelijk om lettertype te laden!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Bewaar bestand (haal op uit ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Herlaad media inhoud van bestand" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Dit is geen \"echt\" bestand, maar een object geladen in een ZIP container. " "Om dit element te gebruiken, moet er een bestand met dezelfde naam aanwezig " "zijn in de map waar de ZIP file is." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Activiteiten" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Volgorden" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Media bibliotheek" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "" "Beheer afbeeldingen en andere media bestanden die in dit project gebruikt " "worden" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Maak en bewerk project activiteiten" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Maak en bewerk volgorde van activiteiten" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Titel:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Titel van project" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Project" #: edit_project_tooltip msgid "Edit project properties" msgstr "Bewerk project eigenschappen" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Beschrijving:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Algemene beschrijving van het project" #: edit_project_area msgid "Areas:" msgstr "Gebieden:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Curricular gebieden van het project" #: edit_project_level msgid "Levels:" msgstr "Niveau's:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Opleidingsniveau van het project" #: edit_project_descriptors msgid "Descriptors:" msgstr "Beschrijving:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Beschrijvingen van het programma (gescheiden door komma's)" #: edit_project_languages msgid "Languages:" msgstr "Talen:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "In het project gebruikte talen" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Verander de gekozen taal" #: edit_project_languages_add msgid "Add language" msgstr "Voeg taal toe" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "ISO-639 taal codes:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Auteurs:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Mensen die aan dit project hebben meegewerkt" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Naam:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_author_rol msgid "Rol:" msgstr "Rol:" #: edit_project_author_organization msgid "Organization:" msgstr "Organisatie:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Commentaar:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Auteur (vereist)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Auteur e-mail (optioneel)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Rol van de persoon in the project: auteur, medewerker, tekeningen, " "geluiden... (optioneel)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "School, universiteit, vereniging... (optioneel)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Persoonlijke web pagina (optioneel)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Veld voor andere informatie (optioneel)" #: edit_project_author_info msgid "Author info:" msgstr "Auteur info:" #: edit_project_author_add msgid "Add author to list" msgstr "Auteur toevoegen aan lijst" #: edit_project_author_edit msgid "Edit author info" msgstr "Auteur info bewerken" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Naam:" #: edit_project_org_name_tooltip msgid "School name" msgstr "School naam" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "e-mail addres van de school" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "School website" #: edit_project_org_address msgid "Address:" msgstr "Adres:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Snail-mail address" #: edit_project_org_pc msgid "PC:" msgstr "PC:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Post code" #: edit_project_org_city msgid "City:" msgstr "Stad:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Stad" #: edit_project_org_country msgid "Country:" msgstr "Land:" #: edit_project_org_state msgid "State:" msgstr "Provincie" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Commentaar:" #: edit_project_org msgid "School/s:" msgstr "Scho(o)l/en:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "School of andere instelling die bij het project betrokken zijn" #: edit_project_org_info msgid "Organization info:" msgstr "Informatie over de organisatie" #: edit_project_org_add msgid "Add organization" msgstr "Voeg organisatie toe" #: edit_project_org_edit msgid "Edit organization data" msgstr "Bewerk organisatie gegevens" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Land, federatie, unie" #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Federale staat, gemeenschap, regio" #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Andere informatie..." #: edit_project_rev_date msgid "Date:" msgstr "Datum:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Datum van de versie" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Auteurs:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Auteurs van de versie" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Omschrijving:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Korte omschrijving van de gemaakte veranderingen" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Commentaar:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Andere relevante informatie" #: edit_project_rev msgid "Revisions:" msgstr "Versies:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Geschiedenis van grote veranderingen aan het project" #: edit_project_rev_add msgid "Add revision record" msgstr "Voeg een versie beschrijving toe" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Bewerk versie beschrijving" #: edit_project_rev_info msgid "Revision data" msgstr "Versie gegevens" #: edit_media_objects msgid "objects" msgstr "objecten" #: edit_media_object msgid "object" msgstr "object" #: edit_evsounds_start msgid "Start of activity:" msgstr "Begin van de activiteit" #: edit_evsounds_click msgid "Click on object:" msgstr "Click op het object" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Verkeerde actie:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Juiste actie:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Activiteit beëindigd met fouten:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Activiteit beëindigd zonder fouten:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Fout: Het beschrijvingsveld kan niet leeg zijn!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Bewerk gebeurtenis geluiden" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Gebeurtenis geluiden:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Kies specifieke geluiden voor elke JClic gebeurtenis" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Gebeurtenis geluiden:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Kies specifieke geluiden voor elke JClic gebeurtenis" #: edit_evsounds_default msgid "default sound" msgstr "Standaard geluid" #: edit_evsounds_disabled msgid "disabled" msgstr "uitgeschakeld" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Inschakelen of uitschakelen van geluid voor deze gebeurtenis" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Klik om een geluid te kiezen voor deze gebeurtenis, of schakel uit om het " "standaard geluid te gebruiken" #: action_newProject_caption msgid "New project..." msgstr "Nieuw project..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Maak een nieuw JClic project" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Van:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Minimum waarde van de term" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Tot:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Maximum waarde van de term" #: edit_arith_op_with msgid "With:" msgstr "Door:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Indien aangekruist, kan de term ook deze waarde hebben" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Kies een uit de lijst:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Lijst van mogelijke waarden van de term" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Cijfers na de komma:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Aantal cijfers na de komma van de term" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (integer)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "Eerste term" #: edit_arith_secondOp msgid "Second operand" msgstr "Tweede term" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 for JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operaties:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Kies de soort operaties die mogelijk zijn" #: edit_arith_operations_plus msgid "Plus" msgstr "Plus" #: edit_arith_operations_minus msgid "Minus" msgstr "Min" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Vermenigvuldigen" #: edit_arith_operations_divide msgid "Divide" msgstr "Delen" #: edit_arith_unknown msgid "Unknown:" msgstr "Onbekend:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Kies de term die moet gezocht worden" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "Het resultaat is te zoeken" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "De tweede term is te zoeken" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "De eerste term is te zoeken" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "De bewerking is te zoeken" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Schrijf het resultaat bij het begin van de vergelijking" #: edit_arith_result msgid "Result:" msgstr "Resultaat:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Geen overdracht" #: edit_arith_result_random msgid "Random" msgstr "Willekeurig" #: edit_arith_result_asc msgid "Ascending" msgstr "Oplopend" #: edit_arith_result_order msgid "Order by result:" msgstr "Orden volgens resultaat:" #: edit_arith_result_desc msgid "Descending" msgstr "Aflopend" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Vermijd dubbels" #: edit_arith_cond msgid "Conditions:" msgstr "Omstandigheden:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Om het even" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "De eerste term moet groter zijn dan de tweede" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "De eerste term moet kleiner zijn dan de tweede" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Andere voorwaarden" #: edit_autocp msgid "Automatic content generator:" msgstr "Automatische inhoud genereren:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "Kies het type automatische inhoud genereren voor deze activiteit" #: edit_autocp_block msgid "Content generator" msgstr "Inhoud genereren" #: edit_autocp_btn msgid "Settings..." msgstr "Instellingen..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Geef de instellingen van de inhoud verstrekker" #: edit_data msgid "Edit data" msgstr "Bewerk gegevens" #: edit_act msgid "Activity edit" msgstr "Bewerk activiteit" #: edit_acp msgid "Content provider edit" msgstr "Bewerk de inhoud verstrekker" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Fout bij het aanmaken van de inhoud verstrekker" #: edit_project_author_group msgid "Creation" msgstr "Aanmaak" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Beschrijving" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Gebruikers interface" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Omschrijving:" #: m_Edit msgid "Edit" msgstr "Bewerk" #: m_Edit_Mnemonic msgid "E" msgstr "B" #: edit_media_preview_keys msgid "P*" msgstr "V" #: edit_act_newActivity msgid "New activity..." msgstr "Nieuwe ativiteit..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Invoegen" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Weergeven" #: m_View_Mnemonic msgid "V" msgstr "W" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Project" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Bewerk project instellingen" #: action_editMedia_caption msgid "Media" msgstr "Media" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Bewerk de multimedia bibliotheek van het project" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Activiteiten" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Bewerk de activiteiten" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Volgorden" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Bewerk de volgorde van activiteiten" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "Huidig project is veranderd. Wil je de veranderingen bewaren?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Beschrijvingen" #: edit_media_new msgid "New media object..." msgstr "Nieuw media object" #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "" "Voeg een nieuwe afbelding of multimedia object toe aan de bibliotheek" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Punten drempel:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Kies deze weg als het totaal aantal punten gelijk is aan of groter dan..." #: edit_seq_time msgid "Time threshold:" msgstr "Tijdsdrempel:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Om deze weg te kiezen, moet de tijd aan deze activiteiten besteed minder " "zijn dan..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Neem deze weg als het totaal aantal punten minder is dan..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Neem deze weg als de tijd aan deze activiteiten besteed meer is dan..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Voorwaardelijke sprongen" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Kies speciale sprongen die uitgevoerd moeten worden bij speciale voorwaarden" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Kies voorwaarden om naar een hoger niveau te gaan" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Lager niveau sprong:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Hoger niveau sprong:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Kies voorwaarden om naar een lager niveau te springen" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Toegewezen actie aan de \"Volgende\" knop" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Toegewezen actie aan de \"Voorgaande\" knop" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Kies het doel van de sprong" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Actie die moet gebeuren" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Toegekende activiteit bij dit volgorde element" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "Handvat als referentie bij dit volgorde element(optioneel veld)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Beschrijving van het volgorde element (optioneel veld)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Toestaan of verhinderen van de pijlknop" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Ga automatisch verder als de activiteit gedaan is" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Aantal seconden wachten voordat het automatisch verder gaat" #: edit_color_dlgTitle msgid "Select color" msgstr "Kleur kiezen" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Gelieve te wachten terwijl de bron hernoemd wordt..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Breedte:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Cel breedte (in pixels)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Hoogte:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Cel hoogte (in pixels)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Verborgen woorden" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Lijst met verborgen woorden in het paneel" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Gebruik paneel B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "De inhoud van het tweede paneel zal getoond worden als de woorden gevonden " "zijn" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Kies het vormgereedschap type dat gebruikt moet worden in het paneel" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Aantal kolommen van het paneel" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Aantal rijen van het paneel" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Doorzichtige randen" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Behandel de randen (zwarte rechthoeken) als doorzichtige gaten" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Door elkaar\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Aantal keren schudden" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Attributen kopiëren naar..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Attributen" #: edit_act_copy_dest msgid "Apply to:" msgstr "Gebruik bij:" #: edit_act_copy_style_main msgid "Main window" msgstr "Hoofd venster" #: edit_act_copy_style_play msgid "Play window" msgstr "Speel venster" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Te wijzigen activiteiten:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Attributen kopiëren" #: edit_act_copyAttributes_keys msgid "T" msgstr "N" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Huidige activiteit attributen kopiëren naar andere activiteiten" #: edit_new_project_name msgid "Project name:" msgstr "Project naam:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Korte, beschrijvende naam van het project" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Bestandsnaam:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Naam van het projectbestand, zonder extensie" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Map:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Naam van de folder waar het project opgeslagen wordt" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Bladeren..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Maak een nieuw JClic project" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Fout: Project, bestand en map moeten een geldige en niet lege naam hebben." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Deze map bevat een ander Clic 3.0 of JClic project. Om verwarring te " "vermijden, hou je best elk project in een aparte map. Het is echter niet " "absoluut nodig. Wil je dit nieuwe project echt in deze map bewaren?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Fout: Onmogelijk om de gespecificeerde map aan te maken." #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Fout: Geen activiteit gekozen! Om deze functie te gebruiken, moet je in de " "activiteitenlijst een of meerdere activiteiten kiezen waarop de attributen " "zullen worden toegepast." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Attributen kopiëren naar:" #: edit_act_copy_margin msgid "Margin" msgstr "Marge" #: edit_act_copy_bgColor msgid "Background color" msgstr "Achtergrondkleur" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Kleurovergang" #: edit_act_copy_bgImage msgid "Background image" msgstr "Achtergrondafbeelding" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Rand" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Transparante achtergrond" #: edit_act_copy_position msgid "Position" msgstr "Positie" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Berichten" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Stijl van het eerste bericht" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Stijl van het laatste bericht" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Stijl van de foutboodschap" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Rapporten" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Voeg deze activiteit toe aan rapporten" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Acties opnemen" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Gebruikers interface" #: edit_act_copy_skin msgid "Skin" msgstr "Skin" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Gebeurtenis geluiden" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Tellers" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Tijdsteller" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Max. tijd" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Aantal pogingen teller" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Max. pogingen" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Score teller" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Tijd tot schudden" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Knoppen" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Help knop" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Informatie knop" #: edit_act_copy_grids msgid "Grids" msgstr "Rasters" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Stijl van raster A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Stijl van raster B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Stijl van tekst rasters" #: edit_act_copy_text msgid "Text activities" msgstr "Tekst activiteiten" #: edit_act_copy_fontFace msgid "Font face" msgstr "Lettertype" #: edit_act_copy_fontSize msgid "Font size" msgstr "Grootte Lettertype" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Lettertypestijl" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Hoofd tekst kleur" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Kies het JClic project waaruit activiteiten overgenomen worden" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Fouten kleuren" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Tab space" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Stijl van vorig bericht" #: edit_act_changeType msgid "Change activity type" msgstr "Verander activiteiten type" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Volledige naam van de class die gebruikt wordt om de activiteit te " "bouwen(alleen gevorderde gebruikers!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Andere..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Gevorderde gebruikers kunnen ook ongeregistreerde types van JClic " "activiteiten maken. Schrijf hieronder de volledige classnaam, voorafgegaan " "door de pakketnaam ( zoals \"com.acme.activities.FooActivity\"). Activiteit " "classes must extend edu.xtec.jclic.Activity, and must be accessibles " "to the JVM classloader." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Activiteit naam" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Elke activiteit moet een unieke naam hebben in het project" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Waarschuwing: Het veranderen van het type van activiteit " "kan attributen en objecten verloren laten gaan. Voorzichtig " "gebruiken!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Plaats van JClic code:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "URL die wijst naar map met JClic programma bestand en scripts" #: applet_prev_text msgid "HTML code before:" msgstr "HTML code vooraf:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Tekst of HTML code die voor het applet getoond wordt" #: applet_post_text msgid "HTML code after:" msgstr "HTML code nadien:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Tekst of HTML code die na het applet getoond wordt" #: applet_size msgid "Applet size:" msgstr "Applet grootte:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Breedte en hoogte van het applet, in absolute of percent waarde." #: applet_page_title msgid "Page title:" msgstr "Paginatitel:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Tekst die getoond wordt bovenaan het browser venster" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "De web pagina \"%s\" werd met succes gemaakt." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Wil je dit nu openen met de browser?" #: action_createHTML_caption msgid "Create web page..." msgstr "Maak web pagina..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Maak een HTML pagina met een JClic applet" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "Maak een HTML pagina met een JClic applet van het huidige project" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Bestandsnaam:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Naam van het HTML bestand dat moet gemaakt worden" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "" "Standaard waarden die gebruikt worden bij het maken van een web pagina" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Achtergrondkleur:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "HTML pagina achtergrond kleur" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Gecentreerd" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Plaats het applet horizontaal gecentreerd" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Applet breedte (absoluut of percent)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Applet hoogte (absoluut of percent)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Bij exit, ga naar:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL waarheen de navigatie dient te wijzen als JClic stopt" #: applet_infoFrame msgid "Info frame name:" msgstr "Info frame naam:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Naam van het frame dat gebruikt wordt om de inhoud die hoort bij de \"info\" " "knop" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Maak project installeer bestand..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Maak project installeer script voor JClic speler" #: installer_caption msgid "Edit project installer script" msgstr "Bewerk project installeer script" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Title:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Project titel, die getoond wordt bij de installeer wizard" #: installer_authors msgid "Autors:" msgstr "Auteurs:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Auteur/s van het project (korte tekst)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Map:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Map naam die gessugereeerd wordt door de installeer wizard" #: installer_files msgid "Files to be copied:" msgstr "Te kopiëren bestanden:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Door het installeer bestand te kopiëren bestanden" #: installer_files_available msgid "Available files" msgstr "Beschikbare bestanden" #: installer_files_selected msgid "Selected files" msgstr "Gekozen bestanden" #: installer_files_add msgid ">> add >>" msgstr ">>toevoegen>>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Voog het geselecteerde bestand toe aan de lijst" #: installer_files_remove msgid "<< remove <<" msgstr "<\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Descrição" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nome da actividade" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nome:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Descrição da actividade" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Relatórios" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Incluir esta actividade nos relatórios" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Incluir os resultados desta actividade nos relatórios de utilizador" #: edit_act_code msgid "Code:" msgstr "Código:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Código opcional utilizado para agrupar e filtrar na base de dados de " "relatórios." #: edit_act_reportActions msgid "Report user actions" msgstr "Registar também as acções" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "" "Registar pormenores de todas as acções efectuadas pelos utilizadores." #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Contadores" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Contador de tempo" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Mostrar ou ocultar contador de tempo." #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Contador de tentativas" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Mostrar ou ocultar contador de tentativas." #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Contador de acertos" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Mostrar ou ocultar contador de acertos." #: edit_act_maxTime msgid "Max time:" msgstr "Tempo máximo:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Tempo máximo permitido para resolver a actividade, em segundos. O zero " "significa tempo ilimitado." #: edit_act_countdown msgid "Countdown" msgstr "Contagem regressiva" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "O contador inicia no valor máximo, decrescendo até zero." #: edit_act_maxActions msgid "Max tries:" msgstr "Tentativas máx.:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "Número máximo de tentativas permitidas, ou zero para ilimitado." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Botões" #: edit_act_helpBtn msgid "Help" msgstr "Ajuda" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Mostrar ou ocultar o botão de ajuda" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Mostrar a solução" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Mostrar esta mensagem:" #: edit_act_infoBtn msgid "Information" msgstr "Informação" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Mostrar ou ocultar o botão de informação" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Mostrar esta URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Executar o comando:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "Endereço web a mostrar ao clicar no botão de informação." #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Linha de comandos a executar ao clicar no botão de informação." #: edit_act_mainWindow msgid "Main window:" msgstr "Janela principal:" #: edit_act_gameWindow msgid "Game window:" msgstr "Janela de jogo:" #: edit_act_margin msgid "Margin:" msgstr "Margem:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Espaço vertical e horizontal entre objectos visuais." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Cor de fundo:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Mudar cor de fundo." #: edit_gradient_startColor msgid "Start color:" msgstr "Cor inicial:" #: edit_gradient_endColor msgid "End color:" msgstr "Cor final:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Selecção da cor inicial" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Selecção da cor final" #: edit_gradient_cycles msgid "Cycles:" msgstr "Ciclos:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Número de repetições do gradiente sobre a superfície a pintar." #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientação:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Orientação do gradiente, medida em graus sobre a horizontal." #: edit_act_gradient msgid "Gradient:" msgstr "Gradiente:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Utilizar um gradiente de cores" #: edit_color_opacity msgid "Opacity" msgstr "Opacidade" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Ajusta o valor do canal alfa (opacidade) da cor." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Gradiente" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Utilizar os valores padrão (gradiente nulo)" #: edit_act_image msgid "Image:" msgstr "Imagem:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Descrição" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nome e descrição" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Em mosaico" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Pinta toda a superfície com a imagem, repetindo-a ao longo dos eixos X e Y." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Previsualizar:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Limite" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Desenhar limite da janela" #: edit_act_transparent msgid "Transparent" msgstr "Transparente" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "A janela tem fundo transparente" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Largura:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Altura:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Largura do objecto, em píxeis" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Altura do objecto, em píxeis" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Centrada" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "Objecto centrado em relação à janela principal" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Posição horizontal absoluta" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Posição vertical absoluta" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interface de utilizador" #: edit_act_image_tooltip msgid "Select an image" msgstr "Seleccionar uma imagem" #: edit_act_text msgid "Text:" msgstr "Texto:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Texto a mostrar para este objecto" #: edit_font_face msgid "Typeface:" msgstr "Tipo:" #: edit_font_size msgid "Size:" msgstr "Tamanho:" #: edit_font_bold msgid "Bold" msgstr "Negrito" #: edit_font_italic msgid "Italic" msgstr "Itálico" #: edit_font_underline msgid "Underline" msgstr "Sublinhado" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Estilo:" #: edit_cell_title msgid "Cell contents" msgstr "Conteúdo da célula" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Mensagens" #: edit_act_msg_initial msgid "Initial message:" msgstr "Mensagem inicial:" #: edit_act_msg_final msgid "Final message:" msgstr "Mensagem final:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Mensagem anterior:" #: edit_act_msg_error msgid "Error message:" msgstr "Mensagem de erro:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Mensagem a mostrar ao iniciar a actividade" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Mensagem a mostrar ao terminar a actividade" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Mensagem a mostrar ao terminar a actividade com erros" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Mensagem a mostrar antes de iniciar (disponível nalgumas actividades)" #: edit_align msgid "Align:" msgstr "Alinhamento:" #: edit_act_textColor msgid "Text color:" msgstr "Cor do texto:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Cor utilizada pelo texto" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Cor da sombra:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Cor da sombra do texto, se houver." #: edit_act_shadow msgid "Shadow" msgstr "Sombra" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Desenhar texto com sombra" #: edit_act_borderColor msgid "Border color:" msgstr "Cor do limite:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Cor do limite da célula" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Cor de estado inactivo:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Cor para célula desactivada" #: edit_act_altColor msgid "Alternative color:" msgstr "Cor alternativa:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "Cor para conteúdo alternativo das células solucionadas." #: edit_cell_marked msgid "Marked" msgstr "Marcada" #: edit_cell_disabled msgid "Disabled" msgstr "Desactivada" #: edit_cell_alt msgid "Alternative" msgstr "Alternativa" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Margem interna:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Espaço entre limites da célula e texto." #: edit_cell_borderWidth msgid "Border width:" msgstr "Espessura do limite:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Espessura do limite." #: edit_cell_markerWidth msgid "Marker width:" msgstr "Espessura do marcador:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "Espessura do limite de uma célula marcada ou seleccionada." #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Previsualizar no estado \"alternativo\"" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Previsualizar no estado \"desactivado\"" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Previsualizar no estado \"marcado\"" #: edit_act_testAction msgid "Preview activity" msgstr "Mostrar actividade" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Testar o funcionamento da actividade" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Descrição" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Título e descrição da actividade" #: edit_act_panels_options msgid "Options" msgstr "Opções" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opções da actividade" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Janela" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Aspecto, tamanho e posição da janela durante a actividade" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Mensagens" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Conteúdo das mensagens da actividade" #: edit_act_panels_panel msgid "Panel" msgstr "Painel" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Conteúdo do painel" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Estilo" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Ajustar a cor, tipo e tamanho de letra das células" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Estilo:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Evitar sobreposição imagem/texto" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Tentar evitar sobreposição texto/imagem" #: edit_media_exists_1 msgid "The file" msgstr "O ficheiro" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "já está na mediateca!" #: edit_act_shaper msgid "Shaper:" msgstr "Recorte:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Erro no gerador de formas:" #: edit_act_num_cols msgid "Columns:" msgstr "Colunas:" #: edit_act_num_rows msgid "Rows:" msgstr "Linhas:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Altura dos dentes:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Largura dos dentes:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Distribuição aleatória" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Propriedades do gerador de formas" #: edit_act_panels_text msgid "Text" msgstr "Texto" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Texto da actividade" #: action_saveFile_caption msgid "Save..." msgstr "Guardar..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "GG" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Guardar o projecto" #: action_docTree_caption msgid "Document tree..." msgstr "Árvore do documento..." #: action_docTree_keys msgid "T*" msgstr "A*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Mostrar o documento do projecto em forma de árvore" #: edit_docTree_title msgid "Document tree" msgstr "Árvore do documento" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Em uso por:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Atenção:

Este projecto " "está ligado a outros projectos.
Deseja explorá-los e carregar todos os " "arquivos relacionados?

(Recomenda-se responder SIM ao importar um " "pacote de actividades Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Tipo:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Desconhecido" #: edit_mc_type_sound msgid "Play sound" msgstr "Reproduzir som" #: edit_mc_type_video msgid "Play video" msgstr "Reproduzir vídeo" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Reproduzir MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Reproduzir CD áudio" #: edit_mc_type_record msgid "Record sound" msgstr "Gravar som" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Reproduzir gravação" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Ir para actividade" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Ir para sequência" #: edit_mc_type_run_external msgid "Run program" msgstr "Executar programa" #: edit_mc_type_url msgid "Show URL" msgstr "Mostrar URL" #: edit_mc_type_exit msgid "End" msgstr "Terminar" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Voltar" #: edit_mc_level msgid "Priority level:" msgstr "Nível de prioridade:" #: edit_mc_file msgid "File:" msgstr "Ficheiro:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parâmetros:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "De:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Até:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Duração máx.:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Buffer de gravação:" #: edit_mc_stretch msgid "Stretch size" msgstr "Comprimir se não couber" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Posição:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "De:" #: edit_mc_location_from_box msgid "Cell" msgstr "Célula" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Janela" #: edit_mc_location_from_frame msgid "Frame" msgstr "Moldura" #: edit_mc_loop msgid "Loop playback" msgstr "Repetir indefinidamente" #: edit_mc_autostart msgid "Auto start" msgstr "Arranque automático" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Capturar rato" #: edit_mc_title msgid "Multimedia and active content" msgstr "Conteúdo activo e multimédia" #: edit_mc_label msgid "Active content:" msgstr "Conteúdo activo:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Selecção do objecto multimédia" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Biblioteca de recursos" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Centrado na célula" #: edit_mc_pos_window msgid "Centered over window" msgstr "Centrado na janela" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Especificar posição:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Estrutura ou dados da árvore incorrectos." #: edit_act_panels_controls msgid "Controls" msgstr "Controlos" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opções de botões e contadores" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Tipo:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Distribuição dos painéis:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Posição relativa dos painéis A e B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Resolução inversa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "Actividade resolvida quando todos os elementos de \"B\" estiverem " "emparelhados." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Mostrar todas as setas" #: edit_act_alt msgid "Alternative content:" msgstr "Conteúdo alternativo:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Conteúdo a mostrar nas células resolvidas ou não realizadas." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Editar o conteúdo alternativo" #: edit_act_grid msgid "Grid" msgstr "Grelha" #: edit_act_grid_A msgid "Grid A" msgstr "Grelha A" #: edit_act_grid_B msgid "Grid B" msgstr "Grelha B" #: edit_act_grid_layout msgid "Layout" msgstr "Distribuição" #: edit_act_grid_relationship msgid "Relationship" msgstr "Relações" #: edit_seq_activity_header msgid "activity" msgstr "actividade" #: edit_seq_tag_header msgid "tag" msgstr "etiqueta" #: edit_seq_jump_header msgid "jump to" msgstr "saltar para" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Actividade:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Rótulo:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Descrição:" #: edit_seq_auto msgid "Move on automatically" msgstr "Avanço automático" #: edit_seq_delay msgid "Delay:" msgstr "Atraso:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Avançar" #: edit_seq_action_back msgid "Go bak" msgstr "Retroceder" #: edit_seq_action_jump msgid "Jump to..." msgstr "Ir para..." #: edit_seq_action_stop msgid "Stop" msgstr "Parar" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Voltar" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Sair do JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Seta \"seguir\":" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Seta \"voltar\":" #: edit_seq_action msgid "Action:" msgstr "Acção:" #: edit_seq_button_enabled msgid "Show button" msgstr "Mostrar botão" #: edit_seq_project msgid "JClic Project:" msgstr "Projecto JClic:" #: edit_act_absolute msgid "Absolute position" msgstr "Posição absoluta" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "O objecto será colocado nas coordenadas X e Y especificadas" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Posição:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Novo elemento da sequência..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Inserir um novo elemento na sequência de actividades" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Seleccione uma actividade para o novo elemento da sequência." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "Não é possível criar um novo elemento de sequência sem indicar a actividade!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Neste projecto não há nenhuma actividade. Não é possível criar elementos de " "sequência num projecto vazio." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Destino do salto:" #: edit_seq_jump_title msgid "Jump target" msgstr "Destino do salto" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Adicionar uma nova actividade ao projecto" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Tipo de actividade:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nome:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Seleccione o tipo de actividade a criar e dê-lhe um nome:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Deve seleccionar um tipo de actividade!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Deve indicar um nome para a actividade!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Não foi possível criar a actividade!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Classe Java:" #: edit_text_act_format msgid "Format" msgstr "Formato" #: edit_text_act_answer msgid "Answer" msgstr "Resposta" #: edit_text_act_popup msgid "Pop up" msgstr "Janela emergente (\"pop up\")" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Respostas válidas:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Adicionar um novo elemento à lista" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Modificar o elemento seleccionado" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Eliminar o elemento seleccionado da lista" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Mover para cima" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Mover para baixo" #: edit_list_newValue msgid "New text:" msgstr "Novo texto:" #: edit_list_addElement msgid "Add new list element" msgstr "Adicionar um novo elemento de texto" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Modificação do texto seleccionado" #: edit_text_act_target msgid "Target" msgstr "Incógnita" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Comprimento máx.:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Número máximo de caracteres permitidos na resposta." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Carácter de preenchimento" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Carácter utilizado para indicar a incógnita" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Comprimento inicial:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Número de caracteres de preenchimento a mostrar ao iniciar a actividade." #: edit_text_act_iniText msgid "Initial text:" msgstr "Texto inicial:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Texto a mostrar ao iniciar a actividade." #: edit_text_act_list msgid "Show a list of options:" msgstr "Mostrar uma lista de opções:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "O utilizador deve escolher uma opção numa lista." #: edit_text_act_check_title msgid "Correction options" msgstr "Opções de avaliação" #: edit_text_act_popup_no msgid "No pop up" msgstr "Sem janela emergente (\"pop up\")" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Aparição automática" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Aparição em erros" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Aparição com F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Tipo:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Atraso na aparição:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Tempo máximo:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Apenas som" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "Para criar uma nova incógnita, seleccione um fragmento de texto." #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "O texto das incógnitas não pode incluir parágrafos nem tabulações." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "As incógnitas não podem sobrepor-se" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "As incógnitas não podem conter células!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Cor do papel:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Editar os estilos do documento..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Estilo principal:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Espaçamento de tabulação:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Espaços entre marcas de tabulação:" #: edit_text_act_colors msgid "Colors:" msgstr "Cores:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Cores das incógnitas:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Cores de erro:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Previsualizar:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Texto normal" #: edit_text_act_styleSample_target msgid "target" msgstr "incógnita" #: edit_text_act_styleSample_error msgid "error" msgstr "erro" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "texto normal" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "texto normal." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Atenção: esta acção suprimirá a incógnita seleccionada. Tem a certeza de que " "deseja suprimi-la?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Ecrã anterior" #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Não mostrar texto antes de iniciar a actividade" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Mostrar o texto completo do exercício" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Mostrar este texto:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Tempo máximo:" #: edit_text_act_edit_target msgid "Target..." msgstr "Incógnita..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Mostrar botão de avaliação" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Texto do botão:" #: edit_text_act_checkCase msgid "Match case" msgstr "Verificar maiúsculas / minúsculas" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Considerar acentos e caracteres especiais" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Considerar os sinais de pontuação" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Permitir espaços repetidos" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Critérios" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Saltar automaticamente para incógnita seguinte" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Avançar apenas se responder correctamente" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Indicar erros letra a letra" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Parâmetros do algoritmo de análise:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Passos:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Campo de exploração:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Verificação" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Análise das respostas" #: edit_text_act_check_bt msgid "Correction..." msgstr "Avaliação..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Botão de avaliação" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progresso" #: edit_text_act_typeBtn msgid "Type..." msgstr "Tipo..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ordenar parágrafos" #: edit_text_act_orderWords msgid "Order words" msgstr "Ordenar palavras" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Misturar palavras entre parágrafos" #: edit_text_act_type_title msgid "Activity type" msgstr "Tipo de actividade" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Esta acção suprimirá todas as incógnitas. Tem a certeza de que deseja " "suprimi-las?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identificar palavras" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identificar caracteres" #: edit_media_change_name msgid "Change name..." msgstr "Renomear..." #: edit_media_change_file msgid "Change file..." msgstr "Mudar ficheiro..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Guardar em ficheiro ZIP" #: edit_media_type msgid "Media type:" msgstr "Tipo de recurso:" #: edit_media_size msgid "File size:" msgstr "Tamanho do ficheiro:" #: edit_media_show_type msgid "Files of type:" msgstr "Tipo de ficheiros:" #: edit_media_preview msgid "Preview media" msgstr "Visualizar objecto" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Previsualização do recurso multimédia" #: edit_media_rename msgid "Change resource name" msgstr "Mudar o nome do recurso" #: edit_media_rename_title msgid "Rename" msgstr "Renomear" #: edit_media_rename_prompt msgid "New name:" msgstr "Novo nome:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Nome de recurso inválido!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Já existe outro recurso com este nome. Os recursos devem ter um nome único " "no projecto." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Ficheiro incorrecto" #: err_media_chfile_different msgid "File must be of same type" msgstr "Ficheiro deve ser do mesmo tipo" #: edit_media_font_error msgid "Unable to load font!" msgstr "Não foi possível carregar o tipo de letra." #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Guardar o ficheiro (extraí-lo do ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Actualizar o conteúdo a partir do ficheiro" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Não é um ficheiro \"real\", é um objecto dentro de um ficheiro ZIP. Para " "utilizar esta função, é necessário que exista um ficheiro com o mesmo nome " "na pasta onde está o ficheiro ZIP." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Actividades" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Sequências" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Biblioteca de recursos" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Gestão de imagens e outros recursos utilizados no projecto." #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Criação e edição das actividades do projecto" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Criação e edição de sequências de actividades" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Título:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Título do projecto" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Projecto" #: edit_project_tooltip msgid "Edit project properties" msgstr "Edição das propriedades do projecto" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Descrição:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Descrição geral do projecto" #: edit_project_area msgid "Areas:" msgstr "Áreas:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Áreas curriculares a que se destina o projecto" #: edit_project_level msgid "Levels:" msgstr "Níveis:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Níveis e ciclos educativos a que se destina o projecto" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descritores:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descritores do projecto (separados por vírgulas)" #: edit_project_languages msgid "Languages:" msgstr "Idiomas:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Idiomas utilizados no projecto" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Mudar idioma seleccionado" #: edit_project_languages_add msgid "Add language" msgstr "Adicionar idioma" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Códigos de idioma ISO-639:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autores:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Pessoas que participaram na criação do projecto" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nome:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "Correio electrónico:" #: edit_project_author_rol msgid "Rol:" msgstr "Função:" #: edit_project_author_organization msgid "Organization:" msgstr "Organização:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Comentários:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nome do autor (obrigatório)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Endereço de correio electrónico do autor (opcional)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Função da pessoa no projecto: autor, colaborador, desenhos, sons... " "(opcional)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Escola, universidade, associação... (opcional)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Página web pessoal (opcional)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Outras características (opcional)" #: edit_project_author_info msgid "Author info:" msgstr "Dados do autor:" #: edit_project_author_add msgid "Add author to list" msgstr "Adicionar um autor à lista" #: edit_project_author_edit msgid "Edit author info" msgstr "Modificação dos dados do autor" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nome:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nome da escola" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "Correio electrónico:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Endereço de correio electrónico da escola" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Endereço web da escola" #: edit_project_org_address msgid "Address:" msgstr "Endereço:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Endereço postal da escola" #: edit_project_org_pc msgid "PC:" msgstr "CP:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Código postal" #: edit_project_org_city msgid "City:" msgstr "Localidade:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Localidade da escola" #: edit_project_org_country msgid "Country:" msgstr "País:" #: edit_project_org_state msgid "State:" msgstr "Estado:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Comentários:" #: edit_project_org msgid "School/s:" msgstr "Centro/s:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Escolas e outras instituições que participaram no projecto" #: edit_project_org_info msgid "Organization info:" msgstr "dados da organização:" #: edit_project_org_add msgid "Add organization" msgstr "Adicionar uma nova organização" #: edit_project_org_edit msgid "Edit organization data" msgstr "Modificar os dados da organização" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Estado, país, federação..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Estado federal, nacionalidade, comunidade, região..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Outros dados..." #: edit_project_rev_date msgid "Date:" msgstr "Data:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Data da revisão" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autores:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autores da revisão" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Descrição:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Breve descrição das alterações" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Comentários:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Informação adicional" #: edit_project_rev msgid "Revisions:" msgstr "Revisões:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Registo das principais modificações efectuadas no projecto" #: edit_project_rev_add msgid "Add revision record" msgstr "Adicionar um registo de revisão" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Edição dos dados da revisão" #: edit_project_rev_info msgid "Revision data" msgstr "Características da revisão" #: edit_media_objects msgid "objects" msgstr "objectos" #: edit_media_object msgid "object" msgstr "objecto" #: edit_evsounds_start msgid "Start of activity:" msgstr "Início de actividade:" #: edit_evsounds_click msgid "Click on object:" msgstr "Clicar num objecto:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Acção errada:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Acção correcta:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Actividade terminada com erros:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Actividade correctamente terminada:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Erro: A descrição deve ser preenchida" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Edição dos sons de evento" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Sons de evento:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Definir sons específicos para cada evento de JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Sons de evento:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Definir sons específicos para cada evento de JClic" #: edit_evsounds_default msgid "default sound" msgstr "som padrão" #: edit_evsounds_disabled msgid "disabled" msgstr "desactivado" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Activa/desactiva o som para este evento" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Clique para seleccionar o som ligado a este evento, ou desmarque para " "utilizar o som padrão" #: action_newProject_caption msgid "New project..." msgstr "Novo projecto..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Criar um novo projecto JClic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "De:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Valor mínimo do operando" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Até:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Valor máximo do operando" #: edit_arith_op_with msgid "With:" msgstr "Com:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Se seleccionado, o operando pode ter também este valor" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Um da lista:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Lista de possíveis valores do operando" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Decimais:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Número de decimais do operando" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (inteiro)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#,#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#,##" #: edit_arith_firstOp msgid "First operand" msgstr "Primeiro operando" #: edit_arith_secondOp msgid "Second operand" msgstr "Segundo operando" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 para JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operações:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Selecciona o tipo de operações a efectuar" #: edit_arith_operations_plus msgid "Plus" msgstr "Somar" #: edit_arith_operations_minus msgid "Minus" msgstr "Subtrair" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Multiplicar" #: edit_arith_operations_divide msgid "Divide" msgstr "Dividir" #: edit_arith_unknown msgid "Unknown:" msgstr "Incógnita:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Selecciona o elemento que funcionará como incógnita" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "A incógnita é o resultado" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "A incógnita é o segundo operando" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "O primeiro operando é a incógnita" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "A operação é a incógnita" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Escrever a expressão começando pelo resultado" #: edit_arith_result msgid "Result:" msgstr "Resultado:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Sem transporte" #: edit_arith_result_random msgid "Random" msgstr "Aleatório" #: edit_arith_result_asc msgid "Ascending" msgstr "Ascendente" #: edit_arith_result_order msgid "Order by result:" msgstr "Ordenar por resultado:" #: edit_arith_result_desc msgid "Descending" msgstr "Descendente" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Evitar duplicados" #: edit_arith_cond msgid "Conditions:" msgstr "Condições:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indiferente" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "O primeiro operando deve ser maior que o segundo" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "O primeiro operando deve ser menor que o segundo" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Outras condições" #: edit_autocp msgid "Automatic content generator:" msgstr "Gerador automático de conteúdo:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" "Selecção do tipo de gerador automático de conteúdo para esta actividade." #: edit_autocp_block msgid "Content generator" msgstr "Gerador de conteúdo" #: edit_autocp_btn msgid "Settings..." msgstr "Definições..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Configuração dos parâmetros do gerador de conteúdo" #: edit_data msgid "Edit data" msgstr "Edição de dados" #: edit_act msgid "Activity edit" msgstr "Edição da actividade" #: edit_acp msgid "Content provider edit" msgstr "Edição do gerador de conteúdo" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Erro ao criar o gerador de conteúdo" #: edit_project_author_group msgid "Creation" msgstr "Criação" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Descrição" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interface de utilizador" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Descrição:" #: m_Edit msgid "Edit" msgstr "Edição" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "V*" #: edit_act_newActivity msgid "New activity..." msgstr "Nova actividade..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "M#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Inserir" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Ver" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Projecto" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Editar as propriedades do projecto" #: action_editMedia_caption msgid "Media" msgstr "Mediateca" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Edição da biblioteca multimédia do projecto" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Actividades" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Edição das actividades" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Sequências" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Edição das sequências de actividades" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "O projecto actual foi modificado. Deseja guardar as alterações?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descritores" #: edit_media_new msgid "New media object..." msgstr "Novo objecto multimédia..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Adicionar uma imagem ou um objecto multimédia à mediateca" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Limite de pontuação:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Seguir este caminho quando a pontuação global for maior ou igual a..." #: edit_seq_time msgid "Time threshold:" msgstr "Limite de tempo:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Para seguir este caminho é necessário ter realizado as actividades num tempo " "inferior a..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Siga este caminho sempre que a pontuação global for inferior a..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Seguir este caminho sempre que o tempo decorrido nas actividades for " "superior a..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Saltos condicionais" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "Indicar saltos a executar apenas se ocorrerem determinadas condições" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Indicar as condições para saltar para um nível superior" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Salto inferior:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Salto superior:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Indicar as condições para saltar para um nível inferior" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Acção atribuída ao botão \"Seguinte\"" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Acção atribuída ao botão \"Anterior\"" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Indicar o destino do salto" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Acção a realizar" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Actividade atribuída a este elemento da sequência" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Etiqueta utilizada para referir-se a este elemento de sequência (opcional)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Descrição do elemento de sequência (opcional)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Activar/desactivar o botão de mudança de actividade" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Avançar automaticamente ao terminar a actividade" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Segundos de espera antes de realizar o avanço automático" #: edit_color_dlgTitle msgid "Select color" msgstr "Seleccionar cor" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Por favor, espere enquanto se altera o nome do recurso..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Largura:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Largura das células (em píxeis)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Altura:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Altura das células (em píxeis)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Palavras escondidas:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Lista das palavras escondidas no painel" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Utilizar o painel B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "Usar um segundo painel, que surge à medida que as palavras são encontradas" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Selecção do tipo de gerador de formas do painel" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Número de colunas do painel" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Número de filas do painel" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Separadores transparentes" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Exibir os separadores (quadros negros) como buracos transparentes" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Misturas\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Número de vezes a misturar as peças" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Copiar atributos para..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Atributos:" #: edit_act_copy_dest msgid "Apply to:" msgstr "Aplicar a:" #: edit_act_copy_style_main msgid "Main window" msgstr "Janela principal" #: edit_act_copy_style_play msgid "Play window" msgstr "Janela de jogo" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Actividades a modificar:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Copiar atributos" #: edit_act_copyAttributes_keys msgid "T" msgstr "F" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Copiar atributos da actividade actual para outras actividades" #: edit_new_project_name msgid "Project name:" msgstr "Nome do projecto:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Nome curto e descritivo do projecto" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nome do ficheiro:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nome do ficheiro do projecto (sem extensão)" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Pasta:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nome da pasta em que se guardará o projecto" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Procurar..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Criação de um novo projecto JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Erro: Tanto o projecto como o ficheiro e a pasta devem ter nomes válidos." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Nesta pasta já existe outro projecto Clic3.0 ou JClic. Para evitar " "confusões, recomenda-se manter cada projecto numa pasta independente, ainda " "que não seja um requisito imprescindível. Deseja criar o novo projecto nesta " "pasta?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Erro: não foi possível criar a pasta (directoria)!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Erro: Não foi seleccionada nenhuma actividade. Para utilizar esta função, " "deve seleccionar na lista a actividade ou actividades às quais serão " "aplicados os atributos indicados." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "A copiar atributos para:" #: edit_act_copy_margin msgid "Margin" msgstr "Margem" #: edit_act_copy_bgColor msgid "Background color" msgstr "Cor de fundo" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Gradiente" #: edit_act_copy_bgImage msgid "Background image" msgstr "Imagem de fundo" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Limite" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Fundo transparente" #: edit_act_copy_position msgid "Position" msgstr "Posição" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Mensagens" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Estilo da mensagem inicial" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Estilo da mensagem final" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Estilo da mensagem de erro" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Relatórios" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Incluir a actividade nos relatórios" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Registar acções" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interface de utilizador" #: edit_act_copy_skin msgid "Skin" msgstr "Aspecto" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Sons de evento" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Contadores" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Contador de tempo" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Tempo máximo" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Contador de tentativas" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Número máximo de tentativas" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Contador de acertos" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Número de vezes a baralhar" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Botões" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Botão de ajuda" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Botão de informação" #: edit_act_copy_grids msgid "Grids" msgstr "Painéis" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Estilo do painel A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Estilo do painel B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Estilo dos painéis de texto" #: edit_act_copy_text msgid "Text activities" msgstr "Actividades de texto" #: edit_act_copy_fontFace msgid "Font face" msgstr "Tipo de letra" #: edit_act_copy_fontSize msgid "Font size" msgstr "Tamanho de letra" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Estilo de letra" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Cor do texto principal" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Escolha o projecto JClic do qual as actividades serão importadas" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Cor dos erros" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Espaço entre tabulações" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Estilo da mensagem anterior" #: edit_act_changeType msgid "Change activity type" msgstr "Mudar o tipo de actividade" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Nome completo da classe que se utilizará para construir a actividade " "(utilizadores avançados!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Outras..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Os utilizadores avançados podem criar outros tipos de actividades JClic não " "registadas. Escreva abaixo o nome completo da classe, precedida pelo do " "pacote (por exemplo: \"com.acme.activities.FooActivity\"). As novas " "actividades devem expandir edu.xtec.jclic.Activity, e devem ser accessíveis " "ao carregador de classes da máquina virtual de Java." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nome da actividade" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Cada actividade deve ter um nome único no projecto" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Atenção: " "Mudar o tipo de actividade pode causar a perda de atributos e objectos da " "actividade actual. Utilize esta função com cuidado!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Localização do código JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "URL que aponta para uma pasta com os ficheiros e scripts do JClic" #: applet_prev_text msgid "HTML code before:" msgstr "Código HTML prévio:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Texto ou código HTML que aparecerá antes do applet" #: applet_post_text msgid "HTML code after:" msgstr "Código HTML posterior:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Texto ou código HTML que aparecerá depois do applet" #: applet_size msgid "Applet size:" msgstr "Tamanho do applet:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Largura e altura do applet, em valores absolutos ou percentuais." #: applet_page_title msgid "Page title:" msgstr "Título da página:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Texto a mostrar na parte superior da janela do navegador" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "A página web \"%s\" foi criada com êxito." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Deseja abri-la agora com o navegador?" #: action_createHTML_caption msgid "Create web page..." msgstr "Criar página web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Criação de uma página HTML com um applet JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "" "Criação de uma página HTML com um applet que contem o projecto actual." #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nome do arquivo:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nome do arquivo HTML a criar" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Valores padrão usados na criação de páginas web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Cor de fundo:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Cor de fundo da página web" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Centrado" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Applet centrado horizontalmente" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Largura do applet (em valor absoluto ou percentual)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Altura do applet (em valor absoluto ou percentual)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Ao sair, ir para:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL a visitar após sair do JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Quadro de informação:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Nome do quadro usado para mostrar o conteúdo relacionado com o botão de " "informação." #: action_createInstaller_caption msgid "Create project installer..." msgstr "Criar instalador do projecto..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Criação de um ficheiro de instalação do projecto para JClic player" #: installer_caption msgid "Edit project installer script" msgstr "Edição do ficheiro de instalação do projecto" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Título:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Título do projecto a mostrar no assistente de instalação" #: installer_authors msgid "Autors:" msgstr "Autores:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autores do projecto (texto curto)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Pasta:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Nome da pasta a sugerir pelo assistente de instalação" #: installer_files msgid "Files to be copied:" msgstr "Ficheiros a copiar:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Ficheiros copiados durante a instalação" #: installer_files_available msgid "Available files" msgstr "Ficheiros disponíveis" #: installer_files_selected msgid "Selected files" msgstr "Ficheiros seleccionados" #: installer_files_add msgid ">> add >>" msgstr ">> adicionar >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Adicionar o ficheiro seleccionado à lista" #: installer_files_remove msgid "<< remove <<" msgstr "<< remover <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Remover da lista o ficheiro seleccionado" #: installer_button msgid "Launch button" msgstr "Botão de activação" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Propriedades do botão a mostrar na biblioteca de projectos" #: installer_button_project msgid "Main project:" msgstr "Projecto principal:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Projecto JClic associado ao botão" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Etiqueta:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Breve etiqueta de texto, que aparecerá dentro do botão" #: installer_button_icon msgid "Icon:" msgstr "Ícone:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Imagem a usar como ícone do botão. Deixar em branco para usar o ícone padrão " "do JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Descrição" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Texto de ajuda a mostrar pelo botão" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Erro: Falta o título do projecto" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Erro: Falta o nome da pasta de instalação do projecto" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Erro: Nãio foi seleccionado nenhum ficheiro" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Erro: Falta texto do botão de activação" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Erro: O projecto associado ao botão de activação não faz da lista de " "ficheiros a copiar" #: applet_page_full msgid "Full-page applet" msgstr "O applet ocupa toda a página" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "O applet tem dimensões específicas" #: edit_text_align_left msgid "Align text left" msgstr "Alinhar o texto à esquerda" #: edit_text_align_center msgid "Center text" msgstr "Centrar texto" #: edit_text_align_right msgid "Align text right" msgstr "Alinhar à direita" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Criar uma incógnita ou suprimi-la" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Inserir uma célula" #: edit_text_act_content msgid "Content" msgstr "Conteúdo" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Estilo" #: edit_cell_size msgid "Cell size:" msgstr "Dimensões:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "As actividades seguintes não aparecem em nenhuma sequência de actividades do " "projecto. Não serão mostradas:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "Os seguintes objectos da mediateca não são utilizados directamente em " "nenhuma actividade:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "Deseja adicioná-los ao final da última sequência de actividades?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Deseja eliminá-los?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Remoção de objectos multimédia não utilizados" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Actividades órfãs" #: edit_media_refreshAll msgid "Update all media content" msgstr "Actualizar o conteúdo de todos os recursos" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Actualizar todos os recursos voltando a carregar os ficheiros" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "A actualizar recursos..." #: edit_media_exportAll msgid "Export all media" msgstr "Exportar todos os recursos" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Gravar em ficheiros o conteúdo de todos os recursos" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Seleccionar" #: edit_shape_addPoint msgid "Add point" msgstr "Adicionar ponto" #: edit_shape_deletePoint msgid "Delete" msgstr "Eliminar" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Desenhar um rectângulo" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Desenhar uma elipse" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Desenhar um polígono" #: edit_shape_toLine msgid "Convert to line" msgstr "Converter em linha" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Converter em curva de Bézier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Converter em quádrica" #: edit_shape_rLeft msgid "Rotate left" msgstr "Girar para esquerda" #: edit_shape_rRight msgid "Rotate right" msgstr "Girar para direita" #: edit_shape_expand msgid "Expand" msgstr "Expandir" #: edit_shape_contract msgid "Contract" msgstr "Contrair" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Aproximar" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Afastar" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Juntar pontos próximos" #: edit_shape_showPoints msgid "Show points" msgstr "Mostrar pontos" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Mostrar/Ocultar pontos" #: edit_shape_gridSize msgid "Grid size:" msgstr "Tamanho da grelha:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Mostrar/Ocultar grelha" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Raio do imán:" #: edit_shape_elements msgid "Defined elements" msgstr "Elementos definidos" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Nome do elemento seleccionado" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Raio de acção do íman, quando está activado" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Tamanho da grelha" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Actividade:" #: edit_mc_sequence msgid "Sequence:" msgstr "Sequência:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Projecto:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Selecção da actividade" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Selecção da sequência" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Dados insuficientes!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Cor das setas:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Cor utilizada pelo editor ao desenhar as setas (não exactamente, já que " "utiliza uma máscara XOR de bits)" #: edit_act_editActivity msgid "Edit..." msgstr "Editar..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Editar a actividade seleccionada" #: action_saveFileAs_caption msgid "Save as..." msgstr "Guardar como..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Guardar o projecto com um nome diferente" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Comportamento" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Comportamento" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Arrastar" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Arrastar células em vez de usar linha de conexão" #: edit_act_behavior_order msgid "Check solving order" msgstr "Marcar ordem de resolução" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Células deverão ser resolvidas por ordem" #: edit_act_scramble msgid "Scramble" msgstr "Misturar" #: action_importActivities_caption msgid "Import activities..." msgstr "Importar actividades..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importar actividades de outro projecto" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "O ficheiro que foi seleccionado corresponde ao projecto actual. Só pode " "importar actividades entre projectos diferentes. Por favor, escolha outro " "projecto." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" "Seleccione uma ou mais actividades a importar para o projecto actual\\:" #: import_importing msgid "Importing..." msgstr "A importar..." #: import_checkdep msgid "Checking dependencies..." msgstr "A verificar dependências..." #: import_impmedia msgid "Importing media\\:" msgstr "Importar recursos\\:" #: import_impact msgid "Importing activity\\:" msgstr "Importar actividade\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Escolha o projecto JClic do qual as actividades serão importadas" #: edit_tagRep_tags msgid "Tag marks" msgstr "Marcas" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Marcas de início" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Marca que indica início de etiqueta" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Marca final\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Marca que indica final de etiqueta" #: edit_tagRep_file msgid "File" msgstr "Ficheiro" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Ficheiro ou URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "Nome ou URL do ficheiro com os valores que substituirão as etiquetas" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Codificação de caracteres\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Codificação de caracteres usada no ficheiro" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Procurar..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Procurar no sistema de ficheiros" #: edit_tagRep_title msgid "Tag replacing" msgstr "Substituir etiqueta" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Eliminar estilos de texto" #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Atenção\\: Esta acção eliminará os atributos de texto do documento, " "aplicando o estilo predefinido. Esta acção não pode ser desfeita. Quer " "eliminar os atributos de texto?" #: img_max_size msgid "Maximum size of images:" msgstr "Tamanho máximo das imagens" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Largura máxima das imagens importadas para biblioteca de media." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Altura máxima das imagens importadas para biblioteca de media." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "A imagem \"%s\" tem %s pixeis. Excede o máximo permitido pelo JClic Author " "(%s). Quer redimensioná-la?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_pt_BR.po000066400000000000000000002432521335566474600240350ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2010-01-17 20:34+0000\n" "Last-Translator: Alexandre R Soares \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Descrição" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nome da atividade" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nome:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Descrição da atividade" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Relatórios" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Incluir esta atividade nos relatórios" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Incluir os resultados desta atividade no relatório dos usuários" #: edit_act_code msgid "Code:" msgstr "Código:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Código adicional para agrupar e buscar no banco de dados de relatórios." #: edit_act_reportActions msgid "Report user actions" msgstr "Registrar ações dos usuários" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Registrar os detalhes de todas as ações realizadas pelos usuários." #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Contadores" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Contador de tempo" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Mostrar/ocultar contador de tempo" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Contador de tentativas" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Show/hide the tries counter" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Contador de acertos" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Mostrar/ocultar os acertos." #: edit_act_maxTime msgid "Max time:" msgstr "Tempo máximo:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Tempo máximo para resolver a atividade, em segundos, ou 0 para tempo " "ilimitado." #: edit_act_countdown msgid "Countdown" msgstr "Contagem regressiva" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "O contador é iniciado com um valor máximo, decrescendo até 0." #: edit_act_maxActions msgid "Max tries:" msgstr "Máximo nº de tentativas:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "" "Número máximo de tentativas permitido (use 0 para tentativas ilimitadas)." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Botões" #: edit_act_helpBtn msgid "Help" msgstr "Ajuda" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Mostrar/ocultar botão de ajuda" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Mostrar solução" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Mostrar essa mensagem:" #: edit_act_infoBtn msgid "Information" msgstr "Informação:" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Mostrar/ocultar o botão de informação adicional" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Mostrar esta URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Execute este comando:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Endereço na web que será acessado ao clicar no botão de informações " "adicionais" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "" "Linha de comando a ser executada ao clicar no botão de informações adicionais" #: edit_act_mainWindow msgid "Main window:" msgstr "Janela Principal:" #: edit_act_gameWindow msgid "Game window:" msgstr "Janela de Jogos:" #: edit_act_margin msgid "Margin:" msgstr "Margem:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Espaçamento horizontal e vertical entre objetos visuais." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Cor do fundo da tela:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Altere a cor do fundo da tela." #: edit_gradient_startColor msgid "Start color:" msgstr "Cor inicial:" #: edit_gradient_endColor msgid "End color:" msgstr "Cor final:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Escolha a primeira cor" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Escolha a cor final" #: edit_gradient_cycles msgid "Cycles:" msgstr "Ciclos:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Número de repetições do gradiente sobre a superfície de desenho" #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientação:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Orientação do gradiente, medida em graus sobre a horizontal" #: edit_act_gradient msgid "Gradient:" msgstr "Gradiente:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Use gradiente de cores" #: edit_color_opacity msgid "Opacity" msgstr "Opacidade" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Defina valor do canal alfa de cores (opacidade)." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Gradiente" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Use os valores padrão (gradiente nulo)" #: edit_act_image msgid "Image:" msgstr "Imagem:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Descrição" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nome e descrição" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Ladrilhado" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Pinte toda a superfície com a imagem, repetindo-a ao longo dos eixos X e Y " "conforme necessário." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Pré-visualização:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Contorno" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Desenhe uma linha de contorno ao redor da janela" #: edit_act_transparent msgid "Transparent" msgstr "Transparente" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "A janela possui fundo transparente" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Largura:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Altura:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Largura do objeto, medida em pixels" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Altura do objeto, medida em pixels" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "Centralizado" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "O objeto será centralizado sobre a janela principal" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Localização horizontal absoluta" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Localização vertical absoluta" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interface do usuário" #: edit_act_image_tooltip msgid "Select an image" msgstr "Selecione uma imagem" #: edit_act_text msgid "Text:" msgstr "Texto:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Texto a ser exibido dentro deste objeto" #: edit_font_face msgid "Typeface:" msgstr "Tipo de fonte:" #: edit_font_size msgid "Size:" msgstr "Tamanho:" #: edit_font_bold msgid "Bold" msgstr "Negrito" #: edit_font_italic msgid "Italic" msgstr "Itálico" #: edit_font_underline msgid "Underline" msgstr "Sublinhado" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Estilo:" #: edit_cell_title msgid "Cell contents" msgstr "Conteúdo da célula" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Mensagens" #: edit_act_msg_initial msgid "Initial message:" msgstr "Mensagem inicial:" #: edit_act_msg_final msgid "Final message:" msgstr "Mensagem final:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Mensagem anterior:" #: edit_act_msg_error msgid "Error message:" msgstr "Mensagem de erro:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Mensagem a ser exibida quando a atividade iniciar" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Mensagem a ser exibida quando a atividade terminar" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Mensagem a ser exibida quando a atividade terminar com erros" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Mensagem a ser exibida antes do início da atividade (somente em certos tipos " "de atividade)" #: edit_align msgid "Align:" msgstr "Alinhar:" #: edit_act_textColor msgid "Text color:" msgstr "Cor do texto:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Cor usada para escrever o texto" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Cor da sombra:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Cor da sombra do texto, quando selecionada" #: edit_act_shadow msgid "Shadow" msgstr "Sombreamento" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Escreva o texto com sombreamento" #: edit_act_borderColor msgid "Border color:" msgstr "Cor do contorno:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Cor usada para desenhar o contorno da célula" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Cor utilizada em estado inativo:" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Cor utilizada quando a célula estiver desabilitada" #: edit_act_altColor msgid "Alternative color:" msgstr "Cor alternativa:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Cor utilizada para escrever o conteúdo alternativo em células solucionadas." #: edit_cell_marked msgid "Marked" msgstr "Marcado" #: edit_cell_disabled msgid "Disabled" msgstr "Desabilitado" #: edit_cell_alt msgid "Alternative" msgstr "Alternativo" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Margem interna:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Quantidade de espaço entre o contorno da célula e o texto." #: edit_cell_borderWidth msgid "Border width:" msgstr "Largura do contorno:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Largura da linha utilizada para desenhar o contorno padrão" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Largura do marcador:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Largura da linha utilizada para desenhar o contorno quando a célula está " "marcada ou selecionada" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Pré-visualização em estado \"alternativo\"" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Pré-visualização em estado \"desabilitado\"" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Pré-visualização em estado \"marcado\"" #: edit_act_testAction msgid "Preview activity" msgstr "Pré-visualização da atividade" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Pré-visualização e teste da atividade" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Descrição" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Título e descrição da atividade" #: edit_act_panels_options msgid "Options" msgstr "Opções" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opções da atividade" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Janela" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Aspecto, tamanho e posição da janela de atividades" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Mensagens" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Conteúdo das mensagens da atividade" #: edit_act_panels_panel msgid "Panel" msgstr "Painel" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Conteúdos do painel" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Estilo" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Defina a cor, a fonte e o tamanho das células" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Estilo:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Evite a sobreposição de texto/imagem" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Tente evitar a sobreposição da imagem com o texto" #: edit_media_exists_1 msgid "The file" msgstr "O arquivo" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "já existe na biblioteca de mídia!" #: edit_act_shaper msgid "Shaper:" msgstr "Moldador:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Erro do moldador:" #: edit_act_num_cols msgid "Columns:" msgstr "Colunas:" #: edit_act_num_rows msgid "Rows:" msgstr "Filas:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Altura dos dentes:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Largura dos dentes:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Distribuição aleatória" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Propriedades do moldador" #: edit_act_panels_text msgid "Text" msgstr "Texto" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Texto da atividade" #: action_saveFile_caption msgid "Save..." msgstr "Salvar..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Salva (guarda) o projeto atual" #: action_docTree_caption msgid "Document tree..." msgstr "Árvore de documentos..." #: action_docTree_keys msgid "T*" msgstr "A*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Mostre os documentos do projeto na forma de árvore" #: edit_docTree_title msgid "Document tree" msgstr "Árvore de documentos" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Referenciado por:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Aviso:

Este projeto conecta-" "se com outros projetos.
Você quer explorar as conexões (links) e carregar " "todos os arquivos relacionados?

(É aconselhável responder SIM ao " "importar atividades do Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Tipo:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Desconhecido" #: edit_mc_type_sound msgid "Play sound" msgstr "Toque som" #: edit_mc_type_video msgid "Play video" msgstr "Toque vídeo" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Toque MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Toque CD de audio" #: edit_mc_type_record msgid "Record sound" msgstr "Grave som" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Toque som gravado" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Vá para a atividade" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Vá para a sequência" #: edit_mc_type_run_external msgid "Run program" msgstr "Execute o programa" #: edit_mc_type_url msgid "Show URL" msgstr "Mostre a URL" #: edit_mc_type_exit msgid "End" msgstr "Fim" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Retorne" #: edit_mc_level msgid "Priority level:" msgstr "Nível de prioridades:" #: edit_mc_file msgid "File:" msgstr "Arquivo:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Parâmetros:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "De:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Até:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Comprimento máximo:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Fita gravada:" #: edit_mc_stretch msgid "Stretch size" msgstr "Tamanho do trajeto" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Localização:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "De:" #: edit_mc_location_from_box msgid "Cell" msgstr "Célula" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Janela" #: edit_mc_location_from_frame msgid "Frame" msgstr "Quadro" #: edit_mc_loop msgid "Loop playback" msgstr "Laço de reprodução" #: edit_mc_autostart msgid "Auto start" msgstr "Início automático" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Capture o mouse" #: edit_mc_title msgid "Multimedia and active content" msgstr "Multimídia e conteúdo ativo" #: edit_mc_label msgid "Active content:" msgstr "Conteúdo ativo:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Seleção de objetos multimídia" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Biblioteca de mídias" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Centralizado sobre a célula" #: edit_mc_pos_window msgid "Centered over window" msgstr "Centralizado sobre a janela" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Especifique posição:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Informações ou estruturas de árvore incorretas!" #: edit_act_panels_controls msgid "Controls" msgstr "Controles" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opções para botões e contadores" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Tipo:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Formatação da grade (layout):" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Posição relativa dos painéis A e B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Resolução inversa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "A atividade é solucionada quando todos os elementos selecionados de \"B\" " "corresponderem aos seus pares opostos." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Mostre todas as setas" #: edit_act_alt msgid "Alternative content:" msgstr "Conteúdo alternativo:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "" "Conteúdo exibido em células solucionadas e em células não-atribuídas." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Edite o conteúdo alternativo" #: edit_act_grid msgid "Grid" msgstr "Grade" #: edit_act_grid_A msgid "Grid A" msgstr "Grade A" #: edit_act_grid_B msgid "Grid B" msgstr "Grade B" #: edit_act_grid_layout msgid "Layout" msgstr "Formatação (layout)" #: edit_act_grid_relationship msgid "Relationship" msgstr "Relacionamento" #: edit_seq_activity_header msgid "activity" msgstr "atividade" #: edit_seq_tag_header msgid "tag" msgstr "etiqueta" #: edit_seq_jump_header msgid "jump to" msgstr "pule para" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Atividade:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Rótulo:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Descrição:" #: edit_seq_auto msgid "Move on automatically" msgstr "Continue automaticamente" #: edit_seq_delay msgid "Delay:" msgstr "Atraso:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Avance" #: edit_seq_action_back msgid "Go bak" msgstr "Volte" #: edit_seq_action_jump msgid "Jump to..." msgstr "Pule para..." #: edit_seq_action_stop msgid "Stop" msgstr "Pare" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Retorne" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Sair do JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Seta adiante:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Seta retorno:" #: edit_seq_action msgid "Action:" msgstr "Ação:" #: edit_seq_button_enabled msgid "Show button" msgstr "Mostre botão" #: edit_seq_project msgid "JClic Project:" msgstr "Projeto do JClic:" #: edit_act_absolute msgid "Absolute position" msgstr "Posição absoluta" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "O objeto será localizado nas coordenadas X e Y especificadas" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Localização:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Novo elemento na sequência..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Insira um novo elemento na sequência de atividades" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "" "Por favor, selecione uma atividade para o novo elemento da sequência." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" "Não é possível criar um novo elemento de sequência sem uma atividade!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Este projeto não possui atividades! Incapaz de criar elementos de sequência " "em um projeto vazio." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Pular alvo:" #: edit_seq_jump_title msgid "Jump target" msgstr "Pular alvo" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Adicione uma nova atividade ao projeto" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Tipo de atividade:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nome:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Favor, selecione o tipo de atividade a ser criado e nomeie-o:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Você deve selecionar um tipo de atividade!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Você deve especificar um nome para a atividade!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Incapaz de criar a nova atividade!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Nome da Classe Java:" #: edit_text_act_format msgid "Format" msgstr "Formato" #: edit_text_act_answer msgid "Answer" msgstr "Resposta" #: edit_text_act_popup msgid "Pop up" msgstr "Pop up" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Respostas válidas:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Adicione um novo elemento à lista" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Edite o elemento selecionado na lista" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Apague o elemento selecionado na lista" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Mover para cima" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Mover para baixo" #: edit_list_newValue msgid "New text:" msgstr "Novo texto:" #: edit_list_addElement msgid "Add new list element" msgstr "Adicione um novo elemento da lista" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Modifique o texto selecionado" #: edit_text_act_target msgid "Target" msgstr "Alvo" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Comprimento máximo:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Quantidade máxima de caracteres na resposta." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Caractere de preenchimento" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Caractere utilizado para indicar uma lacuna" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Comprimento inicial:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Número de caracteres de preenchimento que serão exibidos no início da " "atividade." #: edit_text_act_iniText msgid "Initial text:" msgstr "Texto inicial:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Texto exibido na lacuna durante o início da atividade." #: edit_text_act_list msgid "Show a list of options:" msgstr "Mostrar uma lista de opções:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" "Exibir uma lista de opções a partir da qual o usuário deve selecionar uma." #: edit_text_act_check_title msgid "Correction options" msgstr "Opções de correção" #: edit_text_act_popup_no msgid "No pop up" msgstr "Sem janelas de destaque (pop up)" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Janelas de destaque (pop up) exibidas automaticamente" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Janelas de destaque (pop up) em erros" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Janelas de destaque (pop up) ao comando da tecla F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Tipo:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Atraso da janela de destaque (pop up):" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Tempo máximo:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Somente o som" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "Você deve selecionar um fragmento do texto para criar um novo alvo!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" "Texto-alvo não pode possuir caracteres de \"Enter\" (nova linha) nem de " "\"Tab\" (tabulação)." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Alvos não podem ser aninhados!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Alvos não podem conter células!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Cor do papel:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Edite o estilo do documento..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Estilo principal:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Espaço de tabulação (tab):" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Espaços entre marcas de tabulação (tab):" #: edit_text_act_colors msgid "Colors:" msgstr "Cores:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Cores do alvo:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Cores de erro:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Pré-visualização:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Texto padrão" #: edit_text_act_styleSample_target msgid "target" msgstr "alvo" #: edit_text_act_styleSample_error msgid "error" msgstr "erro" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "texto padrão" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "texto padrão." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Aviso: Esta ação suprimirá o alvo atualmente selecionado. Você tem certeza " "de que quer continuar?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Tela anterior..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Não exibir qualquer texto antes de iniciar a atividade" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Exibir o texto completo do exercício" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Exibir este texto:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Tempo máximo:" #: edit_text_act_edit_target msgid "Target..." msgstr "Alvo..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Mostre o botão de correção" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Texto do botão:" #: edit_text_act_checkCase msgid "Match case" msgstr "Coincidir com a palavra inteira" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Considerar acentos e caracteres especiais" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Considerar marcas de pontuação" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Permitir espaços repetidos" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Critérios" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Siga para o próximo alvo quando a lacuna for preenchida" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Siga somente quando a resposta estiver correta" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Indique os erros letra por letra" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Parâmetros do algoritmo de análise:" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Passos:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Campos de exploração:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Verifique" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Análise de respostas" #: edit_text_act_check_bt msgid "Correction..." msgstr "Correção..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Botão de correção" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progresso" #: edit_text_act_typeBtn msgid "Type..." msgstr "Tipo..." #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ordenar parágrafos" #: edit_text_act_orderWords msgid "Order words" msgstr "Ordenar palavras" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Embaralhar palavras entre parágrafos" #: edit_text_act_type_title msgid "Activity type" msgstr "Tipos de atividades" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" "Esta ação irá limpar todos os alvos existentes. Você quer realmente " "prosseguir?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identifique palavras" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identifique caracteres" #: edit_media_change_name msgid "Change name..." msgstr "Mudar nome..." #: edit_media_change_file msgid "Change file..." msgstr "Mudar arquivo..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Salvar em um arquivo zipado (ZIP)" #: edit_media_type msgid "Media type:" msgstr "Tipo de mídia:" #: edit_media_size msgid "File size:" msgstr "Tamanho do arquivo:" #: edit_media_show_type msgid "Files of type:" msgstr "Arquivos do tipo:" #: edit_media_preview msgid "Preview media" msgstr "Pré-visualização da mídia" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Pré-visualização dos recursos da mídia" #: edit_media_rename msgid "Change resource name" msgstr "Mudar nome do recurso" #: edit_media_rename_title msgid "Rename" msgstr "Renomear" #: edit_media_rename_prompt msgid "New name:" msgstr "Novo nome:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Nome de recurso inválido!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Existe outro recurso com este nome! Cada recurso deve possuir um nome único." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "Arquivo inválido!" #: err_media_chfile_different msgid "File must be of same type" msgstr "O arquivo deve ser do mesmo tipo" #: edit_media_font_error msgid "Unable to load font!" msgstr "Incapaz de carregar fonte!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Salvar arquivo (extrair de um ZIP)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Atualizar conteúdo de mídias a partir de um arquivo" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Este não é um arquivo \"real\", mas um objeto localizado em um arquivo ZIP. " "Para utilizar esta função, um arquivo com o mesmo nome deve estar presente " "na pasta em que o arquivo zip está localizado." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Atividades" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Sequências" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Biblioteca de mídias" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Gerenciar imagens e outros arquivos de mídia utilizados no projeto" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Criar e editar atividades do projeto" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Editar e criar sequências de atividades" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Título:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Título do projeto" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Projeto" #: edit_project_tooltip msgid "Edit project properties" msgstr "Editar propriedades do projeto" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Descrição:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Descrição geral do projeto" #: edit_project_area msgid "Areas:" msgstr "Áreas:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Áreas curriculares do projeto" #: edit_project_level msgid "Levels:" msgstr "Níveis:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Níveis educacionais do projeto" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descrições:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descrições do projeto (separadas por vírgula)" #: edit_project_languages msgid "Languages:" msgstr "Idiomas:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Idiomas utilizados neste projeto" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Altere a língua selecionada" #: edit_project_languages_add msgid "Add language" msgstr "Escolha idioma a ser adicionado" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Código de idioma (ISO-639):" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autores:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Pessoas envolvidas na criação do projeto" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nome:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_author_rol msgid "Rol:" msgstr "Função:" #: edit_project_author_organization msgid "Organization:" msgstr "Organização:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Comentários:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nome do autor (obrigatório)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "E-mail do autor (opcional)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Papel da pessoa no projeto: autor, colaborador, desenhista, sonoplasta... " "(opcional)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Escola, universidade, associação... (opcional)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Página da web pessoal (opcional)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Campo para outras informações (opcional)" #: edit_project_author_info msgid "Author info:" msgstr "Informação do autor:" #: edit_project_author_add msgid "Add author to list" msgstr "Adicionar um autor à lista" #: edit_project_author_edit msgid "Edit author info" msgstr "Editar informações do autor" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nome:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nome da escola" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "Endereço de e-mail da escola" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Página da escola na web" #: edit_project_org_address msgid "Address:" msgstr "Endereço:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Endereço para correspondência" #: edit_project_org_pc msgid "PC:" msgstr "CEP:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Código postal" #: edit_project_org_city msgid "City:" msgstr "Cidade:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Cidade da escola" #: edit_project_org_country msgid "Country:" msgstr "País:" #: edit_project_org_state msgid "State:" msgstr "Estado:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Comentários:" #: edit_project_org msgid "School/s:" msgstr "Escola(s):" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Escola ou outra instituição envolvida no projeto" #: edit_project_org_info msgid "Organization info:" msgstr "Informações da organização:" #: edit_project_org_add msgid "Add organization" msgstr "Adicionar organização" #: edit_project_org_edit msgid "Edit organization data" msgstr "Editar dados da organização" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "País, federação, união..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Estado federado, comunidade, região..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Outras informações..." #: edit_project_rev_date msgid "Date:" msgstr "Data:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Data de revisão" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autores:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autores da revisão" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Descrição:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Breve descrição das mudanças realizadas" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Comentários:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Outras informações relevantes" #: edit_project_rev msgid "Revisions:" msgstr "Revisões:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Histórico das modificações principais realizadas no projeto" #: edit_project_rev_add msgid "Add revision record" msgstr "Adicionar registro de revisões" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Editar registro de revisões" #: edit_project_rev_info msgid "Revision data" msgstr "Dados de revisão" #: edit_media_objects msgid "objects" msgstr "objetos" #: edit_media_object msgid "object" msgstr "objeto" #: edit_evsounds_start msgid "Start of activity:" msgstr "Início da atividade:" #: edit_evsounds_click msgid "Click on object:" msgstr "Clique no objeto:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Ação equivocada:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Ação correta:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Atividade finalizada com erros:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Atividade finalizada sem erros:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Erro: O campo de descrição não pode ser deixado em branco!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Editar sons eventuais" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Sons eventuais:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Definir sons específicos para cada evento do JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Sons eventuais:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Definir sons específicos para cada evento do JClic" #: edit_evsounds_default msgid "default sound" msgstr "som padrão" #: edit_evsounds_disabled msgid "disabled" msgstr "desabilitado" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Habilitar ou desabilitar o som para este evento" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Clique para selecionar um som para este evento, ou desabilite para utilizar " "o som padrão" #: action_newProject_caption msgid "New project..." msgstr "Novo projeto..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Criar um novo projeto JClic" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "De:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Valor mínimo do operador" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "Até:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Valor máximo do operador" #: edit_arith_op_with msgid "With:" msgstr "Com:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Se habilitado, o operador pode também ter esse valor" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Um a partir da lista:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Lista de valores possíveis para o operador" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Decimais:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Número de decimais do operador" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (inteiro)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "Primeiro operador" #: edit_arith_secondOp msgid "Second operand" msgstr "Segundo operador" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 para JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operações:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Selecione o tipo de operações a serem realizadas" #: edit_arith_operations_plus msgid "Plus" msgstr "Adicionar" #: edit_arith_operations_minus msgid "Minus" msgstr "Subtrair" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Multiplicar" #: edit_arith_operations_divide msgid "Divide" msgstr "Dividir" #: edit_arith_unknown msgid "Unknown:" msgstr "Desconhecido:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Selecione o item que agirá como um desconhecido" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "O resultado é o desconhecido" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "O segundo operador é o desconhecido" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "O primeiro operador é o desconhecido" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "A operação é desconhecida" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Escreva o resultado no início da expressão" #: edit_arith_result msgid "Result:" msgstr "Resultado:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "Não carregue" #: edit_arith_result_random msgid "Random" msgstr "Aleatório" #: edit_arith_result_asc msgid "Ascending" msgstr "Crescente" #: edit_arith_result_order msgid "Order by result:" msgstr "Ordenar por resultado:" #: edit_arith_result_desc msgid "Descending" msgstr "Decrescente" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Evitar duplicados" #: edit_arith_cond msgid "Conditions:" msgstr "Condições:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indiferente" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "O primeiro operador deve ser maior que o segundo" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "O primeiro operador deve ser menor que o segundo" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Outras condições" #: edit_autocp msgid "Automatic content generator:" msgstr "Gerador automático de conteúdo:" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" "Selecione o tipo de gerador de conteúdo automático para esta atividade." #: edit_autocp_block msgid "Content generator" msgstr "Gerador de conteúdo" #: edit_autocp_btn msgid "Settings..." msgstr "Configurações..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Configure as especificações do provedor de conteúdo" #: edit_data msgid "Edit data" msgstr "Editar dados" #: edit_act msgid "Activity edit" msgstr "Editar atividade" #: edit_acp msgid "Content provider edit" msgstr "Editar provedor de conteúdo" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Erro ao criar o provedor de conteúdo!" #: edit_project_author_group msgid "Creation" msgstr "Criação" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Descrição" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interface do usuário" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Descrição:" #: m_Edit msgid "Edit" msgstr "Editar" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Nova atividade..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Inserir" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Visualizar" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Projeto" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Editar configurações do projeto" #: action_editMedia_caption msgid "Media" msgstr "Mídia" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Editar a biblioteca de mídia do projeto" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Atividades" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Editar as atividades" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Sequências" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Editar as sequências das atividades" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "O atual projeto foi modificado. Você quer salvar as mudanças?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descritores" #: edit_media_new msgid "New media object..." msgstr "Novo objeto de mídia..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Adicione uma nova imagem ou objeto de multimídia à biblioteca" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Limite de pontuação:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" "Selecione este modo quando a pontuação global for igual a / ou maior que..." #: edit_seq_time msgid "Time threshold:" msgstr "Limite de tempo:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Para selecionar este modo, o tempo gasto em atividades deve ser menor que..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Selecione este modo quando a pontuação global for menor que..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" "Selecione este modo quando o tempo gasto em atividades for maior que..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Pulos condicionais" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" "Definir pulos especiais a serem executados somente em condições específicas" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Definir condições de pulo para um nível superior" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Pulo Inferior:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Pulo Superior:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Definir condições de pulo para um nível inferior" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Ação definida para o botão \"próximo\"" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Ação definida para o botão \"anterior\"" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Definir o alvo do pulo" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Ação a ser realizada" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Atividade definida para este elemento da sequência" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Etiqueta usada para fazer referência a este elemento de sequência (campo " "opcional)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Descrição do elemento da sequência (campo opcional)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Habilitar ou desabilitar o botão de setas" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "" "Seguir para a próxima atividade automaticamente quando a atual for finalizada" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Segundos de espera antes de realizar a mudança automática" #: edit_color_dlgTitle msgid "Select color" msgstr "Selecione uma cor" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Por favor, espere enquanto o recurso está sendo renomeado..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Largura:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Largura da célula (em pixels)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Altura:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Altura da célula (em pixels)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Palavras escondidas:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Lista das palavras escondidas localizadas no painel" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Use o painel B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "Os conteúdos do segundo painel serão exibidos conforme as palavras forem " "encontradas" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Selecione o tipo de formatador a ser utilizado no painel" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Número de colunas do painel" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Número de linhas do painel" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Delimitadores transparentes" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Trate os delimitadores (caixas pretas) como buracos transparentes" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Embaralhar\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Número de vezes para embaralhar" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Copiar atributos para..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Atributos" #: edit_act_copy_dest msgid "Apply to:" msgstr "Aplicar a:" #: edit_act_copy_style_main msgid "Main window" msgstr "Janela Principal" #: edit_act_copy_style_play msgid "Play window" msgstr "Janela de Jogos" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Atividades a serem modificadas:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Copiar atributos" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Copiar os atributos da atividade atual para outras atividades" #: edit_new_project_name msgid "Project name:" msgstr "Nome do projeto:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Nome descritivo do projeto em poucas palavras" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nome do arquivo:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nome do arquivo do projeto, sem a extensão" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Pasta:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nome da pasta em que o projeto será armazenado" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Procurar..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Criar novo projeto do JClic" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" "Erro: Projeto, arquivo e pasta devem ter nomes válidos (nomes nulos são " "inválidos)." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Esta pasta já contém outro projeto do Clic 3.0 ou do JClic. A fim de evitar " "confusões, recomenda-se manter cada projeto em uma pasta separada, mas esta " "não é uma regra. Você realmente quer criar o novo projeto nesta pasta?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Erro: Incapaz de criar a pasta especificada!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Erro: Nenhuma atividade selecionada! Para usar esta função você deve " "selecionar atividades às quais os atributos indicados serão aplicados." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Copiando atributos para:" #: edit_act_copy_margin msgid "Margin" msgstr "Margem" #: edit_act_copy_bgColor msgid "Background color" msgstr "Cor do plano de fundo" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Gradiente" #: edit_act_copy_bgImage msgid "Background image" msgstr "Imagem do plano de fundo" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Borda" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Plano de fundo transparente" #: edit_act_copy_position msgid "Position" msgstr "Posição" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Mensagens" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Estilo da mensagem inicial" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Estilo da mensagem final" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Estilo da mensagem de erro" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Relatórios" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Incluir atividade no relatório" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Registrar ações" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interface do usuário" #: edit_act_copy_skin msgid "Skin" msgstr "Skin (aparência da moldura)" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Sons eventuais" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Contadores" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Contador de tempo" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Tempo máximo" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Contador de tentativas" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Máximo de tentativas" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Contador de acertos" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Embaralhar # vezes" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Botões" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Botão de Ajuda" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Botão de informação" #: edit_act_copy_grids msgid "Grids" msgstr "Grades" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Estilo da grade A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Estilo da grade B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Estilo das grades de texto" #: edit_act_copy_text msgid "Text activities" msgstr "Atividades de texto" #: edit_act_copy_fontFace msgid "Font face" msgstr "Fonte" #: edit_act_copy_fontSize msgid "Font size" msgstr "Tamanho da fonte" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Estilo da fonte" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Cor principal do texto" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Selecione o projeto jClic do qual as atividades serão importadas" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Cor de erro" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Espaço de tabulação" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Estilo da mensagem anterior" #: edit_act_changeType msgid "Change activity type" msgstr "Alterar tipo de atividade" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Nome completo da Classe a ser utilizada para construir a atividade (somente " "para usuários avançados!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Outro..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "Usuários avançados podem também criar tipos não-registrados de atividades do " "JClic. Somente escreva abaixo o nome completo da Classe, prefixado pelo " "pacote (como \"com.acme.activities.FooActivity\"). Classes de atividade " "devem extender edu.xtec.jclic.Activity, e devem ser acessíveis para o " "carregador de classes JVM (JVM classloader)." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nome da atividade:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Cada atividade deve ter um nome único no projeto" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Aviso: " "Alterar o tipo de atividade pode causar perda de alguns atributos e objetos " "da atividade atual. Realize esse procedimento com " "cuidado!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Localização do código do JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" "Endereço (URL) apontando para a pasta com os arquivos de programas JClic e " "scripts" #: applet_prev_text msgid "HTML code before:" msgstr "Código HTML anterior:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Texto ou código HTML a ser aplicado antes do applet" #: applet_post_text msgid "HTML code after:" msgstr "Código HTML posterior:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Texto ou código HTML a ser aplicado após o applet" #: applet_size msgid "Applet size:" msgstr "Tamanho do applet:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "largura e altura do applet, em valores absolutos ou percentuais." #: applet_page_title msgid "Page title:" msgstr "Título da página:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Texto a ser exibido no topo da janela do navegador" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "A página \"%s\" foi criada com sucesso." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Você quer abrir a página com o navegador agora?" #: action_createHTML_caption msgid "Create web page..." msgstr "Criar página da web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Criação da página HTML com um applet do JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "" "Criar uma página HTML com um applet do JClic contendo o atual projeto" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nome do arquivo:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nome do arquivo HTML a ser criado" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Valores padrão utilizados na criação da página da web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Cor do plano de fundo:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Cor do plano de fundo da página HTML" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Centralizado" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Exibir o applet centralizado horizontalmente" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Largura do applet (absoluto ou percentual)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Altura do applet (absoluto ou percentual)" #: applet_exitUrl msgid "On exit, go to:" msgstr "Ao sair, vá para:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "Ao sair, redirecionar a navegação do JClic para o endereço (URL)" #: applet_infoFrame msgid "Info frame name:" msgstr "Nome do quadro de informações:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Nome do quadro utilizado para exibir conteúdos relacionados com o botão " "\"informações\"" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Criar instalador do projeto..." #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Criar um script instalador de projeto para o JClic player" #: installer_caption msgid "Edit project installer script" msgstr "Editar script instalador de projetos" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Título:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Título de projeto, a ser mostrado no auxiliar de instalação" #: installer_authors msgid "Autors:" msgstr "Autores:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autor/es do projeto (texto curto)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Pasta:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Nome da pasta a ser sugerido pelo auxiliar de instalação" #: installer_files msgid "Files to be copied:" msgstr "Arquivos a serem copiados:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Arquivos a serem copiados pelo instalador" #: installer_files_available msgid "Available files" msgstr "Arquivos disponíveis" #: installer_files_selected msgid "Selected files" msgstr "Arquivos selecionados" #: installer_files_add msgid ">> add >>" msgstr ">> adicionar >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Adicionar à lista o arquivo selecionado" #: installer_files_remove msgid "<< remove <<" msgstr "<< remover <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Remover da lista o arquivo selecionado" #: installer_button msgid "Launch button" msgstr "Botão de início" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Propriedades do botão a ser exibido na biblioteca de projetos" #: installer_button_project msgid "Main project:" msgstr "Projeto principal:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Projeto JClic a ser iniciado pelo botão" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Rótulo:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Rótulo de texto curto, a ser exibido dentro do botão" #: installer_button_icon msgid "Icon:" msgstr "Ícone:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Imagem a ser utilizada como ícone do botão. Deixe em branco para usar o " "ícone padrão do JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Descrição" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Dica a ser exibida pelo botão" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Erro: Está faltando o título do projeto" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Erro: Está faltando o nome da pasta" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Erro: Nenhum arquivo selecionado" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Erro: Está faltando o rótulo de texto do botão de início" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Erro: O projeto definido pelo botão de início não está na lista de arquivos " "a serem copiados" #: applet_page_full msgid "Full-page applet" msgstr "Applet de página cheia" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "Applet com dimensões específicas" #: edit_text_align_left msgid "Align text left" msgstr "Alinhar texto à esquerda" #: edit_text_align_center msgid "Center text" msgstr "Centralizar texto" #: edit_text_align_right msgid "Align text right" msgstr "Alinhar texto à direita" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Criar ou remover alvo" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Inserir uma célula" #: edit_text_act_content msgid "Content" msgstr "Conteúdo" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Estilo" #: edit_cell_size msgid "Cell size:" msgstr "Tamanho da célula:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "As seguintes atividades não aparecem em sequências de atividade do projeto, " "portanto nunca serão exibidas:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "Os seguintes objetos de mídia não estão sendo usados diretamente em nenhuma " "atividade:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "Você quer adicioná-los após a última atividade da sequência?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Você quer removê-los?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Remoção de objetos de mídia não utilizados" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Atividades isoladas" #: edit_media_refreshAll msgid "Update all media content" msgstr "Atualizar todo o conteúdo de mídia" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Atualizar todos os objetos de mídia recarregando estes arquivos" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Atualizando mídia..." #: edit_media_exportAll msgid "Export all media" msgstr "Exportar toda mídia" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Salvar em arquivos todo o conteúdo de todos os elementos de mídia" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Selecione" #: edit_shape_addPoint msgid "Add point" msgstr "Adicione ponto" #: edit_shape_deletePoint msgid "Delete" msgstr "Apague" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Desenhe retângulo" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Desenhe elipse" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Desenhe polígono" #: edit_shape_toLine msgid "Convert to line" msgstr "Converter para linha" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Converter para curva Bézier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Converter para curva quadratica" #: edit_shape_rLeft msgid "Rotate left" msgstr "Girar esquerda" #: edit_shape_rRight msgid "Rotate right" msgstr "Girar direita" #: edit_shape_expand msgid "Expand" msgstr "Expandir" #: edit_shape_contract msgid "Contract" msgstr "Contrair" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Zoom +" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Zoom -" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Unir os pontos mais próximos" #: edit_shape_showPoints msgid "Show points" msgstr "Mostrar pontos" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Mostrar/ Ocultar os pontos" #: edit_shape_gridSize msgid "Grid size:" msgstr "Tamanho da grade:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Mostrar/ Ocultar a grade" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Raio de Magneto:" #: edit_shape_elements msgid "Defined elements" msgstr "Elementos definidos" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Nome do elemento selecionado" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Ativar Raio de Magneto,quando habilitado" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Tamanho da grade" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Atividade:" #: edit_mc_sequence msgid "Sequence:" msgstr "Sequência:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Projeto:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Escolha atividade" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Escolha sequência" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Dados insuficientes!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Cor da seta:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Cor utilizada pelo editor para desenhar as setas (não exatamente, porque uma " "máscara de bit XOR é utilizada)" #: edit_act_editActivity msgid "Edit..." msgstr "Editar..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Editar a atividade selecionada" #: action_saveFileAs_caption msgid "Save as..." msgstr "Salvar como..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Salva o projeto atual com um nome diferente" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Comportamento" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Comportamento" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Arrastar" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Arrastar células em vez de usar linhas de conexão" #: edit_act_behavior_order msgid "Check solving order" msgstr "Verificar ordem de solução" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "As células devem ser solucionadas em ordem" #: edit_act_scramble msgid "Scramble" msgstr "Embaralhar" #: action_importActivities_caption msgid "Import activities..." msgstr "Importar atividades..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Importar atividades de outro projeto" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "O arquivo selecionado corresponde ao projeto atual. Atividades podem ser " "importadas apenas de projetos diferentes. Por favor, escolha outro arquivo " "de projeto." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "Selecione uma ou mais atividades para importar ao projeto atual:" #: import_importing msgid "Importing..." msgstr "Importando..." #: import_checkdep msgid "Checking dependencies..." msgstr "Verificando dependências..." #: import_impmedia msgid "Importing media\\:" msgstr "Importando mídia\\:" #: import_impact msgid "Importing activity\\:" msgstr "Importanto atividade\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Selecione o projeto jClic do qual as atividades serão importadas" #: edit_tagRep_tags msgid "Tag marks" msgstr "Marcas" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Marcas de início\\:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Marca usada para indicar começo de etiqueta" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Marca final\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Marca que indica final de etiqueta" #: edit_tagRep_file msgid "File" msgstr "Arquivo" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "Arquivo ou URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "Nome ou URL do arquivo com os valores que substituirão as etiquetas" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Codificação de caracteres\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Codificação de caracteres usada no arquivo" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Procurar..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Procurar entre os arquivos" #: edit_tagRep_title msgid "Tag replacing" msgstr "Substituir etiqueta" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Apagar estilos de texto..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Alerta\\: Essa ação irá apagar os atributos de caracteres específicos " "aplicados ao documento, devolvendo-o ao seu estilo principal. Essa ação não " "poderá ser desfeita. Deseja continuar?" #: img_max_size msgid "Maximum size of images:" msgstr "Tamanho máximo das imagens:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Largura máxima das imagens importadas para a biblioteca." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Altura máxima das imagens importadas para a biblioteca." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "A imagem \"%s\" possui %s pixels. Ela está maior que o permitido pelo JClic " "Author (%s). Deseja redimensioná-la?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_ru.po000066400000000000000000002225611335566474600234550ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2013-11-15 00:47+0000\n" "Last-Translator: Nikolay Tyunin \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Описание" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Имя активности" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Имя:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Описание активности" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Отчёты" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Включить эту деятельность в отчеты" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Включить результаты этой активности в отчеты пользователей" #: edit_act_code msgid "Code:" msgstr "Код:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" "Дополнительный код, используемый для группировки и поиска в базе данных " "отчетов." #: edit_act_reportActions msgid "Report user actions" msgstr "Отчет действий пользователя" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "" "Регистрация подробной информации о всех действиях, выполняемых пользователями" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Счетчики" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Счетчик времени" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Скрыть/Показать счетчик времени" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Счетчик попыток" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Показать/скрыть счетчик попыток" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Балы" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Показать/скрыть балы" #: edit_act_maxTime msgid "Max time:" msgstr "Макс. время:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Максимально допустимое время для решения в секундах, если 0, то время не " "ограничено." #: edit_act_countdown msgid "Countdown" msgstr "Обратный отсчёт" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "Счетчик начинает с максимального значения, уменьшаясь до 0." #: edit_act_maxActions msgid "Max tries:" msgstr "Максимум попыток" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "" "Максимальное количество разрешенных попыток , если 0, то без ограничений." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Кнопки" #: edit_act_helpBtn msgid "Help" msgstr "Помощь" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Показать / скрыть конпку помощи" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Показать решение." #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Показать это сообщение:" #: edit_act_infoBtn msgid "Information" msgstr "Информация" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Показать / Скрыть кнопку информации" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Показать эту URL-ссылку:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Выполните команду:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "Адрес отображаемой страницы при нажатии на кнопку информации" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Командная строка для выполнения при нажатии кнопки информации." #: edit_act_mainWindow msgid "Main window:" msgstr "Главное окно:" #: edit_act_gameWindow msgid "Game window:" msgstr "Игровое окно:" #: edit_act_margin msgid "Margin:" msgstr "Поля:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Горизонтальный и вертикальный интервал между визуальными объектами." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Цвет фона:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Изменение цвета фона." #: edit_gradient_startColor msgid "Start color:" msgstr "Исходный цвет" #: edit_gradient_endColor msgid "End color:" msgstr "Конечный цвет:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Выбор начального цвета" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Выбор конечного цвета" #: edit_gradient_cycles msgid "Cycles:" msgstr "Циклы:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Количество градиентных повторов в рисунке" #: edit_gradient_orientation msgid "Orientation:" msgstr "Ориентация:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Ориентаци градиента, измеряется в градусах по горизонтали." #: edit_act_gradient msgid "Gradient:" msgstr "Градиент:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Используйте градиент цвета" #: edit_color_opacity msgid "Opacity" msgstr "Прозрачность" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Установить цвета альфа канала (прозрачность)." #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Градиент" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Использовать значения по умолчанию (пустой градиент)" #: edit_act_image msgid "Image:" msgstr "Изображение:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Описание" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Название и описание" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Черепицей" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Заполнить всю поверхность изображением, по мере необходимости повторяя его " "по X и Y оси." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Предварительный просмотр:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Граница" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Нарисуйте линию границы вокруг окна" #: edit_act_transparent msgid "Transparent" msgstr "Прозрачность" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "Окно имеет прозрачный фон" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Ширина:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Высота:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Ширина объекта, измеряемая в пикселях" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Высота объекта, измеряемая в пикселях" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "По центру" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "Объект будет центрирован над главным окном" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Абсолютная горизонтальная позиция" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Абсолютная вертикальная позиция" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Интерфейс" #: edit_act_image_tooltip msgid "Select an image" msgstr "Выбрать изображение" #: edit_act_text msgid "Text:" msgstr "Текст:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Текст для показа внутри этого объекта" #: edit_font_face msgid "Typeface:" msgstr "Шрифт" #: edit_font_size msgid "Size:" msgstr "Размер" #: edit_font_bold msgid "Bold" msgstr "Жирный" #: edit_font_italic msgid "Italic" msgstr "Курсив" #: edit_font_underline msgid "Underline" msgstr "Подчёркнутый" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Стиль:" #: edit_cell_title msgid "Cell contents" msgstr "Содержимое ячейки" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Сообщения" #: edit_act_msg_initial msgid "Initial message:" msgstr "Первоначальное сообщение:" #: edit_act_msg_final msgid "Final message:" msgstr "Заключительное сообщение:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Предыдущее сообщение:" #: edit_act_msg_error msgid "Error message:" msgstr "Сообщение об ошибке:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Сообщение, показываемое при начале действия" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Сообщение, показываемое при завершении действия" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Сообщение, показываемое при завершении действия с ошибками" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" #: edit_align msgid "Align:" msgstr "Выравнивание:" #: edit_act_textColor msgid "Text color:" msgstr "Цвет текста:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Цвет, используемый для отрисовки текста" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Цвет тени:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "Цвет, используемый для нанесения тени текста, когда используется" #: edit_act_shadow msgid "Shadow" msgstr "Тень" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Рисование текста с тенью" #: edit_act_borderColor msgid "Border color:" msgstr "Цвет границы:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Цвет, используемый для рисования границ ячеек" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Цвет неактивного состояния :" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Цвет, используемый, когда ячейка запрещена" #: edit_act_altColor msgid "Alternative color:" msgstr "Альтернативный цвет:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Цвет, используемый для рисования альтернативного содержимого в резрешенных " "клетках." #: edit_cell_marked msgid "Marked" msgstr "Отмеченные" #: edit_cell_disabled msgid "Disabled" msgstr "Отключено" #: edit_cell_alt msgid "Alternative" msgstr "Альтернативно" #: edit_cell_textMargin msgid "Internal margin:" msgstr "Внутреннее поле:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Расстояние между границей ячеек и текстом." #: edit_cell_borderWidth msgid "Border width:" msgstr "Ширина рамки:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Ширина линии, используемой для рисования стандартных границ" #: edit_cell_markerWidth msgid "Marker width:" msgstr "" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Ширина черты, используемой для рисования границы, когда ячейка отмечена или " "выбрана" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Предварительный просмотр в \"альтернативном\" состоянии" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Предварительный просмотр в \"запрещенном\" состоянии" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Предварительный просмотр в \"отмеченном\" состоянии" #: edit_act_testAction msgid "Preview activity" msgstr "Предварительный просмотр действия" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Предварительный просмотр и проверка действия" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Описание" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Название и описание действия" #: edit_act_panels_options msgid "Options" msgstr "Опции" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Параметры действия" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Окно" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Внешний вид, размер и положение окна адействия" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Сообщения" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Содержание сообщений действия" #: edit_act_panels_panel msgid "Panel" msgstr "Панель" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Содержание панели" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Оформление" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Установить цвет ячейки, шрифт и размер" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Вид:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Избегайте перекрытия изображения текстом" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Старайтесь избегать перекрытия текста на изображение" #: edit_media_exists_1 msgid "The file" msgstr "Файл" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "уже существует в медиа-библиотеке !" #: edit_act_shaper msgid "Shaper:" msgstr "" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Ошибка видообразователя:" #: edit_act_num_cols msgid "Columns:" msgstr "Колонки:" #: edit_act_num_rows msgid "Rows:" msgstr "Строки:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "" #: edit_act_toothRandom msgid "Random distribution" msgstr "Случайное распределение" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Параметры раскроя рисунка" #: edit_act_panels_text msgid "Text" msgstr "Текст" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Текст действия" #: action_saveFile_caption msgid "Save..." msgstr "Сохранить..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Сохранить текущий проект" #: action_docTree_caption msgid "Document tree..." msgstr "Дерево документов ..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Показать документ проекта в виде дерева" #: edit_docTree_title msgid "Document tree" msgstr "Дерево документов" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Ссылается на:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Warning:

Этот проект связан " "с другими проектами.
Вы хотите изучить ссылки и загрузить все связанные " "файлы ?

(Необходимо ответить Да при импорте действия Clic " "3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Шрифт:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Неизвестно" #: edit_mc_type_sound msgid "Play sound" msgstr "Воспроизвести звук" #: edit_mc_type_video msgid "Play video" msgstr "Воспроизвести видео" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Воспроизвести MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Воспроизвести аудио компакт-диск" #: edit_mc_type_record msgid "Record sound" msgstr "Записать звуковой отрывок" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Воспроизвести записанный звуковой отрывок" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Перейти к действию" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Перейти к последовательности" #: edit_mc_type_run_external msgid "Run program" msgstr "Запуск программы" #: edit_mc_type_url msgid "Show URL" msgstr "Показывать ссылку" #: edit_mc_type_exit msgid "End" msgstr "Завершение" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Назад" #: edit_mc_level msgid "Priority level:" msgstr "Уровень приоритета:" #: edit_mc_file msgid "File:" msgstr "Файл:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Параметры:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "От:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "Кому:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Макс. длина:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Запись" #: edit_mc_stretch msgid "Stretch size" msgstr "Размер растягивания:" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Расположение:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "От:" #: edit_mc_location_from_box msgid "Cell" msgstr "Ячейка" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Окно" #: edit_mc_location_from_frame msgid "Frame" msgstr "Рамка" #: edit_mc_loop msgid "Loop playback" msgstr "" #: edit_mc_autostart msgid "Auto start" msgstr "Автозапуск" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Захват мыши" #: edit_mc_title msgid "Multimedia and active content" msgstr "Мультимедиа и активное содержимое" #: edit_mc_label msgid "Active content:" msgstr "Активное содержимое:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Выбор мультимедиа объектов" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Медиабиблиотека" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "По центру над ячейкой:" #: edit_mc_pos_window msgid "Centered over window" msgstr "По центру над окном:" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Особая позиция:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Неправильная структура дерева или данных!" #: edit_act_panels_controls msgid "Controls" msgstr "Управление" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Опции кнопок и счетчиков" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Шрифт:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Расположение таблицы:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Взаимное расположение панелей А и B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Обратное разрешение" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "Действие выполнено, когда все заданные элементы \"В\" соответствуют." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Показать все стрелки" #: edit_act_alt msgid "Alternative content:" msgstr "Альтернативное содержимое:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Содержимое показано в решенных и неназначенных клетках." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Редактировать альтернативное содержимое" #: edit_act_grid msgid "Grid" msgstr "Таблица" #: edit_act_grid_A msgid "Grid A" msgstr "Таблица А" #: edit_act_grid_B msgid "Grid B" msgstr "Таблица В" #: edit_act_grid_layout msgid "Layout" msgstr "Расположение" #: edit_act_grid_relationship msgid "Relationship" msgstr "Взаимосвязь" #: edit_seq_activity_header msgid "activity" msgstr "активность" #: edit_seq_tag_header msgid "tag" msgstr "тег" #: edit_seq_jump_header msgid "jump to" msgstr "перейти к" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Действие:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Метка:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Описание:" #: edit_seq_auto msgid "Move on automatically" msgstr "Перейти автоматически" #: edit_seq_delay msgid "Delay:" msgstr "Задержка:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Вперёд" #: edit_seq_action_back msgid "Go bak" msgstr "Назад" #: edit_seq_action_jump msgid "Jump to..." msgstr "Перейти к..." #: edit_seq_action_stop msgid "Stop" msgstr "Остановить" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Назад" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Выход из JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Стрелка-указатель вперед:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Стрелка-указатель вперед:назад" #: edit_seq_action msgid "Action:" msgstr "Действие:" #: edit_seq_button_enabled msgid "Show button" msgstr "Показать кнопку" #: edit_seq_project msgid "JClic Project:" msgstr "Проект JClic :" #: edit_act_absolute msgid "Absolute position" msgstr "Абсолютна позиция:" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "Объект будет помещен в указанные X и Y координаты" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Расположение:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Новая последовательность элементов ..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Вставить новый элемент в последовательность активности" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "" "Пожалуйста, выберите активности для нового элемента последовательности." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "Не удается создать новый элемент последовательности без активности!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Этот проект не имеет активности! Невозможно создать последовательность " "элементов в пустой проект." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Цель перехода:" #: edit_seq_jump_title msgid "Jump target" msgstr "Цель перехода" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Добавить новый вид дейсьвия в проект" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Вид действия:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Название:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Пожалуйста, выберите вид действия и дайте ему имя:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Вы должны выбрать вид действия!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Вы должны назвать действие" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "Невозможно создать активость!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "" #: edit_text_act_format msgid "Format" msgstr "Формат" #: edit_text_act_answer msgid "Answer" msgstr "Ответ" #: edit_text_act_popup msgid "Pop up" msgstr "" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Добавить новый элемент списка" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Изменить выбранный элемент списка" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Удалить выбранный элемент списка" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Переместить вверх" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Переместить вниз" #: edit_list_newValue msgid "New text:" msgstr "Новый текст:" #: edit_list_addElement msgid "Add new list element" msgstr "Добавить новый элемент списка" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Изменить выбранный текст" #: edit_text_act_target msgid "Target" msgstr "Объект" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Макс. длина:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Максимальное количество символов в ответе." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Заполнение сомвола" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Символ используемый для обозначения пробела" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Первоначальная длина:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Количество заполненных символов, которые будут отображаться в начале " "активности." #: edit_text_act_iniText msgid "Initial text:" msgstr "Первоначальный текст:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Текст, отображаемый в пробеле в начале активности." #: edit_text_act_list msgid "Show a list of options:" msgstr "Показать список вариантов:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" "Показать список вариантов, из которых пользователь должен выбрать один." #: edit_text_act_check_title msgid "Correction options" msgstr "Параметры исправления" #: edit_text_act_popup_no msgid "No pop up" msgstr "" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Всплытие при ошибках" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Шрифт:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Задержка всплытия:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Макс. время:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Только звук" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "Вы должны выбрать фрагмент текста, в целях создания нового целевого текста!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "Цели не могут быть вставлены!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "Цели не могут содержать ячейки!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Цвет листа:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Редактировать стили документа ..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Основной стиль:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Обозначение пробела:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Расстояния между позициями вкладок:" #: edit_text_act_colors msgid "Colors:" msgstr "Цвета:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Цвета ошибок:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Предварительный просмотр:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Стандартный текст" #: edit_text_act_styleSample_target msgid "target" msgstr "цель" #: edit_text_act_styleSample_error msgid "error" msgstr "ошибка" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "стандартный текст" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "стандартный текст." #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Предупреждение: Это действие будет запрещать выбранную цель. Вы хотите " "продолжить?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Предыдущий экран ..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "Не отображать текст перед началом активности" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "Показать полный текст выполнения" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Показать этот текст:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Макс. время:" #: edit_text_act_edit_target msgid "Target..." msgstr "" #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Показать кнопку исправления" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Текст на кнопке:" #: edit_text_act_checkCase msgid "Match case" msgstr "С учётом регистра" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Учитывать знаки ударения и специальные символы" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Учитывать знаки препинания" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Разрешить повторение пробелов" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Условие" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Переходите к следующему заданию, когда заполните" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Двигаться только после правильной догадки" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "" #: edit_text_act_check_bt msgid "Correction..." msgstr "" #: edit_text_act_checkButton msgid "Correction button" msgstr "" #: edit_text_act_checkProgress msgid "Progress" msgstr "" #: edit_text_act_typeBtn msgid "Type..." msgstr "" #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "" #: edit_text_act_orderWords msgid "Order words" msgstr "" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "" #: edit_text_act_type_title msgid "Activity type" msgstr "" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" #: edit_text_act_identWords msgid "Identify words" msgstr "" #: edit_text_act_identChars msgid "Identify characters" msgstr "" #: edit_media_change_name msgid "Change name..." msgstr "" #: edit_media_change_file msgid "Change file..." msgstr "" #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "" #: edit_media_type msgid "Media type:" msgstr "" #: edit_media_size msgid "File size:" msgstr "" #: edit_media_show_type msgid "Files of type:" msgstr "" #: edit_media_preview msgid "Preview media" msgstr "" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "" #: edit_media_rename msgid "Change resource name" msgstr "" #: edit_media_rename_title msgid "Rename" msgstr "" #: edit_media_rename_prompt msgid "New name:" msgstr "" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "" #: err_media_chfile_different msgid "File must be of same type" msgstr "" #: edit_media_font_error msgid "Unable to load font!" msgstr "" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "" #: edit_media_refresh_file msgid "Update media content from file" msgstr "" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "" #: edit_project_title_tooltip msgid "Project's title" msgstr "" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "" #: edit_project_tooltip msgid "Edit project properties" msgstr "" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "" #: edit_project_description_tooltip msgid "General description of the project" msgstr "" #: edit_project_area msgid "Areas:" msgstr "" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "" #: edit_project_level msgid "Levels:" msgstr "" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "" #: edit_project_descriptors msgid "Descriptors:" msgstr "" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "" #: edit_project_languages msgid "Languages:" msgstr "" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "" #: edit_project_languages_modify msgid "Change the selected language" msgstr "" #: edit_project_languages_add msgid "Add language" msgstr "" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "" #: edit_project_author_rol msgid "Rol:" msgstr "" #: edit_project_author_organization msgid "Organization:" msgstr "" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "" #: edit_project_author_info msgid "Author info:" msgstr "" #: edit_project_author_add msgid "Add author to list" msgstr "" #: edit_project_author_edit msgid "Edit author info" msgstr "" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "" #: edit_project_org_name_tooltip msgid "School name" msgstr "" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "" #: edit_project_org_url_tooltip msgid "School website" msgstr "" #: edit_project_org_address msgid "Address:" msgstr "" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "" #: edit_project_org_pc msgid "PC:" msgstr "" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "" #: edit_project_org_city msgid "City:" msgstr "" #: edit_project_org_city_tooltip msgid "School city" msgstr "" #: edit_project_org_country msgid "Country:" msgstr "" #: edit_project_org_state msgid "State:" msgstr "" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "" #: edit_project_org msgid "School/s:" msgstr "" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "" #: edit_project_org_info msgid "Organization info:" msgstr "" #: edit_project_org_add msgid "Add organization" msgstr "" #: edit_project_org_edit msgid "Edit organization data" msgstr "" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "" #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "" #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "" #: edit_project_rev_date msgid "Date:" msgstr "" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "" #: edit_project_rev msgid "Revisions:" msgstr "" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "" #: edit_project_rev_add msgid "Add revision record" msgstr "" #: edit_project_rev_edit msgid "Edit revision record" msgstr "" #: edit_project_rev_info msgid "Revision data" msgstr "" #: edit_media_objects msgid "objects" msgstr "" #: edit_media_object msgid "object" msgstr "" #: edit_evsounds_start msgid "Start of activity:" msgstr "" #: edit_evsounds_click msgid "Click on object:" msgstr "" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "" #: edit_evsounds_default msgid "default sound" msgstr "" #: edit_evsounds_disabled msgid "disabled" msgstr "" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" #: action_newProject_caption msgid "New project..." msgstr "" #: action_newProject_keys msgid "NN" msgstr "" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "" #: edit_arith_op_with msgid "With:" msgstr "" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "" #: edit_arith_op_fromList msgid "One from the list:" msgstr "" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "" #: edit_arith_op_decimals msgid "Decimals:" msgstr "" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "" #: edit_arith_op_dec1 msgid "#.#" msgstr "" #: edit_arith_op_dec2 msgid "#.##" msgstr "" #: edit_arith_firstOp msgid "First operand" msgstr "" #: edit_arith_secondOp msgid "Second operand" msgstr "" #: edit_arith_title msgid "Arith2 for JClic" msgstr "" #: edit_arith_operations msgid "Operations:" msgstr "" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "" #: edit_arith_operations_plus msgid "Plus" msgstr "" #: edit_arith_operations_minus msgid "Minus" msgstr "" #: edit_arith_operations_multiply msgid "Multiply" msgstr "" #: edit_arith_operations_divide msgid "Divide" msgstr "" #: edit_arith_unknown msgid "Unknown:" msgstr "" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "" #: edit_arith_result msgid "Result:" msgstr "" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "" #: edit_arith_result_random msgid "Random" msgstr "" #: edit_arith_result_asc msgid "Ascending" msgstr "" #: edit_arith_result_order msgid "Order by result:" msgstr "" #: edit_arith_result_desc msgid "Descending" msgstr "" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "" #: edit_arith_cond msgid "Conditions:" msgstr "" #: edit_arith_cond_ind msgid "Indifferent" msgstr "" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "" #: edit_autocp msgid "Automatic content generator:" msgstr "" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" #: edit_autocp_block msgid "Content generator" msgstr "" #: edit_autocp_btn msgid "Settings..." msgstr "" #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "" #: edit_data msgid "Edit data" msgstr "" #: edit_act msgid "Activity edit" msgstr "" #: edit_acp msgid "Content provider edit" msgstr "" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "" #: edit_project_author_group msgid "Creation" msgstr "" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "" #: m_Edit msgid "Edit" msgstr "" #: m_Edit_Mnemonic msgid "E" msgstr "" #: edit_media_preview_keys msgid "P*" msgstr "" #: edit_act_newActivity msgid "New activity..." msgstr "" #: edit_act_newActivity_keys msgid "A*" msgstr "" #: edit_act_testAction_keys msgid "P#10" msgstr "" #: edit_seq_newElement_keys msgid "S*" msgstr "" #: m_Insert msgid "Insert" msgstr "" #: m_Insert_Mnemonic msgid "I" msgstr "" #: m_View msgid "View" msgstr "" #: m_View_Mnemonic msgid "V" msgstr "" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "" #: action_editProject_keys msgid "PP" msgstr "" #: action_editProject_tooltip msgid "Edit project settings" msgstr "" #: action_editMedia_caption msgid "Media" msgstr "" #: action_editMedia_keys msgid "MM" msgstr "" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "" #: edit_project_descriptors_block msgid "Descriptors" msgstr "" #: edit_media_new msgid "New media object..." msgstr "" #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "" #: edit_media_new_keys msgid "M*" msgstr "" #: edit_seq_threshold msgid "Score threshold:" msgstr "" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" #: edit_seq_time msgid "Time threshold:" msgstr "" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "" #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" #: edit_seq_condJump msgid "Conditional jumps" msgstr "" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "" #: edit_color_dlgTitle msgid "Select color" msgstr "" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "" #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "" #: edit_act_copy_attributes msgid "Attributes" msgstr "" #: edit_act_copy_dest msgid "Apply to:" msgstr "" #: edit_act_copy_style_main msgid "Main window" msgstr "" #: edit_act_copy_style_play msgid "Play window" msgstr "" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "" #: edit_act_copyAttributes_keys msgid "T" msgstr "" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "" #: edit_new_project_name msgid "Project name:" msgstr "" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "" #: edit_new_project_title msgid "Create new JClic project" msgstr "" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "" #: edit_act_copy_margin msgid "Margin" msgstr "" #: edit_act_copy_bgColor msgid "Background color" msgstr "" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "" #: edit_act_copy_bgImage msgid "Background image" msgstr "" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "" #: edit_act_copy_position msgid "Position" msgstr "" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "" #: edit_act_copy_skin msgid "Skin" msgstr "" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "" #: edit_act_copy_maxTime msgid "Max. time" msgstr "" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "" #: edit_act_copy_btnHelp msgid "Help button" msgstr "" #: edit_act_copy_btnInfo msgid "Information button" msgstr "" #: edit_act_copy_grids msgid "Grids" msgstr "" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "" #: edit_act_copy_text msgid "Text activities" msgstr "" #: edit_act_copy_fontFace msgid "Font face" msgstr "" #: edit_act_copy_fontSize msgid "Font size" msgstr "" #: edit_act_copy_fontStyle msgid "Font style" msgstr "" #: edit_act_copy_textColour msgid "Main text colour" msgstr "" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "" #: edit_act_changeType msgid "Change activity type" msgstr "" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" #: edit_act_newActivity_other msgid "Other..." msgstr "" #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" #: applet_codebase msgid "Location of JClic code:" msgstr "" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" #: applet_prev_text msgid "HTML code before:" msgstr "" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "" #: applet_post_text msgid "HTML code after:" msgstr "" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "" #: applet_size msgid "Applet size:" msgstr "" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "" #: applet_page_title msgid "Page title:" msgstr "" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "" #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "" #: action_createHTML_caption msgid "Create web page..." msgstr "" #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "" #: action_createHTML_keys msgid "H*" msgstr "" #: settings_applet msgid "Applet" msgstr "" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "" #: applet_exitUrl msgid "On exit, go to:" msgstr "" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "" #: applet_infoFrame msgid "Info frame name:" msgstr "" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" #: action_createInstaller_caption msgid "Create project installer..." msgstr "" #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "" #: installer_caption msgid "Edit project installer script" msgstr "" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "" #: installer_authors msgid "Autors:" msgstr "" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "" #: installer_files msgid "Files to be copied:" msgstr "" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "" #: installer_files_available msgid "Available files" msgstr "" #: installer_files_selected msgid "Selected files" msgstr "" #: installer_files_add msgid ">> add >>" msgstr "" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "" #: installer_files_remove msgid "<< remove <<" msgstr "" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "" #: installer_button msgid "Launch button" msgstr "" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "" #: installer_button_project msgid "Main project:" msgstr "" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "" #: installer_button_icon msgid "Icon:" msgstr "" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" #: applet_page_full msgid "Full-page applet" msgstr "" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "" #: edit_text_align_left msgid "Align text left" msgstr "" #: edit_text_align_center msgid "Center text" msgstr "" #: edit_text_align_right msgid "Align text right" msgstr "" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "" #: edit_text_act_content msgid "Content" msgstr "" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "" #: edit_cell_size msgid "Cell size:" msgstr "" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "" #: edit_media_refreshAll msgid "Update all media content" msgstr "" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "" #: edit_media_refreshAll_keys msgid "R*" msgstr "" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "" #: edit_media_exportAll msgid "Export all media" msgstr "" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "" #: edit_media_exportAll_keys msgid "X*" msgstr "" #: edit_shape_select msgid "Select" msgstr "" #: edit_shape_addPoint msgid "Add point" msgstr "" #: edit_shape_deletePoint msgid "Delete" msgstr "" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "" #: edit_shape_toLine msgid "Convert to line" msgstr "" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "" #: edit_shape_rLeft msgid "Rotate left" msgstr "" #: edit_shape_rRight msgid "Rotate right" msgstr "" #: edit_shape_expand msgid "Expand" msgstr "" #: edit_shape_contract msgid "Contract" msgstr "" #: edit_shape_zoomIn msgid "Zoom in" msgstr "" #: edit_shape_zoomOut msgid "Zoom out" msgstr "" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "" #: edit_shape_showPoints msgid "Show points" msgstr "" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "" #: edit_shape_gridSize msgid "Grid size:" msgstr "" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "" #: edit_shape_elements msgid "Defined elements" msgstr "" #: edit_shape_elemName msgid "Name of the selected element" msgstr "" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "" #: edit_mc_sequence msgid "Sequence:" msgstr "" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "" #: edit_mc_project msgid "Project:" msgstr "" #: edit_mc_activity_selection msgid "Choose activity" msgstr "" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "" #: edit_act_arrowColor msgid "Arrow color:" msgstr "" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" #: edit_act_editActivity msgid "Edit..." msgstr "" #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "" #: action_saveFileAs_caption msgid "Save as..." msgstr "" #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "" #: edit_act_behavior_drag msgid "Drag objects" msgstr "" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "" #: edit_act_behavior_order msgid "Check solving order" msgstr "" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "" #: edit_act_scramble msgid "Scramble" msgstr "" #: action_importActivities_caption msgid "Import activities..." msgstr "" #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" #: import_importing msgid "Importing..." msgstr "" #: import_checkdep msgid "Checking dependencies..." msgstr "" #: import_impmedia msgid "Importing media\\:" msgstr "" #: import_impact msgid "Importing activity\\:" msgstr "" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "" #: edit_tagRep_tags msgid "Tag marks" msgstr "" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "" #: edit_tagRep_file msgid "File" msgstr "" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" #: edit_tagRep_charset msgid "Charset\\:" msgstr "" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "" #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "" #: edit_tagRep_title msgid "Tag replacing" msgstr "" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "" #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" #: img_max_size msgid "Maximum size of images:" msgstr "" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "" #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Максимальная высота изображения, импортированного в медиатеку." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "Изображение \"% S\" имеет размер \"% S\" пикселей. Это превышает максимум, " "допустимый Автором JClic (%s). Вы хотите, изменить её размер?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_tr.po000066400000000000000000001706071335566474600234570ustar00rootroot00000000000000# Turkish translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2010-10-03 12:30+0000\n" "Last-Translator: wj \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Aktivitenin ismi" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "İsim:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Aktivitenin tanımı" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Raporlar" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "" #: edit_act_code msgid "Code:" msgstr "Kod:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "" #: edit_act_reportActions msgid "Report user actions" msgstr "Kullanıcı işlemlerini raporla" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "" "Kullanıcılar tarafından gerçekleştirilen işlemlerin detaylarını kaydet" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Sayaçlar" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Zaman sayacı" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Zaman sayacını Göster/Gizle" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Deneme Sayacı" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Deneme sayacını Göster/Gizle" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Skor sayacı" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Skor sayacını Göster/Gizle" #: edit_act_maxTime msgid "Max time:" msgstr "Azami Süre:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Aktiviteyi çözmek için azami süre (saniye olarak), ya da Sınırsız süre için " "0." #: edit_act_countdown msgid "Countdown" msgstr "Geri Sayım" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "Geri sayım azami değerden başlayıp sıfıra doğru devam eder" #: edit_act_maxActions msgid "Max tries:" msgstr "Azami deneme:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "İzin verilen azami deneme (sınırsız deneme için 0)" #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Düğmeler" #: edit_act_helpBtn msgid "Help" msgstr "Yardım" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Yardım düğmesini göster/gizle" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Çözümü göster" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Bu mesajı göster:" #: edit_act_infoBtn msgid "Information" msgstr "Bilgi" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Bilgi düğmesini göster/gizle" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Bu URLyi göster" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Bu komutu çalıştır:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "" #: edit_act_mainWindow msgid "Main window:" msgstr "" #: edit_act_gameWindow msgid "Game window:" msgstr "" #: edit_act_margin msgid "Margin:" msgstr "" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "" #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Arkaplan rengini değiştir" #: edit_gradient_startColor msgid "Start color:" msgstr "Başlangıç rengi:" #: edit_gradient_endColor msgid "End color:" msgstr "Bitiş rengi:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Başlangıç rengi seçimi" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Bitiş rengi seçimi" #: edit_gradient_cycles msgid "Cycles:" msgstr "" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "" #: edit_gradient_orientation msgid "Orientation:" msgstr "Yönelim:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "" #: edit_act_gradient msgid "Gradient:" msgstr "" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "" #: edit_color_opacity msgid "Opacity" msgstr "" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "" #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "" #: edit_act_image msgid "Image:" msgstr "" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "" #: edit_act_tiledBgImg msgid "Tiled" msgstr "" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "" #: edit_act_transparent msgid "Transparent" msgstr "" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "" #: edit_act_image_tooltip msgid "Select an image" msgstr "" #: edit_act_text msgid "Text:" msgstr "" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "" #: edit_font_face msgid "Typeface:" msgstr "" #: edit_font_size msgid "Size:" msgstr "" #: edit_font_bold msgid "Bold" msgstr "" #: edit_font_italic msgid "Italic" msgstr "" #: edit_font_underline msgid "Underline" msgstr "" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "" #: edit_cell_title msgid "Cell contents" msgstr "" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "" #: edit_act_msg_initial msgid "Initial message:" msgstr "" #: edit_act_msg_final msgid "Final message:" msgstr "" #: edit_act_msg_prev msgid "Previous message:" msgstr "" #: edit_act_msg_error msgid "Error message:" msgstr "" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" #: edit_align msgid "Align:" msgstr "" #: edit_act_textColor msgid "Text color:" msgstr "" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "" #: edit_act_shadowColor msgid "Shadow color:" msgstr "" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "" #: edit_act_shadow msgid "Shadow" msgstr "" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "" #: edit_act_borderColor msgid "Border color:" msgstr "" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "" #: edit_act_altColor msgid "Alternative color:" msgstr "" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" #: edit_cell_marked msgid "Marked" msgstr "" #: edit_cell_disabled msgid "Disabled" msgstr "" #: edit_cell_alt msgid "Alternative" msgstr "" #: edit_cell_textMargin msgid "Internal margin:" msgstr "" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "" #: edit_cell_borderWidth msgid "Border width:" msgstr "" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "" #: edit_cell_markerWidth msgid "Marker width:" msgstr "" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "" #: edit_act_testAction msgid "Preview activity" msgstr "" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "" #: edit_act_panels_options msgid "Options" msgstr "" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "" #: edit_act_panels_panel msgid "Panel" msgstr "" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "" #: edit_media_exists_1 msgid "The file" msgstr "" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "" #: edit_act_shaper msgid "Shaper:" msgstr "" #: edit_act_shaper_err msgid "Shaper error:" msgstr "" #: edit_act_num_cols msgid "Columns:" msgstr "" #: edit_act_num_rows msgid "Rows:" msgstr "" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "" #: edit_act_toothRandom msgid "Random distribution" msgstr "" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "" #: edit_act_panels_text msgid "Text" msgstr "" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "" #: action_saveFile_caption msgid "Save..." msgstr "" #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "" #: action_saveFile_tooltip msgid "Save the current project" msgstr "" #: action_docTree_caption msgid "Document tree..." msgstr "" #: action_docTree_keys msgid "T*" msgstr "" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "" #: edit_docTree_title msgid "Document tree" msgstr "" #: edit_media_referencedBy msgid "Referenced by:" msgstr "" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "" #: edit_mc_type_unknown msgid "Unknown" msgstr "" #: edit_mc_type_sound msgid "Play sound" msgstr "" #: edit_mc_type_video msgid "Play video" msgstr "" #: edit_mc_type_midi msgid "Play MIDI" msgstr "" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "" #: edit_mc_type_record msgid "Record sound" msgstr "" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "" #: edit_mc_type_run_external msgid "Run program" msgstr "" #: edit_mc_type_url msgid "Show URL" msgstr "" #: edit_mc_type_exit msgid "End" msgstr "" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "" #: edit_mc_level msgid "Priority level:" msgstr "" #: edit_mc_file msgid "File:" msgstr "" #: edit_mc_externalParam msgid "Parameters:" msgstr "" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "" #: edit_mc_recBuffer msgid "Record tape:" msgstr "" #: edit_mc_stretch msgid "Stretch size" msgstr "" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "" #: edit_mc_location_from_box msgid "Cell" msgstr "" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "" #: edit_mc_location_from_frame msgid "Frame" msgstr "" #: edit_mc_loop msgid "Loop playback" msgstr "" #: edit_mc_autostart msgid "Auto start" msgstr "" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "" #: edit_mc_title msgid "Multimedia and active content" msgstr "" #: edit_mc_label msgid "Active content:" msgstr "" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "" #: edit_mc_pos_window msgid "Centered over window" msgstr "" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "" #: edit_act_panels_controls msgid "Controls" msgstr "" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "" #: edit_act_gridLayout msgid "Grid layout:" msgstr "" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "" #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" #: edit_act_showAllArrows msgid "Show all arrows" msgstr "" #: edit_act_alt msgid "Alternative content:" msgstr "" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "" #: edit_act_alt_toggle msgid "ALT" msgstr "" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "" #: edit_act_grid msgid "Grid" msgstr "" #: edit_act_grid_A msgid "Grid A" msgstr "" #: edit_act_grid_B msgid "Grid B" msgstr "" #: edit_act_grid_layout msgid "Layout" msgstr "" #: edit_act_grid_relationship msgid "Relationship" msgstr "" #: edit_seq_activity_header msgid "activity" msgstr "" #: edit_seq_tag_header msgid "tag" msgstr "" #: edit_seq_jump_header msgid "jump to" msgstr "" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "" #: edit_seq_auto msgid "Move on automatically" msgstr "" #: edit_seq_delay msgid "Delay:" msgstr "" #: edit_seq_action_fwd msgid "Go forward" msgstr "" #: edit_seq_action_back msgid "Go bak" msgstr "" #: edit_seq_action_jump msgid "Jump to..." msgstr "" #: edit_seq_action_stop msgid "Stop" msgstr "" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "" #: edit_seq_action_exit msgid "Exit JClic" msgstr "" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "" #: edit_seq_action msgid "Action:" msgstr "" #: edit_seq_button_enabled msgid "Show button" msgstr "" #: edit_seq_project msgid "JClic Project:" msgstr "" #: edit_act_absolute msgid "Absolute position" msgstr "" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "" #: edit_seq_newElement msgid "New sequence element..." msgstr "" #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "" #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" #: edit_seq_jump_msg msgid "Jump target:" msgstr "" #: edit_seq_jump_title msgid "Jump target" msgstr "" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "" #: edit_act_prompt_class msgid "Type of activity:" msgstr "" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "" #: edit_act_newActivity_class msgid "Java class name:" msgstr "" #: edit_text_act_format msgid "Format" msgstr "" #: edit_text_act_answer msgid "Answer" msgstr "" #: edit_text_act_popup msgid "Pop up" msgstr "" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "" #: edit_list_newValue msgid "New text:" msgstr "" #: edit_list_addElement msgid "Add new list element" msgstr "" #: edit_list_modifyValue msgid "Modify selected text" msgstr "" #: edit_text_act_target msgid "Target" msgstr "" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "" #: edit_text_act_fillingChar msgid "Filling character" msgstr "" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "" #: edit_text_act_iniLen msgid "Initial length:" msgstr "" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" #: edit_text_act_iniText msgid "Initial text:" msgstr "" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "" #: edit_text_act_list msgid "Show a list of options:" msgstr "" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" #: edit_text_act_check_title msgid "Correction options" msgstr "" #: edit_text_act_popup_no msgid "No pop up" msgstr "" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "" #: edit_text_act_mainStyle msgid "Main style:" msgstr "" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "" #: edit_text_act_colors msgid "Colors:" msgstr "" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "" #: edit_text_act_styleSample_target msgid "target" msgstr "" #: edit_text_act_styleSample_error msgid "error" msgstr "" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "" #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "" #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "" #: edit_text_act_edit_target msgid "Target..." msgstr "" #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "" #: edit_text_act_checkCase msgid "Match case" msgstr "" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "" #: edit_text_act_checkOptions msgid "Criteria" msgstr "" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "" #: edit_text_act_check_bt msgid "Correction..." msgstr "" #: edit_text_act_checkButton msgid "Correction button" msgstr "" #: edit_text_act_checkProgress msgid "Progress" msgstr "" #: edit_text_act_typeBtn msgid "Type..." msgstr "" #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "" #: edit_text_act_orderWords msgid "Order words" msgstr "" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "" #: edit_text_act_type_title msgid "Activity type" msgstr "" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "" #: edit_text_act_identWords msgid "Identify words" msgstr "" #: edit_text_act_identChars msgid "Identify characters" msgstr "" #: edit_media_change_name msgid "Change name..." msgstr "" #: edit_media_change_file msgid "Change file..." msgstr "" #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "" #: edit_media_type msgid "Media type:" msgstr "" #: edit_media_size msgid "File size:" msgstr "" #: edit_media_show_type msgid "Files of type:" msgstr "" #: edit_media_preview msgid "Preview media" msgstr "" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "" #: edit_media_rename msgid "Change resource name" msgstr "" #: edit_media_rename_title msgid "Rename" msgstr "" #: edit_media_rename_prompt msgid "New name:" msgstr "" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "" #: err_media_chfile_different msgid "File must be of same type" msgstr "" #: edit_media_font_error msgid "Unable to load font!" msgstr "" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "" #: edit_media_refresh_file msgid "Update media content from file" msgstr "" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "" #: edit_project_title_tooltip msgid "Project's title" msgstr "" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "" #: edit_project_tooltip msgid "Edit project properties" msgstr "" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "" #: edit_project_description_tooltip msgid "General description of the project" msgstr "" #: edit_project_area msgid "Areas:" msgstr "" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "" #: edit_project_level msgid "Levels:" msgstr "" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "" #: edit_project_descriptors msgid "Descriptors:" msgstr "" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "" #: edit_project_languages msgid "Languages:" msgstr "" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "" #: edit_project_languages_modify msgid "Change the selected language" msgstr "" #: edit_project_languages_add msgid "Add language" msgstr "" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "" #: edit_project_author_rol msgid "Rol:" msgstr "" #: edit_project_author_organization msgid "Organization:" msgstr "" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "" #: edit_project_author_info msgid "Author info:" msgstr "" #: edit_project_author_add msgid "Add author to list" msgstr "" #: edit_project_author_edit msgid "Edit author info" msgstr "" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "" #: edit_project_org_name_tooltip msgid "School name" msgstr "" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "" #: edit_project_org_url_tooltip msgid "School website" msgstr "" #: edit_project_org_address msgid "Address:" msgstr "" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "" #: edit_project_org_pc msgid "PC:" msgstr "" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "" #: edit_project_org_city msgid "City:" msgstr "" #: edit_project_org_city_tooltip msgid "School city" msgstr "" #: edit_project_org_country msgid "Country:" msgstr "" #: edit_project_org_state msgid "State:" msgstr "" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "" #: edit_project_org msgid "School/s:" msgstr "" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "" #: edit_project_org_info msgid "Organization info:" msgstr "" #: edit_project_org_add msgid "Add organization" msgstr "" #: edit_project_org_edit msgid "Edit organization data" msgstr "" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "" #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "" #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "" #: edit_project_rev_date msgid "Date:" msgstr "" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "" #: edit_project_rev msgid "Revisions:" msgstr "" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "" #: edit_project_rev_add msgid "Add revision record" msgstr "" #: edit_project_rev_edit msgid "Edit revision record" msgstr "" #: edit_project_rev_info msgid "Revision data" msgstr "" #: edit_media_objects msgid "objects" msgstr "" #: edit_media_object msgid "object" msgstr "" #: edit_evsounds_start msgid "Start of activity:" msgstr "" #: edit_evsounds_click msgid "Click on object:" msgstr "" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "" #: edit_evsounds_default msgid "default sound" msgstr "" #: edit_evsounds_disabled msgid "disabled" msgstr "" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" #: action_newProject_caption msgid "New project..." msgstr "" #: action_newProject_keys msgid "NN" msgstr "" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "" #: edit_arith_op_with msgid "With:" msgstr "" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "" #: edit_arith_op_fromList msgid "One from the list:" msgstr "" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "" #: edit_arith_op_decimals msgid "Decimals:" msgstr "" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "" #: edit_arith_op_dec1 msgid "#.#" msgstr "" #: edit_arith_op_dec2 msgid "#.##" msgstr "" #: edit_arith_firstOp msgid "First operand" msgstr "" #: edit_arith_secondOp msgid "Second operand" msgstr "" #: edit_arith_title msgid "Arith2 for JClic" msgstr "" #: edit_arith_operations msgid "Operations:" msgstr "" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "" #: edit_arith_operations_plus msgid "Plus" msgstr "" #: edit_arith_operations_minus msgid "Minus" msgstr "" #: edit_arith_operations_multiply msgid "Multiply" msgstr "" #: edit_arith_operations_divide msgid "Divide" msgstr "" #: edit_arith_unknown msgid "Unknown:" msgstr "" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "" #: edit_arith_result msgid "Result:" msgstr "" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "" #: edit_arith_result_random msgid "Random" msgstr "" #: edit_arith_result_asc msgid "Ascending" msgstr "" #: edit_arith_result_order msgid "Order by result:" msgstr "" #: edit_arith_result_desc msgid "Descending" msgstr "" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "" #: edit_arith_cond msgid "Conditions:" msgstr "" #: edit_arith_cond_ind msgid "Indifferent" msgstr "" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "" #: edit_autocp msgid "Automatic content generator:" msgstr "" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "" #: edit_autocp_block msgid "Content generator" msgstr "" #: edit_autocp_btn msgid "Settings..." msgstr "" #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "" #: edit_data msgid "Edit data" msgstr "" #: edit_act msgid "Activity edit" msgstr "" #: edit_acp msgid "Content provider edit" msgstr "" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "" #: edit_project_author_group msgid "Creation" msgstr "" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "" #: m_Edit msgid "Edit" msgstr "" #: m_Edit_Mnemonic msgid "E" msgstr "" #: edit_media_preview_keys msgid "P*" msgstr "" #: edit_act_newActivity msgid "New activity..." msgstr "" #: edit_act_newActivity_keys msgid "A*" msgstr "" #: edit_act_testAction_keys msgid "P#10" msgstr "" #: edit_seq_newElement_keys msgid "S*" msgstr "" #: m_Insert msgid "Insert" msgstr "" #: m_Insert_Mnemonic msgid "I" msgstr "" #: m_View msgid "View" msgstr "" #: m_View_Mnemonic msgid "V" msgstr "" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "" #: action_editProject_keys msgid "PP" msgstr "" #: action_editProject_tooltip msgid "Edit project settings" msgstr "" #: action_editMedia_caption msgid "Media" msgstr "" #: action_editMedia_keys msgid "MM" msgstr "" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "" #: edit_project_descriptors_block msgid "Descriptors" msgstr "" #: edit_media_new msgid "New media object..." msgstr "" #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "" #: edit_media_new_keys msgid "M*" msgstr "" #: edit_seq_threshold msgid "Score threshold:" msgstr "" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "" #: edit_seq_time msgid "Time threshold:" msgstr "" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "" #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "" #: edit_seq_condJump msgid "Conditional jumps" msgstr "" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "" #: edit_color_dlgTitle msgid "Select color" msgstr "" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "" #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "" #: edit_act_copy_attributes msgid "Attributes" msgstr "" #: edit_act_copy_dest msgid "Apply to:" msgstr "" #: edit_act_copy_style_main msgid "Main window" msgstr "" #: edit_act_copy_style_play msgid "Play window" msgstr "" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "" #: edit_act_copyAttributes_keys msgid "T" msgstr "" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "" #: edit_new_project_name msgid "Project name:" msgstr "" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "" #: edit_new_project_title msgid "Create new JClic project" msgstr "" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "" #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "" #: edit_act_copy_margin msgid "Margin" msgstr "" #: edit_act_copy_bgColor msgid "Background color" msgstr "" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "" #: edit_act_copy_bgImage msgid "Background image" msgstr "" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "" #: edit_act_copy_position msgid "Position" msgstr "" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "" #: edit_act_copy_skin msgid "Skin" msgstr "" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "" #: edit_act_copy_maxTime msgid "Max. time" msgstr "" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "" #: edit_act_copy_btnHelp msgid "Help button" msgstr "" #: edit_act_copy_btnInfo msgid "Information button" msgstr "" #: edit_act_copy_grids msgid "Grids" msgstr "" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "" #: edit_act_copy_text msgid "Text activities" msgstr "" #: edit_act_copy_fontFace msgid "Font face" msgstr "" #: edit_act_copy_fontSize msgid "Font size" msgstr "" #: edit_act_copy_fontStyle msgid "Font style" msgstr "" #: edit_act_copy_textColour msgid "Main text colour" msgstr "" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "" #: edit_act_changeType msgid "Change activity type" msgstr "" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" #: edit_act_newActivity_other msgid "Other..." msgstr "" #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" #: applet_codebase msgid "Location of JClic code:" msgstr "" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "" #: applet_prev_text msgid "HTML code before:" msgstr "" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "" #: applet_post_text msgid "HTML code after:" msgstr "" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "" #: applet_size msgid "Applet size:" msgstr "" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "" #: applet_page_title msgid "Page title:" msgstr "" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "" #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "" #: action_createHTML_caption msgid "Create web page..." msgstr "" #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "" #: action_createHTML_keys msgid "H*" msgstr "" #: settings_applet msgid "Applet" msgstr "" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "" #: applet_exitUrl msgid "On exit, go to:" msgstr "" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "" #: applet_infoFrame msgid "Info frame name:" msgstr "" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" #: action_createInstaller_caption msgid "Create project installer..." msgstr "" #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "" #: installer_caption msgid "Edit project installer script" msgstr "" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "" #: installer_authors msgid "Autors:" msgstr "" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "" #: installer_files msgid "Files to be copied:" msgstr "" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "" #: installer_files_available msgid "Available files" msgstr "" #: installer_files_selected msgid "Selected files" msgstr "" #: installer_files_add msgid ">> add >>" msgstr "" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "" #: installer_files_remove msgid "<< remove <<" msgstr "" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "" #: installer_button msgid "Launch button" msgstr "" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "" #: installer_button_project msgid "Main project:" msgstr "" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "" #: installer_button_icon msgid "Icon:" msgstr "" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" #: applet_page_full msgid "Full-page applet" msgstr "" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "" #: edit_text_align_left msgid "Align text left" msgstr "" #: edit_text_align_center msgid "Center text" msgstr "" #: edit_text_align_right msgid "Align text right" msgstr "" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "" #: edit_text_act_content msgid "Content" msgstr "" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "" #: edit_cell_size msgid "Cell size:" msgstr "" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "" #: edit_media_refreshAll msgid "Update all media content" msgstr "" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "" #: edit_media_refreshAll_keys msgid "R*" msgstr "" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "" #: edit_media_exportAll msgid "Export all media" msgstr "" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "" #: edit_media_exportAll_keys msgid "X*" msgstr "" #: edit_shape_select msgid "Select" msgstr "" #: edit_shape_addPoint msgid "Add point" msgstr "" #: edit_shape_deletePoint msgid "Delete" msgstr "" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "" #: edit_shape_toLine msgid "Convert to line" msgstr "" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "" #: edit_shape_rLeft msgid "Rotate left" msgstr "" #: edit_shape_rRight msgid "Rotate right" msgstr "" #: edit_shape_expand msgid "Expand" msgstr "" #: edit_shape_contract msgid "Contract" msgstr "" #: edit_shape_zoomIn msgid "Zoom in" msgstr "" #: edit_shape_zoomOut msgid "Zoom out" msgstr "" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "" #: edit_shape_showPoints msgid "Show points" msgstr "" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "" #: edit_shape_gridSize msgid "Grid size:" msgstr "" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "" #: edit_shape_elements msgid "Defined elements" msgstr "" #: edit_shape_elemName msgid "Name of the selected element" msgstr "" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "" #: edit_mc_sequence msgid "Sequence:" msgstr "" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "" #: edit_mc_project msgid "Project:" msgstr "" #: edit_mc_activity_selection msgid "Choose activity" msgstr "" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "" #: edit_act_arrowColor msgid "Arrow color:" msgstr "" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" #: edit_act_editActivity msgid "Edit..." msgstr "" #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "" #: action_saveFileAs_caption msgid "Save as..." msgstr "" #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "" #: edit_act_behavior_drag msgid "Drag objects" msgstr "" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "" #: edit_act_behavior_order msgid "Check solving order" msgstr "" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "" #: edit_act_scramble msgid "Scramble" msgstr "" #: action_importActivities_caption msgid "Import activities..." msgstr "" #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" #: import_importing msgid "Importing..." msgstr "" #: import_checkdep msgid "Checking dependencies..." msgstr "" #: import_impmedia msgid "Importing media\\:" msgstr "" #: import_impact msgid "Importing activity\\:" msgstr "" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "" #: edit_tagRep_tags msgid "Tag marks" msgstr "" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "" #: edit_tagRep_file msgid "File" msgstr "" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" #: edit_tagRep_charset msgid "Charset\\:" msgstr "" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "" #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "" #: edit_tagRep_title msgid "Tag replacing" msgstr "" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "" #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" #: img_max_size msgid "Maximum size of images:" msgstr "" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "" #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "" #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_vec.po000066400000000000000000002424111335566474600236000ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2010-06-01 17:57+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "Descrision" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "Nòme de ƚa atività" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "Nòme:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "Descrision de ƚa atività" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "Reports" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "Includi sta atività inte i reports" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "Includi i rexultadi de sta atività inte i reports utente" #: edit_act_code msgid "Code:" msgstr "Còdexe:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "Còdexe opsional par grupar e sercar inte 'l database de i reports." #: edit_act_reportActions msgid "Report user actions" msgstr "Asion utente report" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "Registra i detali de tute ƚe asion fate da i utenti" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "Contadori" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "Conta tenpo" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "Mostra/scondi el conta tenpo" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "Contador de tentadivi" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "Mostra/scondi el contador de tentadivi" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "Contador de pontexio" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "Mostra/scondi el contador de pontexio" #: edit_act_maxTime msgid "Max time:" msgstr "Tenpo màsimo:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "" "Tenpo màsimo par resòlver ƚa atività, in secondi, o 0 se tenpo sensa lìmite." #: edit_act_countdown msgid "Countdown" msgstr "Conta a indrìo" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "El contador el parte da 'l vaƚor màsimo, a caƚando fin 0." #: edit_act_maxActions msgid "Max tries:" msgstr "Màsimo tentadivi:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "" "Nùmaro màsimo de tentadivi consentìi, o 0 par tentadivi sensa lìmite." #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "Botoni" #: edit_act_helpBtn msgid "Help" msgstr "Àida" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "Mostra/scondi el boton de àida" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "Mostra soƚusion" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "Mostra sto mesajo" #: edit_act_infoBtn msgid "Information" msgstr "Informasion" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "Mostra/scondi el boton de informasion" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "Mostra sto URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "Exègui sto comando:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "" "Indriso de sito web da mostrar co se clica so 'l boton de informasion" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "Command line da exeguir co se clica so 'l boton de informasion" #: edit_act_mainWindow msgid "Main window:" msgstr "Fenèstra prensipal:" #: edit_act_gameWindow msgid "Game window:" msgstr "Fenèstra xiogo:" #: edit_act_margin msgid "Margin:" msgstr "Màrxine:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "Spassio orixontal e vertical fra i ogèti." #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "Coƚor de sfondro:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "Canbia el coƚor de sfondro." #: edit_gradient_startColor msgid "Start color:" msgstr "Coƚor a 'l invìo:" #: edit_gradient_endColor msgid "End color:" msgstr "Coƚor in ùltima:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "Seƚesion de 'l coƚor a 'l invìo" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "Seƚesion de 'l coƚor in ùltima" #: edit_gradient_cycles msgid "Cycles:" msgstr "Cicli:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "Nùmaro de repetision de ƚa sfumadura so ƚa superfisie coƚorada" #: edit_gradient_orientation msgid "Orientation:" msgstr "Orientasion:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "Orientasion de ƚa sfumadura, mexurada in grai so ƚa orixontal." #: edit_act_gradient msgid "Gradient:" msgstr "Sfumadura:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "Dòpara sfumadura de coƚori" #: edit_color_opacity msgid "Opacity" msgstr "Opasità" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "Desernisi el vaƚor de 'l alpha channel (opasità) de 'l coƚor" #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "Sfumadura" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "Dòpara vaƚori preinpostài (gninte sfumadura)" #: edit_act_image msgid "Image:" msgstr "Imàxene:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "Descrision" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "Nòme e descrision" #: edit_act_tiledBgImg msgid "Tiled" msgstr "Repetesto" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "" "Coèrxi tuta ƚa superfisie co' ƚa imàxene, a repetìndoƚa drio i asi X e Y " "conforme che senghe vol." #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "Anteprima:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "Bordo" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "Fà na riga de bordo intorno ƚa imàxene" #: edit_act_transparent msgid "Transparent" msgstr "Trasparente" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "Ƚa fenèstra a gà el sfondro trasparente" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "Larghesa:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "Altesa:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "Larghesa de 'l ogèto, mexurada in pixels." #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "Altesa de 'l ogèto, mexurada in pixels." #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "In mèxo" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "" "El ogèto el vegnarà inte 'l ponto median de ƚa larghesa de ƚa fenèstra" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X:" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "Poxision orixontal asoƚuta" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y:" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "Poxision vertical asoƚuta" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "Interfacia utente" #: edit_act_image_tooltip msgid "Select an image" msgstr "Desernisi na imàxene" #: edit_act_text msgid "Text:" msgstr "Tèsto:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "Tèsto da mostrar indrento sto ogèto" #: edit_font_face msgid "Typeface:" msgstr "Faciavista caràtere" #: edit_font_size msgid "Size:" msgstr "Dimension:" #: edit_font_bold msgid "Bold" msgstr "Graseto" #: edit_font_italic msgid "Italic" msgstr "Corsivo" #: edit_font_underline msgid "Underline" msgstr "Sotolinià" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "Stil:" #: edit_cell_title msgid "Cell contents" msgstr "Contenudo caxèƚe" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "Mesaji" #: edit_act_msg_initial msgid "Initial message:" msgstr "Mesajo in prinsipio:" #: edit_act_msg_final msgid "Final message:" msgstr "Mesajo in ùltima:" #: edit_act_msg_prev msgid "Previous message:" msgstr "Mesajo presedente:" #: edit_act_msg_error msgid "Error message:" msgstr "Mesajo de eror:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "Mesajo da mostrar co se invia ƚa atività" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "Mesajo da mostrar co se fenise ƚa atività" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "Mesajo da mostrar co se fenise ƚa atività co' erori" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "" "Mesajo da mostrar inanso de 'l invìo de l'atività (nòma che in calche " "segnato de atività)." #: edit_align msgid "Align:" msgstr "Inriga:" #: edit_act_textColor msgid "Text color:" msgstr "Coƚor de 'l tèsto:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "Coƚor doparà par scrìvar el tèsto" #: edit_act_shadowColor msgid "Shadow color:" msgstr "Coƚor de ónbrixamento:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "" "Coƚor doparà par mostrar el onbrixamento de 'l tèsto (co xé posìbiƚe)" #: edit_act_shadow msgid "Shadow" msgstr "Onbra" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "Scrivi el tèsto onbrixà" #: edit_act_borderColor msgid "Border color:" msgstr "Coƚor de 'l bordo:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "Coƚor doparà par i bordi de ƚe caxèƚe" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "Coƚor par stato inativo" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "Coƚor doparà co ƚa caxèƚa ƚa xé dexativada" #: edit_act_altColor msgid "Alternative color:" msgstr "Coƚor alternadivo:" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "" "Coƚor doparà par scrìvar el contenudo alternadivo inte ƚe caxèƚe resolveste." #: edit_cell_marked msgid "Marked" msgstr "Evidensià" #: edit_cell_disabled msgid "Disabled" msgstr "Dexabiƚità" #: edit_cell_alt msgid "Alternative" msgstr "Alternadivo" #: edit_cell_textMargin msgid "Internal margin:" msgstr "màrxine intèrno:" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "Spasio fra bordo de ƚa caxèƚa e tèsto." #: edit_cell_borderWidth msgid "Border width:" msgstr "Larghesa bordo:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "Larghesa de 'l segno doparà par far el bordo" #: edit_cell_markerWidth msgid "Marker width:" msgstr "Larghexa de 'l marcador:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "" "Larghesa de 'l segno doparà par far el bordo co ƚa caxèƚa ƚa xé evidensiada " "o desernìa" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "Anterpima in stato \"alternadivo\"" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "Anterpima in stato \"dexativà\"" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "Anterpima in stato \"evidensà\"" #: edit_act_testAction msgid "Preview activity" msgstr "Anteprima atività" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "Anteprima e prova de ƚa atività" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "Descrision" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "Tìtoƚo e descrision de ƚa atività" #: edit_act_panels_options msgid "Options" msgstr "Opsion" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "Opsion de ƚa atività" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "Fenèstra" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "Faciavista, dimension e poxision de ƚa fenèstra de atività" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "Mesaji" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "Contenudo de i mesaji de ƚa atività" #: edit_act_panels_panel msgid "Panel" msgstr "Panèƚo" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "Contenudi de 'l panèƚo" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "Stil" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "Inpòsta i coƚori de ƚe caxèƚe, el font e ƚa dimension" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "Stil:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "Inpedisi che el tèsto el soramonte ƚa imàxene" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "Proa a inpedir che el tèsto el soramonte ƚa imàxene" #: edit_media_exists_1 msgid "The file" msgstr "El file" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "el existe xà inte ƚa librerìa de i media!" #: edit_act_shaper msgid "Shaper:" msgstr "Shaper:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "Eror de 'l shaper:" #: edit_act_num_cols msgid "Columns:" msgstr "Coƚòne:" #: edit_act_num_rows msgid "Rows:" msgstr "Righe:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "Altesa de 'l dente:" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "Larghesa de 'l dente:" #: edit_act_toothRandom msgid "Random distribution" msgstr "Destribusion a caxo" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "Propietà de 'l shaper" #: edit_act_panels_text msgid "Text" msgstr "Tèsto" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "Tèsto de l'atività" #: action_saveFile_caption msgid "Save..." msgstr "Salva..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "Salva el proxèto corente" #: action_docTree_caption msgid "Document tree..." msgstr "Àlbaro de 'l documento..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "Mostra el documento de 'l proxèto fà un àlbaro" #: edit_docTree_title msgid "Document tree" msgstr "Àlbaro de 'l documento" #: edit_media_referencedBy msgid "Referenced by:" msgstr "Referensià da:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "Atension:

Sto proxèto el gà " "indrentto altri proxèti.
Vusto esplorar i link e cargar tuti i files " "reƚativi?

(Se conseja de respónder se se xé drio inportar " "atività de Clic 3.0)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "Tipo:" #: edit_mc_type_unknown msgid "Unknown" msgstr "Desconosesto" #: edit_mc_type_sound msgid "Play sound" msgstr "Invìa sonòro" #: edit_mc_type_video msgid "Play video" msgstr "Invìa video" #: edit_mc_type_midi msgid "Play MIDI" msgstr "Invìa MIDI" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "Invìa CD audio" #: edit_mc_type_record msgid "Record sound" msgstr "Rejistra sonòro" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "Invìa sonòro rejistrà" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "Và a atività" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "Và a secuensa" #: edit_mc_type_run_external msgid "Run program" msgstr "Invìa programa" #: edit_mc_type_url msgid "Show URL" msgstr "Mostra URL" #: edit_mc_type_exit msgid "End" msgstr "Sòrti" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "Torna a programa" #: edit_mc_level msgid "Priority level:" msgstr "Livèƚo de priorità:" #: edit_mc_file msgid "File:" msgstr "File:" #: edit_mc_externalParam msgid "Parameters:" msgstr "Paràmetri:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "Da:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "A:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "Longhesa màsima:" #: edit_mc_recBuffer msgid "Record tape:" msgstr "Rejistrador:" #: edit_mc_stretch msgid "Stretch size" msgstr "Destira dimension" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "Poxision:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "Da:" #: edit_mc_location_from_box msgid "Cell" msgstr "Caxèƚa" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "Fenèstra" #: edit_mc_location_from_frame msgid "Frame" msgstr "Frame" #: edit_mc_loop msgid "Loop playback" msgstr "Repetision contìnua" #: edit_mc_autostart msgid "Auto start" msgstr "Invìa da to pòsta" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "Catura el mouse" #: edit_mc_title msgid "Multimedia and active content" msgstr "Contenudo miltimedial e ativo" #: edit_mc_label msgid "Active content:" msgstr "Contenudo ativo:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "Seƚesion ogèto multimedial" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "Librerìa multimedia" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "Inte ƚa caxèƚa in mèxo" #: edit_mc_pos_window msgid "Centered over window" msgstr "Inte ƚa fenèstra in mèxo" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "Spesìfega poxision" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "Strututa o dati de 'l àlbaro no corèti!" #: edit_act_panels_controls msgid "Controls" msgstr "Contròƚi" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "Opsion par botoni e contadori" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "Tipo:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "Dispoxision grèƚa:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "Poxision reƚativa de i panèƚi A e B." #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "Resoƚusion invertìa" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "" "Ƚa atività ƚa xé resolvesta co tuti i elementi asegnài de \"B\" i conbina." #: edit_act_showAllArrows msgid "Show all arrows" msgstr "Mostra tute ƚe frece" #: edit_act_alt msgid "Alternative content:" msgstr "Contenudo alternadivo:" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "Contenudo mostrà inte ƚe caxèƚe resolveste e no-asegnàe." #: edit_act_alt_toggle msgid "ALT" msgstr "ALT" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "Modìfega el contenudo alternadivo" #: edit_act_grid msgid "Grid" msgstr "Grèƚa" #: edit_act_grid_A msgid "Grid A" msgstr "Grèƚa A" #: edit_act_grid_B msgid "Grid B" msgstr "Grèƚa B" #: edit_act_grid_layout msgid "Layout" msgstr "Despoxision" #: edit_act_grid_relationship msgid "Relationship" msgstr "Rapòrttoo" #: edit_seq_activity_header msgid "activity" msgstr "atività" #: edit_seq_tag_header msgid "tag" msgstr "tag" #: edit_seq_jump_header msgid "jump to" msgstr "salta a" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "Atività:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "Ticheta:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "Descrision:" #: edit_seq_auto msgid "Move on automatically" msgstr "Va vanti da to pòsta" #: edit_seq_delay msgid "Delay:" msgstr "Retardo:" #: edit_seq_action_fwd msgid "Go forward" msgstr "Và vanti" #: edit_seq_action_back msgid "Go bak" msgstr "Và indrìo" #: edit_seq_action_jump msgid "Jump to..." msgstr "Salta a..." #: edit_seq_action_stop msgid "Stop" msgstr "Stop" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "Torna a programa" #: edit_seq_action_exit msgid "Exit JClic" msgstr "Sòrti da JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "Frecia invanti:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "Frecia indrìo:" #: edit_seq_action msgid "Action:" msgstr "Asion:" #: edit_seq_button_enabled msgid "Show button" msgstr "Mostra boton" #: edit_seq_project msgid "JClic Project:" msgstr "Proxèto JClic" #: edit_act_absolute msgid "Absolute position" msgstr "Poxision asoƚuta" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "'L ogèto el vegnarà poxisionà so ƚe coordinade X e Y spesifegàe" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "Poxision:" #: edit_seq_newElement msgid "New sequence element..." msgstr "Elemento niovo de secuensa..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "Inserisi naltro elementointe ƚa secuensa de atività" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "Desernisi na atività par 'll elemento niovo de secuensa." #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "No se pol inviar un elemento de secuensa niovo sensa atività!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "" "Sto proxèto no 'l gà atività! No se pol inviar lementi de atività inte un " "proxèto vodo." #: edit_seq_jump_msg msgid "Jump target:" msgstr "Obietivo de 'l salto:" #: edit_seq_jump_title msgid "Jump target" msgstr "Obietivo de 'l salto" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "Xonta atività niova a proxèto" #: edit_act_prompt_class msgid "Type of activity:" msgstr "Tipo de atività:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "Nòme" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "Desernisi el tipo de atività par prodùxerla e darghe un nòme:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "Te gà da desernir un tipo de atività!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "Te gà da spesifegar un nòme par sta atività!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "No se pol inviar ƚa atività!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Nòme de ƚa Java class:" #: edit_text_act_format msgid "Format" msgstr "Formato" #: edit_text_act_answer msgid "Answer" msgstr "Respòsta" #: edit_text_act_popup msgid "Pop up" msgstr "Pop up" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "Respòste vàƚide:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "Xonta naltro elemento de lista" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "Modìfega el lemento de lista desernìo" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "Scansèƚa el elemento de lista desernìo" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "Sposta in suxo" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "Spòsta in xoxo" #: edit_list_newValue msgid "New text:" msgstr "Tèsto niovo:" #: edit_list_addElement msgid "Add new list element" msgstr "Xonta elemento de lista niovo" #: edit_list_modifyValue msgid "Modify selected text" msgstr "Modìfega el tèsto seƚesionà" #: edit_text_act_target msgid "Target" msgstr "Obietivo" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "Longhesa màsima:" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "Nùmaro de caràteri màsimo inte ƚa respòsta." #: edit_text_act_fillingChar msgid "Filling character" msgstr "Caràtere de inpenimento" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "Caràtere doparà par indicar el mancante" #: edit_text_act_iniLen msgid "Initial length:" msgstr "Longhesa in partensa:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "" "Nùmaro de caràteri de inpenimento che i vegnarà mostrài co scominsia ƚa " "atività." #: edit_text_act_iniText msgid "Initial text:" msgstr "Tèsto in patensa:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "Tèsto mostrà inte 'l mancante co scominsia na atività." #: edit_text_act_list msgid "Show a list of options:" msgstr "Mostra na lista de alternadive:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "" "Mostra na lista de alternadive da cui el utente el gà da desernìrghene una." #: edit_text_act_check_title msgid "Correction options" msgstr "Opsion de coresion" #: edit_text_act_popup_no msgid "No pop up" msgstr "No pop up" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "Manda popup da to pòsta" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "Popup in caxo de eror" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "Popup co' F1" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "Tipo:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "Retardo popup:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "Tenpo màsimo:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "Nòma che sonòro" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "" "Te gà da desernir na porsion de tèsto par far un target de tèsto niovo!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "" "El tèsto target no 'l pol ver drento né ritorni de paràgrafo né tavèƚe." #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "I target no i pol ser ignarà!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "I targets no i pol ver drento caxèƚe!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "Coƚor carta:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "Modìfega stili de 'l documento..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "Stil primario:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "Spasio tavèƚa:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "Spasi fra i delimitadori de tavèƚa:" #: edit_text_act_colors msgid "Colors:" msgstr "Coƚori:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "Coƚori taget:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "Coƚori erori:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "Anteprima:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "Tèsto standard" #: edit_text_act_styleSample_target msgid "target" msgstr "target" #: edit_text_act_styleSample_error msgid "error" msgstr "eror" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "tèsto standard" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "tèsto standard" #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "" "Atension: sta asion ƚa cavarà via el target seƚesionà. Vusto nar vanti?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "Schermada presedente..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "No stà mostrar nisun tèsto inanso de inviar ƚa atività" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "mostra tuto el tèsto de 'l exercisio" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "Mostra sto tèsto:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "Tenpo màsimo:" #: edit_text_act_edit_target msgid "Target..." msgstr "Target..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "Mostra boton de coresion" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "Tèsto de 'l boton:" #: edit_text_act_checkCase msgid "Match case" msgstr "Consìdera majùscoƚo/minùscoƚo" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "Consìdera acenti e caràteri particoƚari" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "Consìdera segni de pontexadura" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "Consenti spasi repetesti" #: edit_text_act_checkOptions msgid "Criteria" msgstr "Criteri" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "Spòstite a 'l target dapò co se ƚo inpenise" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "Spòstite nòma che co' se indovina poƚito" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "Mostra erori létara par létara" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "Paràmetri de 'l algoritmo de nàƚixe" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "Pasi:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "Canpo de esplorasion:" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "Contròƚo" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "Nàƚixe respòsta" #: edit_text_act_check_bt msgid "Correction..." msgstr "Coresion..." #: edit_text_act_checkButton msgid "Correction button" msgstr "Boton coresion" #: edit_text_act_checkProgress msgid "Progress" msgstr "Progrèso" #: edit_text_act_typeBtn msgid "Type..." msgstr "Tipo" #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "Ordenamento paràgrafi" #: edit_text_act_orderWords msgid "Order words" msgstr "Ordenamento paròƚe" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "Insenbra paròƚe fra i paràgrafi" #: edit_text_act_type_title msgid "Activity type" msgstr "Tipo de atività" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "Sta asion ƚa snetarà tuti i target existenti. Vusto nar vanti?" #: edit_text_act_identWords msgid "Identify words" msgstr "Identìfega paròƚe" #: edit_text_act_identChars msgid "Identify characters" msgstr "Identìfega caràteri" #: edit_media_change_name msgid "Change name..." msgstr "Canbia nòme..." #: edit_media_change_file msgid "Change file..." msgstr "Canbia file..." #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "Salva inte file xip" #: edit_media_type msgid "Media type:" msgstr "Tipo de media:" #: edit_media_size msgid "File size:" msgstr "Dimension de 'l file:" #: edit_media_show_type msgid "Files of type:" msgstr "Files de tipo:" #: edit_media_preview msgid "Preview media" msgstr "Anteprima multimedia" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "Anteprima resorsa multimedial" #: edit_media_rename msgid "Change resource name" msgstr "Cànbieghe nòme a resorsa" #: edit_media_rename_title msgid "Rename" msgstr "Renòma" #: edit_media_rename_prompt msgid "New name:" msgstr "Nòme niovo:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "Nòme resorsa no vàƚido!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "" "Ghe xé naltra resorsa co' sto nòme! Ògni resorsa ƚa gà da ver un nòme suo." #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "File no vàƚido!" #: err_media_chfile_different msgid "File must be of same type" msgstr "El file el gà da èsar de 'l steso tipo" #: edit_media_font_error msgid "Unable to load font!" msgstr "No se pol cargar le font!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "Salva el file (despacheta da zip)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "Axorna contenudo multimedial da file" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "" "Cuesto no 'l xé un file \"real\", ma un ogèto logà inte un contenidor zip. " "Par far sta fatura, gà da èsarghe un file co'l steso nòme inte ƚa cartèƚa " "indove che ghe xé logà el file zip." #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "Atività" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "Secuense" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "Librerìa multimedia" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "Gestisi imàxine e altri files multimedia doparài inte 'l proxèto" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "Produxi e modìfega atività de proxèto" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "Modìfega e produxi secuense de atività" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "Tìtoƚo:" #: edit_project_title_tooltip msgid "Project's title" msgstr "Tìtoƚo de 'l proxèto" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "Proxèto" #: edit_project_tooltip msgid "Edit project properties" msgstr "Modìfega propietà de 'l proxèto" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "Descrision:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "Descrision xeneral de 'l proxèto" #: edit_project_area msgid "Areas:" msgstr "Àree" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "Àree curicolari de 'l proxèto" #: edit_project_level msgid "Levels:" msgstr "Livèƚi:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "Livèƚi formadivi de 'l proxèto" #: edit_project_descriptors msgid "Descriptors:" msgstr "Descritori:" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "Descritori de 'l proxèto (separài da vìrgoƚa)" #: edit_project_languages msgid "Languages:" msgstr "Lengue:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "Lengue doparàe inte 'l proxèto" #: edit_project_languages_modify msgid "Change the selected language" msgstr "Canbia ƚa lengua seƚesionada" #: edit_project_languages_add msgid "Add language" msgstr "Xonta lengua" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "Còdexi de lengua ISO-639" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "Autori:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "Persone partesipante inte ƚa produsion de 'l proxèto." #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "Nòme:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_author_rol msgid "Rol:" msgstr "Ròƚo:" #: edit_project_author_organization msgid "Organization:" msgstr "Organexasion:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "Comenti:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "Nòme de 'l autor (richièsto)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "Email de 'l autor (facoltadivo)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "" "Ròƚo de ƚa persona inte 'l proxèto: atuor, coƚaborante, dexegni, sonòri.. " "(facoltadivo)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "Scòƚa, università, sociasion, organexasion... (facoltadivo)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "Pàxena web personal (facoltadivo)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "Canpo par altre infirmasion (facoltadivo)" #: edit_project_author_info msgid "Author info:" msgstr "Informasion autor:" #: edit_project_author_add msgid "Add author to list" msgstr "Xonta autor a lista" #: edit_project_author_edit msgid "Edit author info" msgstr "Modìfega informasion autor" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "Nòme:" #: edit_project_org_name_tooltip msgid "School name" msgstr "Nòme scòƚa" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "e-mail:" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "indriso e-mail de ƚa scòƚa" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "Sito web de ƚa scòƚa" #: edit_project_org_address msgid "Address:" msgstr "indriso:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "Indriso de pòsta tradisional" #: edit_project_org_pc msgid "PC:" msgstr "CP:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "Còdexe postal" #: edit_project_org_city msgid "City:" msgstr "Sità:" #: edit_project_org_city_tooltip msgid "School city" msgstr "Sità de ƚa scòƚa" #: edit_project_org_country msgid "Country:" msgstr "Paexe:" #: edit_project_org_state msgid "State:" msgstr "Stato:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "Comenti:" #: edit_project_org msgid "School/s:" msgstr "Scòƚa/e:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "Scòƚa o altre istitusion coinvòlte inte 'l proxèto" #: edit_project_org_info msgid "Organization info:" msgstr "Informasion organexasion:" #: edit_project_org_add msgid "Add organization" msgstr "Xonta organexasion" #: edit_project_org_edit msgid "Edit organization data" msgstr "Modìfega dati organexasion" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "Paexe, federasion, union..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "Stato federal, comunità, rexion..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "Altre informasion..." #: edit_project_rev_date msgid "Date:" msgstr "Data:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "Data de revixion" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "Autori:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "Autori de ƚa revixion" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "Descrision:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "Descrision brève de i canbiamenti fati" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "Comenti:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "Altre informasion riƚevante:" #: edit_project_rev msgid "Revisions:" msgstr "Revixion:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "Stòrego de ƚe modifegasion primarie fate a 'l proxèto" #: edit_project_rev_add msgid "Add revision record" msgstr "Xonta record revixion" #: edit_project_rev_edit msgid "Edit revision record" msgstr "Modìfega record revixion" #: edit_project_rev_info msgid "Revision data" msgstr "Dati revixion" #: edit_media_objects msgid "objects" msgstr "ogèti" #: edit_media_object msgid "object" msgstr "ogèto" #: edit_evsounds_start msgid "Start of activity:" msgstr "Invìo de ƚa atività:" #: edit_evsounds_click msgid "Click on object:" msgstr "Clica so 'l ogèto:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "Asion sbaliada:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "Corèxi asion:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "Atività terminada co' erori:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "Atività terminada poƚito:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "Eror: el canpo de descrision no 'l pol ser ƚasà vodo!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "Modìfega sonòri de evento" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "Sonòri de evento:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Inpòsta sonòri spesìfeghi par ògni evento JClic" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "Sonòri de evento:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "Inpòsta sonòri spesìfeghi par ògni evento JClic" #: edit_evsounds_default msgid "default sound" msgstr "sonòro predefinìo" #: edit_evsounds_disabled msgid "disabled" msgstr "dexativà" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "Ativa o dexativa el sonòro par sto evento" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "" "Clica par desernir el sonòro par sto evento, desponta par doparar el sonòro " "predefinìo" #: action_newProject_caption msgid "New project..." msgstr "Proxèto niovo..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "Invìa un proxèto JClic niovo" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "Da:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "Vaƚor mìnimo de 'l operador" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "A:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "Vaƚor màsimo de 'l operador" #: edit_arith_op_with msgid "With:" msgstr "Co':" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "Se spontà, el operador el pol ver anca sto vaƚor" #: edit_arith_op_fromList msgid "One from the list:" msgstr "Uno da ƚa lista:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "Lista de vaƚori posìbiƚi par 'l operador" #: edit_arith_op_decimals msgid "Decimals:" msgstr "Desimaƚi:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "Nùmaro de desimaƚi de l operando" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (intièro)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "Primo operando" #: edit_arith_secondOp msgid "Second operand" msgstr "Secondo operando" #: edit_arith_title msgid "Arith2 for JClic" msgstr "Arith2 par JClic" #: edit_arith_operations msgid "Operations:" msgstr "Operasion:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "Desernisi el tipo de operasion da far" #: edit_arith_operations_plus msgid "Plus" msgstr "Pì" #: edit_arith_operations_minus msgid "Minus" msgstr "Manco" #: edit_arith_operations_multiply msgid "Multiply" msgstr "Via" #: edit_arith_operations_divide msgid "Divide" msgstr "Divixo" #: edit_arith_unknown msgid "Unknown:" msgstr "Desconosesto:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "Seƚesiona el elemento che el farà da desconosesto" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "El rexultado el xé el desconosesto" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "El secondo operador el xé el desconosesto" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "El primo operador el xé el desconosesto" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "Ƚa operasion ƚa xé el desconosesto" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "Scrivi el rexultado in prinsipio de ƚa espresion" #: edit_arith_result msgid "Result:" msgstr "Rexultado:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "No sta reportar" #: edit_arith_result_random msgid "Random" msgstr "A caxo" #: edit_arith_result_asc msgid "Ascending" msgstr "In crésar" #: edit_arith_result_order msgid "Order by result:" msgstr "Meti in órdene par rexultado:" #: edit_arith_result_desc msgid "Descending" msgstr "In caƚar" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "Èvita dopioni" #: edit_arith_cond msgid "Conditions:" msgstr "Condision:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "Indifarente" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "El primo operador el gà da èsar pì grando de 'l secondo" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "El primo operador el gà da èsar pì pìcoƚo de 'l secondo" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "Altre condision" #: edit_autocp msgid "Automatic content generator:" msgstr "Xenerador de contenudo" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "Seƚesiona el xenerador de contenudo par sta atività." #: edit_autocp_block msgid "Content generator" msgstr "Xenerador de contenudo" #: edit_autocp_btn msgid "Settings..." msgstr "Inpostasion..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "Confegura ƚe inpostasion de 'l provider de contenudi" #: edit_data msgid "Edit data" msgstr "Modìfega dati" #: edit_act msgid "Activity edit" msgstr "Modìfega de l'atività" #: edit_acp msgid "Content provider edit" msgstr "Modìfega de 'l provider de contenudi" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "Ghe xé stà un eror a produxendo el provider de contenudi!" #: edit_project_author_group msgid "Creation" msgstr "Produsion" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "Descrision" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "Interfacia utente" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "Descrision:" #: m_Edit msgid "Edit" msgstr "Modìfega" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "Atività niova..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "Inserisi" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "Vedi" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "Proxèto" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "Modìfega inpostasion de 'l proxèto" #: action_editMedia_caption msgid "Media" msgstr "multimedia" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "Modìfega ƚa librerìa de multimedia d e'l poxèto" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "Atività" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "Modìfega ƚe atività" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "Secuense" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "Modìfega ƚe secuense de ƚe atività" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "El proxèto corente el xé stà modifegà. Vusto salvar i canbiamenti?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "Descritori" #: edit_media_new msgid "New media object..." msgstr "Ogèto miltimedianiovo..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "Xonta naltra imàxene o ogèto multimedia a ƚa librerìa" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "Lìmite pontexio:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "Fà cusita co el pontexio global el xé conpagno o pì alto de..." #: edit_seq_time msgid "Time threshold:" msgstr "Lìmite de tenpo:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "" "Par far cusita, el tenpo spexo inte ƚe atività el gà da èsar manco de..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "Fà cusita co el pontexio global el xé manco de..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "Fà cusita co el tenpo spexo inte ƚe atività el xé pì de..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "Salti condisionài" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "Inpòsta salti particoƚari da végner fati nòma che a sèrte condision" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "Inpòsta condision par saltar a un livèƚo pì desora" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "Salto in xoxo:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "Salto in suxo:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "Inpòsta ƚe condision par saltar a un livèƚo pì in xoxo" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "Asion asegnada a 'l boton \"vanti\"" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "Asion asegnada a 'l boton \"indrìo\"" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "Inpòsta el obietivo de 'l salto" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "Asion da far" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "Atività asegnada a sto elemento de secuensa" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "" "Tag doparà par referensiar sto elemento de secuensa (canpo facoltadivo)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "Descrision de 'l elemento de secuensa (canpo facoltadivo)" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "Ativa o dexativa el boton frecia" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "Và vanti da to pòsta co fenise ƚa atività" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "Secondi da spetar inanso de nar vanti da to pòsta" #: edit_color_dlgTitle msgid "Select color" msgstr "Desernisi coƚor" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "Prègo, spèta mentre che se rinòma ƚa resorsa..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "Larghesa:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "Larghesa caxèƚa (in pixels)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "Altesa:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "Altesa caxèƚa (in pixels)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "Paròƚe sconte:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "Lista de ƚe paròƚe sconte indrento el panèƚo" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "Dòpara panèƚo B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "" "I contenudi de 'l secondo panèƚo i vengarà mostrài pena che vien catà ƚe " "paròƚe" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "Desernisi el tipo de shaper da doparar inte 'l panèƚo" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "Nùmaro de coƚòne d e'l panèƚo" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "Nùmaro de righe de 'l panèƚo" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "Delimitadori trasparenti" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "Trata i delimitadori (cuadri negri) fà buxi trasparenti" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "Smisiamenti\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "Nùmaro de vòlte da smisiar" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "Còpia i atribudi in..." #: edit_act_copy_attributes msgid "Attributes" msgstr "Atribudi" #: edit_act_copy_dest msgid "Apply to:" msgstr "Àplica a:" #: edit_act_copy_style_main msgid "Main window" msgstr "Fenèstra primaria" #: edit_act_copy_style_play msgid "Play window" msgstr "Fenèstra de execusion" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "Atività da modifegar:" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "Còpia atribudi" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "Còpia i atribudi de ƚa atività corente inte altre atività" #: edit_new_project_name msgid "Project name:" msgstr "Nòme proxèto:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "Nòme curto, descritivo de 'l proxèto" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "Nòme de 'l file" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "Nòme de 'l file de proxèto, sensa estension" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "Cartèƚa:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "Nòme d eƚa cartèƚa indove che xé salvà el proxèto" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "Esplòra..." #: edit_new_project_title msgid "Create new JClic project" msgstr "Invìa un proxèto JClic niovo" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "Eror: Proxèto, file e cartèƚa i gà da ver nòmi vàƚidi, no vodi." #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "Sta cartèƚa ƚa gà xà drento un proxèto Clic 3.0 o Jclic. Par no far " "confuxion, xé mèjo de tegnir ògni proxèto inte cartèƚe separàe, ma no ƚa xé " "na riègoƚa fisa. Vusto dabon prodùxer un proxèto niovo inte sta cartèƚa?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "Eror: no se pol prodùxer ƚa cartèƚa spesifegada!" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "" "Eror: No xé stà seƚesionà atività! Par doparar sta funsion te gà da desernir " "inte ƚa lista ƚa atività o ƚe atività a cui i atribudi indicài i vegnarà " "aplicài." #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "Drio copiar i atribudi in:" #: edit_act_copy_margin msgid "Margin" msgstr "Màrxene" #: edit_act_copy_bgColor msgid "Background color" msgstr "Coƚor de sfondro" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "Sfumadura" #: edit_act_copy_bgImage msgid "Background image" msgstr "Imàxene de sfondro" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "Bordo" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "Sfondro trasparente" #: edit_act_copy_position msgid "Position" msgstr "Poxision" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "Mesaxi" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "Stil de 'l mesajo de invìo" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "Stil de mesajo de concluxion" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "Stil de mesajo de eror" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "Reports" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "Includi atività in reports" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "Rejistra ƚe asion" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "Interfacia utente" #: edit_act_copy_skin msgid "Skin" msgstr "Skin" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "Sonòri de i eventi" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "Contadori" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "Conta tenpo" #: edit_act_copy_maxTime msgid "Max. time" msgstr "Tenpo màsimo" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "Contador de tentadivi" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "Màsimo tentadivi" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "Contador de pontexio" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "Cuantità de smisiamenti" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "Botoni" #: edit_act_copy_btnHelp msgid "Help button" msgstr "Boton de àida" #: edit_act_copy_btnInfo msgid "Information button" msgstr "Boton de informasion" #: edit_act_copy_grids msgid "Grids" msgstr "Grèƚe" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "Stil de ƚa grèƚa A" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "Stil de ƚa grèƚa B" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "Stil de ƚe grèƚe de tèsto" #: edit_act_copy_text msgid "Text activities" msgstr "Atività de tèsto" #: edit_act_copy_fontFace msgid "Font face" msgstr "Tipo font" #: edit_act_copy_fontSize msgid "Font size" msgstr "Dimension font" #: edit_act_copy_fontStyle msgid "Font style" msgstr "Stil font" #: edit_act_copy_textColour msgid "Main text colour" msgstr "Coƚor tèsto primario" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "Desernisi el proxèto JClic de cui vegnarà inportà ƚe atività" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "Coƚor erori" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Spasio tabuƚasion" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "Stil de 'l mesajo presedente" #: edit_act_changeType msgid "Change activity type" msgstr "Canbia tipo de atività" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "" "Nòme intièro de ƚa clase da doparar par costruir ƚa atività (utenti espèrti!)" #: edit_act_newActivity_other msgid "Other..." msgstr "Altro..." #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "I utenti avansài i pol anca inpostar atività de JClic no registràe. Scrivi " "cuà soto el nòme de clase intièro, prefisà da 'l pacheto (come " "\"com.acme.activities.FooActivity\"). Ƚe clase de atività ƚe gà da esténdar " "edu.xtec.jclic.Activity, e ƚe gà da ser acesìbiƚe da parte de 'l " "cargador de class de ƚa JVM." #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "Nòme de l'atività:" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "Ògni atività ƚa gà da ver un nòme ùgnoƚo inte 'l proxèto" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

Atension: " "Canbiarghe nòme a ƚa atività pol cauxar ƚa pèrdita de calchedun de i " "atribudi e ogèti de ƚa atività corente. Dòpara co' " "prudensa!

 

" #: applet_codebase msgid "Location of JClic code:" msgstr "Poxision de 'l còdexe JClic:" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "URL che el ponta a na cartèƚa co' i files e i scripts de JClic." #: applet_prev_text msgid "HTML code before:" msgstr "Còdexe HTML prima de:" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "Tèsto o còdexe HTML da métar prima de ƚa applet" #: applet_post_text msgid "HTML code after:" msgstr "Còdexe HTML dapò:" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "Tèsto o còdexe HTML da métar dapò ƚa applet" #: applet_size msgid "Applet size:" msgstr "Dimension de ƚa applet:" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "Larghesa e altesa de l'applet, in vaƚori asoƚuti o parsentuaƚi." #: applet_page_title msgid "Page title:" msgstr "Tìtoƚo de ƚa pàxena:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "Tèsto da mostrar insima a ƚa fenèstra de 'l navegador" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "Ƚa pàxena web \"%s\" ƚa xé stada prodota poƚito." #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "Vusto vèxarla co 'l navegador?" #: action_createHTML_caption msgid "Create web page..." msgstr "Produsion pàxena web..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "Produsion de na pàxena HTML co' na applet JClic" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "Produxi na pàxena HTML co' na applet co ' drento el proxèto corente" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "Nòme de 'l file" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "Nòme de l file HTML da prodùxer" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "Applet" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "Vaƚori preinpostài doparài inte ƚa produsion de pàxene web" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "Coƚor de sfondro:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "Coƚor de sfondro de ƚa pàxena HTML" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "Mèdio" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "Poxisiona ƚa applet in poxixion mèdio orixontal" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "Larghesa applet (asoƚuto o parsentual)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "Altesa applet (asoƚuto o parsentual)" #: applet_exitUrl msgid "On exit, go to:" msgstr "In insida, và a:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "URL indove mandar el navegador co se và fora da JClic" #: applet_infoFrame msgid "Info frame name:" msgstr "Nòme frame informasion:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "" "Nòme d e'l frame doparà par mostrar el contenudo reƚativo a 'l boton \"info\"" #: action_createInstaller_caption msgid "Create project installer..." msgstr "Produxi istaƚador de proxèto" #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "Produxi un script de un istaƚador de proxèto par el JClic player" #: installer_caption msgid "Edit project installer script" msgstr "Modìfega script de un istaƚador de proxèto" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "Tìtoƚo:" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "Tìtoƚo de 'l proxèto, da mostrar inte ƚa guida de auto istaƚasion" #: installer_authors msgid "Autors:" msgstr "Autori:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "Autor(i) de 'l proxèto (tèsto curto)" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "Cartèƚa:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "Nòme de ƚa cartèƚa che ƚa guida de auto istaƚasion ƚa gà da suxerir" #: installer_files msgid "Files to be copied:" msgstr "Files da copiar:" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "Files che 'l istaƚador el gà da copiar" #: installer_files_available msgid "Available files" msgstr "Files disponìbiƚi" #: installer_files_selected msgid "Selected files" msgstr "Files seƚesionài" #: installer_files_add msgid ">> add >>" msgstr ">> xonta >>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "Xonta el file desernìo a ƚa lista" #: installer_files_remove msgid "<< remove <<" msgstr "<< cava via <<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "Cava via el file desernìo da ƚa lista" #: installer_button msgid "Launch button" msgstr "Boton de invìo" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "Propietà de 'l boton da mostrar inte ƚa librerìa proxèti" #: installer_button_project msgid "Main project:" msgstr "Proxèto primario:" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "Proxèto JClic che se invìa a clicando so 'l boton" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "Ticheta:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "Ticheta de tèsto curto, da mostrar indrento el boton" #: installer_button_icon msgid "Icon:" msgstr "Icona:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "" "Imàxene da doparar fà boton. Ƚasa vodo se te vol doparar ƚa icona " "preinpostada de JClic." #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "Descrision" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "Suxerimento da mostrar co l boton" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "Eror: manca tìtoƚo proxèto" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "Eror: manca tìtoƚo nòme cartèa" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "Eror: no xé stà desernìo files" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "Eror: manca ticheta de tèsto de 'l boton de invìo" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "" "Eror: el proxèto asegnà a 'l boton de invìo no 'l xé inte ƚa lista de i " "files da copiar" #: applet_page_full msgid "Full-page applet" msgstr "Applet a pàxena intièra" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "Applet co' dimension precixe" #: edit_text_align_left msgid "Align text left" msgstr "Inriga tèsto a sanca" #: edit_text_align_center msgid "Center text" msgstr "Inriga tèsto in mèxo" #: edit_text_align_right msgid "Align text right" msgstr "Inriga tèsto a drèta" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "Produxi o scansèƚa target" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "Inserisi na caxèƚa" #: edit_text_act_content msgid "Content" msgstr "Contenudo" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "Stil" #: edit_cell_size msgid "Cell size:" msgstr "Dimension caxèƚa:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "" "Ƚe atività soto no ƚe xé mai prexenti inte nisuna de ƚe secuense de ƚe " "atività de proxèto, siché no ƚe vegnarà mai mostràe:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "" "I ogèti multimedia seguenti no i xé doparài diretamente inte nisuna atività:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "Vusto xontarli a ƚa fin de ƚa ùltima secuensa de atività?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "Vusto scanseƚarli?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "Remosion de i ogèti multimedia no doparài" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "Atività òrfene" #: edit_media_refreshAll msgid "Update all media content" msgstr "Axorna tuto el contenudo multimedia" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "Axorna tuti i ogèti multimedia a ricargando i so files" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "Drio axornar i multimedia" #: edit_media_exportAll msgid "Export all media" msgstr "Espòrta tuti i multimedia" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "Salva inte un file el contenudo de tuti i elementi multimedia" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "Desernisi" #: edit_shape_addPoint msgid "Add point" msgstr "Xonta ponto" #: edit_shape_deletePoint msgid "Delete" msgstr "Eƚìmina" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "Dixegna retàngoƚo" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "Dixegna elise" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "Dixegna poƚìgono" #: edit_shape_toLine msgid "Convert to line" msgstr "Converti in riga" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "Convèrti inte na curva BEzier" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "Convèrti inte ne curva cuadràtega" #: edit_shape_rLeft msgid "Rotate left" msgstr "Xira a sanca" #: edit_shape_rRight msgid "Rotate right" msgstr "Xira a drèta" #: edit_shape_expand msgid "Expand" msgstr "Espandi" #: edit_shape_contract msgid "Contract" msgstr "Conprimi" #: edit_shape_zoomIn msgid "Zoom in" msgstr "Zoom in" #: edit_shape_zoomOut msgid "Zoom out" msgstr "Zoom out" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "Unisi i ponti pì darente" #: edit_shape_showPoints msgid "Show points" msgstr "Mostra i ponti" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "Mostra/scondi i ponti" #: edit_shape_gridSize msgid "Grid size:" msgstr "Dimension de ƚa grèƚa:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "Mostra/scondi grèƚa" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "Anpiesa magnète" #: edit_shape_elements msgid "Defined elements" msgstr "Elementi definìi" #: edit_shape_elemName msgid "Name of the selected element" msgstr "Nòme de 'l elemento desernìo" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "Larghesa de l'sion de 'l magnète, co 'l xé ativà" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "Dimension de ƚa grèƚa" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "Atività:" #: edit_mc_sequence msgid "Sequence:" msgstr "Secuensa:" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "URL:" #: edit_mc_project msgid "Project:" msgstr "Projèto:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "Desernisi atività" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "Desernisi secuensa" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "Dati insuficenti!" #: edit_act_arrowColor msgid "Arrow color:" msgstr "Coƚor frecia:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "" "Coƚor doparà da 'l editor par dixegnar ƚe frece (no precixamente, parché " "vien doparà na màscara XOR)" #: edit_act_editActivity msgid "Edit..." msgstr "Modìfega..." #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "Modìfega ƚa atività seƚesionada" #: action_saveFileAs_caption msgid "Save as..." msgstr "Salva cofà..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "Salva el proxèto corente co' naltro nòme" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "Conportamento" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "Conportamento" #: edit_act_behavior_drag msgid "Drag objects" msgstr "Strasina ogèti" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "Strasina i ogèti invense de doparar na riga par métarli in reƚasion" #: edit_act_behavior_order msgid "Check solving order" msgstr "Contròƚa el órdene de soƚusion" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "Ƚe caxèƚe ƚe gà da èsar resolveste in órdene" #: edit_act_scramble msgid "Scramble" msgstr "Insenbra" #: action_importActivities_caption msgid "Import activities..." msgstr "Inpòrta atività..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "Inpòrta atività da naltro proxèto" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "" "El file desernìo el coresponde a 'l proxèto corente. Se pol inportar atività " "nòma che da proxèti difarenti. Desernisi naltro file de proxèto." #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "" "Desernisi na, o pì de na, atività da inportar inte 'l proxèto corente\\:" #: import_importing msgid "Importing..." msgstr "Drio inportar..." #: import_checkdep msgid "Checking dependencies..." msgstr "Drio verifegar ƚe dipendense..." #: import_impmedia msgid "Importing media\\:" msgstr "Drio inportar multimedia\\:" #: import_impact msgid "Importing activity\\:" msgstr "Drio inportar atività\\:" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "Desernisi el proxèto JClic de cui se inportarà ƚe atività" #: edit_tagRep_tags msgid "Tag marks" msgstr "Marcatori tag" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "Marcador de partensa\\:" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "Marcador doparà in prinsipio de i tags" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "Marcador final\\:" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "Marcador doparà in final de i tags" #: edit_tagRep_file msgid "File" msgstr "File" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "File o URL\\:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "" "Nòme o URL de 'l file che el gà indrento i vaƚori che i sostituirà i tags" #: edit_tagRep_charset msgid "Charset\\:" msgstr "Charset\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "Codìfega caràteri doparada inte 'l file" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "Esplòra..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "Esplòra el filesystem" #: edit_tagRep_title msgid "Tag replacing" msgstr "Sostitusion tag" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "Sneta stili de tèsto..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "" "Atension\\: sta fatura ƚa snetarà i atribusi spesìfeghi de i caràteri " "aplicài a 'l documento, repristinando el so stil primario. Sta fatura no ƚa " "pol ser restorada. Vusto farlo?" #: img_max_size msgid "Maximum size of images:" msgstr "Dimension màsima de ƚe imàxene:" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "Larghesa màsima de ƚe imàxene inportàe inte ƚa librerìa multimedia." #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "Altesa màsima de ƚe imàxene inportàe inte ƚa librerìa multimedia." #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "" "Ƚa imàxene \"%s\" ƚa gà na dimension de $s pixels. Cuesto el sùpera el " "màsimo consentìo da JClic Author (%a). Vusto redimensionarla?" i18n/fromLaunchpad/po/jclic-author/AuthorMessages_zh_TW.po000066400000000000000000002271521335566474600240630ustar00rootroot00000000000000# Traditional Chinese translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-01-13 23:10+0200\n" "PO-Revision-Date: 2014-04-09 16:31+0000\n" "Last-Translator: Po-Hsu Lin \n" "Language-Team: Traditional Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic Author messages #: edit_act_description_block msgctxt "edit_act_description_block" msgid "Description" msgstr "描述:" #: edit_act_name_tooltip msgid "Name of the activity" msgstr "活動名稱" #: edit_act_name msgctxt "edit_act_name" msgid "Name:" msgstr "名稱:" #: edit_act_description_tooltip msgid "Description of the activity" msgstr "活動說明" #: edit_act_reports_block msgctxt "edit_act_reports_block" msgid "Reports" msgstr "報告" #: edit_act_includeInReports msgid "Include this activity in reports" msgstr "將活動列入報告" #: edit_act_includeInReports_tooltip msgid "Include the results of this activity in users' reports" msgstr "將活動結果列入使用者的報告" #: edit_act_code msgid "Code:" msgstr "編碼:" #: edit_act_code_tooltip msgid "Optional code used to group and search in the reports database." msgstr "團體中可選的程式和在報告數據中搜尋" #: edit_act_reportActions msgid "Report user actions" msgstr "回報使用者的動作" #: edit_act_reportActions_tooltip msgid "Register the details of all the actions performed by users" msgstr "註冊所有使用者製作的活動的細目" #: edit_act_counters_block msgctxt "edit_act_counters_block" msgid "Counters" msgstr "計數器" #: edit_act_timeCounter msgctxt "edit_act_timeCounter" msgid "Time counter" msgstr "計時器" #: edit_act_timeCounter_tooltip msgid "Show/hide the time conter" msgstr "顯示/隱藏 計時器" #: edit_act_actionsCounter msgctxt "edit_act_actionsCounter" msgid "Tries counter" msgstr "嘗試計數器" #: edit_act_actionsCounter_tooltip msgid "Show/hide the tries counter" msgstr "顯示/隱藏嘗試倒數" #: edit_act_scoreCounter msgctxt "edit_act_scoreCounter" msgid "Score counter" msgstr "積分" #: edit_act_scoreCounter_tooltip msgid "Show/hide the score counter." msgstr "顯示/隱藏 積分" #: edit_act_maxTime msgid "Max time:" msgstr "最長時間:" #: edit_act_maxTime_tooltip msgid "" "Maximum time to to solve the activity, in seconds, or 0 for unlimited time." msgstr "解決活動所需最多時間(秒),範圍從0到無限大" #: edit_act_countdown msgid "Countdown" msgstr "倒數計時" #: edit_act_countdown_tooltip msgid "The counter starts at máximum value, decreasing to 0." msgstr "計時器從最大值倒數到0。" #: edit_act_maxActions msgid "Max tries:" msgstr "最多嘗試次數:" #: edit_act_maxActions_tooltip msgid "Maximum number of tries allowed, or 0 for unlimited tries." msgstr "最多可嘗試次數,或者無限制則填寫0。" #: edit_act_buttons_block msgctxt "edit_act_buttons_block" msgid "Buttons" msgstr "按鈕" #: edit_act_helpBtn msgid "Help" msgstr "幫助" #: edit_act_helpBtn_tooltip msgid "Show/hide help button" msgstr "顯示/隱藏 按鈕" #: edit_act_helpBtn_solution msgid "Show solution" msgstr "顯示答案" #: edit_act_helpBtn_msg msgid "Show this message:" msgstr "顯示訊息:" #: edit_act_infoBtn msgid "Information" msgstr "資訊" #: edit_act_infoBtn_tooltip msgid "Show/Hide the button of information" msgstr "顯示/隱藏底部資訊" #: edit_act_infoBtn_url msgid "Show this URL:" msgstr "顯示URL:" #: edit_act_infoBtn_cmd msgid "Execute this command:" msgstr "執行這個指令:" #: edit_act_infoBtn_url_tooltip msgid "Web site address to show when click on the info button" msgstr "點選這個按鈕顯示網址" #: edit_act_infoBtn_cmd_tooltip msgid "Command line to be executed on click to the info button." msgstr "點選這個按鈕以執行命令列" #: edit_act_mainWindow msgid "Main window:" msgstr "主畫面" #: edit_act_gameWindow msgid "Game window:" msgstr "遊戲視窗:" #: edit_act_margin msgid "Margin:" msgstr "邊界:" #: edit_act_margin_tooltip msgid "Horizontal and vertical spacing between visual objects." msgstr "水平及垂直空間在可見物件間。" #: edit_act_bgColor msgctxt "edit_act_bgColor" msgid "Background color:" msgstr "背景顏色:" #: edit_act_bgColor_tooltip msgid "Change the background color." msgstr "改變背景顏色。" #: edit_gradient_startColor msgid "Start color:" msgstr "開始顏色:" #: edit_gradient_endColor msgid "End color:" msgstr "結束顏色:" #: edit_gradient_startColor_tooltip msgid "Selection of the start color" msgstr "選擇開始的顏色" #: edit_gradient_endColor_tooltip msgid "Selection of the end color" msgstr "選擇結束的顏色" #: edit_gradient_cycles msgid "Cycles:" msgstr "循環:" #: edit_gradient_cycles_tooltip msgid "Number of repetitions of the gradient over the paint surface" msgstr "油漆表面梯度地位" #: edit_gradient_orientation msgid "Orientation:" msgstr "方向:" #: edit_gradient_orientation_tooltip msgid "Gradient's orientation, measured in degrees over the horizontal" msgstr "垂直梯度取向" #: edit_act_gradient msgid "Gradient:" msgstr "漸層:" #: edit_act_gradient_tooltip msgid "Use gradient of colours" msgstr "使用漸層顏色" #: edit_color_opacity msgid "Opacity" msgstr "不透明" #: edit_color_opacity_tooltip msgid "Set the color's alpha channel (opacity) value." msgstr "設定色彩透明度" #: edit_gradient_title msgctxt "edit_gradient_title" msgid "Gradient" msgstr "漸層" #: edit_gradient_default msgid "Use default values (null gradient)" msgstr "使用預設值(空漸層)" #: edit_act_image msgid "Image:" msgstr "影像:" #: edit_act_descriptionTab msgctxt "edit_act_descriptionTab" msgid "Description" msgstr "描述" #: edit_act_descriptionTab_tooltip msgid "Name and description" msgstr "名稱及描述" #: edit_act_tiledBgImg msgid "Tiled" msgstr "拼貼" #: edit_act_tiledBgImg_tooltip msgid "" "Paint all the surface with the image, repeating it along the X and Y axis as " "needed." msgstr "圖片整面重複" #: edit_act_preview msgctxt "edit_act_preview" msgid "Preview:" msgstr "預覽:" #: edit_act_border msgctxt "edit_act_border" msgid "Border" msgstr "邊框" #: edit_act_border_tooltip msgid "Draw a line border arround the window" msgstr "視窗四周畫上邊框" #: edit_act_transparent msgid "Transparent" msgstr "透明" #: edit_act_transparent_tooltip msgid "Window has transparent background" msgstr "視窗有透明背景" #: edit_act_width msgctxt "edit_act_width" msgid "Width:" msgstr "寬度:" #: edit_act_height msgctxt "edit_act_height" msgid "Height:" msgstr "高度:" #: edit_act_width_tooltip msgid "Width of the object, measured in pixels" msgstr "物件的寬度(像素)" #: edit_act_height_tooltip msgid "Height of the object, measured in pixels" msgstr "物件的高度(像素)" #: edit_act_centered msgctxt "edit_act_centered" msgid "Centered" msgstr "置中" #: edit_act_centered_tooltip msgid "The object will be centered over the main window" msgstr "物件置中" #: edit_act_x msgctxt "edit_act_x" msgid "X:" msgstr "X軸" #: edit_act_x_tooltip msgid "Absolute horizontal location" msgstr "絕對水平位置" #: edit_act_y msgctxt "edit_act_y" msgid "Y:" msgstr "Y軸" #: edit_act_y_tooltip msgid "Absolute vertical location" msgstr "絕對垂直位置" #: edit_act_ui_block msgctxt "edit_act_ui_block" msgid "User interface" msgstr "使用者介面" #: edit_act_image_tooltip msgid "Select an image" msgstr "選擇圖片" #: edit_act_text msgid "Text:" msgstr "文字:" #: edit_act_text_tooltip msgid "Text to be shown inside this object" msgstr "物件中顯示的文字" #: edit_font_face msgid "Typeface:" msgstr "文字" #: edit_font_size msgid "Size:" msgstr "大小:" #: edit_font_bold msgid "Bold" msgstr "粗體" #: edit_font_italic msgid "Italic" msgstr "斜體" #: edit_font_underline msgid "Underline" msgstr "底線" #: edit_font_style msgctxt "edit_font_style" msgid "Style:" msgstr "樣式:" #: edit_cell_title msgid "Cell contents" msgstr "儲存格內容" #: edit_act_messages msgctxt "edit_act_messages" msgid "Messages" msgstr "訊息" #: edit_act_msg_initial msgid "Initial message:" msgstr "開始訊息" #: edit_act_msg_final msgid "Final message:" msgstr "完成訊息" #: edit_act_msg_prev msgid "Previous message:" msgstr "前一則訊息" #: edit_act_msg_error msgid "Error message:" msgstr "錯誤訊息:" #: edit_act_msg_initial_tooltip msgid "Message to be shown when the activity starts" msgstr "動作開始顯示的文字" #: edit_act_msg_final_tooltip msgid "Message to be shown when the activity is finished" msgstr "動作結束後出現的訊息" #: edit_act_msg_error_tooltip msgid "Message to be shown when the activity ends with errors" msgstr "動作結束錯誤時出現的訊息" #: edit_act_msg_prev_tooltip msgid "" "Message to be shown prior to the start of the activity (only in certain " "types of activities)" msgstr "優先於動作前出現的訊息(只對特定動作)" #: edit_align msgid "Align:" msgstr "對齊" #: edit_act_textColor msgid "Text color:" msgstr "文字顏色:" #: edit_act_textColor_tooltip msgid "Color used to draw text" msgstr "文字前景色彩" #: edit_act_shadowColor msgid "Shadow color:" msgstr "陰影顏色:" #: edit_act_shadowColor_tooltip msgid "Color used for drawing the text's shadow, when appliable" msgstr "文字背景色彩" #: edit_act_shadow msgid "Shadow" msgstr "陰影" #: edit_act_shadow_tooltip msgid "Draw text with shadow" msgstr "文字陰影" #: edit_act_borderColor msgid "Border color:" msgstr "邊框顏色:" #: edit_act_borderColor_tooltip msgid "Color used to draw the cell's border" msgstr "格子邊框的顏色" #: edit_act_inactiveColor msgid "Inactive state color:" msgstr "未動作形態時的顏色" #: edit_act_inactiveColor_tooltip msgid "Color used when the cell is disabled" msgstr "當格子被禁用的顏色" #: edit_act_altColor msgid "Alternative color:" msgstr "替代顏色" #: edit_act_altColor_tooltip msgid "Color used to draw the alternative content in solved cells." msgstr "顏色用於繪製在已解決單元內的替代內容" #: edit_cell_marked msgid "Marked" msgstr "標記" #: edit_cell_disabled msgid "Disabled" msgstr "已停用" #: edit_cell_alt msgid "Alternative" msgstr "替代" #: edit_cell_textMargin msgid "Internal margin:" msgstr "內框" #: edit_cell_textMargin_tooltip msgid "Amount of space between cell's border and text." msgstr "物件外框與文字間的間距" #: edit_cell_borderWidth msgid "Border width:" msgstr "邊框寬度:" #: edit_cell_borderWidth_tooltip msgid "Width of the stroke used to draw the standard border" msgstr "一般格子邊框寬度" #: edit_cell_markerWidth msgid "Marker width:" msgstr "標記的寬度:" #: edit_cell_markerWidth_tooltip msgid "" "Width of the stroke used to draw the border when the cell is marked or " "selected" msgstr "筆劃寬度來繪製已被標記的單元或選擇時的邊界" #: edit_cell_alt_tooltip msgid "Preview in \"alternative\" state" msgstr "“其他”的狀態中預覽" #: edit_cell_disabled_tooltip msgid "Preview in \"disabled\" state" msgstr "預覽\"禁用\"狀態" #: edit_cell_marked_tooltip msgid "Preview in \"marked\" state" msgstr "預覽“標記”狀態" #: edit_act_testAction msgid "Preview activity" msgstr "預覧" #: edit_act_testAction_tooltip msgid "Preview and test the activity" msgstr "套用" #: edit_act_panels_description msgctxt "edit_act_panels_description" msgid "Description" msgstr "描述:" #: edit_act_panels_description_tooltip msgid "Title and description of the activity" msgstr "動作的標題與說明" #: edit_act_panels_options msgid "Options" msgstr "選項" #: edit_act_panels_options_tooltip msgid "Options of the activity" msgstr "動作選項" #: edit_act_panels_frame msgctxt "edit_act_panels_frame" msgid "Window" msgstr "視窗" #: edit_act_panels_frame_tooltip msgid "Aspect, size and position of the activity window" msgstr "活動窗口的界面、大小與位置" #: edit_act_panels_messages msgctxt "edit_act_panels_messages" msgid "Messages" msgstr "訊息" #: edit_act_panels_messages_tooltip msgid "Content of the activity messages" msgstr "動作的訊息內容" #: edit_act_panels_panel msgid "Panel" msgstr "面板" #: edit_act_panels_panel_tooltip msgid "Contents of the panel" msgstr "面板內容" #: edit_style_title msgctxt "edit_style_title" msgid "Style" msgstr "款式" #: edit_style_tooltip msgid "Set the cells color, font and size" msgstr "設置格子的顏色、字體與大小" #: edit_act_style msgctxt "edit_act_style" msgid "Style:" msgstr "風格:" #: edit_act_overlap msgid "Avoid text overlap image" msgstr "避免文字與圖片重疊" #: edit_act_overlap_tooltip msgid "Try to avoid text overlapping over image" msgstr "嘗試避免文字覆蓋圖片" #: edit_media_exists_1 msgid "The file" msgstr "檔案" #: edit_media_exists_2 msgid "already exists in the media library!" msgstr "已存在於媒體庫" #: edit_act_shaper msgid "Shaper:" msgstr "造形機:" #: edit_act_shaper_err msgid "Shaper error:" msgstr "造形機發生錯誤:" #: edit_act_num_cols msgid "Columns:" msgstr "欄:" #: edit_act_num_rows msgid "Rows:" msgstr "列:" #: edit_act_toothHeightFactor msgid "Tooth height:" msgstr "齒高" #: edit_act_toothWidthFactor msgid "Tooth width:" msgstr "齒寬" #: edit_act_toothRandom msgid "Random distribution" msgstr "隨機分配" #: edit_act_shaper_properties msgid "Shaper properties" msgstr "造型機的屬性:" #: edit_act_panels_text msgid "Text" msgstr "文字:" #: edit_act_panels_text_tooltip msgid "Text of the activity" msgstr "動作內容" #: action_saveFile_caption msgid "Save..." msgstr "儲存..." #: action_saveFile_keys msgctxt "action_saveFile_keys" msgid "SS" msgstr "SS" #: action_saveFile_tooltip msgid "Save the current project" msgstr "儲存目前專案" #: action_docTree_caption msgid "Document tree..." msgstr "文件樹狀結構..." #: action_docTree_keys msgid "T*" msgstr "T*" #: action_docTree_tooltip msgid "Show the project's document as a tree" msgstr "用樹狀結構展示項目文件" #: edit_docTree_title msgid "Document tree" msgstr "文件列表" #: edit_media_referencedBy msgid "Referenced by:" msgstr "參照於:" #: msg_prompt_loadReferences msgid "" "Warning:

This project " "connects with other projects.
Do you want to explore the links and to " "load all the related files?

(It's advisable to answer YES when " "importing Clic 3.0 activities)" msgstr "" "html>注意:

這個項目與其他項目有連結
您是否要查看該鏈接與加載所有相關文件?

(我們建議您選擇 " " 當您輸入Clic 3.0的活動)" #: edit_mc_type msgctxt "edit_mc_type" msgid "Type:" msgstr "類型:" #: edit_mc_type_unknown msgid "Unknown" msgstr "不明" #: edit_mc_type_sound msgid "Play sound" msgstr "播放音效" #: edit_mc_type_video msgid "Play video" msgstr "播放影片" #: edit_mc_type_midi msgid "Play MIDI" msgstr "播放MIDI檔" #: edit_mc_type_cdaudio msgid "Play CD audio" msgstr "播放CD音樂" #: edit_mc_type_record msgid "Record sound" msgstr "錄音" #: edit_mc_type_play_recorded msgid "Play recorded sound" msgstr "播放已錄製聲音" #: edit_mc_type_run_activity msgid "Go to activity" msgstr "跳到活動" #: edit_mc_type_run_sequence msgid "Go to sequence" msgstr "跳到序列" #: edit_mc_type_run_external msgid "Run program" msgstr "執行程式" #: edit_mc_type_url msgid "Show URL" msgstr "顯示 URL" #: edit_mc_type_exit msgid "End" msgstr "結束" #: edit_mc_type_return msgctxt "edit_mc_type_return" msgid "Return" msgstr "回傳" #: edit_mc_level msgid "Priority level:" msgstr "優先順序" #: edit_mc_file msgid "File:" msgstr "檔案:" #: edit_mc_externalParam msgid "Parameters:" msgstr "參數:" #: edit_mc_from msgctxt "edit_mc_from" msgid "From:" msgstr "來自:" #: edit_mc_to msgctxt "edit_mc_to" msgid "To:" msgstr "到:" #: edit_mc_length msgctxt "edit_mc_length" msgid "Max. length:" msgstr "最大長度" #: edit_mc_recBuffer msgid "Record tape:" msgstr "記錄帶" #: edit_mc_stretch msgid "Stretch size" msgstr "伸縮大小" #: edit_mc_location msgctxt "edit_mc_location" msgid "Location:" msgstr "位置:" #: edit_mc_location_x msgctxt "edit_mc_location_x" msgid "X:" msgstr "X:" #: edit_mc_location_y msgctxt "edit_mc_location_y" msgid "Y:" msgstr "Y:" #: edit_mc_location_from msgctxt "edit_mc_location_from" msgid "From:" msgstr "來自:" #: edit_mc_location_from_box msgid "Cell" msgstr "儲存格" #: edit_mc_location_from_window msgctxt "edit_mc_location_from_window" msgid "Window" msgstr "視窗" #: edit_mc_location_from_frame msgid "Frame" msgstr "框架" #: edit_mc_loop msgid "Loop playback" msgstr "重複播放" #: edit_mc_autostart msgid "Auto start" msgstr "自動開始" #: edit_mc_catchmouse msgid "Catch mouse" msgstr "跟踪鼠標" #: edit_mc_title msgid "Multimedia and active content" msgstr "多媒體活動內容" #: edit_mc_label msgid "Active content:" msgstr "活動內容:" #: edit_media_dlg_title msgid "Multimedia object selection" msgstr "多媒體物件選項" #: edit_media_title msgctxt "edit_media_title" msgid "Media library" msgstr "媒體庫" #: edit_mc_pos_cell msgid "Centered over cell" msgstr "置中於儲存格" #: edit_mc_pos_window msgid "Centered over window" msgstr "置中與視窗" #: edit_mc_pos_absolute msgid "Specify position:" msgstr "特定的位置:" #: edit_tree_badFormat msgid "Incorrect tree structure or data!" msgstr "樹狀結構或資料不正確!" #: edit_act_panels_controls msgid "Controls" msgstr "操控介面" #: edit_act_panels_controls_tooltip msgid "Options for buttons and counters" msgstr "計數器和按紐選項" #: edit_act_class msgctxt "edit_act_class" msgid "Type:" msgstr "類型:" #: edit_act_gridLayout msgid "Grid layout:" msgstr "網格佈局:" #: edit_act_gridLayout_tooltip msgid "Relative postion of the panels A and B." msgstr "面板A與B的相對位置" #: edit_act_inverseResolution msgid "Inverse resolution" msgstr "相反的決議" #: edit_act_inverseResolution_tooltip msgid "" "The activity is solved when all assigned elements of \"B\" are matched." msgstr "當\"B\"的所有指定的元素皆被分配則活動已完成" #: edit_act_showAllArrows msgid "Show all arrows" msgstr "顯示所有箭頭" #: edit_act_alt msgid "Alternative content:" msgstr "替代的內文" #: edit_act_alt_tooltip msgid "Content shown in solved cells and non-assigned cells." msgstr "已解決的單元和未被分配的單元中顯示的內容" #: edit_act_alt_toggle msgid "ALT" msgstr "ALT鍵" #: edit_act_alt_toggle_tooltip msgid "Edit the alternative content" msgstr "編輯替代的內文" #: edit_act_grid msgid "Grid" msgstr "網格" #: edit_act_grid_A msgid "Grid A" msgstr "格線A" #: edit_act_grid_B msgid "Grid B" msgstr "格線B" #: edit_act_grid_layout msgid "Layout" msgstr "版面配置" #: edit_act_grid_relationship msgid "Relationship" msgstr "關係" #: edit_seq_activity_header msgid "activity" msgstr "活動" #: edit_seq_tag_header msgid "tag" msgstr "標籤" #: edit_seq_jump_header msgid "jump to" msgstr "跳至" #: edit_seq_activity msgctxt "edit_seq_activity" msgid "Activity:" msgstr "活動:" #: edit_seq_tag msgctxt "edit_seq_tag" msgid "Label:" msgstr "標籤:" #: edit_seq_description msgctxt "edit_seq_description" msgid "Description:" msgstr "描述:" #: edit_seq_auto msgid "Move on automatically" msgstr "自動前進" #: edit_seq_delay msgid "Delay:" msgstr "延遲:" #: edit_seq_action_fwd msgid "Go forward" msgstr "往前" #: edit_seq_action_back msgid "Go bak" msgstr "退後" #: edit_seq_action_jump msgid "Jump to..." msgstr "跳至" #: edit_seq_action_stop msgid "Stop" msgstr "暫停進程" #: edit_seq_action_return msgctxt "edit_seq_action_return" msgid "Return" msgstr "返回" #: edit_seq_action_exit msgid "Exit JClic" msgstr "離開JClic" #: edit_seq_arrow_fwd msgid "Forward arrow:" msgstr "前進箭頭:" #: edit_seq_arrow_back msgid "Back arrow:" msgstr "後退箭頭:" #: edit_seq_action msgid "Action:" msgstr "動作:" #: edit_seq_button_enabled msgid "Show button" msgstr "顯示按鈕" #: edit_seq_project msgid "JClic Project:" msgstr "JClic 專案:" #: edit_act_absolute msgid "Absolute position" msgstr "絕對位置" #: edit_act_absolute_tooltip msgid "The object will be placed at the specified X and Y co-ordinates" msgstr "該物體將被放置在指定的X和Y坐標" #: edit_act_location msgctxt "edit_act_location" msgid "Location:" msgstr "位置:" #: edit_seq_newElement msgid "New sequence element..." msgstr "新的序列元素..." #: edit_seq_newElement_tooltip msgid "Insert a new element into the activity sequence" msgstr "活動序列中插入一個新元素" #: edit_seq_newElement_msg msgid "Please select an activity for the new sequence element." msgstr "請選擇一個新的序列元素的活動。" #: edit_seq_newElement_error_noAct msgid "Cannot create a new sequence element without activity!" msgstr "沒有活動,不能創建一個新的序列的元素!" #: edit_seq_newElement_error_emptyList msgid "" "This project has no activities! Unable to create sequence elements in an " "empty project." msgstr "這個項目有沒有活動!無法在空的專案內創建序列元素。" #: edit_seq_jump_msg msgid "Jump target:" msgstr "跳轉的目標:" #: edit_seq_jump_title msgid "Jump target" msgstr "跳轉的目標" #: edit_act_newActivity_tooltip msgid "Add a new activity to project" msgstr "在專案內新增一個新的活動" #: edit_act_prompt_class msgid "Type of activity:" msgstr "活動型態:" #: edit_act_prompt_name msgctxt "edit_act_prompt_name" msgid "Name:" msgstr "名稱:" #: edit_act_newActivity_msg msgid "Please select the type of activity to create and give it a name:" msgstr "請選擇活動型態並將它命名:" #: edit_act_newActivity_error_noAct msgid "You must select an activity type!" msgstr "你必須選擇一個活動的型態!" #: edit_act_newActivity_error_noName msgid "You must especify a name for the activity!" msgstr "你必須給予活動一個明確的名稱!" #: edit_act_newActivity_error_creating msgid "Unable to create activity!" msgstr "無法創建新的活動!" #: edit_act_newActivity_class msgid "Java class name:" msgstr "Java類別的名稱:" #: edit_text_act_format msgid "Format" msgstr "格式化" #: edit_text_act_answer msgid "Answer" msgstr "答案" #: edit_text_act_popup msgid "Pop up" msgstr "彈出" #: edit_text_act_answer_label msgid "Valid answers:" msgstr "有效的答案:" #: edit_list_newElement_tooltip msgid "Add a new list element" msgstr "增加一個新的列表元素" #: edit_list_editElement_tooltip msgid "Edit the selected list element" msgstr "編輯已選取的列表元素" #: edit_list_deleteElement_tooltip msgid "Delete the selected list element" msgstr "刪除已選取的列表元素" #: edit_list_upBtn_tooltip msgid "Move up" msgstr "上移" #: edit_list_downBtn_tooltip msgid "Move down" msgstr "下移" #: edit_list_newValue msgid "New text:" msgstr "新的文字:" #: edit_list_addElement msgid "Add new list element" msgstr "增加新的列表元素" #: edit_list_modifyValue msgid "Modify selected text" msgstr "更改以選取的文字" #: edit_text_act_target msgid "Target" msgstr "目標" #: edit_text_act_maxLen msgctxt "edit_text_act_maxLen" msgid "Max. length:" msgstr "最大長度" #: edit_text_act_maxLen_tooltip msgid "Maximum amount of characters in the answer." msgstr "答案中的字元的最大數量。" #: edit_text_act_fillingChar msgid "Filling character" msgstr "填入的性質" #: edit_text_act_fillingChar_tooltip msgid "Character used to indicate the blank" msgstr "字符用來表示空白" #: edit_text_act_iniLen msgid "Initial length:" msgstr "初始長度:" #: edit_text_act_iniLen_tooltip msgid "" "Number of filling chars that will be displayed at the beginning of the " "activity." msgstr "將在活動開始顯示填入的字符數。" #: edit_text_act_iniText msgid "Initial text:" msgstr "初始文本:" #: edit_text_act_iniText_tooltip msgid "Text displayed in the blank at the beggining of the activity." msgstr "在活動的開始時將文字顯示在空白處" #: edit_text_act_list msgid "Show a list of options:" msgstr "顯示一個選項列表:" #: edit_text_act_list_tooltip msgid "Display a list of options from which the user must select one." msgstr "顯示一個選項列表,用戶必須選擇一個。" #: edit_text_act_check_title msgid "Correction options" msgstr "更正選項" #: edit_text_act_popup_no msgid "No pop up" msgstr "無彈出" #: edit_text_act_popup_always msgid "Pop up automatically" msgstr "自動彈出" #: edit_text_act_popup_onError msgid "Pop up in errors" msgstr "彈出錯誤" #: edit_text_act_popup_onDemand msgid "Pop up with F1" msgstr "按F1時彈出" #: edit_text_act_popup_type msgctxt "edit_text_act_popup_type" msgid "Type:" msgstr "類型:" #: edit_text_act_popup_delay msgid "Pop up delay:" msgstr "彈出延遲:" #: edit_text_act_popup_maxTime msgctxt "edit_text_act_popup_maxTime" msgid "Max. time:" msgstr "最大時間:" #: edit_text_act_popup_onlyPlay msgid "Sound only" msgstr "只允許聲音" #: edit_text_act_err_noSelection msgid "" "You must select a fragment of text in order to create a new text target!" msgstr "你必須選擇一個文字片段,以創建一個新的目標文字!" #: edit_text_act_err_badCharInSelection msgid "Target text cannot include paragraph returns nor tabs." msgstr "目標文本不能包含整段回報或是標籤。" #: edit_text_act_err_nestedTargets msgid "Targets cannot nest!" msgstr "目標無法巢狀!" #: edit_text_act_err_cellInTarget msgid "Targets cannot contain cells!" msgstr "目標不能包含單元!" #: edit_text_act_pageBgColor msgid "Paper colour:" msgstr "紙張顏色:" #: edit_text_act_editStylesBtn msgid "Edit document styles..." msgstr "編輯文件的樣式..." #: edit_text_act_mainStyle msgid "Main style:" msgstr "主要樣式:" #: edit_text_act_tabSpc msgid "Tab space:" msgstr "縮排空間:" #: edit_text_act_tabSize msgid "Spaces between tab marks:" msgstr "在被標記縮排之間的空間" #: edit_text_act_colors msgid "Colors:" msgstr "顏色:" #: edit_text_act_targetStyle msgid "Target colors:" msgstr "目標顏色:" #: edit_text_act_errorStyle msgid "Error colors:" msgstr "錯誤的顏色:" #: edit_text_act_preview msgctxt "edit_text_act_preview" msgid "Preview:" msgstr "預覽:" #: edit_text_act_styleSample_default_start msgid "Standard text" msgstr "標準文字" #: edit_text_act_styleSample_target msgid "target" msgstr "目標" #: edit_text_act_styleSample_error msgid "error" msgstr "發生錯誤" #: edit_text_act_styleSample_default_fill msgid "standard text" msgstr "標準文字" #: edit_text_act_styleSample_default_end msgid "standard text." msgstr "標準文字。" #: edit_text_act_warnDeleteTarget msgid "" "Warning: This action will supress the currently selected target. Do you want " "to proceed?" msgstr "警告:此操作將抑制當前選定的目標。你要繼續嗎?" #: edit_text_act_prevScreen_title msgid "Previous screen..." msgstr "前一個畫面..." #: edit_text_act_prevScreen_no msgid "Don't display any text before starting the activity" msgstr "活動開始之前,不顯示任何文本" #: edit_text_act_prevScreen_original msgid "Display the complete text of the exercise" msgstr "顯示這次題目的完整文本" #: edit_text_act_prevScreen_special msgid "Display this text:" msgstr "顯示這個文本:" #: edit_text_act_prevScreen_time msgctxt "edit_text_act_prevScreen_time" msgid "Max. time:" msgstr "最大時間:" #: edit_text_act_edit_target msgid "Target..." msgstr "目標..." #: edit_text_act_checkButton_show msgid "Show correction button" msgstr "顯示校正按鈕" #: edit_text_act_checkButtonText msgid "Button text:" msgstr "按鍵文字" #: edit_text_act_checkCase msgid "Match case" msgstr "符合條件" #: edit_text_act_checkAccents msgid "Consider accents and special characters" msgstr "考慮口音和特殊字母" #: edit_text_act_checkPunct msgid "Consider punctuation marks" msgstr "考慮標點符號" #: edit_text_act_checkDoubleSpc msgid "Allow repeated spaces" msgstr "允許重複的空格" #: edit_text_act_checkOptions msgid "Criteria" msgstr "標準" #: edit_text_act_checkAutoJump msgid "Move on to next target when filled in" msgstr "填寫後移動到下一個目標" #: edit_text_act_checkForceOk msgid "Move only after correct guess" msgstr "只有正確的猜測後移動" #: edit_text_act_checkDetail msgid "Indicate mistakes letter by letter" msgstr "逐字顯示錯誤" #: edit_text_act_checkDetail_params msgid "Analysis algorithm parameters:" msgstr "分析演算法參數" #: edit_text_act_checkDetail_steps msgid "Steps:" msgstr "步驟:" #: edit_text_act_checkDetail_field msgid "Exploration field:" msgstr "勘探領域" #: edit_text_act_defaultCheckButtonText msgid "Check" msgstr "核對" #: edit_text_act_advancedCorrectionOptions msgid "Answer analysis" msgstr "答案分析" #: edit_text_act_check_bt msgid "Correction..." msgstr "更正" #: edit_text_act_checkButton msgid "Correction button" msgstr "校正鈕" #: edit_text_act_checkProgress msgid "Progress" msgstr "進度" #: edit_text_act_typeBtn msgid "Type..." msgstr "類型" #: edit_text_act_orderParagraphs msgid "Order paragraphs" msgstr "階段" #: edit_text_act_orderWords msgid "Order words" msgstr "換句話說" #: edit_text_act_order_amongstPar msgid "Shuffle words amongst paragraphs" msgstr "在段落中的隨機詞" #: edit_text_act_type_title msgid "Activity type" msgstr "活動類型" #: edit_text_act_warnChangeType msgid "" "This action will clear all the existing targets. Do you want to proceed?" msgstr "此動作將清除所有現有的目標。繼續嗎?" #: edit_text_act_identWords msgid "Identify words" msgstr "識別字" #: edit_text_act_identChars msgid "Identify characters" msgstr "識別字元" #: edit_media_change_name msgid "Change name..." msgstr "更改名稱" #: edit_media_change_file msgid "Change file..." msgstr "更改文件" #: edit_media_includeInZip msgid "Save into ZIP file" msgstr "儲存至ZIP文件" #: edit_media_type msgid "Media type:" msgstr "媒體類型:" #: edit_media_size msgid "File size:" msgstr "檔案大小:" #: edit_media_show_type msgid "Files of type:" msgstr "檔案類型:" #: edit_media_preview msgid "Preview media" msgstr "預覽媒體" #: edit_media_preview_tooltip msgid "Preview media resource" msgstr "預覽媒體資源" #: edit_media_rename msgid "Change resource name" msgstr "更改資源的名稱" #: edit_media_rename_title msgid "Rename" msgstr "重新命名" #: edit_media_rename_prompt msgid "New name:" msgstr "新名稱:" #: edit_media_rename_invalid msgid "Invalid resource name!" msgstr "無效的資源名稱!" #: edit_media_rename_exists msgid "" "There is another resource with this name! Each resource must have a unique " "name." msgstr "名稱重複!每個資源都必須有一個唯一的名稱。" #: edit_media_chfile_invalid msgid "Invalid file!" msgstr "無效的文件!" #: err_media_chfile_different msgid "File must be of same type" msgstr "文件必須是同一類型的" #: edit_media_font_error msgid "Unable to load font!" msgstr "無法加載字體!" #: edit_media_save_file msgid "Save file (extract from ZIP)" msgstr "保存文件(從ZIP提取)" #: edit_media_refresh_file msgid "Update media content from file" msgstr "從文件更新媒體內容" #: edit_media_warn_zipFileNotExternal msgid "" "This is not a \"real\" file, but a object located into a ZIP container. In " "order to use this feature, a file with the same name must be present in the " "folder where the ZIP file is located." msgstr "這不是一個“真實”的文件,而是位於ZIP中的一個對象。為了使用這個功能,一個具有相同名稱的文件必須出現在ZIP文件所在的文件夾中。" #: edit_activities msgctxt "edit_activities" msgid "Activities" msgstr "活動" #: edit_sequences msgctxt "edit_sequences" msgid "Sequences" msgstr "序列" #: edit_media msgctxt "edit_media" msgid "Media library" msgstr "媒體庫" #: edit_media_tooltip msgid "Manage images and other media files used in the project" msgstr "管理在項目中使用的圖像和其他媒體文件" #: edit_activities_tooltip msgid "Create and edit project activities" msgstr "創建和編輯活動項目" #: edit_sequences_tooltip msgid "Edit and create sequences of activities" msgstr "編輯和創建活動的順序" #: edit_project_title msgctxt "edit_project_title" msgid "Title:" msgstr "標題" #: edit_project_title_tooltip msgid "Project's title" msgstr "項目的標題" #: edit_project msgctxt "edit_project" msgid "Project" msgstr "專案" #: edit_project_tooltip msgid "Edit project properties" msgstr "編輯專案屬性" #: edit_project_description msgctxt "edit_project_description" msgid "Description:" msgstr "描述:" #: edit_project_description_tooltip msgid "General description of the project" msgstr "該項目的一般描述" #: edit_project_area msgid "Areas:" msgstr "領域:" #: edit_project_area_tooltip msgid "Curricular areas of the project" msgstr "該項目的課程領域" #: edit_project_level msgid "Levels:" msgstr "等級:" #: edit_project_level_tooltip msgid "Educational levels of the project" msgstr "該項目的教育水平" #: edit_project_descriptors msgid "Descriptors:" msgstr "描述" #: edit_project_descriptors_tooltip msgid "Descriptors of the project (separed with comma)" msgstr "項目描述(用逗號分隔)" #: edit_project_languages msgid "Languages:" msgstr "語系:" #: edit_project_languages_tooltip msgid "Languages used in the project" msgstr "在項目中使用的語言" #: edit_project_languages_modify msgid "Change the selected language" msgstr "更改所選擇的語言" #: edit_project_languages_add msgid "Add language" msgstr "增加語言" #: edit_project_languages_select msgid "ISO-639 language codes:" msgstr "ISO-639語言代碼:" #: edit_project_authors msgctxt "edit_project_authors" msgid "Authors:" msgstr "作者:" #: edit_project_authors_tooltip msgid "People involved in the creation of the project" msgstr "參與該項目的創建人" #: edit_project_author_name msgctxt "edit_project_author_name" msgid "Name:" msgstr "名稱:" #: edit_project_author_mail msgctxt "edit_project_author_mail" msgid "e-mail:" msgstr "電子郵件" #: edit_project_author_rol msgid "Rol:" msgstr "角色:" #: edit_project_author_organization msgid "Organization:" msgstr "組織:" #: edit_project_author_comments msgctxt "edit_project_author_comments" msgid "Comments:" msgstr "備註:" #: edit_project_author_url msgctxt "edit_project_author_url" msgid "URL:" msgstr "URL:" #: edit_project_author_name_tooltip msgid "Author's name (required)" msgstr "作者的名字(必需)" #: edit_project_author_mail_tooltip msgid "Author's e-mail (optional)" msgstr "作者的電子郵件(可選)" #: edit_project_author_rol_tooltip msgid "" "Person's rol in the project: author, collaborator, drawings, sounds... " "(optional)" msgstr "在該項目中的角色:作者,合作者,圖畫,聲音... (可選)" #: edit_project_author_organization_tooltip msgid "School, university, association... (optional)" msgstr "學校,大學,協會... (可選)" #: edit_project_author_url_tooltip msgid "Personal web page (optional)" msgstr "個人網頁(可選)" #: edit_project_author_comments_tooltip msgid "Field for other information (optional)" msgstr "現場的其他信息(可選)" #: edit_project_author_info msgid "Author info:" msgstr "作者訊息:" #: edit_project_author_add msgid "Add author to list" msgstr "在列表中增加作者" #: edit_project_author_edit msgid "Edit author info" msgstr "編輯作者訊息" #: edit_project_org_name msgctxt "edit_project_org_name" msgid "Name:" msgstr "名稱:" #: edit_project_org_name_tooltip msgid "School name" msgstr "學校名稱" #: edit_project_org_mail msgctxt "edit_project_org_mail" msgid "e-mail:" msgstr "電子郵件" #: edit_project_org_mail_tooltip msgid "e-mail address of the school" msgstr "學校的電子郵件地址" #: edit_project_org_url msgctxt "edit_project_org_url" msgid "URL:" msgstr "URL:" #: edit_project_org_url_tooltip msgid "School website" msgstr "學校網頁" #: edit_project_org_address msgid "Address:" msgstr "地址:" #: edit_project_org_address_tooltip msgid "Snail-mail address" msgstr "電子郵件地址" #: edit_project_org_pc msgid "PC:" msgstr "PC:" #: edit_project_org_pc_tooltip msgid "Postal code" msgstr "郵政編碼" #: edit_project_org_city msgid "City:" msgstr "市:" #: edit_project_org_city_tooltip msgid "School city" msgstr "學校所在城市" #: edit_project_org_country msgid "Country:" msgstr "國家/地區:" #: edit_project_org_state msgid "State:" msgstr "省/州:" #: edit_project_org_comments msgctxt "edit_project_org_comments" msgid "Comments:" msgstr "備註:" #: edit_project_org msgid "School/s:" msgstr "學校:" #: edit_project_org_tooltip msgid "School or other institution involved in the project" msgstr "參與該項目的學校或其他機構" #: edit_project_org_info msgid "Organization info:" msgstr "組織訊息:" #: edit_project_org_add msgid "Add organization" msgstr "增加組織" #: edit_project_org_edit msgid "Edit organization data" msgstr "增加組織資料" #: edit_project_org_country_tooltip msgid "Country, federation, union..." msgstr "國家、聯邦、聯合會..." #: edit_project_org_state_tooltip msgid "Federal state, community, region..." msgstr "聯邦國家,社區,區域..." #: edit_project_org_comments_tooltip msgid "Other info..." msgstr "其他訊息..." #: edit_project_rev_date msgid "Date:" msgstr "日期:" #: edit_project_rev_date_tooltip msgid "Date of the revision" msgstr "修訂日期" #: edit_project_rev_authors msgctxt "edit_project_rev_authors" msgid "Authors:" msgstr "作者:" #: edit_project_rev_authors_tooltip msgid "Authors of the revision" msgstr "修訂的作者" #: edit_project_rev_description msgctxt "edit_project_rev_description" msgid "Description:" msgstr "描述:" #: edit_project_rev_description_tooltip msgid "Brief description of the changes made" msgstr "簡要說明變化" #: edit_project_rev_comments msgctxt "edit_project_rev_comments" msgid "Comments:" msgstr "備註:" #: edit_project_rev_comments_tooltip msgid "Other relevant info" msgstr "其他相關信息" #: edit_project_rev msgid "Revisions:" msgstr "修改:" #: edit_project_rev_tooltip msgid "History of main modifications made to the project" msgstr "主要修改此專案的歷史紀錄" #: edit_project_rev_add msgid "Add revision record" msgstr "新增的修訂記錄" #: edit_project_rev_edit msgid "Edit revision record" msgstr "編輯修訂記錄" #: edit_project_rev_info msgid "Revision data" msgstr "修訂資料" #: edit_media_objects msgid "objects" msgstr "物件" #: edit_media_object msgid "object" msgstr "物件" #: edit_evsounds_start msgid "Start of activity:" msgstr "開始的活動:" #: edit_evsounds_click msgid "Click on object:" msgstr "點選物件:" #: edit_evsounds_actionError msgid "Erroneous action:" msgstr "錯誤動作:" #: edit_evsounds_actionOk msgid "Correct action:" msgstr "正確動作:" #: edit_evsounds_finishedError msgid "Activity finished with errors:" msgstr "活動錯誤的結束:" #: edit_evsounds_finishedOk msgid "Activity finished OK:" msgstr "活動正確的結束:" #: edit_project_rev_err_nodesc msgid "Error: The description field cannot be leaved blank!" msgstr "錯誤:描述字段不能留下空白!" #: edit_evsounds_dlg_title msgid "Edit event sounds" msgstr "編輯事件聲音" #: edit_project_evsounds msgctxt "edit_project_evsounds" msgid "Event sounds:" msgstr "事件音效:" #: edit_project_evsounds_tooltip msgctxt "edit_project_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "設置特定的聲音給每一個JClic事件" #: edit_act_evsounds msgctxt "edit_act_evsounds" msgid "Event sounds:" msgstr "事件音效:" #: edit_act_evsounds_tooltip msgctxt "edit_act_evsounds_tooltip" msgid "Set specific sounds for each JClic event" msgstr "設置特定的聲音給每一個JClic事件" #: edit_evsounds_default msgid "default sound" msgstr "預設的聲音" #: edit_evsounds_disabled msgid "disabled" msgstr "停用" #: edit_evsounds_chk_tooltip msgid "Enable or disable the sound for this event" msgstr "啟用或禁用此事件的聲音" #: edit_evsounds_select_tooltip msgid "" "Click to select a sound for this event, or uncheck to use the default sound" msgstr "單擊以選中此事件的聲音,或取消選擇使用預設的聲音" #: action_newProject_caption msgid "New project..." msgstr "新專案..." #: action_newProject_keys msgid "NN" msgstr "NN" #: action_newProject_tooltip msgid "Create a new JClic project" msgstr "新增一個新的JClic專案" #: edit_arith_op_from msgctxt "edit_arith_op_from" msgid "From:" msgstr "來自:" #: edit_arith_op_from_tooltip msgid "Minimum value of the operator" msgstr "操作者的最低值" #: edit_arith_op_to msgctxt "edit_arith_op_to" msgid "To:" msgstr "到:" #: edit_arith_op_to_tooltip msgid "Maximum value of the operator" msgstr "操作者的最大值" #: edit_arith_op_with msgid "With:" msgstr "為:" #: edit_arith_op_with_tooltip msgid "If checked, the operator can also have this value" msgstr "經過確認,操作者也可以有此值" #: edit_arith_op_fromList msgid "One from the list:" msgstr "從列表之一:" #: edit_arith_op_fromList_tooltip msgid "List of possible values for the operator" msgstr "操作的可能值列表" #: edit_arith_op_decimals msgid "Decimals:" msgstr "十進位的:" #: edit_arith_op_decimals_tooltip msgid "Number of decimals of the operand" msgstr "小數點取到第幾位" #: edit_arith_op_dec0 msgid "# (integer)" msgstr "# (integer)" #: edit_arith_op_dec1 msgid "#.#" msgstr "#.#" #: edit_arith_op_dec2 msgid "#.##" msgstr "#.##" #: edit_arith_firstOp msgid "First operand" msgstr "第一位" #: edit_arith_secondOp msgid "Second operand" msgstr "第二位" #: edit_arith_title msgid "Arith2 for JClic" msgstr "對JClic的數字2" #: edit_arith_operations msgid "Operations:" msgstr "有效位數:" #: edit_arith_operations_tooltip msgid "Select the kind of operations to be performed" msgstr "請選擇位數的輸出形式" #: edit_arith_operations_plus msgid "Plus" msgstr "加號" #: edit_arith_operations_minus msgid "Minus" msgstr "減號" #: edit_arith_operations_multiply msgid "Multiply" msgstr "乘號" #: edit_arith_operations_divide msgid "Divide" msgstr "除號" #: edit_arith_unknown msgid "Unknown:" msgstr "未知:" #: edit_arith_unknown_tooltip msgid "Select the item that will act as a unknown" msgstr "請選擇欲表現未知動作的項目" #: edit_arith_unknown_aobx msgid "The result is the unknown" msgstr "結果不明" #: edit_arith_unknown_aoxr msgid "The second operator is the unknown" msgstr "第二運算子不明" #: edit_arith_unknown_xobr msgid "The first operator is the unknown" msgstr "第一運算子不明" #: edit_arith_unknown_axbr msgid "The operation is the unknown" msgstr "運算子不明" #: edit_arith_unknown_invert msgid "Write the result at the beggining of the expression" msgstr "請寫出在開頭表達的結果" #: edit_arith_result msgid "Result:" msgstr "結果:" #: edit_arith_result_notCarry msgid "Do not carry" msgstr "不要進位" #: edit_arith_result_random msgid "Random" msgstr "隨機亂數" #: edit_arith_result_asc msgid "Ascending" msgstr "遞增" #: edit_arith_result_order msgid "Order by result:" msgstr "將結果排序:" #: edit_arith_result_desc msgid "Descending" msgstr "遞減" #: edit_arith_result_avoidDup msgid "Avoid duplicates" msgstr "避免重複" #: edit_arith_cond msgid "Conditions:" msgstr "情況:" #: edit_arith_cond_ind msgid "Indifferent" msgstr "同值性" #: edit_arith_cond_agb msgid "The first operator must be greather than the second one" msgstr "第一個運算子必須大於第二個運算子" #: edit_arith_cond_alb msgid "The first operator must be lesser than the second one" msgstr "第一個運算子必須小於第二個運算子" #: edit_arith_cond_tooltip msgid "Other conditions" msgstr "其他情況" #: edit_autocp msgid "Automatic content generator:" msgstr "自動內容產生器" #: edit_autocp_tooltip msgid "Select the type of automatic content generator for this activity." msgstr "對此動作選取自動內容產生器的型態。" #: edit_autocp_block msgid "Content generator" msgstr "內容產生器" #: edit_autocp_btn msgid "Settings..." msgstr "設定..." #: edit_autocp_btn_tooltip msgid "Configure the content provider settings" msgstr "請配置內容來源設定" #: edit_data msgid "Edit data" msgstr "編輯資料" #: edit_act msgid "Activity edit" msgstr "動態編輯" #: edit_acp msgid "Content provider edit" msgstr "內容來源編輯" #: edit_acp_err_creating msgid "Error creating the content provider!" msgstr "產生內容來源時發生錯誤!" #: edit_project_author_group msgid "Creation" msgstr "建立" #: edit_project_description_block msgctxt "edit_project_description_block" msgid "Description" msgstr "描述" #: edit_project_ui_block msgctxt "edit_project_ui_block" msgid "User interface" msgstr "使用者介面" #: edit_act_description msgctxt "edit_act_description" msgid "Description:" msgstr "描述:" #: m_Edit msgid "Edit" msgstr "編輯" #: m_Edit_Mnemonic msgid "E" msgstr "E" #: edit_media_preview_keys msgid "P*" msgstr "P*" #: edit_act_newActivity msgid "New activity..." msgstr "開新動作..." #: edit_act_newActivity_keys msgid "A*" msgstr "A*" #: edit_act_testAction_keys msgid "P#10" msgstr "P#10" #: edit_seq_newElement_keys msgid "S*" msgstr "S*" #: m_Insert msgid "Insert" msgstr "插入" #: m_Insert_Mnemonic msgid "I" msgstr "I" #: m_View msgid "View" msgstr "檢視" #: m_View_Mnemonic msgid "V" msgstr "V" #: action_editProject_caption msgctxt "action_editProject_caption" msgid "Project" msgstr "專案" #: action_editProject_keys msgid "PP" msgstr "PP" #: action_editProject_tooltip msgid "Edit project settings" msgstr "編輯專案設定" #: action_editMedia_caption msgid "Media" msgstr "媒體" #: action_editMedia_keys msgid "MM" msgstr "MM" #: action_editMedia_tooltip msgid "Edit the project's multimedia library" msgstr "編輯專案的多媒體函數庫" #: action_editActivities_caption msgctxt "action_editActivities_caption" msgid "Activities" msgstr "活動" #: action_editActivities_keys msgctxt "action_editActivities_keys" msgid "AA" msgstr "AA" #: action_editActivities_tooltip msgid "Edit the activities" msgstr "編輯活動" #: action_editSeq_caption msgctxt "action_editSeq_caption" msgid "Sequences" msgstr "序列" #: action_editSeq_keys msgctxt "action_editSeq_keys" msgid "SS" msgstr "SS" #: action_editSeq_tooltip msgid "Edit the sequences of activities" msgstr "英文:" #: warn_project_modified msgid "Current project has been modified. Do you want to save the changes?" msgstr "目前的專案已被修改。要儲存這些變更嗎?" #: edit_project_descriptors_block msgid "Descriptors" msgstr "描述符號" #: edit_media_new msgid "New media object..." msgstr "開新媒體物件..." #: edit_media_new_tooltip msgid "Add a new image or multimedia object to the library" msgstr "加入新的圖像或多媒體到函數庫中" #: edit_media_new_keys msgid "M*" msgstr "M*" #: edit_seq_threshold msgid "Score threshold:" msgstr "分數門檻:" #: edit_seq_threshold_tooltip_up msgid "Take this way when the global score is equal to or higher than..." msgstr "當世界分數大於或等於時做此方法..." #: edit_seq_time msgid "Time threshold:" msgstr "時間門檻:" #: edit_seq_time_tooltip_up msgid "" "In order to take this way, the time spent on the activities must be less " "than..." msgstr "採取這種方式,所花費的時間上的活動必須小於..." #: edit_seq_threshold_tooltip_down msgid "Take this way when the global score is lower than..." msgstr "當全球分數小於時做此方法..." #: edit_seq_time_tooltip_down msgid "Take this way when the time spent on the activities is more than..." msgstr "採取此方法當花費在活動上時間超過..." #: edit_seq_condJump msgid "Conditional jumps" msgstr "條件跳轉" #: edit_seq_condJump_tooltip msgid "Set special jumps to be executed only under specific condicions" msgstr "設置只有在特定條件下執行的特殊跳轉" #: edit_seq_condJump_upper_tooltip msgid "Set conditions to jump to an upper level" msgstr "設定跳轉至較高等級的條件" #: edit_seq_condJump_lower msgid "Lower jump:" msgstr "較低階的跳轉:" #: edit_seq_condJump_upper msgid "Upper jump:" msgstr "較高階的跳轉:" #: edit_seq_condJump_lower_tooltip msgid "Set conditions to jump to an lower level" msgstr "設定跳轉至較低等級的條件" #: edit_seq_action_tooltip_fw msgid "Action assigned to the \"next\" button" msgstr "動作指定給「下一項」按鈕" #: edit_seq_action_tooltip_bk msgid "Action assigned to the \"previous\" button" msgstr "動作指定給「上一項」按鈕" #: edit_seq_jump_tooltip msgid "Set the jump target" msgstr "設定跳轉目標" #: edit_seq_action_tooltip msgid "Action to be done" msgstr "動作即完成" #: edit_seq_activity_tooltip msgid "Activity assigned to this sequence element" msgstr "分配活動到此序列元素" #: edit_seq_tag_tooltip msgid "Tag used to reference this sequence element (optional field)" msgstr "標籤用於引用此序列元素(可選區域中)" #: edit_seq_description_tooltip msgid "Description of the sequence element (optional field)" msgstr "此序列元素(可選區域)的描述" #: edit_seq_button_enabled_tooltip msgid "Enable or disable the arrow button" msgstr "啟用或停用箭號按鈕" #: edit_seq_auto_tooltip msgid "Move on automatically when the activity finishes" msgstr "當活動結束時自動移動" #: edit_seq_delay_tooltip msgid "Seconds to wait before to do the automatic move" msgstr "自動移動前需等待數秒鐘" #: edit_color_dlgTitle msgid "Select color" msgstr "選取顏色" #: edit_media_renaming msgid "Please wait while the resource is being renamed..." msgstr "當資源被改名時請等待..." #: edit_act_cell_width msgctxt "edit_act_cell_width" msgid "Width:" msgstr "寬度:" #: edit_act_cell_width_tooltip msgid "Cell width (in pixels)" msgstr "格子寬度(像素)" #: edit_act_cell_height msgctxt "edit_act_cell_height" msgid "Height:" msgstr "高度:" #: edit_act_cell_height_tooltip msgid "Cell height (in pixels)" msgstr "格子高度(像素)" #: edit_act_hiddenWords msgid "Hidden words:" msgstr "被隱藏的文字:" #: edit_act_hiddenWords_tooltip msgid "List of the hidden words placed in the panel" msgstr "在面板上隱藏字的列表" #: edit_act_wordSearch_panelB msgid "Use panel B" msgstr "使用組別B" #: edit_act_wordSearch_panelB_tooltip msgid "The contents of a second panel will be displayed as words are found" msgstr "第二個面版的內容會顯示成文字" #: edit_act_shaper_tooltip msgid "Select the shaper type to be used in the panel" msgstr "請選擇在面板中型態的類型" #: edit_act_num_cols_tooltip msgid "Number of columns of the panel" msgstr "面版的欄數" #: edit_act_num_rows_tooltip msgid "Number of rows of the panel" msgstr "面版的行數" #: edit_act_wildTransparent msgid "Transparent delimiters" msgstr "透明分隔號" #: edit_act_wildTransparent_tooltip msgid "Treat the delimiters (black boxes) as transparent holes" msgstr "將分隔符(黑盒)當作透明孔" #: edit_act_behavior_scramble_times msgid "Mixes\\:" msgstr "混合\\:" #: edit_act_behavior_scramble_times_tooltip msgid "Number of times to shuffle" msgstr "打亂次數" #: edit_act_copy_title msgid "Copy attributtes to..." msgstr "複製屬性到..." #: edit_act_copy_attributes msgid "Attributes" msgstr "屬性" #: edit_act_copy_dest msgid "Apply to:" msgstr "套用到:" #: edit_act_copy_style_main msgid "Main window" msgstr "主視窗" #: edit_act_copy_style_play msgid "Play window" msgstr "播放視窗" #: edit_act_copy_activities msgid "Activities to be modified:" msgstr "被修改的活動" #: edit_act_copyAttributes msgid "Copy attributes" msgstr "複製屬性" #: edit_act_copyAttributes_keys msgid "T" msgstr "T" #: edit_act_copyAttributes_tooltip msgid "Copy current activity attributes to other activities" msgstr "將現在活動特徵複製到其它的活動" #: edit_new_project_name msgid "Project name:" msgstr "專案名稱:" #: edit_new_project_name_tooltip msgid "Short, descriptive name of the project" msgstr "專案簡述、描述名稱" #: edit_new_project_filename msgctxt "edit_new_project_filename" msgid "File name:" msgstr "檔案名稱:" #: edit_new_project_filename_tooltip msgid "Name of the project file, without extension" msgstr "專案文件的名稱,不會擴展" #: edit_new_project_folder msgctxt "edit_new_project_folder" msgid "Folder:" msgstr "資料夾:" #: edit_new_project_folder_tooltip msgid "Name of the folder where the project will be stored" msgstr "儲存專案的文件夾名稱" #: edit_new_project_folder_browse msgctxt "edit_new_project_folder_browse" msgid "Browse..." msgstr "瀏覽..." #: edit_new_project_title msgid "Create new JClic project" msgstr "建立新的JClic專案" #: edit_new_project_err_empty msgid "Error: Project, file and folder must have valid, non-empty names." msgstr "發生錯誤:專案,檔案及資料夾必須是可行且無空白的名稱" #: edit_new_project_warning_noEmptyFolder msgid "" "This folder already contains another Clic 3.0 or JClic project. In order to " "avoid confusions, is preferable to maintain each project in a separate " "folder, but that isn't a strict rule. Do you really want to create the new " "project in this folder?" msgstr "" "此資料夾已包含其他Clic 3.0或其他Clic的專案。\r\n" "為避免混淆,盡量維持每個專案在分開的資料夾,但這不是強制的規定。\r\n" "您真的要在此資料夾建立新的專案嗎?" #: edit_new_project_err_folderCreation msgid "Error: Unable to create the specified folder!" msgstr "發生錯誤:無法建立指定的資料夾" #: edit_act_copy_err_noSelection msgid "" "Error: No activity selected! In order to use this function you must select " "in the list the activity or activities to wich the indicated attributes will " "be applied." msgstr "錯誤: 沒有選擇活動! 為了使用這個功能,你必須要選擇列表中的活動以應用被指定的屬性" #: edit_act_copy_action_prefix msgid "Copying attributes to:" msgstr "複製屬性至..." #: edit_act_copy_margin msgid "Margin" msgstr "邊界" #: edit_act_copy_bgColor msgid "Background color" msgstr "背景顏色" #: edit_act_copy_gradient msgctxt "edit_act_copy_gradient" msgid "Gradient" msgstr "漸層" #: edit_act_copy_bgImage msgid "Background image" msgstr "背景圖片" #: edit_act_copy_border msgctxt "edit_act_copy_border" msgid "Border" msgstr "外框" #: edit_act_copy_transparentBg msgid "Transparent background" msgstr "透明背景" #: edit_act_copy_position msgid "Position" msgstr "位置" #: edit_act_copy_messages msgctxt "edit_act_copy_messages" msgid "Messages" msgstr "訊息" #: edit_act_copy_messages_ini msgid "Style of initial message" msgstr "初始訊息的設計" #: edit_act_copy_messages_end msgid "Style of end message" msgstr "結束訊息的設計" #: edit_act_copy_messages_err msgid "Style of error message" msgstr "錯誤訊息的設計" #: edit_act_copy_reports msgctxt "edit_act_copy_reports" msgid "Reports" msgstr "報告" #: edit_act_copy_rep_include msgid "Include activity in reports" msgstr "將活動包括在報告中" #: edit_act_copy_rep_actions msgid "Record actions" msgstr "被記錄的動作" #: edit_act_copy_interface msgctxt "edit_act_copy_interface" msgid "User interface" msgstr "使用者介面" #: edit_act_copy_skin msgid "Skin" msgstr "外觀" #: edit_act_copy_evSounds msgid "Event sounds" msgstr "事件音效" #: edit_act_copy_counters msgctxt "edit_act_copy_counters" msgid "Counters" msgstr "計數器" #: edit_act_copy_cTime msgctxt "edit_act_copy_cTime" msgid "Time counter" msgstr "計時器" #: edit_act_copy_maxTime msgid "Max. time" msgstr "最大時間" #: edit_act_copy_cTries msgctxt "edit_act_copy_cTries" msgid "Tries counter" msgstr "嘗試計數器" #: edit_act_copy_maxTries msgid "Max. tries" msgstr "最大嘗試數" #: edit_act_copy_cScore msgctxt "edit_act_copy_cScore" msgid "Score counter" msgstr "積分" #: edit_act_copy_scramble msgid "Times to scramble" msgstr "爭取次數" #: edit_act_copy_buttons msgctxt "edit_act_copy_buttons" msgid "Buttons" msgstr "按鈕" #: edit_act_copy_btnHelp msgid "Help button" msgstr "[說明] 按鈕" #: edit_act_copy_btnInfo msgid "Information button" msgstr "信息按鈕" #: edit_act_copy_grids msgid "Grids" msgstr "網格" #: edit_act_copy_gridA msgid "Style of grid A" msgstr "網格A的設計" #: edit_act_copy_gridB msgid "Style of grid B" msgstr "網格B的設計" #: edit_act_copy_textGrid msgid "Style of text grids" msgstr "文本網格的設計" #: edit_act_copy_text msgid "Text activities" msgstr "文本動作" #: edit_act_copy_fontFace msgid "Font face" msgstr "字體" #: edit_act_copy_fontSize msgid "Font size" msgstr "字型大小" #: edit_act_copy_fontStyle msgid "Font style" msgstr "字型樣式" #: edit_act_copy_textColour msgid "Main text colour" msgstr "主要文本顏色" #: edit_act_copy_textTargetColour msgctxt "edit_act_copy_textTargetColour" msgid "Select the JClic project of which the activities will be imported" msgstr "選擇JClic專案中將匯入的活動" #: edit_act_copy_textErrorColour msgid "Errors colour" msgstr "錯誤顏色" #: edit_act_copy_tabSpace msgid "Tab space" msgstr "Tab鍵空白空間" #: edit_act_copy_messages_prev msgid "Style of previous message" msgstr "先前的訊息設計" #: edit_act_changeType msgid "Change activity type" msgstr "更改活動類型" #: edit_act_newActivity_class_tooltip msgid "" "Full name of the class to be used to build the activity (advanced users " "only!)" msgstr "用來建造活動的類別全名(僅讓進階使用者使用!)" #: edit_act_newActivity_other msgid "Other..." msgstr "其它…" #: edit_act_newActivity_info msgid "" "Advanced users can also create unregistered types of JClic activities. Just " "write below the full class name, prefixed by the package (like " "\"com.acme.activities.FooActivity\"). Activity classes must extend " "edu.xtec.jclic.Activity, and must be accessibles to the JVM " "classloader." msgstr "" "高級用戶還可以創建未註冊JClic活動類型。只是寫在下面的完整類名前綴包(像“com.acme.activities.FooActivity”)。活動課必" "須延長 edu.xtec.jclic.Activity,必須到JVM的類加載器訪問。" #: edit_act_newActivity_name msgid "Name of the activity:" msgstr "活動名稱" #: edit_act_newActivity_name_tooltip msgid "Each activity must have a name unique in the project" msgstr "在專案的中的每個活動地需有個獨特的名稱" #: edit_act_changeType_warning msgid "" "

Warning: " "Changing the type of activity can cause lost of some of the current activity " "attributes and objects. Use it with care!

 

" msgstr "" "

警告:更改類型的活動可以導致失去了一些當前活動的屬性和對象。小心使用!

" #: applet_codebase msgid "Location of JClic code:" msgstr "JClic 代碼的位置" #: applet_codebase_tooltip msgid "URL pointing to a folder with the JClic program files and scripts" msgstr "指向內有JClic程式文件與腳本的文件夾URL" #: applet_prev_text msgid "HTML code before:" msgstr "之前的HTML代碼" #. #Text to be displayed below the applet. HTM code allowed. #: applet_prev_text_tooltip msgid "Text or HTML code to be placed before the applet" msgstr "置於小應用程式前的文本或HTML代碼" #: applet_post_text msgid "HTML code after:" msgstr "之後的HTML代碼" #: applet_post_text_tooltip msgid "Text or HTML code to be placed after the applet" msgstr "置於小應用程式後的文本或HTML代碼" #: applet_size msgid "Applet size:" msgstr "應用小程式的大小" #: applet_size_tooltip msgid "Width and height of the applet, in absolute or percentage values." msgstr "小應用程式的寬度與高度(絕對值或百分比)" #: applet_page_title msgid "Page title:" msgstr "頁面標題:" #: applet_page_title_tooltip msgid "Text to be shown at the top of the browser window" msgstr "瀏覽器窗口頂端的文字" #: applet_created_info msgid "The web page \"%s\" has been created successfully." msgstr "網頁 \"%s\" 成功建立。" #: applet_created_prompt msgid "Do you want to open it now with the browser?" msgstr "現在你想用瀏覽器打開它嗎?" #: action_createHTML_caption msgid "Create web page..." msgstr "創造網頁頁面..." #: applet_create_title msgid "Creation of an HTML page with a JClic applet" msgstr "用JClic 面板小程式創造的HTML頁面" #: action_createHTML_tooltip msgid "Create a HTML page with an applet containing the current project" msgstr "創建一個HTML頁面包含當前項目的面板小程式" #: applet_filename msgctxt "applet_filename" msgid "File name:" msgstr "檔案名稱:" #: applet_filename_tooltip msgid "Name of the HTML file to be created" msgstr "被創造的HTML檔案名稱" #: action_createHTML_keys msgid "H*" msgstr "H*" #: settings_applet msgid "Applet" msgstr "面板小程式" #: settings_applet_tooltip msgid "Default values used in web page creation" msgstr "頁面創作預設值" #: applet_bgcolor msgctxt "applet_bgcolor" msgid "Background color:" msgstr "背景顏色:" #: applet_bgcolor_tooltip msgid "HTML page background color" msgstr "HTML頁面背景顏色" #: applet_centered msgctxt "applet_centered" msgid "Centered" msgstr "置中" #: applet_centered_tooltip msgid "Place the applet horizontally centered" msgstr "水平置中小應用程式" #: applet_width_tooltip msgid "Applet width (absolute or percentage)" msgstr "小應用程式寬度(絕對值或百分比)" #: applet_height_tooltip msgid "Applet height (absolute or percentage)" msgstr "小應用程式高度(絕對值或百分比)" #: applet_exitUrl msgid "On exit, go to:" msgstr "離開,跳到:" #: applet_exitUrl_tooltip msgid "URL where to redirect the navigation on JClic exit" msgstr "重定向退出JClic導航的URL" #: applet_infoFrame msgid "Info frame name:" msgstr "訊息幕的名字:" #: applet_infoFrame_tooltip msgid "" "Name of the frame used to show the content related to the \"info\" button" msgstr "顯示“信息”按鈕相關內容場景的名稱" #: action_createInstaller_caption msgid "Create project installer..." msgstr "安裝創建的專案" #: action_createInstaller_keys msgctxt "action_createInstaller_keys" msgid "I*" msgstr "I*" #: action_createInstaller_tooltip msgid "Create a project installer script for JClic player" msgstr "建立JClic播放器的項目安裝腳本" #: installer_caption msgid "Edit project installer script" msgstr "編輯項目安裝嚮導腳本" #: installer_title msgctxt "installer_title" msgid "Title:" msgstr "標題" #: installer_title_tooltip msgid "Project title, to be shown on the installer wizard" msgstr "安裝嚮導內的項目標題" #: installer_authors msgid "Autors:" msgstr "作者:" #: installer_authors_tooltip msgid "Author/s of the project (short text)" msgstr "項目的作者" #: installer_folder msgctxt "installer_folder" msgid "Folder:" msgstr "資料夾:" #: installer_folder_tooltip msgid "Folder name to be suggested by the installer wizard" msgstr "安裝嚮導建議的資料夾名稱" #: installer_files msgid "Files to be copied:" msgstr "要復制的文件" #: installer_files_tooltip msgid "Files to be copied by the installer" msgstr "被安裝程式複製的文件" #: installer_files_available msgid "Available files" msgstr "現有的文件" #: installer_files_selected msgid "Selected files" msgstr "被選取的文件" #: installer_files_add msgid ">> add >>" msgstr ">>新增>>" #: installer_files_add_tooltip msgid "Add selected file to the list" msgstr "新增被選取文件至列表中" #: installer_files_remove msgid "<< remove <<" msgstr "<<移除<<" #: installer_files_remove_tooltip msgid "Remove selected file from the list" msgstr "移除被選取文件" #: installer_button msgid "Launch button" msgstr "執行按鈕" #: installer_button_tooltip msgid "Properties of the button to be shown in the project library" msgstr "項目庫中顯示的按鈕的屬性" #: installer_button_project msgid "Main project:" msgstr "主專案" #: installer_button_project_tooltip msgid "JClic project to be launched by the button" msgstr "JClic項目按鈕啟動" #: installer_button_text msgctxt "installer_button_text" msgid "Label:" msgstr "標籤:" #: installer_button_text_tooltip msgid "Short text label, to be shown inside the button" msgstr "簡短的文字標籤_裡面的按鈕顯示" #: installer_button_icon msgid "Icon:" msgstr "圖示:" #: installer_button_icon_tooltip msgid "" "Picture to be used as button icon. Leave blank to use the default JClic icon." msgstr "被用來作為按鈕圖標的圖片。留空使用默認JClic圖標。" #: installer_button_description msgctxt "installer_button_description" msgid "Description" msgstr "描述" #: installer_button_description_tooltip msgid "Tooltip to be shown by the button" msgstr "被按鈕顯示工具提示" #: installer_error_noTitle msgid "Error: Missing project title" msgstr "錯誤:缺少項目名稱" #: installer_error_noBaseFolder msgid "Error: Missing folder name" msgstr "錯誤:缺少文件夾的名稱" #: installer_error_noFilesSelected msgid "Error: No files selected" msgstr "錯誤:尚未選取檔案" #: installer_error_noButtonText msgid "Error: Missing launch button text label" msgstr "錯誤:缺少啟動按鈕的文字標籤" #: installer_error_projectNotInFiles msgid "" "Error: The project assigned to the launch button is not in the list of files " "to be copied" msgstr "錯誤:該項目分配給發射按鈕是不是要複製的文件列表" #: applet_page_full msgid "Full-page applet" msgstr "全頁面應用小工具" #: applet_page_mixed msgid "Applet with specific dimensions" msgstr "特定維度的應用小工具" #: edit_text_align_left msgid "Align text left" msgstr "文本置左" #: edit_text_align_center msgid "Center text" msgstr "文本置中" #: edit_text_align_right msgid "Align text right" msgstr "文本置右" #: edit_text_act_target_toggle msgid "Create or remove target" msgstr "創建或刪除目標" #: edit_text_act_insertCell msgid "Insert a cell" msgstr "插入一個單元" #: edit_text_act_content msgid "Content" msgstr "內容" #: edit_text_act_style msgctxt "edit_text_act_style" msgid "Style" msgstr "樣式" #: edit_cell_size msgid "Cell size:" msgstr "單元尺寸:" #: edit_project_orphanActivities msgid "" "The following activities never appear in any of the project's activity " "sequences, so they never will be displayed:" msgstr "以下活動不會出現在任何項目的活動序列,所以他們永遠也不會被顯示:" #: edit_project_orphanMedia msgid "The following media objects are not used directly in any activity:" msgstr "以下的媒體對象,不能直接使用的任何活動:" #: edit_project_orphanActivities_prompt msgid "Do you want to add them at the end of the last activity sequence?" msgstr "你想在最後一個活動序列的結尾中添加嗎?" #: edit_project_orphanMedia_prompt msgid "Do you want to remove them?" msgstr "你要刪除這些選項嗎?" #: edit_project_orphanMedia_title msgid "Removal of unused media objects" msgstr "移除不用個媒體物件" #: edit_project_orphanActivities_title msgid "Orphan activities" msgstr "孤兒活動" #: edit_media_refreshAll msgid "Update all media content" msgstr "上載所有媒體內文" #: edit_media_refreshAll_tooltip msgid "Update all media objects reloading its files" msgstr "上載所有媒體物件並重載檔案" #: edit_media_refreshAll_keys msgid "R*" msgstr "R*" #: edit_media_refreshAll_working msgid "Updating media..." msgstr "正在更新媒體..." #: edit_media_exportAll msgid "Export all media" msgstr "導出所有媒體" #: edit_media_exportAll_tooltip msgid "Save to files the content of all media elements" msgstr "保存文件的所有媒體元素的含量" #: edit_media_exportAll_keys msgid "X*" msgstr "X*" #: edit_shape_select msgid "Select" msgstr "選擇" #: edit_shape_addPoint msgid "Add point" msgstr "新增點" #: edit_shape_deletePoint msgid "Delete" msgstr "刪除" #: edit_shape_drawRect msgid "Draw rectangle" msgstr "繪製矩形" #: edit_shape_drawEllipse msgid "Draw ellipse" msgstr "繪製橢圓形" #: edit_shape_drawPoly msgid "Draw polygon" msgstr "繪製多邊形" #: edit_shape_toLine msgid "Convert to line" msgstr "轉換成線段" #: edit_shape_toBezier msgid "Convert to Bézier curve" msgstr "轉換為貝塞爾曲線" #: edit_shape_toQuad msgid "Convert to quadratic curve" msgstr "轉換為二次曲線" #: edit_shape_rLeft msgid "Rotate left" msgstr "向左旋轉" #: edit_shape_rRight msgid "Rotate right" msgstr "向右旋轉" #: edit_shape_expand msgid "Expand" msgstr "展開" #: edit_shape_contract msgid "Contract" msgstr "合約" #: edit_shape_zoomIn msgid "Zoom in" msgstr "放大" #: edit_shape_zoomOut msgid "Zoom out" msgstr "縮小" #: edit_shape_aproxPoints msgid "Join nearest points" msgstr "加入最近點" #: edit_shape_showPoints msgid "Show points" msgstr "顯示點" #: edit_shape_showPoints_tooltip msgid "Show/Hide the points" msgstr "顯示/影藏點" #: edit_shape_gridSize msgid "Grid size:" msgstr "網格大小:" #: edit_shape_hideGrid msgid "Show / Hide grid" msgstr "顯示/影藏網格" #: edit_shape_magnetRadius msgid "Magnet radius:" msgstr "磁性半徑" #: edit_shape_elements msgid "Defined elements" msgstr "定義物件" #: edit_shape_elemName msgid "Name of the selected element" msgstr "被選取的物件名稱" #: edit_shape_magnetRadius_tooltip msgid "Action radius of the magnet, when enabled" msgstr "可用的活動磁性半徑" #: edit_shape_gridSize_tooltip msgid "Size of the grid" msgstr "網格大小" #: edit_mc_activity msgctxt "edit_mc_activity" msgid "Activity:" msgstr "活動:" #: edit_mc_sequence msgid "Sequence:" msgstr "片段" #: edit_mc_url msgctxt "edit_mc_url" msgid "URL:" msgstr "網址:" #: edit_mc_project msgid "Project:" msgstr "專案:" #: edit_mc_activity_selection msgid "Choose activity" msgstr "選擇一個活動" #: edit_mc_sequence_selection msgid "Choose sequence" msgstr "選擇片段" #: edit_mc_err_nullContent msgid "Insufficient data!" msgstr "不符合的文件" #: edit_act_arrowColor msgid "Arrow color:" msgstr "箭號顏色:" #: edit_act_arrowColor_tooltip msgid "" "Color used by the editor to draw the arrows (not exactly, because an XOR bit " "mask is used)" msgstr "編輯器用於繪製箭頭(不完全,因為使用XOR位掩碼)顏色" #: edit_act_editActivity msgid "Edit..." msgstr "編輯…" #: edit_act_editActivity_tooltip msgid "Edit the selected activity" msgstr "編輯所選的活動" #: action_saveFileAs_caption msgid "Save as..." msgstr "儲存至..." #: action_saveFileAs_keys msgctxt "action_saveFileAs_keys" msgid "AA" msgstr "AA" #: action_saveFileAs_tooltip msgid "Save the current project with a different name" msgstr "將目前的專案以另一個名字儲存" #: edit_act_behavior_block msgctxt "edit_act_behavior_block" msgid "Behavior" msgstr "動作" #: edit_act_behavior msgctxt "edit_act_behavior" msgid "Behavior" msgstr "動作" #: edit_act_behavior_drag msgid "Drag objects" msgstr "拖曳物件" #: edit_act_behavior_drag_tooltip msgid "Drag objects instead of use a connection line" msgstr "用連結線拖曳物件" #: edit_act_behavior_order msgid "Check solving order" msgstr "確認正在解決的次序" #: edit_act_behavior_order_tooltip msgid "Cells must be solved in order" msgstr "單元必須被次序性處理" #: edit_act_scramble msgid "Scramble" msgstr "爭奪" #: action_importActivities_caption msgid "Import activities..." msgstr "正在匯入活動..." #: action_importActivities_keys msgctxt "action_importActivities_keys" msgid "I*" msgstr "I*" #: action_importActivities_tooltip msgid "Import activities from another project" msgstr "從另一個專案匯入活動" #: import_warn_samefile msgid "" "The selected file corresponds to the current project. Activities can be " "imported only between different projects. Please select another project file." msgstr "選取的檔案需與目前的專案相符。活動只能在不同的專案中匯入。請選取另一個專案檔案。" #: import_selectActivities msgid "Select one or more activities to import into the current project\\:" msgstr "選取一個或多個活動匯入到目前的專案\\:" #: import_importing msgid "Importing..." msgstr "正在匯入..." #: import_checkdep msgid "Checking dependencies..." msgstr "確認獨立性" #: import_impmedia msgid "Importing media\\:" msgstr "匯入媒體" #: import_impact msgid "Importing activity\\:" msgstr "匯入活動" #: import_selectProject msgctxt "import_selectProject" msgid "Select the JClic project of which the activities will be imported" msgstr "選擇JClic專案中將匯入的活動" #: edit_tagRep_tags msgid "Tag marks" msgstr "標誌記號" #: edit_tagRep_tagStart msgid "Start mark\\:" msgstr "開始標記" #: edit_tagRep_tagStart_tooltip msgid "Mark used at the beginning of tags" msgstr "標記在開始使用的標籤" #: edit_tagRep_tagEnd msgid "End mark\\:" msgstr "結束標記" #: edit_tagRep_tagEnd_tooltip msgid "Mark used at the end of tags" msgstr "標記用於在標籤結尾" #: edit_tagRep_file msgid "File" msgstr "檔案" #: edit_tagRep_fileName msgid "File or URL\\:" msgstr "檔案或網址:" #: edit_tagRep_fileName_tooltip msgid "Name or URL of the file containing the values that will replace tags" msgstr "名稱或文件的URL包含的值將取代標籤" #: edit_tagRep_charset msgid "Charset\\:" msgstr "字符集\\:" #: edit_tagRep_charset_tooltip msgid "Character encoding used in the file" msgstr "在文件中使用的字符編碼" #: edit_tagRep_browseFile msgctxt "edit_tagRep_browseFile" msgid "Browse..." msgstr "瀏覽..." #: edit_tagRep_browseFile_tooltip msgid "Browse the filesystem" msgstr "瀏覽檔案系統" #: edit_tagRep_title msgid "Tag replacing" msgstr "取代這行" #: edit_text_act_clearStylesBtn msgid "Clear text styles..." msgstr "清除文本樣式..." #: edit_text_act_clearStylesPrompt msgid "" "Warning\\: This action will clear the specific character attributes applied " "to the document, setting it back to its main style. This action cannot be " "undone. Do you want to do it?" msgstr "警告:這個動作將清除文件裡的特殊字元,並改為一般字元。確定要執行嗎?" #: img_max_size msgid "Maximum size of images:" msgstr "圖片的最大尺寸" #: img_max_width_tooltip msgid "Maximum width of images imported into the media library." msgstr "插入媒體庫的圖片最大寬度" #: img_max_height_tooltip msgid "Maximum height of images imported into the media library." msgstr "插入媒體庫的圖片最大高度" #: img_resize_prompt msgid "" "The image \"%s\" has a size of %s pixels. This exceeds the maximum allowed " "by JClic Author (%s). Do you want to resize it?" msgstr "圖像“%S”有%s的像素大小。這超過了允許的最大值(%S)JClic作者。你想改變它的大小嗎?" i18n/fromLaunchpad/po/jclic-core/000077500000000000000000000000001335566474600170735ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-core/JClicMessages_ar.po000066400000000000000000000334661335566474600226050ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2009-09-18 01:44+0000\n" "Last-Translator: Nizar Kerkeni \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "الوقت" #: label_actions msgid "tries" msgstr "المحاولات" #: label_score msgid "score" msgstr "النتيجة" #: Skin msgid "Skin" msgstr "الكسوة" #: action_next_caption msgid "Next" msgstr "التالي" #: action_next_tooltip msgid "Next activity" msgstr "النشاط التالي" #: action_prev_caption msgid "Previous" msgstr "السابق" #: action_prev_tooltip msgid "Previous activity" msgstr "النشاط السابق" #: action_reset_caption msgid "Restart" msgstr "استئنف" #: action_reset_tooltip msgid "Restart activity" msgstr "استئنف النشاط" #: action_info_caption msgid "Information" msgstr "المعلومة" #: about_window_lb_project msgid "Project" msgstr "المشروع" #: about_window_lb_languages msgid "languages" msgstr "اللغات" #: about_window_lb_language msgid "language" msgstr "اللغة" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "عُد" #: about_window_caption msgid "About" msgstr "عنْ" #: action_about_tooltip msgid "User reports" msgstr "تقارير المستخدم" #: about_window_lb_report msgid "Report" msgstr "التقرير" #: about_window_browser_button msgid "View in browser" msgstr "اعرض في متصفح" #: report_no_activities msgid "No activities reported!" msgstr "" #: report_system_standard msgid "Report not registered in any DB" msgstr "" #: report_lb_time msgid "Time" msgstr "الوقت" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "" #: media_check_url msgid "messages/checkmedia.html" msgstr "" #: filesystem_openURL msgid "Open URL..." msgstr "" #: filesystem_openFile msgid "Open file..." msgstr "إفتح ملفا..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "" #: msg_error_executing_external msgid "Error executing the command:" msgstr "" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "" #: editor_moveDown msgid "Move down" msgstr "حرّك إلى الأسفل" #: editor_moveUp msgid "Move up" msgstr "حرّك إلى الأعلى" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "" #: filefilter_png msgid "PNG images" msgstr "" #: filefilter_jpg msgid "JPG images" msgstr "" #: filefilter_gif msgid "GIF images" msgstr "" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "" #: filefilter_all msgid "All files" msgstr "جميع الملفات" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "" #: about_window_lb_level msgid "Level" msgstr "المستوى" #: about_window_lb_area msgid "Area" msgstr "المساحة" #: report_num_actions msgid "Actions done:" msgstr "" #: report_project msgid "Project:" msgstr "المشروع:" #: report_lb_totals msgid "Total:" msgstr "المجموع:" #: report_num_projects msgid "Projects:" msgstr "المشاريع:" #: report_session msgid "Session:" msgstr "الجلسة:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "" #: msg_error_loading_project msgid "Error loading project" msgstr "" #: msg_error_playing_media msgid "Error playing media!" msgstr "" #: msg_activity_finished msgid "Activity finished!" msgstr "" #: msg_playing_media msgid "Playing media" msgstr "" #: msg_activity_running msgid "Activity running" msgstr "" #: msg_activity_ready msgid "Activity ready" msgstr "" #: msg_initializing msgid "Initializing..." msgstr "" #: msg_preparing_media msgid "Preparing media" msgstr "" #: msg_error_loading_activity msgid "Error loading activity" msgstr "" #: msg_loading_activity msgid "Loading activity" msgstr "" #: msg_loading_project msgid "Loading project..." msgstr "" #: msg_ready msgid "Ready" msgstr "جاهز" #: err_reading_data msgid "Error loading file" msgstr "" #: err_file_save msgid "Error saving file!" msgstr "" #: err_file_open msgid "Error opening file!" msgstr "" #: report_started msgid "Session started:" msgstr "" #: report_lb_score msgid "Score" msgstr "النتيجة" #: report_lb_actions msgid "Actions" msgstr "الإجراءات" #: report_lb_solved msgid "Ok" msgstr "موافق" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "النشاط" #: report_lb_sequence msgid "Sequence" msgstr "التسلسل" #: report_global_score msgid "Global score:" msgstr "" #: report_total_time msgid "Total time on activities:" msgstr "" #: report_num_activities_solved msgid "Activities ok:" msgstr "" #: report_num_activities msgid "Activities done:" msgstr "" #: report_num_sequences msgid "Sequences:" msgstr "" #: report_system msgid "Report system:" msgstr "" #: report_user msgid "User:" msgstr "المستخدم:" #: report_not_finished msgid "Activity not finished" msgstr "" #: action_info_tooltip msgid "Additional information" msgstr "معلومات إضافية" #: action_help_caption msgid "Help" msgstr "المساعدة" #: action_help_tooltip msgid "Help about this activity" msgstr "" #: action_audio_caption msgid "Sounds" msgstr "الأصوات" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "" #: about_window_lb_system msgid "System" msgstr "النّظام" #: about_window_lb_total_mem msgid "Total memory" msgstr "" #: about_window_lb_free_mem msgid "Free memory" msgstr "" #: about_window_lb_java_home msgid "Java home" msgstr "" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "" #: about_window_lb_java_version msgid "Java version" msgstr "" #: about_window_lb_os msgid "Operating system" msgstr "نظام التشغيل" #: about_window_lb_version msgid "Version" msgstr "الإصدار" #: about_window_lb_descriptors msgid "Descriptors" msgstr "" #: about_window_lb_description msgid "Description" msgstr "الوصف" #: about_window_lb_history msgid "History" msgstr "التأريخ" #: about_window_lb_organizations msgid "Organizations" msgstr "المنظمات" #: about_window_lb_organization msgid "Organization" msgstr "المنظمة" #: about_window_lb_authors msgid "Authors" msgstr "المؤلفون" #: about_window_lb_author msgid "Author" msgstr "المؤلف" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "النشاط" #: help_window_close_button msgid "Return to activity" msgstr "" #: help_window_caption msgid "Help window" msgstr "نافذة المساعدة" #: action_about_caption msgid "Reports" msgstr "التقارير" #: action_about_keys msgid "RR" msgstr "" #: action_audio_keys msgid "SS" msgstr "" #: action_help_keys msgid "HH" msgstr "" #: action_info_keys msgid "II" msgstr "" #: action_next_keys msgid "N*" msgstr "" #: action_prev_keys msgid "P*" msgstr "" #: action_reset_keys msgid "R*" msgstr "" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" #: report_new_user msgid "New user..." msgstr "مستخدم جديد..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "" #: report_err_creating_user msgid "Error creating new user!" msgstr "" #: report_select_user msgid "User identification for the reports database" msgstr "" #: report_userlist_title msgid "Please select your name:" msgstr "" #: report_ident_user msgid "User identification" msgstr "" #: report_name_prompt msgid "Name:" msgstr "الإسم:" #: report_id_prompt msgid "Login:" msgstr "الولوج:" #: report_pw_prompt msgid "Password:" msgstr "كلمة السّر:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "أكد كلمة السر:" #: report_new_user_data msgid "Creation of a new user:" msgstr "" #: report_err_bad_data msgid "Incorrect data!" msgstr "" #: report_generic_group_name msgid "Generic" msgstr "عام" #: report_new_group msgid "Create a new group..." msgstr "" #: report_err_creating_group msgid "Error creating the new group!" msgstr "" #: report_grouplist_title msgid "Please select your group:" msgstr "" #: report_new_group_data msgid "Creation of a new users group:" msgstr "" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "" #: report_user_has_pwd msgid "This account is password-protected." msgstr "" #: report_err_init msgid "Error initializing report system." msgstr "" #: report_not_connected msgid "not connected" msgstr "غير متصل" #: report_err_creating msgid "Error creating reports agent" msgstr "" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "عُد" #: action_return_tooltip msgid "Return to the last menu" msgstr "" #: action_return_keys msgid "T*" msgstr "" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "" #: filefilter_skins msgid "Skins (*.xml)" msgstr "" #: filefilter_all_media msgid "All media files" msgstr "كل ملفات الوسائط المتعددة" #: filesystem_copyToRoot_1 msgid "The file" msgstr "الملف" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "" #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "" #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "" #: filesystem_copyFile msgid "Copying file" msgstr "" #: msg_loading msgid "Loading" msgstr "" #: report_err_bad_id msgid "Bad identifier!" msgstr "" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "" #: report_err_bad_name msgid "Bad name!" msgstr "" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "" #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "" #: ftype_image msgid "Image" msgstr "الصورة" #: ftype_audio msgid "Digital audio" msgstr "" #: ftype_midi msgid "MIDI file" msgstr "" #: ftype_xml msgid "XML file" msgstr "" #: ftype_anim msgid "Animation" msgstr "الحركة" #: ftype_video msgid "Digital video" msgstr "" #: ftype_font msgid "TrueType font" msgstr "" #: ftype_jclic msgid "JClic project" msgstr "" #: ftype_inst msgid "JClic project installer script" msgstr "" #: ftype_unknown msgid "Unknown" msgstr "مجهول" #: ftype_animated msgid "animated" msgstr "متحركة" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "" #: editor_moveUp_keys msgid "U#38" msgstr "" #: editor_moveDown_keys msgid "W#40" msgstr "" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "" #: about_creditsDoc msgid "about/credits.html" msgstr "" #: about_licenseDoc msgid "about/license.html" msgstr "" #: about_sponsorsCaption msgid "With the support of:" msgstr "" #: about_window_systemInfo msgid "System information" msgstr "معلومات النظام" #: about_window_projectInfo msgid "Current project info" msgstr "" #: about_window_reportInfo msgid "Current session results" msgstr "" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "" #: msg_saving_project msgid "Saving project..." msgstr "" #: filefilter_text msgid "Text files (*.txt)" msgstr "" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" i18n/fromLaunchpad/po/jclic-core/JClicMessages_ast.po000066400000000000000000000422441335566474600227640ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2010-04-11 15:12+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "tiempu" #: label_actions msgid "tries" msgstr "intentos" #: label_score msgid "score" msgstr "marcador" #: Skin msgid "Skin" msgstr "pelleyu" #: action_next_caption msgid "Next" msgstr "Siguiente" #: action_next_tooltip msgid "Next activity" msgstr "xera siguiente" #: action_prev_caption msgid "Previous" msgstr "Anterior" #: action_prev_tooltip msgid "Previous activity" msgstr "Xera anterior" #: action_reset_caption msgid "Restart" msgstr "Reaniciar" #: action_reset_tooltip msgid "Restart activity" msgstr "Reaniciar xera" #: action_info_caption msgid "Information" msgstr "Información" #: about_window_lb_project msgid "Project" msgstr "Proyeutu" #: about_window_lb_languages msgid "languages" msgstr "llingües" #: about_window_lb_language msgid "language" msgstr "llingua" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Tornar" #: about_window_caption msgid "About" msgstr "Al rodiu" #: action_about_tooltip msgid "User reports" msgstr "Informes d'usuariu" #: about_window_lb_report msgid "Report" msgstr "Informe" #: about_window_browser_button msgid "View in browser" msgstr "Ver nel navegador" #: report_no_activities msgid "No activities reported!" msgstr "¡Nenguna información sobre xeres!" #: report_system_standard msgid "Report not registered in any DB" msgstr "L'informe nun ta rexistráu en nenguna base de datos" #: report_lb_time msgid "Time" msgstr "Tiempu" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Error cargando la secuencia" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "¡Error al entamar QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "Abrir URL..." #: filesystem_openFile msgid "Open file..." msgstr "Abrir ficheru..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Escribe la URL del recursu al que quier acceder." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Error executando'l comandu:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Mover l'elementu seleicionáu p'abaxo" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Mover l'elementu seleicionáu p'arriba" #: editor_moveDown msgid "Move down" msgstr "Mover p'abaxo" #: editor_moveUp msgid "Move up" msgstr "Mover p'arriba" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Imáxenes (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "Imáxenes PNG" #: filefilter_jpg msgid "JPG images" msgstr "Imáxenes JPG" #: filefilter_gif msgid "GIF images" msgstr "Imáxenes GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Los ficheros encontaos nuna URL son namás de llectura." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Paquetes Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Tolos ficheros" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Proyeutos JClic y Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Proyeutos JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Paquetes compactos Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Paquetes abiertos Clic 3.0 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Proyectos JClic comprimíos (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Proyeutos JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Sistema multimedia" #: about_window_lb_level msgid "Level" msgstr "Nivel" #: about_window_lb_area msgid "Area" msgstr "Área" #: report_num_actions msgid "Actions done:" msgstr "Aiciones feches:" #: report_project msgid "Project:" msgstr "Proyeutu:" #: report_lb_totals msgid "Total:" msgstr "Total:" #: report_num_projects msgid "Projects:" msgstr "Proyeutos:" #: report_session msgid "Session:" msgstr "Sesión:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Por razones de seguridá, la execución de programes esternos nun ta " "deshabilitada nos applets JClic." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "¡Error al entamar la xera!" #: msg_error_loading_project msgid "Error loading project" msgstr "Error al cargar el proyeutu" #: msg_error_playing_media msgid "Error playing media!" msgstr "¡Error del recursu multimedia!" #: msg_activity_finished msgid "Activity finished!" msgstr "¡Xera finada!" #: msg_playing_media msgid "Playing media" msgstr "Reproduciendo multimedia" #: msg_activity_running msgid "Activity running" msgstr "Xera en marcha" #: msg_activity_ready msgid "Activity ready" msgstr "Xera preparada" #: msg_initializing msgid "Initializing..." msgstr "Entamando..." #: msg_preparing_media msgid "Preparing media" msgstr "Preparando multimedia" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Error al cargar la xera" #: msg_loading_activity msgid "Loading activity" msgstr "Cargando xera" #: msg_loading_project msgid "Loading project..." msgstr "Cargando proyeutu..." #: msg_ready msgid "Ready" msgstr "Llistu" #: err_reading_data msgid "Error loading file" msgstr "Error al lleer l'archivu" #: err_file_save msgid "Error saving file!" msgstr "¡Error al guardar l'archivu!" #: err_file_open msgid "Error opening file!" msgstr "¡Error al abrir l'archivu!" #: report_started msgid "Session started:" msgstr "Entamu de sesión:" #: report_lb_score msgid "Score" msgstr "Puntuación" #: report_lb_actions msgid "Actions" msgstr "Aiciones" #: report_lb_solved msgid "Ok" msgstr "Val" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Actividá" #: report_lb_sequence msgid "Sequence" msgstr "Secuencia" #: report_global_score msgid "Global score:" msgstr "Puntuación global:" #: report_total_time msgid "Total time on activities:" msgstr "Tiempu total en xeres:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Xeres correctes:" #: report_num_activities msgid "Activities done:" msgstr "Xeres feches:" #: report_num_sequences msgid "Sequences:" msgstr "Secuencies:" #: report_system msgid "Report system:" msgstr "Sistema d'informes:" #: report_user msgid "User:" msgstr "Usuariu:" #: report_not_finished msgid "Activity not finished" msgstr "Xera nun finada" #: action_info_tooltip msgid "Additional information" msgstr "Otres informaciones" #: action_help_caption msgid "Help" msgstr "Aida" #: action_help_tooltip msgid "Help about this activity" msgstr "Gabitos al rodiu de la xera" #: action_audio_caption msgid "Sounds" msgstr "Soníos" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Activar/desactivar los soníos" #: about_window_lb_system msgid "System" msgstr "Sistema" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memoria total" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memoria llibre" #: about_window_lb_java_home msgid "Java home" msgstr "Allugamientu de Java" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Máquina virtual Java" #: about_window_lb_java_version msgid "Java version" msgstr "Versión Java" #: about_window_lb_os msgid "Operating system" msgstr "Sistema operativu" #: about_window_lb_version msgid "Version" msgstr "Versión" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descriptores" #: about_window_lb_description msgid "Description" msgstr "Descripción" #: about_window_lb_history msgid "History" msgstr "Hestorial" #: about_window_lb_organizations msgid "Organizations" msgstr "Organizaciones" #: about_window_lb_organization msgid "Organization" msgstr "Organización" #: about_window_lb_authors msgid "Authors" msgstr "Autores" #: about_window_lb_author msgid "Author" msgstr "Autor" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Xera" #: help_window_close_button msgid "Return to activity" msgstr "Tornar pa la xera" #: help_window_caption msgid "Help window" msgstr "Ventana d'aida" #: action_about_caption msgid "Reports" msgstr "Informes" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Instaladores de proyeutos JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "¡Nengún usuariu definíu na base de datos d'informes!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "Nengún usuariu definíu pa esti grupu na base de datos d'informes!" #: report_new_user msgid "New user..." msgstr "Usuariu nuevu..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Crear un usuariu nuevu na base de datos d'informes" #: report_err_creating_user msgid "Error creating new user!" msgstr "¡Error al crear l'usuariu nuevu!" #: report_select_user msgid "User identification for the reports database" msgstr "Identificación d'usuariu pa la base de datos d'informes" #: report_userlist_title msgid "Please select your name:" msgstr "Escueya'l so nome:" #: report_ident_user msgid "User identification" msgstr "Identificación d'usuariu" #: report_name_prompt msgid "Name:" msgstr "Nome:" #: report_id_prompt msgid "Login:" msgstr "Identificar:" #: report_pw_prompt msgid "Password:" msgstr "Contraseña:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Confirmar contraseña:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Creación d'un nuevu usuariu:" #: report_err_bad_data msgid "Incorrect data!" msgstr "¡Datos incorrectos!" #: report_generic_group_name msgid "Generic" msgstr "Xenéricu" #: report_new_group msgid "Create a new group..." msgstr "Crear un grupu nuevu..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "¡Error al crear el grupu nuevu!" #: report_grouplist_title msgid "Please select your group:" msgstr "Escueya'l so grupu:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Creación d'un grupu nuevu d'usuarios:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Usuariu inesistente o contraseña incorrecta." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Esta cuenta d'usuariu ta protexida por contraseña" #: report_err_init msgid "Error initializing report system." msgstr "Error al entamar el sistema d'informes." #: report_not_connected msgid "not connected" msgstr "nun conectáu" #: report_err_creating msgid "Error creating reports agent" msgstr "Error al crear l'axente d'informes" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Tornar" #: action_return_tooltip msgid "Return to the last menu" msgstr "Tornar al menú postreru" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Soníos (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Archivos MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Archivos de video (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Archivos Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Pelleyos (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Tolos recursos" #: filesystem_copyToRoot_1 msgid "The file" msgstr "L'archivu" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "atópase nuna carpeta estremada de la del proyeutu actual." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Encamiéntase tener tolos archivos nuna mesma carpeta" #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "¿Quier copiar l'archivu escoyíu a la carpeta del proyeutu?" #: filesystem_copyFile msgid "Copying file" msgstr "Copiando ficheru" #: msg_loading msgid "Loading" msgstr "Cargando" #: report_err_bad_id msgid "Bad identifier!" msgstr "¡Identificador incorrectu!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "¡Esti identificador yá esiste na base de datos!" #: report_err_bad_name msgid "Bad name!" msgstr "¡Nome incorrectu!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "¡Les contraseñas nun coinciden!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "¡Error al conectar cola base de datos d'informes!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "EXIT: Nesti puntu'l programa va cerrase." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Nesti puntu va producise un altu al proyeutu:" #: ftype_image msgid "Image" msgstr "Imaxe" #: ftype_audio msgid "Digital audio" msgstr "Soníu dixital" #: ftype_midi msgid "MIDI file" msgstr "Ficheru MIDI" #: ftype_xml msgid "XML file" msgstr "Ficheru XML" #: ftype_anim msgid "Animation" msgstr "Animación" #: ftype_video msgid "Digital video" msgstr "Video dixital" #: ftype_font msgid "TrueType font" msgstr "Fonte TrueType" #: ftype_jclic msgid "JClic project" msgstr "Proyeutu JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Script d'instalación de proyeutos JClic" #: ftype_unknown msgid "Unknown" msgstr "Desconocíu" #: ftype_animated msgid "animated" msgstr "animada" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Fontes (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Documentos HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits_ast.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license_ast.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Col sofitu de:" #: about_window_systemInfo msgid "System information" msgstr "Información del sistema" #: about_window_projectInfo msgid "Current project info" msgstr "Información del proyeutu actual" #: about_window_reportInfo msgid "Current session results" msgstr "Resultaos de la sesión actual" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Esti productu inclúi software desendolcáu por:" #: msg_saving_project msgid "Saving project..." msgstr "Guardando'l proyeutu..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Ficheros de testu (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Versión n'asturianu, pol Equipu JClic" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Esti programa ye software llibre; usté pue redistribuyilu y/o camudalu " "embaxo los términos de la Llicencia Pública Xeneral GNU (GPL), tal y como ta " "espublizada pola Free Software Foundation; yá seya la versión 2 de la " "Llicencia, o (a la so escoyeta) cualesquier versión " "posterior.
 
Esti programa distribúyese col envís de ser útil, " "pero ENSIN NENGUNA GARANTÍA; inclusive ensin la garantía implícita " "d'USABILIDÁ O UTILIDÁ PA UN FIN PARTICULAR. Vea la Llicencia Pública Xeneral " "GNU pa más detalles." i18n/fromLaunchpad/po/jclic-core/JClicMessages_bs.po000066400000000000000000000372021335566474600225770ustar00rootroot00000000000000# Bosnian translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2012-06-09 21:55+0000\n" "Last-Translator: Meliha Gadara \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "vrijeme" #: label_actions msgid "tries" msgstr "pokušaji" #: label_score msgid "score" msgstr "rezultat" #: Skin msgid "Skin" msgstr "Tema" #: action_next_caption msgid "Next" msgstr "Sljedeće" #: action_next_tooltip msgid "Next activity" msgstr "Sljedeća aktivnost" #: action_prev_caption msgid "Previous" msgstr "Prethodno" #: action_prev_tooltip msgid "Previous activity" msgstr "Prethodna aktivnost" #: action_reset_caption msgid "Restart" msgstr "Ponovo pokrenuti" #: action_reset_tooltip msgid "Restart activity" msgstr "Ponovno pokreni aktivnost" #: action_info_caption msgid "Information" msgstr "Informacije" #: about_window_lb_project msgid "Project" msgstr "Projekt" #: about_window_lb_languages msgid "languages" msgstr "jezici" #: about_window_lb_language msgid "language" msgstr "jezik" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Vrati se" #: about_window_caption msgid "About" msgstr "O" #: action_about_tooltip msgid "User reports" msgstr "Izvješća korisnika" #: about_window_lb_report msgid "Report" msgstr "Izvještaj" #: about_window_browser_button msgid "View in browser" msgstr "Pogledaj u pregledniku" #: report_no_activities msgid "No activities reported!" msgstr "" #: report_system_standard msgid "Report not registered in any DB" msgstr "" #: report_lb_time msgid "Time" msgstr "Vrijeme" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Greška prilikom inicijalizacije QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "" #: filesystem_openURL msgid "Open URL..." msgstr "Otvori URL..." #: filesystem_openFile msgid "Open file..." msgstr "Otvori datoteku..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "" #: msg_error_executing_external msgid "Error executing the command:" msgstr "Greška pri izvršavanju naredbe:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Pomjeri odabrani element dolje" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Pomjeri odabrani element gore" #: editor_moveDown msgid "Move down" msgstr "Pomjeri dolje" #: editor_moveUp msgid "Move up" msgstr "Pomjeri gore" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "" #: filefilter_png msgid "PNG images" msgstr "PNG slike" #: filefilter_jpg msgid "JPG images" msgstr "JPG slike" #: filefilter_gif msgid "GIF images" msgstr "GIF slike" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Clic 3.0 paketi (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Sve datoteke" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "JClic i Clic 3.0 projekti (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "JClic projekti (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "JClic kompresovani projekti (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "JClic projekti (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Multimedia sistem" #: about_window_lb_level msgid "Level" msgstr "Nivo" #: about_window_lb_area msgid "Area" msgstr "Područje" #: report_num_actions msgid "Actions done:" msgstr "Urađene aktivnosti:" #: report_project msgid "Project:" msgstr "Projekt:" #: report_lb_totals msgid "Total:" msgstr "Ukupno:" #: report_num_projects msgid "Projects:" msgstr "Projekti:" #: report_session msgid "Session:" msgstr "Sesije" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Greška prilikom pokretanja aktivnosti!" #: msg_error_loading_project msgid "Error loading project" msgstr "Greška prilikom učitavanja projekta" #: msg_error_playing_media msgid "Error playing media!" msgstr "" #: msg_activity_finished msgid "Activity finished!" msgstr "Aktivnost završena!" #: msg_playing_media msgid "Playing media" msgstr "" #: msg_activity_running msgid "Activity running" msgstr "Izvođenje aktivnosti" #: msg_activity_ready msgid "Activity ready" msgstr "" #: msg_initializing msgid "Initializing..." msgstr "Inicijalizacija..." #: msg_preparing_media msgid "Preparing media" msgstr "" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Greška prilikom učitavanja aktivnosti" #: msg_loading_activity msgid "Loading activity" msgstr "Učitavanje aktivnosti" #: msg_loading_project msgid "Loading project..." msgstr "Učitavanje projekta..." #: msg_ready msgid "Ready" msgstr "Spremno" #: err_reading_data msgid "Error loading file" msgstr "Greška prilikom učitavanje datoteke" #: err_file_save msgid "Error saving file!" msgstr "Greška prilikom spašavanja datoteke!" #: err_file_open msgid "Error opening file!" msgstr "Greška prilikom otvaranja datoteke!" #: report_started msgid "Session started:" msgstr "Sesija započeta:" #: report_lb_score msgid "Score" msgstr "Rezultat" #: report_lb_actions msgid "Actions" msgstr "Radnje" #: report_lb_solved msgid "Ok" msgstr "Uredu" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Aktivnost" #: report_lb_sequence msgid "Sequence" msgstr "Sekvenca" #: report_global_score msgid "Global score:" msgstr "Ukupan rezultat:" #: report_total_time msgid "Total time on activities:" msgstr "Ukupno vrijeme aktivnosti:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Aktivnosti ok:" #: report_num_activities msgid "Activities done:" msgstr "Urađene aktivnosti:" #: report_num_sequences msgid "Sequences:" msgstr "" #: report_system msgid "Report system:" msgstr "" #: report_user msgid "User:" msgstr "Korisnik:" #: report_not_finished msgid "Activity not finished" msgstr "Aktivnost nije završena" #: action_info_tooltip msgid "Additional information" msgstr "Dodatne informacije" #: action_help_caption msgid "Help" msgstr "Pomoć" #: action_help_tooltip msgid "Help about this activity" msgstr "Pomoć oko aktivnosti" #: action_audio_caption msgid "Sounds" msgstr "Zvukovi" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Omogući/onemogući zvukove" #: about_window_lb_system msgid "System" msgstr "Sistem" #: about_window_lb_total_mem msgid "Total memory" msgstr "Ukupna memorija" #: about_window_lb_free_mem msgid "Free memory" msgstr "Slobodna memorija" #: about_window_lb_java_home msgid "Java home" msgstr "" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Java virtualna mašina" #: about_window_lb_java_version msgid "Java version" msgstr "Java verzija" #: about_window_lb_os msgid "Operating system" msgstr "Operativni sistem" #: about_window_lb_version msgid "Version" msgstr "Verzija" #: about_window_lb_descriptors msgid "Descriptors" msgstr "" #: about_window_lb_description msgid "Description" msgstr "Opis" #: about_window_lb_history msgid "History" msgstr "Historija" #: about_window_lb_organizations msgid "Organizations" msgstr "Organizacije" #: about_window_lb_organization msgid "Organization" msgstr "Organizacija" #: about_window_lb_authors msgid "Authors" msgstr "Autori" #: about_window_lb_author msgid "Author" msgstr "Autor" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Aktivnost" #: help_window_close_button msgid "Return to activity" msgstr "Vrati se na aktivnost" #: help_window_caption msgid "Help window" msgstr "Pomoć" #: action_about_caption msgid "Reports" msgstr "Izvještaji" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Nema korisnika definiranih u izvješćima baze podataka!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "Nema korisnika definiranih za ovu grupu u izvješćima baze podataka!" #: report_new_user msgid "New user..." msgstr "Novi korisnik" #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Kreiraj novog korisnika u izvještajima baze podataka" #: report_err_creating_user msgid "Error creating new user!" msgstr "Greška prilikom kreiranja novog korisnika!" #: report_select_user msgid "User identification for the reports database" msgstr "Identifikacija korisnika za izvještaje baze podataka" #: report_userlist_title msgid "Please select your name:" msgstr "Molimo odaberite vaše ime:" #: report_ident_user msgid "User identification" msgstr "Identifikacija korisnika" #: report_name_prompt msgid "Name:" msgstr "Naziv:" #: report_id_prompt msgid "Login:" msgstr "Prijava:" #: report_pw_prompt msgid "Password:" msgstr "Lozinka:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Potvrdi lozinku:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Kreiranje novog korisnika:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Netačni podaci!" #: report_generic_group_name msgid "Generic" msgstr "Opće" #: report_new_group msgid "Create a new group..." msgstr "Kreiraj novu grupu" #: report_err_creating_group msgid "Error creating the new group!" msgstr "Greška prilikom kreiranja nove grupe!" #: report_grouplist_title msgid "Please select your group:" msgstr "Molimo odaberite vašu grupu:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Kreiranje grupe novih korisnika:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Nedostajanje korisničkog ID ili netačna lozinka." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Ovaj račun je zaštićen lozinkom." #: report_err_init msgid "Error initializing report system." msgstr "" #: report_not_connected msgid "not connected" msgstr "nije povezano" #: report_err_creating msgid "Error creating reports agent" msgstr "" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Vrati se" #: action_return_tooltip msgid "Return to the last menu" msgstr "Vrati se na zadnji izbornik" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Zvukovi (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI datoteke (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video datoteke (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 datoteke (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "" #: filefilter_all_media msgid "All media files" msgstr "Sve medija datoteke" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Datoteka" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "" #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Preporučuje se da su sve datoteke u istom folderu." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Da li želite kopirati odabrane datoteke u folder projekta?" #: filesystem_copyFile msgid "Copying file" msgstr "Kopiranje datoteke" #: msg_loading msgid "Loading" msgstr "Učitavam" #: report_err_bad_id msgid "Bad identifier!" msgstr "" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "" #: report_err_bad_name msgid "Bad name!" msgstr "Pogrešan naziv!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Pristupne šifre se ne poklapaju!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Greška prilikom povezivanja s izvještajima baze podataka!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "IZLAZ: U ovom trenutku, program će se završiti." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "" #: ftype_image msgid "Image" msgstr "Slika" #: ftype_audio msgid "Digital audio" msgstr "" #: ftype_midi msgid "MIDI file" msgstr "MIDI datoteka" #: ftype_xml msgid "XML file" msgstr "XML datoteka" #: ftype_anim msgid "Animation" msgstr "Animacija" #: ftype_video msgid "Digital video" msgstr "Digitalni video" #: ftype_font msgid "TrueType font" msgstr "" #: ftype_jclic msgid "JClic project" msgstr "JClic projekt" #: ftype_inst msgid "JClic project installer script" msgstr "" #: ftype_unknown msgid "Unknown" msgstr "Nepoznato" #: ftype_animated msgid "animated" msgstr "animirano" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML documenti (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "" #: about_licenseDoc msgid "about/license.html" msgstr "" #: about_sponsorsCaption msgid "With the support of:" msgstr "Uz podršku:" #: about_window_systemInfo msgid "System information" msgstr "Informacije o sistemu" #: about_window_projectInfo msgid "Current project info" msgstr "Info o trenutnom projektu" #: about_window_reportInfo msgid "Current session results" msgstr "Rezultati trenutne sesije" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Ovaj proizvod uključuje softver razvijen od strane:" #: msg_saving_project msgid "Saving project..." msgstr "Spašavanje projekta..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Tekstualne datoteke (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" i18n/fromLaunchpad/po/jclic-core/JClicMessages_ca.po000066400000000000000000000422301335566474600225530ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2010-01-22 17:51+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "temps" #: label_actions msgid "tries" msgstr "intents" #: label_score msgid "score" msgstr "encerts" #: Skin msgid "Skin" msgstr "Entorn visual" #: action_next_caption msgid "Next" msgstr "Següent" #: action_next_tooltip msgid "Next activity" msgstr "Activitat següent" #: action_prev_caption msgid "Previous" msgstr "Anterior" #: action_prev_tooltip msgid "Previous activity" msgstr "Activitat anterior" #: action_reset_caption msgid "Restart" msgstr "Reinicia" #: action_reset_tooltip msgid "Restart activity" msgstr "Reinicia l'activitat" #: action_info_caption msgid "Information" msgstr "Informació" #: about_window_lb_project msgid "Project" msgstr "Projecte" #: about_window_lb_languages msgid "languages" msgstr "Idiomes" #: about_window_lb_language msgid "language" msgstr "Idioma" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Torna" #: about_window_caption msgid "About" msgstr "Quant a..." #: action_about_tooltip msgid "User reports" msgstr "Informes d'usuari" #: about_window_lb_report msgid "Report" msgstr "Informes" #: about_window_browser_button msgid "View in browser" msgstr "Veure-ho en el navegador" #: report_no_activities msgid "No activities reported!" msgstr "No hi ha cap activitat reportada!" #: report_system_standard msgid "Report not registered in any DB" msgstr "L'informe no s'està enregistrant en cap base de dades" #: report_lb_time msgid "Time" msgstr "Temps" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Error en carregar la seqüència" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Error en inicialitzar el QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia_ca.html" #: filesystem_openURL msgid "Open URL..." msgstr "Obre una ubicació web..." #: filesystem_openFile msgid "Open file..." msgstr "Obre el fitxer..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Escriviu l'URL del recurs al qual voleu accedir." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Error en executar l'ordre:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Mou l'element seleccionat avall" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Mou l'element seleccionat amunt" #: editor_moveDown msgid "Move down" msgstr "Mou avall" #: editor_moveUp msgid "Move up" msgstr "Mou amunt" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Imatges (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "Imatges PNG" #: filefilter_jpg msgid "JPG images" msgstr "Imatges JPG" #: filefilter_gif msgid "GIF images" msgstr "Imatges GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Els fitxers obtinguts d'un URL són només de lectura." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Paquets Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Tots els fitxers" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Projectes JClic i Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Projectes JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Paquets compactes Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Paquets oberts Clic 3.0 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Projectes JClic comprimits (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Projectes JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Sistema multimèdia" #: about_window_lb_level msgid "Level" msgstr "Nivell" #: about_window_lb_area msgid "Area" msgstr "Àrea" #: report_num_actions msgid "Actions done:" msgstr "Accions fetes:" #: report_project msgid "Project:" msgstr "Projecte:" #: report_lb_totals msgid "Total:" msgstr "Totals:" #: report_num_projects msgid "Projects:" msgstr "Projectes:" #: report_session msgid "Session:" msgstr "Sessió:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Per raons de seguretat l'execució de programes externs està deshabilitada en " "els applets JClic." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Error en iniciar l'activitat!" #: msg_error_loading_project msgid "Error loading project" msgstr "Error en carregar el projecte" #: msg_error_playing_media msgid "Error playing media!" msgstr "Error del recurs multimèdia!" #: msg_activity_finished msgid "Activity finished!" msgstr "Activitat acabada!" #: msg_playing_media msgid "Playing media" msgstr "Interpretant multimèdia" #: msg_activity_running msgid "Activity running" msgstr "Activitat en marxa" #: msg_activity_ready msgid "Activity ready" msgstr "Activitat preparada" #: msg_initializing msgid "Initializing..." msgstr "Inicialitzant..." #: msg_preparing_media msgid "Preparing media" msgstr "Preparant multimèdia" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Error en carregar l'activitat" #: msg_loading_activity msgid "Loading activity" msgstr "Carregant l'activitat..." #: msg_loading_project msgid "Loading project..." msgstr "Carregant el projecte..." #: msg_ready msgid "Ready" msgstr "Fet" #: err_reading_data msgid "Error loading file" msgstr "Error en llegir el fitxer" #: err_file_save msgid "Error saving file!" msgstr "Error en desar el fitxer!" #: err_file_open msgid "Error opening file!" msgstr "Error en obrir el fitxer!" #: report_started msgid "Session started:" msgstr "Inici de sessió:" #: report_lb_score msgid "Score" msgstr "Puntuació" #: report_lb_actions msgid "Actions" msgstr "Accions" #: report_lb_solved msgid "Ok" msgstr "Correcta" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Activitat" #: report_lb_sequence msgid "Sequence" msgstr "Seqüència" #: report_global_score msgid "Global score:" msgstr "Puntuació global:" #: report_total_time msgid "Total time on activities:" msgstr "Temps total en activitats:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Activitats correctes:" #: report_num_activities msgid "Activities done:" msgstr "Activitats realitzades:" #: report_num_sequences msgid "Sequences:" msgstr "Seqüències:" #: report_system msgid "Report system:" msgstr "Sistema d'informes:" #: report_user msgid "User:" msgstr "Usuari:" #: report_not_finished msgid "Activity not finished" msgstr "Activitat encara no acabada" #: action_info_tooltip msgid "Additional information" msgstr "Informació addicional" #: action_help_caption msgid "Help" msgstr "Ajuda" #: action_help_tooltip msgid "Help about this activity" msgstr "Ajuda sobre l'activitat" #: action_audio_caption msgid "Sounds" msgstr "Sons" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Activar/desactivar els sons" #: about_window_lb_system msgid "System" msgstr "Sistema" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memòria total" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memòria lliure" #: about_window_lb_java_home msgid "Java home" msgstr "Ubicació de Java" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Màquina virtual Java" #: about_window_lb_java_version msgid "Java version" msgstr "Versió de Java" #: about_window_lb_os msgid "Operating system" msgstr "Sistema operatiu" #: about_window_lb_version msgid "Version" msgstr "Versió" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descriptors" #: about_window_lb_description msgid "Description" msgstr "Descripció" #: about_window_lb_history msgid "History" msgstr "Revisions" #: about_window_lb_organizations msgid "Organizations" msgstr "Organitzacions" #: about_window_lb_organization msgid "Organization" msgstr "Organització" #: about_window_lb_authors msgid "Authors" msgstr "Autors/es" #: about_window_lb_author msgid "Author" msgstr "Autor/a" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Activitat" #: help_window_close_button msgid "Return to activity" msgstr "Torna a l'activitat" #: help_window_caption msgid "Help window" msgstr "Finestra d'ajuda" #: action_about_caption msgid "Reports" msgstr "Informes" #: action_about_keys msgid "RR" msgstr "II" #: action_audio_keys msgid "SS" msgstr "OS" #: action_help_keys msgid "HH" msgstr "JJ" #: action_info_keys msgid "II" msgstr "NN" #: action_next_keys msgid "N*" msgstr "S*" #: action_prev_keys msgid "P*" msgstr "A*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Instal·ladors de projectes JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "No hi ha cap usuari definit a la base de dades d'informes!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "No hi ha cap usuari definit en aquest grup a la base de dades d'informes!" #: report_new_user msgid "New user..." msgstr "Usuari nou..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Crea un nou usuari a la base de dades d'informes" #: report_err_creating_user msgid "Error creating new user!" msgstr "Error en crear el nou usuari!" #: report_select_user msgid "User identification for the reports database" msgstr "Identificació d'usuari per la base de dades d'informes" #: report_userlist_title msgid "Please select your name:" msgstr "Seleccioneu el vostre nom:" #: report_ident_user msgid "User identification" msgstr "Identificació d'usuari" #: report_name_prompt msgid "Name:" msgstr "Nom:" #: report_id_prompt msgid "Login:" msgstr "Identificador:" #: report_pw_prompt msgid "Password:" msgstr "Contrasenya:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Confirmació de la contrasenya:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Creació d'un nou usuari:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Dades incorrectes!" #: report_generic_group_name msgid "Generic" msgstr "Genèric" #: report_new_group msgid "Create a new group..." msgstr "Crea un nou grup..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Error en crear el nou grup!" #: report_grouplist_title msgid "Please select your group:" msgstr "Seleccioneu el vostre grup:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Creació d'un nou grup d'usuaris:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Usuari inexistent o contrasenya incorrecta." #: report_user_has_pwd msgid "This account is password-protected." msgstr "El compte d'aquest usuari està protegit per contrasenya." #: report_err_init msgid "Error initializing report system." msgstr "Error en inicialitzar el sistema d'informes." #: report_not_connected msgid "not connected" msgstr "no connectat" #: report_err_creating msgid "Error creating reports agent" msgstr "Error en crear l'agent d'informes" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Torna" #: action_return_tooltip msgid "Return to the last menu" msgstr "Torna al darrer menú" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sons (*.wav, *.mp3, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Fitxers MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Vídeo (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Fitxers Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Entorns visuals (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Tots els recursos" #: filesystem_copyToRoot_1 msgid "The file" msgstr "El fitxer" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "es troba en una carpeta diferent de la de l'actual projecte." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Es recomana tenir tots els fitxers en la mateixa carpeta." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Voleu copiar el fitxer seleccionat a la carpeta del projecte?" #: filesystem_copyFile msgid "Copying file" msgstr "Copiant el fitxer" #: msg_loading msgid "Loading" msgstr "Carregant" #: report_err_bad_id msgid "Bad identifier!" msgstr "Identificador incorrecte!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Aquest identificador ja existeix a la base de dades!" #: report_err_bad_name msgid "Bad name!" msgstr "Nom incorrecte!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Les contrasenyes no coincideixen!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Error en connectar amb la base de dades d'informes!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "EXIT: En aquest punt el JClic es tancaria." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "En aquest punt es produiria un salt al projecte:" #: ftype_image msgid "Image" msgstr "Imatge" #: ftype_audio msgid "Digital audio" msgstr "So digital" #: ftype_midi msgid "MIDI file" msgstr "Fitxer MIDI" #: ftype_xml msgid "XML file" msgstr "Fitxer XML" #: ftype_anim msgid "Animation" msgstr "Animació" #: ftype_video msgid "Digital video" msgstr "Vídeo digital" #: ftype_font msgid "TrueType font" msgstr "Tipus de lletra TrueType" #: ftype_jclic msgid "JClic project" msgstr "Projecte JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Seqüència d'instal·lació de projectes JClic" #: ftype_unknown msgid "Unknown" msgstr "Desconegut" #: ftype_animated msgid "animated" msgstr "animada" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Tipus de lletra (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "V#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Documents HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits_ca.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license_ca.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Amb el suport de:" #: about_window_systemInfo msgid "System information" msgstr "Informació del sistema" #: about_window_projectInfo msgid "Current project info" msgstr "Informació del projecte actual" #: about_window_reportInfo msgid "Current session results" msgstr "Resultats de la sessió actual" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Aquest producte inclou programari desenvolupat per:" #: msg_saving_project msgid "Saving project..." msgstr "Desant el projecte..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Fitxers de text (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Versió en català, per l'Equip Clic" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Aquest programa és lliure. Podeu distribuir-lo i/o modificar-lo " "conforme a les disposicions de la Llicència Pública General de " "GNU (GPL), publicada per la Free Software Foundation, ja sigui la " "versió 2 de la llicència o qualsevol versió " "posterior.
 
Aquest programa es distribueix amb la " "intenció de resultar útil, però SENSE CAP GARANTIA, " "fins i tot sense la garantia implícita de COMERCIABILITAT o " "CONVENIÈNCIA PER A UN PROPÒSIT PARTICULAR. Per a més " "detalls, vegeu la Llicència " "Pública General de GNU." i18n/fromLaunchpad/po/jclic-core/JClicMessages_ca@valencia.po000066400000000000000000000322431335566474600243610ustar00rootroot00000000000000# Catalan (Valencian) translation for jclic # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2011-08-19 12:27+0000\n" "Last-Translator: Alfons Rovira \n" "Language-Team: Catalan (Valencian) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "temps" #: label_actions msgid "tries" msgstr "" #: label_score msgid "score" msgstr "puntuació" #: Skin msgid "Skin" msgstr "Aparença" #: action_next_caption msgid "Next" msgstr "Següent" #: action_next_tooltip msgid "Next activity" msgstr "Activitat següent" #: action_prev_caption msgid "Previous" msgstr "Anterior" #: action_prev_tooltip msgid "Previous activity" msgstr "Activitat anterior" #: action_reset_caption msgid "Restart" msgstr "Reinicia" #: action_reset_tooltip msgid "Restart activity" msgstr "Reinicia l'attivitat" #: action_info_caption msgid "Information" msgstr "Informació" #: about_window_lb_project msgid "Project" msgstr "Projecte" #: about_window_lb_languages msgid "languages" msgstr "llengües" #: about_window_lb_language msgid "language" msgstr "llengua" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Retorn" #: about_window_caption msgid "About" msgstr "Quant a" #: action_about_tooltip msgid "User reports" msgstr "" #: about_window_lb_report msgid "Report" msgstr "Informe" #: about_window_browser_button msgid "View in browser" msgstr "Veure-ho al navegador" #: report_no_activities msgid "No activities reported!" msgstr "Activitats no registrades" #: report_system_standard msgid "Report not registered in any DB" msgstr "" #: report_lb_time msgid "Time" msgstr "Temps" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Error inicialitzant QuickTime" #: media_check_url msgid "messages/checkmedia.html" msgstr "" #: filesystem_openURL msgid "Open URL..." msgstr "Obri l'URL..." #: filesystem_openFile msgid "Open file..." msgstr "Obri el fitxer..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Per favor, introdueix l'URK del recurs que vols baixar" #: msg_error_executing_external msgid "Error executing the command:" msgstr "Error executant el comandament" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Mou l'element seleccionat cap avall" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "" #: editor_moveDown msgid "Move down" msgstr "" #: editor_moveUp msgid "Move up" msgstr "" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "" #: filefilter_png msgid "PNG images" msgstr "" #: filefilter_jpg msgid "JPG images" msgstr "" #: filefilter_gif msgid "GIF images" msgstr "" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "" #: filefilter_all msgid "All files" msgstr "" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "" #: about_window_lb_level msgid "Level" msgstr "" #: about_window_lb_area msgid "Area" msgstr "" #: report_num_actions msgid "Actions done:" msgstr "" #: report_project msgid "Project:" msgstr "" #: report_lb_totals msgid "Total:" msgstr "" #: report_num_projects msgid "Projects:" msgstr "" #: report_session msgid "Session:" msgstr "" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "" #: msg_error_loading_project msgid "Error loading project" msgstr "" #: msg_error_playing_media msgid "Error playing media!" msgstr "" #: msg_activity_finished msgid "Activity finished!" msgstr "" #: msg_playing_media msgid "Playing media" msgstr "" #: msg_activity_running msgid "Activity running" msgstr "" #: msg_activity_ready msgid "Activity ready" msgstr "" #: msg_initializing msgid "Initializing..." msgstr "" #: msg_preparing_media msgid "Preparing media" msgstr "" #: msg_error_loading_activity msgid "Error loading activity" msgstr "" #: msg_loading_activity msgid "Loading activity" msgstr "" #: msg_loading_project msgid "Loading project..." msgstr "" #: msg_ready msgid "Ready" msgstr "" #: err_reading_data msgid "Error loading file" msgstr "" #: err_file_save msgid "Error saving file!" msgstr "" #: err_file_open msgid "Error opening file!" msgstr "" #: report_started msgid "Session started:" msgstr "" #: report_lb_score msgid "Score" msgstr "" #: report_lb_actions msgid "Actions" msgstr "" #: report_lb_solved msgid "Ok" msgstr "" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "" #: report_lb_sequence msgid "Sequence" msgstr "" #: report_global_score msgid "Global score:" msgstr "" #: report_total_time msgid "Total time on activities:" msgstr "" #: report_num_activities_solved msgid "Activities ok:" msgstr "" #: report_num_activities msgid "Activities done:" msgstr "" #: report_num_sequences msgid "Sequences:" msgstr "" #: report_system msgid "Report system:" msgstr "" #: report_user msgid "User:" msgstr "" #: report_not_finished msgid "Activity not finished" msgstr "" #: action_info_tooltip msgid "Additional information" msgstr "" #: action_help_caption msgid "Help" msgstr "" #: action_help_tooltip msgid "Help about this activity" msgstr "" #: action_audio_caption msgid "Sounds" msgstr "" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "" #: about_window_lb_system msgid "System" msgstr "" #: about_window_lb_total_mem msgid "Total memory" msgstr "" #: about_window_lb_free_mem msgid "Free memory" msgstr "" #: about_window_lb_java_home msgid "Java home" msgstr "" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "" #: about_window_lb_java_version msgid "Java version" msgstr "" #: about_window_lb_os msgid "Operating system" msgstr "" #: about_window_lb_version msgid "Version" msgstr "" #: about_window_lb_descriptors msgid "Descriptors" msgstr "" #: about_window_lb_description msgid "Description" msgstr "" #: about_window_lb_history msgid "History" msgstr "" #: about_window_lb_organizations msgid "Organizations" msgstr "" #: about_window_lb_organization msgid "Organization" msgstr "" #: about_window_lb_authors msgid "Authors" msgstr "" #: about_window_lb_author msgid "Author" msgstr "" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "" #: help_window_close_button msgid "Return to activity" msgstr "" #: help_window_caption msgid "Help window" msgstr "" #: action_about_caption msgid "Reports" msgstr "" #: action_about_keys msgid "RR" msgstr "" #: action_audio_keys msgid "SS" msgstr "" #: action_help_keys msgid "HH" msgstr "" #: action_info_keys msgid "II" msgstr "" #: action_next_keys msgid "N*" msgstr "" #: action_prev_keys msgid "P*" msgstr "" #: action_reset_keys msgid "R*" msgstr "" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" #: report_new_user msgid "New user..." msgstr "" #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "" #: report_err_creating_user msgid "Error creating new user!" msgstr "" #: report_select_user msgid "User identification for the reports database" msgstr "" #: report_userlist_title msgid "Please select your name:" msgstr "" #: report_ident_user msgid "User identification" msgstr "" #: report_name_prompt msgid "Name:" msgstr "" #: report_id_prompt msgid "Login:" msgstr "" #: report_pw_prompt msgid "Password:" msgstr "" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "" #: report_new_user_data msgid "Creation of a new user:" msgstr "" #: report_err_bad_data msgid "Incorrect data!" msgstr "" #: report_generic_group_name msgid "Generic" msgstr "" #: report_new_group msgid "Create a new group..." msgstr "" #: report_err_creating_group msgid "Error creating the new group!" msgstr "" #: report_grouplist_title msgid "Please select your group:" msgstr "" #: report_new_group_data msgid "Creation of a new users group:" msgstr "" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "" #: report_user_has_pwd msgid "This account is password-protected." msgstr "" #: report_err_init msgid "Error initializing report system." msgstr "" #: report_not_connected msgid "not connected" msgstr "" #: report_err_creating msgid "Error creating reports agent" msgstr "" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "" #: action_return_tooltip msgid "Return to the last menu" msgstr "" #: action_return_keys msgid "T*" msgstr "" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "" #: filefilter_skins msgid "Skins (*.xml)" msgstr "" #: filefilter_all_media msgid "All media files" msgstr "" #: filesystem_copyToRoot_1 msgid "The file" msgstr "" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "" #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "" #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "" #: filesystem_copyFile msgid "Copying file" msgstr "" #: msg_loading msgid "Loading" msgstr "" #: report_err_bad_id msgid "Bad identifier!" msgstr "" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "" #: report_err_bad_name msgid "Bad name!" msgstr "" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "" #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "" #: ftype_image msgid "Image" msgstr "" #: ftype_audio msgid "Digital audio" msgstr "" #: ftype_midi msgid "MIDI file" msgstr "" #: ftype_xml msgid "XML file" msgstr "" #: ftype_anim msgid "Animation" msgstr "" #: ftype_video msgid "Digital video" msgstr "" #: ftype_font msgid "TrueType font" msgstr "" #: ftype_jclic msgid "JClic project" msgstr "" #: ftype_inst msgid "JClic project installer script" msgstr "" #: ftype_unknown msgid "Unknown" msgstr "" #: ftype_animated msgid "animated" msgstr "" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "" #: editor_moveUp_keys msgid "U#38" msgstr "" #: editor_moveDown_keys msgid "W#40" msgstr "" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "" #: about_creditsDoc msgid "about/credits.html" msgstr "" #: about_licenseDoc msgid "about/license.html" msgstr "" #: about_sponsorsCaption msgid "With the support of:" msgstr "" #: about_window_systemInfo msgid "System information" msgstr "" #: about_window_projectInfo msgid "Current project info" msgstr "" #: about_window_reportInfo msgid "Current session results" msgstr "" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "" #: msg_saving_project msgid "Saving project..." msgstr "" #: filefilter_text msgid "Text files (*.txt)" msgstr "" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" i18n/fromLaunchpad/po/jclic-core/JClicMessages_cs.po000066400000000000000000000421661335566474600226050ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2011-09-24 06:40+0000\n" "Last-Translator: Zbyněk Schwarz \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "čas" #: label_actions msgid "tries" msgstr "pokusů" #: label_score msgid "score" msgstr "skóre" #: Skin msgid "Skin" msgstr "Motiv" #: action_next_caption msgid "Next" msgstr "Další" #: action_next_tooltip msgid "Next activity" msgstr "Další aktivita" #: action_prev_caption msgid "Previous" msgstr "Předchozí" #: action_prev_tooltip msgid "Previous activity" msgstr "Předchozí aktivita" #: action_reset_caption msgid "Restart" msgstr "Spustit znovu" #: action_reset_tooltip msgid "Restart activity" msgstr "Restartovat aktivitu" #: action_info_caption msgid "Information" msgstr "Informace" #: about_window_lb_project msgid "Project" msgstr "Projekt" #: about_window_lb_languages msgid "languages" msgstr "jazyky" #: about_window_lb_language msgid "language" msgstr "jazyk" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Návrat" #: about_window_caption msgid "About" msgstr "O aplikaci" #: action_about_tooltip msgid "User reports" msgstr "Uživatelská sestava" #: about_window_lb_report msgid "Report" msgstr "Sestava" #: about_window_browser_button msgid "View in browser" msgstr "Zobrazit v prohlížeči" #: report_no_activities msgid "No activities reported!" msgstr "Nebyly nahlášeny žádné aktivity!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Zpráva není zaregistrována v žádné DB" #: report_lb_time msgid "Time" msgstr "Čas" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Chyba při načítání sekvence" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Chyba při inicializaci QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "Otevřít URL..." #: filesystem_openFile msgid "Open file..." msgstr "Otevřít soubor..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Zadejte prosím URL zdroje, který má být načten." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Chyba při provádění příkazu:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Přesunout vybraný prvek dolů" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Přesunout vybraný prvek nahoru" #: editor_moveDown msgid "Move down" msgstr "Posunout dolů" #: editor_moveUp msgid "Move up" msgstr "Posunout nahoru" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Soubory obrázků (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "PNG obrázky" #: filefilter_jpg msgid "JPG images" msgstr "JPG obrázky" #: filefilter_gif msgid "GIF images" msgstr "GIF obrázky" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Soubory založené na URL jsou určeny pouze pro čtení." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Clic 3.0 balíčky (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Všechny soubory" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "JClic a Clic 3.0 projekty (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "JClic projekty (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Clic 3.0 kompaktní balíčky (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Clic 3.0 otevřené balíčky (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "JClic zkomprimované projekty (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "JClic projekty (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Systém multimédií" #: about_window_lb_level msgid "Level" msgstr "Úroveň" #: about_window_lb_area msgid "Area" msgstr "Oblast" #: report_num_actions msgid "Actions done:" msgstr "Provedené akce:" #: report_project msgid "Project:" msgstr "Projekt:" #: report_lb_totals msgid "Total:" msgstr "Celkem:" #: report_num_projects msgid "Projects:" msgstr "Projekty:" #: report_session msgid "Session:" msgstr "Sezení:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Spouštění externích aplikací je v appletech JClic zakázáno z bezpečnostních " "důvodů." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Chyba při spouštění aktivity!" #: msg_error_loading_project msgid "Error loading project" msgstr "Chyba při načítání projektu" #: msg_error_playing_media msgid "Error playing media!" msgstr "Chyba při přehrávání média!" #: msg_activity_finished msgid "Activity finished!" msgstr "Aktivita dokončena!" #: msg_playing_media msgid "Playing media" msgstr "Přehrávaná média" #: msg_activity_running msgid "Activity running" msgstr "Běžící aktivita" #: msg_activity_ready msgid "Activity ready" msgstr "Aktivita připravena" #: msg_initializing msgid "Initializing..." msgstr "Probíhá inicializace..." #: msg_preparing_media msgid "Preparing media" msgstr "Připravuje se médium" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Chyba při načítání" #: msg_loading_activity msgid "Loading activity" msgstr "Načítá se aktivita" #: msg_loading_project msgid "Loading project..." msgstr "Načítá se projekt..." #: msg_ready msgid "Ready" msgstr "Připraven" #: err_reading_data msgid "Error loading file" msgstr "Chyba při načítání souboru" #: err_file_save msgid "Error saving file!" msgstr "Chyba při ukládání souboru!" #: err_file_open msgid "Error opening file!" msgstr "Chyba při otevírání souboru!" #: report_started msgid "Session started:" msgstr "Sezení spuštěno:" #: report_lb_score msgid "Score" msgstr "Skóre" #: report_lb_actions msgid "Actions" msgstr "Akce" #: report_lb_solved msgid "Ok" msgstr "Ok" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Aktivita" #: report_lb_sequence msgid "Sequence" msgstr "Sekvence" #: report_global_score msgid "Global score:" msgstr "Celkové skóre:" #: report_total_time msgid "Total time on activities:" msgstr "Celkový čas aktivit:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Aktivity ok:" #: report_num_activities msgid "Activities done:" msgstr "Dokončené aktivity:" #: report_num_sequences msgid "Sequences:" msgstr "Sekvence:" #: report_system msgid "Report system:" msgstr "Systém zprávy:" #: report_user msgid "User:" msgstr "Uživatel:" #: report_not_finished msgid "Activity not finished" msgstr "Činnost nebyla dokončena" #: action_info_tooltip msgid "Additional information" msgstr "Další informace" #: action_help_caption msgid "Help" msgstr "Nápověda" #: action_help_tooltip msgid "Help about this activity" msgstr "Nápověda k této činnosti" #: action_audio_caption msgid "Sounds" msgstr "Zvuky" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Zapnout/vypnout zvuky" #: about_window_lb_system msgid "System" msgstr "Systém" #: about_window_lb_total_mem msgid "Total memory" msgstr "Celková paměť" #: about_window_lb_free_mem msgid "Free memory" msgstr "Volná paměť" #: about_window_lb_java_home msgid "Java home" msgstr "Java domov" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Virtuální stroj Java" #: about_window_lb_java_version msgid "Java version" msgstr "Verze Javy" #: about_window_lb_os msgid "Operating system" msgstr "Operační systém" #: about_window_lb_version msgid "Version" msgstr "Verze" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Popisovače" #: about_window_lb_description msgid "Description" msgstr "Popisek" #: about_window_lb_history msgid "History" msgstr "Historie" #: about_window_lb_organizations msgid "Organizations" msgstr "Organizace" #: about_window_lb_organization msgid "Organization" msgstr "Organizace" #: about_window_lb_authors msgid "Authors" msgstr "Autoři" #: about_window_lb_author msgid "Author" msgstr "Tvůrce" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Aktivita" #: help_window_close_button msgid "Return to activity" msgstr "Návrat k aktivitě" #: help_window_caption msgid "Help window" msgstr "Okno nápovědy" #: action_about_caption msgid "Reports" msgstr "Sestavy" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "JClic instalátory projektů (*jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "V databázi sestav nejsou vytvořeni žádní uživatelé!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "V této databázi sestav nejsou vytvořeni žádní uživatelé!" #: report_new_user msgid "New user..." msgstr "Nový uživatel..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Vytvořit nového uživatele v databázi sestav" #: report_err_creating_user msgid "Error creating new user!" msgstr "Chyba při vytvářní nového uživatele!" #: report_select_user msgid "User identification for the reports database" msgstr "Identifikace uživatele v databázi sestav" #: report_userlist_title msgid "Please select your name:" msgstr "Prosím, zadejte své jméno:" #: report_ident_user msgid "User identification" msgstr "Identifikace uživatele" #: report_name_prompt msgid "Name:" msgstr "Jméno:" #: report_id_prompt msgid "Login:" msgstr "Přihlašovací jméno:" #: report_pw_prompt msgid "Password:" msgstr "Heslo:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Potvrdit heslo:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Vytvoření nového uživatele:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Chybná data!" #: report_generic_group_name msgid "Generic" msgstr "Obecný" #: report_new_group msgid "Create a new group..." msgstr "Vytvořit novou skupinu..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Chyba při vytváření nové skupiny!" #: report_grouplist_title msgid "Please select your group:" msgstr "Prosím, vyberte svou skupinu:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Vytvoření nové skupiny uživatelů:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Chybí ID uživatele nebo heslo je chybné." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Tento účet je chráněn heslem." #: report_err_init msgid "Error initializing report system." msgstr "Chyba při inicializaci systému sestav." #: report_not_connected msgid "not connected" msgstr "nepřipojeno" #: report_err_creating msgid "Error creating reports agent" msgstr "Chyba při vytváření agenta sestav" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Zpět" #: action_return_tooltip msgid "Return to the last menu" msgstr "Zpět do poslední nabídky" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Zvuky (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI soubory (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video soubory (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 soubory (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Motivy (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Všechny soubory médií" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Soubor" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "je mimo aktuální složku projektu." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Doporučuje se mít všechny soubory ve stejné složce." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Chce zkopírovat vybrané soubory do projektové složky?" #: filesystem_copyFile msgid "Copying file" msgstr "Kopíruje se soubor" #: msg_loading msgid "Loading" msgstr "Načítá se" #: report_err_bad_id msgid "Bad identifier!" msgstr "Špatný identifikátor!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Tento identifikátor v databázi již existuje!" #: report_err_bad_name msgid "Bad name!" msgstr "Špatné jméno!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Hesla nesouhlasí!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Chyba při připojování se k databázi sestav!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "KONEC: Nyní bude program ukončen." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Nyní program přejde k projektu:" #: ftype_image msgid "Image" msgstr "Obrázek" #: ftype_audio msgid "Digital audio" msgstr "Digitální zvuk" #: ftype_midi msgid "MIDI file" msgstr "MIDI soubor" #: ftype_xml msgid "XML file" msgstr "XML soubor" #: ftype_anim msgid "Animation" msgstr "Animace" #: ftype_video msgid "Digital video" msgstr "Digitální video" #: ftype_font msgid "TrueType font" msgstr "Písmo TrueType" #: ftype_jclic msgid "JClic project" msgstr "JClic projekt" #: ftype_inst msgid "JClic project installer script" msgstr "JClic skript instalátoru projektu" #: ftype_unknown msgid "Unknown" msgstr "Neznámý" #: ftype_animated msgid "animated" msgstr "animovaný" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Písma (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML dokumenty (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "S podporou:" #: about_window_systemInfo msgid "System information" msgstr "Informace o systému" #: about_window_projectInfo msgid "Current project info" msgstr "Informace o aktuálním projektu" #: about_window_reportInfo msgid "Current session results" msgstr "Výsledky aktuálního sezení" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Tento produkt obsahuje software vyvinutý:" #: msg_saving_project msgid "Saving project..." msgstr "Ukládání projektu..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Textové soubory (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Anglická verze od JClic týmu" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Tento program je svobodný software; můžete ho předávat a/nebo upravovat " "podle podmínek GNU General Public License, kterou vydala Free Software " "Foundation; buď verze 2 této licence, nebo (podle vaší volby) některou další " "verzí.
 \r\n" "
Tento program je šířen v naději, že bude užitečný, ale BEZ JAKÉKOLI " "ZÁRUKY; neposkytuje se ani odvozená záruka\r\n" "PRODEJNOSTI nebo VHODNOSTI PRO URČITÝ ÚČEL. Podívejte se na GNU General Public License " "pro další detaily." i18n/fromLaunchpad/po/jclic-core/JClicMessages_da.po000066400000000000000000000352331335566474600225610ustar00rootroot00000000000000# Danish translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2008-10-14 20:06+0000\n" "Last-Translator: Peter Skov \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "tid" #: label_actions msgid "tries" msgstr "forsøg" #: label_score msgid "score" msgstr "score" #: Skin msgid "Skin" msgstr "Skin" #: action_next_caption msgid "Next" msgstr "Næste" #: action_next_tooltip msgid "Next activity" msgstr "Næste aktivitet" #: action_prev_caption msgid "Previous" msgstr "Forrige" #: action_prev_tooltip msgid "Previous activity" msgstr "Forrige aktivitet" #: action_reset_caption msgid "Restart" msgstr "Genstart" #: action_reset_tooltip msgid "Restart activity" msgstr "Genstart aktivitet" #: action_info_caption msgid "Information" msgstr "Information" #: about_window_lb_project msgid "Project" msgstr "Projekt" #: about_window_lb_languages msgid "languages" msgstr "sprog" #: about_window_lb_language msgid "language" msgstr "sprog" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Retur" #: about_window_caption msgid "About" msgstr "Om" #: action_about_tooltip msgid "User reports" msgstr "Bruger rapport" #: about_window_lb_report msgid "Report" msgstr "Rapport" #: about_window_browser_button msgid "View in browser" msgstr "Vis i browser" #: report_no_activities msgid "No activities reported!" msgstr "Ingen aktiviteter rapporteret!" #: report_system_standard msgid "Report not registered in any DB" msgstr "" #: report_lb_time msgid "Time" msgstr "Tid" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "" #: media_check_url msgid "messages/checkmedia.html" msgstr "" #: filesystem_openURL msgid "Open URL..." msgstr "Åbn URL..." #: filesystem_openFile msgid "Open file..." msgstr "Åbn fil..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "" #: msg_error_executing_external msgid "Error executing the command:" msgstr "" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Flyt det valgte element ned" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Flyt det valgte element op" #: editor_moveDown msgid "Move down" msgstr "Flyt ned" #: editor_moveUp msgid "Move up" msgstr "Flyt op" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Billed filer (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "PNG billed" #: filefilter_jpg msgid "JPG images" msgstr "JPG billed" #: filefilter_gif msgid "GIF images" msgstr "GIF billed" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "" #: filefilter_all msgid "All files" msgstr "Alle filer" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "" #: about_window_lb_level msgid "Level" msgstr "Niveau" #: about_window_lb_area msgid "Area" msgstr "Område" #: report_num_actions msgid "Actions done:" msgstr "" #: report_project msgid "Project:" msgstr "Projekt:" #: report_lb_totals msgid "Total:" msgstr "Total:" #: report_num_projects msgid "Projects:" msgstr "Projekter:" #: report_session msgid "Session:" msgstr "" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Fejl ved start af aktivitet!" #: msg_error_loading_project msgid "Error loading project" msgstr "Fejl ved indlæsning af projekt" #: msg_error_playing_media msgid "Error playing media!" msgstr "Fejl ved afspilning af medie!" #: msg_activity_finished msgid "Activity finished!" msgstr "Aktivitet afsluttet!" #: msg_playing_media msgid "Playing media" msgstr "Afspiller medie" #: msg_activity_running msgid "Activity running" msgstr "Aktivitet kører" #: msg_activity_ready msgid "Activity ready" msgstr "Aktivitet klar" #: msg_initializing msgid "Initializing..." msgstr "Initierer..." #: msg_preparing_media msgid "Preparing media" msgstr "Forbereder medie" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Fejl ved indlæsning af aktivitet" #: msg_loading_activity msgid "Loading activity" msgstr "Indlæser aktivitet..." #: msg_loading_project msgid "Loading project..." msgstr "Indlæser projekt..." #: msg_ready msgid "Ready" msgstr "Klar" #: err_reading_data msgid "Error loading file" msgstr "Fejl ved indlæsning af fil" #: err_file_save msgid "Error saving file!" msgstr "Fejl ved gemning af fil!" #: err_file_open msgid "Error opening file!" msgstr "Fejl ved åbning af fil!" #: report_started msgid "Session started:" msgstr "" #: report_lb_score msgid "Score" msgstr "" #: report_lb_actions msgid "Actions" msgstr "Handlinger" #: report_lb_solved msgid "Ok" msgstr "Ok" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Aktivitet" #: report_lb_sequence msgid "Sequence" msgstr "Sekvens" #: report_global_score msgid "Global score:" msgstr "" #: report_total_time msgid "Total time on activities:" msgstr "" #: report_num_activities_solved msgid "Activities ok:" msgstr "Aktiviteter OK:" #: report_num_activities msgid "Activities done:" msgstr "Aktiviteter udført:" #: report_num_sequences msgid "Sequences:" msgstr "Sekvenser:" #: report_system msgid "Report system:" msgstr "" #: report_user msgid "User:" msgstr "Bruger:" #: report_not_finished msgid "Activity not finished" msgstr "Aktivitet ikke afsluttet" #: action_info_tooltip msgid "Additional information" msgstr "Yderligere oplysninger" #: action_help_caption msgid "Help" msgstr "Hjælp" #: action_help_tooltip msgid "Help about this activity" msgstr "Hjælp til denne aktivitet" #: action_audio_caption msgid "Sounds" msgstr "Lyde" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "" #: about_window_lb_system msgid "System" msgstr "System" #: about_window_lb_total_mem msgid "Total memory" msgstr "Total hukommelse" #: about_window_lb_free_mem msgid "Free memory" msgstr "Fri hukommelse" #: about_window_lb_java_home msgid "Java home" msgstr "" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "" #: about_window_lb_java_version msgid "Java version" msgstr "Java version" #: about_window_lb_os msgid "Operating system" msgstr "Operativ system" #: about_window_lb_version msgid "Version" msgstr "Version" #: about_window_lb_descriptors msgid "Descriptors" msgstr "" #: about_window_lb_description msgid "Description" msgstr "Beskrivelse" #: about_window_lb_history msgid "History" msgstr "Historie" #: about_window_lb_organizations msgid "Organizations" msgstr "Organisationer" #: about_window_lb_organization msgid "Organization" msgstr "Organisation" #: about_window_lb_authors msgid "Authors" msgstr "Forfattere" #: about_window_lb_author msgid "Author" msgstr "Forfatter" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Aktivitet" #: help_window_close_button msgid "Return to activity" msgstr "Tilbage til aktivitet" #: help_window_caption msgid "Help window" msgstr "Hjælpe vindue" #: action_about_caption msgid "Reports" msgstr "Rapporter" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" #: report_new_user msgid "New user..." msgstr "Ny bruger..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "" #: report_err_creating_user msgid "Error creating new user!" msgstr "" #: report_select_user msgid "User identification for the reports database" msgstr "" #: report_userlist_title msgid "Please select your name:" msgstr "Vælg venligst dit navn:" #: report_ident_user msgid "User identification" msgstr "Bruger identifikation" #: report_name_prompt msgid "Name:" msgstr "Navn:" #: report_id_prompt msgid "Login:" msgstr "Logind:" #: report_pw_prompt msgid "Password:" msgstr "Adgangskode:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Bekræft adgangskode:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Oprettelse af ny bruger:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Ukorrekte data!" #: report_generic_group_name msgid "Generic" msgstr "Generisk" #: report_new_group msgid "Create a new group..." msgstr "Opret en ny gruppe..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Fejl ved oprettelse af ny gruppe!" #: report_grouplist_title msgid "Please select your group:" msgstr "Vælg venligst din gruppe:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "" #: report_user_has_pwd msgid "This account is password-protected." msgstr "Denne konto er beskyttet af en adgangskode." #: report_err_init msgid "Error initializing report system." msgstr "" #: report_not_connected msgid "not connected" msgstr "ikke forbundet" #: report_err_creating msgid "Error creating reports agent" msgstr "" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Retur" #: action_return_tooltip msgid "Return to the last menu" msgstr "Retur til sidste menu" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Lyde (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI filer (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video filer (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 filer (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "" #: filefilter_all_media msgid "All media files" msgstr "Alle mediefiler" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Filen" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "" #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Det er tilrådeligt at have alle filer i samme mappe." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "" #: filesystem_copyFile msgid "Copying file" msgstr "Kopierer fil" #: msg_loading msgid "Loading" msgstr "Indlæser" #: report_err_bad_id msgid "Bad identifier!" msgstr "" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "" #: report_err_bad_name msgid "Bad name!" msgstr "Ugyldigt navn!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Adgangskoderne er ikke ens!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "" #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "" #: ftype_image msgid "Image" msgstr "Billede" #: ftype_audio msgid "Digital audio" msgstr "" #: ftype_midi msgid "MIDI file" msgstr "MIDI fil" #: ftype_xml msgid "XML file" msgstr "XML fil" #: ftype_anim msgid "Animation" msgstr "Animation" #: ftype_video msgid "Digital video" msgstr "Digital video" #: ftype_font msgid "TrueType font" msgstr "TrueType skrifttype" #: ftype_jclic msgid "JClic project" msgstr "" #: ftype_inst msgid "JClic project installer script" msgstr "" #: ftype_unknown msgid "Unknown" msgstr "Ukendt" #: ftype_animated msgid "animated" msgstr "animeret" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Fonte (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "" #: editor_moveDown_keys msgid "W#40" msgstr "" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML dokumenter (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "" #: about_licenseDoc msgid "about/license.html" msgstr "om/licens.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Med støtte fra:" #: about_window_systemInfo msgid "System information" msgstr "System information" #: about_window_projectInfo msgid "Current project info" msgstr "Aktuel projekt info" #: about_window_reportInfo msgid "Current session results" msgstr "" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Dette produkt inkluderer software udviklet af:" #: msg_saving_project msgid "Saving project..." msgstr "Gemmer projekt..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Tekst filer (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Danish version by carson" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" i18n/fromLaunchpad/po/jclic-core/JClicMessages_de.po000066400000000000000000000416761335566474600225750ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2009-08-22 13:45+0000\n" "Last-Translator: Keruskerfuerst \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "Zeit" #: label_actions msgid "tries" msgstr "Versuche" #: label_score msgid "score" msgstr "Ergebnis" #: Skin msgid "Skin" msgstr "Design" #: action_next_caption msgid "Next" msgstr "Weiter" #: action_next_tooltip msgid "Next activity" msgstr "Nächste Übung" #: action_prev_caption msgid "Previous" msgstr "Zurück" #: action_prev_tooltip msgid "Previous activity" msgstr "Vorherige Übung" #: action_reset_caption msgid "Restart" msgstr "Neu starten" #: action_reset_tooltip msgid "Restart activity" msgstr "Übung neu starten" #: action_info_caption msgid "Information" msgstr "Information" #: about_window_lb_project msgid "Project" msgstr "Sammlung" #: about_window_lb_languages msgid "languages" msgstr "Sprachen" #: about_window_lb_language msgid "language" msgstr "Sprache" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Zurück" #: about_window_caption msgid "About" msgstr "Info" #: action_about_tooltip msgid "User reports" msgstr "Benutzerberichte" #: about_window_lb_report msgid "Report" msgstr "Übungsbericht" #: about_window_browser_button msgid "View in browser" msgstr "Ansicht im Browser" #: report_no_activities msgid "No activities reported!" msgstr "Keine Übungsberichte vorhanden!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Bericht in keiner Datenbank eingetragen" #: report_lb_time msgid "Time" msgstr "Zeit" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Fehler beim Laden der Sequenz" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Fehler beim Starten von QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "URL öffnen..." #: filesystem_openFile msgid "Open file..." msgstr "Datei öffnen..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "URL der zu ladenden Datei hier eintragen." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Fehler beim Ausführen des Befehls:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Ausgewähltes Element hinunter verschieben" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Ausgewähltes Element nach oben verschieben" #: editor_moveDown msgid "Move down" msgstr "Abwärts" #: editor_moveUp msgid "Move up" msgstr "Aufwärts" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Grafikdateien (*.gif, *.jpg, *.png)" #: filefilter_png msgid "PNG images" msgstr "PNG-Grafiken" #: filefilter_jpg msgid "JPG images" msgstr "JPG-Grafiken" #: filefilter_gif msgid "GIF images" msgstr "GIF-Dateien" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "URL-basierte Dateien können nicht überschrieben werden." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Click 3.0 Pakete (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Alle Dateien" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "JClic und Clic 3.0.Projekte (*.jclic, *.jclic.zip, *.pac. *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "JClic-Projekte (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Komprimierte Clic 3.0.-Pakete (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Offene Clic 3.0-Pakete (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Gezippte JClic-Projekte (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "JClic-Projekte (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Multimediasystem" #: about_window_lb_level msgid "Level" msgstr "Stufe" #: about_window_lb_area msgid "Area" msgstr "Bereich" #: report_num_actions msgid "Actions done:" msgstr "Durchgeführte Aktionen:" #: report_project msgid "Project:" msgstr "Projekt:" #: report_lb_totals msgid "Total:" msgstr "Gesamt:" #: report_num_projects msgid "Projects:" msgstr "Projekte:" #: report_session msgid "Session:" msgstr "Sitzung:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Aus Sicherheitsgründen wurde das Ausführen externer Programme in JClic-" "Applets deaktiviert." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Fehler beim Starten der Übung!" #: msg_error_loading_project msgid "Error loading project" msgstr "Fehler beim Laden der Sammlung" #: msg_error_playing_media msgid "Error playing media!" msgstr "Fehler beim Abspielen des Mediums!" #: msg_activity_finished msgid "Activity finished!" msgstr "Übung beendet!" #: msg_playing_media msgid "Playing media" msgstr "Multimediadatei wird abgespielt" #: msg_activity_running msgid "Activity running" msgstr "Übung läuft" #: msg_activity_ready msgid "Activity ready" msgstr "Übung bereit" #: msg_initializing msgid "Initializing..." msgstr "Wird gestartet..." #: msg_preparing_media msgid "Preparing media" msgstr "Multimediadatei wird geladen" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Fehler beim Laden der Übung" #: msg_loading_activity msgid "Loading activity" msgstr "Übung wird geladen" #: msg_loading_project msgid "Loading project..." msgstr "Sammlung wird geladen..." #: msg_ready msgid "Ready" msgstr "Bereit" #: err_reading_data msgid "Error loading file" msgstr "Fehler beim Laden der Datei" #: err_file_save msgid "Error saving file!" msgstr "Fehler beim Speichern der Datei!" #: err_file_open msgid "Error opening file!" msgstr "Fehler beim Öffnen der Datei!" #: report_started msgid "Session started:" msgstr "Sitzung gestartet:" #: report_lb_score msgid "Score" msgstr "Ergebnis" #: report_lb_actions msgid "Actions" msgstr "Aktionen" #: report_lb_solved msgid "Ok" msgstr "OK" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Übung" #: report_lb_sequence msgid "Sequence" msgstr "Sequenz" #: report_global_score msgid "Global score:" msgstr "Gesamtpunktezahl:" #: report_total_time msgid "Total time on activities:" msgstr "Übungs-Gesamtzeit:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Korrekte Übungen:" #: report_num_activities msgid "Activities done:" msgstr "Beendete Übungen:" #: report_num_sequences msgid "Sequences:" msgstr "Sequenzen:" #: report_system msgid "Report system:" msgstr "Report System:" #: report_user msgid "User:" msgstr "User:" #: report_not_finished msgid "Activity not finished" msgstr "Übung nicht beendet" #: action_info_tooltip msgid "Additional information" msgstr "Zusatzinfos" #: action_help_caption msgid "Help" msgstr "Hilfe" #: action_help_tooltip msgid "Help about this activity" msgstr "Hilfe zu dieser Übung" #: action_audio_caption msgid "Sounds" msgstr "Sounds" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Sound ein/aus" #: about_window_lb_system msgid "System" msgstr "System" #: about_window_lb_total_mem msgid "Total memory" msgstr "Gesamter Speicherplatz" #: about_window_lb_free_mem msgid "Free memory" msgstr "Freier Speicherplatz" #: about_window_lb_java_home msgid "Java home" msgstr "Java Home" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Java Virtual Machine" #: about_window_lb_java_version msgid "Java version" msgstr "Java Version" #: about_window_lb_os msgid "Operating system" msgstr "Betriebssystem" #: about_window_lb_version msgid "Version" msgstr "Version" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Deskriptoren" #: about_window_lb_description msgid "Description" msgstr "Beschreibung" #: about_window_lb_history msgid "History" msgstr "History" #: about_window_lb_organizations msgid "Organizations" msgstr "Organisationen" #: about_window_lb_organization msgid "Organization" msgstr "Organisation" #: about_window_lb_authors msgid "Authors" msgstr "Autor/innen" #: about_window_lb_author msgid "Author" msgstr "Autor/in" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Übung" #: help_window_close_button msgid "Return to activity" msgstr "Zurück zur Übung" #: help_window_caption msgid "Help window" msgstr "Hilfe-Fenster" #: action_about_caption msgid "Reports" msgstr "Übungsberichte" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "JClic-Projekt-Installer (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Keine Usereinträge in der Datenbank." #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "Keine Usereinträge für diese Gruppe in der Datenbank." #: report_new_user msgid "New user..." msgstr "Neuer User..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Neuen User in der Benutzerdatenbank anlegen" #: report_err_creating_user msgid "Error creating new user!" msgstr "Fehler beim Anlegen des neuen Users!" #: report_select_user msgid "User identification for the reports database" msgstr "User-ID für die Berichtsdatenbank" #: report_userlist_title msgid "Please select your name:" msgstr "Namen auswählen:" #: report_ident_user msgid "User identification" msgstr "User-ID" #: report_name_prompt msgid "Name:" msgstr "Name:" #: report_id_prompt msgid "Login:" msgstr "Login:" #: report_pw_prompt msgid "Password:" msgstr "Passwort:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Passwort bestätigen:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Neuer User wird angelegt:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Falsche Eingabe!" #: report_generic_group_name msgid "Generic" msgstr "Allgemein" #: report_new_group msgid "Create a new group..." msgstr "Neue Gruppe anlegen..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Fehler beim Anlegen der neuen Gruppe!" #: report_grouplist_title msgid "Please select your group:" msgstr "Bitte Gruppe auswählen:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Neue Usergruppe wird angelegt:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Falsche User-ID oder falsches Passwort." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Dieser Account ist passwortgeschützt." #: report_err_init msgid "Error initializing report system." msgstr "Fehler beim Starten des Report Systems." #: report_not_connected msgid "not connected" msgstr "keine Verbindung" #: report_err_creating msgid "Error creating reports agent" msgstr "Fehler beim Erstellen des Übungsberichts" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Zurück" #: action_return_tooltip msgid "Return to the last menu" msgstr "Zurück zu vorherigem Menü" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI-Files (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Videodateien (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 files (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Skins (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Alle Mediendateien" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Datei" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "befindet sich nicht im aktuellen Projektordner." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Es wird empfohlen, alle Dateien im gleichen Ordner abzuspeichern." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "" "Möchten Sie die ausgewählte Datei in den Projektordner hineinkopieren?" #: filesystem_copyFile msgid "Copying file" msgstr "Datei wird kopiert" #: msg_loading msgid "Loading" msgstr "Wird geladen" #: report_err_bad_id msgid "Bad identifier!" msgstr "Falsche Bezeichnung!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "User existiert bereits in der Datenbank!" #: report_err_bad_name msgid "Bad name!" msgstr "Falscher Name!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Falsches Passwort!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Fehler beim Übermitteln des Übungsberichts an die Datenbank!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "EXIT: Programm wird geschlossen" #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Übergang vom Programm zum Projekt:" #: ftype_image msgid "Image" msgstr "Grafik" #: ftype_audio msgid "Digital audio" msgstr "Sounddatei" #: ftype_midi msgid "MIDI file" msgstr "MIDI-File" #: ftype_xml msgid "XML file" msgstr "XML-Datei" #: ftype_anim msgid "Animation" msgstr "Animation" #: ftype_video msgid "Digital video" msgstr "Digitale Video-Datei" #: ftype_font msgid "TrueType font" msgstr "True-Type Schrift" #: ftype_jclic msgid "JClic project" msgstr "JClic Projekt" #: ftype_inst msgid "JClic project installer script" msgstr "JClicProjekt-Installer Skript" #: ftype_unknown msgid "Unknown" msgstr "Unbekannt" #: ftype_animated msgid "animated" msgstr "animiert" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Fonts (*.tff)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML-Dokumente (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits_de.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license_de.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Unterstützt von:" #: about_window_systemInfo msgid "System information" msgstr "Systeminformationen" #: about_window_projectInfo msgid "Current project info" msgstr "Info über aktuelle Sammlung" #: about_window_reportInfo msgid "Current session results" msgstr "Übungsbericht" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Dieses Produkt basiert auf Software von:" #: msg_saving_project msgid "Saving project..." msgstr "Projekt wird gespeichert..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Textdateien (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" "Deutsche Fassung:
EDUCATION HIGHWAY
Innovationszentrum für Schule " "und Neue Technologie GmbH
Linz/Austria, http://www.eduhi.at
Gemeinsam " "mit:
Astrid Leeb
Ingeborg Kanz
Monika Andraschko
Caroline Weigner" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Dieses Programm ist eine kostenlose Software, es kann unter den Bedingungen " "der GNU General Public License (veröffentlicht von der Free Software " "Foundation - entweder Version 2 der Lizenz oder eine andere spätere " "Version) vertrieben und/oder modifiziert werden.
 
Dieses " "Programm wird OHNE JEGLICHE GEWÄHR; GEBRAUCHSTAUGLICHKEIT oder " "TAUGLICHKEIT FÜR EINEN BESTIMMTEN ZWECK vertrieben. Nähere " "Information unter GNU " "General Public License" i18n/fromLaunchpad/po/jclic-core/JClicMessages_el.po000066400000000000000000000522771335566474600226040ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2008-07-06 08:31+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "χρόνος" #: label_actions msgid "tries" msgstr "προσπάθειες" #: label_score msgid "score" msgstr "βαθμολογία" #: Skin msgid "Skin" msgstr "Θέμα" #: action_next_caption msgid "Next" msgstr "Επόμενο" #: action_next_tooltip msgid "Next activity" msgstr "Επόμενη δραστηριότητα" #: action_prev_caption msgid "Previous" msgstr "Προηγούμενο" #: action_prev_tooltip msgid "Previous activity" msgstr "Προηγούμενη δραστηριότητα" #: action_reset_caption msgid "Restart" msgstr "Επανεκκίνηση" #: action_reset_tooltip msgid "Restart activity" msgstr "Επανεκκίνηση δραστηριότητας" #: action_info_caption msgid "Information" msgstr "Πληροφορίες" #: about_window_lb_project msgid "Project" msgstr "Έργο" #: about_window_lb_languages msgid "languages" msgstr "γλώσσες" #: about_window_lb_language msgid "language" msgstr "γλώσσα" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Επιστροφή" #: about_window_caption msgid "About" msgstr "Σχετικά" #: action_about_tooltip msgid "User reports" msgstr "Αναφορές χρήστη" #: about_window_lb_report msgid "Report" msgstr "Αναφορά" #: about_window_browser_button msgid "View in browser" msgstr "Προβολή στον φυλλομετρητή" #: report_no_activities msgid "No activities reported!" msgstr "Για καμμία δραστηριότητα δεν έχει υποβληθεί αναφορά!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Η αναφορά δεν εγγράφηκε στις βάσεις δεδομένων" #: report_lb_time msgid "Time" msgstr "Χρόνος" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Σφάλμα φόρτωσης αλληλουχίας" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Σφάλμα αρχικοποίησης του QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "Άνοιγμα URL..." #: filesystem_openFile msgid "Open file..." msgstr "Άνοιγμα αρχείου..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Παρακαλώ εισάγετε το URL στον πόρο για να φορτωθεί" #: msg_error_executing_external msgid "Error executing the command:" msgstr "Σφάλμα εκτέλεσης της εντολής:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Μετακίνηση επιλεγμένου στοιχείου κάτω" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Μετακίνηση επιλεγμένου στοιχείου πάνω" #: editor_moveDown msgid "Move down" msgstr "Μετακίνηση κάτω" #: editor_moveUp msgid "Move up" msgstr "Μετακίνηση πάνω" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Αρχεία εικόνων (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "Εικόνες PNG" #: filefilter_jpg msgid "JPG images" msgstr "Εικόνες JPG" #: filefilter_gif msgid "GIF images" msgstr "Εικόνες GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Τα αρχεία που στηρίζονται σε URL είναι μόνο για ανάγνωση." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Πακέτα του Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Όλα τα αρχεία" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Έργα του JClic και του Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Έργα του JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Συμπιεσμένα πακέτα του Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "To Clic 3.0 ανοίγει πακέτα (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Συμπιεσμένα έργα του JClic (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Έργα του JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Σύστημα πολυμέσων" #: about_window_lb_level msgid "Level" msgstr "Επίπεδο" #: about_window_lb_area msgid "Area" msgstr "Περιοχή" #: report_num_actions msgid "Actions done:" msgstr "Οι ενέργειες ολοκληρώθηκαν:" #: report_project msgid "Project:" msgstr "Έργο:" #: report_lb_totals msgid "Total:" msgstr "Σύνολο:" #: report_num_projects msgid "Projects:" msgstr "Έργα:" #: report_session msgid "Session:" msgstr "Συνεδρίες:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Για λόγους ασφαλείας, η εκτέλεση εξωτερικών εφαρμογών είναι απενεργοποιημένη " "στις μικροεφαρμογές του JClic." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Σφάλμα έναρξης της δραστηριότητας!" #: msg_error_loading_project msgid "Error loading project" msgstr "Σφάλμα φόρτωσης του έργου" #: msg_error_playing_media msgid "Error playing media!" msgstr "Σφάλμα αναπαραγωγής του μέσου!" #: msg_activity_finished msgid "Activity finished!" msgstr "Η δραστηριότητα ολοκληρώθηκε!" #: msg_playing_media msgid "Playing media" msgstr "Αναπαραγωγή μέσων" #: msg_activity_running msgid "Activity running" msgstr "Η δραστηριότητα εκτελείται" #: msg_activity_ready msgid "Activity ready" msgstr "Η δραστηριότητα είναι έτοιμη" #: msg_initializing msgid "Initializing..." msgstr "Αρχικοποίηση..." #: msg_preparing_media msgid "Preparing media" msgstr "Προετοιμασία των μέσων" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Σφάλμα φόρτωσης της δραστηριότητας" #: msg_loading_activity msgid "Loading activity" msgstr "Φόρτωση δραστηριότητας" #: msg_loading_project msgid "Loading project..." msgstr "Φόρτωση έργου..." #: msg_ready msgid "Ready" msgstr "Έτοιμο" #: err_reading_data msgid "Error loading file" msgstr "Σφάλμα φόρτωσης αρχείου" #: err_file_save msgid "Error saving file!" msgstr "Σφάλμα αποθήκευσης του αρχείου!" #: err_file_open msgid "Error opening file!" msgstr "Σφάλμα ανοίγματος του αρχείου!" #: report_started msgid "Session started:" msgstr "Έναρξη συνεδρίας:" #: report_lb_score msgid "Score" msgstr "Βαθμολογία" #: report_lb_actions msgid "Actions" msgstr "Ενέργειες" #: report_lb_solved msgid "Ok" msgstr "Εντάξει" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Δραστηριότητα" #: report_lb_sequence msgid "Sequence" msgstr "Αλληλουχία" #: report_global_score msgid "Global score:" msgstr "Συνολική βαθμολογία:" #: report_total_time msgid "Total time on activities:" msgstr "Συνολικός χρόνος δραστηριοτήτων:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Δραστηριότητες, εντάξει:" #: report_num_activities msgid "Activities done:" msgstr "Ολοκληρωμένες δραστηριότητες:" #: report_num_sequences msgid "Sequences:" msgstr "Αλληλουχίες" #: report_system msgid "Report system:" msgstr "Σύστημα αναφορών:" #: report_user msgid "User:" msgstr "Χρήστης:" #: report_not_finished msgid "Activity not finished" msgstr "Η δραστηριότητα δεν ολοκληρώθηκε" #: action_info_tooltip msgid "Additional information" msgstr "Πρόσθετες πληροφορίες" #: action_help_caption msgid "Help" msgstr "Βοήθεια" #: action_help_tooltip msgid "Help about this activity" msgstr "Βοήθεια για αυτή τη δραστηριότητα" #: action_audio_caption msgid "Sounds" msgstr "Ήχοι" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Ενεργοποίηση/Απενεργοποίηση ήχων" #: about_window_lb_system msgid "System" msgstr "Σύστημα" #: about_window_lb_total_mem msgid "Total memory" msgstr "Συνολική μνήμη" #: about_window_lb_free_mem msgid "Free memory" msgstr "Ελεύθερη μνήμη" #: about_window_lb_java_home msgid "Java home" msgstr "Φάκελος Java" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Εικονική μηχανή Java" #: about_window_lb_java_version msgid "Java version" msgstr "Έκδοση Java" #: about_window_lb_os msgid "Operating system" msgstr "Λειτουργικό σύστημα" #: about_window_lb_version msgid "Version" msgstr "Έκδοση" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Περιγραφείς" #: about_window_lb_description msgid "Description" msgstr "Περιγραφή" #: about_window_lb_history msgid "History" msgstr "Ιστορικό" #: about_window_lb_organizations msgid "Organizations" msgstr "Φορείς" #: about_window_lb_organization msgid "Organization" msgstr "Φορέας" #: about_window_lb_authors msgid "Authors" msgstr "Δημιουργοί" #: about_window_lb_author msgid "Author" msgstr "Δημιουργός" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Δραστηριότητα" #: help_window_close_button msgid "Return to activity" msgstr "Επιστροφή στη δραστηριότητα" #: help_window_caption msgid "Help window" msgstr "Παράθυρο βοήθειας" #: action_about_caption msgid "Reports" msgstr "Αναφορές" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "ΩΩ" #: action_info_keys msgid "II" msgstr "ΙΙ" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Εγκαταστάτες έργων JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Δεν ορίστηκαν χρήστες στη βάση δεδομένων των αναφορών!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "Δεν εντοπίστηκαν χρήστες για αυτή την ομάδα στη βάση δεδομένων των αναφορών!" #: report_new_user msgid "New user..." msgstr "Νέος χρήστης..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Δημιουργία νέου χρήστη στη βάση δεδομένων των αναφορών" #: report_err_creating_user msgid "Error creating new user!" msgstr "Σφάλμα κατά τη δημιουργία νέου χρήστη!" #: report_select_user msgid "User identification for the reports database" msgstr "Αναγνώριση χρήστη για τη βάση δεδομένων των αναφορών" #: report_userlist_title msgid "Please select your name:" msgstr "Παρακαλώ επιλέξτε το όνομά σας:" #: report_ident_user msgid "User identification" msgstr "Αναγνώριση χρήστη" #: report_name_prompt msgid "Name:" msgstr "Όνομα" #: report_id_prompt msgid "Login:" msgstr "Είσοδος:" #: report_pw_prompt msgid "Password:" msgstr "Κωδικός πρόσβασης:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Επιβεβαίωση κωδικού πρόσβασης:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Δημιουργία νέου χρήστη:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Λανθασμένα δεδομένα!" #: report_generic_group_name msgid "Generic" msgstr "Γενικό" #: report_new_group msgid "Create a new group..." msgstr "Δημιουργία νέας ομάδας..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Σφάλμα κατά τη δημιουργία νέας ομάδας!" #: report_grouplist_title msgid "Please select your group:" msgstr "Παρακαλώ επιλέξτε την ομάδα σας:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Δημιουργία μιας νέας ομάδας χρηστών:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Ελλιπές όνομα χρήστη ή λανθασμένος κωδικός πρόσβασης." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Αυτός ο λογαριασμός έχει προστασία κωδικού πρόσβασης" #: report_err_init msgid "Error initializing report system." msgstr "Σφάλμα έναρξης συστήματος αναφορών." #: report_not_connected msgid "not connected" msgstr "δεν συνδέθηκε" #: report_err_creating msgid "Error creating reports agent" msgstr "Σφάλμα στη δημιουργία συντελεστή αναφορών" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Επιστροφή" #: action_return_tooltip msgid "Return to the last menu" msgstr "Επιστροφή στο τελευταίο μενού" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Ήχοι (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Αρχεία MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Αρχεία βίντεο (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Αρχεία Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Θέματα (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Όλα τα αρχεία πολυμέσων" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Το αρχείο" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "βρίσκεται εκτός φακέλου του παρόντος έργου." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Προτείνεται όλα τα αρχεία να αποθηκεύονται στον ίδιο φάκελο." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Θέλετε να αντιγράψετε το επιλεγμένο αρχείο στον φάκελο του έργου;" #: filesystem_copyFile msgid "Copying file" msgstr "Αντιγραφή αρχείου" #: msg_loading msgid "Loading" msgstr "Φόρτωση" #: report_err_bad_id msgid "Bad identifier!" msgstr "Εσφαλμένο αναγνωριστικό!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Αυτό το αναγνωριστικό υπάρχει ήδη στη βάση δεδομένων!" #: report_err_bad_name msgid "Bad name!" msgstr "Εσφαλμένο όνομα!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Σφάλμα κατά τη σύνδεση στη βάση δεδομένων των αναφορών" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "ΕΞΟΔΟΣ: Σε αυτό το σημείο, το πρόγραμμα θα κλείσει." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Σε αυτό το σημείο το πρόγραμμα θα μεταβεί στο έργο:" #: ftype_image msgid "Image" msgstr "Εικόνα" #: ftype_audio msgid "Digital audio" msgstr "Ψηφιακός ήχος" #: ftype_midi msgid "MIDI file" msgstr "Αρχείο MIDI" #: ftype_xml msgid "XML file" msgstr "Αρχείο XML" #: ftype_anim msgid "Animation" msgstr "Κινούμενη απεικόνιση" #: ftype_video msgid "Digital video" msgstr "Ψηφιακό βίντεο" #: ftype_font msgid "TrueType font" msgstr "Γραμματοσειρά TrueType" #: ftype_jclic msgid "JClic project" msgstr "Έργο του JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Σενάριο εγκατάστασης έργου του JClic" #: ftype_unknown msgid "Unknown" msgstr "Άγνωστο" #: ftype_animated msgid "animated" msgstr "κινούμενο" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Γραμματοσειρές (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Αρχεία HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Με την υποστήριξη:" #: about_window_systemInfo msgid "System information" msgstr "Πληροφορίες συστήματος" #: about_window_projectInfo msgid "Current project info" msgstr "Πληροφορίες τρέχοντος έργου" #: about_window_reportInfo msgid "Current session results" msgstr "Αποτελέσματα τρέχουσας συνεδρίας" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Αυτό το προϊόν περιλαμβάνει λογισμικό που έχει αναπτυχθεί από:" #: msg_saving_project msgid "Saving project..." msgstr "Αποθήκευση έργου..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Αρχεία κειμένου (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" "Ελληνική έκδοση, από τους: Γιάννη Κασκαμανίδη (ttnfy17@yahoo.gr), Κυριάκο " "Μήτκα, Γιώργο Μακαρατζή, Γιάννη Κίκα" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Αυτή η εφαρμογή ανήκει στο Ελεύθερο Λογισμικό. Μπορείτε να την αναδιανείμετε " "ή/και να την τροποποιήσετε υπό τους όρους της Γενικής Άδειας Χρήσης GNU " "(έκδοση 2 ή επόμενη), που εκδόθηκε από το Ίδρυμα Ελεύθερου Λογισμικού (Free " "Software Foundation).
 
Η εφαρμογή διανέμεται με την προσδοκία " "ότι θα είναι χρήσιμη, χωρίς όμως εγγύηση ποιότητας ή καλής λειτουργίας και, " "ακόμη, χωρίς υποδηλούμενη εγγύηση εμπορευσιμότητας ή καταλληλότητας για " "συγκεκριμένους σκοπούς. Δείτε τη Γενική Άδεια Χρήσης GNU για " "περισσότερες λεπτομέρειες." i18n/fromLaunchpad/po/jclic-core/JClicMessages_es.po000066400000000000000000000424041335566474600226020ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2010-09-19 19:37+0000\n" "Last-Translator: farid \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "tiempo" #: label_actions msgid "tries" msgstr "intentos" #: label_score msgid "score" msgstr "aciertos" #: Skin msgid "Skin" msgstr "Aspecto" #: action_next_caption msgid "Next" msgstr "Siguiente" #: action_next_tooltip msgid "Next activity" msgstr "Actividad siguiente" #: action_prev_caption msgid "Previous" msgstr "Anterior" #: action_prev_tooltip msgid "Previous activity" msgstr "Actividad anterior" #: action_reset_caption msgid "Restart" msgstr "Reiniciar" #: action_reset_tooltip msgid "Restart activity" msgstr "Reiniciar la actividad" #: action_info_caption msgid "Information" msgstr "Información" #: about_window_lb_project msgid "Project" msgstr "Proyecto" #: about_window_lb_languages msgid "languages" msgstr "Idiomas" #: about_window_lb_language msgid "language" msgstr "Idioma" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Volver" #: about_window_caption msgid "About" msgstr "Acerca de..." #: action_about_tooltip msgid "User reports" msgstr "informes de usuario" #: about_window_lb_report msgid "Report" msgstr "Informes" #: about_window_browser_button msgid "View in browser" msgstr "Verlo en el navegador" #: report_no_activities msgid "No activities reported!" msgstr "¡No hay ninguna actividad reportada!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Los datos del informe no se están guardando" #: report_lb_time msgid "Time" msgstr "Tiempo" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Error al cargar la secuencia" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "¡Error al inicializar QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia_es.html" #: filesystem_openURL msgid "Open URL..." msgstr "Abrir URL..." #: filesystem_openFile msgid "Open file..." msgstr "Abrir archivo..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Escriba la URL del recurso al que desea acceder." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Error al ejecutar la orden:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Mover el elemento seleccionado hacia abajo" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Mover el elemento seleccionado hacia arriba" #: editor_moveDown msgid "Move down" msgstr "Mover hacia abajo" #: editor_moveUp msgid "Move up" msgstr "Mover hacia arriba" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Imágenes (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "Imágenes PNG" #: filefilter_jpg msgid "JPG images" msgstr "Imágenes JPG" #: filefilter_gif msgid "GIF images" msgstr "Imágenes GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Los archivos basados en una URL son de solo lectura." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Paquetes Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Todos los archivos" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Proyectos JClic y Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Proyectos JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Paquetes compactos Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Paquetes abiertos Clic 3.0 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Proyectos JClic comprimidos (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Proyectos JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Sistema multimedia" #: about_window_lb_level msgid "Level" msgstr "Nivel" #: about_window_lb_area msgid "Area" msgstr "Área" #: report_num_actions msgid "Actions done:" msgstr "Acciones efectuadas:" #: report_project msgid "Project:" msgstr "Proyecto:" #: report_lb_totals msgid "Total:" msgstr "Totales:" #: report_num_projects msgid "Projects:" msgstr "Proyectos:" #: report_session msgid "Session:" msgstr "Sesión:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Por razones de seguridad la invocación a programas externos está " "deshabilitada en los applets JClic." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "¡Error al iniciar la actividad!" #: msg_error_loading_project msgid "Error loading project" msgstr "Error al cargar el proyecto" #: msg_error_playing_media msgid "Error playing media!" msgstr "¡Error del recurso multimedia!" #: msg_activity_finished msgid "Activity finished!" msgstr "¡Actividad terminada!" #: msg_playing_media msgid "Playing media" msgstr "Reproduciendo multimedia" #: msg_activity_running msgid "Activity running" msgstr "Actividad en marcha" #: msg_activity_ready msgid "Activity ready" msgstr "Actividad preparada" #: msg_initializing msgid "Initializing..." msgstr "Inicializando..." #: msg_preparing_media msgid "Preparing media" msgstr "Preparando multimedia" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Error al cargar la actividad" #: msg_loading_activity msgid "Loading activity" msgstr "Cargando actividad" #: msg_loading_project msgid "Loading project..." msgstr "Cargando proyecto..." #: msg_ready msgid "Ready" msgstr "Listo" #: err_reading_data msgid "Error loading file" msgstr "Error al leer el archivo" #: err_file_save msgid "Error saving file!" msgstr "¡Error al guardar el archivo!" #: err_file_open msgid "Error opening file!" msgstr "¡Error al abrir el archivo!" #: report_started msgid "Session started:" msgstr "Inicio de sessión:" #: report_lb_score msgid "Score" msgstr "Puntuación" #: report_lb_actions msgid "Actions" msgstr "Acciones" #: report_lb_solved msgid "Ok" msgstr "Correcta" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Actividad" #: report_lb_sequence msgid "Sequence" msgstr "Secuencia" #: report_global_score msgid "Global score:" msgstr "Puntuación global:" #: report_total_time msgid "Total time on activities:" msgstr "Tiempo total en actividades:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Actividades correctas:" #: report_num_activities msgid "Activities done:" msgstr "Actividades realizadas:" #: report_num_sequences msgid "Sequences:" msgstr "Secuencias:" #: report_system msgid "Report system:" msgstr "Sistema de informes:" #: report_user msgid "User:" msgstr "Usuario:" #: report_not_finished msgid "Activity not finished" msgstr "Actividad aun no acabada" #: action_info_tooltip msgid "Additional information" msgstr "Información adicional" #: action_help_caption msgid "Help" msgstr "Ayuda" #: action_help_tooltip msgid "Help about this activity" msgstr "Ayuda sobre la actividad" #: action_audio_caption msgid "Sounds" msgstr "Sonidos" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Activar/desactivar los sonidos" #: about_window_lb_system msgid "System" msgstr "Sistema" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memoria total" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memoria libre" #: about_window_lb_java_home msgid "Java home" msgstr "Ubicación de Java" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Máquina virtual Java" #: about_window_lb_java_version msgid "Java version" msgstr "Versión Java" #: about_window_lb_os msgid "Operating system" msgstr "Sistema operativo" #: about_window_lb_version msgid "Version" msgstr "Versión" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descriptores" #: about_window_lb_description msgid "Description" msgstr "Descripción" #: about_window_lb_history msgid "History" msgstr "Revisiones" #: about_window_lb_organizations msgid "Organizations" msgstr "Organizaciones" #: about_window_lb_organization msgid "Organization" msgstr "Organización" #: about_window_lb_authors msgid "Authors" msgstr "Autores/as" #: about_window_lb_author msgid "Author" msgstr "Autor/a" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Actividad" #: help_window_close_button msgid "Return to activity" msgstr "Volver a la actividad" #: help_window_caption msgid "Help window" msgstr "Ventana de ayuda" #: action_about_caption msgid "Reports" msgstr "Informes" #: action_about_keys msgid "RR" msgstr "II" #: action_audio_keys msgid "SS" msgstr "OS" #: action_help_keys msgid "HH" msgstr "YY" #: action_info_keys msgid "II" msgstr "NN" #: action_next_keys msgid "N*" msgstr "S*" #: action_prev_keys msgid "P*" msgstr "A*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Instaladores de proyectos JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "No hay ningún usuario definido en la base de datos de informes." #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "No hay ningún usuario definido para este grupo en la base de datos de " "informes!" #: report_new_user msgid "New user..." msgstr "Nuevo usuario..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Crear un nuevo usuario en la base de datos de informes" #: report_err_creating_user msgid "Error creating new user!" msgstr "¡Error al crear el nuevo usuario!" #: report_select_user msgid "User identification for the reports database" msgstr "Identificación de usuario para la base de datos de informes" #: report_userlist_title msgid "Please select your name:" msgstr "Seleccione su nombre:" #: report_ident_user msgid "User identification" msgstr "Identificación de usuario" #: report_name_prompt msgid "Name:" msgstr "Nombre:" #: report_id_prompt msgid "Login:" msgstr "Identificador:" #: report_pw_prompt msgid "Password:" msgstr "Contraseña:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Confirmar contraseña:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Creación de un nuevo usuario:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Datos incorrectos!" #: report_generic_group_name msgid "Generic" msgstr "Genérico" #: report_new_group msgid "Create a new group..." msgstr "Crear un nuevo grupo..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "¡Error al crear el nuevo grupo!" #: report_grouplist_title msgid "Please select your group:" msgstr "Seleccione su grupo:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Creación de un nuevo grupo de usuarios:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Usuario inexistente o contraseña incorrecta." #: report_user_has_pwd msgid "This account is password-protected." msgstr "La cuenta de este usuario está protegida por contraseña:" #: report_err_init msgid "Error initializing report system." msgstr "Error al inicializar el sistema de informes." #: report_not_connected msgid "not connected" msgstr "no conectado" #: report_err_creating msgid "Error creating reports agent" msgstr "Error al crear el agente de informes" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Volver" #: action_return_tooltip msgid "Return to the last menu" msgstr "Volver al último menú" #: action_return_keys msgid "T*" msgstr "V*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sonidos (*.wav, *.mp3, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Archivos MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Archivos Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Entornos visuales (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Todos los recursos" #: filesystem_copyToRoot_1 msgid "The file" msgstr "El archivo" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "se encuentra en una carpeta distinta a la del proyecto actual." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Se recomienda tener todos los archivos en la misma carpeta." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "¿Desea copiar el archivo seleccionado a la carpeta del proyecto?" #: filesystem_copyFile msgid "Copying file" msgstr "Copiando el archivo" #: msg_loading msgid "Loading" msgstr "Cargando" #: report_err_bad_id msgid "Bad identifier!" msgstr "¡Identificador incorrecto!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "¡Este identificador ya existe en la base de datos!" #: report_err_bad_name msgid "Bad name!" msgstr "¡Nombre incorrecto!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "¡Las contraseñas no coinciden!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "¡Error al conectar con la base de datos de informes!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "EXIT: En este punto el programa se cerraría." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "En este punto se produciría un salto al proyecto:" #: ftype_image msgid "Image" msgstr "Imagen" #: ftype_audio msgid "Digital audio" msgstr "Sonido digital" #: ftype_midi msgid "MIDI file" msgstr "Archivo MIDI" #: ftype_xml msgid "XML file" msgstr "Archivo XML" #: ftype_anim msgid "Animation" msgstr "Animación" #: ftype_video msgid "Digital video" msgstr "Video digital" #: ftype_font msgid "TrueType font" msgstr "Tipo de letra TrueType" #: ftype_jclic msgid "JClic project" msgstr "Proyecto JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Script de instalación de proyectos JClic" #: ftype_unknown msgid "Unknown" msgstr "Desconocido" #: ftype_animated msgid "animated" msgstr "animada" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Tipos de letra (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "R#38" #: editor_moveDown_keys msgid "W#40" msgstr "B#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Documentos HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits_es.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license_es.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Con el apoyo de:" #: about_window_systemInfo msgid "System information" msgstr "Información del sistema" #: about_window_projectInfo msgid "Current project info" msgstr "Información del proyecto actual" #: about_window_reportInfo msgid "Current session results" msgstr "Resultados de la sesión actual" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Este producto incluye software desarrollado por:" #: msg_saving_project msgid "Saving project..." msgstr "Guardando el proyecto..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Archivos de texto (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Versión en español, por el Equipo Clic" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Este programa es software libre; usted puede redistribuirlo y/o modificarlo " "bajo los términos de la Licencia Pública General GNU (GPL), " "tal y como está publicada por la Free Software Foundation; ya sea la " "versión 2 de la Licencia, o (a su elección) cualquier " "versión posterior.
 
Este programa se distribuye con la " "intención de ser útil, pero SIN NINGUNA GARANTÍA; " "incluso sin la garantía implícita de USABILIDAD O UTILIDAD " "PARA UN FIN PARTICULAR. Vea la Licencia Pública " "General GNU para más detalles." i18n/fromLaunchpad/po/jclic-core/JClicMessages_eu.po000066400000000000000000000425271335566474600226120ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2009-02-18 15:47+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "denbora" #: label_actions msgid "tries" msgstr "saiakerak" #: label_score msgid "score" msgstr "puntuazioa" #: Skin msgid "Skin" msgstr "Itxura" #: action_next_caption msgid "Next" msgstr "Hurrengoa" #: action_next_tooltip msgid "Next activity" msgstr "Hurrengo jarduera" #: action_prev_caption msgid "Previous" msgstr "Aurrekoa" #: action_prev_tooltip msgid "Previous activity" msgstr "Aurreko jarduera" #: action_reset_caption msgid "Restart" msgstr "Hasi berriro" #: action_reset_tooltip msgid "Restart activity" msgstr "Jarduera berriro hasi" #: action_info_caption msgid "Information" msgstr "Informazioa" #: about_window_lb_project msgid "Project" msgstr "Proiektua" #: about_window_lb_languages msgid "languages" msgstr "hizkuntzak" #: about_window_lb_language msgid "language" msgstr "hizkuntza" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Itzuli" #: about_window_caption msgid "About" msgstr "Honi buruz" #: action_about_tooltip msgid "User reports" msgstr "Erabiltzailearen txostenak" #: about_window_lb_report msgid "Report" msgstr "Txostena" #: about_window_browser_button msgid "View in browser" msgstr "Nabigatzailean ikusi" #: report_no_activities msgid "No activities reported!" msgstr "Ez da jardueren txostenik!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Txostena ez dago ezein datu-basetan" #: report_lb_time msgid "Time" msgstr "Denbora" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Errorea sekuentzia kargatzean" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Errorea Quick Time abiaraztean!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia_eu.html" #: filesystem_openURL msgid "Open URL..." msgstr "Ireki URL-a..." #: filesystem_openFile msgid "Open file..." msgstr "Ireki fitxategia..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Mesedez, sartu bilatu behar den baliabidearen URL-aa" #: msg_error_executing_external msgid "Error executing the command:" msgstr "Errorea komandoa exekutatzean" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Eraman behera aukeratutako elementua" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Mugitu gora aukeratutako elementua" #: editor_moveDown msgid "Move down" msgstr "Eraman behera" #: editor_moveUp msgid "Move up" msgstr "Eraman gora" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Irudi-fitxategiak (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "PNG irudiak" #: filefilter_jpg msgid "JPG images" msgstr "JPG irudiak" #: filefilter_gif msgid "GIF images" msgstr "GIF irudiak" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "UR-Letan oinarritutako fitxategiak irakurtzeko dira bakarrik" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Clic 3.0 paketeak (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Fitxategi guztiak" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "JClic eta Clic 3.0 proiektuak (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "JClic proiektuak (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Konpaktatutako Clic 3.0 paketeak (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Clic 3.0 pakete irekiak (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Konprimitutako JClic proiektuak (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "JClic proiektuak (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Multimedia-sistema" #: about_window_lb_level msgid "Level" msgstr "Maila" #: about_window_lb_area msgid "Area" msgstr "Eremua" #: report_num_actions msgid "Actions done:" msgstr "Burututako ekintzak:" #: report_project msgid "Project:" msgstr "Proiektua:" #: report_lb_totals msgid "Total:" msgstr "Guztira:" #: report_num_projects msgid "Projects:" msgstr "Proiektuak" #: report_session msgid "Session:" msgstr "Saioa:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Segurtasun-arazoak direla-eta, ezgaituta dago kanpoko programen exekutatzea " "JClic aplikazioetan" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Errorea jarduera hastean!" #: msg_error_loading_project msgid "Error loading project" msgstr "Errorea proiektua kargatzean" #: msg_error_playing_media msgid "Error playing media!" msgstr "Errorea media erreproduzitzean!" #: msg_activity_finished msgid "Activity finished!" msgstr "Jarduera amaitu da" #: msg_playing_media msgid "Playing media" msgstr "Media erreproduzitzen" #: msg_activity_running msgid "Activity running" msgstr "Jarduera martxan" #: msg_activity_ready msgid "Activity ready" msgstr "Jarduera prest" #: msg_initializing msgid "Initializing..." msgstr "Abiarazten..." #: msg_preparing_media msgid "Preparing media" msgstr "Media prestatzen" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Errorea jarduera kargatzean" #: msg_loading_activity msgid "Loading activity" msgstr "Jarduera kargatzen" #: msg_loading_project msgid "Loading project..." msgstr "Proiektua kargatzen" #: msg_ready msgid "Ready" msgstr "Prest" #: err_reading_data msgid "Error loading file" msgstr "Errorea fitxategia kargatzean" #: err_file_save msgid "Error saving file!" msgstr "Errorea fitxategia gordetzean" #: err_file_open msgid "Error opening file!" msgstr "Errorea fitxategia zabaltzean!" #: report_started msgid "Session started:" msgstr "Saio-hasiera:" #: report_lb_score msgid "Score" msgstr "Puntuazioa" #: report_lb_actions msgid "Actions" msgstr "Ekintzak" #: report_lb_solved msgid "Ok" msgstr "Ados" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Jarduera" #: report_lb_sequence msgid "Sequence" msgstr "Sekuentzia" #: report_global_score msgid "Global score:" msgstr "Puntuazio orokorra:" #: report_total_time msgid "Total time on activities:" msgstr "Jardueretan emandako denbora guztira:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Jarduera zuzenak:" #: report_num_activities msgid "Activities done:" msgstr "Burututako ekinzak:" #: report_num_sequences msgid "Sequences:" msgstr "Sekuentziak:" #: report_system msgid "Report system:" msgstr "Txosten-sistema:" #: report_user msgid "User:" msgstr "Erabiltzailea:" #: report_not_finished msgid "Activity not finished" msgstr "Bukatu gabeko jarduera" #: action_info_tooltip msgid "Additional information" msgstr "Informazio gehigarria" #: action_help_caption msgid "Help" msgstr "Laguntza" #: action_help_tooltip msgid "Help about this activity" msgstr "Laguntza jarduera honetarako" #: action_audio_caption msgid "Sounds" msgstr "Soinuak" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Soinuak gaitu/desgaitu" #: about_window_lb_system msgid "System" msgstr "Sistema" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memoria guztira" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memoria libre" #: about_window_lb_java_home msgid "Java home" msgstr "Java-ren kokapena" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Java makina birtuala" #: about_window_lb_java_version msgid "Java version" msgstr "Java bertsioa" #: about_window_lb_os msgid "Operating system" msgstr "Sistema eragilea" #: about_window_lb_version msgid "Version" msgstr "Bertsioa" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Deskribatzaileak" #: about_window_lb_description msgid "Description" msgstr "Deskribapena" #: about_window_lb_history msgid "History" msgstr "Historia" #: about_window_lb_organizations msgid "Organizations" msgstr "Erakundeak" #: about_window_lb_organization msgid "Organization" msgstr "Erakundea" #: about_window_lb_authors msgid "Authors" msgstr "Egileak" #: about_window_lb_author msgid "Author" msgstr "Egilea" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Jarduera" #: help_window_close_button msgid "Return to activity" msgstr "Itzuli jarduerara" #: help_window_caption msgid "Help window" msgstr "Laguntza-leihoa" #: action_about_caption msgid "Reports" msgstr "Txostenak" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "HH" #: action_help_keys msgid "HH" msgstr "OO" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "U*" #: action_prev_keys msgid "P*" msgstr "A*" #: action_reset_keys msgid "R*" msgstr "B*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "JClic proiektuen instalatzaileak (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Ez dago definitutako erabiltzailerik txostenen datu-basean!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "Ez dago talde honetarako definitutako erabiltzailerik txostenen datu-basean!" #: report_new_user msgid "New user..." msgstr "Erabiltzaile berria..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Erabiltzaile berria sortu txostenen datu-basean" #: report_err_creating_user msgid "Error creating new user!" msgstr "Errorea erabiltzaile berria sortzean!" #: report_select_user msgid "User identification for the reports database" msgstr "Txostenen datu-baserako erabiltzaile-identifikazioa" #: report_userlist_title msgid "Please select your name:" msgstr "Mesedez, aukera ezazu zeure izena:" #: report_ident_user msgid "User identification" msgstr "Erabiltzailearen identifikazioa" #: report_name_prompt msgid "Name:" msgstr "Izena:" #: report_id_prompt msgid "Login:" msgstr "Erabiltzaile-izena:" #: report_pw_prompt msgid "Password:" msgstr "Pasahitza:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Pasahitza berretsi:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Erabiltzaile berria sortu:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Datuak ez dira zuzenak!" #: report_generic_group_name msgid "Generic" msgstr "Generikoa" #: report_new_group msgid "Create a new group..." msgstr "Talde berria sortu..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Errorea talde berria sortzean!" #: report_grouplist_title msgid "Please select your group:" msgstr "Mesedez, aukera ezazu zeure taldea:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Erabiltzaile-talde berria sortu:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Erabiltzailearen ID-a falta da edo pasahitza ez da zuzena." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Erabiltzaile honen kontua pasahitz batek babesten du." #: report_err_init msgid "Error initializing report system." msgstr "Errorea txosten sistema abiaraztean." #: report_not_connected msgid "not connected" msgstr "konektatu gabe" #: report_err_creating msgid "Error creating reports agent" msgstr "Errorea txosten-agentea sortzean" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Itzuli" #: action_return_tooltip msgid "Return to the last menu" msgstr "Itzuli azken menura" #: action_return_keys msgid "T*" msgstr "I*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Soinuak (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI fitxategiak (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Bideo-fitxategiak (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 fitxategiak (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Itxurak (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Media fitxategi guztiak" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Fitxategia" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "oraingo proiektuaren direktoriotik kanpo dago." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Ez da gomendagarria fitxategi guztiak direktorio berean edukitzea." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "" "Aukeratutako fitxategia proiektuaren direktoriora kopiatu nahi al duzu?" #: filesystem_copyFile msgid "Copying file" msgstr "Fitxategia kopiatzen" #: msg_loading msgid "Loading" msgstr "Kargatzen" #: report_err_bad_id msgid "Bad identifier!" msgstr "Okerreko identifikatzailea!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Identifikatzaile hori dagoeneko badago datu-basean!" #: report_err_bad_name msgid "Bad name!" msgstr "Okerreko izena!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Pasahitzak ez datoz bat!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Errorea txostenen datu-basearekin konektatzean!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "IRTEN: Hemendik aurrera, programatik irten egingo zara." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Hemen programak ondorengo proiektu honetara egingo du jauzi:" #: ftype_image msgid "Image" msgstr "Irudia" #: ftype_audio msgid "Digital audio" msgstr "Audio digitala" #: ftype_midi msgid "MIDI file" msgstr "MIDI fitxategia" #: ftype_xml msgid "XML file" msgstr "XML fitxategia" #: ftype_anim msgid "Animation" msgstr "Animazioa" #: ftype_video msgid "Digital video" msgstr "Bideo digitala" #: ftype_font msgid "TrueType font" msgstr "TrueType letra-tipoa" #: ftype_jclic msgid "JClic project" msgstr "JClic proiektua" #: ftype_inst msgid "JClic project installer script" msgstr "JClic proiektua instalatzeko script-a" #: ftype_unknown msgid "Unknown" msgstr "Ezezaguna" #: ftype_animated msgid "animated" msgstr "animatua" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Fonts (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML dokumentuak (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "honi buruz/kredituak.html" #: about_licenseDoc msgid "about/license.html" msgstr "honi buruz/lizentzia.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Honen laguntzarekin:" #: about_window_systemInfo msgid "System information" msgstr "Sistemaren informazioa" #: about_window_projectInfo msgid "Current project info" msgstr "Oraingo proiektuaren informazioa" #: about_window_reportInfo msgid "Current session results" msgstr "Oraingo saioaren emaitzak" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Produktu honek ondorengoak/ek garatutako softwarea du:" #: msg_saving_project msgid "Saving project..." msgstr "Proiektua gordetzen..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Testu-fitxategiak (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Itzultzaileak: Abel Camacho, Pedro Lonbide" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Programa hau software librea da; zabaldu edota aldatu egin dezakezu Free " "Software Foundation-ek argitaratutako GNU General Public License-n " "ezarritakoaren arabera; lizentziaren edozein 2. bertsio edo (zure aukera) " "ondorengo bertsioren bat.
 
Programa hau erabilgarri izango " "delakoan banatzen da, baina INONGO BERMERIK GABE; ezta KOMERTZIALIZAZIO edo " "HELBURU JAKIN BATERAKO EGOKITASUNerako berme inpliziturik gabe. Begiratu GNU General Public " "License zehaztasun gehiagorako." i18n/fromLaunchpad/po/jclic-core/JClicMessages_fr.po000066400000000000000000000424631335566474600226070ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2015-03-29 10:52+0000\n" "Last-Translator: Jean-Marc \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "temps" #: label_actions msgid "tries" msgstr "essais" #: label_score msgid "score" msgstr "résultat" #: Skin msgid "Skin" msgstr "Thème" #: action_next_caption msgid "Next" msgstr "Suivant" #: action_next_tooltip msgid "Next activity" msgstr "Activité suivante" #: action_prev_caption msgid "Previous" msgstr "Précédent" #: action_prev_tooltip msgid "Previous activity" msgstr "Activité précédente" #: action_reset_caption msgid "Restart" msgstr "Recommencer" #: action_reset_tooltip msgid "Restart activity" msgstr "Recommencer l'activité" #: action_info_caption msgid "Information" msgstr "Information" #: about_window_lb_project msgid "Project" msgstr "Projet" #: about_window_lb_languages msgid "languages" msgstr "langages" #: about_window_lb_language msgid "language" msgstr "langage" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Retour" #: about_window_caption msgid "About" msgstr "A propos de" #: action_about_tooltip msgid "User reports" msgstr "Rapports utilisateur" #: about_window_lb_report msgid "Report" msgstr "Rapport" #: about_window_browser_button msgid "View in browser" msgstr "Voir dans l'explorateur" #: report_no_activities msgid "No activities reported!" msgstr "Pas d'activités rapportées\\!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Le rapport n'est enregistré dans aucune base de données" #: report_lb_time msgid "Time" msgstr "Temps" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Erreur au chargement de la séquence" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Erreur à l'initialisation de QuickTime\\!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia_fr.html" #: filesystem_openURL msgid "Open URL..." msgstr "Ouvrir URL..." #: filesystem_openFile msgid "Open file..." msgstr "Ouvrir fichier..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Entrez l'URL de la ressource à charger." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Erreur à l'exécution de la commande\\:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Déplacer l'élément sélectionné vers le bas" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Déplacer l'élément sélectionné vers le haut" #: editor_moveDown msgid "Move down" msgstr "Déplacer vers le bas" #: editor_moveUp msgid "Move up" msgstr "Déplacer vers le haut" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Fichiers images (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "PNG images" #: filefilter_jpg msgid "JPG images" msgstr "JPG images" #: filefilter_gif msgid "GIF images" msgstr "GIF images" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Les fichiers URL-based sont en lecture seule." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Clic 3.0 packages (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Tous les fichiers" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Projets JClic et Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Projets JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Clic 3.0 compact compactés (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Clic 3.0 packages ouverts (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Projets JClic compressés (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Projets JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Système multimedia" #: about_window_lb_level msgid "Level" msgstr "Niveau" #: about_window_lb_area msgid "Area" msgstr "Domaine" #: report_num_actions msgid "Actions done:" msgstr "Actions faites\\:" #: report_project msgid "Project:" msgstr "Projet\\:" #: report_lb_totals msgid "Total:" msgstr "Total\\:" #: report_num_projects msgid "Projects:" msgstr "Projets\\:" #: report_session msgid "Session:" msgstr "Session\\:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Pour des raisons de sécurité, l'exécution de programmes externes est " "désassemblée dans JClic applet." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Erreur au démmarrage de l'activité\\!" #: msg_error_loading_project msgid "Error loading project" msgstr "Erreur de chargement du projet" #: msg_error_playing_media msgid "Error playing media!" msgstr "Erreur de lecture du média\\!" #: msg_activity_finished msgid "Activity finished!" msgstr "Activité terminée\\!" #: msg_playing_media msgid "Playing media" msgstr "Lecture du média" #: msg_activity_running msgid "Activity running" msgstr "Activité en cours" #: msg_activity_ready msgid "Activity ready" msgstr "Activité prête" #: msg_initializing msgid "Initializing..." msgstr "Initialisation..." #: msg_preparing_media msgid "Preparing media" msgstr "Préparation du média" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Erreur au chargement de l'activité" #: msg_loading_activity msgid "Loading activity" msgstr "Chargement de l'activité" #: msg_loading_project msgid "Loading project..." msgstr "Chargement du projet..." #: msg_ready msgid "Ready" msgstr "Prêt" #: err_reading_data msgid "Error loading file" msgstr "Erreur de chargement du fichier" #: err_file_save msgid "Error saving file!" msgstr "Erreur de sauvegarde du fichier\\!" #: err_file_open msgid "Error opening file!" msgstr "Erreur à l'ouverture du fichier\\!" #: report_started msgid "Session started:" msgstr "Session démarrée\\:" #: report_lb_score msgid "Score" msgstr "Score" #: report_lb_actions msgid "Actions" msgstr "Actions" #: report_lb_solved msgid "Ok" msgstr "Ok" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Activité" #: report_lb_sequence msgid "Sequence" msgstr "Séquence" #: report_global_score msgid "Global score:" msgstr "Score global\\:" #: report_total_time msgid "Total time on activities:" msgstr "Temps total sur l'activité\\:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Activités ok\\:" #: report_num_activities msgid "Activities done:" msgstr "Activités faites\\:" #: report_num_sequences msgid "Sequences:" msgstr "Séquences\\:" #: report_system msgid "Report system:" msgstr "Report système\\:" #: report_user msgid "User:" msgstr "Utilisateur\\:" #: report_not_finished msgid "Activity not finished" msgstr "Activité non terminée" #: action_info_tooltip msgid "Additional information" msgstr "Information additionnelle" #: action_help_caption msgid "Help" msgstr "Aide" #: action_help_tooltip msgid "Help about this activity" msgstr "Aide à propos de cette activité" #: action_audio_caption msgid "Sounds" msgstr "Sons" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Activer/Désactiver sons" #: about_window_lb_system msgid "System" msgstr "Système" #: about_window_lb_total_mem msgid "Total memory" msgstr "Mémoire totale" #: about_window_lb_free_mem msgid "Free memory" msgstr "Mémoire libre" #: about_window_lb_java_home msgid "Java home" msgstr "Java home" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Java virtual machine" #: about_window_lb_java_version msgid "Java version" msgstr "Java version" #: about_window_lb_os msgid "Operating system" msgstr "Système d'exploitation" #: about_window_lb_version msgid "Version" msgstr "Version" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descripteurs" #: about_window_lb_description msgid "Description" msgstr "Description" #: about_window_lb_history msgid "History" msgstr "Historique" #: about_window_lb_organizations msgid "Organizations" msgstr "Organisations" #: about_window_lb_organization msgid "Organization" msgstr "Organisation" #: about_window_lb_authors msgid "Authors" msgstr "Auteurs" #: about_window_lb_author msgid "Author" msgstr "Auteur" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Activité" #: help_window_close_button msgid "Return to activity" msgstr "Retour à l'activité" #: help_window_caption msgid "Help window" msgstr "Fenêtre d'aide" #: action_about_caption msgid "Reports" msgstr "Rapports" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Installateurs de projets JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Aucun utilisateur n'est défini dans la base de rapports\\!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "Aucun utiliateur n'est défini pour ce groupe dans la base de données\\!" #: report_new_user msgid "New user..." msgstr "Nouvel utiliateur..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Créer un nouvel utilisateur dans la base de rapports" #: report_err_creating_user msgid "Error creating new user!" msgstr "Erreur à la création d'un nouvel utilisateur\\!" #: report_select_user msgid "User identification for the reports database" msgstr "Identification de l'utilisateur pour la base de rapports" #: report_userlist_title msgid "Please select your name:" msgstr "Sélectionnez votre nom\\:" #: report_ident_user msgid "User identification" msgstr "Identification de l'utilisateur" #: report_name_prompt msgid "Name:" msgstr "Nom\\:" #: report_id_prompt msgid "Login:" msgstr "Login\\:" #: report_pw_prompt msgid "Password:" msgstr "Mot de passe\\:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Confirmer mot de passe\\:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Création d'un nouvel utilisateur\\:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Donnée incorrecte\\!" #: report_generic_group_name msgid "Generic" msgstr "Générique" #: report_new_group msgid "Create a new group..." msgstr "Créer un nouveau groupe..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Erreur à la création d'un nouveau groupe\\!" #: report_grouplist_title msgid "Please select your group:" msgstr "Sélectionnez votre groupe\\:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Création d'un nouveau groupe d'utilisateurs\\:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "ID utilisateur absente ou mot de passe incorrect." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Ce compte est protégé par un mot de passe." #: report_err_init msgid "Error initializing report system." msgstr "Erreur à l'initialisation du système de rapports." #: report_not_connected msgid "not connected" msgstr "non connecté" #: report_err_creating msgid "Error creating reports agent" msgstr "Erreur à la création d'un agent de rapports" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Retour" #: action_return_tooltip msgid "Return to the last menu" msgstr "Retour au dernier menu" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sons (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Fichiers MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Fichiers Video (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Fichiers Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Habillages (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Tous les fichiers média" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Le fichier" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "est en dehors du dossier du projet courant." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Il est conseillé de placer tous les fichiers dans le même dossier." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "" "Voulez-vous copier les fichiers sélectionnés dans le dossier du projets ?" #: filesystem_copyFile msgid "Copying file" msgstr "Copie de fichier" #: msg_loading msgid "Loading" msgstr "Chargement" #: report_err_bad_id msgid "Bad identifier!" msgstr "Mauvais identifiant\\!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Cet identifiant existe déjà dans la base de données\\!" #: report_err_bad_name msgid "Bad name!" msgstr "Mauvais nom\\!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Les mots de passe ne fonctionnent pas\\!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Erreur de connexion à la base de rapports\\!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "QUITTER\\: A ce point, le programme se termine." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "A ce point le programme sautera vers le projet\\:" #: ftype_image msgid "Image" msgstr "Image" #: ftype_audio msgid "Digital audio" msgstr "Digital audio" #: ftype_midi msgid "MIDI file" msgstr "Fichier MIDI" #: ftype_xml msgid "XML file" msgstr "Fichier XML" #: ftype_anim msgid "Animation" msgstr "Animation" #: ftype_video msgid "Digital video" msgstr "Digital video" #: ftype_font msgid "TrueType font" msgstr "Type de police TrueType" #: ftype_jclic msgid "JClic project" msgstr "Projet JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Script d'installateur de projet JClic" #: ftype_unknown msgid "Unknown" msgstr "Inconnu" #: ftype_animated msgid "animated" msgstr "animé" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Styles (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U\\#38" #: editor_moveDown_keys msgid "W#40" msgstr "W\\#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML documents (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits_fr.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license_fr.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Avec le support de\\:" #: about_window_systemInfo msgid "System information" msgstr "Système information" #: about_window_projectInfo msgid "Current project info" msgstr "Info projet courant" #: about_window_reportInfo msgid "Current session results" msgstr "Résultats de session courante" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Ce produit inclus les logiciels développés par\\:" #: msg_saving_project msgid "Saving project..." msgstr "Enregistrement du projet..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Fichiers textes(*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Version Française: Gilles Parenna et Ahmet Yavuz" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le " "modifier conformément aux dispositions de la Licence Publique Générale GNU, " "telle que publiée par la Free Software Foundation ; version 2 de la licence, " "ou encore (à votre choix) toute version ultérieure.
 
Ce " "programme est distribué dans l’espoir qu’il sera utile, mais SANS AUCUNE " "GARANTIE ; sans même la garantie implicite de COMMERCIALISATION ou " "D’ADAPTATION A UN OBJET PARTICULIER. Pour plus de détails, voir la Licence Publique Générale " "GNU." i18n/fromLaunchpad/po/jclic-core/JClicMessages_gl.po000066400000000000000000000427331335566474600226020ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2011-01-10 08:45+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "hora" #: label_actions msgid "tries" msgstr "intentos" #: label_score msgid "score" msgstr "acertos" #: Skin msgid "Skin" msgstr "Tema visual" #: action_next_caption msgid "Next" msgstr "Seguinte" #: action_next_tooltip msgid "Next activity" msgstr "Seguinte actividade" #: action_prev_caption msgid "Previous" msgstr "Anterior" #: action_prev_tooltip msgid "Previous activity" msgstr "Anterior actividade" #: action_reset_caption msgid "Restart" msgstr "Reiniciar" #: action_reset_tooltip msgid "Restart activity" msgstr "Reiniciar a actividade" #: action_info_caption msgid "Information" msgstr "Información" #: about_window_lb_project msgid "Project" msgstr "Proxecto" #: about_window_lb_languages msgid "languages" msgstr "Idiomas" #: about_window_lb_language msgid "language" msgstr "idioma" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Volver" #: about_window_caption msgid "About" msgstr "Sobre" #: action_about_tooltip msgid "User reports" msgstr "Informes de usuario" #: about_window_lb_report msgid "Report" msgstr "Informe" #: about_window_browser_button msgid "View in browser" msgstr "Ver no navegador" #: report_no_activities msgid "No activities reported!" msgstr "Non hai informada ningunha actividade!" #: report_system_standard msgid "Report not registered in any DB" msgstr "O informe non está rexistrado en ningunha base de datos" #: report_lb_time msgid "Time" msgstr "Hora" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Produciuse un erro ao cargar a secuencia" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Produciuse un erro ao inicializar QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia_gl.html" #: filesystem_openURL msgid "Open URL..." msgstr "Abrir un URL..." #: filesystem_openFile msgid "Open file..." msgstr "Abrir ficheiro..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Escriba o URL do recurso ao que desexa acceder." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Produciuse un erro ao executar a orde:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Mover o elemento seleccionado cara abaixo" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Mover o elemento seleccionado cara arriba" #: editor_moveDown msgid "Move down" msgstr "Mover cara abaixo" #: editor_moveUp msgid "Move up" msgstr "Mover cara arriba" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Imaxes (*.gif, *.jpg, *.png)" #: filefilter_png msgid "PNG images" msgstr "Imaxes PNG" #: filefilter_jpg msgid "JPG images" msgstr "Imaxes JPG" #: filefilter_gif msgid "GIF images" msgstr "Imaxes GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Os ficheiros baseados nun URL son só de lectura." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Paquetes Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Todos os ficheiros" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Proxectos JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Proxectos JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Paquetes compactos Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Paquetes abertos Clic 3.0 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Proxectos JClic comprimidos (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Proxectos JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Sistema multimedia" #: about_window_lb_level msgid "Level" msgstr "Nivel" #: about_window_lb_area msgid "Area" msgstr "Área" #: report_num_actions msgid "Actions done:" msgstr "Accións efectuadas:" #: report_project msgid "Project:" msgstr "Proxecto:" #: report_lb_totals msgid "Total:" msgstr "Total:" #: report_num_projects msgid "Projects:" msgstr "Proxectos:" #: report_session msgid "Session:" msgstr "Sesión:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Por razóns de seguridade a invocación a programas externos está desactivada " "nos miniaplicativos JClic" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Erro ao iniciar a actividade!" #: msg_error_loading_project msgid "Error loading project" msgstr "Produciuse un erro ao cargar o proxecto" #: msg_error_playing_media msgid "Error playing media!" msgstr "Produciuse un erro no recurso multimedia!" #: msg_activity_finished msgid "Activity finished!" msgstr "Actividade rematada!" #: msg_playing_media msgid "Playing media" msgstr "Reproducindo multimedia" #: msg_activity_running msgid "Activity running" msgstr "Actividade en execución" #: msg_activity_ready msgid "Activity ready" msgstr "Actividade preparada" #: msg_initializing msgid "Initializing..." msgstr "Inicializando..." #: msg_preparing_media msgid "Preparing media" msgstr "Preparando multimedia" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Produciuse un erro ao cargar a actividade" #: msg_loading_activity msgid "Loading activity" msgstr "Abrindo actividade" #: msg_loading_project msgid "Loading project..." msgstr "Abrindo proxecto..." #: msg_ready msgid "Ready" msgstr "Listo" #: err_reading_data msgid "Error loading file" msgstr "Produciuse un erro ao cargar o ficheiro" #: err_file_save msgid "Error saving file!" msgstr "Produciuse un erro ao gardar o ficheiro!" #: err_file_open msgid "Error opening file!" msgstr "Produciuse un erro ao abrir o ficheiro!" #: report_started msgid "Session started:" msgstr "Inicio de sesión:" #: report_lb_score msgid "Score" msgstr "Puntuación" #: report_lb_actions msgid "Actions" msgstr "Accións" #: report_lb_solved msgid "Ok" msgstr "Correcta" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Actividade" #: report_lb_sequence msgid "Sequence" msgstr "Secuencia" #: report_global_score msgid "Global score:" msgstr "Puntuación global:" #: report_total_time msgid "Total time on activities:" msgstr "Tempo total nas actividades:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Actividades correctas:" #: report_num_activities msgid "Activities done:" msgstr "Actividades realizadas:" #: report_num_sequences msgid "Sequences:" msgstr "Secuencias:" #: report_system msgid "Report system:" msgstr "Sistema de informes:" #: report_user msgid "User:" msgstr "Usuario:" #: report_not_finished msgid "Activity not finished" msgstr "Actividade aínda non rematada" #: action_info_tooltip msgid "Additional information" msgstr "Información adicional" #: action_help_caption msgid "Help" msgstr "Axuda" #: action_help_tooltip msgid "Help about this activity" msgstr "Axuda sobre a actividade" #: action_audio_caption msgid "Sounds" msgstr "Sons" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Activar/desactivar os sons" #: about_window_lb_system msgid "System" msgstr "Sistema" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memoria total" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memoria libre" #: about_window_lb_java_home msgid "Java home" msgstr "Situación de Java" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Máquina virtual Java" #: about_window_lb_java_version msgid "Java version" msgstr "Versión de Java" #: about_window_lb_os msgid "Operating system" msgstr "Sistema operativo" #: about_window_lb_version msgid "Version" msgstr "Versión" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descritores" #: about_window_lb_description msgid "Description" msgstr "Descrición" #: about_window_lb_history msgid "History" msgstr "Revisións" #: about_window_lb_organizations msgid "Organizations" msgstr "Organizacións" #: about_window_lb_organization msgid "Organization" msgstr "Organización" #: about_window_lb_authors msgid "Authors" msgstr "Autores/as" #: about_window_lb_author msgid "Author" msgstr "Autor/a" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Actividade" #: help_window_close_button msgid "Return to activity" msgstr "Volver á actividade" #: help_window_caption msgid "Help window" msgstr "Xanela de axuda" #: action_about_caption msgid "Reports" msgstr "Informes" #: action_about_keys msgid "RR" msgstr "II" #: action_audio_keys msgid "SS" msgstr "OS" #: action_help_keys msgid "HH" msgstr "YY" #: action_info_keys msgid "II" msgstr "NN" #: action_next_keys msgid "N*" msgstr "S*" #: action_prev_keys msgid "P*" msgstr "A*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Instaladores de proxectos JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Non hai ningún usuario definido na base de datos de informes." #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "Non hai ningún usuario definido para este grupo na base de datos de informes!" #: report_new_user msgid "New user..." msgstr "Novo usuario..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Crear un novo usuario na base de datos de informes" #: report_err_creating_user msgid "Error creating new user!" msgstr "Produciuse un erro ao crear o novo usuario!" #: report_select_user msgid "User identification for the reports database" msgstr "Identificación de usuario para a base de datos de informes" #: report_userlist_title msgid "Please select your name:" msgstr "Seleccione o seu nome:" #: report_ident_user msgid "User identification" msgstr "Identificación de usuario" #: report_name_prompt msgid "Name:" msgstr "Nome:" #: report_id_prompt msgid "Login:" msgstr "Identificador:" #: report_pw_prompt msgid "Password:" msgstr "Contrasinal:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Confirmar contrasinal:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Creación dun novo usuario:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Datos incorrectos!" #: report_generic_group_name msgid "Generic" msgstr "Xenérico" #: report_new_group msgid "Create a new group..." msgstr "Crear un novo grupo..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Produciuse un erro ao crear o novo grupo!" #: report_grouplist_title msgid "Please select your group:" msgstr "Seleccione o seu grupo:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Creación dun novo grupo de usuarios:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Usuario inexistente ou contrasinal incorrecto." #: report_user_has_pwd msgid "This account is password-protected." msgstr "A conta deste usuario está protexida por contrasinal:" #: report_err_init msgid "Error initializing report system." msgstr "Produciuse un erro ao inicializar o sistema de informes." #: report_not_connected msgid "not connected" msgstr "non conectado" #: report_err_creating msgid "Error creating reports agent" msgstr "Produciuse un erro ao crear o axente de informes" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Volver" #: action_return_tooltip msgid "Return to the last menu" msgstr "Volver ao último menú" #: action_return_keys msgid "T*" msgstr "V*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sons (*.wav, *.mp3, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Ficheiros MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Ficheiros de vídeo (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Ficheiros Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Temas visuais (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Todos os ficheiros multinmédia" #: filesystem_copyToRoot_1 msgid "The file" msgstr "O ficheiro" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "atopase nun cartafol distinto ao do proxecto actual." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Recoméndase ter todos os ficheiros no mesmo cartafol." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Desexa copiar o ficheiro seleccionado ao cartafol do proxecto?" #: filesystem_copyFile msgid "Copying file" msgstr "Copiando o ficheiro" #: msg_loading msgid "Loading" msgstr "Cargando" #: report_err_bad_id msgid "Bad identifier!" msgstr "Identificador incorrecto!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Este identificador xa existe na base de datos!" #: report_err_bad_name msgid "Bad name!" msgstr "Nome incorrecto!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Os contrsinais non coinciden!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Produciuse un erro ao conectar coa base de datos de informes!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "EXIT: Neste punto o programa pecharíase." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Neste punto produciríase un salto ao proxecto:" #: ftype_image msgid "Image" msgstr "Imaxe" #: ftype_audio msgid "Digital audio" msgstr "Son dixital" #: ftype_midi msgid "MIDI file" msgstr "Ficheiro MIDI" #: ftype_xml msgid "XML file" msgstr "Ficheiro XML" #: ftype_anim msgid "Animation" msgstr "Animación" #: ftype_video msgid "Digital video" msgstr "Vídeo dixital" #: ftype_font msgid "TrueType font" msgstr "Tipo de letra TrueType" #: ftype_jclic msgid "JClic project" msgstr "Proxecto JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Script de instalación de proxectos JClic" #: ftype_unknown msgid "Unknown" msgstr "Descoñecido" #: ftype_animated msgid "animated" msgstr "animada" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Tipos de letra (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "R#38" #: editor_moveDown_keys msgid "W#40" msgstr "B#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Documentos HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits_gl.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license_gl.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Coa axuda de:" #: about_window_systemInfo msgid "System information" msgstr "Información do sistema" #: about_window_projectInfo msgid "Current project info" msgstr "Información do proxecto actual" #: about_window_reportInfo msgid "Current session results" msgstr "Resultados da sesión actual" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Este produto inclúe software desenvolvido por:" #: msg_saving_project msgid "Saving project..." msgstr "Gardando o proxecto..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Ficheiros de texto (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" "A tradución ao galego foi realizada por Edugaliza e por Proxecto Trasno" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Este programa é software libre; pode distribuílo e/ou modificalo baixo os " "termos da Licenza Pública Xeral de GNU (GNU General Public License) tal e " "como é publicada pola Free Software Foundation, ben sexa a versión 2 da " "licenza ou (á súa escolla) calquera outra versión " "posterior.
 
Este programa distribúese coa esperanza de que sexa " "útil, pero SEN NINGUNHA GARANTÍA; mesmo sen as garantías implícitas de " "COMERCIABILIZACIÓN ou IDONEIDADE PARA UN PROPÓSITO PARTICULAR. Para obter " "máis información, consulte a Licenza Pública Xeral de GNU." i18n/fromLaunchpad/po/jclic-core/JClicMessages_he.po000066400000000000000000000404511335566474600225670ustar00rootroot00000000000000# Hebrew translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2009-07-29 19:34+0000\n" "Last-Translator: Amir Elion \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "זמן" #: label_actions msgid "tries" msgstr "נסיונות" #: label_score msgid "score" msgstr "ניקוד" #: Skin msgid "Skin" msgstr "מעטפת" #: action_next_caption msgid "Next" msgstr "הבא" #: action_next_tooltip msgid "Next activity" msgstr "הפעילות הבאה" #: action_prev_caption msgid "Previous" msgstr "הקודם" #: action_prev_tooltip msgid "Previous activity" msgstr "הפעילות הקודמת" #: action_reset_caption msgid "Restart" msgstr "התחל מחדש" #: action_reset_tooltip msgid "Restart activity" msgstr "התחל פעילות מחדש" #: action_info_caption msgid "Information" msgstr "מידע" #: about_window_lb_project msgid "Project" msgstr "פרוייקט" #: about_window_lb_languages msgid "languages" msgstr "שפות" #: about_window_lb_language msgid "language" msgstr "שפה" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "" #: about_window_caption msgid "About" msgstr "אודות" #: action_about_tooltip msgid "User reports" msgstr "דוחות משתמש" #: about_window_lb_report msgid "Report" msgstr "דוח" #: about_window_browser_button msgid "View in browser" msgstr "הצג בדפדפן" #: report_no_activities msgid "No activities reported!" msgstr "לא דווחו פעילויות!" #: report_system_standard msgid "Report not registered in any DB" msgstr "הדיווח אינו רשום במסד נתונים כלשהו" #: report_lb_time msgid "Time" msgstr "שעה" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "שגיאה בטעינת הרצף" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "שגיאה בהפעלת QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "פתח קישור..." #: filesystem_openFile msgid "Open file..." msgstr "פתח קובץ..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "נא הזן את כתובת המשאב לטעינה" #: msg_error_executing_external msgid "Error executing the command:" msgstr "שגיאה בהפעלת הפקודה:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "העבר את הרכיב הנבחר מטה" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "העבר את הרכיב הנבחר מעלה" #: editor_moveDown msgid "Move down" msgstr "העבר מטה" #: editor_moveUp msgid "Move up" msgstr "העבר מעלה" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "קבצי תמונה (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "תמונות PNG" #: filefilter_jpg msgid "JPG images" msgstr "תמונות JPG" #: filefilter_gif msgid "GIF images" msgstr "תמונות GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "קבצים מבוססי כתובת הינם לקריאה בלבד." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "חבילות Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "כל הקבצים" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "פרוייקטים של JClic ו-Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "פרוייקטים של JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "חבילות חסכוניות של Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "חבילות פתוחות של Clic 3.0 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "חבילות דחוסות של JClic (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "פרוייקטים של JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "מערכת מולטימדיה" #: about_window_lb_level msgid "Level" msgstr "רמה" #: about_window_lb_area msgid "Area" msgstr "אזור" #: report_num_actions msgid "Actions done:" msgstr "פעולות שבוצעו:" #: report_project msgid "Project:" msgstr "פרוייקט:" #: report_lb_totals msgid "Total:" msgstr "סך הכל:" #: report_num_projects msgid "Projects:" msgstr "פרוייקטים:" #: report_session msgid "Session:" msgstr "הפעלה:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "מטעמי בטיחות, הפעלת תוכנות חיצוניות מבוטלת ביישומוני JClic." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "שגיאה בהתחלת הפעילות!" #: msg_error_loading_project msgid "Error loading project" msgstr "שגיאה בטעינת הפרוייקט" #: msg_error_playing_media msgid "Error playing media!" msgstr "שגיאה בנגינת המדיה!" #: msg_activity_finished msgid "Activity finished!" msgstr "הפעילות הסתיימה!" #: msg_playing_media msgid "Playing media" msgstr "מנגן מדיה" #: msg_activity_running msgid "Activity running" msgstr "פעילות שרצה" #: msg_activity_ready msgid "Activity ready" msgstr "פעילות מוכנה" #: msg_initializing msgid "Initializing..." msgstr "מתחיל..." #: msg_preparing_media msgid "Preparing media" msgstr "מכין את המדיה" #: msg_error_loading_activity msgid "Error loading activity" msgstr "שגיאה בטעינת הפעילות" #: msg_loading_activity msgid "Loading activity" msgstr "טוען פעילות" #: msg_loading_project msgid "Loading project..." msgstr "טוען פרוייקט..." #: msg_ready msgid "Ready" msgstr "מוכן" #: err_reading_data msgid "Error loading file" msgstr "שגיאה בטעינת קובץ" #: err_file_save msgid "Error saving file!" msgstr "שגיאה בשמירת קובץ!" #: err_file_open msgid "Error opening file!" msgstr "שגיאה בפתיחת קובץ!" #: report_started msgid "Session started:" msgstr "הפעלה החלה:" #: report_lb_score msgid "Score" msgstr "ניקוד" #: report_lb_actions msgid "Actions" msgstr "פעולות" #: report_lb_solved msgid "Ok" msgstr "אישור" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "פעילות" #: report_lb_sequence msgid "Sequence" msgstr "רצף" #: report_global_score msgid "Global score:" msgstr "ניקוד כללי:" #: report_total_time msgid "Total time on activities:" msgstr "משך הפעילויות המצטבר:" #: report_num_activities_solved msgid "Activities ok:" msgstr "פעילויות מאושרות:" #: report_num_activities msgid "Activities done:" msgstr "פעילויות שהושלמו:" #: report_num_sequences msgid "Sequences:" msgstr "רצפים:" #: report_system msgid "Report system:" msgstr "מערכת דוחות:" #: report_user msgid "User:" msgstr "משתמש:" #: report_not_finished msgid "Activity not finished" msgstr "פעילות לא הסתיימה" #: action_info_tooltip msgid "Additional information" msgstr "מידע נוסף" #: action_help_caption msgid "Help" msgstr "עזרה" #: action_help_tooltip msgid "Help about this activity" msgstr "עזרה על פעילות זו" #: action_audio_caption msgid "Sounds" msgstr "צלילים" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "הפעל/בטל צלילים" #: about_window_lb_system msgid "System" msgstr "מערכת" #: about_window_lb_total_mem msgid "Total memory" msgstr "זכרון כולל" #: about_window_lb_free_mem msgid "Free memory" msgstr "זכרון פנוי" #: about_window_lb_java_home msgid "Java home" msgstr "עמוד הבית של ג'אווה" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "סביבת ג'אווה וירטאולית" #: about_window_lb_java_version msgid "Java version" msgstr "גירסת הג'אווה" #: about_window_lb_os msgid "Operating system" msgstr "מערכת הפעלה" #: about_window_lb_version msgid "Version" msgstr "גירסה" #: about_window_lb_descriptors msgid "Descriptors" msgstr "המתארים" #: about_window_lb_description msgid "Description" msgstr "תיאור" #: about_window_lb_history msgid "History" msgstr "היסטוריה" #: about_window_lb_organizations msgid "Organizations" msgstr "ארגונים" #: about_window_lb_organization msgid "Organization" msgstr "ארגון" #: about_window_lb_authors msgid "Authors" msgstr "מחברים" #: about_window_lb_author msgid "Author" msgstr "מחבר" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "פעילות" #: help_window_close_button msgid "Return to activity" msgstr "חזור לפעילות" #: help_window_caption msgid "Help window" msgstr "חלון עזרה" #: action_about_caption msgid "Reports" msgstr "דוחות" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "חבילות התקנת פרוייקט JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "אין משתמשים שהוגדרו בבסיס נתוני הדוחות!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "אין משתמשים שהוגדרו בקבוצה זו של בסיס נתוני הדוחות!" #: report_new_user msgid "New user..." msgstr "משתמש חדש..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "צור משתמש חדש בבסיס נתוני הדוחות" #: report_err_creating_user msgid "Error creating new user!" msgstr "תקלה ביצירת משתמש חדש!" #: report_select_user msgid "User identification for the reports database" msgstr "זיהוי משתמש לבסיס נתוני הדוחות" #: report_userlist_title msgid "Please select your name:" msgstr "אנא בחר את שמך:" #: report_ident_user msgid "User identification" msgstr "זיהוי משתמש" #: report_name_prompt msgid "Name:" msgstr "שם:" #: report_id_prompt msgid "Login:" msgstr "התחבר:" #: report_pw_prompt msgid "Password:" msgstr "סיסמא:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "אימות סיסמא:" #: report_new_user_data msgid "Creation of a new user:" msgstr "יצירת משתמש חדש:" #: report_err_bad_data msgid "Incorrect data!" msgstr "נתונים שגויים!" #: report_generic_group_name msgid "Generic" msgstr "כללי" #: report_new_group msgid "Create a new group..." msgstr "צור קבוצה חדשה..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "תקלה ביצירת קבוצה חדשה!" #: report_grouplist_title msgid "Please select your group:" msgstr "אנא בחר את הקבוצה שלך:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "יצירת קבוצת משתמשים חדשה:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "חסר קוד משתמש או סיסמא לא נכונה." #: report_user_has_pwd msgid "This account is password-protected." msgstr "חשבון זה מוגן על ידי סיסמא." #: report_err_init msgid "Error initializing report system." msgstr "תקלה באתחול מערכת הדוחות." #: report_not_connected msgid "not connected" msgstr "לא מחובר" #: report_err_creating msgid "Error creating reports agent" msgstr "" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "חזור" #: action_return_tooltip msgid "Return to the last menu" msgstr "חזור לתפריט האחרון" #: action_return_keys msgid "T*" msgstr "" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "צלילים (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "קבצי MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "קבצי וידאו (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "קבצי Flash (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "" #: filefilter_all_media msgid "All media files" msgstr "" #: filesystem_copyToRoot_1 msgid "The file" msgstr "" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "" #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "" #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "" #: filesystem_copyFile msgid "Copying file" msgstr "" #: msg_loading msgid "Loading" msgstr "" #: report_err_bad_id msgid "Bad identifier!" msgstr "" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "" #: report_err_bad_name msgid "Bad name!" msgstr "" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "" #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "" #: ftype_image msgid "Image" msgstr "" #: ftype_audio msgid "Digital audio" msgstr "" #: ftype_midi msgid "MIDI file" msgstr "" #: ftype_xml msgid "XML file" msgstr "" #: ftype_anim msgid "Animation" msgstr "" #: ftype_video msgid "Digital video" msgstr "" #: ftype_font msgid "TrueType font" msgstr "" #: ftype_jclic msgid "JClic project" msgstr "" #: ftype_inst msgid "JClic project installer script" msgstr "" #: ftype_unknown msgid "Unknown" msgstr "" #: ftype_animated msgid "animated" msgstr "" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "" #: editor_moveUp_keys msgid "U#38" msgstr "" #: editor_moveDown_keys msgid "W#40" msgstr "" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "" #: about_creditsDoc msgid "about/credits.html" msgstr "" #: about_licenseDoc msgid "about/license.html" msgstr "" #: about_sponsorsCaption msgid "With the support of:" msgstr "" #: about_window_systemInfo msgid "System information" msgstr "" #: about_window_projectInfo msgid "Current project info" msgstr "" #: about_window_reportInfo msgid "Current session results" msgstr "" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "" #: msg_saving_project msgid "Saving project..." msgstr "" #: filefilter_text msgid "Text files (*.txt)" msgstr "" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" i18n/fromLaunchpad/po/jclic-core/JClicMessages_it.po000066400000000000000000000425211335566474600226070ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2008-10-01 17:30+0000\n" "Last-Translator: Matteo Ferrabone \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "tempo" #: label_actions msgid "tries" msgstr "tentativi" #: label_score msgid "score" msgstr "punteggio" #: Skin msgid "Skin" msgstr "Skin" #: action_next_caption msgid "Next" msgstr "Avanti" #: action_next_tooltip msgid "Next activity" msgstr "Attività successiva" #: action_prev_caption msgid "Previous" msgstr "Precedente" #: action_prev_tooltip msgid "Previous activity" msgstr "Attività precedente" #: action_reset_caption msgid "Restart" msgstr "Riavvia" #: action_reset_tooltip msgid "Restart activity" msgstr "Riavvia l'attività" #: action_info_caption msgid "Information" msgstr "Informazioni" #: about_window_lb_project msgid "Project" msgstr "Progetto" #: about_window_lb_languages msgid "languages" msgstr "lingue" #: about_window_lb_language msgid "language" msgstr "lingua" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Torna al programma" #: about_window_caption msgid "About" msgstr "Informazioni su..." #: action_about_tooltip msgid "User reports" msgstr "Rapporti utente" #: about_window_lb_report msgid "Report" msgstr "Rapporto" #: about_window_browser_button msgid "View in browser" msgstr "Vedi nel browser" #: report_no_activities msgid "No activities reported!" msgstr "Nessuna attività a rapporto!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Rapporto non registrato in alcun database" #: report_lb_time msgid "Time" msgstr "Tempi" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Errore al caricamento della sequenza" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Errore nell'inizializzazione di Quick Time!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia_it.html" #: filesystem_openURL msgid "Open URL..." msgstr "Apri URL" #: filesystem_openFile msgid "Open file..." msgstr "Apri file..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Per favore, inserisci l'URL della risorsa da caricare." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Errore nell'esecuzione del comando:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Sposta in basso l'elemento selezionato" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Sposta in alto l'elemento selezionato" #: editor_moveDown msgid "Move down" msgstr "Sposta in basso" #: editor_moveUp msgid "Move up" msgstr "Sposta in alto" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Immagini (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "Immagini PNG" #: filefilter_jpg msgid "JPG images" msgstr "Immagini JPG" #: filefilter_gif msgid "GIF images" msgstr "Immagini GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "I files a base URL sono in sola lettura." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Pacchetti di Clic 3.0" #: filefilter_all msgid "All files" msgstr "Tutti i file" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Progetti di JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Progetti di JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Clic 3.0 pacchetti compattati (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Clic 3.0 pacchetti aperti (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Progetti di JClic compressi (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Progetti di JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Sistema multimediale" #: about_window_lb_level msgid "Level" msgstr "Livello" #: about_window_lb_area msgid "Area" msgstr "Dominio" #: report_num_actions msgid "Actions done:" msgstr "Azioni compiute:" #: report_project msgid "Project:" msgstr "Progetto:" #: report_lb_totals msgid "Total:" msgstr "Totale:" #: report_num_projects msgid "Projects:" msgstr "Progetti:" #: report_session msgid "Session:" msgstr "Sessione:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Per ragioni di sicurezza, l'esecuzione di programmi esterni nelle applet di " "JClic è disabilitata." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Errore nell'avvio dell'attività!" #: msg_error_loading_project msgid "Error loading project" msgstr "Errore nel caricamento del progetto" #: msg_error_playing_media msgid "Error playing media!" msgstr "Errore nella riproduzione del file multimediale!" #: msg_activity_finished msgid "Activity finished!" msgstr "Attività terminata!" #: msg_playing_media msgid "Playing media" msgstr "Lettura del file multimediale" #: msg_activity_running msgid "Activity running" msgstr "Attività in corso" #: msg_activity_ready msgid "Activity ready" msgstr "Attività pronta" #: msg_initializing msgid "Initializing..." msgstr "Inizializzazione..." #: msg_preparing_media msgid "Preparing media" msgstr "Preparazione del file multimediale" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Errore nel caricamento dell'attività" #: msg_loading_activity msgid "Loading activity" msgstr "Caricamento dell'attività" #: msg_loading_project msgid "Loading project..." msgstr "Caricamento del progetto..." #: msg_ready msgid "Ready" msgstr "Pronto" #: err_reading_data msgid "Error loading file" msgstr "Errore durante il caricamento del file" #: err_file_save msgid "Error saving file!" msgstr "Errore durante il salvataggio del file!" #: err_file_open msgid "Error opening file!" msgstr "Errore durante l'apertura del file!" #: report_started msgid "Session started:" msgstr "Sessione avviata:" #: report_lb_score msgid "Score" msgstr "Punteggio" #: report_lb_actions msgid "Actions" msgstr "Azioni" #: report_lb_solved msgid "Ok" msgstr "Ok" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Attività" #: report_lb_sequence msgid "Sequence" msgstr "Sequenza" #: report_global_score msgid "Global score:" msgstr "Punteggio globale:" #: report_total_time msgid "Total time on activities:" msgstr "Tempo totale nelle attività:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Attività ok:" #: report_num_activities msgid "Activities done:" msgstr "Attività eseguite:" #: report_num_sequences msgid "Sequences:" msgstr "Sequenze:" #: report_system msgid "Report system:" msgstr "Sistema dei rapporti:" #: report_user msgid "User:" msgstr "Utente:" #: report_not_finished msgid "Activity not finished" msgstr "Attività non conclusa" #: action_info_tooltip msgid "Additional information" msgstr "Informazioni aggiuntive" #: action_help_caption msgid "Help" msgstr "Aiuto" #: action_help_tooltip msgid "Help about this activity" msgstr "Aiuto su questa attività" #: action_audio_caption msgid "Sounds" msgstr "Suoni" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Abilita/disabilita suoni" #: about_window_lb_system msgid "System" msgstr "Sistema" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memoria totale" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memoria libera" #: about_window_lb_java_home msgid "Java home" msgstr "Java home" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Java virtual machine" #: about_window_lb_java_version msgid "Java version" msgstr "Versione di Java" #: about_window_lb_os msgid "Operating system" msgstr "Sistema operativo" #: about_window_lb_version msgid "Version" msgstr "Versione" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descrittori" #: about_window_lb_description msgid "Description" msgstr "Descrizione" #: about_window_lb_history msgid "History" msgstr "Cronologia" #: about_window_lb_organizations msgid "Organizations" msgstr "Organizzazioni" #: about_window_lb_organization msgid "Organization" msgstr "Organizzazione" #: about_window_lb_authors msgid "Authors" msgstr "Autori" #: about_window_lb_author msgid "Author" msgstr "Autore" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Attività" #: help_window_close_button msgid "Return to activity" msgstr "Ritorna all'attività" #: help_window_caption msgid "Help window" msgstr "Finestra di aiuto" #: action_about_caption msgid "Reports" msgstr "Rapporti" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Installatori di progetti JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Nessun utente è stato definito nel database dei rapporti!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "Nessun utente è stato definito per questo gruppo nel database dei rapporti!" #: report_new_user msgid "New user..." msgstr "Nuovo utente..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Crea un nuovo utente nel database dei rapporti" #: report_err_creating_user msgid "Error creating new user!" msgstr "Errore nella creazione di un nuovo utente!" #: report_select_user msgid "User identification for the reports database" msgstr "Identificazione dell'utente per il database dei rapporti" #: report_userlist_title msgid "Please select your name:" msgstr "Per favore, seleziona il tuo nome:" #: report_ident_user msgid "User identification" msgstr "Identificazione dell'utente" #: report_name_prompt msgid "Name:" msgstr "Nome:" #: report_id_prompt msgid "Login:" msgstr "Login:" #: report_pw_prompt msgid "Password:" msgstr "Password:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Conferma password:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Creazione di un nuovo utente:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Dati inesatti!" #: report_generic_group_name msgid "Generic" msgstr "Generico" #: report_new_group msgid "Create a new group..." msgstr "Crea un nuovo gruppo..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Errore nella creazione del nuovo gruppo!" #: report_grouplist_title msgid "Please select your group:" msgstr "Per favore, seleziona il tuo gruppo:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Creazione di un nuovo gruppo di utenti:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Manca la user ID oppure la password è sbagliata." #: report_user_has_pwd msgid "This account is password-protected." msgstr "L'accesso è protetto da password." #: report_err_init msgid "Error initializing report system." msgstr "Errore nell'inizializzazione del sistema dei rapporti." #: report_not_connected msgid "not connected" msgstr "non connesso" #: report_err_creating msgid "Error creating reports agent" msgstr "Errore nella creazione di un agente dei rapporti" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Torna al programma" #: action_return_tooltip msgid "Return to the last menu" msgstr "Ritorna all'ultimo menu" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Suoni (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Skins (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Tutti i file multimediali" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Il file" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "è fuori dalla cartella del progetto corrente." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "E' consigliabile tenere tutti i file nella stessa cartella." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Vuoi copiare i file selezionati nella cartella del progetto?" #: filesystem_copyFile msgid "Copying file" msgstr "Copia del file" #: msg_loading msgid "Loading" msgstr "Caricamento" #: report_err_bad_id msgid "Bad identifier!" msgstr "Identificatore non corretto!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Questo identificatore già esiste nel database!" #: report_err_bad_name msgid "Bad name!" msgstr "Nome non corretto!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Le password non coincidono!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Errore di connessione al database dei rapporti!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "ESCI: A questo punto termina il programma." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "A questo punto il programma salterà verso il progetto:" #: ftype_image msgid "Image" msgstr "Immagine" #: ftype_audio msgid "Digital audio" msgstr "Audio digitale" #: ftype_midi msgid "MIDI file" msgstr "File MIDI" #: ftype_xml msgid "XML file" msgstr "File XML" #: ftype_anim msgid "Animation" msgstr "Animazione" #: ftype_video msgid "Digital video" msgstr "Video digitale" #: ftype_font msgid "TrueType font" msgstr "Carattere TrueType" #: ftype_jclic msgid "JClic project" msgstr "Progetto JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Script d'installatore di progetto JClic" #: ftype_unknown msgid "Unknown" msgstr "Sconosciuto" #: ftype_animated msgid "animated" msgstr "animato" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Caratteri (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Documenti HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits_it.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license_it.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Con l'aiuto di:" #: about_window_systemInfo msgid "System information" msgstr "Informazioni sul sistema" #: about_window_projectInfo msgid "Current project info" msgstr "Informazioni sul progetto corrente" #: about_window_reportInfo msgid "Current session results" msgstr "Risultati della sessione corrente" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Questo prodotto contiene software sviluppato da:" #: msg_saving_project msgid "Saving project..." msgstr "Salvataggio del progetto..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Testi (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Version Italiana: Roberto Marcolin e Giorgio Musilli" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public " "License for more details." i18n/fromLaunchpad/po/jclic-core/JClicMessages_nl.po000066400000000000000000000417661335566474600226160ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2008-08-11 12:56+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "tijd" #: label_actions msgid "tries" msgstr "pogingen" #: label_score msgid "score" msgstr "punten" #: Skin msgid "Skin" msgstr "Achtergrond" #: action_next_caption msgid "Next" msgstr "Volgende" #: action_next_tooltip msgid "Next activity" msgstr "Volgende activiteit" #: action_prev_caption msgid "Previous" msgstr "Vorige" #: action_prev_tooltip msgid "Previous activity" msgstr "Vorige activiteit" #: action_reset_caption msgid "Restart" msgstr "Herstarten" #: action_reset_tooltip msgid "Restart activity" msgstr "Herstart activiteit" #: action_info_caption msgid "Information" msgstr "Informatie" #: about_window_lb_project msgid "Project" msgstr "Project" #: about_window_lb_languages msgid "languages" msgstr "talen" #: about_window_lb_language msgid "language" msgstr "taal" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Terug" #: about_window_caption msgid "About" msgstr "Informatie" #: action_about_tooltip msgid "User reports" msgstr "Gebruikers rapport" #: about_window_lb_report msgid "Report" msgstr "Rapport" #: about_window_browser_button msgid "View in browser" msgstr "Bekijken in browser" #: report_no_activities msgid "No activities reported!" msgstr "Geen activiteiten gerapporteerd!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Rapport niet geregistreerd in een DB" #: report_lb_time msgid "Time" msgstr "Tijd" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Fout tijdens het laden" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Fout bij starten QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "berichten/testmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "URL-adres openen..." #: filesystem_openFile msgid "Open file..." msgstr "Bestand openen..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Voer URL van de bron in." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Fout tijdens de uitvoering van het commando:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Het geselecteerd element omlaag" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Het geselecteerd element omhoog" #: editor_moveDown msgid "Move down" msgstr "Omlaag" #: editor_moveUp msgid "Move up" msgstr "Omhoog" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Afbeeldingen (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "PNG afbeeldingen" #: filefilter_jpg msgid "JPG images" msgstr "JPG afbeeldingen" #: filefilter_gif msgid "GIF images" msgstr "GIF afbeeldingen" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "URL-bestanden zijn read-only." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Clic 3.0 packages (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Alle bestanden" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "JClic en Clic 3.0 projecten (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "JClic projecten (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Clic 3.0 compact packages (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Clic 3.0 open packages (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "JClic compressed projecten (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "JClic projecten (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Multimedia systeem" #: about_window_lb_level msgid "Level" msgstr "Niveau" #: about_window_lb_area msgid "Area" msgstr "Gebied" #: report_num_actions msgid "Actions done:" msgstr "Einde activiteiten:" #: report_project msgid "Project:" msgstr "Project:" #: report_lb_totals msgid "Total:" msgstr "Totaal:" #: report_num_projects msgid "Projects:" msgstr "Projecten:" #: report_session msgid "Session:" msgstr "Reeks:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Starten van externe programma's is uitgeschakeld om veiligheidsredenen." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Fout bij het starten van een activiteit!" #: msg_error_loading_project msgid "Error loading project" msgstr "Fout bij laden van het project" #: msg_error_playing_media msgid "Error playing media!" msgstr "Fout bij het afspelen van media!" #: msg_activity_finished msgid "Activity finished!" msgstr "Einde activiteit!" #: msg_playing_media msgid "Playing media" msgstr "Madia afspelen" #: msg_activity_running msgid "Activity running" msgstr "Activiteit gestart" #: msg_activity_ready msgid "Activity ready" msgstr "Activiteit klaar" #: msg_initializing msgid "Initializing..." msgstr "Initialiseren..." #: msg_preparing_media msgid "Preparing media" msgstr "Media voorbereiden" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Fout bij het laden van een activiteit" #: msg_loading_activity msgid "Loading activity" msgstr "Activiteit laden" #: msg_loading_project msgid "Loading project..." msgstr "Project laden..." #: msg_ready msgid "Ready" msgstr "Gereed" #: err_reading_data msgid "Error loading file" msgstr "Fout tijdens laden bestand" #: err_file_save msgid "Error saving file!" msgstr "Fout tijdens opslaan bestand!" #: err_file_open msgid "Error opening file!" msgstr "Fout bij openen bestand!" #: report_started msgid "Session started:" msgstr "Reeks gestart:" #: report_lb_score msgid "Score" msgstr "Punten" #: report_lb_actions msgid "Actions" msgstr "Acties" #: report_lb_solved msgid "Ok" msgstr "Ok" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Activiteit" #: report_lb_sequence msgid "Sequence" msgstr "Volgorde" #: report_global_score msgid "Global score:" msgstr "Puntentotaal:" #: report_total_time msgid "Total time on activities:" msgstr "Totale tijd activiteiten:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Activiteiten ok:" #: report_num_activities msgid "Activities done:" msgstr "Activiteiten klaar:" #: report_num_sequences msgid "Sequences:" msgstr "Reeksen:" #: report_system msgid "Report system:" msgstr "Rapporteer systeem:" #: report_user msgid "User:" msgstr "Gebruiker:" #: report_not_finished msgid "Activity not finished" msgstr "Activiteit nog niet gedaan" #: action_info_tooltip msgid "Additional information" msgstr "Verdere informatie" #: action_help_caption msgid "Help" msgstr "Help" #: action_help_tooltip msgid "Help about this activity" msgstr "Help bij deze activiteit" #: action_audio_caption msgid "Sounds" msgstr "Geluiden" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Geluid aan/uit" #: about_window_lb_system msgid "System" msgstr "Systeem" #: about_window_lb_total_mem msgid "Total memory" msgstr "Totaal geheugen" #: about_window_lb_free_mem msgid "Free memory" msgstr "Beschikbaar geheugen" #: about_window_lb_java_home msgid "Java home" msgstr "Java home" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Java virtual machine" #: about_window_lb_java_version msgid "Java version" msgstr "Java-versie" #: about_window_lb_os msgid "Operating system" msgstr "Besturingssysteem" #: about_window_lb_version msgid "Version" msgstr "Versie" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Beschrijvingen" #: about_window_lb_description msgid "Description" msgstr "Beschrijving" #: about_window_lb_history msgid "History" msgstr "Geschiedenis" #: about_window_lb_organizations msgid "Organizations" msgstr "Organisaties" #: about_window_lb_organization msgid "Organization" msgstr "Organisatie" #: about_window_lb_authors msgid "Authors" msgstr "Auteurs" #: about_window_lb_author msgid "Author" msgstr "Auteur" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Activiteit" #: help_window_close_button msgid "Return to activity" msgstr "Terug naar activiteit" #: help_window_caption msgid "Help window" msgstr "Help venster" #: action_about_caption msgid "Reports" msgstr "Rapporten" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "JClic project installers (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Geen gebruikers gedefinieerd in de rapporten database!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "Geen gebruikers gedefinieerd voor deze groep in de rapporten database!" #: report_new_user msgid "New user..." msgstr "Nieuwe gebruiker..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Maak een nieuwe gebruiker in de rapporten database" #: report_err_creating_user msgid "Error creating new user!" msgstr "Fout bij het maken van een gebruiker!" #: report_select_user msgid "User identification for the reports database" msgstr "Identificatie van de gebruiker in de rapporten database" #: report_userlist_title msgid "Please select your name:" msgstr "Kies uw naam:" #: report_ident_user msgid "User identification" msgstr "Identificatie van de gebruiker" #: report_name_prompt msgid "Name:" msgstr "Naam:" #: report_id_prompt msgid "Login:" msgstr "Gebruikersnaam:" #: report_pw_prompt msgid "Password:" msgstr "Wachtwoord:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Bevestig wachtwoord:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Aanmaken nieuwe gebruiker:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Verkeerde gegevens!" #: report_generic_group_name msgid "Generic" msgstr "Algemeen" #: report_new_group msgid "Create a new group..." msgstr "Maak een nieuwe groep..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Fout bij het maken van een nieuwe groep" #: report_grouplist_title msgid "Please select your group:" msgstr "Kies groep:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Maken van een nieuwe gebruikersgroep:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Gebruikers identificatie verkeerd of ontbreekt." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Deze aanmelding is beveiligd met een wachtwoord." #: report_err_init msgid "Error initializing report system." msgstr "Fout bij het initialiseren van het rapport systeem." #: report_not_connected msgid "not connected" msgstr "Niet verbonden" #: report_err_creating msgid "Error creating reports agent" msgstr "Fout bij het aanmaken van het rapport" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Vorige" #: action_return_tooltip msgid "Return to the last menu" msgstr "Vorig menu" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Geluiden (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI bestanden (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video bestanden (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 bestanden (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Skins (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Alle mediabestanden" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Het bestand" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "is buiten de map van het huidig project." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Het is gemakkelijk als alle bestanden in dezelfde map zitten." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Wil je een kopie van het gekozen bestand in de map van het project?" #: filesystem_copyFile msgid "Copying file" msgstr "Bestand kopiëren" #: msg_loading msgid "Loading" msgstr "Laden" #: report_err_bad_id msgid "Bad identifier!" msgstr "Verkeerde identificatie!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Deze identificatie bestaat reeds in de database!" #: report_err_bad_name msgid "Bad name!" msgstr "Verkeerde naam!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "De wachtwoorden komen niet overeen!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Fout bij het verbinden met de rapporten database!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "EXIT: Nu zal het programma stoppen." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Nu zal het programma naar het project gaan:" #: ftype_image msgid "Image" msgstr "Afbeelding" #: ftype_audio msgid "Digital audio" msgstr "Digital audio" #: ftype_midi msgid "MIDI file" msgstr "MIDI bestand" #: ftype_xml msgid "XML file" msgstr "XML-bestand" #: ftype_anim msgid "Animation" msgstr "Animatie" #: ftype_video msgid "Digital video" msgstr "Digital video" #: ftype_font msgid "TrueType font" msgstr "TrueType lettertype" #: ftype_jclic msgid "JClic project" msgstr "JClic project" #: ftype_inst msgid "JClic project installer script" msgstr "JClic project installeer script" #: ftype_unknown msgid "Unknown" msgstr "Onbekend" #: ftype_animated msgid "animated" msgstr "geanimeerd" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Lettertypen (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML documenten (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "info/credits.html" #: about_licenseDoc msgid "about/license.html" msgstr "info/license.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Met ondersteuning van:" #: about_window_systemInfo msgid "System information" msgstr "Systeem informatie" #: about_window_projectInfo msgid "Current project info" msgstr "Huidig project informatie" #: about_window_reportInfo msgid "Current session results" msgstr "Huidige reeksresultaten" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Dit product bevat software ontwikkeld door:" #: msg_saving_project msgid "Saving project..." msgstr "Project bewaren..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Tekst bestanden (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Engelse versie, door Het JClic team" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." i18n/fromLaunchpad/po/jclic-core/JClicMessages_pt.po000066400000000000000000000421631335566474600226200ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2010-02-09 01:26+0000\n" "Last-Translator: Almufadado \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "tempo" #: label_actions msgid "tries" msgstr "tentativas" #: label_score msgid "score" msgstr "acertos" #: Skin msgid "Skin" msgstr "Aspecto" #: action_next_caption msgid "Next" msgstr "Seguinte" #: action_next_tooltip msgid "Next activity" msgstr "Actividade seguinte" #: action_prev_caption msgid "Previous" msgstr "Anterior" #: action_prev_tooltip msgid "Previous activity" msgstr "Actividade anterior" #: action_reset_caption msgid "Restart" msgstr "Reiniciar" #: action_reset_tooltip msgid "Restart activity" msgstr "Reiniciar a actividade" #: action_info_caption msgid "Information" msgstr "Informação" #: about_window_lb_project msgid "Project" msgstr "Projecto" #: about_window_lb_languages msgid "languages" msgstr "Idiomas" #: about_window_lb_language msgid "language" msgstr "Idioma" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Voltar" #: about_window_caption msgid "About" msgstr "Sobre..." #: action_about_tooltip msgid "User reports" msgstr "Relatórios do utilizador" #: about_window_lb_report msgid "Report" msgstr "Relatórios" #: about_window_browser_button msgid "View in browser" msgstr "Ver no navegador" #: report_no_activities msgid "No activities reported!" msgstr "Nenhuma actividade registada!" #: report_system_standard msgid "Report not registered in any DB" msgstr "O relatório não está registado em nenhuma base de dados" #: report_lb_time msgid "Time" msgstr "Tempo" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Erro ao carregar a sequência" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Erro ao iniciar QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia_pt.html" #: filesystem_openURL msgid "Open URL..." msgstr "Abrir URL..." #: filesystem_openFile msgid "Open file..." msgstr "Abrir ficheiro..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Escreva URL do recurso a que deseja aceder" #: msg_error_executing_external msgid "Error executing the command:" msgstr "Erro ao executar o comando:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Mover para baixo o elemento seleccionado" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Mover para cima o elemento seleccionado" #: editor_moveDown msgid "Move down" msgstr "Mover para baixo" #: editor_moveUp msgid "Move up" msgstr "Mover para cima" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Imagens (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "Imagens PNG" #: filefilter_jpg msgid "JPG images" msgstr "Imagens JPG" #: filefilter_gif msgid "GIF images" msgstr "Imagens GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Ficheiros de URL só de leitura." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Pacotes Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Todos os ficheiros" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Projectos JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Projectos JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Pacotes compactos Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Pacotes abertos Clic 3.0 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Projectos JClic comprimidos (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Projectos JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Sistema multimédia" #: about_window_lb_level msgid "Level" msgstr "Nível" #: about_window_lb_area msgid "Area" msgstr "Área" #: report_num_actions msgid "Actions done:" msgstr "Acções efectuadas:" #: report_project msgid "Project:" msgstr "Projecto:" #: report_lb_totals msgid "Total:" msgstr "Total:" #: report_num_projects msgid "Projects:" msgstr "Projectos:" #: report_session msgid "Session:" msgstr "Sessão:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Por razões de segurança, a execução de programas externos está desactivada " "nos applets JClic" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Erro ao iniciar a actividade!" #: msg_error_loading_project msgid "Error loading project" msgstr "Erro ao carregar o projecto" #: msg_error_playing_media msgid "Error playing media!" msgstr "Erro do recurso multimédia!" #: msg_activity_finished msgid "Activity finished!" msgstr "Actividade terminada!" #: msg_playing_media msgid "Playing media" msgstr "Multimédia em execução" #: msg_activity_running msgid "Activity running" msgstr "Actividade em execução" #: msg_activity_ready msgid "Activity ready" msgstr "Actividade preparada" #: msg_initializing msgid "Initializing..." msgstr "A iniciar..." #: msg_preparing_media msgid "Preparing media" msgstr "A preparar multimédia" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Erro ao carregar a actividade" #: msg_loading_activity msgid "Loading activity" msgstr "A carregar actividade" #: msg_loading_project msgid "Loading project..." msgstr "A carregar projecto..." #: msg_ready msgid "Ready" msgstr "Pronto" #: err_reading_data msgid "Error loading file" msgstr "Erro ao carregar ficheiro" #: err_file_save msgid "Error saving file!" msgstr "Erro ao guardar o ficheiro!" #: err_file_open msgid "Error opening file!" msgstr "Erro ao abrir o ficheiro!" #: report_started msgid "Session started:" msgstr "Início da sessão:" #: report_lb_score msgid "Score" msgstr "Pontuação" #: report_lb_actions msgid "Actions" msgstr "Acções" #: report_lb_solved msgid "Ok" msgstr "Correcta" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Actividade" #: report_lb_sequence msgid "Sequence" msgstr "Sequência" #: report_global_score msgid "Global score:" msgstr "Pontuação global:" #: report_total_time msgid "Total time on activities:" msgstr "Tempo total das actividades:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Actividades correctas:" #: report_num_activities msgid "Activities done:" msgstr "Actividades realizadas:" #: report_num_sequences msgid "Sequences:" msgstr "Sequências:" #: report_system msgid "Report system:" msgstr "Sistema de relatórios:" #: report_user msgid "User:" msgstr "Utilizador:" #: report_not_finished msgid "Activity not finished" msgstr "Actividade não concluída" #: action_info_tooltip msgid "Additional information" msgstr "Informação adicional" #: action_help_caption msgid "Help" msgstr "Ajuda" #: action_help_tooltip msgid "Help about this activity" msgstr "Ajuda sobre a actividade" #: action_audio_caption msgid "Sounds" msgstr "Sons" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Activar/desactivar sons" #: about_window_lb_system msgid "System" msgstr "Sistema" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memória total" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memória livre" #: about_window_lb_java_home msgid "Java home" msgstr "Página do Java" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Máquina virtual Java" #: about_window_lb_java_version msgid "Java version" msgstr "Versão Java" #: about_window_lb_os msgid "Operating system" msgstr "Sistema operativo" #: about_window_lb_version msgid "Version" msgstr "Versão" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descritores" #: about_window_lb_description msgid "Description" msgstr "Descrição" #: about_window_lb_history msgid "History" msgstr "Histórico" #: about_window_lb_organizations msgid "Organizations" msgstr "Organizações" #: about_window_lb_organization msgid "Organization" msgstr "Organização" #: about_window_lb_authors msgid "Authors" msgstr "Autores/as" #: about_window_lb_author msgid "Author" msgstr "Autor/a" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Actividade" #: help_window_close_button msgid "Return to activity" msgstr "Voltar à actividade" #: help_window_caption msgid "Help window" msgstr "Janela de ajuda" #: action_about_caption msgid "Reports" msgstr "Relatórios" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Instaladores de projectos JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Nenhum utilizador definido na base de dados de relatórios!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "Nenhum utilizador definido para este grupo na base de dados de relatórios!" #: report_new_user msgid "New user..." msgstr "Novo utilizador..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Criar um novo utilizador na base de dados de relatórios!" #: report_err_creating_user msgid "Error creating new user!" msgstr "Erro ao criar um novo utilizador!" #: report_select_user msgid "User identification for the reports database" msgstr "Identificação de utilizador para base de dados de relatórios" #: report_userlist_title msgid "Please select your name:" msgstr "Seleccione seu nome:" #: report_ident_user msgid "User identification" msgstr "Identificação de utilizador" #: report_name_prompt msgid "Name:" msgstr "Nome:" #: report_id_prompt msgid "Login:" msgstr "Nome de Utilizador:" #: report_pw_prompt msgid "Password:" msgstr "Palavra-passe:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Confirmar palavra-chave:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Criação de novo utilizador:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Dados incorrectos!" #: report_generic_group_name msgid "Generic" msgstr "Genérico" #: report_new_group msgid "Create a new group..." msgstr "Criar un novo grupo..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Erro ao criar o novo grupo!" #: report_grouplist_title msgid "Please select your group:" msgstr "Seleccione grupo:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Criação de novo grupo de utilizadores:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Utilizador inexistente ou palavra-passe incorrecta." #: report_user_has_pwd msgid "This account is password-protected." msgstr "A conta deste utilizador está protegida por palavra-chave:" #: report_err_init msgid "Error initializing report system." msgstr "Erro ao iniciar o sistema de relatórios." #: report_not_connected msgid "not connected" msgstr "não conectado" #: report_err_creating msgid "Error creating reports agent" msgstr "Erro ao criar o agente de relatórios" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Voltar" #: action_return_tooltip msgid "Return to the last menu" msgstr "Voltar ao último menu" #: action_return_keys msgid "T*" msgstr "V*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sons (*.wav, *.mp3, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Ficheiros MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Ficheiros Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Ambientes visuais (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Todos os ficheiros multimédia" #: filesystem_copyToRoot_1 msgid "The file" msgstr "O ficheiro" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "não se encontra na pasta do projecto actual." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Recomenda-se ter todos os ficheiros na mesma pasta." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Deseja copiar o ficheiro seleccionado para a pasta do projecto?" #: filesystem_copyFile msgid "Copying file" msgstr "A copiar o ficheiro" #: msg_loading msgid "Loading" msgstr "A carregar" #: report_err_bad_id msgid "Bad identifier!" msgstr "Identificador incorrecto!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Este identificador já existe na base de dados!" #: report_err_bad_name msgid "Bad name!" msgstr "Nome incorrecto!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "As palavras-chave não coincidem!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Erro ao ligar à base de dados de relatórios!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "SAIR: O programa vai ser encerrado." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "O programa vai ligar-se a outro projecto:" #: ftype_image msgid "Image" msgstr "Imagem" #: ftype_audio msgid "Digital audio" msgstr "Som digital" #: ftype_midi msgid "MIDI file" msgstr "Ficheiro MIDI" #: ftype_xml msgid "XML file" msgstr "Ficheiro XML" #: ftype_anim msgid "Animation" msgstr "Animação" #: ftype_video msgid "Digital video" msgstr "Vídeo digital" #: ftype_font msgid "TrueType font" msgstr "Tipo de letra TrueType" #: ftype_jclic msgid "JClic project" msgstr "Projecto JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Script de instalação de projectos JClic" #: ftype_unknown msgid "Unknown" msgstr "Desconhecido" #: ftype_animated msgid "animated" msgstr "animada" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Tipos de letra (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "R#38" #: editor_moveDown_keys msgid "W#40" msgstr "B#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Documentos HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "Sobre/Créditos_pt.html" #: about_licenseDoc msgid "about/license.html" msgstr "Sobre/Licença_pt.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Com o suporte de:" #: about_window_systemInfo msgid "System information" msgstr "Informações do sistema" #: about_window_projectInfo msgid "Current project info" msgstr "Informação sobre projecto actual" #: about_window_reportInfo msgid "Current session results" msgstr "Resultados da sessão actual" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Este produto inclui software desenvolvido por:" #: msg_saving_project msgid "Saving project..." msgstr "A guardar projecto..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Ficheiros de texto (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Revisão do português por Rui Fernandes" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Este programa é software livre (\"free software\"); você pode redistribui-lo " "e/ou modificá-lo de acordo com os termos da Licença Pública Geral GNU como " "publicada pela Free Software Foundation; tanto segundo a versão 2 dessa " "licença quanto (por sua opção) por uma versão posterior.
 
Este " "programa é distribuído na expectativa de ser útil, mas SEM QUALQUER " "GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO " "A QUALQUER PROPÓSITO EM PARTICULAR. Consulte GNU General Public License para obter " "mais detalhes." i18n/fromLaunchpad/po/jclic-core/JClicMessages_pt_BR.po000066400000000000000000000422371335566474600232050ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2009-02-25 12:17+0000\n" "Last-Translator: Alexandre R Soares \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "tempo" #: label_actions msgid "tries" msgstr "tentativas" #: label_score msgid "score" msgstr "acertos" #: Skin msgid "Skin" msgstr "Aspecto" #: action_next_caption msgid "Next" msgstr "Próximo" #: action_next_tooltip msgid "Next activity" msgstr "atividade seguinte" #: action_prev_caption msgid "Previous" msgstr "Anterior" #: action_prev_tooltip msgid "Previous activity" msgstr "atividade anterior" #: action_reset_caption msgid "Restart" msgstr "Reiniciar" #: action_reset_tooltip msgid "Restart activity" msgstr "Reiniciar a atividade" #: action_info_caption msgid "Information" msgstr "Informação" #: about_window_lb_project msgid "Project" msgstr "projeto" #: about_window_lb_languages msgid "languages" msgstr "Idiomas" #: about_window_lb_language msgid "language" msgstr "Idioma" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Voltar" #: about_window_caption msgid "About" msgstr "Sobre..." #: action_about_tooltip msgid "User reports" msgstr "relatórios de usuário" #: about_window_lb_report msgid "Report" msgstr "Relatórios" #: about_window_browser_button msgid "View in browser" msgstr "Ver no navegador" #: report_no_activities msgid "No activities reported!" msgstr "Nenhuma atividade registrada!" #: report_system_standard msgid "Report not registered in any DB" msgstr "O relatório não está registrando em nenhuma base de dados" #: report_lb_time msgid "Time" msgstr "Tempo" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Erro ao carregar a seqüência" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Erro ao inicializar QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia_pt_BR.html" #: filesystem_openURL msgid "Open URL..." msgstr "Abrir URL..." #: filesystem_openFile msgid "Open file..." msgstr "Abrir arquivo..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Escreva a URL do recurso que deseja acessar." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Erro ao executar o comando:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Mover para baixo o elemento selecionado" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Mover para cima o elemento selecionado" #: editor_moveDown msgid "Move down" msgstr "Mover para baixo" #: editor_moveUp msgid "Move up" msgstr "Mover para cima" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Imagens (*.gif, *.jpg, *.png)" #: filefilter_png msgid "PNG images" msgstr "Imagens PNG" #: filefilter_jpg msgid "JPG images" msgstr "Imagens JPG" #: filefilter_gif msgid "GIF images" msgstr "Imagens GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Os arquivos baseados na URL são de leitura apenas." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Pacotes Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Todos os arquivos" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "projetos JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "projetos JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Pacotes compactos Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Pacotes abertos Clic 3.0 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "projetos JClic comprimidos (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "projetos JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Sistema multimeio" #: about_window_lb_level msgid "Level" msgstr "Nível" #: about_window_lb_area msgid "Area" msgstr "Área" #: report_num_actions msgid "Actions done:" msgstr "Ações efetuadas:" #: report_project msgid "Project:" msgstr "projeto:" #: report_lb_totals msgid "Total:" msgstr "Total:" #: report_num_projects msgid "Projects:" msgstr "projetos:" #: report_session msgid "Session:" msgstr "Sessão:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Por razões de segurança a chamada de programas externos está desabilitada " "nos applets JClic." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Erro ao iniciar a atividade!" #: msg_error_loading_project msgid "Error loading project" msgstr "Erro ao carregar o projeto" #: msg_error_playing_media msgid "Error playing media!" msgstr "Erro ao executar a mídia!" #: msg_activity_finished msgid "Activity finished!" msgstr "atividade terminada!" #: msg_playing_media msgid "Playing media" msgstr "Interpretando mídia" #: msg_activity_running msgid "Activity running" msgstr "atividade em andamento" #: msg_activity_ready msgid "Activity ready" msgstr "atividade pronta" #: msg_initializing msgid "Initializing..." msgstr "A inicializar..." #: msg_preparing_media msgid "Preparing media" msgstr "Preparando mídia" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Erro ao carregar a atividade" #: msg_loading_activity msgid "Loading activity" msgstr "A carregar atividade" #: msg_loading_project msgid "Loading project..." msgstr "A carregar projeto..." #: msg_ready msgid "Ready" msgstr "Pronto" #: err_reading_data msgid "Error loading file" msgstr "Erro ao ler o arquivo" #: err_file_save msgid "Error saving file!" msgstr "Erro ao salvar o arquivo!" #: err_file_open msgid "Error opening file!" msgstr "Erro ao abrir o arquivo!" #: report_started msgid "Session started:" msgstr "Início da sessão:" #: report_lb_score msgid "Score" msgstr "Pontuação" #: report_lb_actions msgid "Actions" msgstr "Ações" #: report_lb_solved msgid "Ok" msgstr "Correta" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "atividade" #: report_lb_sequence msgid "Sequence" msgstr "Sequência" #: report_global_score msgid "Global score:" msgstr "Pontuação geral:" #: report_total_time msgid "Total time on activities:" msgstr "Tempo total das atividades:" #: report_num_activities_solved msgid "Activities ok:" msgstr "atividades corretas:" #: report_num_activities msgid "Activities done:" msgstr "atividades realizadas:" #: report_num_sequences msgid "Sequences:" msgstr "Sequências:" #: report_system msgid "Report system:" msgstr "Sistema de relatórios:" #: report_user msgid "User:" msgstr "Usuário:" #: report_not_finished msgid "Activity not finished" msgstr "atividade ainda não acabada" #: action_info_tooltip msgid "Additional information" msgstr "Informação adicional" #: action_help_caption msgid "Help" msgstr "Ajuda" #: action_help_tooltip msgid "Help about this activity" msgstr "Ajuda sobre a atividade" #: action_audio_caption msgid "Sounds" msgstr "Sons" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Ativar/desativar sons" #: about_window_lb_system msgid "System" msgstr "Sistema" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memória total" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memória livre" #: about_window_lb_java_home msgid "Java home" msgstr "Local do Java" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Máquina virtual Java" #: about_window_lb_java_version msgid "Java version" msgstr "Versão Java" #: about_window_lb_os msgid "Operating system" msgstr "Sistema operacional" #: about_window_lb_version msgid "Version" msgstr "Versão" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descritores" #: about_window_lb_description msgid "Description" msgstr "Descrição" #: about_window_lb_history msgid "History" msgstr "Revisões" #: about_window_lb_organizations msgid "Organizations" msgstr "Organizações" #: about_window_lb_organization msgid "Organization" msgstr "Organização" #: about_window_lb_authors msgid "Authors" msgstr "Autores/as" #: about_window_lb_author msgid "Author" msgstr "Autor/a" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "atividade" #: help_window_close_button msgid "Return to activity" msgstr "Voltar à atividade" #: help_window_caption msgid "Help window" msgstr "Janela de ajuda" #: action_about_caption msgid "Reports" msgstr "relatórios" #: action_about_keys msgid "RR" msgstr "II" #: action_audio_keys msgid "SS" msgstr "OS" #: action_help_keys msgid "HH" msgstr "YY" #: action_info_keys msgid "II" msgstr "NN" #: action_next_keys msgid "N*" msgstr "S*" #: action_prev_keys msgid "P*" msgstr "A*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Instaladores de projetos JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Não há nenhum usuário definido na base de dados de relatórios." #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "Não há nenhum usuário definido para este grupo na base de dados de " "relatórios!" #: report_new_user msgid "New user..." msgstr "Novo usuário..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Criar um novo usuário na base de dados de relatórios" #: report_err_creating_user msgid "Error creating new user!" msgstr "Erro ao criar o novo usuário!" #: report_select_user msgid "User identification for the reports database" msgstr "Identificação de usuário para a base de dados de relatórios" #: report_userlist_title msgid "Please select your name:" msgstr "Selecione seu nome:" #: report_ident_user msgid "User identification" msgstr "Identificação de usuário" #: report_name_prompt msgid "Name:" msgstr "Nome:" #: report_id_prompt msgid "Login:" msgstr "Identificador:" #: report_pw_prompt msgid "Password:" msgstr "Senha:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Confirmar senha:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Criação de um novo usuário:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Dados incorretos!" #: report_generic_group_name msgid "Generic" msgstr "Genérico" #: report_new_group msgid "Create a new group..." msgstr "Criar um novo grupo..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Erro ao criar o novo grupo!" #: report_grouplist_title msgid "Please select your group:" msgstr "Selecione seu grupo:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Criação de um novo grupo de usuários:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Usuário inexistente ou senha incorreta." #: report_user_has_pwd msgid "This account is password-protected." msgstr "A conta deste usuário está protegida por senha." #: report_err_init msgid "Error initializing report system." msgstr "Erro ao inicializar o sistema de relatórios." #: report_not_connected msgid "not connected" msgstr "não conectado" #: report_err_creating msgid "Error creating reports agent" msgstr "Erro ao criar o agente de relatórios" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Voltar" #: action_return_tooltip msgid "Return to the last menu" msgstr "Voltar ao último menu" #: action_return_keys msgid "T*" msgstr "V*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sons (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Arquivos MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Arquivos Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Entornos visuais (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Todos os recursos" #: filesystem_copyToRoot_1 msgid "The file" msgstr "O arquivo" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "se encontra numa pasta diferente do projeto atual." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Recomenda-se ter todos os arquivos na mesma pasta." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Deseja copiar o arquivo seleccionado para a pasta do projeto?" #: filesystem_copyFile msgid "Copying file" msgstr "Copiando o arquivo" #: msg_loading msgid "Loading" msgstr "Carregando" #: report_err_bad_id msgid "Bad identifier!" msgstr "Identificador incorreto!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Este identificador já existe na base de dados!" #: report_err_bad_name msgid "Bad name!" msgstr "Nome incorreto!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "As senhas não coincidem!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Erro ao conectar com a base de dados de relatórios!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "SAIR: Neste ponto o programa seria fechado." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Neste ponto, saltaria ao projeto:" #: ftype_image msgid "Image" msgstr "Imagem" #: ftype_audio msgid "Digital audio" msgstr "Som digital" #: ftype_midi msgid "MIDI file" msgstr "Arquivo MIDI" #: ftype_xml msgid "XML file" msgstr "Arquivo XML" #: ftype_anim msgid "Animation" msgstr "Animação" #: ftype_video msgid "Digital video" msgstr "Video digital" #: ftype_font msgid "TrueType font" msgstr "Tipo de letra TrueType" #: ftype_jclic msgid "JClic project" msgstr "projeto JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Script de instalação de projetos JClic" #: ftype_unknown msgid "Unknown" msgstr "Desconhecido" #: ftype_animated msgid "animated" msgstr "animada" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Tipos de letra (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "R#38" #: editor_moveDown_keys msgid "W#40" msgstr "B#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Documentos HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits_pt_BR.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license_pt_BR.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Com o suporte de:" #: about_window_systemInfo msgid "System information" msgstr "Informação do sistema" #: about_window_projectInfo msgid "Current project info" msgstr "Informação do projeto atual" #: about_window_reportInfo msgid "Current session results" msgstr "Resultados da sessão atual" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Este producto inclui software desenvolvido por:" #: msg_saving_project msgid "Saving project..." msgstr "Salvando projeto..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Documentos de texto (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" "Brazilian Portuguese version, by The JClic team contributors (http://sites.google.com/s" "ite/boatecp/jclic)" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Este programa é software livre (\"free software\"); você pode redistribuí-lo " "e/ou modificá-lo de acordo com os termos da Licença Pública Geral GNU como " "publicada pela Free Software Foundation; tanto segundo a versão 2 dessa " "licença quanto (por sua opção) por uma versão posterior.
 
Este " "programa é distribuído na expectativa de ser útil, mas SEM QUALQUER " "GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO " "A QUALQUER PROPÓSITO EM PARTICULAR. Consulte GNU General Public License para obter " "mais detalhes." i18n/fromLaunchpad/po/jclic-core/JClicMessages_ru.po000066400000000000000000000503061335566474600226210ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2009-11-15 20:19+0000\n" "Last-Translator: Serafim Nenarokov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "время" #: label_actions msgid "tries" msgstr "попытки" #: label_score msgid "score" msgstr "счёт" #: Skin msgid "Skin" msgstr "Оформление" #: action_next_caption msgid "Next" msgstr "Следующий" #: action_next_tooltip msgid "Next activity" msgstr "Следующее действие" #: action_prev_caption msgid "Previous" msgstr "Предыдущий" #: action_prev_tooltip msgid "Previous activity" msgstr "Предыдущее действие" #: action_reset_caption msgid "Restart" msgstr "Перезапустить" #: action_reset_tooltip msgid "Restart activity" msgstr "Перезапуск действия" #: action_info_caption msgid "Information" msgstr "Информация" #: about_window_lb_project msgid "Project" msgstr "Проект" #: about_window_lb_languages msgid "languages" msgstr "языки" #: about_window_lb_language msgid "language" msgstr "язык" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Вернуться" #: about_window_caption msgid "About" msgstr "О программе" #: action_about_tooltip msgid "User reports" msgstr "Отчёты пользователя" #: about_window_lb_report msgid "Report" msgstr "Отчет" #: about_window_browser_button msgid "View in browser" msgstr "Посмотреть в браузере" #: report_no_activities msgid "No activities reported!" msgstr "Нет сообщенных действий!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Отчёт не зарегистрирован в БД" #: report_lb_time msgid "Time" msgstr "Время" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Ошибка загрузки последовательности" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Ошибка инициализации QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "Открыть URL..." #: filesystem_openFile msgid "Open file..." msgstr "Открыть файл..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Пожалуйста, введите URL ресурса для загрузки." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Ошибка выполнения команды:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Переместить выделенный элемент вниз" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Переместить выделенный элемент вверх" #: editor_moveDown msgid "Move down" msgstr "Переместить вниз" #: editor_moveUp msgid "Move up" msgstr "Переместить вверх" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Файлы изображений (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "PNG изображения" #: filefilter_jpg msgid "JPG images" msgstr "JPG изображения" #: filefilter_gif msgid "GIF images" msgstr "GIF изображения" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "URL-файлы доступны только для чтения." #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Пакеты Clic 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Все файлы" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Проекты JClic и Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Проекты JClic (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Сжатые пакеты Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Открытые проекты Clic 3.0 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Сжатые пакеты JClic (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Проекты JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Мультимедиа система" #: about_window_lb_level msgid "Level" msgstr "Уровень" #: about_window_lb_area msgid "Area" msgstr "Область" #: report_num_actions msgid "Actions done:" msgstr "Завершено действий:" #: report_project msgid "Project:" msgstr "Проект:" #: report_lb_totals msgid "Total:" msgstr "Итого:" #: report_num_projects msgid "Projects:" msgstr "Проекты:" #: report_session msgid "Session:" msgstr "Сессия:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "В целях безопасности, выполнение внешних программ запрещено в апплетах JClic." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Ошибка начала действия!" #: msg_error_loading_project msgid "Error loading project" msgstr "Ошибка загрузки проекта" #: msg_error_playing_media msgid "Error playing media!" msgstr "Ошибка проигрывания медиа!" #: msg_activity_finished msgid "Activity finished!" msgstr "Действие завершено!" #: msg_playing_media msgid "Playing media" msgstr "Проигрывание медиа" #: msg_activity_running msgid "Activity running" msgstr "Действие выполняется" #: msg_activity_ready msgid "Activity ready" msgstr "Действие готово" #: msg_initializing msgid "Initializing..." msgstr "Инициализация..." #: msg_preparing_media msgid "Preparing media" msgstr "Подготовка медиа" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Ошибка загрузки действия" #: msg_loading_activity msgid "Loading activity" msgstr "Загрузка действия" #: msg_loading_project msgid "Loading project..." msgstr "Загрузка проекта..." #: msg_ready msgid "Ready" msgstr "Готово" #: err_reading_data msgid "Error loading file" msgstr "Ошибка загрузки файла" #: err_file_save msgid "Error saving file!" msgstr "Ошибка сохранения файла!" #: err_file_open msgid "Error opening file!" msgstr "Ошибка открытия файла!" #: report_started msgid "Session started:" msgstr "Сессия начата:" #: report_lb_score msgid "Score" msgstr "Счёт" #: report_lb_actions msgid "Actions" msgstr "Действия" #: report_lb_solved msgid "Ok" msgstr "Ok" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Активность" #: report_lb_sequence msgid "Sequence" msgstr "Последовательность" #: report_global_score msgid "Global score:" msgstr "Общий счёт:" #: report_total_time msgid "Total time on activities:" msgstr "Общее время активности:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Действия в порядке:" #: report_num_activities msgid "Activities done:" msgstr "Совершенные действия:" #: report_num_sequences msgid "Sequences:" msgstr "Последовательности:" #: report_system msgid "Report system:" msgstr "Система отчётов:" #: report_user msgid "User:" msgstr "Пользователь:" #: report_not_finished msgid "Activity not finished" msgstr "Действие не завершено" #: action_info_tooltip msgid "Additional information" msgstr "Дополнительная информация" #: action_help_caption msgid "Help" msgstr "Справка" #: action_help_tooltip msgid "Help about this activity" msgstr "Помощь по этому действию" #: action_audio_caption msgid "Sounds" msgstr "Звуки" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Включить/выключить звуки" #: about_window_lb_system msgid "System" msgstr "Система" #: about_window_lb_total_mem msgid "Total memory" msgstr "Всего памяти" #: about_window_lb_free_mem msgid "Free memory" msgstr "Свободная память" #: about_window_lb_java_home msgid "Java home" msgstr "Java home" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Виртуальная машина Java" #: about_window_lb_java_version msgid "Java version" msgstr "Версия Java" #: about_window_lb_os msgid "Operating system" msgstr "Операционная система" #: about_window_lb_version msgid "Version" msgstr "Версия" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Дескрипторы" #: about_window_lb_description msgid "Description" msgstr "Описание" #: about_window_lb_history msgid "History" msgstr "История" #: about_window_lb_organizations msgid "Organizations" msgstr "Организации" #: about_window_lb_organization msgid "Organization" msgstr "Организация" #: about_window_lb_authors msgid "Authors" msgstr "Авторы" #: about_window_lb_author msgid "Author" msgstr "Автор" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Активность" #: help_window_close_button msgid "Return to activity" msgstr "Возврат к действию" #: help_window_caption msgid "Help window" msgstr "Окно справки" #: action_about_caption msgid "Reports" msgstr "Отчёты" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Установочные файлы проектов JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Пользователи не определены в базе данных отчётов!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "Пользователи не определены для этой группы в базе данных отчётов!" #: report_new_user msgid "New user..." msgstr "Новый пользователь..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Создать нового пользователя в базе данных отчётов" #: report_err_creating_user msgid "Error creating new user!" msgstr "Ошибка создания нового пользователя!" #: report_select_user msgid "User identification for the reports database" msgstr "Идентификация пользователя для базы данных отчётов" #: report_userlist_title msgid "Please select your name:" msgstr "Пожалуйста, выберите ваше имя:" #: report_ident_user msgid "User identification" msgstr "Идентификация пользователя" #: report_name_prompt msgid "Name:" msgstr "Имя:" #: report_id_prompt msgid "Login:" msgstr "Логин:" #: report_pw_prompt msgid "Password:" msgstr "Пароль:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Подтверждение пароля:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Создание нового пользователя:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Неверные данные!" #: report_generic_group_name msgid "Generic" msgstr "Родовой" #: report_new_group msgid "Create a new group..." msgstr "Создать новую группу..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Ошибка создания новой группы!" #: report_grouplist_title msgid "Please select your group:" msgstr "Пожалуйста, выберите Вашу группу:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Создание новой группы пользователей" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "ID пользователя отсутствует или пароль неверный." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Этот аккаунт защищен паролем." #: report_err_init msgid "Error initializing report system." msgstr "Ошибка инициализации системы отчетов." #: report_not_connected msgid "not connected" msgstr "не соединено." #: report_err_creating msgid "Error creating reports agent" msgstr "Ошибка создания агента отчетов" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Возврат" #: action_return_tooltip msgid "Return to the last menu" msgstr "Вернуться в предыдущее меню" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Звуки (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI файлы (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Видеофайлы (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Файлы Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Скины (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Все медиафайлы" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Файл" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "вне текущей папки проекта." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Целесообразно иметь все файлы в одной папке." #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Вы хотите скопировать выбранный файл в папку проекта?" #: filesystem_copyFile msgid "Copying file" msgstr "Копирование файла" #: msg_loading msgid "Loading" msgstr "Загрузка" #: report_err_bad_id msgid "Bad identifier!" msgstr "Плохой идентификатор!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Этот идентификатор уже существует в базе!" #: report_err_bad_name msgid "Bad name!" msgstr "Плохое имя!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Пароли не совпадают!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Ошибка соединения с базой отчетов!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "ВЫХОД: в этой точке программа завершится." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "В этой точке программа прыгнет в проект:" #: ftype_image msgid "Image" msgstr "Изображение" #: ftype_audio msgid "Digital audio" msgstr "Цифровое аудио" #: ftype_midi msgid "MIDI file" msgstr "MIDI файл" #: ftype_xml msgid "XML file" msgstr "XML файл" #: ftype_anim msgid "Animation" msgstr "Анимация" #: ftype_video msgid "Digital video" msgstr "Цифровое видео" #: ftype_font msgid "TrueType font" msgstr "Шрифт TrueType" #: ftype_jclic msgid "JClic project" msgstr "Проект JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Скрипт-инсталлятор проекта JClic" #: ftype_unknown msgid "Unknown" msgstr "Неизвестный" #: ftype_animated msgid "animated" msgstr "анимированный" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Шрифты (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML документы (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "При поддержке:" #: about_window_systemInfo msgid "System information" msgstr "Информация о системе" #: about_window_projectInfo msgid "Current project info" msgstr "Информация о текущем проекте" #: about_window_reportInfo msgid "Current session results" msgstr "Результаты текущей сессии" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Этот продукт содержит ПО, разработанное:" #: msg_saving_project msgid "Saving project..." msgstr "Сохранение проекта..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Текстовые файлы (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Анлийская версия разработана командой JClic" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Данная программа является свободным программным обеспечением. Вы вправе " "распространять ее и/или модифицировать в соответствии с условиями " "Стандартной Общественной Лицензии GNU, опубликованной Free Software " "Foundation; либо с условиями версии 2 лицензии, либо (по вашему выбору) " "любыми более поздними версиями.
 
Мы распространяем данную " "программу в надежде на то, что она будет вам полезной, однако НЕ " "ПРЕДОСТАВЛЯЕМ НА НЕЕ НИКАКИХ ГАРАНТИЙ; даже без гарантии ТОВАРНОГО СОСТОЯНИЯ " "ПРИ ПРОДАЖЕ и ПРИГОДНОСТИ ДЛЯ ИСПОЛЬЗОВАНИЯ В КОНКРЕТНЫХ ЦЕЛЯХ. Смотрите GNU General Public " "License для получения более подробной информации." i18n/fromLaunchpad/po/jclic-core/JClicMessages_tr.po000066400000000000000000000420561335566474600226230ustar00rootroot00000000000000# Turkish translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2009-03-12 09:08+0000\n" "Last-Translator: Ahmet YAVUZ \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "zaman" #: label_actions msgid "tries" msgstr "Denemeler" #: label_score msgid "score" msgstr "sonuç" #: Skin msgid "Skin" msgstr "Görünüm" #: action_next_caption msgid "Next" msgstr "Sonraki" #: action_next_tooltip msgid "Next activity" msgstr "Bir sonraki etkinlik" #: action_prev_caption msgid "Previous" msgstr "Önceki" #: action_prev_tooltip msgid "Previous activity" msgstr "Bir önceki etkinlik" #: action_reset_caption msgid "Restart" msgstr "Yeniden Başla" #: action_reset_tooltip msgid "Restart activity" msgstr "Etkinliği tekrar başlat" #: action_info_caption msgid "Information" msgstr "Bilgi" #: about_window_lb_project msgid "Project" msgstr "Proje" #: about_window_lb_languages msgid "languages" msgstr "Diller" #: about_window_lb_language msgid "language" msgstr "dil" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Geri" #: about_window_caption msgid "About" msgstr "Hakkında" #: action_about_tooltip msgid "User reports" msgstr "Kullanıcı raporları" #: about_window_lb_report msgid "Report" msgstr "Rapor" #: about_window_browser_button msgid "View in browser" msgstr "Tarayıcıda gör" #: report_no_activities msgid "No activities reported!" msgstr "Etkinlik raporu yok!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Rapor herhangi bir veritabanında kaydedilmedi" #: report_lb_time msgid "Time" msgstr "Zaman" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Etkinlik dizisi yüklenirken hata oluştu" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "QuickTime başlatılamıyor!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "URL Aç..." #: filesystem_openFile msgid "Open file..." msgstr "Dosya aç..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Yüklenecek URL'yi giriniz." #: msg_error_executing_external msgid "Error executing the command:" msgstr "Komut çalıştırılamadı:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Seçilen öğeyi aşağıya kaydır" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Seçilen öğeyi yukarıya kaydır" #: editor_moveDown msgid "Move down" msgstr "Aşağı Kaydır" #: editor_moveUp msgid "Move up" msgstr "Yukarı kaydır" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Resim dosyaları *.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "PNG resim dosyası" #: filefilter_jpg msgid "JPG images" msgstr "JPG resim dosyası" #: filefilter_gif msgid "GIF images" msgstr "GIF resim dosyası" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "Salt okunur URL dosyaları" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Clic 3.0 paketi (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Tüm dosyalar" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "JClic ve Clic 3.0 projeleri (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "JClic projeleri(*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Clic 3.0 kompakt paket (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Clic 3.0 open packages (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "JClic sıkıştırılmış projeleri (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "JClic projeleri (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Çoklu ortam sistemi" #: about_window_lb_level msgid "Level" msgstr "Seviye" #: about_window_lb_area msgid "Area" msgstr "Alan" #: report_num_actions msgid "Actions done:" msgstr "Eylem gerçekleştiriliyor:" #: report_project msgid "Project:" msgstr "Proje:" #: report_lb_totals msgid "Total:" msgstr "Toplam:" #: report_num_projects msgid "Projects:" msgstr "Projeler:" #: report_session msgid "Session:" msgstr "Oturum:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "Güvenlik nedeniyle dış programlar JClic içerisinde çalıştırılmıyor." #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Etkinlik başlatılamıyor!" #: msg_error_loading_project msgid "Error loading project" msgstr "Proje yüklenemiyor" #: msg_error_playing_media msgid "Error playing media!" msgstr "Çoklu ortam oynatma hatası!" #: msg_activity_finished msgid "Activity finished!" msgstr "Etkinlik tamamlandı!" #: msg_playing_media msgid "Playing media" msgstr "Çoklu ortam oynatılıyor" #: msg_activity_running msgid "Activity running" msgstr "Etkinlik başlatıldı" #: msg_activity_ready msgid "Activity ready" msgstr "Etkinlik hazır" #: msg_initializing msgid "Initializing..." msgstr "Başlatılıyor..." #: msg_preparing_media msgid "Preparing media" msgstr "Çoklu ortam hazırlanıyor" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Etkinlik yükleme hatası" #: msg_loading_activity msgid "Loading activity" msgstr "Etkinlik yükleniyor" #: msg_loading_project msgid "Loading project..." msgstr "Proje yükleniyor..." #: msg_ready msgid "Ready" msgstr "Hazır" #: err_reading_data msgid "Error loading file" msgstr "Dosya yükleme hatası" #: err_file_save msgid "Error saving file!" msgstr "Dosya kaydetme hatası!" #: err_file_open msgid "Error opening file!" msgstr "Dosya açılamıyor!" #: report_started msgid "Session started:" msgstr "Oturum başlatıldı" #: report_lb_score msgid "Score" msgstr "Skor" #: report_lb_actions msgid "Actions" msgstr "Eylemler" #: report_lb_solved msgid "Ok" msgstr "Tamam" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Etkinlik" #: report_lb_sequence msgid "Sequence" msgstr "Etkinlik dizisi" #: report_global_score msgid "Global score:" msgstr "Genel sonuç:" #: report_total_time msgid "Total time on activities:" msgstr "Etkinlikde geçirilen toplam zaman:" #: report_num_activities_solved msgid "Activities ok:" msgstr "Etkinlikler tamam:" #: report_num_activities msgid "Activities done:" msgstr "Etkinlikler başlatılıyor:" #: report_num_sequences msgid "Sequences:" msgstr "Etkinlik dizisi" #: report_system msgid "Report system:" msgstr "Sistem raporu:" #: report_user msgid "User:" msgstr "Kullanıcı:" #: report_not_finished msgid "Activity not finished" msgstr "Etkinlik tamamlanmadı" #: action_info_tooltip msgid "Additional information" msgstr "Ek bilgi" #: action_help_caption msgid "Help" msgstr "Yardım" #: action_help_tooltip msgid "Help about this activity" msgstr "Bu etkinlik hakkında yardım" #: action_audio_caption msgid "Sounds" msgstr "Sesler" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Ses aç/kapa" #: about_window_lb_system msgid "System" msgstr "Sistem" #: about_window_lb_total_mem msgid "Total memory" msgstr "Toplam bellek" #: about_window_lb_free_mem msgid "Free memory" msgstr "Boş bellek" #: about_window_lb_java_home msgid "Java home" msgstr "Java anasayfa" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Java sanal makine" #: about_window_lb_java_version msgid "Java version" msgstr "Java sürüm" #: about_window_lb_os msgid "Operating system" msgstr "İşletim sistemi" #: about_window_lb_version msgid "Version" msgstr "Sürüm" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Açıklayıcılar" #: about_window_lb_description msgid "Description" msgstr "Açıklama" #: about_window_lb_history msgid "History" msgstr "Geçmiş" #: about_window_lb_organizations msgid "Organizations" msgstr "Kurumlar" #: about_window_lb_organization msgid "Organization" msgstr "Kurum" #: about_window_lb_authors msgid "Authors" msgstr "Yazarlar" #: about_window_lb_author msgid "Author" msgstr "Yazar" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Etkinlik" #: help_window_close_button msgid "Return to activity" msgstr "Etkinliğe geri dön" #: help_window_caption msgid "Help window" msgstr "Yardım penceresi" #: action_about_caption msgid "Reports" msgstr "Raporlar" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HT" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "JClic proje kurucusu (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "Rapor veritabanında kullanıcılar tanımlanmadı!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "Rapor veritabanında bu grup için kullanıcılar tanımlanmadı!" #: report_new_user msgid "New user..." msgstr "Yeni kullanıcı..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Rapor veritabanında yeni kullanıcı oluştur" #: report_err_creating_user msgid "Error creating new user!" msgstr "Yeni kullanıcı oluşturma hatası" #: report_select_user msgid "User identification for the reports database" msgstr "Veri tabanı raporları için kullanıcı tanımlanması" #: report_userlist_title msgid "Please select your name:" msgstr "Lütfen isminizi seçiniz:" #: report_ident_user msgid "User identification" msgstr "Kullanıcı kimliği" #: report_name_prompt msgid "Name:" msgstr "İsim:" #: report_id_prompt msgid "Login:" msgstr "Giriş:" #: report_pw_prompt msgid "Password:" msgstr "Şifre" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Şifreyi onaylayınız:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Yeni kullanıcı oluşturma" #: report_err_bad_data msgid "Incorrect data!" msgstr "Hatalı veri!" #: report_generic_group_name msgid "Generic" msgstr "Genel" #: report_new_group msgid "Create a new group..." msgstr "Yeni grup oluştur..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "yeni grup oluştururken hata meydana geldi!" #: report_grouplist_title msgid "Please select your group:" msgstr "Lütfen grubunuzu seçiniz:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Yeni kullanıcılar grubu oluştur" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Böyle bir kullanıcı yok veya hatalı şifre." #: report_user_has_pwd msgid "This account is password-protected." msgstr "Bu hesap şifreyle korunmaktadır." #: report_err_init msgid "Error initializing report system." msgstr "Rapor sistemi başlatılırken hata oluştu." #: report_not_connected msgid "not connected" msgstr "bağlı değil" #: report_err_creating msgid "Error creating reports agent" msgstr "Rapor oluşturulurken hata oluştu" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Geri" #: action_return_tooltip msgid "Return to the last menu" msgstr "Son menüye geri dön" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sesler (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI dosyaları (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Video dosyaları (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 dosyaları (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Dış görünümler (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Tüm ortam dosyaları" #: filesystem_copyToRoot_1 msgid "The file" msgstr "Dosya" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "Geçerli proje klasörünün dışında" #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Tüm dosyaların aynı klasörde olması önerilir" #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Seçili dosyaları proje klasörüne kopyalamak istiyormusunuz?" #: filesystem_copyFile msgid "Copying file" msgstr "Dosya kopyalanıyor" #: msg_loading msgid "Loading" msgstr "Yükleniyor" #: report_err_bad_id msgid "Bad identifier!" msgstr "Hatalı kullanıcı!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Veri tabanında mevcut!" #: report_err_bad_name msgid "Bad name!" msgstr "İsim hatalı!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Şifre kullanıcı adına karşılık gelmiyor!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Rapor veritabanına bağlanma hatası!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "ÇIK: Bu noktada program kapatılacaktır." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "Bu noktada program projeye geçiş yapacaktır:" #: ftype_image msgid "Image" msgstr "Resim" #: ftype_audio msgid "Digital audio" msgstr "Dijital ses" #: ftype_midi msgid "MIDI file" msgstr "Midi dosyası" #: ftype_xml msgid "XML file" msgstr "XML dosyası" #: ftype_anim msgid "Animation" msgstr "Canlandırma" #: ftype_video msgid "Digital video" msgstr "Dijital video" #: ftype_font msgid "TrueType font" msgstr "TrueType yazıtipi" #: ftype_jclic msgid "JClic project" msgstr "JClic projesi" #: ftype_inst msgid "JClic project installer script" msgstr "JClic proje kurulum skripti" #: ftype_unknown msgid "Unknown" msgstr "Bilinmeyen" #: ftype_animated msgid "animated" msgstr "canlandırıldı" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Yazıtipleri (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML belgeleri (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "hakkında/katkıda bulunanlar.html" #: about_licenseDoc msgid "about/license.html" msgstr "hakkında/lisans.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Katkıda bulunanlar:" #: about_window_systemInfo msgid "System information" msgstr "Sistem bilgisi" #: about_window_projectInfo msgid "Current project info" msgstr "Geçerli proje bilgisi" #: about_window_reportInfo msgid "Current session results" msgstr "Geçerli oturum sonuçları" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "" "Bu ürün aşağıdaki kişiler veya kurumlar tarafından geliştirilen yazılımları " "içermektedir:" #: msg_saving_project msgid "Saving project..." msgstr "Proje kaydediliyor..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Metin dosyaları *.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Turkish version by Ahmet YAVUZ" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public " "License for more details." i18n/fromLaunchpad/po/jclic-core/JClicMessages_vec.po000066400000000000000000000425261335566474600227550ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2010-06-01 17:01+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "tenpo" #: label_actions msgid "tries" msgstr "tentadivi" #: label_score msgid "score" msgstr "pontexio" #: Skin msgid "Skin" msgstr "Skin" #: action_next_caption msgid "Next" msgstr "Invanti" #: action_next_tooltip msgid "Next activity" msgstr "Pròsima atività" #: action_prev_caption msgid "Previous" msgstr "Indrìo" #: action_prev_tooltip msgid "Previous activity" msgstr "Atività presedente" #: action_reset_caption msgid "Restart" msgstr "Invìa da novo" #: action_reset_tooltip msgid "Restart activity" msgstr "Invìa atività da novo" #: action_info_caption msgid "Information" msgstr "Informasion" #: about_window_lb_project msgid "Project" msgstr "Projèto" #: about_window_lb_languages msgid "languages" msgstr "lengue" #: about_window_lb_language msgid "language" msgstr "lengua" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "Torna a programa" #: about_window_caption msgid "About" msgstr "Altre informasion" #: action_about_tooltip msgid "User reports" msgstr "Reports utenti" #: about_window_lb_report msgid "Report" msgstr "Report" #: about_window_browser_button msgid "View in browser" msgstr "Vedi inte 'l navegador" #: report_no_activities msgid "No activities reported!" msgstr "No xé stà reportà atività!" #: report_system_standard msgid "Report not registered in any DB" msgstr "Report no registrà inte nisun database" #: report_lb_time msgid "Time" msgstr "Tenpo" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "Ghe xé stà un eror a cargando ƚa secuensa" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "Ghe xé stà un eror a inviando QuickTime!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "Vèrxi URL..." #: filesystem_openFile msgid "Open file..." msgstr "Vèrxi file..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "Inserisi el indriso URL de ƚa resorsa da cargar" #: msg_error_executing_external msgid "Error executing the command:" msgstr "Ghe xé stà un eror a exeguindo el comando" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "Spòsta 'l elemento seƚesionà in xoxo" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "Spòsta 'l elemento seƚesionà in suxo" #: editor_moveDown msgid "Move down" msgstr "Spòsta in xoxo" #: editor_moveUp msgid "Move up" msgstr "Spòsta in suxo" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "Files de imàxene (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "Imàjine PNG" #: filefilter_jpg msgid "JPG images" msgstr "Imaàjine JPG" #: filefilter_gif msgid "GIF images" msgstr "Imàxine GIF" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "I file baxài so URL i xé a letura nemeché" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Pacheti de Cloc 3.0 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "Tuti i files" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "Proxèti JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "Proxèti JClic(*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Pacheti conpatài Clic 3.0 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Pacheti open de JClic (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "Projèti zipài de JClic (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "Proxèti JClic (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "Sistèma multimedial" #: about_window_lb_level msgid "Level" msgstr "Livèƚo" #: about_window_lb_area msgid "Area" msgstr "Area" #: report_num_actions msgid "Actions done:" msgstr "Asion exeguìe" #: report_project msgid "Project:" msgstr "Proxèto:" #: report_lb_totals msgid "Total:" msgstr "Total:" #: report_num_projects msgid "Projects:" msgstr "Proxèti:" #: report_session msgid "Session:" msgstr "Sesion:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" "Par motivi de seguresa, inte ƚe applet JClic xé dexativà ƚa execusion de " "programi estèrni" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "Ghe xé stà un eror a inviando ƚa atività!" #: msg_error_loading_project msgid "Error loading project" msgstr "Ghe xé stà un eror a cargando un proxèto" #: msg_error_playing_media msgid "Error playing media!" msgstr "Ghe xé stà un eror a exegiondo el media!" #: msg_activity_finished msgid "Activity finished!" msgstr "Atività terminada!" #: msg_playing_media msgid "Playing media" msgstr "Drio exeguir el media" #: msg_activity_running msgid "Activity running" msgstr "Atività in corso" #: msg_activity_ready msgid "Activity ready" msgstr "Atività pronta" #: msg_initializing msgid "Initializing..." msgstr "Invìo..." #: msg_preparing_media msgid "Preparing media" msgstr "Drio parecial el media" #: msg_error_loading_activity msgid "Error loading activity" msgstr "Ghe xé stà un eror a cargando ƚa atività" #: msg_loading_activity msgid "Loading activity" msgstr "Drio cargar ƚa atività" #: msg_loading_project msgid "Loading project..." msgstr "Drio cargar el pojèto" #: msg_ready msgid "Ready" msgstr "Pronto" #: err_reading_data msgid "Error loading file" msgstr "Ghe xé stà un eror a cargando el file" #: err_file_save msgid "Error saving file!" msgstr "Ghe xé stà un eror a salvando el file" #: err_file_open msgid "Error opening file!" msgstr "Ghe xé stà un aror a verxindo el file" #: report_started msgid "Session started:" msgstr "Sesion inviada:" #: report_lb_score msgid "Score" msgstr "Pontexio" #: report_lb_actions msgid "Actions" msgstr "Asion" #: report_lb_solved msgid "Ok" msgstr "OK" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "Atività" #: report_lb_sequence msgid "Sequence" msgstr "Secuensa" #: report_global_score msgid "Global score:" msgstr "Pontexio global" #: report_total_time msgid "Total time on activities:" msgstr "Tenpo total so ƚe atività" #: report_num_activities_solved msgid "Activities ok:" msgstr "Atività ok:" #: report_num_activities msgid "Activities done:" msgstr "Atività fate:" #: report_num_sequences msgid "Sequences:" msgstr "Secuense:" #: report_system msgid "Report system:" msgstr "Sistèma de report" #: report_user msgid "User:" msgstr "Utente:" #: report_not_finished msgid "Activity not finished" msgstr "Atività gnancora terminada" #: action_info_tooltip msgid "Additional information" msgstr "Informasion de xonta" #: action_help_caption msgid "Help" msgstr "Àida" #: action_help_tooltip msgid "Help about this activity" msgstr "Àida so sta atività" #: action_audio_caption msgid "Sounds" msgstr "Sonòri" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "Ativa/dexativa sonòri" #: about_window_lb_system msgid "System" msgstr "Sistèma" #: about_window_lb_total_mem msgid "Total memory" msgstr "Memòria total" #: about_window_lb_free_mem msgid "Free memory" msgstr "Memòria ƚìbara" #: about_window_lb_java_home msgid "Java home" msgstr "Home de Java" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Visrtual machine Java" #: about_window_lb_java_version msgid "Java version" msgstr "Version de Java" #: about_window_lb_os msgid "Operating system" msgstr "Sistèma operadivo" #: about_window_lb_version msgid "Version" msgstr "Version" #: about_window_lb_descriptors msgid "Descriptors" msgstr "Descritori" #: about_window_lb_description msgid "Description" msgstr "Descrision" #: about_window_lb_history msgid "History" msgstr "Cronoƚoxìa" #: about_window_lb_organizations msgid "Organizations" msgstr "Organexasion" #: about_window_lb_organization msgid "Organization" msgstr "Organexasion" #: about_window_lb_authors msgid "Authors" msgstr "Autori" #: about_window_lb_author msgid "Author" msgstr "Autor" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "Atività" #: help_window_close_button msgid "Return to activity" msgstr "Indrìo a atività" #: help_window_caption msgid "Help window" msgstr "Fenèstra de àida" #: action_about_caption msgid "Reports" msgstr "Reports" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R**" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "Istaƚadori de proxèti JClic (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "No xé stà definìo nisun utente inte 'l database de i reports!" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" "No xé stà definìo nisun utente par sto grupo inte 'l database de i reports!" #: report_new_user msgid "New user..." msgstr "Utente niovo..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "Definisi utente niovo inte 'l database de i reports" #: report_err_creating_user msgid "Error creating new user!" msgstr "Ghe xé stà un eror a definindo 'l utente niovo" #: report_select_user msgid "User identification for the reports database" msgstr "Identifegasion de 'l utente par el database de i reports" #: report_userlist_title msgid "Please select your name:" msgstr "Desernisi el to nòme" #: report_ident_user msgid "User identification" msgstr "Identifegasion utente" #: report_name_prompt msgid "Name:" msgstr "Nòme:" #: report_id_prompt msgid "Login:" msgstr "Login:" #: report_pw_prompt msgid "Password:" msgstr "Password:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "Conferma password:" #: report_new_user_data msgid "Creation of a new user:" msgstr "Definision utente niovo:" #: report_err_bad_data msgid "Incorrect data!" msgstr "Dati sbaliài!" #: report_generic_group_name msgid "Generic" msgstr "Xènèrico" #: report_new_group msgid "Create a new group..." msgstr "Invìa un grupo niovo..." #: report_err_creating_group msgid "Error creating the new group!" msgstr "Ghe xé stà un eror a inviando el grupo niovo!" #: report_grouplist_title msgid "Please select your group:" msgstr "Desernisi el to grupo:" #: report_new_group_data msgid "Creation of a new users group:" msgstr "Definision de un novo grupo de utenti:" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "Manca ID utente o ƚa password ƚa xé sbaliada" #: report_user_has_pwd msgid "This account is password-protected." msgstr "Sto account el xé protexesto da password" #: report_err_init msgid "Error initializing report system." msgstr "Ghe xé stà un eror a inviando el sistèma de report." #: report_not_connected msgid "not connected" msgstr "no conetà" #: report_err_creating msgid "Error creating reports agent" msgstr "Ghe xé stà un eror definindo 'l agente de reports" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "Torna a programa" #: action_return_tooltip msgid "Return to the last menu" msgstr "Indrìo a ùltimo menu" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "Sonòri (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "Files MIDI (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "Files video (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Files Flash 2.0 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "Skins (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "Tutii files media" #: filesystem_copyToRoot_1 msgid "The file" msgstr "El file" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "el xé fora de ƚa cartèƚa de 'l projèto in corso." #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "Xè ben aver tuti i files inte ƚa stesa cartèƚa" #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "Vusto copiar el file desernìo inte ƚa cartèƚa de 'l projèto?" #: filesystem_copyFile msgid "Copying file" msgstr "Còpia de 'l file" #: msg_loading msgid "Loading" msgstr "Cargamento" #: report_err_bad_id msgid "Bad identifier!" msgstr "Identifegador no corèto!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "Ghe xé xà sto identifegador inte 'l database!" #: report_err_bad_name msgid "Bad name!" msgstr "Nòme no corèto!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "Ƚe passwords no ƚe conbina!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "Ghe xéstà un eror de conesion a 'l database de i reports!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "INSIDA: a sto ponto fenise el programa." #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "A sto ponto el programa el saltarà a 'l projèto:" #: ftype_image msgid "Image" msgstr "Imàxene" #: ftype_audio msgid "Digital audio" msgstr "Audio digital" #: ftype_midi msgid "MIDI file" msgstr "File MIDI" #: ftype_xml msgid "XML file" msgstr "File XML" #: ftype_anim msgid "Animation" msgstr "Anemasion" #: ftype_video msgid "Digital video" msgstr "Video digital" #: ftype_font msgid "TrueType font" msgstr "Font True Type" #: ftype_jclic msgid "JClic project" msgstr "Projèto de JClic" #: ftype_inst msgid "JClic project installer script" msgstr "Script de istaƚador de projèto JClic" #: ftype_unknown msgid "Unknown" msgstr "Desconosesto" #: ftype_animated msgid "animated" msgstr "anemà" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "Fonts (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "Documenti HTML (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "Co' el supòrto de:" #: about_window_systemInfo msgid "System information" msgstr "Informasion so 'l sistèma" #: about_window_projectInfo msgid "Current project info" msgstr "Informasion projèto corente" #: about_window_reportInfo msgid "Current session results" msgstr "Rexultadi sesion corente" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "Sto prodoto el gà indrento software sviƚupà da:" #: msg_saving_project msgid "Saving project..." msgstr "Drio salvar projèto..." #: filefilter_text msgid "Text files (*.txt)" msgstr "Files de tèsto (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "Version vèneta (tfo) de Fabio Lazarin" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "Sto programa el xé un software lìbaro; te pol redistribuirlo e/o modifegarlo " "soto i tèrmini de ƚa licensa GNU General Public License come publicà da ƚa " "Free Software Foundation; version 2 de ƚa Licensa o (a to discresion) ògni " "version sucesiva.
 
Sto programa el xé destribuìo inte ƚa " "speransa che el pòse deventar ùtiƚe, ma SENSA NISUNA GARANSÌA; anca sensa ƚa " "garansìa sotointexa de prodoto de utilità e destinasion a un scòpo " "particoƚar. Vedi el documento GNU General Public License par altri " "detali." i18n/fromLaunchpad/po/jclic-core/JClicMessages_wo.po000066400000000000000000000313621335566474600226210ustar00rootroot00000000000000# Wolof translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2008-06-05 17:45+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Wolof \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "" #: label_actions msgid "tries" msgstr "" #: label_score msgid "score" msgstr "" #: Skin msgid "Skin" msgstr "" #: action_next_caption msgid "Next" msgstr "" #: action_next_tooltip msgid "Next activity" msgstr "" #: action_prev_caption msgid "Previous" msgstr "" #: action_prev_tooltip msgid "Previous activity" msgstr "" #: action_reset_caption msgid "Restart" msgstr "" #: action_reset_tooltip msgid "Restart activity" msgstr "" #: action_info_caption msgid "Information" msgstr "" #: about_window_lb_project msgid "Project" msgstr "" #: about_window_lb_languages msgid "languages" msgstr "" #: about_window_lb_language msgid "language" msgstr "" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "" #: about_window_caption msgid "About" msgstr "" #: action_about_tooltip msgid "User reports" msgstr "" #: about_window_lb_report msgid "Report" msgstr "" #: about_window_browser_button msgid "View in browser" msgstr "" #: report_no_activities msgid "No activities reported!" msgstr "" #: report_system_standard msgid "Report not registered in any DB" msgstr "" #: report_lb_time msgid "Time" msgstr "" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "" #: media_check_url msgid "messages/checkmedia.html" msgstr "" #: filesystem_openURL msgid "Open URL..." msgstr "" #: filesystem_openFile msgid "Open file..." msgstr "" #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "" #: msg_error_executing_external msgid "Error executing the command:" msgstr "" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "" #: editor_moveDown msgid "Move down" msgstr "" #: editor_moveUp msgid "Move up" msgstr "" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "" #: filefilter_png msgid "PNG images" msgstr "" #: filefilter_jpg msgid "JPG images" msgstr "" #: filefilter_gif msgid "GIF images" msgstr "" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "" #: filefilter_all msgid "All files" msgstr "" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "" #: about_window_lb_level msgid "Level" msgstr "" #: about_window_lb_area msgid "Area" msgstr "" #: report_num_actions msgid "Actions done:" msgstr "" #: report_project msgid "Project:" msgstr "" #: report_lb_totals msgid "Total:" msgstr "" #: report_num_projects msgid "Projects:" msgstr "" #: report_session msgid "Session:" msgstr "" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "" #: msg_error_loading_project msgid "Error loading project" msgstr "" #: msg_error_playing_media msgid "Error playing media!" msgstr "" #: msg_activity_finished msgid "Activity finished!" msgstr "" #: msg_playing_media msgid "Playing media" msgstr "" #: msg_activity_running msgid "Activity running" msgstr "" #: msg_activity_ready msgid "Activity ready" msgstr "" #: msg_initializing msgid "Initializing..." msgstr "" #: msg_preparing_media msgid "Preparing media" msgstr "" #: msg_error_loading_activity msgid "Error loading activity" msgstr "" #: msg_loading_activity msgid "Loading activity" msgstr "" #: msg_loading_project msgid "Loading project..." msgstr "" #: msg_ready msgid "Ready" msgstr "" #: err_reading_data msgid "Error loading file" msgstr "" #: err_file_save msgid "Error saving file!" msgstr "" #: err_file_open msgid "Error opening file!" msgstr "" #: report_started msgid "Session started:" msgstr "" #: report_lb_score msgid "Score" msgstr "" #: report_lb_actions msgid "Actions" msgstr "" #: report_lb_solved msgid "Ok" msgstr "" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "" #: report_lb_sequence msgid "Sequence" msgstr "" #: report_global_score msgid "Global score:" msgstr "" #: report_total_time msgid "Total time on activities:" msgstr "" #: report_num_activities_solved msgid "Activities ok:" msgstr "" #: report_num_activities msgid "Activities done:" msgstr "" #: report_num_sequences msgid "Sequences:" msgstr "" #: report_system msgid "Report system:" msgstr "" #: report_user msgid "User:" msgstr "" #: report_not_finished msgid "Activity not finished" msgstr "" #: action_info_tooltip msgid "Additional information" msgstr "" #: action_help_caption msgid "Help" msgstr "" #: action_help_tooltip msgid "Help about this activity" msgstr "" #: action_audio_caption msgid "Sounds" msgstr "" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "" #: about_window_lb_system msgid "System" msgstr "" #: about_window_lb_total_mem msgid "Total memory" msgstr "" #: about_window_lb_free_mem msgid "Free memory" msgstr "" #: about_window_lb_java_home msgid "Java home" msgstr "" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "" #: about_window_lb_java_version msgid "Java version" msgstr "" #: about_window_lb_os msgid "Operating system" msgstr "" #: about_window_lb_version msgid "Version" msgstr "" #: about_window_lb_descriptors msgid "Descriptors" msgstr "" #: about_window_lb_description msgid "Description" msgstr "" #: about_window_lb_history msgid "History" msgstr "" #: about_window_lb_organizations msgid "Organizations" msgstr "" #: about_window_lb_organization msgid "Organization" msgstr "" #: about_window_lb_authors msgid "Authors" msgstr "" #: about_window_lb_author msgid "Author" msgstr "" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "" #: help_window_close_button msgid "Return to activity" msgstr "" #: help_window_caption msgid "Help window" msgstr "" #: action_about_caption msgid "Reports" msgstr "" #: action_about_keys msgid "RR" msgstr "" #: action_audio_keys msgid "SS" msgstr "" #: action_help_keys msgid "HH" msgstr "" #: action_info_keys msgid "II" msgstr "" #: action_next_keys msgid "N*" msgstr "" #: action_prev_keys msgid "P*" msgstr "" #: action_reset_keys msgid "R*" msgstr "" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "" #: report_new_user msgid "New user..." msgstr "" #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "" #: report_err_creating_user msgid "Error creating new user!" msgstr "" #: report_select_user msgid "User identification for the reports database" msgstr "" #: report_userlist_title msgid "Please select your name:" msgstr "" #: report_ident_user msgid "User identification" msgstr "" #: report_name_prompt msgid "Name:" msgstr "" #: report_id_prompt msgid "Login:" msgstr "" #: report_pw_prompt msgid "Password:" msgstr "" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "" #: report_new_user_data msgid "Creation of a new user:" msgstr "" #: report_err_bad_data msgid "Incorrect data!" msgstr "" #: report_generic_group_name msgid "Generic" msgstr "" #: report_new_group msgid "Create a new group..." msgstr "" #: report_err_creating_group msgid "Error creating the new group!" msgstr "" #: report_grouplist_title msgid "Please select your group:" msgstr "" #: report_new_group_data msgid "Creation of a new users group:" msgstr "" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "" #: report_user_has_pwd msgid "This account is password-protected." msgstr "" #: report_err_init msgid "Error initializing report system." msgstr "" #: report_not_connected msgid "not connected" msgstr "" #: report_err_creating msgid "Error creating reports agent" msgstr "" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "" #: action_return_tooltip msgid "Return to the last menu" msgstr "" #: action_return_keys msgid "T*" msgstr "" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "" #: filefilter_skins msgid "Skins (*.xml)" msgstr "" #: filefilter_all_media msgid "All media files" msgstr "" #: filesystem_copyToRoot_1 msgid "The file" msgstr "" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "" #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "" #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "" #: filesystem_copyFile msgid "Copying file" msgstr "" #: msg_loading msgid "Loading" msgstr "" #: report_err_bad_id msgid "Bad identifier!" msgstr "" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "" #: report_err_bad_name msgid "Bad name!" msgstr "" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "" #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "" #: ftype_image msgid "Image" msgstr "" #: ftype_audio msgid "Digital audio" msgstr "" #: ftype_midi msgid "MIDI file" msgstr "" #: ftype_xml msgid "XML file" msgstr "" #: ftype_anim msgid "Animation" msgstr "" #: ftype_video msgid "Digital video" msgstr "" #: ftype_font msgid "TrueType font" msgstr "" #: ftype_jclic msgid "JClic project" msgstr "" #: ftype_inst msgid "JClic project installer script" msgstr "" #: ftype_unknown msgid "Unknown" msgstr "" #: ftype_animated msgid "animated" msgstr "" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "" #: editor_moveUp_keys msgid "U#38" msgstr "" #: editor_moveDown_keys msgid "W#40" msgstr "" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "" #: about_creditsDoc msgid "about/credits.html" msgstr "" #: about_licenseDoc msgid "about/license.html" msgstr "" #: about_sponsorsCaption msgid "With the support of:" msgstr "" #: about_window_systemInfo msgid "System information" msgstr "" #: about_window_projectInfo msgid "Current project info" msgstr "" #: about_window_reportInfo msgid "Current session results" msgstr "" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "" #: msg_saving_project msgid "Saving project..." msgstr "" #: filefilter_text msgid "Text files (*.txt)" msgstr "" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" i18n/fromLaunchpad/po/jclic-core/JClicMessages_zh_TW.po000066400000000000000000000403731335566474600232310ustar00rootroot00000000000000# Traditional Chinese translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-03-27 00:34+0200\n" "PO-Revision-Date: 2012-04-05 04:02+0000\n" "Last-Translator: Cho Chin-Ping \n" "Language-Team: Traditional Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #JClic main messages #: label_time msgid "time" msgstr "時間" #: label_actions msgid "tries" msgstr "嘗試次數" #: label_score msgid "score" msgstr "分數" #: Skin msgid "Skin" msgstr "外觀" #: action_next_caption msgid "Next" msgstr "下一首" #: action_next_tooltip msgid "Next activity" msgstr "下一個活動" #: action_prev_caption msgid "Previous" msgstr "上一頁" #: action_prev_tooltip msgid "Previous activity" msgstr "上一個活動" #: action_reset_caption msgid "Restart" msgstr "重新開始" #: action_reset_tooltip msgid "Restart activity" msgstr "重設活動" #: action_info_caption msgid "Information" msgstr "相關資訊" #: about_window_lb_project msgid "Project" msgstr "專案" #: about_window_lb_languages msgid "languages" msgstr "語言" #: about_window_lb_language msgid "language" msgstr "語言" #: about_window_close_button msgctxt "about_window_close_button" msgid "Return" msgstr "返回" #: about_window_caption msgid "About" msgstr "關於" #: action_about_tooltip msgid "User reports" msgstr "使用者報告" #: about_window_lb_report msgid "Report" msgstr "報告" #: about_window_browser_button msgid "View in browser" msgstr "在瀏覽器檢視" #: report_no_activities msgid "No activities reported!" msgstr "沒有活動報告" #: report_system_standard msgid "Report not registered in any DB" msgstr "回報在DB中無註冊" #: report_lb_time msgid "Time" msgstr "時間" #: msg_error_loading_sequence msgid "Error loading sequence" msgstr "載入順序錯誤" #: media_qt_error_initializing msgid "Error initializing QuickTime!" msgstr "QuickTime 初始化錯誤!" #: media_check_url msgid "messages/checkmedia.html" msgstr "messages/checkmedia.html" #: filesystem_openURL msgid "Open URL..." msgstr "開啟 URL..." #: filesystem_openFile msgid "Open file..." msgstr "開啟檔案..." #: filesystem_enterURL msgid "Please enter the URL to the resource to be loaded." msgstr "請進入URL來載入資源" #: msg_error_executing_external msgid "Error executing the command:" msgstr "執行指令錯誤:" #: editor_moveDown_tooltip msgid "Move the selected element down" msgstr "向下移動選取的元件" #: editor_moveUp_tooltip msgid "Move the selected element up" msgstr "向上移動選取的元件" #: editor_moveDown msgid "Move down" msgstr "下移" #: editor_moveUp msgid "Move up" msgstr "上移" #: filefilter_all_images msgid "Image files (*.gif, *.jpg, *.png, *.bmp, *.ico)" msgstr "影像檔 (*.gif, *.jpg, *.png, *.bmp, *.ico)" #: filefilter_png msgid "PNG images" msgstr "PNG 檔" #: filefilter_jpg msgid "JPG images" msgstr "JPG 檔" #: filefilter_gif msgid "GIF images" msgstr "GIF 檔" #: filesystem_saveURLerror msgid "URL-based files are read-only." msgstr "URL-based檔僅可唯讀" #: filefilter_all_clic msgid "Clic 3.0 packages (*.pac, *.pcc)" msgstr "Clic 3.0 套件 (*.pac, *.pcc)" #: filefilter_all msgid "All files" msgstr "所有檔案" #: filefilter_all_jclic_clic msgid "JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc)" msgstr "JClic 與 Clic 3.0 專案 (*.jclic, *.jclic.zip, *.pac, *.pcc)" #: filefilter_all_jclic msgid "JClic projects (*.jclic, *.jclic.zip)" msgstr "JClic 專案 (*.jclic, *.jclic.zip)" #: filefilter_pcc msgid "Clic 3.0 compact packages (*.pcc)" msgstr "Clic 3.0 組裝包 (*.pcc)" #: filefilter_pac msgid "Clic 3.0 open packages (*.pac)" msgstr "Clic 3.0 開放包 (*.pac)" #: filefilter_jclic_zip msgid "JClic compressed projects (*.jclic.zip)" msgstr "JClic 壓縮專案 (*.jclic.zip)" #: filefilter_jclic msgid "JClic projects (*.jclic)" msgstr "JClic 專案 (*.jclic)" #: about_window_lb_mediaSystem msgid "Multimedia system" msgstr "多媒體系統" #: about_window_lb_level msgid "Level" msgstr "等級" #: about_window_lb_area msgid "Area" msgstr "區域" #: report_num_actions msgid "Actions done:" msgstr "活動完成:" #: report_project msgid "Project:" msgstr "專案:" #: report_lb_totals msgid "Total:" msgstr "總計:" #: report_num_projects msgid "Projects:" msgstr "專案:" #: report_session msgid "Session:" msgstr "作業階段:" #: msg_warn_no_exec_in_applets msgid "" "For security reasons, execution of external programs is disabled in JClic " "applets." msgstr "基於安全考量,執行在JClic applet的外部程序被禁用。" #: msg_error_starting_activity msgid "Error starting activity!" msgstr "活動開始錯誤" #: msg_error_loading_project msgid "Error loading project" msgstr "載入專案錯誤" #: msg_error_playing_media msgid "Error playing media!" msgstr "播放媒體錯誤" #: msg_activity_finished msgid "Activity finished!" msgstr "活動完成!" #: msg_playing_media msgid "Playing media" msgstr "播放媒體" #: msg_activity_running msgid "Activity running" msgstr "活動進行中" #: msg_activity_ready msgid "Activity ready" msgstr "活動準備" #: msg_initializing msgid "Initializing..." msgstr "正在初始化..." #: msg_preparing_media msgid "Preparing media" msgstr "媒體準備中" #: msg_error_loading_activity msgid "Error loading activity" msgstr "活動載入錯誤" #: msg_loading_activity msgid "Loading activity" msgstr "活動載入中" #: msg_loading_project msgid "Loading project..." msgstr "專案載入中..." #: msg_ready msgid "Ready" msgstr "準備就緒" #: err_reading_data msgid "Error loading file" msgstr "檔案載入錯誤" #: err_file_save msgid "Error saving file!" msgstr "檔案儲存錯誤!" #: err_file_open msgid "Error opening file!" msgstr "開始檔案錯誤!" #: report_started msgid "Session started:" msgstr "工作開始:" #: report_lb_score msgid "Score" msgstr "分數" #: report_lb_actions msgid "Actions" msgstr "動作" #: report_lb_solved msgid "Ok" msgstr "確定" #: report_lb_activity msgctxt "report_lb_activity" msgid "Activity" msgstr "活動" #: report_lb_sequence msgid "Sequence" msgstr "順序" #: report_global_score msgid "Global score:" msgstr "總成績" #: report_total_time msgid "Total time on activities:" msgstr "活動總時間" #: report_num_activities_solved msgid "Activities ok:" msgstr "活動完成" #: report_num_activities msgid "Activities done:" msgstr "活動結束" #: report_num_sequences msgid "Sequences:" msgstr "順序:" #: report_system msgid "Report system:" msgstr "報告系統" #: report_user msgid "User:" msgstr "使用者:" #: report_not_finished msgid "Activity not finished" msgstr "活動沒有完成" #: action_info_tooltip msgid "Additional information" msgstr "額外資訊" #: action_help_caption msgid "Help" msgstr "說明" #: action_help_tooltip msgid "Help about this activity" msgstr "活動幫助" #: action_audio_caption msgid "Sounds" msgstr "音效" #: action_audio_tooltip msgid "Enable/disable sounds" msgstr "啟用/停用 音效" #: about_window_lb_system msgid "System" msgstr "系統" #: about_window_lb_total_mem msgid "Total memory" msgstr "全部記憶體" #: about_window_lb_free_mem msgid "Free memory" msgstr "未用記憶體" #: about_window_lb_java_home msgid "Java home" msgstr "Java 首頁" #: about_window_lb_java_vm msgid "Java virtual machine" msgstr "Java 虛擬機器" #: about_window_lb_java_version msgid "Java version" msgstr "Java版本" #: about_window_lb_os msgid "Operating system" msgstr "作業系統" #: about_window_lb_version msgid "Version" msgstr "版本" #: about_window_lb_descriptors msgid "Descriptors" msgstr "描述" #: about_window_lb_description msgid "Description" msgstr "描述" #: about_window_lb_history msgid "History" msgstr "歷史紀錄" #: about_window_lb_organizations msgid "Organizations" msgstr "組織" #: about_window_lb_organization msgid "Organization" msgstr "組織" #: about_window_lb_authors msgid "Authors" msgstr "作者" #: about_window_lb_author msgid "Author" msgstr "開發者" #: about_window_lb_activity msgctxt "about_window_lb_activity" msgid "Activity" msgstr "活動" #: help_window_close_button msgid "Return to activity" msgstr "返回活動" #: help_window_caption msgid "Help window" msgstr "說明視窗" #: action_about_caption msgid "Reports" msgstr "報告" #: action_about_keys msgid "RR" msgstr "RR" #: action_audio_keys msgid "SS" msgstr "SS" #: action_help_keys msgid "HH" msgstr "HH" #: action_info_keys msgid "II" msgstr "II" #: action_next_keys msgid "N*" msgstr "N*" #: action_prev_keys msgid "P*" msgstr "P*" #: action_reset_keys msgid "R*" msgstr "R*" #: filefilter_install msgid "JClic project installers (*.jclic.inst)" msgstr "JClic 安裝專案 (*.jclic.inst)" #: report_err_no_users msgid "No users defined in the reports database!" msgstr "在報告資料庫中沒有使用者被定義" #: report_err_no_users_in_group msgid "No users defined for this group in the reports database!" msgstr "在報告資料庫群組中沒有使用者被定義" #: report_new_user msgid "New user..." msgstr "新使用者..." #: report_new_user_tooltip msgid "Create a new user in the reports database" msgstr "在報告資料庫建立新使用者" #: report_err_creating_user msgid "Error creating new user!" msgstr "建立新使用者錯誤!" #: report_select_user msgid "User identification for the reports database" msgstr "報告資料庫的使用者認證" #: report_userlist_title msgid "Please select your name:" msgstr "請選取您的姓名:" #: report_ident_user msgid "User identification" msgstr "使用者認證" #: report_name_prompt msgid "Name:" msgstr "名稱:" #: report_id_prompt msgid "Login:" msgstr "帳號:" #: report_pw_prompt msgid "Password:" msgstr "密碼:" #: report_pw_prompt_confirm msgid "Confirm password:" msgstr "確認密碼:" #: report_new_user_data msgid "Creation of a new user:" msgstr "建立新使用者:" #: report_err_bad_data msgid "Incorrect data!" msgstr "不正確的資料!" #: report_generic_group_name msgid "Generic" msgstr "一般" #: report_new_group msgid "Create a new group..." msgstr "建立新的群組" #: report_err_creating_group msgid "Error creating the new group!" msgstr "建立新群組錯誤!" #: report_grouplist_title msgid "Please select your group:" msgstr "請選擇您的群組" #: report_new_group_data msgid "Creation of a new users group:" msgstr "建立新的使用者群組" #: report_err_invalid_user msgid "Missing user ID or incorrect password." msgstr "錯誤的使用者帳號或不正確的密碼。" #: report_user_has_pwd msgid "This account is password-protected." msgstr "這個帳號有密碼保護。" #: report_err_init msgid "Error initializing report system." msgstr "報告系統初始化錯誤。" #: report_not_connected msgid "not connected" msgstr "未連線" #: report_err_creating msgid "Error creating reports agent" msgstr "建立報告時發生錯誤" #: action_return_caption msgctxt "action_return_caption" msgid "Return" msgstr "返回" #: action_return_tooltip msgid "Return to the last menu" msgstr "返回到最後的選單" #: action_return_keys msgid "T*" msgstr "T*" #: filefilter_all_sounds msgid "Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff)" msgstr "音效 (*.wav, *.mp3, *.ogg, *.au, *.aiff)" #: filefilter_midi msgid "MIDI files (*.mid)" msgstr "MIDI 檔 (*.mid)" #: filefilter_all_video msgid "Video files (*.avi, *.mov, *.mpeg)" msgstr "影片檔 (*.avi, *.mov, *.mpeg)" #: filefilter_all_anim msgid "Flash 2.0 files (*.swf)" msgstr "Flash 2.0 檔 (*.swf)" #: filefilter_skins msgid "Skins (*.xml)" msgstr "模板 (*.xml)" #: filefilter_all_media msgid "All media files" msgstr "所有媒體檔案" #: filesystem_copyToRoot_1 msgid "The file" msgstr "檔案" #: filesystem_copyToRoot_2 msgid "is out of the current project's folder." msgstr "不在目前的專案資料夾" #: filesystem_copyToRoot_3 msgid "It's advisable to have all the files in the same folder." msgstr "在同一文件夾下的所有文件是可使用的。" #: filesystem_copyToRoot_4 msgid "Do you want to copy the selected file to the project's folder?" msgstr "您要複製所選取的檔案到專案資料夾嗎?" #: filesystem_copyFile msgid "Copying file" msgstr "複製檔案" #: msg_loading msgid "Loading" msgstr "載入中" #: report_err_bad_id msgid "Bad identifier!" msgstr "辨識碼有誤!" #: report_err_duplicate_id msgid "This identifier already exists in the database!" msgstr "這個驗證碼已經出現在資料庫中!" #: report_err_bad_name msgid "Bad name!" msgstr "名稱有誤!" #: report_err_bad_pw msgid "Passwords don't match!" msgstr "兩次輸入的密碼不符!" #: report_err_connect msgid "Error connecting to the reports database!" msgstr "連線到報告資料庫錯誤!" #: test_alert_exit msgid "EXIT: At this point, the program will exit." msgstr "離開:在這情況,程式將會結束" #: test_alert_jump_to msgid "At this point the program will jump to the project:" msgstr "在這情況,程式將會跳至專案" #: ftype_image msgid "Image" msgstr "影像" #: ftype_audio msgid "Digital audio" msgstr "數位音樂" #: ftype_midi msgid "MIDI file" msgstr "MIDI 檔" #: ftype_xml msgid "XML file" msgstr "XML 檔" #: ftype_anim msgid "Animation" msgstr "動畫" #: ftype_video msgid "Digital video" msgstr "數位影片" #: ftype_font msgid "TrueType font" msgstr "TrueType 字型檔" #: ftype_jclic msgid "JClic project" msgstr "JClic 專案" #: ftype_inst msgid "JClic project installer script" msgstr "JClic專案安裝腳本" #: ftype_unknown msgid "Unknown" msgstr "未知" #: ftype_animated msgid "animated" msgstr "動畫" #: filefilter_fonts msgid "Fonts (*.ttf)" msgstr "字型 (*.ttf)" #: editor_moveUp_keys msgid "U#38" msgstr "U#38" #: editor_moveDown_keys msgid "W#40" msgstr "W#40" #: filefilter_all_html msgid "HTML documents (*.htm, *.html)" msgstr "HTML 文件 (*.htm, *.html)" #: about_creditsDoc msgid "about/credits.html" msgstr "about/credits.html" #: about_licenseDoc msgid "about/license.html" msgstr "about/license.html" #: about_sponsorsCaption msgid "With the support of:" msgstr "支持:" #: about_window_systemInfo msgid "System information" msgstr "系統資訊" #: about_window_projectInfo msgid "Current project info" msgstr "目前專案資訊" #: about_window_reportInfo msgid "Current session results" msgstr "本次執行結果" #: about_otherCreditsCaption msgid "This product includes software developed by:" msgstr "本產品包含軟體製作:" #: msg_saving_project msgid "Saving project..." msgstr "儲存專案中..." #: filefilter_text msgid "Text files (*.txt)" msgstr "文字檔 (*.txt)" #. #Translation credits displayed on the about window, in HTML format #: html_translation_credits msgid "English version, by The JClic team" msgstr "英文版,由The JClic team製作" #. #Abstract of the GPL license, version 2.0, as shown on the About window #: html_gpl_license msgid "" "This program is free software; you can redistribute it and/or modify it " "under the terms of the GNU General Public License as published by the Free " "Software Foundation; either version 2 of the License, or (at your option) " "any later version.
 
This program is distributed in the hope that " "it will be useful, but WITHOUT ANY WARRANTY; without even the implied " "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public " "License for more details." msgstr "" "本程式是自由軟體,您可以藉由自由軟體基金會的GNU通用公共授權條款下,重新製作或修改它;從第二版的許可,或(由你選擇)任何更新的版本。
 " "
此程式分配希望這將是有益的,但沒有任何保證;也沒有商業性或特定目的的隱藏保證。參見 GNU通用公共授權條款獲得更多細節。" i18n/fromLaunchpad/po/jclic-installer/000077500000000000000000000000001335566474600201405ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-installer/installer_ar.po000066400000000000000000000046441335566474600231670ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2010-10-14 16:56+0000\n" "Last-Translator: Ahmed Mohammed \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "العربيّة" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic يحتاج محرك جافا محدث ,الاصدار 1.4 أو أعلى.تستطيع تحميل الملف من " "http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "يوجد إصدار قديم لنظام Java مثبّت على هذا الحاسوب." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "يستحيل العثور على نظام Java مثبّت على هذا الحاسوب." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "معياري" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "كامل" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "خفيف" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} تنصيب صامت" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "تطبيق للعلب على JClic" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "تطبيق لإنشاء وتحرير ألعاب JClic" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "مgفات ضرورية فقط في خادم يستضيف تطبيفات JClic فقط." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "خادوم التقارير." i18n/fromLaunchpad/po/jclic-installer/installer_ast.po000066400000000000000000000044741335566474600233550ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2009-10-01 10:40+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Asturianu" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic necesita un motor Java anováu, versión 1.4 o superior. Pues descargalu " "de baldre dende http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "El sistema Java d'esti ordenador ye mui vieyu." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Nun s'atopó sistema Java dengún instaláu nel ordenador." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Estándar" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Completa" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Mínima" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "Instalación offline de JClic ${PRODUCT_VERSION}" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Aplicación pa xugar a les xeres de JClic" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Aplicación pa criar y camudar xeres de JClic." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "Ficheros que son necesarios namás nun sirvidor qu'agospie applets de JClic" #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Sirvidor d'informes" i18n/fromLaunchpad/po/jclic-installer/installer_bs.po000066400000000000000000000044451335566474600231700ustar00rootroot00000000000000# Bosnian translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2012-05-18 21:03+0000\n" "Last-Translator: Meliha Gadara \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Engleski jezik" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic treba ažuriranu Java engine, verzija 1.4 ili novija. Možete ga " "preuzeti sa http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Stara verzija Java softvera je instalirana na vašem komjuteru." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "" "Nije bilo je moguće pronaći bilo kakav Java sistem instaliran na ovom " "računalu." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Standardno" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Puno" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic $ {verzija proizvoda} isključena postava" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Aplikacije za reprodukciju JClic aktivnosti." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Aplikacije za stvaranje i uređivanje JClic aktivnosti." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Izvješća poslužitelja." i18n/fromLaunchpad/po/jclic-installer/installer_ca.po000066400000000000000000000041661335566474600231470ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic installer 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2018-06-11 10:11+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Català" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.7 or higher. You can download " "it from http://www.java.com" msgstr "" "El JClic necessita un motor Java actualitzat, versió 1.7 o superior. El " "podeu descarregar gratuïtament des de http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "El sistema Java d'aquest ordinador és antic." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "No s'ha pogut trobar cap sistema Java instal·lat a aquest ordinador." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Estàndard" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Completa" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Mínima" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "Instal·lació del JClic ${PRODUCT_VERSION}" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Aplicació per visualitzar i realitzar activitats JClic." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Aplicació per crear i modificar activitats JClic." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "Fitxers que són necessaris només en un servidor que allotgi applets JClic." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Servidor d'informes." i18n/fromLaunchpad/po/jclic-installer/installer_cs.po000066400000000000000000000044671335566474600231750ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2011-04-08 09:53+0000\n" "Last-Translator: David Kolibáč \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Angličtina" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic vyžaduje novější stroj Java, verze 1.4 nebo vyšší. Můžete jej stáhnout " "z: http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Na vašem počítači existuje stará verze Javy." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Na tomto počítači nelze najít žádný instalovaný systém Java." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Standardní" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Plná" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Minimální" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} off-line nastavení" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Aplikace pro přehrávání JClic aktivit." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Aplikace pro vytváření a úpravu JClic aktivit." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "Soubory potřebné pouze pro server s hostovanými JClic applety." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Server sestav." i18n/fromLaunchpad/po/jclic-installer/installer_de.po000066400000000000000000000044661335566474600231570ustar00rootroot00000000000000# German translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2008-11-21 17:37+0000\n" "Last-Translator: Keruskerfuerst \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Englisch" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic benötigt Java Version 1.4 oder höher. Download unter " "http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Es ist keine aktuelle Java Version auf diesem Computer installiert." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Auf diesem Computer konnte kein Java-System gefunden werden." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Standard" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Komplett" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Minimal" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} offline setup" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Anwendung zum Abspielen von JClic Übungen." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Anwendung zum Erstellen und Editieren von JClic Übungen." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "Diese Dateien werden nur auf einem Server gebraucht, der JClic Applets " "hostet." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Reports Server" i18n/fromLaunchpad/po/jclic-installer/installer_el.po000066400000000000000000000054451335566474600231650ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2008-07-03 12:18+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Αγγλικά" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "Το JClic χρειάζεται μια ενημερωμένη μηχανή Java, έκδοση 1.4 ή μεταγενέστερη. " "Μπορείτε να την κατεβάσετε από τη διεύθυνση http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "" "Υπάρχει μια παλαιότερη έκδοση Java εγκατεστημένη σε αυτόν τον υπολογιστή." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "" "Είναι αδύνατον να βρεθεί σύστημα της Java εγκατεστημένο σε αυτόν τον " "υπολογιστή." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Τυπική" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Πλήρης" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Ελάχιστη" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} offline εγκατάσταση" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Εφαρμογή αναπαραγωγής δραστηριοτήτων του JClic" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Εφαρμογή δημιουργίας και επεξεργασίας του JClic." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "Αρχεία απαραίτητα μόνο σε διακομιστή που φιλοξενεί μικροεφαρμογές του JClic." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Διακομιστής αναφορών" i18n/fromLaunchpad/po/jclic-installer/installer_es.po000066400000000000000000000041671335566474600231740ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic installer 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2008-06-02 10:10+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Español" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic necesita un motor Java actualizado, versión 1.4 o superior. Puede " "descargarlo gratuitamente desde http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "El sistema Java de este ordenador es antiguo." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "No se ha encontrado ningún sistema Java instalado en este ordenador." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Estándar" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Completa" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Mínima" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "Instalación de JClic ${PRODUCT_VERSION}" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Aplicación para visualizar y realizar actividades JClic." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Aplicación para crear y modificar actividades JClic." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "Archivos que son necesarios únicamente en un servidor que aloje applets " "JClic." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Servidor de informes." i18n/fromLaunchpad/po/jclic-installer/installer_eu.po000066400000000000000000000045041335566474600231710ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2009-02-18 11:21+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Ingelesa" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic-ek Java 1.4 edo aurreragoko bertsioa behar du. Hemen lortu ahal duzu: " "http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Ordenagailu honetan Javaren bertsio zaharra dago instalatuta" #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Ezin izan da Java sistemarik aurkitu instalatuta ordenagailu honetan" #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Estandarra" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Osoa" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Gutxienekoa" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic-en instalazioa ${PRODUCT_VERSION}" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "JClic jarduerak egiteko aplikazioa" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "JClic jarduerak sortu eta editatzeko aplikazioa" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "JClic applets-ak ostatzen dituen zerbitzarian bakarrik beharrezko diren " "fitxategiak" #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Txostenen zerbitzaria." i18n/fromLaunchpad/po/jclic-installer/installer_fr.po000066400000000000000000000045711335566474600231730ustar00rootroot00000000000000# French translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2009-01-17 16:42+0000\n" "Last-Translator: Renaud de Colombel \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Anglais" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic requiert une version plus récente de la machine java, ver. 1.4 ou " "supérieure. Vous pouvez la télécharger sur http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Une version obsolète de Java est installée sur cet ordinateur." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Aucune machine Java n'a été détectée sur cet ordinateur." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Par défaut" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Complète" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Minimale" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "Installation hors-ligne de JClic ${PRODUCT_VERSION}" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Programme d'exécution des activités JClic." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Application pour créer et modifier des activités JClic." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "Fichiers nécessaires uniquement sur un serveur hébergeant des applets JClic." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Serveur de rapports." i18n/fromLaunchpad/po/jclic-installer/installer_gl.po000066400000000000000000000045341335566474600231650ustar00rootroot00000000000000# Galician translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2010-12-21 19:58+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Galego" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic precisa un motor Java actualizado, na versión 1.4 ou posterior. Pode " "descargala de http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Neste computador hai instalada unha versión vella de Java." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "" "Foi imposíbel atopar ningunha versión de Java instalada neste ordenador." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Estándar" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Completa" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Mínima" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "Instalación de JClic ${PRODUCT_VERSION}" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Aplicativo para reproducir as actividades JClic" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Aplicativo para crear e editar actividades JClic" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "Ficheiros só necesarios nun servidor con miniaplicativos JClic aloxados" #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Servidor de informes" i18n/fromLaunchpad/po/jclic-installer/installer_it.po000066400000000000000000000041231335566474600231710ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic installer 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2008-06-09 13:36+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Español" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic richiede un motore Java aggiornato, versione 1.4 o superiore. Puoi " "scaricarla da http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "C'è una vecchia versione di Java installata in questo computer." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "" "Non è stato possibile trovare una versione di Java installata in questo " "computer." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Tipica" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Completa" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Minima" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} offline setup" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Applicazione per avviare attività JClic." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Applicazione per creare e modificare attività JClic." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "Files necessari solo in un server con applets JClic." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Server dei rapporti." i18n/fromLaunchpad/po/jclic-installer/installer_nl.po000066400000000000000000000045051335566474600231720ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2008-08-11 13:15+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Nederlands" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic heeft een aangepaste Java engine nodig, versie 1.4 of beter. Je kan " "deze downloaden via http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Er is een oudere versie van Java op deze computer geïnstalleerd." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "" "Het was onmogelijk om een geïnstalleerd Java systeem te vinden op deze " "computer." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Standaard" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Volledig" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Licht" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} offline setup" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Toepassing om JClic activiteiten te spelen" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Toepassing om JClic activiteiten aan te maken" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "Bestanden die enkel nodig zijn in een server met JClic applets." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Rapporten server." i18n/fromLaunchpad/po/jclic-installer/installer_oc.po000066400000000000000000000036241335566474600231630ustar00rootroot00000000000000# Occitan (post 1500) translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2009-04-12 13:13+0000\n" "Last-Translator: Yannig MARCHEGAY (Kokoyaya) \n" "Language-Team: Occitan (post 1500) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Anglés" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "" #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "" #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Estandard" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Complet" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "" i18n/fromLaunchpad/po/jclic-installer/installer_pt.po000066400000000000000000000045141335566474600232040ustar00rootroot00000000000000# Portuguese translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2008-06-03 11:21+0000\n" "Last-Translator: Rui Fernandes \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Português" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "O Jclic necessita um motor Java actualizado (versão 1.4 ou superior). Pode " "desacrregá-lo em http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Possui uma versão antiga do Java instalada neste computador." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Não foi possível encontrar uma instalação do Java neste computador." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Padrão" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Completa" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Mínima" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} instalação offline" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Programa para correr actividades Jclic." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Programa para criar e editar actividades Jclic." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "Ficheiros necessários apenas num servidor com applets JClic." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Servidor de relatórios." i18n/fromLaunchpad/po/jclic-installer/installer_pt_BR.po000066400000000000000000000045411335566474600235670ustar00rootroot00000000000000# Brazilian Portuguese translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2008-11-30 23:36+0000\n" "Last-Translator: Alexandre R Soares \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Português" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "jClic requer Java atualizado, versão 1.4 ou superior. Você pode obtê-lo em " "http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Há uma versão antiga do Java instalada em seu computador." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Não foi possível localizar algum sistema de Java em seu computador." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Padrão" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Completa" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Mínima" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "configuração offline JClic ${PRODUCT_VERSION}" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Aplicativo para rodar atividades do JClic" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Aplicativo para criar e editar atividades do JClic" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" "Arquivos necessários apenas em um servidor com applets JClic hospedados." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Servidor de relatórios." i18n/fromLaunchpad/po/jclic-installer/installer_ru.po000066400000000000000000000051631335566474600232100ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2009-10-05 00:42+0000\n" "Last-Translator: vsink \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Английский" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic необходима Java машина версии 1.4 или выше. Вы можете загрузить её с " "сайта http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Предыдущая версия Java установлена на этом компьютере." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Не удалось найти установленную Java на этом компьютере." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Стандартная" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Полная" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Минимальная" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "Автономная установка JClic ${PRODUCT_VERSION}" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Приложение для воспроизведения JClic активностей." #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Приложение для создания и редактирования JClic активностей." #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "Файлы требуются только на сервере, хостящем аплеты JClic." #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Сервер отчётов." i18n/fromLaunchpad/po/jclic-installer/installer_tr.po000066400000000000000000000041741335566474600232100ustar00rootroot00000000000000# Turkish translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2010-11-19 01:22+0000\n" "Last-Translator: Caner GÜRAL \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Turkish" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "JClic, 1.4 veya üstü sürümde bir Java motoru gerektiriyor. " "http://www.java.com'dan indirebilirsiniz." #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Bilgisayarınızda eski sürüm bir Java kurulu." #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "Bilgisayarınızda herhangi yüklü Java bulunamadı." #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Standart" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Tam" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Temel" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} çevrimdışı kurulum" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "" #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Sunucu raporları" i18n/fromLaunchpad/po/jclic-installer/installer_vec.po000066400000000000000000000045151335566474600233370ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2010-05-21 08:42+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "Inglexe" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "" "Senghe vol un motor Java axornà par JClic, version 1.4 o superior. Te pol " "descargarla da http://www.java.com" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "Ghe xé na version vècia de Java istaƚada inte sto ordenaor" #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "No xé stà posììbiƚƚe de catar nisun sistèma Java inte sto ordenador" #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "Standard" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "Conplèta" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Minimal" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "Istaƚasion de JClic ${PRODUCT_VERSION} fora linia" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "Programa da inviar par mostrar atività de JClic" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "Programa par prodùxer e modifegar atività de JClic" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "Files che senghe vol nòma che inte un server ospitante applets JClic" #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "Server par i reports" i18n/fromLaunchpad/po/jclic-installer/installer_zh_TW.po000066400000000000000000000044201335566474600236100ustar00rootroot00000000000000# Traditional Chinese translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-05-30 16:00+0000\n" "PO-Revision-Date: 2012-03-12 17:30+0000\n" "Last-Translator: xatierlike \n" "Language-Team: Traditional Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. #Translation language name msgid "English" msgstr "英語" #: javaNeeded msgid "" "JClic needs an updated Java engine, version 1.4 or higher. You can download " "it from http://www.java.com" msgstr "JClic 需要 1.4 以上版本的 Java 引擎, 您可以從 http://www.java.com 網站下載。" #: oldJavaMsg msgid "There is an old version of Java installed on this computer." msgstr "有一個舊版本的 Java 已經安裝在您的電腦中。" #: noJavaMsg msgid "It was impossible to find any Java system installed on this computer." msgstr "在您的電腦找不到任何已經安裝的 Java 系統。" #. #Type of installation (standard, full, minimal) #: standardType msgid "Standard" msgstr "標準" #. #Type of installation (standard, full, minimal) #: fullType msgid "Full" msgstr "完全" #. #Type of installation (standard, full, minimal) #: liteType msgid "Lite" msgstr "Lite" #: captionStr msgid "JClic ${PRODUCT_VERSION} offline setup" msgstr "JClic ${PRODUCT_VERSION} 離線設定" #. #Description of JClic Player #: JClicPlayerDesc msgid "Application to play JClic activities." msgstr "用來玩JClic 活動的應用。" #. #Description of JClic Author #: JClicAuthorDesc msgid "Application to create and edit JClic activities." msgstr "用來創造和編輯 JClic 活動的應用" #. #Description of JClic Applet components #: JClicAppletDesc msgid "Files needed only in a server with hosted JClic applets." msgstr "檔案只要在一台有 JClic applets 的 server 上" #. #Description of JClic Reports #: JClicReportsDesc msgid "Reports server." msgstr "報告 server" i18n/fromLaunchpad/po/jclic-persistent/000077500000000000000000000000001335566474600203435ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_ar.po000066400000000000000000000020521335566474600262140ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-03-26 09:18+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" #: cl_prompt_title msgid "Installation directory" msgstr "" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_ast.po000066400000000000000000000025531335566474600264070ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-09-27 07:48+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Tas executando \"$\" per primer vegada nesta computadora.\n" "Inxerta'l nome d'una carpeta pa guardar\n" "los datos de los ficheros y les preferencies del programa." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "¡Nun se peu crear esta carpeta!\n" "Por favor, inxerta un allugamientu válidu onde tengas permisos " "alministrativos." #: cl_prompt_title msgid "Installation directory" msgstr "Carpeta d'instalación" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_bs.po000066400000000000000000000025141335566474600262210ustar00rootroot00000000000000# Bosnian translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-05-18 21:08+0000\n" "Last-Translator: Meliha Gadara \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Pokrećete \"$\" prvi put na ovom računalu.\n" "Unesite naziv foldera gdje ćete pohraniti\n" "datoteke s podacima i postavke programa." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Nije moguće kreirati ovaj folder!\n" "Molimo unesite ispravnu lokaciju gdje imate administratorska prava." #: cl_prompt_title msgid "Installation directory" msgstr "Direktorij za instalaciju" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_ca.po000066400000000000000000000022671335566474600262050ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-11 17:50+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Esteu utilitzant el programa \"$\" per primera vegada en aquest ordinador.\n" "Si us plau, indiqueu la carpeta on desitgeu emmagatzemar els fitxers\n" "de configuració i les dades del programa." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "S'ha produit un error en intentar crear la carpeta!\n" "Si us plau, indiqueu una ubicació on tingueu drets d'administració." #: cl_prompt_title msgid "Installation directory" msgstr "Directori d'instal·lació" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_cs.po000066400000000000000000000025201335566474600262170ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-04-08 09:49+0000\n" "Last-Translator: David Kolibáč \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Spouštíte \"$\" na tomto počítači poprvé.\n" "Zadejte prosím jméno složky, ve které budou uloženy\n" "datové soubory a nastavení programu." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Nelze vytvořit tuto složku!\n" "Zadejte prosím platné umístění, ke kterému máte správcovská práva." #: cl_prompt_title msgid "Installation directory" msgstr "Instalační složka" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_da.po000066400000000000000000000024701335566474600262020ustar00rootroot00000000000000# Danish translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-16 22:20+0000\n" "Last-Translator: nanker \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Du kører \"$\" for første gang på denne computer.\n" "Angiv venligst et mappenavn, hvor der kan gemmes\n" "datafiler og programopsætninger." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Kunne ikke oprette denne mappe!\n" "Angiv venligst et gyldigt område, hvor du har administrative rettigheder." #: cl_prompt_title msgid "Installation directory" msgstr "Installationskatalog" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_de.po000066400000000000000000000021671335566474600262110ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-03-04 17:19+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Sie führen \"$\" erstmals auf Ihrem Computer aus.\n" "Bitte Zielordner zum Speichern der Dateien und Einstellungen angeben." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Ordner kann nicht erstellt werden!\n" "Sie müssen einen gültigen Installationspfad angeben, für den Sie " "Administratorenrechte besitzen." #: cl_prompt_title msgid "Installation directory" msgstr "Intallationspfad" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_el.po000066400000000000000000000031731335566474600262170ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-07-28 06:54+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Η εφαρμογή \"$\" εκτελείται για πρώτη φορά σε αυτόν τον υπολογιστή.\n" "Παρακαλώ εισάγετε ένα όνομα φακέλου για αποθήκευση των\n" "αρχείων δεδομένων και των ρυθμίσεων του προγράμματος." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Αδυναμία δημιουργίας του φακέλου!\n" "Παρακαλώ εισάγετε μια έγκυρη τοποθεσία όπου θα έχετε δικαιώματα διαχειριστή." #: cl_prompt_title msgid "Installation directory" msgstr "Φάκελος εγκατάστασης" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_es.po000066400000000000000000000022771335566474600262320ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-11 17:50+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Está utilizando el programa \"$\" por primera vez en este ordenador.\n" "Por favor, indique la carpeta en la que desea almacenar los archivos\n" "de configuración y los datos del programa." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Se ha producido un error al intentar crear la carpeta.\n" "Por favor, indique una ubicación en la que tenga derechos de administración." #: cl_prompt_title msgid "Installation directory" msgstr "Directorio de instalación" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_eu.po000066400000000000000000000025161335566474600262300ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-06-16 06:46+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Lehehengo aldiz ari zara ordenagailu honetan \"$\" abiarazten.\n" "Mesedez, sartu datu-fitxategiak eta programaren\n" "ezarpenak gordetzeko direktorioaren izena." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Ezinezkoa da direktorio hori sortzea!\n" "Mesedez, sartu kudeaketa baimena duzun gune bat." #: cl_prompt_title msgid "Installation directory" msgstr "Instalazio-direktorioa" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_fr.po000066400000000000000000000022071335566474600262230ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-11 17:50+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Vous lancez \"$\" pour la première fois sur cet ordinateur. Entrez un nom de " "dossier où stocker les fichiers de données et les paramètres de programme." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Impossible de créer ce dossier \\! Entrez une localisation valide où vous " "avez des droits d'administrateurs." #: cl_prompt_title msgid "Installation directory" msgstr "Répertoire d'installation" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_gl.po000066400000000000000000000025471335566474600262250ustar00rootroot00000000000000# Galician translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-12-21 19:55+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Está a usar «$» por primeira vez neste computador.\n" "Por favor, introduza un nome de cartafol no que\n" "almacenar os ficheiros de datos e configuración." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Non se puido crear o cartafol!\n" "Por favor, introduza unha localización válida na que conte con permisos." #: cl_prompt_title msgid "Installation directory" msgstr "Cartafol de instalación" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_it.po000066400000000000000000000025321335566474600262310ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-22 17:18+0000\n" "Last-Translator: giomu2 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Avviate \"$\" la prima volta in questo computer.\n" "Per favore inserite un nome di cartella dove depositare\n" "i file dei dati e i parametri del programma." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Impossibile creare questa cartella!\n" "Per favore inserisci una posizione valida dove hai i diritti di " "amministrazione." #: cl_prompt_title msgid "Installation directory" msgstr "Cartella di installazione" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_nl.po000066400000000000000000000025441335566474600262310ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-08-11 13:22+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Je gebruikt \"$\" voor de eerste keer op deze computer.\n" "Gelieve een map naam te kieizen om de gegevens-\n" "bestanden en de programmavoorkeuren op te slaan." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Ik kan deze map niet aanmaken!\n" "Gelieven een geldige bestandslocatie op te geven waar je de nodige " "administratieve rechten hebt." #: cl_prompt_title msgid "Installation directory" msgstr "Installatie map" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_pt.po000066400000000000000000000022311335566474600262340ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-28 11:44+0000\n" "Last-Translator: Rui Fernandes \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Está a utilizar o programa \"$\" pela primeira vez neste computador.\n" "Por favor, indique a pasta onde deve guardar os ficheiros\n" "de dados e as configurações do programa." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Impossível criar esta pasta!\n" "Por favor, introduza uma localização válida onde possua direitos de " "administrador." #: cl_prompt_title msgid "Installation directory" msgstr "Pasta de instalação" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_pt_BR.po000066400000000000000000000021671335566474600266270ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-04-09 13:44+0000\n" "Last-Translator: Alexandre R Soares \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Essa é a primeira vez que usa o programa \"$\" neste computador.\n" "Por favor, indique a pasta onde guardará os arquivos\n" "de configuração e de dados do programa." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Houve um erro ao tentar criar a pasta.\n" "Por favor, indique um local com direitos de administrador." #: cl_prompt_title msgid "Installation directory" msgstr "Pasta de Instalação" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_ru.po000066400000000000000000000030071335566474600262410ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-28 13:36+0000\n" "Last-Translator: Nkolay Parukhin \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Вы запустили \"$\" впервые на этом компьютере.\n" "Пожалуйста, укажите папку для хранения\n" "файлов данных и настроек программы." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "Невозможно создать эту папку!\n" "Пожалуйста, укажите местоположение, где у вас есть необходимые разрешения." #: cl_prompt_title msgid "Installation directory" msgstr "Папка для установки" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_vec.po000066400000000000000000000025361335566474600263760ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-22 15:21+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "Te si drio doparar \"$\" par ƚa prima vòlta so sto ordenaor.\n" "Spesìfega un nòme de cartèƚa indove memorixar\n" "i file co' i dati e ƚe inpostasion de 'l programa." #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "No se pol prodùxer sta cartèƚa!\n" "Inserisi un percorso vàƚido indove che te gà parmesi de ministrasion." #: cl_prompt_title msgid "Installation directory" msgstr "Cartèƚa de istaƚasion" i18n/fromLaunchpad/po/jclic-persistent/PersistentPathsMessages_zh_TW.po000066400000000000000000000024331335566474600266500ustar00rootroot00000000000000# Chinese (Traditional) translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-03-12 17:41+0000\n" "Last-Translator: xatierlike \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: cl_alert msgid "" "You are running \"$\" for first time in this computer.\n" "Please enter a folder name where to store\n" "the data files and program settings." msgstr "" "你正第一次在這台電腦上執行\"$\"\n" "請進入想要儲存資料與程式設定\n" "的資料夾" #: cl_err_unableToCreateDir msgid "" "Unable to create this folder!\n" "Please enter a valid location where you have administrative rights." msgstr "" "無法建立資料夾!\n" "請輸入您有管理權限的合法路進" #: cl_prompt_title msgid "Installation directory" msgstr "安裝資料夾" i18n/fromLaunchpad/po/jclic-player/000077500000000000000000000000001335566474600174375ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-player/PlayerMessages_ar.po000066400000000000000000000332061335566474600234110ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-03-26 09:16+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" #: m_Help msgid "Help" msgstr "" #: m_Skin msgid "Skin" msgstr "" #: action_helpAbout_caption msgid "About..." msgstr "" #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" #: library_mainMenu msgid "Main menu" msgstr "" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" #: libraryManager_connectToLibrary msgid "Connect" msgstr "" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" #: menuElement_dlg_description msgid "Description:" msgstr "" #: edit_find_image msgid "Find image..." msgstr "" #: menuElement_dlg_icon msgid "Icon:" msgstr "" #: edit_find_file msgid "Find file..." msgstr "" #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "" #: menuElement_dlg_project msgid "Project:" msgstr "" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "" #: edit_text msgid "Text:" msgstr "" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "" #: library_dlg_name_tooltip msgid "Library name" msgstr "" #: edit_name msgid "Name:" msgstr "" #: edit_title msgid "Title:" msgstr "" #: library_dlg_title msgid "Library properties" msgstr "" #: menu_dlg_title msgid "Folder properties" msgstr "" #: menuElement_dlg_title msgid "Button properties" msgstr "" #: menu_delete_tooltip msgid "Delete current menu" msgstr "" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "" #: action_libraries_caption msgid "Libraries..." msgstr "" #: dlg_save_title msgid "Save file..." msgstr "" #: error_propertiesFile_beg msgid "Error opening \"" msgstr "" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "" #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "" #: menu_newMenuName msgid "New folder" msgstr "" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "" #: menu_newMenu_caption msgid "New button's folder" msgstr "" #: menu_newMenuElement_caption msgid "New project button" msgstr "" #: menu_newMenuElementName msgid "New button" msgstr "" #: library_cancel_tooltip msgid "Cancel changes" msgstr "" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "" #: libraryManager_edit_caption msgid "Edit" msgstr "" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "" #: library_select_caption_ok msgid "Ok" msgstr "" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "" #: library_caption msgid "JClic projects library" msgstr "" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "" #: libraryManager_caption msgid "Select library" msgstr "" #: library_error_reading msgid "Error reading project library!" msgstr "" #: wizard_next msgid "Next >" msgstr "" #: wizard_prev msgid "< Previous" msgstr "" #: wizard_finish msgid "Finish" msgstr "" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "" #: install_title msgid "Installation of JClic projects" msgstr "" #: install_info_description msgid "Installation of a new JClic project" msgstr "" #: install_info_from msgid "From:" msgstr "" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "" #: install_select_library msgid "Select the library where to install the project:" msgstr "" #: install_copy_files msgid "File copy" msgstr "" #: install_source msgid "Source:" msgstr "" #: install_dest msgid "Destination:" msgstr "" #: install_status msgid "Status:" msgstr "" #: install_start msgid "Start the installation" msgstr "" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "" #: install_progress_tooltip msgid "Progress of the installation" msgstr "" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "" #: install_msg_creating_dirs msgid "Creating directories" msgstr "" #: install_msg_copying msgid "Copying file" msgstr "" #: install_msg_end msgid "Finished!" msgstr "" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "" #: install_msg_cancel msgid "Installation cancelled!" msgstr "" #: install_error msgid "Install error!" msgstr "" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "" #: install_library_folders msgid "Library folders:" msgstr "" #: install_success_1 msgid "The project are now installed on your system!" msgstr "" #: install_success_2 msgid "In order to run it, select its" msgstr "" #: install_success_3 msgid "icon on the project library." msgstr "" #: wizard_info msgid "Press \"Next\" to start." msgstr "" #: install_step_1 msgid "1. Selection of JClic library" msgstr "" #: install_step_2 msgid "2. Download files" msgstr "" #: install_step_3 msgid "3. Creation of icons" msgstr "" #: install_step_4 msgid "Installation finished!" msgstr "" #: install_info_info msgid "You request to install the project:" msgstr "" #: settings_title msgid "Settings" msgstr "" #: library_error_clone msgid "Unable to clone library!" msgstr "" #: settings_security msgid "Security" msgstr "" #: settings_password_protect msgid "Protect settings with password" msgstr "" #: settings_new_password msgid "New password:" msgstr "" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "" #: settings_general msgid "General" msgstr "" #: settings_look msgid "Look & Feel:" msgstr "" #: settings_skin msgid "Skin:" msgstr "" #: settings_language msgid "Language:" msgstr "" #: settings_reports msgid "Reports" msgstr "" #: settings_report_use msgid "Write scores to a database" msgstr "" #: settings_report_engine msgid "Reporter class:" msgstr "" #: settings_report_params msgid "Parameters:" msgstr "" #: settings_media msgid "Multimedia" msgstr "" #: settings_media_enabled msgid "Multimedia enabled" msgstr "" #: settings_media_system msgid "Multimedia system:" msgstr "" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "" #: settings_library msgid "Libraries" msgstr "" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "" #: m_Tools msgid "Tools" msgstr "" #: m_File_Mnemonic msgid "F" msgstr "" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "" #: m_Help_Mnemonic msgid "H" msgstr "" #: m_Activity msgid "Activity" msgstr "" #: m_Activity_Mnemonic msgid "A" msgstr "" #: action_openFile_caption msgid "Open file..." msgstr "" #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "" #: action_openFile_keys msgid "OO" msgstr "" #: action_openUrl_caption msgid "Open URL..." msgstr "" #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "" #: action_openUrl_keys msgid "UU" msgstr "" #: action_exit_caption msgid "Exit" msgstr "" #: action_exit_tooltip msgid "Close JClic" msgstr "" #: action_exit_keys msgid "XX" msgstr "" #: action_settings_caption msgid "Settings..." msgstr "" #: action_settings_tooltip msgid "Adjust global program settings" msgstr "" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "" #: action_libraries_keys msgid "LL" msgstr "" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "" #: action_helpAbout_keys msgid "AA" msgstr "" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "" #: settings_report_other msgid "Other:" msgstr "" #: settings_report_address msgid "Host:" msgstr "" #: settings_report_port msgid "Port:" msgstr "" #: settings_report_driver msgid "Driver:" msgstr "" #: settings_report_url msgid "URL:" msgstr "" #: settings_report_user msgid "User:" msgstr "" #: settings_report_pwd msgid "Password:" msgstr "" #: settings_report_options msgid "Reporter params::" msgstr "" #: settings_report_err_server msgid "Bad report server name!" msgstr "" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" #: settings_report_err msgid "Incorrect report system data!" msgstr "" #: settings_report_type msgid "Reporting engine:" msgstr "" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "" #: settings_media_qt msgid "QuickTime" msgstr "" #: settings_media_default msgid "Auto-detect" msgstr "" #: settings_security_tooltip msgid "Security settings" msgstr "" #: settings_report_tooltip msgid "Report system settings" msgstr "" #: settings_media_tooltip msgid "Multimedia system options" msgstr "" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "" #: settings_library_tooltip msgid "Library settings and editor" msgstr "" #: settings_look_tooltip msgid "User interface look & feel" msgstr "" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "" #: settings_language_tooltip msgid "Language selection" msgstr "" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "" #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "" #: edit_file msgid "File:" msgstr "" #: error_launchLibrary msgid "Error launching library" msgstr "" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "" #: edit_find_media msgid "Find media file..." msgstr "" #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "" #: edit_find_image_keys msgid "F*" msgstr "" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "" #: menu_newMenu_caption_keys msgid "MM" msgstr "" #: edit_find_file_keys msgid "FF" msgstr "" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" #: install_launchProject msgid "Open the project now" msgstr "" #: settings_browser msgid "Preferred browser\\:" msgstr "" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" #: settings_country msgid "Country code\\:" msgstr "" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" #: settings_variant msgid "Variant\\:" msgstr "" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_ast.po000066400000000000000000000446571335566474600236120ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # Xandru Armesto , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-10-01 09:54+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Ficheru" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Pa facer esta operación hai qu'inxertar la contraseña d'alministración de " "JClic." #: m_Help msgid "Help" msgstr "Aida" #: m_Skin msgid "Skin" msgstr "Apariencia" #: action_helpAbout_caption msgid "About..." msgstr "Tocante a..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Biblioteca principal" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "¡Esti ficheru JClic nun ye una biblioteca de proyeutos!\n" "Les biblioteques son una triba especial de ficheros JClic." #: library_mainMenu msgid "Main menu" msgstr "Menú principal" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Biblioteca de proyeutos nueva" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "¿Quies criar una biblioteca nueva o coneutate a una yá esistente?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Coneutarse" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nueva" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Criar o coneutase a una biblioteca nueva" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nueva" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Imaxe del botón" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" "Testu flotante que va aparecer cuando se pose'l punteru sobro'l botón." #: menuElement_dlg_description msgid "Description:" msgstr "Descripción:" #: edit_find_image msgid "Find image..." msgstr "Guetar imaxe..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Iconu:" #: edit_find_file msgid "Find file..." msgstr "Guetar ficheru..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Allugamientu del proyeutu JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Proyeutu:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Testu del botón" #: edit_text msgid "Text:" msgstr "Testu:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nome de la carpeta" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nome de la biblioteca" #: edit_name msgid "Name:" msgstr "Nome:" #: edit_title msgid "Title:" msgstr "Títulu:" #: library_dlg_title msgid "Library properties" msgstr "Propiedaes de la biblioteca" #: menu_dlg_title msgid "Folder properties" msgstr "Propiedaes de la carpeta" #: menuElement_dlg_title msgid "Button properties" msgstr "Propiedaes del botón" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Esborrar el menú escoyíu" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Esborrar" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Esborrar l'elementu de menú escoyíu" #: action_libraries_caption msgid "Libraries..." msgstr "Biblioteques..." #: dlg_save_title msgid "Save file..." msgstr "Guardar ficheru..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Error al abrir \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Van emplegase los valores por defeutu." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Esborrar" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Criar un botón de proyeutu nuevu" #: menu_newMenuName msgid "New folder" msgstr "Carpeta Nueva" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Criar una carpeta de botones de proyeutu nueva" #: menu_newMenu_caption msgid "New button's folder" msgstr "Carpeta d'iconos nueva" #: menu_newMenuElement_caption msgid "New project button" msgstr "Botón nuevu de proyeutu" #: menu_newMenuElementName msgid "New button" msgstr "Botón nuevu" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Encaboxar les modificaciones" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Encaboxar" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Editar la biblioteca escoyida" #: libraryManager_edit_caption msgid "Edit" msgstr "Editar" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Guardar los cambeos" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Escoyer la carpeta seleicionada" #: library_select_caption_ok msgid "Ok" msgstr "Aceutar" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Seleicionar" #: library_caption msgid "JClic projects library" msgstr "Biblioteca de proyeutos JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Abrir la biblioteca seleicionada" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Encaboxar" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Encaboxar" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Seleicionar" #: libraryManager_caption msgid "Select library" msgstr "Seleición de la biblioteca de proyeutos" #: library_error_reading msgid "Error reading project library!" msgstr "¡Error al lleer la biblioteca de proyeutos!" #: wizard_next msgid "Next >" msgstr "Siguiente >" #: wizard_prev msgid "< Previous" msgstr "< Anterior" #: wizard_finish msgid "Finish" msgstr "Finar" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "¡Error al criar l'iconu na biblioteca!" #: install_title msgid "Installation of JClic projects" msgstr "Instalación de proyeutos JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Instalación de un proyeutu JClic nuevu" #: install_info_from msgid "From:" msgstr "Dende:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Encaboxar" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Encaboxar la operación" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Acabar la operación" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Siguiente pasu de la operación" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Pasu anterior de la operación" #: install_select_library msgid "Select the library where to install the project:" msgstr "Seleiciona la biblioteca na que se va instalar el proyeutu:" #: install_copy_files msgid "File copy" msgstr "Copia de ficheros" #: install_source msgid "Source:" msgstr "Orixe:" #: install_dest msgid "Destination:" msgstr "Destín:" #: install_status msgid "Status:" msgstr "Estáu:" #: install_start msgid "Start the installation" msgstr "Entamar la instalación" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Entamar la copia de ficheros al ordenador" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Progresu de la instalación" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Esperando confirmación." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Criando carpetes" #: install_msg_copying msgid "Copying file" msgstr "Copiando'l ficheru" #: install_msg_end msgid "Finished!" msgstr "¡Fináu!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Llimpiando..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "¡Instalación encaboxada!" #: install_error msgid "Install error!" msgstr "¡Hebo un fallu durante la instalación!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Seleiciona la carpeta na que se van crear los iconos del proyeutu:" #: install_library_folders msgid "Library folders:" msgstr "Carpetes de la biblioteca:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "El proyeutu instalóse dafechu!" #: install_success_2 msgid "In order to run it, select its" msgstr "Pa arrancalu seleiciona'l so" #: install_success_3 msgid "icon on the project library." msgstr "iconu na biblioteca de proyeutos." #: wizard_info msgid "Press \"Next\" to start." msgstr "Fai clic en \"Siguiente\" pa entamar." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Seleición de la biblioteca JClic" #: install_step_2 msgid "2. Download files" msgstr "2. Descarga de ficheros" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Creación d'iconos" #: install_step_4 msgid "Installation finished!" msgstr "¡Instalación finada!" #: install_info_info msgid "You request to install the project:" msgstr "Solicitó instalar el proyeutu:" #: settings_title msgid "Settings" msgstr "Configuración" #: library_error_clone msgid "Unable to clone library!" msgstr "¡Nun se pudo clonar la biblioteca!" #: settings_security msgid "Security" msgstr "Seguridá" #: settings_password_protect msgid "Protect settings with password" msgstr "Protexer los cambeos de configuración con contraseña" #: settings_new_password msgid "New password:" msgstr "Contraseña nueva:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Confirmar contraseña nueva:" #: settings_general msgid "General" msgstr "Xeneral" #: settings_look msgid "Look & Feel:" msgstr "Aspeutu:" #: settings_skin msgid "Skin:" msgstr "Piel:" #: settings_language msgid "Language:" msgstr "Llingua:" #: settings_reports msgid "Reports" msgstr "Informes" #: settings_report_use msgid "Write scores to a database" msgstr "Guardar los resultaos de les xeres nuna base de datos" #: settings_report_engine msgid "Reporter class:" msgstr "Clas:" #: settings_report_params msgid "Parameters:" msgstr "Parámetros:" #: settings_media msgid "Multimedia" msgstr "Multimedia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimedia activao" #: settings_media_system msgid "Multimedia system:" msgstr "Sistema multimedia:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Soníos d'eventu activaos" #: settings_library msgid "Libraries" msgstr "Biblioteques" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Amosar automáticamente la biblioteca nel aniciu" #: m_Tools msgid "Tools" msgstr "Ferramientes" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "F" #: m_Help_Mnemonic msgid "H" msgstr "A" #: m_Activity msgid "Activity" msgstr "Xera" #: m_Activity_Mnemonic msgid "A" msgstr "X" #: action_openFile_caption msgid "Open file..." msgstr "Abrir el ficheru..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Abrir un ficheru de proyeutu JClic" #: action_openFile_keys msgid "OO" msgstr "AO" #: action_openUrl_caption msgid "Open URL..." msgstr "Abrir una web..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Abrir un proyeutu JClic direutamente dende Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Colar" #: action_exit_tooltip msgid "Close JClic" msgstr "Zarrar JClic" #: action_exit_keys msgid "XX" msgstr "XC" #: action_settings_caption msgid "Settings..." msgstr "Configuración..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Axustar la configuración global del programa" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "C" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Abrir o camudar una biblioteca JClic" #: action_libraries_keys msgid "LL" msgstr "BB" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Información sobro JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "¡Esta imaxe ye enforma grande pa ser emplegada como iconu!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Conectase a un sirvidor d'informes JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Conexón direuta a una base de datos JDBC:" #: settings_report_other msgid "Other:" msgstr "Otros:" #: settings_report_address msgid "Host:" msgstr "Sirvidor:" #: settings_report_port msgid "Port:" msgstr "Puertu:" #: settings_report_driver msgid "Driver:" msgstr "Controlador:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Usuariu:" #: settings_report_pwd msgid "Password:" msgstr "Contraseña:" #: settings_report_options msgid "Reporter params::" msgstr "Parámetros:" #: settings_report_err_server msgid "Bad report server name!" msgstr "¡El nome del sirvidor d'informes ye incorreutu!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "¡Valor incorreutu del puertu! Por favor, conseña un valor ente 1000 y 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "¡Datos incorreutos pal sistema d'informes!" #: settings_report_type msgid "Reporting engine:" msgstr "Motor d'informes:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Deteición automática" #: settings_security_tooltip msgid "Security settings" msgstr "Opciones de seguridá" #: settings_report_tooltip msgid "Report system settings" msgstr "Configuración del sistema d'informes" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Configuración del sistema multimedia" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Opciones de llingua y aspeutu" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Configuración y edición de biblioteques" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Aspeutu del interfaz d'usuariu" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Seleición del diseñu gráficu de JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Seleición de la llingua" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Activa o desactiva la conexón a una base de datos d'informes JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Motor d'informes basáu nuna conexón TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Motor d'informes basáu nuna conexón direuta a una base de datos" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Otros motores d'informes..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nome o direición IP del sirvidor d'informes" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Puertu usáu pa la conexón (por defeutu: 5510)" #: edit_file msgid "File:" msgstr "Ficheru:" #: error_launchLibrary msgid "Error launching library" msgstr "Error al abrir la biblioteca" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "¡Instalando na carpeta orixe!" #: edit_find_media msgid "Find media file..." msgstr "Guetar recursu..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Esborrar" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Esborrar la referencia a la biblioteca seleicionada" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "" "¿De xuru que quies esborrar la referencia a la biblioteca seleicionada?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "¡Esta biblioteca yá s'alcuentra conectada al sistema!" #: edit_find_image_keys msgid "F*" msgstr "G*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Criar una biblioteca de proyeutos nueva" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Amestar un enllaz a una biblioteca yá esistente" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Ficheru o URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Biblioteca de proyeutos nueva" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "¡Por favor, escribi la URL o nome de ficheru de la biblioteca de proyeutos\\!" #: install_launchProject msgid "Open the project now" msgstr "Abrir agora'l proyeutu" #: settings_browser msgid "Preferred browser\\:" msgstr "Restolador preferíu\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comandu utilizáu p'arrancar el restolador (firefox, iexplore, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "Códigu de país\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Códigu opcional de dos lletres correspondiente a la variante llingüística " "d'un territoriu (ex.\\: BR pa portugués del Brasil)" #: settings_variant msgid "Variant\\:" msgstr "Variante\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Códigu opcional de variante de la llingua" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_bs.po000066400000000000000000000426131335566474600234150ustar00rootroot00000000000000# Bosnian translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-05-21 16:39+0000\n" "Last-Translator: Meliha Gadara \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Datoteka" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "JClic lozinka administratora je je potrebna za izvođenje ove operacije." #: m_Help msgid "Help" msgstr "Pomoć" #: m_Skin msgid "Skin" msgstr "Tema" #: action_helpAbout_caption msgid "About..." msgstr "O..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Glavna biblioteka" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Ova JClic datoteka nije projekt biblioteke!\n" "Biblioteke su posebna vrsta JClic projekata." #: library_mainMenu msgid "Main menu" msgstr "Glavni izbornik" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Novi projekat biblioteke" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "Želite li kreirati novu biblioteku ili se povezati s postojećeom?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Poveži se" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Novo" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Kreiraj ili se poveži s novom bibliotekom" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Novo" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" #: menuElement_dlg_description msgid "Description:" msgstr "Opis:" #: edit_find_image msgid "Find image..." msgstr "Nađi sliku..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Ikona:" #: edit_find_file msgid "Find file..." msgstr "Nađi datoteku..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Put do JClic projekta" #: menuElement_dlg_project msgid "Project:" msgstr "Projekt:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "" #: edit_text msgid "Text:" msgstr "Tekst:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Naziv foldera" #: library_dlg_name_tooltip msgid "Library name" msgstr "Naziv biblioteke" #: edit_name msgid "Name:" msgstr "Naziv:" #: edit_title msgid "Title:" msgstr "Naslov:" #: library_dlg_title msgid "Library properties" msgstr "Karakteristike biblioteke" #: menu_dlg_title msgid "Folder properties" msgstr "Karakteristike foldera" #: menuElement_dlg_title msgid "Button properties" msgstr "" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Obriši trenutni izbornik" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Obrisati" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Obrišite trenutni element izbornika" #: action_libraries_caption msgid "Libraries..." msgstr "Biblioteke..." #: dlg_save_title msgid "Save file..." msgstr "Spremii datoteku..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Greška pri otvaranju\"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Standardne vrijednosti će biti upotrebljivane." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Obrisati" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Kreirati novu prečicu za projekt" #: menu_newMenuName msgid "New folder" msgstr "Novi folder" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "" #: menu_newMenu_caption msgid "New button's folder" msgstr "" #: menu_newMenuElement_caption msgid "New project button" msgstr "" #: menu_newMenuElementName msgid "New button" msgstr "" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Otkaži promjene" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Odustani" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Uredi odabranu biblioteku" #: libraryManager_edit_caption msgid "Edit" msgstr "Uredi" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Spremi promjene" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Izaberi odabrani folder" #: library_select_caption_ok msgid "Ok" msgstr "Uredu" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Odaberi" #: library_caption msgid "JClic projects library" msgstr "JClic biblioteka projekata" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Otvori odabranu biblioteku" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Odustani" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Odustani" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Odaberi" #: libraryManager_caption msgid "Select library" msgstr "Odaberi biblioteku" #: library_error_reading msgid "Error reading project library!" msgstr "Greška prilikom čitanja projekta biblioteke!" #: wizard_next msgid "Next >" msgstr "Sljedeći >" #: wizard_prev msgid "< Previous" msgstr "< Prethodni" #: wizard_finish msgid "Finish" msgstr "Završi" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Greška prilikom kreiranja ikona biblioteke!" #: install_title msgid "Installation of JClic projects" msgstr "Instalacija JClic projekata" #: install_info_description msgid "Installation of a new JClic project" msgstr "Instalacija novog JClic projekata" #: install_info_from msgid "From:" msgstr "Od:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Odustani" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Otkaži radnju" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Završi radnju" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Sljedeći korak operacije" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Prethodni korak operacije" #: install_select_library msgid "Select the library where to install the project:" msgstr "Odaberite biblioteku gdje želite instalirati projekt:" #: install_copy_files msgid "File copy" msgstr "Kopija datoteke" #: install_source msgid "Source:" msgstr "Izvor:" #: install_dest msgid "Destination:" msgstr "Odredište:" #: install_status msgid "Status:" msgstr "Stanje:" #: install_start msgid "Start the installation" msgstr "Započni instalaciju" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Započnite kopiranje datoteka na vaš računar" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Tok instalacije" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Čekanje potvrde" #: install_msg_creating_dirs msgid "Creating directories" msgstr "Kreiranje direktorija" #: install_msg_copying msgid "Copying file" msgstr "Kopiranje datoteke" #: install_msg_end msgid "Finished!" msgstr "Završeno!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "" #: install_msg_cancel msgid "Installation cancelled!" msgstr "Instalacija otkazana!" #: install_error msgid "Install error!" msgstr "Greška pri instalaciji!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Odaberite folder gdje ćete smjestiti ikone projekta:" #: install_library_folders msgid "Library folders:" msgstr "Folderi biblioteke:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Projekt je instaliran na vaš sistem!" #: install_success_2 msgid "In order to run it, select its" msgstr "" #: install_success_3 msgid "icon on the project library." msgstr "ikona u biblioteci projekta" #: wizard_info msgid "Press \"Next\" to start." msgstr "Pritisni \"Sljedeće\" da početak" #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Izbor JClic biblioteke" #: install_step_2 msgid "2. Download files" msgstr "2. Preuzimanje datoteka" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Kreiranje ikona" #: install_step_4 msgid "Installation finished!" msgstr "Instalacija završena!" #: install_info_info msgid "You request to install the project:" msgstr "Zatražili ste instalaciju projekta:" #: settings_title msgid "Settings" msgstr "Podešavanja" #: library_error_clone msgid "Unable to clone library!" msgstr "Nije moguće kopirati biblioteku!" #: settings_security msgid "Security" msgstr "Sigurnost" #: settings_password_protect msgid "Protect settings with password" msgstr "Zaštitite podešavanja s lozinkom" #: settings_new_password msgid "New password:" msgstr "Nova lozinka:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Potvrdi novu lozinku:" #: settings_general msgid "General" msgstr "Općenito" #: settings_look msgid "Look & Feel:" msgstr "" #: settings_skin msgid "Skin:" msgstr "Maska:" #: settings_language msgid "Language:" msgstr "Jezik:" #: settings_reports msgid "Reports" msgstr "Izvještaji" #: settings_report_use msgid "Write scores to a database" msgstr "Zapišite rezultate u bazu podataka" #: settings_report_engine msgid "Reporter class:" msgstr "" #: settings_report_params msgid "Parameters:" msgstr "Parametri:" #: settings_media msgid "Multimedia" msgstr "Multimedija" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimedia omogućena" #: settings_media_system msgid "Multimedia system:" msgstr "Multimedia sistem:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Zvukovi događaja omogućeni" #: settings_library msgid "Libraries" msgstr "Biblioteke" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Automatski idi u biblioteke kada JClic započne" #: m_Tools msgid "Tools" msgstr "Alati" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Aktivnost" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Otvori datoteku..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Otvori datoteku JClic projekta" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Otvori URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Otvori JClic projekt direktno s Interneta" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Izlaz" #: action_exit_tooltip msgid "Close JClic" msgstr "Zatvori JClic" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Podešavanja..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Podesite globalne postavke programa" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Otvori ili uredi JClic biblioteku." #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Informacije o JClic-u" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Ova slika je previše velika da bi se koristila kao ikona!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Poveži se s JClic serverom izvještaja:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Direktna JDBC konekcija:" #: settings_report_other msgid "Other:" msgstr "Ostalo:" #: settings_report_address msgid "Host:" msgstr "Host:" #: settings_report_port msgid "Port:" msgstr "Priključak:" #: settings_report_driver msgid "Driver:" msgstr "Drajver:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Korisnik:" #: settings_report_pwd msgid "Password:" msgstr "Lozinka:" #: settings_report_options msgid "Reporter params::" msgstr "" #: settings_report_err_server msgid "Bad report server name!" msgstr "Pogrešan izvještaj imena poslužitelja!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Netačan broj za priključak! Molimo unesite vrijednost između 1000 i 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Netačan izvještaj sistemskih podataka!" #: settings_report_type msgid "Reporting engine:" msgstr "" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Automatsko detektiranje" #: settings_security_tooltip msgid "Security settings" msgstr "Podešavanja sigurnosti" #: settings_report_tooltip msgid "Report system settings" msgstr "Izvještaj o postavkama sistema" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Multimedija sistem opcije" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Podešavanja biblioteke i urednik" #: settings_look_tooltip msgid "User interface look & feel" msgstr "" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Odabir grafičkog aspekta JClic-a" #: settings_language_tooltip msgid "Language selection" msgstr "Odabir jezika" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Omogući/onemogući konekciju za JClic bazu podataka o izvještajima" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "" #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Izvještaj naziva poslužitelja ili IP adrese" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Priključak upotrebljavan za konekciju (standarno je 5510)" #: edit_file msgid "File:" msgstr "Datoteka:" #: error_launchLibrary msgid "Error launching library" msgstr "Greška pri pokretanju biblioteke" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Instaliranje izvornog foldera" #: edit_find_media msgid "Find media file..." msgstr "Nađi media datoteku..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Obrisati" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Obriši napomenu odabrane biblioteke" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Da li zaista želite obrisati napomenu odabrane biblioteke?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Ova biblioteka je već povezana na sistem." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Kreiraj novi projekt biblioteke" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Dodaj poveznicu za postojeći projekt biblioteke" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Datoteka ili URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Novi projekat biblioteke" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "Molimo unesite URL ili naziv datoteke od projekta biblioteke\\!" #: install_launchProject msgid "Open the project now" msgstr "Otvori projekt sada" #: settings_browser msgid "Preferred browser\\:" msgstr "Omiljeni preglednik\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Komande upotrebljene za pokretanje preglednika (firefox, iexplore, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Dodatna dva slova koda odgovaraju specifičnim varijantama jezika za svaku " "zemlju (npr. \\: BR za brazilski portugalski)" #: settings_variant msgid "Variant\\:" msgstr "Varijanta\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Dodatna varijanta koda jezika" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_ca.po000066400000000000000000000444311335566474600233740ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-01-22 18:02+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Fitxers" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Per a efectuar aquesta operació cal introduir la contrasenya " "d'administració del JClic." #: m_Help msgid "Help" msgstr "Ajuda" #: m_Skin msgid "Skin" msgstr "Aparença" #: action_helpAbout_caption msgid "About..." msgstr "Quant a..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Biblioteca principal" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Aquest fitxer JClic no és del tipus \"biblioteca de projectes\".\n" "Les biblioteques són un tipus especial de fitxers JClic." #: library_mainMenu msgid "Main menu" msgstr "Menú principal" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nova biblioteca de projectes" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "Voleu crear una nova biblioteca de projectes o connectar-vos a una llibreria " "existent?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Connectar-se a..." #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nova" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Crea una nova biblioteca o connecta't a una existent" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nova" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Imatge que es mostra al botó" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" "Text flotant que apareixerà quan es deixi el punter quiet sobre el botó." #: menuElement_dlg_description msgid "Description:" msgstr "Descripció:" #: edit_find_image msgid "Find image..." msgstr "Cerca imatge..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Icona:" #: edit_find_file msgid "Find file..." msgstr "Cerca fitxer..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Ubicació del projecte JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Projecte:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Text del botó" #: edit_text msgid "Text:" msgstr "Text:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nom de la carpeta" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nom de la biblioteca" #: edit_name msgid "Name:" msgstr "Nom:" #: edit_title msgid "Title:" msgstr "Títol:" #: library_dlg_title msgid "Library properties" msgstr "Propietats de la biblioteca" #: menu_dlg_title msgid "Folder properties" msgstr "Propietats de la carpeta" #: menuElement_dlg_title msgid "Button properties" msgstr "Propietats del botó" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Elimina el menú seleccionat" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Elimina" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Elimina l'element de menú seleccionat" #: action_libraries_caption msgid "Libraries..." msgstr "Biblioteques..." #: dlg_save_title msgid "Save file..." msgstr "Desa el fitxer..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Error en obrir \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". S'utilitzaran els valors per defecte." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Elimina" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Crea un nou botó de projecte" #: menu_newMenuName msgid "New folder" msgstr "Nova carpeta" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Crea una nova carpeta de botons de projecte" #: menu_newMenu_caption msgid "New button's folder" msgstr "Nova carpeta d'icones" #: menu_newMenuElement_caption msgid "New project button" msgstr "Nou botó de projecte" #: menu_newMenuElementName msgid "New button" msgstr "Nou botó" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Cancel·la les modificacions" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Cancel·la" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Edita la biblioteca seleccionada" #: libraryManager_edit_caption msgid "Edit" msgstr "Edita" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Desa els canvis" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Escull la carpeta seleccionada" #: library_select_caption_ok msgid "Ok" msgstr "D'acord" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Selecciona" #: library_caption msgid "JClic projects library" msgstr "Biblioteca de projectes JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Obre la biblioteca seleccionada" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Cancel·la" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Cancel·la" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Selecciona" #: libraryManager_caption msgid "Select library" msgstr "Selecció de la biblioteca de projectes" #: library_error_reading msgid "Error reading project library!" msgstr "Error en llegir la biblioteca de projectes!" #: wizard_next msgid "Next >" msgstr "Endavant >" #: wizard_prev msgid "< Previous" msgstr "< Enrere" #: wizard_finish msgid "Finish" msgstr "Finalitza" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Error en crear la icona a la biblioteca!" #: install_title msgid "Installation of JClic projects" msgstr "Instal·lació de projectes JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Instal·lació d'un nou projecte JClic" #: install_info_from msgid "From:" msgstr "Des de:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Cancel·la" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Cancel·la l'operació" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Finalitza l'operació" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Pas següent de l'operació" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Pas anterior de l'operació" #: install_select_library msgid "Select the library where to install the project:" msgstr "Seleccioneu la biblioteca on s'instal·larà el projecte:" #: install_copy_files msgid "File copy" msgstr "Còpia de fitxers" #: install_source msgid "Source:" msgstr "Origen:" #: install_dest msgid "Destination:" msgstr "Destí:" #: install_status msgid "Status:" msgstr "Estat:" #: install_start msgid "Start the installation" msgstr "Inicia la instal·lació" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Inicia la còpia de fitxers al vostre ordinador" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Progrés de la instal·lació" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Esperant confirmació." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Creant carpetes" #: install_msg_copying msgid "Copying file" msgstr "Copiant el fitxer" #: install_msg_end msgid "Finished!" msgstr "Acabat!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Fent neteja..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Instal·lació cancel·lada!" #: install_error msgid "Install error!" msgstr "S'ha produït un error durant la instal·lació!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Seleccioneu la carpeta on es crearan les icones del projecte:" #: install_library_folders msgid "Library folders:" msgstr "Carpetes de la biblioteca:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "El projecte s'ha instal·lat correctament!" #: install_success_2 msgid "In order to run it, select its" msgstr "Per a posar-lo en marxa seleccioneu la seva" #: install_success_3 msgid "icon on the project library." msgstr "icona a la biblioteca de projectes." #: wizard_info msgid "Press \"Next\" to start." msgstr "Feu clic a \"Endavant\" per començar." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Selecció de la biblioteca" #: install_step_2 msgid "2. Download files" msgstr "2. Descàrrega de fitxers" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Creació d'icones" #: install_step_4 msgid "Installation finished!" msgstr "Instal·lació acabada!" #: install_info_info msgid "You request to install the project:" msgstr "Heu sol·licitat instal·lar el projecte:" #: settings_title msgid "Settings" msgstr "Configuració" #: library_error_clone msgid "Unable to clone library!" msgstr "No s'ha pogut clonar la biblioteca!" #: settings_security msgid "Security" msgstr "Seguretat" #: settings_password_protect msgid "Protect settings with password" msgstr "Protegeix els canvis de configuració amb contrasenya" #: settings_new_password msgid "New password:" msgstr "Nova contrasenya:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Confirmació de la nova contrasenya:" #: settings_general msgid "General" msgstr "General" #: settings_look msgid "Look & Feel:" msgstr "Aspecte:" #: settings_skin msgid "Skin:" msgstr "Pell:" #: settings_language msgid "Language:" msgstr "Idioma:" #: settings_reports msgid "Reports" msgstr "Informes" #: settings_report_use msgid "Write scores to a database" msgstr "Enregistra els resultats de les activitats en una base de dades" #: settings_report_engine msgid "Reporter class:" msgstr "Classe:" #: settings_report_params msgid "Parameters:" msgstr "Paràmetres:" #: settings_media msgid "Multimedia" msgstr "Multimèdia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimèdia activat" #: settings_media_system msgid "Multimedia system:" msgstr "Sistema multimèdia:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Sons d'esdeveniment activats" #: settings_library msgid "Libraries" msgstr "Biblioteques" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Mostra automàticament la biblioteca a l'inici" #: m_Tools msgid "Tools" msgstr "Eines" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "E" #: m_Help_Mnemonic msgid "H" msgstr "J" #: m_Activity msgid "Activity" msgstr "Activitat" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Obre el fitxer..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Obre un fitxer de projecte JClic" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Obre una ubicació web..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Obre un projecte JClic directament des d'Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Surt" #: action_exit_tooltip msgid "Close JClic" msgstr "Tanca el JClic" #: action_exit_keys msgid "XX" msgstr "RX" #: action_settings_caption msgid "Settings..." msgstr "Configuració..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Ajusta les opcions globals del programa" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "C" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Obre o modifica una biblioteca JClic." #: action_libraries_keys msgid "LL" msgstr "BB" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Informació sobre el JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Aquesta imatge és massa gran per fer-la servir com a icona!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Connecta't a un servidor d'informes JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Connecta't directament a una base de dades JDBC:" #: settings_report_other msgid "Other:" msgstr "Altres:" #: settings_report_address msgid "Host:" msgstr "Servidor:" #: settings_report_port msgid "Port:" msgstr "Port:" #: settings_report_driver msgid "Driver:" msgstr "Controlador:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Usuari:" #: settings_report_pwd msgid "Password:" msgstr "Contrasenya:" #: settings_report_options msgid "Reporter params::" msgstr "Paràmetres:" #: settings_report_err_server msgid "Bad report server name!" msgstr "El nom del servidor d'informes és incorrecte!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Valor incorrecte del port en el sistema d'informes! Si us plau, indiqueu un " "valor entre 1000 i 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Dades incorrectes per al sistema d'informes!" #: settings_report_type msgid "Reporting engine:" msgstr "Sistema d'informes:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Detecció automàtica" #: settings_security_tooltip msgid "Security settings" msgstr "Opcions de seguretat" #: settings_report_tooltip msgid "Report system settings" msgstr "Configuració del sistema d'informes" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Configuració del sistema multimèdia" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Opcions d'idioma i aspecte" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Configuració i edició de biblioteques" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Aspecte de la interfície d'usuari" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Selecció del disseny gràfic del JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Selecció d'idioma" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Activa o desactiva la connexió a una base de dades d'informes JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Motor d'informes basat en una connexió TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Motor d'informes basat en una connexió directa a una base de dades" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Altres motors d'informes..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nom o adreça IP del servidor d'informes" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Port utilitzat en la connexió (per defecte: 5510)" #: edit_file msgid "File:" msgstr "Fitxer:" #: error_launchLibrary msgid "Error launching library" msgstr "Error en obrir la biblioteca" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Instal·lant a la carpeta d'origen!" #: edit_find_media msgid "Find media file..." msgstr "Cerca recurs..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Suprimeix" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Suprimeix la referència a la biblioteca seleccionada" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Realment voleu suprimir la referència a la biblioteca seleccionada?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Aquesta biblioteca ja està connectada al sistema." #: edit_find_image_keys msgid "F*" msgstr "C*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Crea una nova biblioteca de projectes" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Afegeix un enllaç a una biblioteca ja existent" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Fitxer o URL:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nova biblioteca de projectes:" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "Si us plau, escriviu l'URL o el nom de fitxer de la biblioteca de projectes " "a la qual voleu accedir\\!" #: install_launchProject msgid "Open the project now" msgstr "Obre ara el projecte" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferit:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Ordre emprada per a engegar el navegador (firefox, iexplore, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "Codi de país:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Codi opcional de dues lletres corresponent a la variant dialectal d'un " "territori (ex.: BR per a portuguès del Brasil)" #: settings_variant msgid "Variant\\:" msgstr "Variant:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Codi opcional de variant de l'idioma" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_cs.po000066400000000000000000000434341335566474600234200ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-03 10:57+0000\n" "Last-Translator: David Kolibáč \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Soubor" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "Pro vykonání operace je třeba heslo administrátora JClic." #: m_Help msgid "Help" msgstr "Nápověda" #: m_Skin msgid "Skin" msgstr "Motiv" #: action_helpAbout_caption msgid "About..." msgstr "O aplikaci..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Hlavní knihovna" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Tento JClic soubor není knihovna projektů!\n" "Knihovny jsou speciálním typem JClic projektů." #: library_mainMenu msgid "Main menu" msgstr "Hlavní nabídka" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nová knihovna projektu" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "Chcete vytvořit novou knihovnu nebo propojit s existující?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Připojit" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nová" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Vytvořit nebo propojit s novou knihovnou" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nový" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Ikona tlačítka" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "Popis tlačítka, použitý jako bublinová nápověda." #: menuElement_dlg_description msgid "Description:" msgstr "Popis:" #: edit_find_image msgid "Find image..." msgstr "Najít obrázek..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Ikona:" #: edit_find_file msgid "Find file..." msgstr "Najít soubor..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Cesta k projektu JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Projekt:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Text tlačítka" #: edit_text msgid "Text:" msgstr "Text:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Název složky" #: library_dlg_name_tooltip msgid "Library name" msgstr "Jméno knihovny" #: edit_name msgid "Name:" msgstr "Název:" #: edit_title msgid "Title:" msgstr "Titulek:" #: library_dlg_title msgid "Library properties" msgstr "Vlastnosti knihovny" #: menu_dlg_title msgid "Folder properties" msgstr "Vlastnosti složky" #: menuElement_dlg_title msgid "Button properties" msgstr "Vlastnosti tlačítka" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Smazat aktuální nabídku" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Smazat" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Smazat současnou položku nabídky" #: action_libraries_caption msgid "Libraries..." msgstr "Knihovny..." #: dlg_save_title msgid "Save file..." msgstr "Uložit soubor..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Chyba při otevírání \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Budou použity výchozí předvolby." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Smazat" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Vytvořte nového zástupce projektu" #: menu_newMenuName msgid "New folder" msgstr "Nová složka" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Vytvořte novou složku pro tlačítka projektu" #: menu_newMenu_caption msgid "New button's folder" msgstr "Nová složka pro tlačítka" #: menu_newMenuElement_caption msgid "New project button" msgstr "Nové tlačítko projektu" #: menu_newMenuElementName msgid "New button" msgstr "Nová tlačítko" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Zrušit změny" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Zrušit" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Upravit vybranou knihovnu" #: libraryManager_edit_caption msgid "Edit" msgstr "Upravit" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Uložit změny" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Vybrat zvolenou složku" #: library_select_caption_ok msgid "Ok" msgstr "Ok" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Vybrat" #: library_caption msgid "JClic projects library" msgstr "Knihovna projektů JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Otevřít vybranou knihovnu" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Zrušit" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Zrušit" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Vybrat" #: libraryManager_caption msgid "Select library" msgstr "Vybrat knihovnu" #: library_error_reading msgid "Error reading project library!" msgstr "Chyba při čtení knihovny projektu!" #: wizard_next msgid "Next >" msgstr "Další >" #: wizard_prev msgid "< Previous" msgstr "< Předchozí" #: wizard_finish msgid "Finish" msgstr "Dokončit" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Chyba při vytváření ikon knihovny!" #: install_title msgid "Installation of JClic projects" msgstr "Instalace JClic projektů" #: install_info_description msgid "Installation of a new JClic project" msgstr "Instalace nových JClic projektů" #: install_info_from msgid "From:" msgstr "Z:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Zrušit" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Zrušit operaci" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Dokončit operaci" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Následující krok operace" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Předchozí krok operace" #: install_select_library msgid "Select the library where to install the project:" msgstr "Vybrat knihovnu pro instalaci projektu:" #: install_copy_files msgid "File copy" msgstr "Kopírovat soubor" #: install_source msgid "Source:" msgstr "Zdroj:" #: install_dest msgid "Destination:" msgstr "Cíl:" #: install_status msgid "Status:" msgstr "Stav:" #: install_start msgid "Start the installation" msgstr "Start instalace" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Začínají se kopírovat soubory na váš počítač" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Průběh instalace" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Čeká se na potvrzení" #: install_msg_creating_dirs msgid "Creating directories" msgstr "Vytvářejí se složky" #: install_msg_copying msgid "Copying file" msgstr "Kopíruje se soubor" #: install_msg_end msgid "Finished!" msgstr "Hotovo!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Probíhá čištění..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Instalace zrušena!" #: install_error msgid "Install error!" msgstr "Chyba instalace!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Vyberte složku pro umístění ikon projektu:" #: install_library_folders msgid "Library folders:" msgstr "Složka knihoven:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Projekt je nyní nainstalován na vašem systému!" #: install_success_2 msgid "In order to run it, select its" msgstr "Pro spuštění ho vyberte" #: install_success_3 msgid "icon on the project library." msgstr "ikona knihovny projektu." #: wizard_info msgid "Press \"Next\" to start." msgstr "Stiskněte \"Další\" pro start." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Výběr JClic knihovny" #: install_step_2 msgid "2. Download files" msgstr "2. Stažení souborů" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Vytvoření ikon" #: install_step_4 msgid "Installation finished!" msgstr "Instalace dokončena!" #: install_info_info msgid "You request to install the project:" msgstr "Požadujete vytvoření projektu:" #: settings_title msgid "Settings" msgstr "Nastavení" #: library_error_clone msgid "Unable to clone library!" msgstr "Nelze naklonovat knihovnu!" #: settings_security msgid "Security" msgstr "Zabezpečení" #: settings_password_protect msgid "Protect settings with password" msgstr "Chránit nastavení heslem" #: settings_new_password msgid "New password:" msgstr "Nové heslo:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Potvrďte nové heslo:" #: settings_general msgid "General" msgstr "Obecné" #: settings_look msgid "Look & Feel:" msgstr "Vzhled:" #: settings_skin msgid "Skin:" msgstr "Motiv:" #: settings_language msgid "Language:" msgstr "Jazyk:" #: settings_reports msgid "Reports" msgstr "Sestavy" #: settings_report_use msgid "Write scores to a database" msgstr "Zapsat skóre do databáze" #: settings_report_engine msgid "Reporter class:" msgstr "Třída reportéra:" #: settings_report_params msgid "Parameters:" msgstr "Parametry:" #: settings_media msgid "Multimedia" msgstr "Multimédia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimédia povolena" #: settings_media_system msgid "Multimedia system:" msgstr "Systém multimédií:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Zvuky událostí povoleny" #: settings_library msgid "Libraries" msgstr "Knihovny" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Automaticky jít ke knihovnám při startu JClicu" #: m_Tools msgid "Tools" msgstr "Nástroje" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Aktivita" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Otevřít soubor..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Otevřít soubor JClic projektu" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Otevřít URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Otevřít JClic projekt přímo z internetu" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Ukončit" #: action_exit_tooltip msgid "Close JClic" msgstr "Uzavřít JClic" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Nastavení..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Upravit celková nastavení programu" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Otevřít nebo upravit JClic knihovnu." #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Informace o programu JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Tento obrázek je příliš velký na ikonu!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Připojit k JClic serveru sestav:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Přímé JDBC spojení:" #: settings_report_other msgid "Other:" msgstr "Jiný:" #: settings_report_address msgid "Host:" msgstr "Hostitel:" #: settings_report_port msgid "Port:" msgstr "Port:" #: settings_report_driver msgid "Driver:" msgstr "Ovladač:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Uživatel:" #: settings_report_pwd msgid "Password:" msgstr "Heslo:" #: settings_report_options msgid "Reporter params::" msgstr "Parametry reportéra:" #: settings_report_err_server msgid "Bad report server name!" msgstr "Špatné jméno serveru sestav!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "Špatné číslo portu! Vložte prosím hodnotu mezi 1000 a 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Nesprávná systémová data reportéra!" #: settings_report_type msgid "Reporting engine:" msgstr "Reportovací stroj:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Autodetekce" #: settings_security_tooltip msgid "Security settings" msgstr "Bezpečnostní nastavení" #: settings_report_tooltip msgid "Report system settings" msgstr "Systémové nastavení reportéra" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Nastavení multimediálního systému" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Nastavení jazyka a vzhledu" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Nastavení knihovny a editoru" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Vzhled uživatelského rozhraní" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Výběr grafického vzhledu JClicu" #: settings_language_tooltip msgid "Language selection" msgstr "Výběr jazyka" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Zapne/vypne spojení do databáze JClic sestav" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Stroj sestav založený na TCP/IP spojení" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Stroj sestav založený na přímém propojení s databází" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Ostatní stroje sestav..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Jméno serveru sestav nebo IP adresa" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Port použitý pro spojení (výchozí je 5510)" #: edit_file msgid "File:" msgstr "Soubor:" #: error_launchLibrary msgid "Error launching library" msgstr "Chyba při spouštění knihovny" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Instaluje se do zdrojové složky!" #: edit_find_media msgid "Find media file..." msgstr "Najít soubor s médii..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Smazat" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Smazat odkaz na vybranou knihovnu" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Opravdu chcete smazat odkaz na vybranou knihovnu?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Tato knihovna je už propojena se systémem." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Vytvořit novou knihovnu projektů" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Přidat odkaz na existující knihovnu projektů" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Soubor nebo URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nová knihovna projektu" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "Zadejte prosím URL nebo jméno souboru knihovny projektů\\!" #: install_launchProject msgid "Open the project now" msgstr "Otevřít projekt nyní" #: settings_browser msgid "Preferred browser\\:" msgstr "Upřednostňovaný prohlížeč\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Příkaz pro spuštění prohlížeče (firefox, iexplore, mozilla, opera...)" #: settings_country msgid "Country code\\:" msgstr "Kod země\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Volitelný dvoupísmenný kód odpovídající variantě jazyka specifické pro danou " "zemi (např.\\: BR pro brazilskou portugalštinu)" #: settings_variant msgid "Variant\\:" msgstr "Varianta\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Volitelná varianta kódu jazyka" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_de.po000066400000000000000000000435211335566474600234000ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2014-04-29 14:00+0000\n" "Last-Translator: Tobias Bannert \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Datei" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Zum Ausführen dieser Aktion sind nur JClick Administratoren berechtigt." #: m_Help msgid "Help" msgstr "Hilfe" #: m_Skin msgid "Skin" msgstr "Skin" #: action_helpAbout_caption msgid "About..." msgstr "Über …" #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Hauptbibliothek" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Diese JClic-Datei ist keine Projektbibliothek.\n" "Bibliotheken sind eine spezielle Art von JClick-Projekten." #: library_mainMenu msgid "Main menu" msgstr "Hauptmenü" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Neue Projektbibliothek" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "Möchten Sie eine neue Bibliothek erstellen oder Verbindung zu einer bereits\n" "vorhandenen Bibliothek herstellen" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Verbinden" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Neu" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Neue Bibliothek anlegen oder mit neuer Bibliothek verbinden" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Neu" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Symbol für Button:" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "Beschreibung des Buttons beim Darüberfahren mit der Maus" #: menuElement_dlg_description msgid "Description:" msgstr "Beschreibung:" #: edit_find_image msgid "Find image..." msgstr "Bild suchen …" #: menuElement_dlg_icon msgid "Icon:" msgstr "Symbol:" #: edit_find_file msgid "Find file..." msgstr "Datei suchen …" #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Verzeichnis des JClic-Projekts" #: menuElement_dlg_project msgid "Project:" msgstr "Projekt:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Text für Button" #: edit_text msgid "Text:" msgstr "Text:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Ordnername" #: library_dlg_name_tooltip msgid "Library name" msgstr "Name der Bibliothek" #: edit_name msgid "Name:" msgstr "Name:" #: edit_title msgid "Title:" msgstr "Titel:" #: library_dlg_title msgid "Library properties" msgstr "Eigenschaften der Bibliothek" #: menu_dlg_title msgid "Folder properties" msgstr "Ordnereigenschaften" #: menuElement_dlg_title msgid "Button properties" msgstr "Eigenschaften des Buttons" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Aktuelle Zusammenstellung löschen" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Löschen" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Aktuellen Menüpunkt löschen" #: action_libraries_caption msgid "Libraries..." msgstr "Bibliotheken …" #: dlg_save_title msgid "Save file..." msgstr "Datei speichern …" #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Fehler beim Öffnen \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Standardeinstellungen werden verwendet." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Löschen" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Neuen Shortcut zu Projekt anlegen" #: menu_newMenuName msgid "New folder" msgstr "Neuer Ordner" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Neuen Ordner für Projekt-Buttons anlegen" #: menu_newMenu_caption msgid "New button's folder" msgstr "Zu neuem Button gehörender Ordner" #: menu_newMenuElement_caption msgid "New project button" msgstr "Neuer Projektbutton" #: menu_newMenuElementName msgid "New button" msgstr "Neuer Button" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Änderungen nicht speichern" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Abbrechen" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Ausgewählte Bibliothek bearbeiten" #: libraryManager_edit_caption msgid "Edit" msgstr "Bearbeiten" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Änderungen speichern" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Ausgewählten Ordner öffnen" #: library_select_caption_ok msgid "Ok" msgstr "OK" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Auswählen" #: library_caption msgid "JClic projects library" msgstr "JClic Projektbibliothek" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Ausgewählte Bibliothek öffnen" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Abbrechen" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Abbrechen" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Auswählen" #: libraryManager_caption msgid "Select library" msgstr "Bibliothek auswählen" #: library_error_reading msgid "Error reading project library!" msgstr "Fehler beim Öffnen der Projektbibliothek!" #: wizard_next msgid "Next >" msgstr "Weiter >" #: wizard_prev msgid "< Previous" msgstr "< Zurück" #: wizard_finish msgid "Finish" msgstr "Beenden" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Fehler beim Erstellen der Symbole für Bibliothekt!" #: install_title msgid "Installation of JClic projects" msgstr "Installation von JClic-Projekten" #: install_info_description msgid "Installation of a new JClic project" msgstr "Neues JClic-Projekt installieren" #: install_info_from msgid "From:" msgstr "Quellordner:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Löschen" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Aktion löschen" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Aktion beenden" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Schritt weiter" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Schritt zurück" #: install_select_library msgid "Select the library where to install the project:" msgstr "Bibliothek auswählen, in der das Projekt installiert werden soll:" #: install_copy_files msgid "File copy" msgstr "Dateien kopieren" #: install_source msgid "Source:" msgstr "Quelle:" #: install_dest msgid "Destination:" msgstr "Zielordner:" #: install_status msgid "Status:" msgstr "Status:" #: install_start msgid "Start the installation" msgstr "Mit Installation beginnen" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Mit dem Kopieren der Dateien auf den Computer beginnen" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Installationsstatus" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Bestätigung abwarten." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Ordner werden angelegt" #: install_msg_copying msgid "Copying file" msgstr "Datei wird kopiert" #: install_msg_end msgid "Finished!" msgstr "Beendet!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Dateien werden gelöscht …" #: install_msg_cancel msgid "Installation cancelled!" msgstr "Installation abgebrochen!" #: install_error msgid "Install error!" msgstr "Installationsfehler!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Ordner für Projekt-Icons auswählen:" #: install_library_folders msgid "Library folders:" msgstr "Bibliotheksordner:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Projekt wurde erfolgreich auf Ihrem Computer installiert!" #: install_success_2 msgid "In order to run it, select its" msgstr "Zum Starten der Anwendung entsprechendes" #: install_success_3 msgid "icon on the project library." msgstr "Symbol aus Projektbibilothek auswählen" #: wizard_info msgid "Press \"Next\" to start." msgstr "Zum Starten \"Weiter\" anklicken." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. JClic-Bibliothek auswählen" #: install_step_2 msgid "2. Download files" msgstr "2. Dateien downloaden" #: install_step_3 msgid "3. Creation of icons" msgstr "4. Icons anlegen" #: install_step_4 msgid "Installation finished!" msgstr "Installation beendet!" #: install_info_info msgid "You request to install the project:" msgstr "Sie möchten folgendes Projekt installieren:" #: settings_title msgid "Settings" msgstr "Einstellungen" #: library_error_clone msgid "Unable to clone library!" msgstr "Bibliothek kann nicht geclont werden!" #: settings_security msgid "Security" msgstr "Sicherheit" #: settings_password_protect msgid "Protect settings with password" msgstr "Einstellungen durch Passwort schützen" #: settings_new_password msgid "New password:" msgstr "Neues Passwort:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Neues Passwort bestätigen:" #: settings_general msgid "General" msgstr "Allgemein" #: settings_look msgid "Look & Feel:" msgstr "Look & feel-Einstellungen:" #: settings_skin msgid "Skin:" msgstr "Skin:" #: settings_language msgid "Language:" msgstr "Sprache:" #: settings_reports msgid "Reports" msgstr "Reports" #: settings_report_use msgid "Write scores to a database" msgstr "Ergebnisse in Datenbank eintragen" #: settings_report_engine msgid "Reporter class:" msgstr "Class:" #: settings_report_params msgid "Parameters:" msgstr "Parameter:" #: settings_media msgid "Multimedia" msgstr "Multimedia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimediaeinstellungen aktiviert" #: settings_media_system msgid "Multimedia system:" msgstr "Multimediasystem:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Ereignissounds aktiviert" #: settings_library msgid "Libraries" msgstr "Bibliotheken" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Beim Starten von JClick automatisch zu den Bibliotheken gehen" #: m_Tools msgid "Tools" msgstr "Werkzeuge" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Übung" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Datei öffnen …" #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "JClick Projekt öffnen" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Adresse öffnen …" #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "JClick Projekt direkt im Internet öffnen" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Exit" #: action_exit_tooltip msgid "Close JClic" msgstr "JClic schließen" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Einstellungen …" #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Standardeinstellungen bearbeiten" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "JClic Bibliothek öffnen oder bearbeiten" #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Über JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Bild für die Verwendung als Symbol zu groß!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Mit JClic-Reportserver verbinden:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Direktverbindung zu JDBC:" #: settings_report_other msgid "Other:" msgstr "Andere:" #: settings_report_address msgid "Host:" msgstr "Host:" #: settings_report_port msgid "Port:" msgstr "Port:" #: settings_report_driver msgid "Driver:" msgstr "Treiber:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "User:" #: settings_report_pwd msgid "Password:" msgstr "Passwort:" #: settings_report_options msgid "Reporter params::" msgstr "Parameter für Report System:" #: settings_report_err_server msgid "Bad report server name!" msgstr "Falscher name für Reportserver." #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "Falscher Port. Bitte Wert zwischen 1000 und 65000 eingeben." #: settings_report_err msgid "Incorrect report system data!" msgstr "Falsche Eingabe für Reportsystem" #: settings_report_type msgid "Reporting engine:" msgstr "Reportsystem:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Auto-detect" #: settings_security_tooltip msgid "Security settings" msgstr "Sicherheitseinstellungen" #: settings_report_tooltip msgid "Report system settings" msgstr "Einstellungen für Reportsystem" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Multimedia-Optionen" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Spracheinstellungen und Erscheinungsbild" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Bibliothekseinstellungen und -editor" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Look & feel - Pannel starten" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "JClick-Design auswählen" #: settings_language_tooltip msgid "Language selection" msgstr "Sprachauswahl" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Verbindung zu JClic-Report-Datenbank aktivieren/deaktivieren" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Reportserver basiert auf TCP/IP-Verbindung" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Reporterstellung über Direktverbingung zu Datenbank" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Andere Berichtmaschinen …" #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Servername oder IP-Adresse eingeben" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Port für Verbindung (Default-Einstellung: 5510)" #: edit_file msgid "File:" msgstr "Datei:" #: error_launchLibrary msgid "Error launching library" msgstr "Fehler beim Öffnen der Bibliothek" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "In den Quellordner installieren!" #: edit_find_media msgid "Find media file..." msgstr "Multimediadatei suchen …" #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Löschen" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Link auf die ausgewählte Bibliothek löschen" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "" "Möchten Sie den Link auf die ausgewählte Bibliothek wirklich löschen?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Bibliothek bereits ins System integriert." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Neue Projektbibliothek anlegen" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Link auf eine bereits vorhandene Projektbibliothek legen" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Datei oder URL:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Neue Projektbibliothek" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "URL oder Namen der Projektbibliothek angeben!" #: install_launchProject msgid "Open the project now" msgstr "Projekt jetzt öffnen" #: settings_browser msgid "Preferred browser\\:" msgstr "Bevorzugter Browser\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Befehl zum Starten des Browsers (firefox, iexplore, mozilla, opera, …)" #: settings_country msgid "Country code\\:" msgstr "Country code\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" #: settings_variant msgid "Variant\\:" msgstr "Variant\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Optional variant code of the language" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_el.po000066400000000000000000000542351335566474600234140ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-10-17 18:31+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Αρχείο" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Ο κωδικός πρόσβασης του διαχειριστή του JClic είναι απαραίτητος για να " "ολοκληρωθεί αυτή η λειτουργία." #: m_Help msgid "Help" msgstr "Βοήθεια" #: m_Skin msgid "Skin" msgstr "Θέμα" #: action_helpAbout_caption msgid "About..." msgstr "Σχετικά..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Κύρια βιβλιοθήκη" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "Αυτό το αρχείο του JClic δεν είναι μια βιβλιοθήκη του έργου!" #: library_mainMenu msgid "Main menu" msgstr "Κύριο Μενού" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Νέα βιβλιοθήκη του έργου" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "Θέλετε να δημιουργήσετε μια νέα βιβλιοθήκη ή να συνδεθείτε σε μια υπάρχουσα;" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Σύνδεση" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Νέο" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Δημιουργία ή σύνδεση με μια νέα βιβλιοθήκη" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Νέο" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Εικονίδιο πλήκτρου" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" "Περιγραφή του πλήκτρου που χρησιμοποιείται ως επεξηγηματικό κείμενο ." #: menuElement_dlg_description msgid "Description:" msgstr "Περιγραφή:" #: edit_find_image msgid "Find image..." msgstr "Αναζήτηση εικόνας..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Εικονίδιο:" #: edit_find_file msgid "Find file..." msgstr "Αναζήτηση αρχείου..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Διαδρομή για έργο του JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Έργο:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Πλήκτρο κειμένου" #: edit_text msgid "Text:" msgstr "Κείμενο:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Όνομα φακέλου" #: library_dlg_name_tooltip msgid "Library name" msgstr "Όνομα βιβλιοθήκης" #: edit_name msgid "Name:" msgstr "Όνομα:" #: edit_title msgid "Title:" msgstr "Τίτλος:" #: library_dlg_title msgid "Library properties" msgstr "Ιδιότητες βιβλιοθήκης" #: menu_dlg_title msgid "Folder properties" msgstr "Ιδιότητες φακέλου" #: menuElement_dlg_title msgid "Button properties" msgstr "Ιδιότητες πλήκτρου" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Διαγραφή τρέχοντος μενού" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Διαγραφή" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Διαγραφή στοιχείου τρέχοντος μενού" #: action_libraries_caption msgid "Libraries..." msgstr "Βιβλιοθήκες..." #: dlg_save_title msgid "Save file..." msgstr "Αποθήκευση αρχείου..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Σφάλμα ανοίγματος \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Θα χρησιμοποιηθούν τα προκαθορισμένα" #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Διαγραφή" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Δημιουργία νέας συντόμευσης για το έργο" #: menu_newMenuName msgid "New folder" msgstr "Νέος φάκελος" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Δημιουργία νέου φακέλου για τα πλήκτρα του έργου" #: menu_newMenu_caption msgid "New button's folder" msgstr "Νέος φάκελος πλήκτρων" #: menu_newMenuElement_caption msgid "New project button" msgstr "Νέο πλήκτρο έργου" #: menu_newMenuElementName msgid "New button" msgstr "Νέο πλήκτρο" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Ακύρωση αλλαγών" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Άκυρο" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Επεξεργασία επιλεγμένης βιβλιοθήκης" #: libraryManager_edit_caption msgid "Edit" msgstr "Επεξεργασία" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Αποθήκευση αλλαγών" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Διάλεξε τον επιλεγμένο φάκελο" #: library_select_caption_ok msgid "Ok" msgstr "Εντάξει" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Επιλογή" #: library_caption msgid "JClic projects library" msgstr "Βιβλιοθήκη έργου του JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Άνοιγμα της επιλεγμένης δραστηριότητας" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Άκυρο" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Άκυρο" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Επιλογή" #: libraryManager_caption msgid "Select library" msgstr "Επιλογή βιβλιοθήκης" #: library_error_reading msgid "Error reading project library!" msgstr "Σφάλμα ανάγνωσης της βιβλιοθήκης του έργου!" #: wizard_next msgid "Next >" msgstr "Επόμενο >" #: wizard_prev msgid "< Previous" msgstr "<Προηγούμενο" #: wizard_finish msgid "Finish" msgstr "Τέλος" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Σφάλμα κατά τη δημιουργία εικονιδίων βιβλιοθήκης!" #: install_title msgid "Installation of JClic projects" msgstr "Εγκατάσταση έργων του JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Εγκατάσταση νέου έργου του JClic" #: install_info_from msgid "From:" msgstr "Από:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Άκυρο" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Ακύρωση της ενέργειας" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Ολοκλήρωση της ενέργειας" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Επόμενο βήμα της ενέργειας" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Προηγούμενο βήμα της ενέργειας" #: install_select_library msgid "Select the library where to install the project:" msgstr "Επιλογή βιβλιοθήκης για εγκατάσταση του έργου:" #: install_copy_files msgid "File copy" msgstr "Αντιγραφή αρχείου" #: install_source msgid "Source:" msgstr "Πηγή:" #: install_dest msgid "Destination:" msgstr "Προορισμός:" #: install_status msgid "Status:" msgstr "Κατάσταση:" #: install_start msgid "Start the installation" msgstr "Έναρξη εγκατάστασης" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Έναρξη αντιγραφής αρχείων στον υπολογιστή σας" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Πρόοδος της εγκατάστασης" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Αναμονή για επιβεβαίωση" #: install_msg_creating_dirs msgid "Creating directories" msgstr "Δημιουργία φακέλων" #: install_msg_copying msgid "Copying file" msgstr "Αντιγραφή αρχείου" #: install_msg_end msgid "Finished!" msgstr "Ολοκληρώθηκε!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Εκτέλεση καθαρισμού..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Η εγκατάσταση ακυρώθηκε!" #: install_error msgid "Install error!" msgstr "Σφάλμα εγκατάστασης" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Επιλογή φακέλου για τοποθέτηση των εικονιδίων του έργου:" #: install_library_folders msgid "Library folders:" msgstr "Φάκελοι βιβλιοθήκης:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Το έργο είναι τώρα εγκατεστημένο στον υπολογιστή σας!" #: install_success_2 msgid "In order to run it, select its" msgstr "Για να το εκτελέσετε, επιλέξτε" #: install_success_3 msgid "icon on the project library." msgstr "εικονίδιο στη βιβλιοθήκη του έργου" #: wizard_info msgid "Press \"Next\" to start." msgstr "Πατήστε \"Επόμενο\" για να ξεκινήσετε." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Επιλογή βιβλιοθήκης του JClic" #: install_step_2 msgid "2. Download files" msgstr "2. Μεταφόρτωση αρχείων" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Δημιουργία εικονιδίων" #: install_step_4 msgid "Installation finished!" msgstr "Η εγκατάσταση ολοκληρώθηκε!" #: install_info_info msgid "You request to install the project:" msgstr "Ζητήσατε να εγκατασταθεί το έργο:" #: settings_title msgid "Settings" msgstr "Ρυθμίσεις" #: library_error_clone msgid "Unable to clone library!" msgstr "Αδυναμία κλωνοποίησης της βιβλιοθήκης!" #: settings_security msgid "Security" msgstr "Ασφάλεια" #: settings_password_protect msgid "Protect settings with password" msgstr "Προστασία ρυθμίσεων με κωδικό πρόσβασης" #: settings_new_password msgid "New password:" msgstr "Νέος κωδικός πρόσβασης:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Επιβεβαίωση νέου κωδικού πρόσβασης:" #: settings_general msgid "General" msgstr "Γενικά" #: settings_look msgid "Look & Feel:" msgstr "Εμφάνιση & Αίσθηση:" #: settings_skin msgid "Skin:" msgstr "Θέμα:" #: settings_language msgid "Language:" msgstr "Γλώσσα:" #: settings_reports msgid "Reports" msgstr "Αναφορές" #: settings_report_use msgid "Write scores to a database" msgstr "Εγγραφή βαθμολογίας σε μια βάση δεδομένων" #: settings_report_engine msgid "Reporter class:" msgstr "Είδος δημιουργού αναφορών:" #: settings_report_params msgid "Parameters:" msgstr "Παράμετροι:" #: settings_media msgid "Multimedia" msgstr "Πολυμέσα" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Ενεργοποίηση πολυμέσων" #: settings_media_system msgid "Multimedia system:" msgstr "Σύστημα πολυμέσων:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Ενεργοποίηση ήχων συμβάντων" #: settings_library msgid "Libraries" msgstr "Βιβλιοθήκες" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Αυτόματη μετάβαση στις βιβλιοθήκες όταν ξεκινά το JClic" #: m_Tools msgid "Tools" msgstr "Εργαλεία" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Δραστηριότητα" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Άνοιγμα αρχείου..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Άνοιγμα αρχείου έργου του JClic" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Άνοιγμα URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Άνοιγμα έργου του JClic κατευθείαν από το Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Έξοδος" #: action_exit_tooltip msgid "Close JClic" msgstr "Κλείσιμο του JClic" #: action_exit_keys msgid "XX" msgstr "ΧΧ" #: action_settings_caption msgid "Settings..." msgstr "Ρυθμίσεις..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Διευθέτηση καθολικών ρυθμίσεων του προγράμματος" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Άνοιγμα ή επεξεργασία μιας βιβλιοθήκης του JClic." #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Πληροφορίες για το JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Αυτή η εικόνα είναι πολύ μεγάλη για να χρησιμοποιηθεί ως εικονίδιο!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Σύνδεση στο διακομιστή αναφορών του JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Απευθείας σύνδεση στη JDBC:" #: settings_report_other msgid "Other:" msgstr "Άλλο:" #: settings_report_address msgid "Host:" msgstr "Διακομιστής:" #: settings_report_port msgid "Port:" msgstr "Θύρα:" #: settings_report_driver msgid "Driver:" msgstr "Οδηγός:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Χρήστης:" #: settings_report_pwd msgid "Password:" msgstr "Κωδικός πρόσβασης:" #: settings_report_options msgid "Reporter params::" msgstr "Παράμετροι εργαλείου αναφορών" #: settings_report_err_server msgid "Bad report server name!" msgstr "Λανθασμένο όνομα διακομιστή αναφορών!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Λανθασμένος αριθμός θύρας! Παρακαλώ εισάγετε μια τιμή μεταξύ 1000 και 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Λανθασμένα δεδομένα αναφοράς συστήματος" #: settings_report_type msgid "Reporting engine:" msgstr "Μηχανή αναφορών:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Αυτόματη αναγνώριση" #: settings_security_tooltip msgid "Security settings" msgstr "Ρυθμίσεις ασφάλειας" #: settings_report_tooltip msgid "Report system settings" msgstr "Ρυθμίσεις συστήματος αναφορών" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Επιλογές συστήματος πολυμέσων" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Ρυθμίσεις γλώσσας και αναλογιών" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Ρυθμίσεις βιβλιοθήκης και επεξεργαστής" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Διεπαφή χρήστη Εμφάνιση & Αίσθηση" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Επιλογή αναλογίας γραφικών για το JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Επιλογή γλώσσας" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Ενεργοποίηση/Απενεργοποίηση σύνδεσης σε μια βάση δεδομένων του JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Μηχανή αναφορών βασιζόμενη σε μια σύνδεση TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "" "Μηχανή αναφορών βασιζόμενη σε απευθείας σύνδεση με μια βάση δεδομένων" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Άλλες μηχανές αναφορών..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Όνομα διακομιστή αναφορών ή διεύθυνση IP" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "" "Θύρα που χρησιμοποιείται για τη σύνδεση (η προεπιλεγμένη είναι η 5510)" #: edit_file msgid "File:" msgstr "Αρχείο:" #: error_launchLibrary msgid "Error launching library" msgstr "Σφάλμα φόρτωσης βιβλιοθήκης" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Εγκατάσταση στον πηγαίο φάκελο!" #: edit_find_media msgid "Find media file..." msgstr "Εύρεση αρχείου πολυμέσων..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Διαγραφή" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Διαγραφή παραπομπής στην επιλεγμένη βιβλιοθήκη" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "" "Θέλετε πραγματικά να διαγράψετε την παραπομπή στην επιλεγμένη βιβλιοθήκη;" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Αυτή η βιβλιοθήκη είναι ακόμη συνδεδεμένη με το σύστημα..." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Δημιουργία νέας βιβλιοθήκης έργου" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Προσθήκη υπερσυνδέσμου σε μια υπάρχουσα βιβλιοθήκη του έργου" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Αρχείο ή URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Νέα βιβλιοθήκη έργου" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "Παρακαλώ εισάγετε το URL ή το όνομα αρχείου της βιβλιοθήκης του έργου\\:" #: install_launchProject msgid "Open the project now" msgstr "Άνοιγμα του έργου τώρα" #: settings_browser msgid "Preferred browser\\:" msgstr "Προτιμώμενος φυλλομετρητής\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Εντολή που χρησιμοποιείται για τη φόρτωση φυλλομετρητή (firefox, mozilla, " "opera, iexplore...)" #: settings_country msgid "Country code\\:" msgstr "Κωδικός χώρας\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Προαιρετικός διγράμματος κωδικός που αντιστοιχεί σε συγκεκριμένη εκδοχή μιας " "γλώσσας (π.χ.\\: BR για τα Πορτογαλικά της Βραζιλίας)" #: settings_variant msgid "Variant\\:" msgstr "Εναλλακτική μορφή" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Προαιρετικός κωδικός εκδοχής της γλώσσας" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_es.po000066400000000000000000000446171335566474600234260ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-11 17:51+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Archivo" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Para efectuar esta operación hay que introducir la contraseña de " "administración de JClic." #: m_Help msgid "Help" msgstr "Ayuda" #: m_Skin msgid "Skin" msgstr "Apariencia" #: action_helpAbout_caption msgid "About..." msgstr "Acerca de..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Biblioteca principal" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Este archivo JClic no es del tipo \"biblioteca de proyectos\".\n" "Las bibliotecas son un tipo especial de archivos JClic." #: library_mainMenu msgid "Main menu" msgstr "Menú principal" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nueva biblioteca de proyectos" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "¿Desea crear una nueva biblioteca o conectarse a una biblioteca existente?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Conectarse" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nueva" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Crear o conectarse a una nueva biblioteca" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nueva" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Imagen que se muestra en el botón" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" "Texto flotante que aparecerá cuando se deje el puntero quieto sobre el botón." #: menuElement_dlg_description msgid "Description:" msgstr "Descripción:" #: edit_find_image msgid "Find image..." msgstr "Buscar imagen..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Icono:" #: edit_find_file msgid "Find file..." msgstr "Buscar archivo..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Ubicación del proyecto JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Proyecto:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Texto del botón" #: edit_text msgid "Text:" msgstr "Texto:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nombre de la carpeta" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nombre de la biblioteca" #: edit_name msgid "Name:" msgstr "Nombre:" #: edit_title msgid "Title:" msgstr "Título:" #: library_dlg_title msgid "Library properties" msgstr "Propiedades de la biblioteca" #: menu_dlg_title msgid "Folder properties" msgstr "Propiedades de la carpeta" #: menuElement_dlg_title msgid "Button properties" msgstr "Propiedades del botón" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Eliminar el menú seleccionado" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Eliminar" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Eliminar el elemento de menú seleccionado" #: action_libraries_caption msgid "Libraries..." msgstr "Bibliotecas..." #: dlg_save_title msgid "Save file..." msgstr "Guardar archivo..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Error al abrir \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Se utilizaran los valores por defecto." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Eliminar" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Crear un nuevo botón de proyecto" #: menu_newMenuName msgid "New folder" msgstr "Nueva carpeta" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Crear una nueva carpeta de botones de proyecto" #: menu_newMenu_caption msgid "New button's folder" msgstr "Nueva carpeta de iconos" #: menu_newMenuElement_caption msgid "New project button" msgstr "Nuevo botón de proyecto" #: menu_newMenuElementName msgid "New button" msgstr "Nuevo botón" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Cancelar las modificaciones" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Cancelar" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Editar la biblioteca seleccionada" #: libraryManager_edit_caption msgid "Edit" msgstr "Editar" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Guardar los cambios" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Elegir la carpeta seleccionada" #: library_select_caption_ok msgid "Ok" msgstr "Aceptar" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Seleccionar" #: library_caption msgid "JClic projects library" msgstr "Biblioteca de proyectos JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Abrir la biblioteca seleccionada" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Cancelar" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Cancelar" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Seleccionar" #: libraryManager_caption msgid "Select library" msgstr "Selección de la biblioteca de proyectos" #: library_error_reading msgid "Error reading project library!" msgstr "¡Error al leer la biblioteca de proyectos!" #: wizard_next msgid "Next >" msgstr "Siguiente >" #: wizard_prev msgid "< Previous" msgstr "< Anterior" #: wizard_finish msgid "Finish" msgstr "Finalizar" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "¡Error al crear el icono en la biblioteca!" #: install_title msgid "Installation of JClic projects" msgstr "Instalación de proyectos JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Instalación de un nuevo proyecto JClic" #: install_info_from msgid "From:" msgstr "Desde:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Cancelar" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Cancelar la operación" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Finalizar la operación" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Siguiente paso de la operación" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Paso anterior de la operación" #: install_select_library msgid "Select the library where to install the project:" msgstr "Seleccione la biblioteca en la que se instalará el proyecto:" #: install_copy_files msgid "File copy" msgstr "Copia de archivos" #: install_source msgid "Source:" msgstr "Origen:" #: install_dest msgid "Destination:" msgstr "Destino:" #: install_status msgid "Status:" msgstr "Estado:" #: install_start msgid "Start the installation" msgstr "Iniciar la instalación" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Iniciar la copia de archivos a su ordenador" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Progreso de la instalación" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Esperando confirmación." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Creando carpetas" #: install_msg_copying msgid "Copying file" msgstr "Copiando el archivo" #: install_msg_end msgid "Finished!" msgstr "¡Acabado!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Limpiando..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "¡Instalación cancelada!" #: install_error msgid "Install error!" msgstr "¡Se produjo un error durante la instalación!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Seleccione la carpeta en la que se crearán los iconos del proyecto:" #: install_library_folders msgid "Library folders:" msgstr "Carpetas de la biblioteca:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "El proyecto se instaló correctamente!" #: install_success_2 msgid "In order to run it, select its" msgstr "Para ponerlo en marcha seleccione su" #: install_success_3 msgid "icon on the project library." msgstr "icono en la biblioteca de proyectos." #: wizard_info msgid "Press \"Next\" to start." msgstr "Haga clic en \"Siguiente\" para empezar." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Selección de la biblioteca" #: install_step_2 msgid "2. Download files" msgstr "2. Descarga de archivos" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Creación de iconos" #: install_step_4 msgid "Installation finished!" msgstr "¡Instalación acabada!" #: install_info_info msgid "You request to install the project:" msgstr "Ha solicitado instalar el proyecto:" #: settings_title msgid "Settings" msgstr "Configuración" #: library_error_clone msgid "Unable to clone library!" msgstr "¡No se ha podido clonar la biblioteca!" #: settings_security msgid "Security" msgstr "Seguridad" #: settings_password_protect msgid "Protect settings with password" msgstr "Proteger los cambios de configuración con contraseña" #: settings_new_password msgid "New password:" msgstr "Nueva contraseña:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Confirmar nueva contraseña:" #: settings_general msgid "General" msgstr "General" #: settings_look msgid "Look & Feel:" msgstr "Aspecto:" #: settings_skin msgid "Skin:" msgstr "Piel:" #: settings_language msgid "Language:" msgstr "Idioma:" #: settings_reports msgid "Reports" msgstr "Informes" #: settings_report_use msgid "Write scores to a database" msgstr "Guardar los resultados de las actividades en una base de datos" #: settings_report_engine msgid "Reporter class:" msgstr "Clase:" #: settings_report_params msgid "Parameters:" msgstr "Parámetros:" #: settings_media msgid "Multimedia" msgstr "Multimedia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimedia activado" #: settings_media_system msgid "Multimedia system:" msgstr "Sistema multimedia:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Sonidos de evento activados" #: settings_library msgid "Libraries" msgstr "Bibliotecas" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Mostrar automáticamente la biblioteca al inicio" #: m_Tools msgid "Tools" msgstr "Herramientas" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "H" #: m_Help_Mnemonic msgid "H" msgstr "Y" #: m_Activity msgid "Activity" msgstr "Actividad" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Abrir el archivo..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Abrir un archivo de proyecto JClic" #: action_openFile_keys msgid "OO" msgstr "AO" #: action_openUrl_caption msgid "Open URL..." msgstr "Abrir una ubicación web..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Abrir un proyecto JClic directamente desde Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Salir" #: action_exit_tooltip msgid "Close JClic" msgstr "Cerrar el JClic" #: action_exit_keys msgid "XX" msgstr "LX" #: action_settings_caption msgid "Settings..." msgstr "Configuración..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Ajustar las opciones globales del programa" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "C" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Abrir o modificar una biblioteca JClic" #: action_libraries_keys msgid "LL" msgstr "BB" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Información sobre el JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "¡Esta imagen es demasiado grande para ser utilizada como icono!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Conectarse a un servidor de informes JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Conexión directa a una base de datos JDBC:" #: settings_report_other msgid "Other:" msgstr "Otros:" #: settings_report_address msgid "Host:" msgstr "Servidor:" #: settings_report_port msgid "Port:" msgstr "Puerto:" #: settings_report_driver msgid "Driver:" msgstr "Controlador:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Usuario:" #: settings_report_pwd msgid "Password:" msgstr "Contraseña:" #: settings_report_options msgid "Reporter params::" msgstr "Parámetros:" #: settings_report_err_server msgid "Bad report server name!" msgstr "¡El nombre del servidor de informes es incorrecto!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Valor incorrecto del puerto en el sistema de informes. Por favor, indique un " "valor entre 1000 y 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "¡Datos incorrectos para el sistema de informes!" #: settings_report_type msgid "Reporting engine:" msgstr "Reporter type:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Detección automática" #: settings_security_tooltip msgid "Security settings" msgstr "Opciones de seguridad" #: settings_report_tooltip msgid "Report system settings" msgstr "Configuración del sistema de informes" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Configuración del sistema multimedia" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Opciones de idioma y aspecto" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Configuración y edición de bibliotecas" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Aspecto del interfaz de usuario" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Selección del diseño gráfico de JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Selección del idioma" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Activa o desactiva a conexión a una base de datos de informes JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Motor de informes basado en una conexión TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Motor de informes basado en una conexión directa a una base de datos" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Otros motores de informes..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nombre o dirección IP del servidor de informes" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Puerto usado para la conexión (por defecto: 5510)" #: edit_file msgid "File:" msgstr "Archivo:" #: error_launchLibrary msgid "Error launching library" msgstr "Error al abrir la biblioteca" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "¡Instalando en la carpeta origen!" #: edit_find_media msgid "Find media file..." msgstr "Buscar recurso..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Suprimir" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Suprimir la referencia a la biblioteca seleccionada" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "" "¿Realmente desea suprimir la referencia a la biblioteca seleccionada?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "¡Esta biblioteca se encuentra ya conectada al sistema!" #: edit_find_image_keys msgid "F*" msgstr "B*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Crear una nueva biblioteca de proyectos" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Añadir un enlace a una biblioteca ya existente" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Archivo o URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nueva biblioteca de proyectos" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "Por favor, escriba el URL o nombre de archivo de la biblioteca de proyectos " "a la que desea acceder." #: install_launchProject msgid "Open the project now" msgstr "Abrir ahora el proyecto" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferido\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Orden utilizada para lanzar el navegador (firefox, iexplore, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "Código de país\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Código opcional de dos letras correspondiente a la variante dialectal de un " "territorio (ej.\\: BR para portugués del Brasil)" #: settings_variant msgid "Variant\\:" msgstr "Variante\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Código opcional de variante del idioma" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_eu.po000066400000000000000000000441421335566474600234210ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-02-18 16:25+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Fitxategia" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "JClic kudeatzaile-pasahitza behar da ekintza hau burutzeko." #: m_Help msgid "Help" msgstr "Laguntza" #: m_Skin msgid "Skin" msgstr "Itxura" #: action_helpAbout_caption msgid "About..." msgstr "Honi buruz..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Liburutegi nagusia" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "JClic fitxategi hau ez da proiektu-liburutegia!\n" "Liburutegiak JClic proiektu-mota berezia dira." #: library_mainMenu msgid "Main menu" msgstr "Menu nagusia" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Proiektu-liburutegi berria" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "Liburutegi berria sortu nahi duzu edo lehendik dagoen batera konektatu?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Konektatu" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Berria" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Liburutegi berria sortu edo konektatu" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Berria" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Botoiaren irudia" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "Punteroa botoiaren gainean geldituta agertuko den testua." #: menuElement_dlg_description msgid "Description:" msgstr "Deskribapena:" #: edit_find_image msgid "Find image..." msgstr "Bilatu irudia..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Ikonoa:" #: edit_find_file msgid "Find file..." msgstr "Bilatu fitxategia..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "JClic proiektuaren kokapena" #: menuElement_dlg_project msgid "Project:" msgstr "Proiektua:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Botoiaren testua" #: edit_text msgid "Text:" msgstr "Testua:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Direktorioaren izena" #: library_dlg_name_tooltip msgid "Library name" msgstr "Liburutegiaren izena" #: edit_name msgid "Name:" msgstr "Izena:" #: edit_title msgid "Title:" msgstr "Izenburua:" #: library_dlg_title msgid "Library properties" msgstr "Liburutegiaren propietateak" #: menu_dlg_title msgid "Folder properties" msgstr "Direktorioaren propietateak" #: menuElement_dlg_title msgid "Button properties" msgstr "Botoiaren propietateak" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Ezabatu oraingo menua" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Ezabatu" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Ezabatu oraingo menuaren elementua" #: action_libraries_caption msgid "Libraries..." msgstr "Liburutegiak..." #: dlg_save_title msgid "Save file..." msgstr "Gorde fitxategia..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Errorea zabaltzean \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Berezko baloreak erabiliko dira." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Ezabatu" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Proiekturako sarbide zuzen berria sortu" #: menu_newMenuName msgid "New folder" msgstr "Karpeta berria" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Proiektu-botoierako karpeta berria sortu" #: menu_newMenu_caption msgid "New button's folder" msgstr "Ikono-karpeta berria" #: menu_newMenuElement_caption msgid "New project button" msgstr "Proiektu-botoi berria" #: menu_newMenuElementName msgid "New button" msgstr "Botoi berria" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Utzi aldaketak" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Utzi" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Editatu aukeratutako liburutegia" #: libraryManager_edit_caption msgid "Edit" msgstr "Editatu" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Aldaketak gorde" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Aukeratu adierazitako direktorioa" #: library_select_caption_ok msgid "Ok" msgstr "Ados" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Aukeratu" #: library_caption msgid "JClic projects library" msgstr "JClic proiektuen liburutegia" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Zabaldu aukeratutako liburutegia" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Utzi" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Utzi" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Aukeratu" #: libraryManager_caption msgid "Select library" msgstr "Aukeratu liburutegia" #: library_error_reading msgid "Error reading project library!" msgstr "Errorea proiektuen liburutegia irakurtzean!" #: wizard_next msgid "Next >" msgstr "Hurrengoa >" #: wizard_prev msgid "< Previous" msgstr "< Aurrekoa" #: wizard_finish msgid "Finish" msgstr "Amaitu" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Errorea liburutegi-ikonoak sortzean!" #: install_title msgid "Installation of JClic projects" msgstr "JClic proiektuen instalazioa" #: install_info_description msgid "Installation of a new JClic project" msgstr "JClic proiektu berriaren instalazioa" #: install_info_from msgid "From:" msgstr "Hemendik:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Utzi" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Utzi eragiketa" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Amaitu eragiketa" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Eragiketaren hurrengo pausua" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Eragiketaren aurreko pausua" #: install_select_library msgid "Select the library where to install the project:" msgstr "Aukera ezazu zein liburutegitan instalatuko den proiektua:" #: install_copy_files msgid "File copy" msgstr "Fitxategia kopiatu" #: install_source msgid "Source:" msgstr "Iturburua:" #: install_dest msgid "Destination:" msgstr "Helburua:" #: install_status msgid "Status:" msgstr "Egoera:" #: install_start msgid "Start the installation" msgstr "Hasi instalazioa" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Hasi kopiatzen fitxategiak zure ordenagailuan" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Instalazioaren aurrerapena" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Baieztapenaren zain." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Direktorioak sortzen" #: install_msg_copying msgid "Copying file" msgstr "Fitxategia kopiatzen" #: install_msg_end msgid "Finished!" msgstr "Amaituta!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Garbitzen..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Instalazioa bertan behera utzita!" #: install_error msgid "Install error!" msgstr "Errorea instalatzean!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Aukera ezazu zein karpetatan sortuko diren proiektuaren ikonoak:" #: install_library_folders msgid "Library folders:" msgstr "Liburutegiaren karpetak:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Proiektua instalatuta dago orain zure sisteman!" #: install_success_2 msgid "In order to run it, select its" msgstr "Martxan jartzeko, aukera ezazu" #: install_success_3 msgid "icon on the project library." msgstr "ikonoa proiektuen liburutegian." #: wizard_info msgid "Press \"Next\" to start." msgstr "Sakatu \"Hurrengoa\"ri hasteko." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Aukeratu JClic liburutegia" #: install_step_2 msgid "2. Download files" msgstr "2. Deskargatu fitxategiak" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Ikonoak sortu" #: install_step_4 msgid "Installation finished!" msgstr "Instalazioa amaituta!" #: install_info_info msgid "You request to install the project:" msgstr "Proiektua instalatzea eskatu duzu:" #: settings_title msgid "Settings" msgstr "Ezarpenak" #: library_error_clone msgid "Unable to clone library!" msgstr "Ezin da liburutegia klonatu!" #: settings_security msgid "Security" msgstr "Segurtasuna" #: settings_password_protect msgid "Protect settings with password" msgstr "Babestu pasahitzez ezarpenak" #: settings_new_password msgid "New password:" msgstr "Pasahitz berria:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Konfirmatu pasahitz berria:" #: settings_general msgid "General" msgstr "Orokorra" #: settings_look msgid "Look & Feel:" msgstr "Itxura:" #: settings_skin msgid "Skin:" msgstr "Azala:" #: settings_language msgid "Language:" msgstr "Hizkuntza:" #: settings_reports msgid "Reports" msgstr "Txostenak" #: settings_report_use msgid "Write scores to a database" msgstr "Jardueren puntuazioak datu-basean gorde" #: settings_report_engine msgid "Reporter class:" msgstr "Mota:" #: settings_report_params msgid "Parameters:" msgstr "Parametroak:" #: settings_media msgid "Multimedia" msgstr "Multimedia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimedia gaituta" #: settings_media_system msgid "Multimedia system:" msgstr "Multimedia sistema:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Ekintza-soinuak gaituta" #: settings_library msgid "Libraries" msgstr "Liburutegiak" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Jo automatikoki liburutegietara JClic hastean" #: m_Tools msgid "Tools" msgstr "Tresnak" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "L" #: m_Activity msgid "Activity" msgstr "Jarduera" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Ireki fitxategia..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Ireki JClic proiektuko fitxategi bat" #: action_openFile_keys msgid "OO" msgstr "IF" #: action_openUrl_caption msgid "Open URL..." msgstr "Ireki URL-a..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Ireki JClic proiektu bat zuzenean Internetetik" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Irten" #: action_exit_tooltip msgid "Close JClic" msgstr "Itxi JClic" #: action_exit_keys msgid "XX" msgstr "II" #: action_settings_caption msgid "Settings..." msgstr "Ezarpenak..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Programaren ezarpen orokorrak doitu" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "E" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Zabaldu edo editatu JClic liburutegia" #: action_libraries_keys msgid "LL" msgstr "BB" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "JClic-i buruzko informazioa" #: action_helpAbout_keys msgid "AA" msgstr "ZB" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Irudia handiegia da ikono batean erabiltzeko!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Konektatu Jclic txostenen zerbitzarira:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "JDBC lotura zuzena:" #: settings_report_other msgid "Other:" msgstr "Bestelakoa:" #: settings_report_address msgid "Host:" msgstr "Ostalaria:" #: settings_report_port msgid "Port:" msgstr "Ataka:" #: settings_report_driver msgid "Driver:" msgstr "Kontrolatzailea:" #: settings_report_url msgid "URL:" msgstr "URL-a:" #: settings_report_user msgid "User:" msgstr "Erabiltzailea:" #: settings_report_pwd msgid "Password:" msgstr "Pasahitza:" #: settings_report_options msgid "Reporter params::" msgstr "Parametroak:" #: settings_report_err_server msgid "Bad report server name!" msgstr "Okerreko txosten-zerbitzariaren izena!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Ataka zenbaki ezegokia! Mesedez, sartu 1000 eta 65000 arteko balore bat." #: settings_report_err msgid "Incorrect report system data!" msgstr "Txosten-sistemaren datu okerra!" #: settings_report_type msgid "Reporting engine:" msgstr "Txosten sortzaile mota:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Auto-atzeman" #: settings_security_tooltip msgid "Security settings" msgstr "Segurtasun-ezarpenak" #: settings_report_tooltip msgid "Report system settings" msgstr "Txostenen sistemaren ezarpenak" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Multimedia-sistemaren ezarpenak" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Itxura eta hizkuntza-ezarpenak" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Liburutegiaren ezarpenak eta editorea" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Erabiltzailearen interfazaren itxura" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "JClic-en itxura grafikoaren aukeraketa" #: settings_language_tooltip msgid "Language selection" msgstr "Hizkuntza aukeraketa" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "JClic txosten datu-basearekiko konexioa gaitu/ezgaitu" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "TCP/IP konexio batean oinarritutako txosten-motorea" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Datu-baseetarako konexio zuzen batean oinarritutako txosten-motorea" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Bestelako txosten-motoreak..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Txosten-zerbitzariaren izena edo IP helbidea" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Konexiorako erabilitako ataka (berezkoa 5510)" #: edit_file msgid "File:" msgstr "Fitxategia:" #: error_launchLibrary msgid "Error launching library" msgstr "Errorea biltegia irekitzean" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Jatorrizko karpetan instalatzen!" #: edit_find_media msgid "Find media file..." msgstr "Bilatu media-fitxategia..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Ezabatu" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Ezabatu aukeratutako liburutegirako erreferentzia" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "" "Benetan ezabatu nahi al duzu aukeratutako liburutegirako erreferentzia?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Biltegi hau dagoeneko sistemarekin estekatuta dago." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "BB" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Sortu proiektu-liburutegi berria" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Gehitu aldez aurretik dagoen proiektu-biltegi baterako esteka" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Fitxategia edo URL-a\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Proiektu-liburutegi berria" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "Mesedez, sartu proiektuaren biltegiaren URL-a edo fitxategiaren izena\\!" #: install_launchProject msgid "Open the project now" msgstr "Ireki proiektua orain" #: settings_browser msgid "Preferred browser\\:" msgstr "Lehenetsitako nabigatzailea\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Nabigatzailea abiarazteko erabilitako agindua (firefox, iexplore, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "Estatu-kodea\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Bi hizkiz osatutako aukerako kodea, herrialde zehatzeko hizkuntzaren " "aldagaiari dagokiona (adi.\\: FR Frantziako Euskararako)" #: settings_variant msgid "Variant\\:" msgstr "Hizkuntza-aldaera\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Hizkuntza-aldaeraren aukerako kodea" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_fr.po000066400000000000000000000443371335566474600234250ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2015-12-06 20:26+0000\n" "Last-Translator: Jean-Marc \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Fichier" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Le mot de passe administrateur JClic est requis pour réaliser cette " "opération." #: m_Help msgid "Help" msgstr "Aide" #: m_Skin msgid "Skin" msgstr "Habillage" #: action_helpAbout_caption msgid "About..." msgstr "A propos de..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Librairie principale" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Ce fichier JClic n'est pas une librairie du projet!\n" "Libraries are a special type of JClic projects." #: library_mainMenu msgid "Main menu" msgstr "Menu principal" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nouvlle librairie de projet" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "Voulez-vous créer une nouvelle librairie ou vous connecter sur une existante " "?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Connecter" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nouveau" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Créer ou se connecter à une nouvelle librairie" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nouveau" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Bouton icône" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "Description du bouton utilisé comme outil texte." #: menuElement_dlg_description msgid "Description:" msgstr "Description:" #: edit_find_image msgid "Find image..." msgstr "Chercher image..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Icône :" #: edit_find_file msgid "Find file..." msgstr "Chercher fichier..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Chemin vers le projet JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Projet:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Bouton texte" #: edit_text msgid "Text:" msgstr "Texte:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nom du dossier" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nom de librairie" #: edit_name msgid "Name:" msgstr "Nom:" #: edit_title msgid "Title:" msgstr "Titre:" #: library_dlg_title msgid "Library properties" msgstr "Propriétés de la librairie" #: menu_dlg_title msgid "Folder properties" msgstr "Propriétés de dossier" #: menuElement_dlg_title msgid "Button properties" msgstr "Propriétés de bouton" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Supprimer le bouton courant" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Supprimer" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Supprimer l'élément menu courant" #: action_libraries_caption msgid "Libraries..." msgstr "Librairies..." #: dlg_save_title msgid "Save file..." msgstr "Enregistrer fichier..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Erreur à l'ouverture \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Les paramètres par défaut seront utilisés." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Supprimer" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "" "Créer un nouveau raccourci vers le projet a new shortcut to a project" #: menu_newMenuName msgid "New folder" msgstr "Nouveau dossier" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Créer un nouveau dossier por les boutons du projet" #: menu_newMenu_caption msgid "New button's folder" msgstr "Nouveau bouton de projet" #: menu_newMenuElement_caption msgid "New project button" msgstr "Nouveau bouton du projet" #: menu_newMenuElementName msgid "New button" msgstr "Nouveau projet" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Annuler changement" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Annuler" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Editer la librairie sélectionnée" #: libraryManager_edit_caption msgid "Edit" msgstr "Editer" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Enregistrer changement" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Choisir le dossier sélectionné" #: library_select_caption_ok msgid "Ok" msgstr "OK" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Sélectionner" #: library_caption msgid "JClic projects library" msgstr "Librairie de projets JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Ouvrir la librairie sélectionée" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Annuler" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Annuler" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Sélectionner" #: libraryManager_caption msgid "Select library" msgstr "Sélectionner librairie" #: library_error_reading msgid "Error reading project library!" msgstr "Erreur de lecture de la librairie du projet!" #: wizard_next msgid "Next >" msgstr "Suivant >" #: wizard_prev msgid "< Previous" msgstr "< Précédent" #: wizard_finish msgid "Finish" msgstr "Terminé" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Erreur de création de la librairie d'icônes!" #: install_title msgid "Installation of JClic projects" msgstr "Installation de projets JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Installation d'un nouveau projet JClic" #: install_info_from msgid "From:" msgstr "De:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Annuler" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Annuler l'opération" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Terminer l'opération" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Etape suivante de l'opération" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Etape précédente de l'opération" #: install_select_library msgid "Select the library where to install the project:" msgstr "Sélectionner la librairie où sera installé le projet:" #: install_copy_files msgid "File copy" msgstr "Copie de fichier" #: install_source msgid "Source:" msgstr "Source:" #: install_dest msgid "Destination:" msgstr "Destination:" #: install_status msgid "Status:" msgstr "Status:" #: install_start msgid "Start the installation" msgstr "Démarrer l'installation" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Démarrage de la copie des fichiers sur votre ordinateur" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Installation en cours" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Attente de confirmation." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Création des dossiers" #: install_msg_copying msgid "Copying file" msgstr "Copie de fichier" #: install_msg_end msgid "Finished!" msgstr "Terminé!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Nettoyage en cours..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Installation annulée!" #: install_error msgid "Install error!" msgstr "Erreur pendant l'installation!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Sélectionner le dossier où placer les icônes du projet:" #: install_library_folders msgid "Library folders:" msgstr "Dossiers librairie:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Le projet es t maintenant installé sur votre système!" #: install_success_2 msgid "In order to run it, select its" msgstr "Pour le lancer, sélectionnez son" #: install_success_3 msgid "icon on the project library." msgstr "icône sur la librairie projet." #: wizard_info msgid "Press \"Next\" to start." msgstr "Presser \"Suivant\" pour commencer." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Sélection de la librairie JClic" #: install_step_2 msgid "2. Download files" msgstr "2. Télécharger fichiers" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Création d'icônes" #: install_step_4 msgid "Installation finished!" msgstr "Installation terminée!" #: install_info_info msgid "You request to install the project:" msgstr "Vous avez demandé d'installer le projet:" #: settings_title msgid "Settings" msgstr "Paramètres" #: library_error_clone msgid "Unable to clone library!" msgstr "Impossible de cloner la librairie!" #: settings_security msgid "Security" msgstr "Sécurité" #: settings_password_protect msgid "Protect settings with password" msgstr "Protéger les paramètres avec un mot de passe" #: settings_new_password msgid "New password:" msgstr "Nouveau mot de passe:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Confirmer le nouveau mot de passe:" #: settings_general msgid "General" msgstr "Général" #: settings_look msgid "Look & Feel:" msgstr "Apparence:" #: settings_skin msgid "Skin:" msgstr "Habillage:" #: settings_language msgid "Language:" msgstr "Langage:" #: settings_reports msgid "Reports" msgstr "Rapports" #: settings_report_use msgid "Write scores to a database" msgstr "Ecrire le score dans la base de données" #: settings_report_engine msgid "Reporter class:" msgstr "Rapporteur classe:" #: settings_report_params msgid "Parameters:" msgstr "Paramètres:" #: settings_media msgid "Multimedia" msgstr "Multimédia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Autoriser multimedia" #: settings_media_system msgid "Multimedia system:" msgstr "Système multimedia:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Autoriser les sons évènement" #: settings_library msgid "Libraries" msgstr "Bibliothèques" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Allez automatiquement aux bibliothèques quand JClic démarre" #: m_Tools msgid "Tools" msgstr "Outils" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Activité" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Ouvrir fichier..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Ouvrir un fichier projet JClic" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Ouvrir URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Ouvrir un projet JClic directement depuis Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Quitter" #: action_exit_tooltip msgid "Close JClic" msgstr "Fermer JClic" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Paramètres..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Adjuster les paramètres globaux du programme" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Ouvrir ou éditer une librairie JClic ." #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Information à propos de JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Cette image est trop grande pour être utilisée comme icône!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Connecter JClic au serveur de rapports:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Connection directe JDBC:" #: settings_report_other msgid "Other:" msgstr "Autre:" #: settings_report_address msgid "Host:" msgstr "Hôte:" #: settings_report_port msgid "Port:" msgstr "Port:" #: settings_report_driver msgid "Driver:" msgstr "Driver:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Utilisateur:" #: settings_report_pwd msgid "Password:" msgstr "Mot de passe:" #: settings_report_options msgid "Reporter params::" msgstr "Paramètres du reporter:" #: settings_report_err_server msgid "Bad report server name!" msgstr "Mauvais nom de serveur de rapport!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "Numéro de port incorrect! Entrez une valeur entre 1000 et 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Système incorrect de rapport de données!" #: settings_report_type msgid "Reporting engine:" msgstr "Moteur de rapports:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Détection automatique" #: settings_security_tooltip msgid "Security settings" msgstr "Paramètres de sécurité" #: settings_report_tooltip msgid "Report system settings" msgstr "Paramètres du système de rapports" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Options du système multimédia" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Paramètres du langage et de l'aspect" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Paramètres de la librairie et de l'éditeur" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Apparence de l'interface utilisateur User" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Sélection de l'aspect graphique de JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Sélection du langage" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Activer/désactiver la connection à une base de rapports JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Moteur de rapports basé sur une connection TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "" "Moteur de rapports basé sur une connection directe à la base de données" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Autres moteurs de rapports..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nom de serveur de rapports ou adresse IP" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Port utilisé pour la connection (5510 par défaut)" #: edit_file msgid "File:" msgstr "Fichier:" #: error_launchLibrary msgid "Error launching library" msgstr "Erreur au lancement de la librairie" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Installation dans le dossier source!" #: edit_find_media msgid "Find media file..." msgstr "Chercher fichier media..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Supprimer" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Supprimer la référence vers la librairie sélectionnée" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "" "Voulez-vous réellement supprimer la référence à la librairie sélectionnée ?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Cette librairie est déjà reliée au système." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Créer une nouvelle librairie projet" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Ajouter un lien vers un projet librairie existant" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Fichier ou URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nouvelle librairie de projet" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "Entrez l'URL ou nom de fichier du projet librairie!" #: install_launchProject msgid "Open the project now" msgstr "Ouvrir le projet maintenant" #: settings_browser msgid "Preferred browser\\:" msgstr "Explorateur préféré:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Commande utilisée pour lancer l'explorateur (firefox, iexplore, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "Country code\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Code optionnel de deux lettres correspondant à la variante dialectale d'un " "territoire (ex.\\: BR pour le Portugais du Brésil)" #: settings_variant msgid "Variant\\:" msgstr "Variant\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Code optionnel de variante de la langue" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_gl.po000066400000000000000000000441231335566474600234110ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-01-10 08:35+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Ficheiro" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Requírese contrasinal de administrador de JClic para validar esta operación." #: m_Help msgid "Help" msgstr "Axuda" #: m_Skin msgid "Skin" msgstr "Tema visual" #: action_helpAbout_caption msgid "About..." msgstr "Sobre..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Biblioteca principal" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Este ficheiro non é unha biblioteca de proxectos JClic!\n" "As bibliotecas son un tipo especial de proxectos JClic." #: library_mainMenu msgid "Main menu" msgstr "Menú principal" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nova biblioteca de proxectos" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "Quer crear unha nova biblioteca ou conectarse a unha existente?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Conectar" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Novo" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Crear ou conectarse a unha nova biblioteca" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nova" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Imaxe que mostra a icona" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" "Texto flotante, que aparecerá ao posicionar o punteiro sobre o botón." #: menuElement_dlg_description msgid "Description:" msgstr "Descrición:" #: edit_find_image msgid "Find image..." msgstr "Buscar imaxe..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Icona:" #: edit_find_file msgid "Find file..." msgstr "Buscar ficheiro..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Ruta ao proxecto JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Proxecto:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Texto do botón" #: edit_text msgid "Text:" msgstr "Texto:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nome do cartafol" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nome da biblioteca" #: edit_name msgid "Name:" msgstr "Nome:" #: edit_title msgid "Title:" msgstr "Título:" #: library_dlg_title msgid "Library properties" msgstr "Propiedades da biblioteca" #: menu_dlg_title msgid "Folder properties" msgstr "Propiedades do cartafol" #: menuElement_dlg_title msgid "Button properties" msgstr "Propiedades do botón" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Eliminar o menú seleccionado" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Eliminar" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Eliminar o elemento do menú seleccionado" #: action_libraries_caption msgid "Libraries..." msgstr "Bibliotecas..." #: dlg_save_title msgid "Save file..." msgstr "Gardar o ficheiro..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Produciuse un erro ao abrir \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Utilizaranse os valores por omisión." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Eliminar" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Crear un novo atallo ao proxecto!" #: menu_newMenuName msgid "New folder" msgstr "Novo cartafol" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Crear un novo cartafol de botóns de proxecto" #: menu_newMenu_caption msgid "New button's folder" msgstr "Novo cartafol de iconas" #: menu_newMenuElement_caption msgid "New project button" msgstr "Novo botón de proxecto" #: menu_newMenuElementName msgid "New button" msgstr "Novo botón" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Cancelar cambios" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Cancelar" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Editar na biblioteca seleccionada" #: libraryManager_edit_caption msgid "Edit" msgstr "Editar" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Gardar cambios" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Escoller o cartafol seleccionado" #: library_select_caption_ok msgid "Ok" msgstr "Aceptar" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Seleccionar" #: library_caption msgid "JClic projects library" msgstr "Biblioteca de proxectos JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Abrir a biblioteca seleccionada" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Cancelar" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Cancelar" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Seleccionar" #: libraryManager_caption msgid "Select library" msgstr "Seleccione biblioteca" #: library_error_reading msgid "Error reading project library!" msgstr "Produciuse un erro ao ler a biblioteca de proxectos!" #: wizard_next msgid "Next >" msgstr "Seguinte >" #: wizard_prev msgid "< Previous" msgstr "< Anterior" #: wizard_finish msgid "Finish" msgstr "Finalizar" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Produciuse un erro na creación das iconas da biblioteca!" #: install_title msgid "Installation of JClic projects" msgstr "Instalación de proxectos JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Instalación dun novo proxecto JClic" #: install_info_from msgid "From:" msgstr "Desde:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Cancelar" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Cancelar a operación" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Finalizar a operación" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Seguinte paso da operación" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Paso anterior da operación" #: install_select_library msgid "Select the library where to install the project:" msgstr "Seleccione a biblioteca onde instalar o proxecto:" #: install_copy_files msgid "File copy" msgstr "Copiar arquivo" #: install_source msgid "Source:" msgstr "Orixe:" #: install_dest msgid "Destination:" msgstr "Destino:" #: install_status msgid "Status:" msgstr "Estado:" #: install_start msgid "Start the installation" msgstr "Iniciar a instalación" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Iniciar a copia dos ficheiros ao seu computador" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Progreso da instalación" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Agardando a confirmación." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Creando directorios" #: install_msg_copying msgid "Copying file" msgstr "Copiando ficheiro" #: install_msg_end msgid "Finished!" msgstr "Rematado!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Facendo limpeza..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Instalación cancelada!" #: install_error msgid "Install error!" msgstr "Produciuse un erro na instalación!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Seleccione o cartafol onde crear as iconas do proxecto:" #: install_library_folders msgid "Library folders:" msgstr "Cartafoles da biblioteca:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "O proxecto está instalado no sistema!" #: install_success_2 msgid "In order to run it, select its" msgstr "Para inicialo, seleccione a súa" #: install_success_3 msgid "icon on the project library." msgstr "Icona na biblioteca de proxectos." #: wizard_info msgid "Press \"Next\" to start." msgstr "Prema en «Seguinte» para iniciar" #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Selección da biblioteca de JClic" #: install_step_2 msgid "2. Download files" msgstr "2. Descargar ficheiros" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Creación de iconas" #: install_step_4 msgid "Installation finished!" msgstr "Instalación rematada!" #: install_info_info msgid "You request to install the project:" msgstr "Solicitou instalar o proxecto:" #: settings_title msgid "Settings" msgstr "Configuración" #: library_error_clone msgid "Unable to clone library!" msgstr "Non foi posíbel clonar a biblioteca!" #: settings_security msgid "Security" msgstr "Seguranza" #: settings_password_protect msgid "Protect settings with password" msgstr "Protexer a configuración con contrasinal" #: settings_new_password msgid "New password:" msgstr "Novo contrasinal:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Cofirme o novo contrasinal:" #: settings_general msgid "General" msgstr "Xeral" #: settings_look msgid "Look & Feel:" msgstr "Aparencia e comportamento:" #: settings_skin msgid "Skin:" msgstr "Tema visual:" #: settings_language msgid "Language:" msgstr "Idioma:" #: settings_reports msgid "Reports" msgstr "Informes" #: settings_report_use msgid "Write scores to a database" msgstr "Gardar as puntuacións nunha base de datos" #: settings_report_engine msgid "Reporter class:" msgstr "Clase:" #: settings_report_params msgid "Parameters:" msgstr "Parámetros:" #: settings_media msgid "Multimedia" msgstr "Multimedia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimedia activado" #: settings_media_system msgid "Multimedia system:" msgstr "Sistema multimedia:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Sons de evento activados" #: settings_library msgid "Libraries" msgstr "Bibliotecas" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Mostrar as bibliotecas cando se inicie JClic" #: m_Tools msgid "Tools" msgstr "Ferramentas" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Actividade" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Abrir ficheiro..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Abrir un ficheiro de proxecto JClic" #: action_openFile_keys msgid "OO" msgstr "AO" #: action_openUrl_caption msgid "Open URL..." msgstr "Abrir URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Abrir un proxecto de JClic desde a Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Saír" #: action_exit_tooltip msgid "Close JClic" msgstr "Pechar o Jclic" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Configuración..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Axuste global da configuración do programa" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "C" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Abrir ou editar unha biblioteca JClic" #: action_libraries_keys msgid "LL" msgstr "BB" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Información sobre o JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Esta imaxe é moi grande para usala como icona!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Conectarse a un servidor de informes JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Conexión directa a JDBC:" #: settings_report_other msgid "Other:" msgstr "Outros:" #: settings_report_address msgid "Host:" msgstr "Servidor:" #: settings_report_port msgid "Port:" msgstr "Porto:" #: settings_report_driver msgid "Driver:" msgstr "Controlador:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Usuario:" #: settings_report_pwd msgid "Password:" msgstr "Contrasinal:" #: settings_report_options msgid "Reporter params::" msgstr "Parámetros dos informes:" #: settings_report_err_server msgid "Bad report server name!" msgstr "O nome do servidor de informes é incorrecto!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "Valor incorrecto de porto! Introduza un valor entre 1000 e 65000" #: settings_report_err msgid "Incorrect report system data!" msgstr "Datos incorrectos para o sistema de informes!" #: settings_report_type msgid "Reporting engine:" msgstr "Sistema de informes" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Detección automática" #: settings_security_tooltip msgid "Security settings" msgstr "Configuración de seguranza" #: settings_report_tooltip msgid "Report system settings" msgstr "Configuración do sistema de informes" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Configuración do sistema multimedia" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Configuración de idioma e aspecto" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Configurador e editor de bibliotecas" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Aspecto da interface de usuario" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Selección do aspecto gráfico de JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Selección do idioma" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Activa/desactiva a conexión a unha base de datos de informes JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Motor de informes baseado nunha conexión TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Motor de informes baseado nunha conexión directa a base de datos" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Outros motores de informes..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nome ou enderezo IP do servidor de informes" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Porto usado para a conexión (por omisión é 5510)" #: edit_file msgid "File:" msgstr "Ficheiro:" #: error_launchLibrary msgid "Error launching library" msgstr "produciuse un erro ao abrir biblioteca" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Instalando no cartafol de orixe!" #: edit_find_media msgid "Find media file..." msgstr "Buscar recurso..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Eliminar" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Eliminar a referencia á biblioteca seleccionada" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Realmente quer eliminar a referencia á biblioteca seleccionada?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Esta biblioteca xa está conectada ao sistema." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Crear unha nova biblioteca de proxectos" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Engadir ligazón a unha biblioteca creada" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Ficheiro ou URL:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nova biblioteca de proxectos" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "Por favor, introduza o URL ou nome de ficheiro da biblioteca de proxectos!" #: install_launchProject msgid "Open the project now" msgstr "Abrir o proxecto agora" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferido:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Orde empregada para executar o navegador (firefox, iexplore, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "Código do país\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Dúas letras opcionais correspondentes ao código do país específico da " "variante de idioma (p.ex.\\:BR para portugués do Brasil)" #: settings_variant msgid "Variant\\:" msgstr "Variante\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Variante opcional do código de idioma" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_it.po000066400000000000000000000444311335566474600234250ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-22 16:44+0000\n" "Last-Translator: giomu2 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "File" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Una password di amministratore JClic è richiesta per procedere " "nell'operazione." #: m_Help msgid "Help" msgstr "Aiuto" #: m_Skin msgid "Skin" msgstr "Skin" #: action_helpAbout_caption msgid "About..." msgstr "Informazioni..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Libreria principale" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Questo file JClic non è una libreria di progetto!\n" "Le librerie sono tipi speciali di progetti JClic." #: library_mainMenu msgid "Main menu" msgstr "Menu principale" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nuova libreria di progetti" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "Vuoi creare una nuova libreria o collegarti a una esistente?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Connetti" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nuovo" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Crea o connettiti a una nuova libreria" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nuovo" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Immagine del pulsante" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" "Testo flottante che apparirà quando il puntatore si troverà sul pulsante." #: menuElement_dlg_description msgid "Description:" msgstr "Descrizione:" #: edit_find_image msgid "Find image..." msgstr "Trova immagine" #: menuElement_dlg_icon msgid "Icon:" msgstr "Icona:" #: edit_find_file msgid "Find file..." msgstr "Trova file" #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Percorso per il progetto JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Progetto:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Testo del pulsante" #: edit_text msgid "Text:" msgstr "Testo:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nome della cartella" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nome della libreria" #: edit_name msgid "Name:" msgstr "Nome:" #: edit_title msgid "Title:" msgstr "Titolo:" #: library_dlg_title msgid "Library properties" msgstr "Proprietà della libreria" #: menu_dlg_title msgid "Folder properties" msgstr "Proprietà della cartella" #: menuElement_dlg_title msgid "Button properties" msgstr "Proprietà del pulsante" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Elimina il menu selezionato" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Elimina" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Elimina l'elemento del menu selezionato" #: action_libraries_caption msgid "Libraries..." msgstr "Librerie..." #: dlg_save_title msgid "Save file..." msgstr "Salva file..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Errore all'apertura di \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Si utilizzeranno i valori predefiniti." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Elimina" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Crea una nuova scorciatoia per il progetto" #: menu_newMenuName msgid "New folder" msgstr "Nuova cartella" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Crea una nuova cartella per i pulsanti del progetto." #: menu_newMenu_caption msgid "New button's folder" msgstr "Nuova cartella delle icone" #: menu_newMenuElement_caption msgid "New project button" msgstr "Nuovo pulsante di progetto" #: menu_newMenuElementName msgid "New button" msgstr "Nuovo pulsante" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Annulla modifiche" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Annulla" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Modifica la libreria selezionata" #: libraryManager_edit_caption msgid "Edit" msgstr "Modifica" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Salva le modifiche" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Scegli la cartella selezionata" #: library_select_caption_ok msgid "Ok" msgstr "Ok" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Seleziona" #: library_caption msgid "JClic projects library" msgstr "Libreria dei progetti JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Apri la libreria selezionata" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Annulla" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Annulla" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Seleziona" #: libraryManager_caption msgid "Select library" msgstr "Seleziona la libreria dei progetti" #: library_error_reading msgid "Error reading project library!" msgstr "Errore nella lettura della libreria del progetto!" #: wizard_next msgid "Next >" msgstr "Successivo >" #: wizard_prev msgid "< Previous" msgstr "< Precedente" #: wizard_finish msgid "Finish" msgstr "Finisci" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Errore nella creazione delle icone della libreria!" #: install_title msgid "Installation of JClic projects" msgstr "Installazione di progetti JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Installazione di un nuovo progetto JClic" #: install_info_from msgid "From:" msgstr "Da:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Annulla" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Annulla l'operazione" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Concludi l'operazione" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Passo successivo dell'operazione" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Passo precedente dell'operazione" #: install_select_library msgid "Select the library where to install the project:" msgstr "Seleziona la libreria dove verrà installato il progetto:" #: install_copy_files msgid "File copy" msgstr "Copia dei file" #: install_source msgid "Source:" msgstr "Origine:" #: install_dest msgid "Destination:" msgstr "Destinazione:" #: install_status msgid "Status:" msgstr "Stato:" #: install_start msgid "Start the installation" msgstr "Inizia l'installazione" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Inizia la copia dei file sul tuo computer" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Installazione in corso" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "In attesa di conferma" #: install_msg_creating_dirs msgid "Creating directories" msgstr "Creazione delle directory" #: install_msg_copying msgid "Copying file" msgstr "Copia dei file" #: install_msg_end msgid "Finished!" msgstr "Finito!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Pulizia in corso..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Installazione annullata!" #: install_error msgid "Install error!" msgstr "Errore nell'installazione!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Seleziona la cartella dove mettere le icone di progetto:" #: install_library_folders msgid "Library folders:" msgstr "Cartelle della libreria:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Ora il progetto è installato nel tuo sistema!" #: install_success_2 msgid "In order to run it, select its" msgstr "Per lanciarlo seleziona la sua" #: install_success_3 msgid "icon on the project library." msgstr "icona nella libreria del progetto." #: wizard_info msgid "Press \"Next\" to start." msgstr "Premi \"Successivo\" per iniziare." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Selezione della libreria JClic" #: install_step_2 msgid "2. Download files" msgstr "Scaricamento dei file" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Creazione delle icone" #: install_step_4 msgid "Installation finished!" msgstr "Installazione conclusa!" #: install_info_info msgid "You request to install the project:" msgstr "Hai chiesto di installare il progetto:" #: settings_title msgid "Settings" msgstr "Impostazioni" #: library_error_clone msgid "Unable to clone library!" msgstr "Impossibile duplicare la libreria" #: settings_security msgid "Security" msgstr "Sicurezza" #: settings_password_protect msgid "Protect settings with password" msgstr "Proteggi la configurazione con una password" #: settings_new_password msgid "New password:" msgstr "Nuova password:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Conferma la nuova password:" #: settings_general msgid "General" msgstr "Generale" #: settings_look msgid "Look & Feel:" msgstr "Aspetto" #: settings_skin msgid "Skin:" msgstr "Skin:" #: settings_language msgid "Language:" msgstr "Lingua:" #: settings_reports msgid "Reports" msgstr "Rapporti" #: settings_report_use msgid "Write scores to a database" msgstr "Scrivi il punteggio in un database" #: settings_report_engine msgid "Reporter class:" msgstr "Classe:" #: settings_report_params msgid "Parameters:" msgstr "Parametri:" #: settings_media msgid "Multimedia" msgstr "Multimedia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimedia abilitato" #: settings_media_system msgid "Multimedia system:" msgstr "Sistema multimediale:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Suoni di evento abilitati" #: settings_library msgid "Libraries" msgstr "Librerie" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Mostra automaticamente le librerie quando JClic viene avviato" #: m_Tools msgid "Tools" msgstr "Strumenti" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Attività" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Apri il file..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Apri un file di progetto JClic" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Apri URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Apri un progetto JClic direttamente da Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Esci" #: action_exit_tooltip msgid "Close JClic" msgstr "Chiudi JClic" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Impostazioni..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Sistema le impostazioni globali del programma" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Apri o modifica una liberia JClic." #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Informazioni su JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Questa immagine è troppo grande per essere usata come icona!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Collegati al server dei rapporti JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Connessione diretta JDBC:" #: settings_report_other msgid "Other:" msgstr "Altro:" #: settings_report_address msgid "Host:" msgstr "Host:" #: settings_report_port msgid "Port:" msgstr "Porta:" #: settings_report_driver msgid "Driver:" msgstr "Driver:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Utente:" #: settings_report_pwd msgid "Password:" msgstr "Password:" #: settings_report_options msgid "Reporter params::" msgstr "Parametri:" #: settings_report_err_server msgid "Bad report server name!" msgstr "Nome del server dei rapporti non corretto!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Numero di porta non corretto! Per favore inserisci un valore compreso tra " "1000 e 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Dati incorretti del sistema dei rapporti!" #: settings_report_type msgid "Reporting engine:" msgstr "Motore dei rapporti:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Autorilevamento" #: settings_security_tooltip msgid "Security settings" msgstr "Impostazioni di sicurezza" #: settings_report_tooltip msgid "Report system settings" msgstr "Impostazione del sistema dei rapporti" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Configurazione del sistema multimediale" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Impostazioni di lingua e aspetto" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Impostazione e modifica della libreria" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Aspetto dell'interfaccia utente" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Selezione dell'aspetto grafico di JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Selezione della lingua" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Abilita/disabilita la connessione a un database dei rapporti JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Motore dei rapporti basato su una connessione TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Motore dei rapporti basato su una diretta connessione a un database" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Altri motori dei rapporti..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nome o indirizzo IP del server dei rapporti" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Porta usare per la connessione (il valore predefinito è 5510)" #: edit_file msgid "File:" msgstr "File:" #: error_launchLibrary msgid "Error launching library" msgstr "Errore all'apertura della libreria" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Installazione nella cartella di origine!" #: edit_find_media msgid "Find media file..." msgstr "Cerca i file multimediali..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Elimina" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Elimina i riferimenti alla libreria selezionata" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Vuoi davvero eliminare i riferimenti alla libreria selezionata?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "La libreria è già connessa al sistema." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Crea una nuova libreria dei progetti" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Aggiungi un link a una esistente libreria dei progetti" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "File o URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nuova libreria di progetti" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "Per favore inserisci l'URL o il nome del file della libreria di progetto\\!" #: install_launchProject msgid "Open the project now" msgstr "Apri adesso il progetto" #: settings_browser msgid "Preferred browser\\:" msgstr "Browser preferito\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comando usato per avviare il navigatore Internet (Firefox, IExplore, " "Mozilla, Opera...)" #: settings_country msgid "Country code\\:" msgstr "Codice nazione\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Codice opzionale di due lettere corrispondente alla variante nazionale di " "una lingua (es. BR per il portoghese brasiliano)" #: settings_variant msgid "Variant\\:" msgstr "Variante\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Codice opzionale della variante della lingua" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_nl.po000066400000000000000000000437501335566474600234250ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-08-11 10:24+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Bestand" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "JClic admin wachtwoord is vereist om deze bewerking uit te voeren." #: m_Help msgid "Help" msgstr "Help" #: m_Skin msgid "Skin" msgstr "Skin" #: action_helpAbout_caption msgid "About..." msgstr "Info..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Hoofd bibliotheek" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Dit JClic bestand is geen project bestand!\n" "Bibliotheken zijn een speciaal type JClic projecten." #: library_mainMenu msgid "Main menu" msgstr "Hoofdmenu" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nieuw project bibliotheek" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "Wil je een nieuwe bibliotheek maken of een bestaande gebruiken?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Verbinden" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nieuw" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Maak een nieuwe bibliotheek of verbind met een bestaande" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nieuw" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Knop pictogram" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "Beschrijving van de knop, gebruikt als helpballontekst." #: menuElement_dlg_description msgid "Description:" msgstr "Beschrijving:" #: edit_find_image msgid "Find image..." msgstr "Zoek afbeelding..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Pictogram:" #: edit_find_file msgid "Find file..." msgstr "Zoek bestand..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Pad naar JClic project" #: menuElement_dlg_project msgid "Project:" msgstr "Project:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Knop tekst" #: edit_text msgid "Text:" msgstr "Tekst" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Naam van de map" #: library_dlg_name_tooltip msgid "Library name" msgstr "Naam van de bibliotheek" #: edit_name msgid "Name:" msgstr "Naam:" #: edit_title msgid "Title:" msgstr "Titel:" #: library_dlg_title msgid "Library properties" msgstr "Bibliotheek eigenschappen" #: menu_dlg_title msgid "Folder properties" msgstr "Map eigenschappen" #: menuElement_dlg_title msgid "Button properties" msgstr "Knop eigenschappen" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Verwijder huidig menu" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Verwijderen" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Verwijder huidig menu element" #: action_libraries_caption msgid "Libraries..." msgstr "Bibliotheken..." #: dlg_save_title msgid "Save file..." msgstr "Bestand opslaan..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Fout bij openen \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Standaard waarden zullen gebruikt worden." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Verwijderen" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Maak een nieuwe snelkoppeling naar een project" #: menu_newMenuName msgid "New folder" msgstr "Nieuwe map" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Maak een nieuwe map voor project knoppen" #: menu_newMenu_caption msgid "New button's folder" msgstr "Map voor nieuwe knop" #: menu_newMenuElement_caption msgid "New project button" msgstr "Nieuw project knop" #: menu_newMenuElementName msgid "New button" msgstr "Nieuw knop" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Veranderingen ongedaanmaken" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Annuleren" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Wijzig de gekozen bibliotheek" #: libraryManager_edit_caption msgid "Edit" msgstr "Bewerk" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Wijzigingen opslaan" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Kies geselecteerde map" #: library_select_caption_ok msgid "Ok" msgstr "Ok" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Selecteer" #: library_caption msgid "JClic projects library" msgstr "JClic project bibliotheek" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Geselecteerde bibliotheek openen" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Annuleren" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Annuleren" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Selecteer" #: libraryManager_caption msgid "Select library" msgstr "Kies bibliotheek" #: library_error_reading msgid "Error reading project library!" msgstr "Fout bij lezen bibliotheek!" #: wizard_next msgid "Next >" msgstr "Volgende >" #: wizard_prev msgid "< Previous" msgstr "< Vorige" #: wizard_finish msgid "Finish" msgstr "Beëindig" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Fout bij maken van bibliotheek pictogram!" #: install_title msgid "Installation of JClic projects" msgstr "Installatie van JClic projecten" #: install_info_description msgid "Installation of a new JClic project" msgstr "Installatie van een nieuw JClic project" #: install_info_from msgid "From:" msgstr "Van:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Annuleren" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Annuleer de bewerking" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Beëindig de bewerking" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Volgende stap van de bewerking" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Vorige stap van de bewerking" #: install_select_library msgid "Select the library where to install the project:" msgstr "Kies de bibliotheek om het project te installeren" #: install_copy_files msgid "File copy" msgstr "Bestand kopiëren" #: install_source msgid "Source:" msgstr "Bron:" #: install_dest msgid "Destination:" msgstr "Bestemming:" #: install_status msgid "Status:" msgstr "Status:" #: install_start msgid "Start the installation" msgstr "Begin de installatie" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Begin het kopiëren van bestanden op uw computer" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Vooruitgang van de installatie" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Wacht op bevestiging" #: install_msg_creating_dirs msgid "Creating directories" msgstr "Aanmaken mappen" #: install_msg_copying msgid "Copying file" msgstr "Bestanden copieren" #: install_msg_end msgid "Finished!" msgstr "Voltooid!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Opschonen..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Installatie afgebroken!" #: install_error msgid "Install error!" msgstr "Fout bij installatie!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Kies de map om de project pictogrammen op te slaan" #: install_library_folders msgid "Library folders:" msgstr "Bibliotheek mappen:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Het project is geïnstalleerd op uw systeem!" #: install_success_2 msgid "In order to run it, select its" msgstr "Om het uit te voeren, kies het" #: install_success_3 msgid "icon on the project library." msgstr "pictogram in de project bibliotheek" #: wizard_info msgid "Press \"Next\" to start." msgstr "Druk \"Volgende\" om te starten." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Keuze van de JClic bibliotheek" #: install_step_2 msgid "2. Download files" msgstr "2. Download bestanden" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Maak de pictogrammen" #: install_step_4 msgid "Installation finished!" msgstr "Installatie beëindigd!" #: install_info_info msgid "You request to install the project:" msgstr "Je vroeg om het project te installeren:" #: settings_title msgid "Settings" msgstr "Instellingen" #: library_error_clone msgid "Unable to clone library!" msgstr "Onmogelijk om de bibliotheek te kopiëren!" #: settings_security msgid "Security" msgstr "Beveiliging" #: settings_password_protect msgid "Protect settings with password" msgstr "Project instellingen met wachtwoord" #: settings_new_password msgid "New password:" msgstr "Nieuw wachtwoord:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Bevestig nieuw wachtwoord:" #: settings_general msgid "General" msgstr "Algemeen" #: settings_look msgid "Look & Feel:" msgstr "Look & Feel:" #: settings_skin msgid "Skin:" msgstr "Skin:" #: settings_language msgid "Language:" msgstr "Taal:" #: settings_reports msgid "Reports" msgstr "Rapporten" #: settings_report_use msgid "Write scores to a database" msgstr "Schrijf punten naar een database" #: settings_report_engine msgid "Reporter class:" msgstr "Reporter class:" #: settings_report_params msgid "Parameters:" msgstr "Parameter:" #: settings_media msgid "Multimedia" msgstr "Multimedia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimedia toegelaten" #: settings_media_system msgid "Multimedia system:" msgstr "Multimedia systeem:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Geluid gebeurtenissen ingeschakeld" #: settings_library msgid "Libraries" msgstr "Bibliotheken" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Ga automatisch naar bibliotheken als JClic start" #: m_Tools msgid "Tools" msgstr "Gereedschappen" #: m_File_Mnemonic msgid "F" msgstr "B" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "G" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Activiteit" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Bestand openen..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "JClick project bestand openen" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Open URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "JClic project direct van het internet openen" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Afsluiten" #: action_exit_tooltip msgid "Close JClic" msgstr "JClic afsluiten" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Instellingen..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Algemene programma instellingen aanpassen" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "JClic bibliotheek openen of aanpassen" #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Informatie over JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Deze afbeelding is te groot om gebruikt te worden als pictogram!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Verbinden met een JClic rapport server" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Direct JDBC verbinding:" #: settings_report_other msgid "Other:" msgstr "Andere:" #: settings_report_address msgid "Host:" msgstr "Host:" #: settings_report_port msgid "Port:" msgstr "Poort:" #: settings_report_driver msgid "Driver:" msgstr "Stuurprogramma:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Gebruiker:" #: settings_report_pwd msgid "Password:" msgstr "Wachtwoord:" #: settings_report_options msgid "Reporter params::" msgstr "Rapporteer parameters::" #: settings_report_err_server msgid "Bad report server name!" msgstr "Verkeerde rapport server naam" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "Verkeer inkomend poort nummer! Kies een waarde tussen 1000 en 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Verkeer rapport systeem gegevens!" #: settings_report_type msgid "Reporting engine:" msgstr "Rapporteer motor:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Automatisch detecteren" #: settings_security_tooltip msgid "Security settings" msgstr "Beveiliging instellingen" #: settings_report_tooltip msgid "Report system settings" msgstr "Rapport systeem instellingen" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Multimedia systeem opties" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Taal en aspect instellingen" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Bibliotheek instellingen en bewerken" #: settings_look_tooltip msgid "User interface look & feel" msgstr "User interface look & feel" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Keuze van de grafische aspecten van JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Taal keuze" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Toestaan/verhinderen van verbinding met een JClic rapport database" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Rapporteer engine gebaseerd op een TCP/IP verbinding" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Rapporteer engine gebaseerd op een directe verbinding" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Andere rapporteer engines..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Rapport server naam of IP adres" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Poort voor verbinding (standaard is 5510)" #: edit_file msgid "File:" msgstr "Bestand:" #: error_launchLibrary msgid "Error launching library" msgstr "Fout bij starten bibliotheek" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Installeren naar bron map!" #: edit_find_media msgid "Find media file..." msgstr "Zoek media bestand..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Verwijderen" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Verwijder de referentie naar de gekozen bibliotheek" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Wil je de referentie naar de gekozen bibliotheek verwijderen?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Deze bibliotheek is reeds gekoppeld aan het systeem." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Maak een nieuwe project bibliotheek" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Voegt een snelkoppeling naar een bestaande bibliotheek project toe" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Bestand of URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nieuw project bibliotheek" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "Geef de URL of de bestandsnaam van de project bibliotheek\\!" #: install_launchProject msgid "Open the project now" msgstr "Het project nu openen" #: settings_browser msgid "Preferred browser\\:" msgstr "Voorkeur browser\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "Commando om browser te starten(firefox, iexplore, mozilla, opera...)" #: settings_country msgid "Country code\\:" msgstr "Land code\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Optionele twee letter code die overeenkomt met het land specifieke variant " "van de taal (vb. \\: BR voor Braziliaans Portugees)" #: settings_variant msgid "Variant\\:" msgstr "Variant\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Optionele variant code van de taal" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_pt.po000066400000000000000000000442601335566474600234340ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-01-01 00:47+0000\n" "Last-Translator: Almufadado \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Ficheiro" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Para efectuar esta operação introduza a senha de administrador do JClic." #: m_Help msgid "Help" msgstr "Ajuda" #: m_Skin msgid "Skin" msgstr "Aspecto" #: action_helpAbout_caption msgid "About..." msgstr "Sobre..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Biblioteca principal" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Este ficheiro JClic não é do tipo \"biblioteca de projectos\".\n" "As bibliotecas são um tipo especial de ficheiro JClic." #: library_mainMenu msgid "Main menu" msgstr "Menu principal" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nova biblioteca de projectos" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "Deseja criar uma nova biblioteca ou ligar a uma biblioteca existente?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Ligar" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nova" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Criar ou conectar-se a uma nova biblioteca" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nova" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Ícone do botão" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" "Descrição do botão (mostrada quando mantém o ponteiro do rato sobre o botão)." #: menuElement_dlg_description msgid "Description:" msgstr "Descrição:" #: edit_find_image msgid "Find image..." msgstr "Procurar imagem..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Ícone:" #: edit_find_file msgid "Find file..." msgstr "Procurar ficheiro..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Caminho para o projecto JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Projecto:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Texto do botão" #: edit_text msgid "Text:" msgstr "Texto:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nome da pasta" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nome da biblioteca" #: edit_name msgid "Name:" msgstr "Nome:" #: edit_title msgid "Title:" msgstr "Título:" #: library_dlg_title msgid "Library properties" msgstr "Propriedades da biblioteca" #: menu_dlg_title msgid "Folder properties" msgstr "Propriedades da pasta" #: menuElement_dlg_title msgid "Button properties" msgstr "Propriedades do botão" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Eliminar o menu seleccionado" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Eliminar" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Eliminar o elemento de menu seleccionado" #: action_libraries_caption msgid "Libraries..." msgstr "Bibliotecas..." #: dlg_save_title msgid "Save file..." msgstr "Guardar ficheiro..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Erro ao abrir \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\".Serão utilizadas as predefinições." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Eliminar" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Criar um novo atalho para o projecto" #: menu_newMenuName msgid "New folder" msgstr "Nova pasta" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Criar uma nova pasta para os botões de projecto" #: menu_newMenu_caption msgid "New button's folder" msgstr "Nova pasta para os botões" #: menu_newMenuElement_caption msgid "New project button" msgstr "Novo botão de projecto" #: menu_newMenuElementName msgid "New button" msgstr "Novo botão" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Cancelar as modificações" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Cancelar" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Editar a biblioteca seleccionada" #: libraryManager_edit_caption msgid "Edit" msgstr "Editar" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Guardar alterações" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Escolher a pasta seleccionada" #: library_select_caption_ok msgid "Ok" msgstr "OK" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Seleccionar" #: library_caption msgid "JClic projects library" msgstr "Biblioteca de projectos JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Abrir a biblioteca seleccionada" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Cancelar" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Cancelar" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Seleccionar" #: libraryManager_caption msgid "Select library" msgstr "Selecção da biblioteca de projectos" #: library_error_reading msgid "Error reading project library!" msgstr "Erro de leitura da biblioteca de projectos!" #: wizard_next msgid "Next >" msgstr "Seguinte >" #: wizard_prev msgid "< Previous" msgstr "< Anterior" #: wizard_finish msgid "Finish" msgstr "Terminar" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Erro ao criar os ícones na biblioteca!" #: install_title msgid "Installation of JClic projects" msgstr "Instalacão de projectos JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Instalar um novo projecto JClic" #: install_info_from msgid "From:" msgstr "De:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Cancelar" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Cancelar a operação" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Terminar a operação" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Passo seguinte da operação" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Passo anterior da operação" #: install_select_library msgid "Select the library where to install the project:" msgstr "Seleccione a biblioteca em que se instalará o projecto:" #: install_copy_files msgid "File copy" msgstr "Cópia de ficheiros" #: install_source msgid "Source:" msgstr "Origem:" #: install_dest msgid "Destination:" msgstr "Destino:" #: install_status msgid "Status:" msgstr "Estado:" #: install_start msgid "Start the installation" msgstr "Iniciar a instalação" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Iniciar a cópia de ficheiros para o seu computador" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Progresso da instalação" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "A aguardar confirmação." #: install_msg_creating_dirs msgid "Creating directories" msgstr "A criar pastas" #: install_msg_copying msgid "Copying file" msgstr "A copiar o ficheiro" #: install_msg_end msgid "Finished!" msgstr "Terminado!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "A limpar..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Instalação cancelada!" #: install_error msgid "Install error!" msgstr "Ocorreu um erro durante a instalação!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Seleccione a pasta em que se criarão os ícones do projecto:" #: install_library_folders msgid "Library folders:" msgstr "Pastas da biblioteca:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "O projecto foi instalado correctamente!" #: install_success_2 msgid "In order to run it, select its" msgstr "Para executar, seleccione o" #: install_success_3 msgid "icon on the project library." msgstr "ícone na biblioteca de projectos." #: wizard_info msgid "Press \"Next\" to start." msgstr "Clique em \"Seguinte\" para continuar." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Selecção da biblioteca Jclic" #: install_step_2 msgid "2. Download files" msgstr "2. Transferência de ficheiros" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Criação de ícones" #: install_step_4 msgid "Installation finished!" msgstr "Instalação concluída!" #: install_info_info msgid "You request to install the project:" msgstr "Solicitou a instalação do projecto:" #: settings_title msgid "Settings" msgstr "Preferências" #: library_error_clone msgid "Unable to clone library!" msgstr "Não foi possível clonar a biblioteca!" #: settings_security msgid "Security" msgstr "Segurança" #: settings_password_protect msgid "Protect settings with password" msgstr "Proteger configurações com palavra-chave" #: settings_new_password msgid "New password:" msgstr "Nova palavra-chave:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Confirmar nova palavra-chave:" #: settings_general msgid "General" msgstr "Geral" #: settings_look msgid "Look & Feel:" msgstr "Aspecto:" #: settings_skin msgid "Skin:" msgstr "Visual:" #: settings_language msgid "Language:" msgstr "Idioma:" #: settings_reports msgid "Reports" msgstr "Relatórios" #: settings_report_use msgid "Write scores to a database" msgstr "Guardar os resultados das actividades numa base de dados" #: settings_report_engine msgid "Reporter class:" msgstr "Classe:" #: settings_report_params msgid "Parameters:" msgstr "Parâmetros:" #: settings_media msgid "Multimedia" msgstr "Multimídia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimídia activado" #: settings_media_system msgid "Multimedia system:" msgstr "Sistema multimídia:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Sons de evento activados" #: settings_library msgid "Libraries" msgstr "Bibliotecas" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Ir para a biblioteca quando o Jclic se inicia" #: m_Tools msgid "Tools" msgstr "Ferramentas" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "F" #: m_Help_Mnemonic msgid "H" msgstr "Y" #: m_Activity msgid "Activity" msgstr "Actividade" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Abrir ficheiro..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Abrir um ficheiro de projecto JClic" #: action_openFile_keys msgid "OO" msgstr "AO" #: action_openUrl_caption msgid "Open URL..." msgstr "Abrir URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Abrir um projecto JClic directamente da Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Sair" #: action_exit_tooltip msgid "Close JClic" msgstr "Fechar JClic" #: action_exit_keys msgid "XX" msgstr "LX" #: action_settings_caption msgid "Settings..." msgstr "Definições..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Ajustar as opções globais do programa" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "C" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Abrir ou modificar uma biblioteca JClic" #: action_libraries_keys msgid "LL" msgstr "BB" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Informação sobre o JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Esta imagem é muito grande para ser utilizada como ícone!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Conectar-se a um servidor de relatórios JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Conexão directa a uma base de dados JDBC:" #: settings_report_other msgid "Other:" msgstr "Outros:" #: settings_report_address msgid "Host:" msgstr "Servidor:" #: settings_report_port msgid "Port:" msgstr "Porta:" #: settings_report_driver msgid "Driver:" msgstr "Controlador:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Utilizador:" #: settings_report_pwd msgid "Password:" msgstr "Palavra-chave:" #: settings_report_options msgid "Reporter params::" msgstr "Parâmetros:" #: settings_report_err_server msgid "Bad report server name!" msgstr "Nome do servidor de relatórios incorrecto!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Valor incorrecto da porta no sistema de relatórios. Por favor, indique um " "valor entre 1000 e 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Dados incorrectos para o sistema de relatórios!" #: settings_report_type msgid "Reporting engine:" msgstr "Tipo de relatório:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Detectar automaticamente" #: settings_security_tooltip msgid "Security settings" msgstr "Opções de segurança" #: settings_report_tooltip msgid "Report system settings" msgstr "Configuração do sistema de relatórios" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Configuração do sistema multimédia" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Opções de idioma e aparência" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Configuração e edição de bibliotecas" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Aspecto da interface de utilizador" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Selecção do estilo gráfico do JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Selecção do idioma" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "" "Activa ou desactiva a conexão a uma base de dados de relatórios JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Motor de relatórios baseado numa conexão TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Motor de relatórios baseado numa conexão directa a uma base de dados" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Outros motores de relatórios..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nome ou endereço IP do servidor de relatórios" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Porta usada para a conexão (padrão: 5510)" #: edit_file msgid "File:" msgstr "Ficheiro:" #: error_launchLibrary msgid "Error launching library" msgstr "Erro ao abrir a biblioteca" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "A instalar na pasta de origem!" #: edit_find_media msgid "Find media file..." msgstr "Procurar recurso..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Eliminar" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Eliminar a referência à biblioteca seleccionada" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Deseja eliminar a referência à biblioteca seleccionada?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Esta biblioteca já está conectada ao sistema!" #: edit_find_image_keys msgid "F*" msgstr "B*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Criar uma nova biblioteca de projectos" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Adicionar hiperligação a uma biblioteca já existente" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Ficheiro ou URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nova biblioteca de projectos" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "Por favor, escreva a URL ou nome de ficheiro da biblioteca de projectos a " "que deseja aceder." #: install_launchProject msgid "Open the project now" msgstr "Abrir agora o projecto" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador web preferido\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comando usado para iniciar o navegador web (firefox, iexplore, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "Código do país\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Código opcional de duas letras correspondente à variante do idioma (ex.\\: " "BR para Português do Brasil)" #: settings_variant msgid "Variant\\:" msgstr "Variante\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Código opcional da variante do idioma" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_pt_BR.po000066400000000000000000000441671335566474600240250ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-03-05 17:51+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Arquivo" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "" "Para efetuar esta operação introduza a senha de administrador do JClic." #: m_Help msgid "Help" msgstr "Ajuda" #: m_Skin msgid "Skin" msgstr "Aparência" #: action_helpAbout_caption msgid "About..." msgstr "Sobre..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Biblioteca principal" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Este arquivo JClic não é do tipo \"biblioteca de projetos\".\n" "As bibliotecas são um tipo especial de arquivos JClic." #: library_mainMenu msgid "Main menu" msgstr "Menu principal" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nova biblioteca de projetos" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "¿Deseja criar uma nova biblioteca ou conectar-se a uma biblioteca existente?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Conectar-se" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Nova" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Criar ou conectar-se a uma nova biblioteca" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Nova" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "imagem a ser exibida no botão" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" "Texto flutuante que aparecerá quando se deixa o cursor parado sobre o botão." #: menuElement_dlg_description msgid "Description:" msgstr "Descrição:" #: edit_find_image msgid "Find image..." msgstr "Buscar imagem..." #: menuElement_dlg_icon msgid "Icon:" msgstr "ícone:" #: edit_find_file msgid "Find file..." msgstr "Buscar arquivo..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Local do projeto JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Projeto:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Texto do botão" #: edit_text msgid "Text:" msgstr "Texto:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nome da pasta" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nome da biblioteca" #: edit_name msgid "Name:" msgstr "Nome:" #: edit_title msgid "Title:" msgstr "Título:" #: library_dlg_title msgid "Library properties" msgstr "Propriedades da biblioteca" #: menu_dlg_title msgid "Folder properties" msgstr "Propriedades da pasta" #: menuElement_dlg_title msgid "Button properties" msgstr "Propriedades do botão" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Eliminar o menu selecionado" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Eliminar" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Eliminar o elemento de menu selecionado" #: action_libraries_caption msgid "Libraries..." msgstr "Bibliotecas..." #: dlg_save_title msgid "Save file..." msgstr "Salvar arquivo..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Erro ao abrir \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\".Valores padrão foram utilizados." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Excluir" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Criar um novo botão de projeto" #: menu_newMenuName msgid "New folder" msgstr "Nova pasta" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Criar uma nova pasta de botões de projeto" #: menu_newMenu_caption msgid "New button's folder" msgstr "Nova pasta de ícones" #: menu_newMenuElement_caption msgid "New project button" msgstr "Novo botão de projeto" #: menu_newMenuElementName msgid "New button" msgstr "Novo botão" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Cancelar as modificações" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Cancelar" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Editar a biblioteca selecionada" #: libraryManager_edit_caption msgid "Edit" msgstr "Editar" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Salvar alterações" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Escolher a pasta selecionada" #: library_select_caption_ok msgid "Ok" msgstr "Aceitar" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Selecionar" #: library_caption msgid "JClic projects library" msgstr "Biblioteca de projetos JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Abrir a biblioteca selecionada" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Cancelar" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Cancelar" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Selecionar" #: libraryManager_caption msgid "Select library" msgstr "Selecção da biblioteca de projetos" #: library_error_reading msgid "Error reading project library!" msgstr "¡Erro ao ler a biblioteca de projetos!" #: wizard_next msgid "Next >" msgstr "Próximo >" #: wizard_prev msgid "< Previous" msgstr "< Anterior" #: wizard_finish msgid "Finish" msgstr "Finalizar" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "¡Erro ao criar o ícone na biblioteca!" #: install_title msgid "Installation of JClic projects" msgstr "Instalacãoo de projetos JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Instalar um novo projeto JClic" #: install_info_from msgid "From:" msgstr "De:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Cancelar" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Cancelar a operação" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Finalizar a operação" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Passo seguinte da operação" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Passo anterior da operação" #: install_select_library msgid "Select the library where to install the project:" msgstr "Selecione a biblioteca em que se instalará o projeto:" #: install_copy_files msgid "File copy" msgstr "Cópia de arquivos" #: install_source msgid "Source:" msgstr "Origem:" #: install_dest msgid "Destination:" msgstr "Destino:" #: install_status msgid "Status:" msgstr "Estado:" #: install_start msgid "Start the installation" msgstr "Iniciar a instalação" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Iniciar a cópia de arquivos no computador" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Progresso da instalação" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Esperando confirmação." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Criando camadas" #: install_msg_copying msgid "Copying file" msgstr "Copiando o arquivo" #: install_msg_end msgid "Finished!" msgstr "¡Feito!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Limpando..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "¡Instalação cancelada!" #: install_error msgid "Install error!" msgstr "¡Houve um erro durante a instalação!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Selecione a pasta em que se criarão os ícones do projeto:" #: install_library_folders msgid "Library folders:" msgstr "Pastas da biblioteca:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "O projeto foi instalado corretamente!" #: install_success_2 msgid "In order to run it, select its" msgstr "Para executar selecione seu" #: install_success_3 msgid "icon on the project library." msgstr "Ícone na biblioteca de projetos." #: wizard_info msgid "Press \"Next\" to start." msgstr "Clique em \"Próximo\" para continuar." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Selecção da biblioteca" #: install_step_2 msgid "2. Download files" msgstr "2. Cópia de arquivos" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Criação de ícones" #: install_step_4 msgid "Installation finished!" msgstr "¡Instalação concluída!" #: install_info_info msgid "You request to install the project:" msgstr "Solicitada instalação do projeto:" #: settings_title msgid "Settings" msgstr "Configuração" #: library_error_clone msgid "Unable to clone library!" msgstr "¡Não foi possível clonar a biblioteca!" #: settings_security msgid "Security" msgstr "Segurança" #: settings_password_protect msgid "Protect settings with password" msgstr "Proteger alterações de configuração com senha" #: settings_new_password msgid "New password:" msgstr "Nova senha:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Confirmar nova senha:" #: settings_general msgid "General" msgstr "Geral" #: settings_look msgid "Look & Feel:" msgstr "Aspecto:" #: settings_skin msgid "Skin:" msgstr "Camada:" #: settings_language msgid "Language:" msgstr "Idioma:" #: settings_reports msgid "Reports" msgstr "Relatórios" #: settings_report_use msgid "Write scores to a database" msgstr "Salvar os resultados das atividades em uma base de dados" #: settings_report_engine msgid "Reporter class:" msgstr "Classe:" #: settings_report_params msgid "Parameters:" msgstr "Parâmetros:" #: settings_media msgid "Multimedia" msgstr "Multimídia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimídia ativada" #: settings_media_system msgid "Multimedia system:" msgstr "Sistema multimídia:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Sons eventuais ativados" #: settings_library msgid "Libraries" msgstr "Bibliotecas" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Mostrar automáticamente a biblioteca no início" #: m_Tools msgid "Tools" msgstr "Ferramentas" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "H" #: m_Help_Mnemonic msgid "H" msgstr "Y" #: m_Activity msgid "Activity" msgstr "Atividade" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Abrir o arquivo..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Abrir um arquivo de projeto JClic" #: action_openFile_keys msgid "OO" msgstr "AO" #: action_openUrl_caption msgid "Open URL..." msgstr "Abrir local web..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Abrir um projeto JClic diretamente da Internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Sair" #: action_exit_tooltip msgid "Close JClic" msgstr "Fechar o JClic" #: action_exit_keys msgid "XX" msgstr "LX" #: action_settings_caption msgid "Settings..." msgstr "Configuração..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Ajustar as opçoes globais do programa" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "C" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Abrir ou modificar uma biblioteca JClic" #: action_libraries_keys msgid "LL" msgstr "BB" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Informação sobre o JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "¡Esta imagem é muito grande para ser utilizada como ícone!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Conectar-se a um servidor de relatório JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Conexão direta a uma base de dados JDBC:" #: settings_report_other msgid "Other:" msgstr "Outros:" #: settings_report_address msgid "Host:" msgstr "Servidor:" #: settings_report_port msgid "Port:" msgstr "Porta:" #: settings_report_driver msgid "Driver:" msgstr "Controlador:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Usuário:" #: settings_report_pwd msgid "Password:" msgstr "Senha:" #: settings_report_options msgid "Reporter params::" msgstr "Parâmetros:" #: settings_report_err_server msgid "Bad report server name!" msgstr "¡Nome do servidor de relatórios incorreto!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Valor incorreto da porta no sistema de relatórios. Por favor, indique um " "valor entre 1000 e 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "¡Dados incorretos para o sistema de relatórios!" #: settings_report_type msgid "Reporting engine:" msgstr "Tipo de relatório:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Detecção automática" #: settings_security_tooltip msgid "Security settings" msgstr "Opç\\oes de segurança" #: settings_report_tooltip msgid "Report system settings" msgstr "Configuração do sistema de relatórios" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Configuração do sistema multimeios" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Opçoes de idioma e aparência" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Configuração e edição de bibliotecas" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Aspecto da interface de usuário" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Selecção do estilo gráfico do JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Selecção do idioma" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Ativa ou desativa a conexão a uma base de dados de relatórios JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Motor de relatórios baseado numa conexão TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Motor de relatórios baseado numa conexão direta a uma base de dados" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Outros motores de relatórios..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nome ou direcção IP do servidor de relatórios" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Porta usada para a conexão (padrão: 5510)" #: edit_file msgid "File:" msgstr "Arquivo:" #: error_launchLibrary msgid "Error launching library" msgstr "Erro ao abrir a biblioteca" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "¡Instalando na pasta origem!" #: edit_find_media msgid "Find media file..." msgstr "Buscar recurso..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Apagar" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Suprimir a referência a biblioteca selecionada" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "¿Realmente deseja eliminar a referência à biblioteca selecionada?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "¡Esta biblioteca já está conectada ao sistema!" #: edit_find_image_keys msgid "F*" msgstr "B*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Criar uma nova biblioteca de projetos" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Acrescentar um link a uma biblioteca já existente" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Arquivo ou URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nova biblioteca de projetos" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" "Por favor, escreva a URL ou nome de arquivo da biblioteca de projetos a qual " "deseja acessar." #: install_launchProject msgid "Open the project now" msgstr "Abrir agora o projeto" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador proferido\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comando usado para iniciar o navegador (firefox, iexplorer, mozilla, " "opera...)" #: settings_country msgid "Country code\\:" msgstr "Country code\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" #: settings_variant msgid "Variant\\:" msgstr "Variant\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Optional variant code of the language" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_ru.po000066400000000000000000000517101335566474600234350ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-12-18 17:43+0000\n" "Last-Translator: Artem Vorotnikov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Файл" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "Для выполнения этого действия требуется пароль администратора JClic." #: m_Help msgid "Help" msgstr "Справка" #: m_Skin msgid "Skin" msgstr "Скин" #: action_helpAbout_caption msgid "About..." msgstr "О программе..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Основная библиотека" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "" "Этот файл JClic не библиотека проекта!\n" "Бибилотеки - это специальный тип проектов JClic." #: library_mainMenu msgid "Main menu" msgstr "Главное меню" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Новая библиотека проекта" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "Вы хотите создать новую библиотеку или подключить существующую?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Подключить" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Создать" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Создать или подключить новую библиотеку" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Создать" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Значок кнопки" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "Описание кнопки, используемое как текст подсказки" #: menuElement_dlg_description msgid "Description:" msgstr "Описание:" #: edit_find_image msgid "Find image..." msgstr "Найти изображение..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Значок:" #: edit_find_file msgid "Find file..." msgstr "Найти файл..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Путь к JClic проекту" #: menuElement_dlg_project msgid "Project:" msgstr "Проект:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Текст кнопки" #: edit_text msgid "Text:" msgstr "Текст:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Имя папки" #: library_dlg_name_tooltip msgid "Library name" msgstr "Название библиотеки" #: edit_name msgid "Name:" msgstr "Название:" #: edit_title msgid "Title:" msgstr "Заголовок:" #: library_dlg_title msgid "Library properties" msgstr "Свойства библиотеки" #: menu_dlg_title msgid "Folder properties" msgstr "Свойства папки" #: menuElement_dlg_title msgid "Button properties" msgstr "Свойства кнопки" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Удалить текущее меню" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Удалить" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Удалить элемент текущего меню" #: action_libraries_caption msgid "Libraries..." msgstr "Библиотеки..." #: dlg_save_title msgid "Save file..." msgstr "Сохранить файл..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Ошибка открытия \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Будет использован стандартный." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Удалить" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Создать новый ярлык проекта" #: menu_newMenuName msgid "New folder" msgstr "Новая папка" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Создать новую папку для кнопок проекта" #: menu_newMenu_caption msgid "New button's folder" msgstr "Новая папка кнопок" #: menu_newMenuElement_caption msgid "New project button" msgstr "Новая кнопка проекта" #: menu_newMenuElementName msgid "New button" msgstr "Новая кнопка" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Отменить изменения" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Отмена" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Изменить выбранную библиотеку" #: libraryManager_edit_caption msgid "Edit" msgstr "Изменить" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Сохранить изменения" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Выбрать выделенную папку" #: library_select_caption_ok msgid "Ok" msgstr "Ok" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Выбрать" #: library_caption msgid "JClic projects library" msgstr "Библиотека проектов JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Открыть выбранную библиотеку" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Отмена" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Отмена" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Выбрать" #: libraryManager_caption msgid "Select library" msgstr "Выбрать библиотеку" #: library_error_reading msgid "Error reading project library!" msgstr "Ошибка чтения библиотеки проекта!" #: wizard_next msgid "Next >" msgstr "Далее >" #: wizard_prev msgid "< Previous" msgstr "< Назад" #: wizard_finish msgid "Finish" msgstr "Закончить" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Ошибка создания значка библиотеки!" #: install_title msgid "Installation of JClic projects" msgstr "Установка проектов JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Установка нового проекта JClic" #: install_info_from msgid "From:" msgstr "От:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Отмена" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Отменить операцию" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Завершить операцию" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Следующий шаг" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Предыдущий шаг" #: install_select_library msgid "Select the library where to install the project:" msgstr "Выберите библиотеку, куда установить проект:" #: install_copy_files msgid "File copy" msgstr "Копирование файла" #: install_source msgid "Source:" msgstr "Источник:" #: install_dest msgid "Destination:" msgstr "Назначение:" #: install_status msgid "Status:" msgstr "Состояние:" #: install_start msgid "Start the installation" msgstr "Начало установки" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Начало копирования файлов на ваш компьютер" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Состояние установки" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Ожидание подтверждения." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Создание папок" #: install_msg_copying msgid "Copying file" msgstr "Копирование файла" #: install_msg_end msgid "Finished!" msgstr "Завершено!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Подготовка очистки..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Установка отменена!" #: install_error msgid "Install error!" msgstr "Ошибка установки!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Выберите папку для размещения значков проекта:" #: install_library_folders msgid "Library folders:" msgstr "Папки библиотек:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "Проект установлен на вашем компьютере!" #: install_success_2 msgid "In order to run it, select its" msgstr "Для его запуска, выберите его" #: install_success_3 msgid "icon on the project library." msgstr "значок в библиотеке проекта." #: wizard_info msgid "Press \"Next\" to start." msgstr "Нажмите \"Далее\" для начала." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Выбор библиотеки JClic" #: install_step_2 msgid "2. Download files" msgstr "2. Загрузка файлов" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Создание значков" #: install_step_4 msgid "Installation finished!" msgstr "Установка завершена!" #: install_info_info msgid "You request to install the project:" msgstr "Вы просите установить проект" #: settings_title msgid "Settings" msgstr "Настройки" #: library_error_clone msgid "Unable to clone library!" msgstr "Невозможно клонировать библиотеку!" #: settings_security msgid "Security" msgstr "Безопасность" #: settings_password_protect msgid "Protect settings with password" msgstr "Защита настроек паролем" #: settings_new_password msgid "New password:" msgstr "Новый пароль:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Повторите новый пароль:" #: settings_general msgid "General" msgstr "Общие" #: settings_look msgid "Look & Feel:" msgstr "Смотри и Чувствуй (дизайн):" #: settings_skin msgid "Skin:" msgstr "Скин:" #: settings_language msgid "Language:" msgstr "Язык:" #: settings_reports msgid "Reports" msgstr "Отчёты" #: settings_report_use msgid "Write scores to a database" msgstr "Запись результатов в базу данных" #: settings_report_engine msgid "Reporter class:" msgstr "Класс отчитывающегося:" #: settings_report_params msgid "Parameters:" msgstr "Параметры:" #: settings_media msgid "Multimedia" msgstr "Мультимедиа" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Мультимедиа включена" #: settings_media_system msgid "Multimedia system:" msgstr "Мультимедийная система:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Звуки событий включены" #: settings_library msgid "Libraries" msgstr "Библиотеки" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Автоматически переходить к библиотекам при запуске JClic" #: m_Tools msgid "Tools" msgstr "Сервис" #: m_File_Mnemonic msgid "F" msgstr "Ф" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "Е" #: m_Help_Mnemonic msgid "H" msgstr "С" #: m_Activity msgid "Activity" msgstr "Активность" #: m_Activity_Mnemonic msgid "A" msgstr "А" #: action_openFile_caption msgid "Open file..." msgstr "Открыть файл..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Открыть файл проекта JClic" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Открыть URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Открыть файл проекта JClic из интернета" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Выход" #: action_exit_tooltip msgid "Close JClic" msgstr "Закрыть JClic" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Настройки..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Настройка общих параметров программы" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "Н" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Открыть или редактировать библиотеку JClic." #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Информация о JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Это изображение слишком велико для использования, как значок!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Подключить к серверу отчётов JClic" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Прямое JDBC соединение:" #: settings_report_other msgid "Other:" msgstr "Другое:" #: settings_report_address msgid "Host:" msgstr "Узел:" #: settings_report_port msgid "Port:" msgstr "Порт:" #: settings_report_driver msgid "Driver:" msgstr "Драйвер:" #: settings_report_url msgid "URL:" msgstr "Адрес(URL):" #: settings_report_user msgid "User:" msgstr "Пользователь:" #: settings_report_pwd msgid "Password:" msgstr "Пароль:" #: settings_report_options msgid "Reporter params::" msgstr "Параметры отчитывающегося::" #: settings_report_err_server msgid "Bad report server name!" msgstr "Неверное имя сервера отчётов!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" "Неверный номер порта! Пожалуйста, введите значение между 1000 и 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Неверные данные системы отчётов!" #: settings_report_type msgid "Reporting engine:" msgstr "Система отчётов:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Автоопределение" #: settings_security_tooltip msgid "Security settings" msgstr "Настройки безопасности" #: settings_report_tooltip msgid "Report system settings" msgstr "Настройки системы отчётов" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Параметры системы мультимедиа" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Настройки языка и вида" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Настройки библиотеки и редактор" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Дизайн интерфейса пользователя" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Выбор графического аспекта JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Выбор языка" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Включить/выключить подключение к базе данных отчётов JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Механизм отчётов базируется на TCP/IP соединении" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Механизм отчётов базируется на прямом подключении к базе данных" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Прочие механизмы отчётов..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Имя или IP адрес сервера отчётов" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Порт для подключения (по умолчанию 5510)" #: edit_file msgid "File:" msgstr "Файл:" #: error_launchLibrary msgid "Error launching library" msgstr "Ошибка запуска библиотеки" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Установка в папку источника!" #: edit_find_media msgid "Find media file..." msgstr "Найти медиа файл..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Удалить" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Удалить ссылку на выделенную библиотеку" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Вы действительно хотите удалить ссылку на выделенную библиотеку?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Эта библиотека уже подключена к системе." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Создать новую библиотеку проекта" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Добавить ссылку на существующую библиотеку проекта" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "Файл или URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Новая библиотека проекта" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "Пожалуйста, введите URL или имя файла библиотеки проекта\\!" #: install_launchProject msgid "Open the project now" msgstr "Открыть проект сейчас" #: settings_browser msgid "Preferred browser\\:" msgstr "Предпочитаемый браузер\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "Команда для запуска браузера (firefox, iexplore, mozilla, opera...)" #: settings_country msgid "Country code\\:" msgstr "Код страны\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Дополнительный двухсимвольный код, соответствующий варианту языка, " "специфичному для страны (напр.\\: BR для Brazilian Portuguese)" #: settings_variant msgid "Variant\\:" msgstr "Вариант\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Дополнительный вариант кода языка" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_tr.po000066400000000000000000000357101335566474600234360ustar00rootroot00000000000000# Turkish translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-01-30 20:48+0000\n" "Last-Translator: Serdar KAHYA \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "Dosya" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "Bu işlemi gerçekleştirmek için yönetici şifresi gereklidir." #: m_Help msgid "Help" msgstr "Yardım" #: m_Skin msgid "Skin" msgstr "Görünüm" #: action_helpAbout_caption msgid "About..." msgstr "Hakkında..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Ana kütüphane" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "Bu JClic dosyası bir proje kütüphanesi değil!" #: library_mainMenu msgid "Main menu" msgstr "Ana Menü" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Yeni proje kütüphanesi" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "" "Yeni bir kütüphane mi oluşturmak istiyorsunuz yoksa var olanamı bağlanmak " "istiyorsunuz?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Bağlan" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Yeni" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Yeni" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Buton Simgesi" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "" #: menuElement_dlg_description msgid "Description:" msgstr "Açıklama:" #: edit_find_image msgid "Find image..." msgstr "Resim bul..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Simge:" #: edit_find_file msgid "Find file..." msgstr "Dosya bul..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "JClic projesi dosya yolu" #: menuElement_dlg_project msgid "Project:" msgstr "Proje:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Buton Yazısı" #: edit_text msgid "Text:" msgstr "Metin:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Klasör adı" #: library_dlg_name_tooltip msgid "Library name" msgstr "Kütüphane adı" #: edit_name msgid "Name:" msgstr "İsim:" #: edit_title msgid "Title:" msgstr "Başlık:" #: library_dlg_title msgid "Library properties" msgstr "Kütüphane projesi" #: menu_dlg_title msgid "Folder properties" msgstr "Klasör özellikleri" #: menuElement_dlg_title msgid "Button properties" msgstr "Buton özellikleri" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Geçerli menüyü sil" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Sil" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "" #: action_libraries_caption msgid "Libraries..." msgstr "" #: dlg_save_title msgid "Save file..." msgstr "Dosyayı kaydet..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Dosya açma hatası" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "" #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Sil" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "" #: menu_newMenuName msgid "New folder" msgstr "Yeni klasör" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Proje butonları için yeni dosya oluştur" #: menu_newMenu_caption msgid "New button's folder" msgstr "Yeni buton klasörü" #: menu_newMenuElement_caption msgid "New project button" msgstr "" #: menu_newMenuElementName msgid "New button" msgstr "" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Değişiklikleri iptal et" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "İptal" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Seçilen kütüphaneyi düzenle" #: libraryManager_edit_caption msgid "Edit" msgstr "Düzenle" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Değişiklikleri Kaydet" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "İşaretli klasörü seç" #: library_select_caption_ok msgid "Ok" msgstr "Tamam" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Seç" #: library_caption msgid "JClic projects library" msgstr "JClic proje kütüphanesi" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Seçili kütüphaneyi aç" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "İptal" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "İptal" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Seç" #: libraryManager_caption msgid "Select library" msgstr "Kütüphane seç" #: library_error_reading msgid "Error reading project library!" msgstr "Proje kütüphanesi okuma hatası!" #: wizard_next msgid "Next >" msgstr "Sonraki >" #: wizard_prev msgid "< Previous" msgstr "<Önceki" #: wizard_finish msgid "Finish" msgstr "Tamamla" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Kütüphane simgeleri oluşturma hatası" #: install_title msgid "Installation of JClic projects" msgstr "JClic proje kurulumu" #: install_info_description msgid "Installation of a new JClic project" msgstr "Yeni bir JClic projesi kurulumu" #: install_info_from msgid "From:" msgstr "Gönderen:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "İptal" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "İşlemi iptal et" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "İşlemi bitir" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "İşlemin sonraki adımı" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "İŞşlemin önceki adımı" #: install_select_library msgid "Select the library where to install the project:" msgstr "Projenin kurulacağı kütüphaneyi seç" #: install_copy_files msgid "File copy" msgstr "Dosya kopyalama" #: install_source msgid "Source:" msgstr "Kaynak:" #: install_dest msgid "Destination:" msgstr "Hedef:" #: install_status msgid "Status:" msgstr "Durum:" #: install_start msgid "Start the installation" msgstr "Kurulumu başlat" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Dosyaları bilgisaya kopyalamayı başlat" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Kurulumun ilerlemesi" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "Onay için bekliyor." #: install_msg_creating_dirs msgid "Creating directories" msgstr "" #: install_msg_copying msgid "Copying file" msgstr "Dosya kopyalanıyor" #: install_msg_end msgid "Finished!" msgstr "Tamamlandı!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "" #: install_msg_cancel msgid "Installation cancelled!" msgstr "Kurulum iptal edildi!" #: install_error msgid "Install error!" msgstr "Kurulum hatası!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "" #: install_library_folders msgid "Library folders:" msgstr "" #: install_success_1 msgid "The project are now installed on your system!" msgstr "" #: install_success_2 msgid "In order to run it, select its" msgstr "" #: install_success_3 msgid "icon on the project library." msgstr "" #: wizard_info msgid "Press \"Next\" to start." msgstr "" #: install_step_1 msgid "1. Selection of JClic library" msgstr "" #: install_step_2 msgid "2. Download files" msgstr "" #: install_step_3 msgid "3. Creation of icons" msgstr "" #: install_step_4 msgid "Installation finished!" msgstr "" #: install_info_info msgid "You request to install the project:" msgstr "" #: settings_title msgid "Settings" msgstr "" #: library_error_clone msgid "Unable to clone library!" msgstr "" #: settings_security msgid "Security" msgstr "" #: settings_password_protect msgid "Protect settings with password" msgstr "" #: settings_new_password msgid "New password:" msgstr "" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "" #: settings_general msgid "General" msgstr "" #: settings_look msgid "Look & Feel:" msgstr "" #: settings_skin msgid "Skin:" msgstr "" #: settings_language msgid "Language:" msgstr "" #: settings_reports msgid "Reports" msgstr "" #: settings_report_use msgid "Write scores to a database" msgstr "" #: settings_report_engine msgid "Reporter class:" msgstr "" #: settings_report_params msgid "Parameters:" msgstr "" #: settings_media msgid "Multimedia" msgstr "" #: settings_media_enabled msgid "Multimedia enabled" msgstr "" #: settings_media_system msgid "Multimedia system:" msgstr "" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "" #: settings_library msgid "Libraries" msgstr "" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "" #: m_Tools msgid "Tools" msgstr "" #: m_File_Mnemonic msgid "F" msgstr "" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "" #: m_Help_Mnemonic msgid "H" msgstr "" #: m_Activity msgid "Activity" msgstr "" #: m_Activity_Mnemonic msgid "A" msgstr "" #: action_openFile_caption msgid "Open file..." msgstr "" #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "" #: action_openFile_keys msgid "OO" msgstr "" #: action_openUrl_caption msgid "Open URL..." msgstr "" #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "" #: action_openUrl_keys msgid "UU" msgstr "" #: action_exit_caption msgid "Exit" msgstr "" #: action_exit_tooltip msgid "Close JClic" msgstr "" #: action_exit_keys msgid "XX" msgstr "" #: action_settings_caption msgid "Settings..." msgstr "" #: action_settings_tooltip msgid "Adjust global program settings" msgstr "" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "" #: action_libraries_keys msgid "LL" msgstr "" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "" #: action_helpAbout_keys msgid "AA" msgstr "" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "" #: settings_report_other msgid "Other:" msgstr "" #: settings_report_address msgid "Host:" msgstr "" #: settings_report_port msgid "Port:" msgstr "" #: settings_report_driver msgid "Driver:" msgstr "" #: settings_report_url msgid "URL:" msgstr "" #: settings_report_user msgid "User:" msgstr "" #: settings_report_pwd msgid "Password:" msgstr "" #: settings_report_options msgid "Reporter params::" msgstr "" #: settings_report_err_server msgid "Bad report server name!" msgstr "" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "" #: settings_report_err msgid "Incorrect report system data!" msgstr "" #: settings_report_type msgid "Reporting engine:" msgstr "" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "" #: settings_media_qt msgid "QuickTime" msgstr "" #: settings_media_default msgid "Auto-detect" msgstr "" #: settings_security_tooltip msgid "Security settings" msgstr "" #: settings_report_tooltip msgid "Report system settings" msgstr "" #: settings_media_tooltip msgid "Multimedia system options" msgstr "" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "" #: settings_library_tooltip msgid "Library settings and editor" msgstr "" #: settings_look_tooltip msgid "User interface look & feel" msgstr "" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "" #: settings_language_tooltip msgid "Language selection" msgstr "" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "" #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "" #: edit_file msgid "File:" msgstr "" #: error_launchLibrary msgid "Error launching library" msgstr "" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "" #: edit_find_media msgid "Find media file..." msgstr "" #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "" #: edit_find_image_keys msgid "F*" msgstr "" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "" #: menu_newMenu_caption_keys msgid "MM" msgstr "" #: edit_find_file_keys msgid "FF" msgstr "" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "" #: install_launchProject msgid "Open the project now" msgstr "" #: settings_browser msgid "Preferred browser\\:" msgstr "" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" #: settings_country msgid "Country code\\:" msgstr "" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" #: settings_variant msgid "Variant\\:" msgstr "" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_vec.po000066400000000000000000000437741335566474600235770ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-06-01 17:01+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "File" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "Senghe vol ƚa password de ministrador de JClic par sta fatura" #: m_Help msgid "Help" msgstr "Àida" #: m_Skin msgid "Skin" msgstr "Skin" #: action_helpAbout_caption msgid "About..." msgstr "Detali..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "Librerìa prensipal" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "Sto file JClic no 'l xé na librerìa de projèto!" #: library_mainMenu msgid "Main menu" msgstr "Menu prensipal" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "Nova librerìa de projèto" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "Vusto prodùxer na librerìa niova o tacarte a una xà existente?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "Conesion" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "Niova" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "Produxi o tàchete a na librerìa niova" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "Niovo" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "Icona de 'l boton" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "Descrision d e'l boton, doparada fà un tèsto de suxerimento" #: menuElement_dlg_description msgid "Description:" msgstr "Descrision:" #: edit_find_image msgid "Find image..." msgstr "Cata imàxene..." #: menuElement_dlg_icon msgid "Icon:" msgstr "Icona" #: edit_find_file msgid "Find file..." msgstr "Cata file..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "Percorso de 'l proxèto JClic" #: menuElement_dlg_project msgid "Project:" msgstr "Proxèto:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "Tèsto de 'l boton" #: edit_text msgid "Text:" msgstr "Tèsto:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "Nòme cartèƚa" #: library_dlg_name_tooltip msgid "Library name" msgstr "Nòme librerìa" #: edit_name msgid "Name:" msgstr "Nòme:" #: edit_title msgid "Title:" msgstr "Tìtoƚo" #: library_dlg_title msgid "Library properties" msgstr "Propietà librerìa" #: menu_dlg_title msgid "Folder properties" msgstr "Propietà cartèƚa" #: menuElement_dlg_title msgid "Button properties" msgstr "Propietà boton" #: menu_delete_tooltip msgid "Delete current menu" msgstr "Scansèƚa el menu corente" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "Scansèƚa" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "Scansèƚa el elemento de menu corente" #: action_libraries_caption msgid "Libraries..." msgstr "Librerìe..." #: dlg_save_title msgid "Save file..." msgstr "Salva file..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "Ghe xé stà un eror a verxindo \"" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "\". Vegnarà doparà ƚe preinpostasion." #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "Scansèƚa" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "Inpòsta na scavesagna niova a un proxèto" #: menu_newMenuName msgid "New folder" msgstr "Cartèƚa niova" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "Produxi na cartèƚa niova par botoni de proxèto" #: menu_newMenu_caption msgid "New button's folder" msgstr "Cartèƚa par i botoni niovi" #: menu_newMenuElement_caption msgid "New project button" msgstr "Boton par proxèto niovo" #: menu_newMenuElementName msgid "New button" msgstr "Boton niovo" #: library_cancel_tooltip msgid "Cancel changes" msgstr "Scansèƚa canbiamenti" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "Anuƚa" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "Modìfega ƚa librerìa desernìa" #: libraryManager_edit_caption msgid "Edit" msgstr "Modìfega" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "Salva canbiamenti" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "Desernisi ƚa cartèƚa" #: library_select_caption_ok msgid "Ok" msgstr "OK" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "Desernisi" #: library_caption msgid "JClic projects library" msgstr "Librerìa de proxèti JClic" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "Vèrxi ƚa librerìa desernìa" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "Anuƚa" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "Anuƚa" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "Desernisi" #: libraryManager_caption msgid "Select library" msgstr "Desernisi librerìa" #: library_error_reading msgid "Error reading project library!" msgstr "Ghe xé stà un eror a lexendo ƚa librerìa de proxèti" #: wizard_next msgid "Next >" msgstr "Invanti >" #: wizard_prev msgid "< Previous" msgstr "< Indrìo" #: wizard_finish msgid "Finish" msgstr "Fenisi" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "Ghe xé stà un eror a produxendo ƚe icone de ƚa librerìa!" #: install_title msgid "Installation of JClic projects" msgstr "Istaƚasion de proxèti JClic" #: install_info_description msgid "Installation of a new JClic project" msgstr "Istaƚasion de un proxèto JClic niovo" #: install_info_from msgid "From:" msgstr "Da:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "Anuƚa" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "Anuƚa operasion" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "Fenisi operasion" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "Paso in végner de ƚa operasion" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "Paso indrìo de ƚa operasion" #: install_select_library msgid "Select the library where to install the project:" msgstr "Desernisi ƚa librerìa indove istaƚar el proxèto" #: install_copy_files msgid "File copy" msgstr "Còpia de i files" #: install_source msgid "Source:" msgstr "Sorxente" #: install_dest msgid "Destination:" msgstr "Destinasion:" #: install_status msgid "Status:" msgstr "Status:" #: install_start msgid "Start the installation" msgstr "Scominsia ƚa istaƚasion" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "Scominsia ƚa còpia de i files so 'l to ordenaor" #: install_progress_tooltip msgid "Progress of the installation" msgstr "Progresion de ƚa istaƚasion" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "In atexa de conferma." #: install_msg_creating_dirs msgid "Creating directories" msgstr "Produsion cartèƚe" #: install_msg_copying msgid "Copying file" msgstr "Còpia de 'l file" #: install_msg_end msgid "Finished!" msgstr "Fenìo!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "Drio snetar..." #: install_msg_cancel msgid "Installation cancelled!" msgstr "Istaƚasion revocada!" #: install_error msgid "Install error!" msgstr "Eror d eistaƚasion!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "Desernisi ƚa cartèƚa indove métar ƚe icone de proxèto:" #: install_library_folders msgid "Library folders:" msgstr "Cartèƚe de ƚa librerìa:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "El proxèto el xé istaƚà inte 'l to sostèma!" #: install_success_2 msgid "In order to run it, select its" msgstr "Par inviarlo, desernisi ƚa so" #: install_success_3 msgid "icon on the project library." msgstr "icona inte ƚa librerìa de proxèto." #: wizard_info msgid "Press \"Next\" to start." msgstr "Struca \"Invanti\" par scominsiar." #: install_step_1 msgid "1. Selection of JClic library" msgstr "1. Seƚesion de ƚa librerìa JClic" #: install_step_2 msgid "2. Download files" msgstr "2. Descargo de i files" #: install_step_3 msgid "3. Creation of icons" msgstr "3. Produsion de ƚe icone" #: install_step_4 msgid "Installation finished!" msgstr "Istaƚasion terminada!" #: install_info_info msgid "You request to install the project:" msgstr "Te gà dimandà de istaƚar el proxèto:" #: settings_title msgid "Settings" msgstr "Inpostasion" #: library_error_clone msgid "Unable to clone library!" msgstr "No se gà podesto clonar ƚa librerìa!" #: settings_security msgid "Security" msgstr "Seguresa" #: settings_password_protect msgid "Protect settings with password" msgstr "Pretèxi ƚe inpostasion co' na password" #: settings_new_password msgid "New password:" msgstr "Password niova:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "Conferma password niova:" #: settings_general msgid "General" msgstr "Xeneral" #: settings_look msgid "Look & Feel:" msgstr "Faciavista:" #: settings_skin msgid "Skin:" msgstr "Skin:" #: settings_language msgid "Language:" msgstr "Lengua:" #: settings_reports msgid "Reports" msgstr "Reports" #: settings_report_use msgid "Write scores to a database" msgstr "Scrivi pontexii so un database" #: settings_report_engine msgid "Reporter class:" msgstr "Clase reporter:" #: settings_report_params msgid "Parameters:" msgstr "Paràmetri:" #: settings_media msgid "Multimedia" msgstr "Multimedia" #: settings_media_enabled msgid "Multimedia enabled" msgstr "Multimedia ativà" #: settings_media_system msgid "Multimedia system:" msgstr "Sistèma multimedia:" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "Sonòri evento ativài" #: settings_library msgid "Libraries" msgstr "Librerìe" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "Và a ƚe librerìe da to pòssta co se invia JClic" #: m_Tools msgid "Tools" msgstr "Inpreste" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "Atività" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "Vèrxi file..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "Vèrxi un file de proxèto JClic" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "Vèrxi URL..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "Vèrxi un proxèto JClic indretamente da 'l internet" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "Sòrti" #: action_exit_tooltip msgid "Close JClic" msgstr "Sara JClic" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "Inpostasion..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "Regoƚasion inpostasion xeneraƚi de l programa" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "Vèrxi i modìfega na librerìa de JClic." #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "Informasion so JClic" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "Sta imàxene ƚa xé masa granda par ser doparada fà icona!" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "Conesion a server de reports JClic:" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "Conesion dirèta JDBC:" #: settings_report_other msgid "Other:" msgstr "Altro:" #: settings_report_address msgid "Host:" msgstr "Host:" #: settings_report_port msgid "Port:" msgstr "Pòrta:" #: settings_report_driver msgid "Driver:" msgstr "Driver:" #: settings_report_url msgid "URL:" msgstr "URL:" #: settings_report_user msgid "User:" msgstr "Utente:" #: settings_report_pwd msgid "Password:" msgstr "Password:" #: settings_report_options msgid "Reporter params::" msgstr "Paràmetri report:" #: settings_report_err_server msgid "Bad report server name!" msgstr "Nòme de server report sbalià!" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "Nùmaro pòrta sabalià! Inserisi un vaƚor fra 1000 e 65000." #: settings_report_err msgid "Incorrect report system data!" msgstr "Dati de sitèma de report sbaliài!" #: settings_report_type msgid "Reporting engine:" msgstr "Motor de report:" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "Java Media Framework (JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "Auto-detect" #: settings_security_tooltip msgid "Security settings" msgstr "Inpostasion de seguresa" #: settings_report_tooltip msgid "Report system settings" msgstr "Inpostasion sistèma de report" #: settings_media_tooltip msgid "Multimedia system options" msgstr "Opsion sistèma multimedia" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "Inpostasion lengua e faciavista" #: settings_library_tooltip msgid "Library settings and editor" msgstr "Inpostasion e editor librerìa" #: settings_look_tooltip msgid "User interface look & feel" msgstr "Faciavista interfaicia utente" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "Seƚesion de 'l aspèto gràfego de JClic" #: settings_language_tooltip msgid "Language selection" msgstr "Seƚesion lengua" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "Ativa/dexativa ƚa conesion a un database de reports JClic" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "Motor de report baxà so na conesion tipo TCP/IP" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "Motor de report baxà so na conesion dirèta a database" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "Altri motori de report..." #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "Nòme i indriso IP de 'l server de report" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "Pòrta doparada par ƚa conesion (preinpostà xé 5510)" #: edit_file msgid "File:" msgstr "File:" #: error_launchLibrary msgid "Error launching library" msgstr "Ghe xé stà un eror inviando ƚa librerìa" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "Drio istaƚar inte cartèƚa sorxente!" #: edit_find_media msgid "Find media file..." msgstr "Cata file media..." #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "Scansèƚa" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "Eƚìmina riferimento a ƚa librerìa seƚesionada" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "Vusto dabon scanseƚar el riferimento a ƚa librerìa seƚesionada?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "Sta librerìa ƚa xé xà linkada a 'l sistèma." #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "Produxi na librerìa de proxèto niova" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "Xonta un link a na librerìa de proxèto existente" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "File o URL\\:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "Nova librerìa de projèto" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "Inserisi URL o nòme de 'l file de ƚa librerìa de proxèto!" #: install_launchProject msgid "Open the project now" msgstr "Vèrxi el proxèto" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferìo\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comando doparà par inviar el navegador (firefox, iexplore, mozilla, opera...)" #: settings_country msgid "Country code\\:" msgstr "Còdexe paexe\\:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "" "Còddexe opsional de do létare corospondente a ƚa variante spesìfega de " "lengua (ex.\\: BR par portoghexe braxilian)" #: settings_variant msgid "Variant\\:" msgstr "Variansa\\:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "Còdexe opsional de variansa de lengua" i18n/fromLaunchpad/po/jclic-player/PlayerMessages_zh_TW.po000066400000000000000000000416201335566474600240410ustar00rootroot00000000000000# Chinese (Traditional) translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-05-20 03:27+0000\n" "Last-Translator: pikachu \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #. # JClic player messages #: m_File msgid "File" msgstr "檔案" #: settings_passwordRequired msgid "JClic admin password is required in order to perform this operation." msgstr "需要JClic管理者密碼才能執行此操作" #: m_Help msgid "Help" msgstr "幫助" #: m_Skin msgid "Skin" msgstr "外觀" #: action_helpAbout_caption msgid "About..." msgstr "關於..." #: libraryManager_mainLibraryTitle msgid "Main library" msgstr "主要目錄庫" #: library_badFormat msgid "" "This JClic file is not a project library!\n" "Libraries are a special type of JClic projects." msgstr "這個JClic檔不是一個專案的函式庫" #: library_mainMenu msgid "Main menu" msgstr "主選單" #: library_newLibraryName msgctxt "library_newLibraryName" msgid "New project library" msgstr "新專案庫" #: libraryManager_new_prompt msgid "Do you want to create a new library or connect to a existing one?" msgstr "你要創建新的目錄庫,或連接到一個現有的?" #: libraryManager_connectToLibrary msgid "Connect" msgstr "連線" #: libraryManager_createNewLibrary msgctxt "libraryManager_createNewLibrary" msgid "New" msgstr "新增" #: libraryManager_new_tooltip msgid "Create or connect to a new library" msgstr "建立或連線新的資料庫" #: libraryManager_new_caption msgctxt "libraryManager_new_caption" msgid "New" msgstr "新增" #: menuElement_dlg_icon_tooltip msgid "Button icon" msgstr "按紐圖示" #: menuElement_dlg_description_tooltip msgid "Description of the button, used as a tooltip text." msgstr "按鈕的詳細描述(用tooltip語法)" #: menuElement_dlg_description msgid "Description:" msgstr "描述:" #: edit_find_image msgid "Find image..." msgstr "尋找圖檔..." #: menuElement_dlg_icon msgid "Icon:" msgstr "圖示:" #: edit_find_file msgid "Find file..." msgstr "尋找檔案..." #: menuElement_dlg_project_tooltip msgid "Path to JClic project" msgstr "JClic專案路徑" #: menuElement_dlg_project msgid "Project:" msgstr "專案:" #: menuElement_dlg_text_tooltip msgid "Button text" msgstr "按紐內容" #: edit_text msgid "Text:" msgstr "文字:" #: menu_dlg_name_tooltip msgid "Folder name" msgstr "資料夾名稱" #: library_dlg_name_tooltip msgid "Library name" msgstr "函式庫名稱" #: edit_name msgid "Name:" msgstr "名稱:" #: edit_title msgid "Title:" msgstr "標題:" #: library_dlg_title msgid "Library properties" msgstr "函式庫屬性" #: menu_dlg_title msgid "Folder properties" msgstr "資料夾屬性" #: menuElement_dlg_title msgid "Button properties" msgstr "按紐屬性" #: menu_delete_tooltip msgid "Delete current menu" msgstr "刪除目前目錄" #: menu_delete_caption msgctxt "menu_delete_caption" msgid "Delete" msgstr "刪除" #: menuElement_delete_tooltip msgid "Delete current menu element" msgstr "刪除目前目錄元素" #: action_libraries_caption msgid "Libraries..." msgstr "函式庫" #: dlg_save_title msgid "Save file..." msgstr "儲存檔案..." #: error_propertiesFile_beg msgid "Error opening \"" msgstr "開啟時發生錯誤:" #: error_propertiesFile_end msgid "\". Defaults will be used." msgstr "。.個違規被發現" #: menuElement_delete_caption msgctxt "menuElement_delete_caption" msgid "Delete" msgstr "刪除" #: menu_newMenuElement_tooltip msgid "Create a new shortcut to a project" msgstr "建立新的捷徑到此專案" #: menu_newMenuName msgid "New folder" msgstr "新資料夾" #: menu_newMenu_tooltip msgid "Create a new folder for project buttons" msgstr "為專案的按紐建立一個新資料夾" #: menu_newMenu_caption msgid "New button's folder" msgstr "新的按紐資料夾" #: menu_newMenuElement_caption msgid "New project button" msgstr "新的專案按紐" #: menu_newMenuElementName msgid "New button" msgstr "新按紐" #: library_cancel_tooltip msgid "Cancel changes" msgstr "取消改變" #: library_cancel_caption msgctxt "library_cancel_caption" msgid "Cancel" msgstr "取消" #: libraryManager_edit_tooltip msgid "Edit selected library" msgstr "編輯所選的資料庫" #: libraryManager_edit_caption msgid "Edit" msgstr "編輯" #: library_select_caption_ok_tooltip msgid "Save changes" msgstr "儲存更改" #: library_select_caption_tooltip msgid "Choose selected folder" msgstr "選擇所選的資料夾" #: library_select_caption_ok msgid "Ok" msgstr "Ok" #: library_select_caption msgctxt "library_select_caption" msgid "Select" msgstr "選取" #: library_caption msgid "JClic projects library" msgstr "JClic專案函式庫" #: libraryManager_select_tooltip msgid "Open the selected library" msgstr "打開所選的函式庫" #: libraryManager_cancel_tooltip msgctxt "libraryManager_cancel_tooltip" msgid "Cancel" msgstr "取消" #: libraryManager_cancel_caption msgctxt "libraryManager_cancel_caption" msgid "Cancel" msgstr "取消" #: libraryManager_select_caption msgctxt "libraryManager_select_caption" msgid "Select" msgstr "選取" #: libraryManager_caption msgid "Select library" msgstr "選擇函式庫" #: library_error_reading msgid "Error reading project library!" msgstr "讀取函式庫錯誤!" #: wizard_next msgid "Next >" msgstr "下一步>" #: wizard_prev msgid "< Previous" msgstr "<上一步" #: wizard_finish msgid "Finish" msgstr "完成" #: library_error_creating_icons msgid "Error creating library icons!" msgstr "製造函式庫圖示失敗!" #: install_title msgid "Installation of JClic projects" msgstr "JClic專案的初使值" #: install_info_description msgid "Installation of a new JClic project" msgstr "新的JClic專案初使值" #: install_info_from msgid "From:" msgstr "從:" #: wizard_cancel msgctxt "wizard_cancel" msgid "Cancel" msgstr "取消" #: wizard_cancel_tooltip msgid "Cancel the operation" msgstr "取消操作" #: wizard_finish_tooltip msgid "Finish the operation" msgstr "完成操作" #: wizard_next_tooltip msgid "Next step of the operation" msgstr "回復下一步操作" #: wizard_prev_tooltip msgid "Previous step of the operation" msgstr "復原操作" #: install_select_library msgid "Select the library where to install the project:" msgstr "選擇一個資料庫來安裝專案" #: install_copy_files msgid "File copy" msgstr "複製檔案" #: install_source msgid "Source:" msgstr "來源:" #: install_dest msgid "Destination:" msgstr "目的地:" #: install_status msgid "Status:" msgstr "狀態:" #: install_start msgid "Start the installation" msgstr "開始安裝" #: install_start_tooltip msgid "Start the copy of files to your computer" msgstr "開始複製檔案至電腦" #: install_progress_tooltip msgid "Progress of the installation" msgstr "安裝過程" #: install_msg_waiting msgid "Waiting for confirmation." msgstr "等待確認" #: install_msg_creating_dirs msgid "Creating directories" msgstr "建立使用手冊" #: install_msg_copying msgid "Copying file" msgstr "複製檔案" #: install_msg_end msgid "Finished!" msgstr "安裝完成!" #: install_msg_cleanup msgid "Performing cleanup..." msgstr "清除動作…" #: install_msg_cancel msgid "Installation cancelled!" msgstr "取消安裝!" #: install_error msgid "Install error!" msgstr "安裝錯誤!" #: install_select_folder msgid "Select the folder where to place the project icons:" msgstr "選擇資料夾來放置專案圖示" #: install_library_folders msgid "Library folders:" msgstr "函式庫置放資料夾:" #: install_success_1 msgid "The project are now installed on your system!" msgstr "專案已安裝至系統!" #: install_success_2 msgid "In order to run it, select its" msgstr "為了執行本程式,必需選擇這些選項" #: install_success_3 msgid "icon on the project library." msgstr "專案資料庫的圖示" #: wizard_info msgid "Press \"Next\" to start." msgstr "選\"下一步\"開始" #: install_step_1 msgid "1. Selection of JClic library" msgstr "JClic資料庫的選擇" #: install_step_2 msgid "2. Download files" msgstr "下載檔案" #: install_step_3 msgid "3. Creation of icons" msgstr "製作圖示" #: install_step_4 msgid "Installation finished!" msgstr "安裝完成!" #: install_info_info msgid "You request to install the project:" msgstr "您需要安裝專案:" #: settings_title msgid "Settings" msgstr "設定" #: library_error_clone msgid "Unable to clone library!" msgstr "無法複製函式庫!" #: settings_security msgid "Security" msgstr "安全性" #: settings_password_protect msgid "Protect settings with password" msgstr "設置保護密碼" #: settings_new_password msgid "New password:" msgstr "新密碼:" #: settings_new_password_confirm msgid "Confirm new password:" msgstr "確認新密碼:" #: settings_general msgid "General" msgstr "一般" #: settings_look msgid "Look & Feel:" msgstr "感觀:" #: settings_skin msgid "Skin:" msgstr "外觀:" #: settings_language msgid "Language:" msgstr "語言:" #: settings_reports msgid "Reports" msgstr "報告" #: settings_report_use msgid "Write scores to a database" msgstr "寫入資料庫的分數" #: settings_report_engine msgid "Reporter class:" msgstr "回報者的class" #: settings_report_params msgid "Parameters:" msgstr "參數:" #: settings_media msgid "Multimedia" msgstr "多媒體" #: settings_media_enabled msgid "Multimedia enabled" msgstr "多媒體可執行" #: settings_media_system msgid "Multimedia system:" msgstr "多媒體系統" #: settings_media_event_sounds msgid "Event sounds enabled" msgstr "事件音效使用中" #: settings_library msgid "Libraries" msgstr "函式庫" #: settings_library_autorun msgid "Automatically go to libraries when JClic starts" msgstr "當JClic開始時,自動引入的函式庫" #: m_Tools msgid "Tools" msgstr "工具箱" #: m_File_Mnemonic msgid "F" msgstr "F" #: m_Tools_Mnemonic msgctxt "m_Tools_Mnemonic" msgid "T" msgstr "T" #: m_Help_Mnemonic msgid "H" msgstr "H" #: m_Activity msgid "Activity" msgstr "活動" #: m_Activity_Mnemonic msgid "A" msgstr "A" #: action_openFile_caption msgid "Open file..." msgstr "開啟檔案..." #: action_openFile_tooltip msgid "Open a JClic project file" msgstr "打開JClic專案" #: action_openFile_keys msgid "OO" msgstr "OO" #: action_openUrl_caption msgid "Open URL..." msgstr "開啟網址..." #: action_openUrl_tooltip msgid "Open a JClic project directly form Internet" msgstr "直接從網路開始JClic專案" #: action_openUrl_keys msgid "UU" msgstr "UU" #: action_exit_caption msgid "Exit" msgstr "結束" #: action_exit_tooltip msgid "Close JClic" msgstr "關閉JClic" #: action_exit_keys msgid "XX" msgstr "XX" #: action_settings_caption msgid "Settings..." msgstr "設定..." #: action_settings_tooltip msgid "Adjust global program settings" msgstr "調整全域設定" #: action_settings_keys msgctxt "action_settings_keys" msgid "T" msgstr "T" #: action_libraries_tooltip msgid "Open or edit a JClic library." msgstr "打開或編輯JClic資料庫" #: action_libraries_keys msgid "LL" msgstr "LL" #: action_helpAbout_tooltip msgid "Information about JClic" msgstr "JClic的相關資訊" #: action_helpAbout_keys msgid "AA" msgstr "AA" #: menuElement_err_iconTooLarge msgid "This image is too large to be used as an icon!" msgstr "這圖片太大,無法作為圖示使用。" #: settings_report_tcp msgid "Connect to JClic report server:" msgstr "連接到JClic回報伺服器" #: settings_report_jdbc msgid "Direct JDBC connection:" msgstr "JDBC直連:" #: settings_report_other msgid "Other:" msgstr "其他:" #: settings_report_address msgid "Host:" msgstr "主機:" #: settings_report_port msgid "Port:" msgstr "連接埠:" #: settings_report_driver msgid "Driver:" msgstr "驅動程式:" #: settings_report_url msgid "URL:" msgstr "網址:" #: settings_report_user msgid "User:" msgstr "使用者:" #: settings_report_pwd msgid "Password:" msgstr "密碼:" #: settings_report_options msgid "Reporter params::" msgstr "回報參數" #: settings_report_err_server msgid "Bad report server name!" msgstr "不可行的回報伺服器名稱" #: settings_report_err_port msgid "Incorrect port number! Please enter a value between 1000 and 65000." msgstr "錯誤的連接埠號碼!值必需在1000到65000之間" #: settings_report_err msgid "Incorrect report system data!" msgstr "錯誤的回報伺服器資料" #: settings_report_type msgid "Reporting engine:" msgstr "回報甲撆" #: settings_media_jmf msgid "Java Media Framework (JMF)" msgstr "JAVA媒體架構(JMF)" #: settings_media_qt msgid "QuickTime" msgstr "QuickTime" #: settings_media_default msgid "Auto-detect" msgstr "自動檢測" #: settings_security_tooltip msgid "Security settings" msgstr "安全性設定" #: settings_report_tooltip msgid "Report system settings" msgstr "回報伺服器設定" #: settings_media_tooltip msgid "Multimedia system options" msgstr "多媒體系統選項" #: settings_general_tooltip msgid "Language and aspect settings" msgstr "語言及外觀設定" #: settings_library_tooltip msgid "Library settings and editor" msgstr "函式庫設定和編輯器" #: settings_look_tooltip msgid "User interface look & feel" msgstr "使用者外觀" #: settings_skin_tooltip msgid "Selection of the graphic aspect of JClic" msgstr "JClic的圖像外觀" #: settings_language_tooltip msgid "Language selection" msgstr "語言選擇" #: settings_report_use_tooltip msgid "Enables/disables the connection to a JClic reports database" msgstr "JClic回報資料庫的許可" #: settings_report_tcp_tooltip msgid "Reporting engine based on a TCP/IP connection" msgstr "TCP/IP 直連的回報引撆" #: settings_report_jdbc_tooltip msgid "Reporting engine based on a direct connection to a database" msgstr "直連資料庫的回報引擎" #: settings_report_other_tooltip msgid "Other reporting engines..." msgstr "其它回報引撆" #: settings_report_address_tooltip msgid "Report server name or IP address" msgstr "回報伺服器的名稱或IP" #: settings_report_port_tooltip msgid "Port used for connection (default is 5510)" msgstr "連接用的連接埠(預設為5510):" #: edit_file msgid "File:" msgstr "檔案:" #: error_launchLibrary msgid "Error launching library" msgstr "執行函式庫錯誤" #: install_toSourceFolder msgid "Installing to source folder!" msgstr "安裝到來源資料夾" #: edit_find_media msgid "Find media file..." msgstr "尋找媒體檔" #: libraryManager_delete_caption msgctxt "libraryManager_delete_caption" msgid "Delete" msgstr "刪除" #: libraryManager_delete_tooltip msgid "Delete the reference to the selected library" msgstr "永久刪除函式庫" #: libraryManager_delete_confirm msgid "Do you really want to delete the reference to the selected library?" msgstr "你確定要永久刪除這個函式庫嗎?" #: libraryManager_new_exists msgid "This library is already linked to the system." msgstr "這個函式庫已連接至系統" #: edit_find_image_keys msgid "F*" msgstr "F*" #: menu_newMenuElement_caption_keys msgid "NN" msgstr "NN" #: menu_newMenu_caption_keys msgid "MM" msgstr "MM" #: edit_find_file_keys msgid "FF" msgstr "FF" #: libraryManager_newLibaryOption msgid "Create new project library" msgstr "新增專案庫" #: libraryManager_connectToExistingOption msgid "Add a link to an exisiting project library" msgstr "新增連結到現有的專案庫" #: libraryManager_fileOrUrlCaption msgid "File or URL\\:" msgstr "檔案或網址:" #: libraryManager_newLibraryTitle msgctxt "libraryManager_newLibraryTitle" msgid "New project library" msgstr "新專案庫" #: libraryManager_warnNoFileSelected msgid "Please enter thr URL or file name of the project library\\!" msgstr "請輸入專案庫的網址或專案名稱" #: install_launchProject msgid "Open the project now" msgstr "現在開啟專案" #: settings_browser msgid "Preferred browser\\:" msgstr "偏好的瀏覽器:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "用來開啟瀏覧器(firefox, iexplore, mozilla, opera...)的指令" #: settings_country msgid "Country code\\:" msgstr "國家代碼:" #: settings_country_tooltip msgid "" "Optional two-letter code corresponding to the country-specific variant of " "the language (ex.\\: BR for Brazilian Portuguese)" msgstr "用兩個字母來簡寫語言(EX:BR for Brazilian Portuguese)" #: settings_variant msgid "Variant\\:" msgstr "變數:" #: settings_variant_tooltip msgid "Optional variant code of the language" msgstr "語言的變數代碼(非必須)" i18n/fromLaunchpad/po/jclic-reportServer/000077500000000000000000000000001335566474600206455ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_ar.po000066400000000000000000000124321335566474600260230ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-03-26 09:17+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "" #: error_incorrectData msgid "Incorrect data!" msgstr "" #: column_IP_title msgid "IP" msgstr "" #: column_port_title msgid "Port" msgstr "" #: column_started_title msgid "Started" msgstr "" #: column_lastMessage_title msgid "Last message" msgstr "" #: column_IP_tooltip msgid "Client IP address" msgstr "" #: column_port_tooltip msgid "Local port used in this connection" msgstr "" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "" #: form_title msgid "JClic reports server" msgstr "" #: form_connections_title msgid "Connections:" msgstr "" #: form_messages_title msgid "System messages:" msgstr "" #: form_settings_title msgid "Settings:" msgstr "" #: form_connections_close msgid "Close connection" msgstr "" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "" #: form_settings_database msgid "Database:" msgstr "" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "" #: form_settings_password_tooltip msgid "System DB password" msgstr "" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "" #: form_settings_user_tooltip msgid "System DB user name" msgstr "" #: form_settings_user msgid "User:" msgstr "" #: ERROR msgid "ERROR" msgstr "" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "" #: form_btn_start msgid "Start" msgstr "" #: form_btn_stop msgid "Stop" msgstr "" #: form_btn_exit msgid "Exit" msgstr "" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "" #: form_messages_verbose msgid "Verbose" msgstr "" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "" #: form_messages_copy msgid "Copy to clipboard" msgstr "" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "" #: form_messages_clear msgid "Clear" msgstr "" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "" #: error_DB msgid "Requested action could not be completed" msgstr "" #: settings_title msgid "JClic reports server settings" msgstr "" #: settings_options_title msgid "Options" msgstr "" #: settings_options_language msgid "Language:" msgstr "" #: settings_options_look msgid "Look & feel:" msgstr "" #: settings_db_title msgid "Database" msgstr "" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "" #: settings_options_tooltips msgid "Tooltips" msgstr "" #: settings_db_url msgid "URL:" msgstr "" #: settings_db_usr msgid "DB user:" msgstr "" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "" #: settings_server_title msgid "Reports server" msgstr "" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "" #: settings_server_autostart msgid "Autostart" msgstr "" #: settings_web_title msgid "Web server" msgstr "" #: settings_server_logFile msgid "Write logs to file:" msgstr "" #: settings_button msgid "Settings..." msgstr "" #: error_writting_settings msgid "Error writting settings file!" msgstr "" #: form_btn_show msgid "launch browser..." msgstr "" #: error_starting_browser msgid "Error launching browser!" msgstr "" #: error_opening_logs msgid "Error opening log files!" msgstr "" #: settings_file msgid "File..." msgstr "" #: settings_tablePrefix msgid "Table names prefix:" msgstr "" #: settings_createTables msgid "Create tables if not exist" msgstr "" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "" #: settings_browser msgid "Preferred browser\\:" msgstr "" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_ast.po000066400000000000000000000161061335566474600262120ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # Xandru Armesto , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-10-01 09:54+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "¡Nun se pudo arrancar el sirvidor!" #: error_incorrectData msgid "Incorrect data!" msgstr "¡Datos incorreutos!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Puertu" #: column_started_title msgid "Started" msgstr "Aniciáu" #: column_lastMessage_title msgid "Last message" msgstr "Mensax caberu" #: column_IP_tooltip msgid "Client IP address" msgstr "Direición IP del veceru" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Puertu llocal utilizáu nesta conexón" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Data y hora na que s'anició la conexón" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Cabecera del mensax caberu recibíu" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Nun se pudieron cargar les propiedaes del ficheru \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\". Usando valores por defeutu." #: form_title msgid "JClic reports server" msgstr "Sirvidor d'informes JClic" #: form_connections_title msgid "Connections:" msgstr "Conexones:" #: form_messages_title msgid "System messages:" msgstr "Mensaxes de sistema:" #: form_settings_title msgid "Settings:" msgstr "Configuración:" #: form_connections_close msgid "Close connection" msgstr "Zarrar conexón" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Zarrar la conexón seleicionada" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Controlador:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Controlador JDBC que se va emplegar p'acceder a la base de datos" #: form_settings_database msgid "Database:" msgstr "Base de datos:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nome de la base de datos d'informes" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Puertu:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Puertu TCP nel que'l sirvidor atiende les peticiones" #: form_settings_password_tooltip msgid "System DB password" msgstr "Contraseña del usuariu col que s'accede a la base de datos" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Contraseña:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Nome d'usuariu col que se va acceder a la base de datos" #: form_settings_user msgid "User:" msgstr "Usuariu:" #: ERROR msgid "ERROR" msgstr "ERROR" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Tiempu máximu:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Máximo tiempu d'inactividá permitíu pa les conexones" #: form_btn_start msgid "Start" msgstr "Entamar" #: form_btn_stop msgid "Stop" msgstr "Parar" #: form_btn_exit msgid "Exit" msgstr "Colar" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Parar el sirvidor y zarrar el programa" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Zarrar toles conexones y parar el sirvidor" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Entamar a atender a los veceros" #: form_messages_verbose msgid "Verbose" msgstr "Amosar información ampliada" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Amuesa tolos mensaxes" #: form_messages_copy msgid "Copy to clipboard" msgstr "Copiar al cartafueyu" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Copia'l conteníu de la consola na memoria" #: form_messages_clear msgid "Clear" msgstr "Llimpiar" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Llimpia la ventana de mensaxes" #: error_DB msgid "Requested action could not be completed" msgstr "L'aición solicitada nun se pudo completar" #: settings_title msgid "JClic reports server settings" msgstr "Configuración del sirvidor d'informes JClic" #: settings_options_title msgid "Options" msgstr "Opciones" #: settings_options_language msgid "Language:" msgstr "Llingua:" #: settings_options_look msgid "Look & feel:" msgstr "Apariencia:" #: settings_db_title msgid "Database" msgstr "Base de datos" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Controlador:" #: settings_options_tooltips msgid "Tooltips" msgstr "Etiquetes d'aida" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Usuariu de la base de datos" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Contraseña:" #: settings_server_title msgid "Reports server" msgstr "Sirvidor d'informes" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Tiempu máximu d'espera:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Puertu:" #: settings_server_autostart msgid "Autostart" msgstr "Arranque automáticu" #: settings_web_title msgid "Web server" msgstr "Sirvidor web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Escribir logs nel ficheru:" #: settings_button msgid "Settings..." msgstr "Configuración..." #: error_writting_settings msgid "Error writting settings file!" msgstr "¡Error al escribir el ficheru de configuración!" #: form_btn_show msgid "launch browser..." msgstr "Arrancar el restolador..." #: error_starting_browser msgid "Error launching browser!" msgstr "Error al arrancar el restolador\\!" #: error_opening_logs msgid "Error opening log files!" msgstr "¡Error al abrir los ficheros de rexistru!" #: settings_file msgid "File..." msgstr "Ficheru..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefixu de los nomes de les tables:" #: settings_createTables msgid "Create tables if not exist" msgstr "Criar tables si nun esisten" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Duración máxima de una sesión inactiva (minutos)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Restolador preferíu\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comandu emplegáu pa arrancar el restolador (firefox, iexplore, mozilla, " "opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_bs.po000066400000000000000000000155241335566474600260320ustar00rootroot00000000000000# Bosnian translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-05-19 14:03+0000\n" "Last-Translator: Meliha Gadara \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Nije moguće pokrenuti poslužitelj!" #: error_incorrectData msgid "Incorrect data!" msgstr "Netačni podaci!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Priključak" #: column_started_title msgid "Started" msgstr "Započeto" #: column_lastMessage_title msgid "Last message" msgstr "Zadnja poruka" #: column_IP_tooltip msgid "Client IP address" msgstr "IP adresa korisnika" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Lokalni priključak korišten u ovoj konekciji" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Datum i vrijeme kada je konekcija započeta" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Zaglavlje posljednje primljene poruke" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Nije moguće učitati karakteristike datoteke\"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "Upotrebljavanje standardnih podešavanja." #: form_title msgid "JClic reports server" msgstr "JClic poslužitelj izvješća" #: form_connections_title msgid "Connections:" msgstr "Konekcije:" #: form_messages_title msgid "System messages:" msgstr "Poruke sistema:" #: form_settings_title msgid "Settings:" msgstr "Podešavanja:" #: form_connections_close msgid "Close connection" msgstr "Zatvori konekciju" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Zatvori odabranu konekciju" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Drajver:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "JDBC drajver koji se koristi za konekciju s bazom podataka" #: form_settings_database msgid "Database:" msgstr "Baza podataka:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Naziv baze izvješća" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Priključak:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "" #: form_settings_password_tooltip msgid "System DB password" msgstr "Poslužitelj DB lozinka" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Lozinka:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Poslužitelj DB korisničko ime" #: form_settings_user msgid "User:" msgstr "Korisnik:" #: ERROR msgid "ERROR" msgstr "GREŠKA" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Vrijeme isticanja:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Maksimalno dozvoljeno trajanje neaktivnosti za konekcije." #: form_btn_start msgid "Start" msgstr "Početak" #: form_btn_stop msgid "Stop" msgstr "Zaustavi" #: form_btn_exit msgid "Exit" msgstr "Izlaz" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Zaustavi poslužitelj i ugasi program" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Zatvori sve konekcije i zaustavi poslužitelj" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Započni komunikaciju za klijente" #: form_messages_verbose msgid "Verbose" msgstr "Detaljnije" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Prikaži sve poruke" #: form_messages_copy msgid "Copy to clipboard" msgstr "Kopiraj u međuspremnik" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Kopiraj konzolni izlaz u međuspremnik" #: form_messages_clear msgid "Clear" msgstr "Obriši" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Obriši konzolni izlaz" #: error_DB msgid "Requested action could not be completed" msgstr "Zadana akcije se ne može ispuniti" #: settings_title msgid "JClic reports server settings" msgstr "JClic postavke poslužitelja izvješća" #: settings_options_title msgid "Options" msgstr "Opcije" #: settings_options_language msgid "Language:" msgstr "Jezik:" #: settings_options_look msgid "Look & feel:" msgstr "" #: settings_db_title msgid "Database" msgstr "Baza podataka" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Drajver:" #: settings_options_tooltips msgid "Tooltips" msgstr "Pojašnjenja" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "DB korisnik:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Lozinka:" #: settings_server_title msgid "Reports server" msgstr "Poslužitelj izvješća" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Vrijeme isticanja:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Priključak:" #: settings_server_autostart msgid "Autostart" msgstr "Automatsko pokretanje" #: settings_web_title msgid "Web server" msgstr "Web poslužitelj" #: settings_server_logFile msgid "Write logs to file:" msgstr "Zapiši prijave u datoteku:" #: settings_button msgid "Settings..." msgstr "Podešavanja..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Greška prilikom pisanja postavki datoteke!" #: form_btn_show msgid "launch browser..." msgstr "pokrenuti preglednik..." #: error_starting_browser msgid "Error launching browser!" msgstr "Greška pri pokretanju preglednika!" #: error_opening_logs msgid "Error opening log files!" msgstr "Greška pri otvaranju datoteka za prijavljivanje!" #: settings_file msgid "File..." msgstr "Datoteka..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefiks tabele imena:" #: settings_createTables msgid "Create tables if not exist" msgstr "Kreirajte tabele ako ne postoje" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Trajanje sesije(minute)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Omiljeni preglednik\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Komande upotrebljene za pokretanje preglednika (firefox, iexplore, mozilla, " "opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_ca.po000066400000000000000000000155061335566474600260110ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-01-22 18:04+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "No s'ha pogut posar en marxa el servidor!" #: error_incorrectData msgid "Incorrect data!" msgstr "Dades incorrectes!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Port" #: column_started_title msgid "Started" msgstr "Engegat" #: column_lastMessage_title msgid "Last message" msgstr "Darrer missatge" #: column_IP_tooltip msgid "Client IP address" msgstr "Adreça IP de l'ordinador client" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Port local emprat per a aquesta connexió" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Data i hora en què s'ha iniciat la connexió" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Capçalera del darrer missatge rebut" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "No es pot obrir el fitxer de configuració \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\". El programa utilitzarà els valors per defecte." #: form_title msgid "JClic reports server" msgstr "Servidor d'informes JClic" #: form_connections_title msgid "Connections:" msgstr "Connexions:" #: form_messages_title msgid "System messages:" msgstr "Missatges de sistema:" #: form_settings_title msgid "Settings:" msgstr "Configuració:" #: form_connections_close msgid "Close connection" msgstr "Tanca la connexió" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Tanca la connexió seleccionada a la llista" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Controlador:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Controlador JDBC utilitzat per a connectar amb la base de dades" #: form_settings_database msgid "Database:" msgstr "Base de dades:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nom de la base de dades d'informes" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Port:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Port TCP on el servidor atendrà les connexions" #: form_settings_password_tooltip msgid "System DB password" msgstr "Contrasenya de l'usuari de sistema" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Contrasenya:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Nom d'usuari de sistema de la base de dades" #: form_settings_user msgid "User:" msgstr "Usuari:" #: ERROR msgid "ERROR" msgstr "ERROR" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Temps màxim d'espera:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Màxim nombre de segons d'inactivitat permès a les connexions" #: form_btn_start msgid "Start" msgstr "Engega" #: form_btn_stop msgid "Stop" msgstr "Atura" #: form_btn_exit msgid "Exit" msgstr "Surt" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Atura el servidor i tancar el programa" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Tancar totes les connexions i atura el servidor" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Inicia l'atenció als clients" #: form_messages_verbose msgid "Verbose" msgstr "Mostra informació ampliada" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Mostra tots els missatges entrants" #: form_messages_copy msgid "Copy to clipboard" msgstr "Copia" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Copia el contingut de la finestra a la carpeta de sistema" #: form_messages_clear msgid "Clear" msgstr "Esborra" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Neteja la finestra de missatges" #: error_DB msgid "Requested action could not be completed" msgstr "L'acció sol·licitada no s'ha pogut completar" #: settings_title msgid "JClic reports server settings" msgstr "Configuració de servidor d'informes JClic" #: settings_options_title msgid "Options" msgstr "Opcions" #: settings_options_language msgid "Language:" msgstr "Idioma:" #: settings_options_look msgid "Look & feel:" msgstr "Aparença:" #: settings_db_title msgid "Database" msgstr "Base de dades" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Controlador:" #: settings_options_tooltips msgid "Tooltips" msgstr "Etiquetes d'ajuda" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Usuari de la base de dades:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Contrasenya:" #: settings_server_title msgid "Reports server" msgstr "Servidor d'informes" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Temps màxim d'espera:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Port:" #: settings_server_autostart msgid "Autostart" msgstr "Engegada automàtica" #: settings_web_title msgid "Web server" msgstr "Servidor web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Escriure logs al fitxer:" #: settings_button msgid "Settings..." msgstr "Configuració..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Error en escriure el fitxer de configuració!" #: form_btn_show msgid "launch browser..." msgstr "engega el navegador..." #: error_starting_browser msgid "Error launching browser!" msgstr "Error en executar el navegador!" #: error_opening_logs msgid "Error opening log files!" msgstr "Error en obrir els fitxers de registre!" #: settings_file msgid "File..." msgstr "Fitxer..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefix dels noms de les taules:" #: settings_createTables msgid "Create tables if not exist" msgstr "Crea taules si no existeixen" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Durada màxima d'una sessió inactiva (minuts):" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferit:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Ordre emprada per a engegar el navegador (firefox, iexplore, mozilla, " "opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_cs.po000066400000000000000000000154551335566474600260360ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-04-29 17:31+0000\n" "Last-Translator: David Kolibáč \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Nelze nastartovat server!" #: error_incorrectData msgid "Incorrect data!" msgstr "Chybná data!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Port" #: column_started_title msgid "Started" msgstr "Spuštěn" #: column_lastMessage_title msgid "Last message" msgstr "Poslední zpráva" #: column_IP_tooltip msgid "Client IP address" msgstr "IP adresa klienta" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Lokální port použitý v tomto spojení" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Datum a čas navázání spojení" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Hlavička poslední obdržené zprávy" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Nelze nahrát soubor s vlastnostmi \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Používá se výchozí nastavení." #: form_title msgid "JClic reports server" msgstr "JClic server sestav" #: form_connections_title msgid "Connections:" msgstr "Spojení:" #: form_messages_title msgid "System messages:" msgstr "Systémové zprávy:" #: form_settings_title msgid "Settings:" msgstr "Nastavení:" #: form_connections_close msgid "Close connection" msgstr "Ukončit spojení" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Ukončit vybraná spojení" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Ovladač:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "JDBC ovladač por připojení k databázi" #: form_settings_database msgid "Database:" msgstr "Databáze:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Jméno databáze pro sestavy" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Port:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "TCP port pro spojení" #: form_settings_password_tooltip msgid "System DB password" msgstr "Heslo pro systémovou databázi" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Heslo:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Uživatelské jméno pro systémovou databázi" #: form_settings_user msgid "User:" msgstr "Uživatel:" #: ERROR msgid "ERROR" msgstr "CHYBA" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Časový limit:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Maximální nečinnost v sekundách povolená pro sezení" #: form_btn_start msgid "Start" msgstr "Začátek" #: form_btn_stop msgid "Stop" msgstr "Stop" #: form_btn_exit msgid "Exit" msgstr "Ukončit" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Zastavit server a vypnout program" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Zavřít všechna spojení a zastavit server" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Začíná se naslouchat klientům" #: form_messages_verbose msgid "Verbose" msgstr "Podrobné" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Zobrazit všechny zprávy" #: form_messages_copy msgid "Copy to clipboard" msgstr "Kopírovat do schránky" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Kopírovat výstup konzole do schránky" #: form_messages_clear msgid "Clear" msgstr "Vymazat" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Vyčistit výstup konzole" #: error_DB msgid "Requested action could not be completed" msgstr "Požadovaná akce nemůže být dokončena" #: settings_title msgid "JClic reports server settings" msgstr "Nastavení JClic serveru sestav" #: settings_options_title msgid "Options" msgstr "Možnosti" #: settings_options_language msgid "Language:" msgstr "Jazyk:" #: settings_options_look msgid "Look & feel:" msgstr "Vzhled:" #: settings_db_title msgid "Database" msgstr "Databáze" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Ovladač:" #: settings_options_tooltips msgid "Tooltips" msgstr "Bublinová nápověda" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "DB uživatel:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Heslo:" #: settings_server_title msgid "Reports server" msgstr "Server sestav" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Časový limit:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Port:" #: settings_server_autostart msgid "Autostart" msgstr "Automatické spuštění" #: settings_web_title msgid "Web server" msgstr "Webový server" #: settings_server_logFile msgid "Write logs to file:" msgstr "Zapsat sestavy do souboru:" #: settings_button msgid "Settings..." msgstr "Nastavení..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Chyba při zápisu do souboru s nastavením!" #: form_btn_show msgid "launch browser..." msgstr "spustit prohlížeč..." #: error_starting_browser msgid "Error launching browser!" msgstr "Chyba při spouštění prohlížeče!" #: error_opening_logs msgid "Error opening log files!" msgstr "Chyba při otevírání souborů se sestavami!" #: settings_file msgid "File..." msgstr "Soubor..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefix jmen tabulek:" #: settings_createTables msgid "Create tables if not exist" msgstr "Vytvořit tabulky pokud neexistují" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Životnost sezení (minutes)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Upřednostňovaný prohlížeč\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Příkaz pro spuštění prohlížeče (firefox, iexplore, mozilla, opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_de.po000066400000000000000000000153531335566474600260160ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-08-20 09:52+0000\n" "Last-Translator: Martina \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Server kann nicht gestartet werden!" #: error_incorrectData msgid "Incorrect data!" msgstr "Falsche Daten!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Port" #: column_started_title msgid "Started" msgstr "Hergestellt" #: column_lastMessage_title msgid "Last message" msgstr "Letzte Nachricht" #: column_IP_tooltip msgid "Client IP address" msgstr "IP Adresse des Client" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Lokaler Port für diese Verbindung" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Datum und Zeitpunkt zu dem die Verbindung hergestellt wurde" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Header der letzten empfangenen Nachricht" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Configurationsdatei kann nicht geladen werden \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Standardeinstellungen verwenden." #: form_title msgid "JClic reports server" msgstr "JClic Datenbank" #: form_connections_title msgid "Connections:" msgstr "Verbindungen:" #: form_messages_title msgid "System messages:" msgstr "Systemmeldungen:" #: form_settings_title msgid "Settings:" msgstr "Einstellungen:" #: form_connections_close msgid "Close connection" msgstr "Verbindung schließen" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Ausgewählte Verbindung schließen" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Treiber:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "" "JDBC Treiber, der zum Herstellen der Verbindung mit der Datenbank verwendet " "wird" #: form_settings_database msgid "Database:" msgstr "Datenbank:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Name der JClic Datenbank" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Port:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "TCP Port, über den die Verbingung zum Server hergestellt wird" #: form_settings_password_tooltip msgid "System DB password" msgstr "Passwort für Zugriff auf DB-System" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Passwort:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Username für Zugriff auf Datenbank" #: form_settings_user msgid "User:" msgstr "User:" #: ERROR msgid "ERROR" msgstr "FEHLER" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Timeout:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "" "Erlaubte Ruhezeit (in Sekunden), nach der die Verbindung getrennt wird" #: form_btn_start msgid "Start" msgstr "Beginnen" #: form_btn_stop msgid "Stop" msgstr "Beenden" #: form_btn_exit msgid "Exit" msgstr "Beenden" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Verbindung zum Server schließen und Programm herunterfahren" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Alle Verbindungen schließen und Server beenden" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Clients auflisten" #: form_messages_verbose msgid "Verbose" msgstr "Details anzeigen" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Alle Nachrichten anzeigen" #: form_messages_copy msgid "Copy to clipboard" msgstr "In Zwischenablage kopieren" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Kopiert Inhalte des Fensters in die Zwischenablage" #: form_messages_clear msgid "Clear" msgstr "Löschen" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Löscht alle Nachrichten aus dem Fenster" #: error_DB msgid "Requested action could not be completed" msgstr "Gewünschter Vorgang kann nicht fertiggestellt werden" #: settings_title msgid "JClic reports server settings" msgstr "Einstellungen für JClic Datenbank" #: settings_options_title msgid "Options" msgstr "Optionen" #: settings_options_language msgid "Language:" msgstr "Sprache:" #: settings_options_look msgid "Look & feel:" msgstr "Erscheinungsbild:" #: settings_db_title msgid "Database" msgstr "Datenbank" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Treiber:" #: settings_options_tooltips msgid "Tooltips" msgstr "Tooltips" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "DB User" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Passwort:" #: settings_server_title msgid "Reports server" msgstr "Datenbank" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Timeout:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Port:" #: settings_server_autostart msgid "Autostart" msgstr "Autostart" #: settings_web_title msgid "Web server" msgstr "Webserver" #: settings_server_logFile msgid "Write logs to file:" msgstr "History in Logfile eintragen :" #: settings_button msgid "Settings..." msgstr "Einstellungen..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Fehler beim Eintragen der Konfigurationseinstellungen!" #: form_btn_show msgid "launch browser..." msgstr "Browser öffnen..." #: error_starting_browser msgid "Error launching browser!" msgstr "Fehler beim Öffnen des Browsers!" #: error_opening_logs msgid "Error opening log files!" msgstr "Fehler beim Öffnen der Log-Files!" #: settings_file msgid "File..." msgstr "Datei..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Präfix der Tabelle:" #: settings_createTables msgid "Create tables if not exist" msgstr "Verzeichnisse erstellen wenn nicht vorhanden" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Höchstdauer für inaktive Sitzung (in Minuten):" #: settings_browser msgid "Preferred browser\\:" msgstr "Bevorzugter Browser:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "Befehl zum Starten des Browsers (Firefox, IE, Mozilla, Opera,...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_el.po000066400000000000000000000207371335566474600260300ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-15 11:59+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Αδυναμία έναρξης του διακομιστή!" #: error_incorrectData msgid "Incorrect data!" msgstr "Λανθασμένα δεδομένα!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Θύρα" #: column_started_title msgid "Started" msgstr "Ξεκίνησε" #: column_lastMessage_title msgid "Last message" msgstr "Τελευταίο μήνυμα" #: column_IP_tooltip msgid "Client IP address" msgstr "Διεύθυνση IP πελάτη" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Μια τοπική θύρα χρησιμοποιείται σε αυτή τη σύνδεση" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Ημερομηνία και ώρα έναρξης της σύνδεσης" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Επικεφαλίδα τελευταίου μηνύματος" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Αδυναμία φόρτωσης του αρχείου ιδιοτήτων \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Χρήση προεπιλεγμένων ρυθμίσεων" #: form_title msgid "JClic reports server" msgstr "Διακομιστής αναφορών του JClic" #: form_connections_title msgid "Connections:" msgstr "Συνδέσεις:" #: form_messages_title msgid "System messages:" msgstr "Μηνύματα συστήματος:" #: form_settings_title msgid "Settings:" msgstr "Ρυθμίσεις:" #: form_connections_close msgid "Close connection" msgstr "Κλείσιμο σύνδεσης" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Κλείσιμο επιλεγμένης σύνδεσης" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Οδηγός:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Χρήση του οδηγού JDBC για σύνδεση στη βάση δεδομένων" #: form_settings_database msgid "Database:" msgstr "Βάση δεδομένων:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Όνομα βάσης δεδομένων αναφορών" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Port:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Θύρα ακρόασης TCP του διακομιστή" #: form_settings_password_tooltip msgid "System DB password" msgstr "Κωδικός πρόσβασης για τη βάση δεδομένων του συστήματος" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Κωδικός πρόσβασης:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Όνομα χρήστη για τη βάση δεδομένων του συστήματος" #: form_settings_user msgid "User:" msgstr "Χρήστης:" #: ERROR msgid "ERROR" msgstr "ΣΦΑΛΜΑ" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Χρονικό περιθώριο:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "" "Μέγιστος χρόνος (σε δευτερόλεπτα) επιτρεπόμενης αδράνειας για τις συνδέσεις" #: form_btn_start msgid "Start" msgstr "Έναρξη" #: form_btn_stop msgid "Stop" msgstr "Διακοπή" #: form_btn_exit msgid "Exit" msgstr "Έξοδος" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Τερματισμός διακομιστή και κλείσιμο του προγράμματος" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Κλείσιμο όλων των συνδέσεων και τερματισμός του διακομιστή" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Έναρξη ακρόασης για πελάτες" #: form_messages_verbose msgid "Verbose" msgstr "Αναλυτικά" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Εμφάνιση όλων των μηνυμάτων" #: form_messages_copy msgid "Copy to clipboard" msgstr "Αντιγραφή στο πρόχειρο" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Αντιγραφή χειριστηρίου εξόδου στο πρόχειρο" #: form_messages_clear msgid "Clear" msgstr "Καθαρισμός" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Καθαρισμός κονσόλας εξόδου" #: error_DB msgid "Requested action could not be completed" msgstr "Η αιτούμενη ενέργεια δεν μπορεί να ολοκληρωθεί" #: settings_title msgid "JClic reports server settings" msgstr "Το JClic αναφέρει τις ρυθμίσεις του διακομιστή" #: settings_options_title msgid "Options" msgstr "Επιλογές" #: settings_options_language msgid "Language:" msgstr "Γλώσσα:" #: settings_options_look msgid "Look & feel:" msgstr "Εμφάνιση & αίσθηση:" #: settings_db_title msgid "Database" msgstr "Βάση δεδομένων" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Οδηγός:" #: settings_options_tooltips msgid "Tooltips" msgstr "Συμβουλές οθόνης" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Χρήστης βάσης δεδομένων:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Κωδικός πρόσβασης:" #: settings_server_title msgid "Reports server" msgstr "Αναφορές διακομιστή" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Χρονικό περιθώριο:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Θύρα:" #: settings_server_autostart msgid "Autostart" msgstr "Αυτόματη έναρξη" #: settings_web_title msgid "Web server" msgstr "Διακομιστής Web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Αποθήκευση των καταγραφών στο αρχείο:" #: settings_button msgid "Settings..." msgstr "Ρυθμίσεις..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Σφάλμα κατά την εγγραφή του αρχείου ρυθμίσεων!" #: form_btn_show msgid "launch browser..." msgstr "φόρτωση φυλλομετρητή..." #: error_starting_browser msgid "Error launching browser!" msgstr "Σφάλμα φόρτωσης φυλλομετρητή!" #: error_opening_logs msgid "Error opening log files!" msgstr "Σφάλμα ανοίγματος αρχείων καταγραφής!" #: settings_file msgid "File..." msgstr "Αρχείο..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Πρόθημα ονόματος πινάκων:" #: settings_createTables msgid "Create tables if not exist" msgstr "Δημιουργία πινάκων αν δεν υπάρχουν" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Διάρκεια συνεδρίας (λεπτά)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Προτιμώμενος φυλλομετρητής\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Εντολή που χρησιμοποιείται για τη φόρτωση του φυλλομετρητή (firefox, " "iexplore, mozilla, opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_es.po000066400000000000000000000156331335566474600260360ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-11 17:53+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "¡No se ha podido poner en marcha el servidor!" #: error_incorrectData msgid "Incorrect data!" msgstr "¡Datos incorrectos!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Puerto" #: column_started_title msgid "Started" msgstr "Iniciado" #: column_lastMessage_title msgid "Last message" msgstr "Último mensaje" #: column_IP_tooltip msgid "Client IP address" msgstr "Dirección IP del cliente" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Puerto local utilizado en esta conexión" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Fecha y hora en la que se inició la conexión" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Cabecera del último mensaje recibido" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "No se ha podido abrir el archivo de inicialización \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\". Usando valores por defecto." #: form_title msgid "JClic reports server" msgstr "Servidor de informes JClic" #: form_connections_title msgid "Connections:" msgstr "Conexiones:" #: form_messages_title msgid "System messages:" msgstr "Mensajes de sistema:" #: form_settings_title msgid "Settings:" msgstr "Configuración:" #: form_connections_close msgid "Close connection" msgstr "Cerrar conexión" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Cerrar la conexión seleccionada" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Controlador:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Controlador JDBC que se utilizará para acceder a l base de datos" #: form_settings_database msgid "Database:" msgstr "Base de datos:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nombre de la base de datos de informes" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Puerto:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Puerto TCP en el que el servidor atiende las peticiones" #: form_settings_password_tooltip msgid "System DB password" msgstr "Contraseña del usuario con el que se accede a la base de datos" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Contraseña:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Nombre de usuario con el que se accederá a la base de datos" #: form_settings_user msgid "User:" msgstr "Usuario:" #: ERROR msgid "ERROR" msgstr "ERROR" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Timeout:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "" "Máximo tiempo de inactividad permitido antes de cerrar una conexión, en " "segundo" #: form_btn_start msgid "Start" msgstr "Iniciar" #: form_btn_stop msgid "Stop" msgstr "Parar" #: form_btn_exit msgid "Exit" msgstr "Salir" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Parar el servidor y cerrar el programa" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Cerrar todas las conexiones y parar el servidor" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Empezar a atender a los clientes" #: form_messages_verbose msgid "Verbose" msgstr "Mostrar información ampliada" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Muestra todos los mensajes" #: form_messages_copy msgid "Copy to clipboard" msgstr "Copiar" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Copia el contenido de la cónsola en la memoria" #: form_messages_clear msgid "Clear" msgstr "Limpiar" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Limpia la ventana de mensajes" #: error_DB msgid "Requested action could not be completed" msgstr "La acción solicitada no se ha podido completar" #: settings_title msgid "JClic reports server settings" msgstr "Configuración del servidor de informes JClic" #: settings_options_title msgid "Options" msgstr "Opciones" #: settings_options_language msgid "Language:" msgstr "Idioma:" #: settings_options_look msgid "Look & feel:" msgstr "Apariencia:" #: settings_db_title msgid "Database" msgstr "Base de datos" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Controlador:" #: settings_options_tooltips msgid "Tooltips" msgstr "Etiquetas de ayuda" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Usuario de la base de datos" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Contraseña:" #: settings_server_title msgid "Reports server" msgstr "Servidor de informes" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Tiempo máximo de espera:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Puerto:" #: settings_server_autostart msgid "Autostart" msgstr "Arranque automático" #: settings_web_title msgid "Web server" msgstr "Servidor web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Escribir logs en el archivo:" #: settings_button msgid "Settings..." msgstr "Configuración..." #: error_writting_settings msgid "Error writting settings file!" msgstr "¡Error al escribir el archivo de configuración!" #: form_btn_show msgid "launch browser..." msgstr "Iniciar el navegador..." #: error_starting_browser msgid "Error launching browser!" msgstr "Error al iniciar el navegador\\!" #: error_opening_logs msgid "Error opening log files!" msgstr "¡Error al abrir los archivos de registro!" #: settings_file msgid "File..." msgstr "Archivo..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefijo de los nombers de las tablas:" #: settings_createTables msgid "Create tables if not exist" msgstr "Crear tablas si no existen" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Duración máxima de una sesión inactiva (minutos)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferido\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Orden utilizada para lanzar el navegador (firefox, iexplore, mozilla, " "opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_eu.po000066400000000000000000000154761335566474600260450ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-02-18 16:44+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Ezin izan da zerbitzaria abian jarri!" #: error_incorrectData msgid "Incorrect data!" msgstr "Datuak ez dira zuzenak!" #: column_IP_title msgid "IP" msgstr "IP-a" #: column_port_title msgid "Port" msgstr "Ataka" #: column_started_title msgid "Started" msgstr "Hasita" #: column_lastMessage_title msgid "Last message" msgstr "Azken mezua" #: column_IP_tooltip msgid "Client IP address" msgstr "Bezeroaren IP helbidea" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Konexio honetan erabilitako ataka lokala" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Konexio hasi zeneko data eta ordua" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Jasotako azken mezuaren goiburua" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Ezin da kargatu ezaugarri-fitxategia \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Erabili berezko ezarpenak." #: form_title msgid "JClic reports server" msgstr "JClic txostenen zerbitzaria" #: form_connections_title msgid "Connections:" msgstr "Konexioak:" #: form_messages_title msgid "System messages:" msgstr "Sistemaren mezuak:" #: form_settings_title msgid "Settings:" msgstr "Ezarpenak:" #: form_connections_close msgid "Close connection" msgstr "Itxi konexioa" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Itxi aukeratutako konexioa" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Kontrolatzailea:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Datu-basearekin konektatzeko JDBC kontrolatzailea" #: form_settings_database msgid "Database:" msgstr "Datu-basea:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Txostenen datu-basearen izena" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Ataka:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Zerbitzariak eskariei erantzuteko TCP portua" #: form_settings_password_tooltip msgid "System DB password" msgstr "Sistemaren DB pasahitza" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Pasahitza:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Sistemaren DB erabiltzaile-izena" #: form_settings_user msgid "User:" msgstr "Erabiltzailea:" #: ERROR msgid "ERROR" msgstr "ERROREA" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Denbora-muga:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Konexiorako gehinezko jarduerarik gabeko segundu-kopurua" #: form_btn_start msgid "Start" msgstr "Hasi" #: form_btn_stop msgid "Stop" msgstr "Gelditu" #: form_btn_exit msgid "Exit" msgstr "Irten" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Zerbitzaria geldiarazi eta programa itxi" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Itxi konexioak eta zerbitzaria geldiarazi" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Bezeroei kasu egiten hasi" #: form_messages_verbose msgid "Verbose" msgstr "Zehatzago" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Erakutsi mezu guztiak" #: form_messages_copy msgid "Copy to clipboard" msgstr "Kopiatu arbelean" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Kontsolaren edukia memoriara kopiatu" #: form_messages_clear msgid "Clear" msgstr "Garbitu" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Garbitu mezuen leihoa" #: error_DB msgid "Requested action could not be completed" msgstr "Eskatutako ekintza ezin izan da osatu" #: settings_title msgid "JClic reports server settings" msgstr "JClic txostenen zerbitzariaren ezarpenak" #: settings_options_title msgid "Options" msgstr "Aukerak" #: settings_options_language msgid "Language:" msgstr "Hizkuntza:" #: settings_options_look msgid "Look & feel:" msgstr "Itxura:" #: settings_db_title msgid "Database" msgstr "Datu-basea" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Kontrolatzailea:" #: settings_options_tooltips msgid "Tooltips" msgstr "Laguntza-etiketak" #: settings_db_url msgid "URL:" msgstr "URL-a:" #: settings_db_usr msgid "DB user:" msgstr "DB erabiltzailea:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Pasahitza:" #: settings_server_title msgid "Reports server" msgstr "Txostenen zerbitzaria" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Denbora-muga:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Ataka:" #: settings_server_autostart msgid "Autostart" msgstr "Berez hasi" #: settings_web_title msgid "Web server" msgstr "Web zerbitzaria" #: settings_server_logFile msgid "Write logs to file:" msgstr "Idatzi log-ak fitxategian:" #: settings_button msgid "Settings..." msgstr "Ezarpenak..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Errorea ezarpenen fitxategia idaztean!" #: form_btn_show msgid "launch browser..." msgstr "nabigatzailea abiarazi..." #: error_starting_browser msgid "Error launching browser!" msgstr "Errorea nabigatzailea abiaraztean!" #: error_opening_logs msgid "Error opening log files!" msgstr "Errorea erregistro-fitxategiak irekitzean!" #: settings_file msgid "File..." msgstr "Fitxategia..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Taulen izenen aurrizkia:" #: settings_createTables msgid "Create tables if not exist" msgstr "Sortu taulak ez badaude" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Saioaren iraupena (minututan)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Lehenetsitako nabigatzailea\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Nabigatzailea abiarazteko erabilitako agindua (firefox, iexplore, mozilla, " "opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_fr.po000066400000000000000000000154351335566474600260360ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-11 17:53+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Impossible de démarrer le serveur \\!" #: error_incorrectData msgid "Incorrect data!" msgstr "Donnée incorrecte \\!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Port" #: column_started_title msgid "Started" msgstr "Démarré" #: column_lastMessage_title msgid "Last message" msgstr "Dernier message" #: column_IP_tooltip msgid "Client IP address" msgstr "Adresse IP client" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Port local utilisé dans cette connexion" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Date et heure auxquelles la connexion a démarré" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "En-tête du dernier message reçu" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Impossible de charger le fichier des propriétés \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Utilisation des paramètres par défaut." #: form_title msgid "JClic reports server" msgstr "Serveur de rapports JClic" #: form_connections_title msgid "Connections:" msgstr "Connexions\\:" #: form_messages_title msgid "System messages:" msgstr "Messages system\\:" #: form_settings_title msgid "Settings:" msgstr "paramètres\\:" #: form_connections_close msgid "Close connection" msgstr "Fermer connexion" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Fermer la connexion sélectionnée" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Driver\\:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Driver JDBC à utiliser pour se connecter à la base" #: form_settings_database msgid "Database:" msgstr "Base de données\\:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nom de la base de données de rapports" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Port\\:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Port TCP où le serveur écoutera les connexions" #: form_settings_password_tooltip msgid "System DB password" msgstr "System DB mot de passe" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Mot de passe\\:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Nom d'utilisateur System DB" #: form_settings_user msgid "User:" msgstr "Utilisateur\\:" #: ERROR msgid "ERROR" msgstr "ERREUR" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Timeout\\:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Secondes maximales d'inactivité allouées aux connexions" #: form_btn_start msgid "Start" msgstr "Démarrer" #: form_btn_stop msgid "Stop" msgstr "Stop" #: form_btn_exit msgid "Exit" msgstr "Quitter" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Arrêter le serveur et arrêter le programme" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Fermer toutes les connexions et arrêter le serveur" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Commencer la veille pour les clients" #: form_messages_verbose msgid "Verbose" msgstr "Verbose" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Afficher tous les messages" #: form_messages_copy msgid "Copy to clipboard" msgstr "Copier dans le presse-papiers" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Copier la console de sortie vers le presse-papiers" #: form_messages_clear msgid "Clear" msgstr "Effacer" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Efface la console de sortie" #: error_DB msgid "Requested action could not be completed" msgstr "L'action requise ne peut être terminée" #: settings_title msgid "JClic reports server settings" msgstr "Paramètres du serveur de rapports JClic" #: settings_options_title msgid "Options" msgstr "Options" #: settings_options_language msgid "Language:" msgstr "Langue\\:" #: settings_options_look msgid "Look & feel:" msgstr "Apparence\\:" #: settings_db_title msgid "Database" msgstr "Base de données" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Driver\\:" #: settings_options_tooltips msgid "Tooltips" msgstr "Outils" #: settings_db_url msgid "URL:" msgstr "URL\\:" #: settings_db_usr msgid "DB user:" msgstr "Utilisateur DB\\:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Mot de passe\\:" #: settings_server_title msgid "Reports server" msgstr "Serveur de rapports" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Timeout\\:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Port\\:" #: settings_server_autostart msgid "Autostart" msgstr "Démarrage automatique" #: settings_web_title msgid "Web server" msgstr "serveur Web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Ecrire les connexions dans le fichier\\:" #: settings_button msgid "Settings..." msgstr "Paramètres..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Erreur d'écriture du fichier paramètres \\!" #: form_btn_show msgid "launch browser..." msgstr "Lancer l'explorateur..." #: error_starting_browser msgid "Error launching browser!" msgstr "Erreur au lancement de l'explorateur \\!" #: error_opening_logs msgid "Error opening log files!" msgstr "Erreur à l'ouverture des fichiers log \\!" #: settings_file msgid "File..." msgstr "Fichier..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Préfixe des noms de table\\:" #: settings_createTables msgid "Create tables if not exist" msgstr "Créer les tables si elles n'existent pas" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Durée de vie d'une session (minutes)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Explorateur préféré\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Commande utilisée pour lancer l'explorateur (firefox, iexplore, mozilla, " "opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_gl.po000066400000000000000000000154501335566474600260260ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-12-21 20:08+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Non se puido pór en marcha o servidor!" #: error_incorrectData msgid "Incorrect data!" msgstr "Datos incorrectos!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Porto" #: column_started_title msgid "Started" msgstr "Comezado" #: column_lastMessage_title msgid "Last message" msgstr "Última mensaxe" #: column_IP_tooltip msgid "Client IP address" msgstr "Enderezo IP do cliente" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Porto local empregado nesta conexión" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Data e hora na que comezou a conexión" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Cabeceira da última mensaxe recibida" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Non é posíbel abrir o arquivo de configuración \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\". Empregaranse os valores por omisión." #: form_title msgid "JClic reports server" msgstr "Servidor de informes JClic" #: form_connections_title msgid "Connections:" msgstr "Conexións" #: form_messages_title msgid "System messages:" msgstr "Mensaxes do sistema:" #: form_settings_title msgid "Settings:" msgstr "Configuración:" #: form_connections_close msgid "Close connection" msgstr "Pechar a conexión" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Pechar a conexión seleccionada" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Controlador:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Controlador JDBC a empregar para conectar coa base de datos" #: form_settings_database msgid "Database:" msgstr "Base de datos:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nome da base de datos de informes" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Porto:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Porto TCP no que o servidor atende as conexións" #: form_settings_password_tooltip msgid "System DB password" msgstr "Sinal do usuario do sistema" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Contrasinal:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Nome de usuario do sistema da base de datos" #: form_settings_user msgid "User:" msgstr "Usuario:" #: ERROR msgid "ERROR" msgstr "ERRO" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Tempo límite:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "" "Tempo máximo de inactividade en segundos que se lle permite ás conexións" #: form_btn_start msgid "Start" msgstr "Iniciar" #: form_btn_stop msgid "Stop" msgstr "Parar" #: form_btn_exit msgid "Exit" msgstr "Saír" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Parar o servidor e pechar o programa" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Pechar todas as conexións e parar o servidor" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Comezar a atender aos clientes" #: form_messages_verbose msgid "Verbose" msgstr "Mostra información ampliada" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Mostra todas as mensaxes" #: form_messages_copy msgid "Copy to clipboard" msgstr "Copiar" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Copia o contido da xanela ao cartafol do sistema" #: form_messages_clear msgid "Clear" msgstr "Limpar" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Limpa a xanela de mensaxes" #: error_DB msgid "Requested action could not be completed" msgstr "A acción solicitada non puido completarse" #: settings_title msgid "JClic reports server settings" msgstr "Configuración do servidor de informes JClic" #: settings_options_title msgid "Options" msgstr "Opcións" #: settings_options_language msgid "Language:" msgstr "Idioma:" #: settings_options_look msgid "Look & feel:" msgstr "Aparencia:" #: settings_db_title msgid "Database" msgstr "Base de datos" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Controlador:" #: settings_options_tooltips msgid "Tooltips" msgstr "Consellos" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Usuario da base de datos:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Contrasinal:" #: settings_server_title msgid "Reports server" msgstr "Servidor de informes" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Tempo límite:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Porto:" #: settings_server_autostart msgid "Autostart" msgstr "Inicio automático" #: settings_web_title msgid "Web server" msgstr "Servidor web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Escribir logs no arquivo:" #: settings_button msgid "Settings..." msgstr "Configuración..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Produciuse un erro de escritura do ficheiro de configuración!" #: form_btn_show msgid "launch browser..." msgstr "Iniciar o navegador..." #: error_starting_browser msgid "Error launching browser!" msgstr "Produciuse un erro de execución do navegador!" #: error_opening_logs msgid "Error opening log files!" msgstr "Produciuse un erro na apertura de arquivos de rexisto!" #: settings_file msgid "File..." msgstr "Ficheiro..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefixo dos nomes das táboas:" #: settings_createTables msgid "Create tables if not exist" msgstr "Crear táboas se non existen" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Duración máxima en minutos dunha sesión inactiva:" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferido:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Orde usada para iniciar o navegador (firefox, iexplore, mozilla, opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_it.po000066400000000000000000000156611335566474600260440ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-22 17:15+0000\n" "Last-Translator: giomu2 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Impossibile avviare il server!" #: error_incorrectData msgid "Incorrect data!" msgstr "Dati inesatti!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Porta" #: column_started_title msgid "Started" msgstr "Avviato" #: column_lastMessage_title msgid "Last message" msgstr "Ultimo messaggio" #: column_IP_tooltip msgid "Client IP address" msgstr "Indirizzo IP del client" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Porta locale usata in questa connessione" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Data e ora di inizio della connessione" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Intestazione dell'ultimo messaggio ricevuto" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Impossibile aprire il file di inizializzazione \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Verrano usati i valori predefiniti." #: form_title msgid "JClic reports server" msgstr "Server dei rapporti JClic" #: form_connections_title msgid "Connections:" msgstr "Connessioni:" #: form_messages_title msgid "System messages:" msgstr "Messaggi di sistema:" #: form_settings_title msgid "Settings:" msgstr "Impostazioni:" #: form_connections_close msgid "Close connection" msgstr "Chiudi la connessione" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Chiudi la connessione selezionata" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Driver:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Driver JDBC da usare per la connessione al database" #: form_settings_database msgid "Database:" msgstr "Database:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nome del database dei rapporti" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Porta:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Porta TCP dove il server verrà usato per le connessioni" #: form_settings_password_tooltip msgid "System DB password" msgstr "Password dell'utente per l'accesso al database" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Password:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Nome dell'utente per l'accesso al database" #: form_settings_user msgid "User:" msgstr "Utente:" #: ERROR msgid "ERROR" msgstr "ERRORE" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Timeout:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Secondi max di inattività permessi durante le connessioni" #: form_btn_start msgid "Start" msgstr "Avvio" #: form_btn_stop msgid "Stop" msgstr "Stop" #: form_btn_exit msgid "Exit" msgstr "Esci" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Ferma il server e chiudi il programma" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Chiudi tutte le connessioni e ferma il server" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Inizia l'attesa per i client" #: form_messages_verbose msgid "Verbose" msgstr "Mostra informazioni più ampie" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Mostra tutti i messaggi" #: form_messages_copy msgid "Copy to clipboard" msgstr "Copia negli appunti" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Copia i contenuti della finestra nella clipboard" #: form_messages_clear msgid "Clear" msgstr "Pulisci" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Pulisci la finestra dei messaggi" #: error_DB msgid "Requested action could not be completed" msgstr "L'azione richiesta potrebbe non essere stata completata" #: settings_title msgid "JClic reports server settings" msgstr "Impostazioni del server dei rapporti JClic" #: settings_options_title msgid "Options" msgstr "Opzioni" #: settings_options_language msgid "Language:" msgstr "Lingua:" #: settings_options_look msgid "Look & feel:" msgstr "Aspetto" #: settings_db_title msgid "Database" msgstr "Database" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Driver:" #: settings_options_tooltips msgid "Tooltips" msgstr "Suggerimenti" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Utenti del database:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Password:" #: settings_server_title msgid "Reports server" msgstr "Server dei rapporti" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Timeout:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Porta:" #: settings_server_autostart msgid "Autostart" msgstr "Avvio automatico" #: settings_web_title msgid "Web server" msgstr "Server Web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Scrivi logs nel file:" #: settings_button msgid "Settings..." msgstr "Impostazioni..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Errore nella scrittura del file delle impostazioni!" #: form_btn_show msgid "launch browser..." msgstr "avvio del navigatore..." #: error_starting_browser msgid "Error launching browser!" msgstr "Errore nell'avvio del navigatore!" #: error_opening_logs msgid "Error opening log files!" msgstr "Errore nell'apertura dei file log!" #: settings_file msgid "File..." msgstr "File..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefisso dei nomi delle tabelle:" #: settings_createTables msgid "Create tables if not exist" msgstr "Crea tabelle se non esistono" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Durata massima di una sessione inattiva (minuti)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Navigatore preferito\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comando usato per avviare il navigatore Internet (Firefox, IExplore, " "Mozilla, Opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_nl.po000066400000000000000000000155171335566474600260410ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-08-11 13:05+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Kan de server niet starten!" #: error_incorrectData msgid "Incorrect data!" msgstr "Verkeerde gegevens!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Poort" #: column_started_title msgid "Started" msgstr "Gestart" #: column_lastMessage_title msgid "Last message" msgstr "Laatste bericht" #: column_IP_tooltip msgid "Client IP address" msgstr "Client IP address" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Local port van deze verbinding" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Datum en tijd van de start van de verbinding" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Begincodes van het laatst ontvangen bericht" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Het eigenschapbestand kan niet geladen worden \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Gebruik standaard waarden." #: form_title msgid "JClic reports server" msgstr "JClic rapporten server" #: form_connections_title msgid "Connections:" msgstr "Verbindingen" #: form_messages_title msgid "System messages:" msgstr "Systeem berichten:" #: form_settings_title msgid "Settings:" msgstr "Instellingen:" #: form_connections_close msgid "Close connection" msgstr "Verbinding sluiten" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Gekozen verbinding sluiten" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Stuurprogramma:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "" "JDBC stuurprogramma dat gebruikt wordt om verbinding te maken met de database" #: form_settings_database msgid "Database:" msgstr "Database:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Naam van de rapporten database" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Poort:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "TCP poort waar de server de verbinding zoekt" #: form_settings_password_tooltip msgid "System DB password" msgstr "Systeem DB wachtwoord" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Wachtwoord:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Systeem DB gebruikersnaam" #: form_settings_user msgid "User:" msgstr "Gebruiker:" #: ERROR msgid "ERROR" msgstr "FOUT" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Wachttijd:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "" "Maximum aantal seconden zonder activiteit bij verbinding(Maximum inactivity " "seconds allowed to connections)" #: form_btn_start msgid "Start" msgstr "Begin" #: form_btn_stop msgid "Stop" msgstr "Stoppen" #: form_btn_exit msgid "Exit" msgstr "Afsluiten" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Server afsluiten en programma afsluiten" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Sluit alle verbindingen af en stop de server" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Begin te luisteren naar clients" #: form_messages_verbose msgid "Verbose" msgstr "Met uitleg" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Toon alle berichten" #: form_messages_copy msgid "Copy to clipboard" msgstr "Kopiëren naar klembord" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Kopieer de console output naar clipboard" #: form_messages_clear msgid "Clear" msgstr "Wissen" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Wissen van de console output" #: error_DB msgid "Requested action could not be completed" msgstr "Requested action could not be completed" #: settings_title msgid "JClic reports server settings" msgstr "JClic rapporten server instellingen" #: settings_options_title msgid "Options" msgstr "Opties" #: settings_options_language msgid "Language:" msgstr "Taal:" #: settings_options_look msgid "Look & feel:" msgstr "Look & feel:" #: settings_db_title msgid "Database" msgstr "Database" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Stuurprogramma:" #: settings_options_tooltips msgid "Tooltips" msgstr "Hulpballonnen" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "DB user:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Wachtwoord:" #: settings_server_title msgid "Reports server" msgstr "Rapporten server" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Timeout:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Poort:" #: settings_server_autostart msgid "Autostart" msgstr "Automatisch starten" #: settings_web_title msgid "Web server" msgstr "Web-server" #: settings_server_logFile msgid "Write logs to file:" msgstr "Schrijf logs naar bestand:" #: settings_button msgid "Settings..." msgstr "Instellingen..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Fout bij schrijven instellingen bestand!" #: form_btn_show msgid "launch browser..." msgstr "opstarten van browser..." #: error_starting_browser msgid "Error launching browser!" msgstr "Fout bij starten browser!" #: error_opening_logs msgid "Error opening log files!" msgstr "Fout bij openen log bestanden!" #: settings_file msgid "File..." msgstr "Bestand..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Table names prefix:" #: settings_createTables msgid "Create tables if not exist" msgstr "Maak tabellen indien ze niet bestaan" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Session lifetime (minutes)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Voorkeur browser\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "Commando om browser te starten(firefox, iexplore, mozilla, opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_pt.po000066400000000000000000000156761335566474600260610ustar00rootroot00000000000000# Portuguese translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-01-17 19:15+0000\n" "Last-Translator: Rui Fernandes \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Impossível iniciar servidor!" #: error_incorrectData msgid "Incorrect data!" msgstr "Dados incorrectos!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Porta" #: column_started_title msgid "Started" msgstr "Iniciado" #: column_lastMessage_title msgid "Last message" msgstr "Última mensagem" #: column_IP_tooltip msgid "Client IP address" msgstr "Endereço IP do cliente" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Porta local usada nesta ligação" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Data e hora em que a ligação foi iniciada" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Cabeçalho da última mensagem recebida" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Impossível carregar o ficheiro de propriedades \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\". A usar as definições padrão." #: form_title msgid "JClic reports server" msgstr "Servidor de relatórios JClic" #: form_connections_title msgid "Connections:" msgstr "Ligações:" #: form_messages_title msgid "System messages:" msgstr "Mensagens de sistema:" #: form_settings_title msgid "Settings:" msgstr "Definições:" #: form_connections_close msgid "Close connection" msgstr "Fechar ligação" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Fechar a ligação seleccionada" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Controlador:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Controlador JDBC a usar para ligar-se à base de dados" #: form_settings_database msgid "Database:" msgstr "Base de dados:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nome da base de dados de relatórios" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Porta:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Porta TCP em que o servidor escutará as conexões" #: form_settings_password_tooltip msgid "System DB password" msgstr "BD palavras-chave do sistema" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Palavra-chave:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "BD utilizadores do sistema" #: form_settings_user msgid "User:" msgstr "Utilizador:" #: ERROR msgid "ERROR" msgstr "ERRO" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Tempo-limite:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Tempo máximo em segundos permitido às conexões" #: form_btn_start msgid "Start" msgstr "Iniciar" #: form_btn_stop msgid "Stop" msgstr "Parar" #: form_btn_exit msgid "Exit" msgstr "Sair" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Parar servidor e desligar programa" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Fechar todas as conexões e parar servidor" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Iniciar atendimento de clientes" #: form_messages_verbose msgid "Verbose" msgstr "Descritivo" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Mostrar todas as mensagens" #: form_messages_copy msgid "Copy to clipboard" msgstr "Copiar para a área de transferência" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Copiar o conteúdo da consola para a área de transferência" #: form_messages_clear msgid "Clear" msgstr "Limpar" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Limpar a janela de mensagens" #: error_DB msgid "Requested action could not be completed" msgstr "A acção solicitada não pode ser completada" #: settings_title msgid "JClic reports server settings" msgstr "Definições do servidor de relatórios Jclic" #: settings_options_title msgid "Options" msgstr "Opções" #: settings_options_language msgid "Language:" msgstr "Idioma:" #: settings_options_look msgid "Look & feel:" msgstr "Aspecto:" #: settings_db_title msgid "Database" msgstr "Base de dados" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Controlador:" #: settings_options_tooltips msgid "Tooltips" msgstr "Sugestões" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Utilizador da base de dados:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Palavra-chave:" #: settings_server_title msgid "Reports server" msgstr "Servidor de relatórios" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Tempo-limite:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Porto:" #: settings_server_autostart msgid "Autostart" msgstr "Arranque automático" #: settings_web_title msgid "Web server" msgstr "Servidor Web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Escrever logs para ficheiro" #: settings_button msgid "Settings..." msgstr "Definições..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Erro ao escrever no ficheiro de configuração!" #: form_btn_show msgid "launch browser..." msgstr "Iniciar navegador..." #: error_starting_browser msgid "Error launching browser!" msgstr "Erro ao iniciar o navegador!" #: error_opening_logs msgid "Error opening log files!" msgstr "Erro ao abrir ficheiros de log!" #: settings_file msgid "File..." msgstr "Ficheiro..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefixo dos nomes da tabela" #: settings_createTables msgid "Create tables if not exist" msgstr "Criar tabelas se não existirem" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Tempo restante da sessão (minutos)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador web preferido\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comando usado para iniciar o navegador web (firefox, iexplore, mozilla, " "opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_pt_BR.po000066400000000000000000000157641335566474600264420ustar00rootroot00000000000000# Brazilian Portuguese translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-01-17 20:39+0000\n" "Last-Translator: Alexandre R Soares \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Não foi possível iniciar o servidor!" #: error_incorrectData msgid "Incorrect data!" msgstr "Dados incorretos!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Porta" #: column_started_title msgid "Started" msgstr "Iniciado" #: column_lastMessage_title msgid "Last message" msgstr "Última mensagem" #: column_IP_tooltip msgid "Client IP address" msgstr "Endereço IP do cliente" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Porta local usada nessa conexão" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Date e hora em que a conexão iniciou-se" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Cabeçalho da última mensagem recebida" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Não foi possível abrir o arquivo de propriedades \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Usando configurações padrões." #: form_title msgid "JClic reports server" msgstr "Servidor de relatórios do JClic" #: form_connections_title msgid "Connections:" msgstr "Conexões:" #: form_messages_title msgid "System messages:" msgstr "Mensagens do sistema:" #: form_settings_title msgid "Settings:" msgstr "Configurações:" #: form_connections_close msgid "Close connection" msgstr "Fechar conexão" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Fechar a conexão selecionada" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Controlador (Driver):" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Driver JDBC a usar para conectar-se ao banco de dados" #: form_settings_database msgid "Database:" msgstr "Banco de dados:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nome do banco de dados de relatórios" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Porta:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Porta TCP onde o servidor escutará as conexões" #: form_settings_password_tooltip msgid "System DB password" msgstr "Senha para o Sistema de BD" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Senha:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Nome de usuário para o Sistema de BD" #: form_settings_user msgid "User:" msgstr "Usuário:" #: ERROR msgid "ERROR" msgstr "ERRO" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Tempo limite:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Tempo máximo de inatividade permitido para conexões" #: form_btn_start msgid "Start" msgstr "Iniciar" #: form_btn_stop msgid "Stop" msgstr "Parar" #: form_btn_exit msgid "Exit" msgstr "Sair" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Parar o servidor e encerrar o programa" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Encerrar todas as conexões e parar o servidor" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Iniciar a escuta de clientes" #: form_messages_verbose msgid "Verbose" msgstr "Mostrar informação ampliada" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Mostrar todas as mensagens" #: form_messages_copy msgid "Copy to clipboard" msgstr "Copiar para a área de transferência" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Copiar para a memória o conteúdo do console" #: form_messages_clear msgid "Clear" msgstr "Limpar" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Limpa a saída do console" #: error_DB msgid "Requested action could not be completed" msgstr "Não foi possível completar a ação solicitada" #: settings_title msgid "JClic reports server settings" msgstr "Configurações do servidor de relatórios do JClic" #: settings_options_title msgid "Options" msgstr "Opções" #: settings_options_language msgid "Language:" msgstr "Idioma:" #: settings_options_look msgid "Look & feel:" msgstr "Aspecto:" #: settings_db_title msgid "Database" msgstr "Banco de dados" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Controlador (Driver):" #: settings_options_tooltips msgid "Tooltips" msgstr "Dicas de ferramenta" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Usuário do BD" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Senha:" #: settings_server_title msgid "Reports server" msgstr "Servidor de relatórios" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Tempo limite:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Porta:" #: settings_server_autostart msgid "Autostart" msgstr "Início automático" #: settings_web_title msgid "Web server" msgstr "Servidor web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Registrar (logs) no arquivo:" #: settings_button msgid "Settings..." msgstr "Configurações..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Erro ao registrar configurações no arquivo!" #: form_btn_show msgid "launch browser..." msgstr "iniciar navegador..." #: error_starting_browser msgid "Error launching browser!" msgstr "Erro ao iniciar navegador!" #: error_opening_logs msgid "Error opening log files!" msgstr "erro ao abrir arquivos de log!" #: settings_file msgid "File..." msgstr "Arquivo..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Tabela de prefixo de nomes" #: settings_createTables msgid "Create tables if not exist" msgstr "Criar tabelas se não houver" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Duração máxima de uma sessão inativa (minutos)\\\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferido\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comando usado para iniciar o navegador (firefox, iexplorer, mozilla, " "opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_ru.po000066400000000000000000000176071335566474600260600ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-11-15 20:22+0000\n" "Last-Translator: Serafim Nenarokov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "Невозможно запустить сервер!" #: error_incorrectData msgid "Incorrect data!" msgstr "Неверные данные!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Порт" #: column_started_title msgid "Started" msgstr "Запущен" #: column_lastMessage_title msgid "Last message" msgstr "Последнее сообщение" #: column_IP_tooltip msgid "Client IP address" msgstr "IP адрес клиента" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Локальный порт используемый для этого соединения" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Дата и время начала соединения" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Заголовок последнего принятого сообщения" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "Невозможно загрузить файл настроек \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Используем настройки по умолчанию." #: form_title msgid "JClic reports server" msgstr "Сервер отчётов JClic" #: form_connections_title msgid "Connections:" msgstr "Соединения:" #: form_messages_title msgid "System messages:" msgstr "Системные сообщения:" #: form_settings_title msgid "Settings:" msgstr "Настройки:" #: form_connections_close msgid "Close connection" msgstr "Закрыть соединение" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Закрыть выбранное соединение" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Драйвер:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Драйвер JDBC используемый для подключения к базе данных" #: form_settings_database msgid "Database:" msgstr "База данных:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Имя базы данных отчётов" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Порт:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "TCP порт сервера" #: form_settings_password_tooltip msgid "System DB password" msgstr "Пароль системной БД" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Пароль:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Имя пользователя системной БД" #: form_settings_user msgid "User:" msgstr "Пользователь:" #: ERROR msgid "ERROR" msgstr "ОШИБКА" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Тайм-аут:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Максимальное время неактивности соединения, секунд" #: form_btn_start msgid "Start" msgstr "Запустить" #: form_btn_stop msgid "Stop" msgstr "Остановить" #: form_btn_exit msgid "Exit" msgstr "Выход" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Остановить сервер и завершить программу" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Закрыть все соединения и остановить сервер" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Начать обслуживание клиентов" #: form_messages_verbose msgid "Verbose" msgstr "Подробно" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Показывать все сообщения" #: form_messages_copy msgid "Copy to clipboard" msgstr "Копировать в буфер обмена" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Копировать консольный вывод в буфер обмена" #: form_messages_clear msgid "Clear" msgstr "Очистить" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Очистить консольный вывод" #: error_DB msgid "Requested action could not be completed" msgstr "Запрошенное действие не может быть завершено" #: settings_title msgid "JClic reports server settings" msgstr "Настройки сервера отчётов JClic" #: settings_options_title msgid "Options" msgstr "Настройки" #: settings_options_language msgid "Language:" msgstr "Язык:" #: settings_options_look msgid "Look & feel:" msgstr "Стиль оформления:" #: settings_db_title msgid "Database" msgstr "База данных" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Драйвер:" #: settings_options_tooltips msgid "Tooltips" msgstr "Подсказки" #: settings_db_url msgid "URL:" msgstr "Адрес(URL):" #: settings_db_usr msgid "DB user:" msgstr "Пользователь БД:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Пароль:" #: settings_server_title msgid "Reports server" msgstr "Сервер отчётов" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Тайм-аут:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Порт:" #: settings_server_autostart msgid "Autostart" msgstr "Автозапуск" #: settings_web_title msgid "Web server" msgstr "Веб-сервер" #: settings_server_logFile msgid "Write logs to file:" msgstr "Записывать логи в файл:" #: settings_button msgid "Settings..." msgstr "Настройки..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Ошибка при записи файла настроек!" #: form_btn_show msgid "launch browser..." msgstr "запуск браузера..." #: error_starting_browser msgid "Error launching browser!" msgstr "Ошибка запуска браузера!" #: error_opening_logs msgid "Error opening log files!" msgstr "Ошибка открытия файлов логов!" #: settings_file msgid "File..." msgstr "Файл..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Префикс имён таблиц:" #: settings_createTables msgid "Create tables if not exist" msgstr "Создавать таблицы, если не существуют" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Время жизни сессии (минут)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Предпочитаемый браузер\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "Команда для запуска браузера (firefox, iexplore, mozilla, opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_vec.po000066400000000000000000000155331335566474600262030ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-21 09:31+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "No se pol inviar el server" #: error_incorrectData msgid "Incorrect data!" msgstr "Dati sbaliài!" #: column_IP_title msgid "IP" msgstr "IP" #: column_port_title msgid "Port" msgstr "Pòrta" #: column_started_title msgid "Started" msgstr "Scominsià" #: column_lastMessage_title msgid "Last message" msgstr "Ùltimo mesajo" #: column_IP_tooltip msgid "Client IP address" msgstr "Indriso IP de 'l client" #: column_port_tooltip msgid "Local port used in this connection" msgstr "Pòrta local doparada so sta conesion" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "Data e ora in cui xé stà invià ƚa conesion" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "Intestasion de 'l ùltimo mesajo risevesto" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "No se pol cargar el file de ƚe propietà \"" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "\" Se dopararà ƚe inpostasion predefinìe." #: form_title msgid "JClic reports server" msgstr "Server de i reports de JClic" #: form_connections_title msgid "Connections:" msgstr "Conesion:" #: form_messages_title msgid "System messages:" msgstr "Mesaji de sistèma:" #: form_settings_title msgid "Settings:" msgstr "Inpostasion:" #: form_connections_close msgid "Close connection" msgstr "Sèra conesion" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "Sèra ƚa conesion seƚesionada" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "Driver:" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "Driver JDBC da doparar par conetarse a 'l database" #: form_settings_database msgid "Database:" msgstr "Database:" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "Nòme de 'l database de i reports" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "Pòrta:" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "Pòrta TCP par ƚe conesion de 'l server" #: form_settings_password_tooltip msgid "System DB password" msgstr "Password par el dataabse" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "Password:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "Nòme utente database" #: form_settings_user msgid "User:" msgstr "Utente:" #: ERROR msgid "ERROR" msgstr "EROR" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "Tenpo màsimo" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "Màsimo secondi de inatività consentìo par ƚe conesion" #: form_btn_start msgid "Start" msgstr "Invìo" #: form_btn_stop msgid "Stop" msgstr "Stop" #: form_btn_exit msgid "Exit" msgstr "Sòrti" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "Ferma el server e destùa el programa" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "Sèra tute ƚe conesion e ferma el server" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "Taca a sercar se ghe xé clients" #: form_messages_verbose msgid "Verbose" msgstr "Informasion pì in detalio" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "Mostra tuti i mesaji" #: form_messages_copy msgid "Copy to clipboard" msgstr "Còpia inte 'l coƚetador nòde" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "Còpia fenèstra inte 'l coƚetador de nòde" #: form_messages_clear msgid "Clear" msgstr "Sneta" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "Snetar el contenudo de ƚa fenèstra" #: error_DB msgid "Requested action could not be completed" msgstr "No se pol conpletar l'asion richièta" #: settings_title msgid "JClic reports server settings" msgstr "Inpostasion de 'l server de i reports JClic." #: settings_options_title msgid "Options" msgstr "Opsion" #: settings_options_language msgid "Language:" msgstr "Lengua:" #: settings_options_look msgid "Look & feel:" msgstr "Faciavista:" #: settings_db_title msgid "Database" msgstr "Database" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "Driver:" #: settings_options_tooltips msgid "Tooltips" msgstr "Suxerimenti" #: settings_db_url msgid "URL:" msgstr "URL:" #: settings_db_usr msgid "DB user:" msgstr "Utente database:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "Password:" #: settings_server_title msgid "Reports server" msgstr "Server reports" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "Tenpo màsimo" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "Pòrta:" #: settings_server_autostart msgid "Autostart" msgstr "Auto-invìo" #: settings_web_title msgid "Web server" msgstr "Server web" #: settings_server_logFile msgid "Write logs to file:" msgstr "Salva i logs inte un file" #: settings_button msgid "Settings..." msgstr "Inpostasion..." #: error_writting_settings msgid "Error writting settings file!" msgstr "Ghe xé stà un eror a salvando el file de ƚe inpostasion!" #: form_btn_show msgid "launch browser..." msgstr "invia navegador..." #: error_starting_browser msgid "Error launching browser!" msgstr "Ghe xé stà un eror a inviando el navegador!" #: error_opening_logs msgid "Error opening log files!" msgstr "Ghe xé stà un eror a verxindo i files de log!" #: settings_file msgid "File..." msgstr "File..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "Prefiso nòmi tavèƚa" #: settings_createTables msgid "Create tables if not exist" msgstr "Costruisi tavèƚe se no ƚe ghe xé" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "Durada sesion (menuti)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "Navegador preferìo\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "" "Comando doparà par inviar el navegador (firefox, iexplore, mozilla, opera...)" i18n/fromLaunchpad/po/jclic-reportServer/ReportServerMessages_zh_TW.po000066400000000000000000000147711335566474600264640ustar00rootroot00000000000000# Chinese (Traditional) translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-05-19 15:49+0000\n" "Last-Translator: Cho Chin-Ping \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: error_serverCannotStart msgid "Unable to start server!" msgstr "無法開啟伺服器" #: error_incorrectData msgid "Incorrect data!" msgstr "不正確的資料!" #: column_IP_title msgid "IP" msgstr "IP 位址" #: column_port_title msgid "Port" msgstr "通訊埠" #: column_started_title msgid "Started" msgstr "已開始" #: column_lastMessage_title msgid "Last message" msgstr "最新消息" #: column_IP_tooltip msgid "Client IP address" msgstr "用戶端IP位址" #: column_port_tooltip msgid "Local port used in this connection" msgstr "連結的區域性通訊埠" #: column_started_tooltip msgid "Date and time at witch the connection was started" msgstr "連結開始的日期和時間" #: column_lastMessage_tooltip msgid "Header of the last received message" msgstr "最新消息的標題" #: error_propertiesFile_beg msgid "Unable to load the properties file \"" msgstr "無法裝載資料夾" #: error_propertiesFile_end msgid "\" Using default settings." msgstr "使用預設值" #: form_title msgid "JClic reports server" msgstr "JClic伺服器報告" #: form_connections_title msgid "Connections:" msgstr "連結" #: form_messages_title msgid "System messages:" msgstr "系統訊息" #: form_settings_title msgid "Settings:" msgstr "設定" #: form_connections_close msgid "Close connection" msgstr "關閉連線" #: form_connections_close_tooltip msgid "Close the selected connection" msgstr "關閉已選連結" #: form_settings_driver msgctxt "form_settings_driver" msgid "Driver:" msgstr "驅動程式" #: form_settings_driver_tooltip msgid "JDBC driver to use for connect to the database" msgstr "用於連接到數據庫的JDBC驅動程序" #: form_settings_database msgid "Database:" msgstr "資料庫" #: form_settings_database_tooltip msgid "Name of the reports database" msgstr "報告資料庫的名字" #: form_settings_port msgctxt "form_settings_port" msgid "Port:" msgstr "連接埠" #: form_settings_port_tooltip msgid "TCP port where the server will listen for connections" msgstr "服務器將偵聽連接的TCP端口" #: form_settings_password_tooltip msgid "System DB password" msgstr "DB系統的密碼" #: form_settings_password msgctxt "form_settings_password" msgid "Password:" msgstr "密碼:" #: form_settings_user_tooltip msgid "System DB user name" msgstr "DB系統的使用者名稱" #: form_settings_user msgid "User:" msgstr "使用者:" #: ERROR msgid "ERROR" msgstr "錯誤" #: form_settings_timeout msgctxt "form_settings_timeout" msgid "Timeout:" msgstr "逾時時間:" #: form_settings_timeout_tooltip msgid "Maximum inactivity seconds allowed to connections" msgstr "閒置最長時間" #: form_btn_start msgid "Start" msgstr "開始" #: form_btn_stop msgid "Stop" msgstr "停止" #: form_btn_exit msgid "Exit" msgstr "離開" #: form_btn_exit_tooltip msgid "Stop server and shutdown program" msgstr "切斷並跳出" #: form_btn_stop_tooltip msgid "Close all connections and stop server" msgstr "強行關閉連線" #: form_btn_start_tooltip msgid "Begin listening for clients" msgstr "開始聽客戶" #: form_messages_verbose msgid "Verbose" msgstr "詳細" #: form_messages_verbose_tooltip msgid "Display all messages" msgstr "展示所有訊息" #: form_messages_copy msgid "Copy to clipboard" msgstr "複製到剪貼簿" #: form_messages_copy_tooltip msgid "Copy the console output to clipboard" msgstr "複製主控台的輸出到剪貼板" #: form_messages_clear msgid "Clear" msgstr "清空" #: form_messages_clear_tooltip msgid "Clears the console output" msgstr "清除主控台的輸出" #: error_DB msgid "Requested action could not be completed" msgstr "要求的動作將無法完成" #: settings_title msgid "JClic reports server settings" msgstr "JClic報告伺服器設定" #: settings_options_title msgid "Options" msgstr "選項" #: settings_options_language msgid "Language:" msgstr "語言:" #: settings_options_look msgid "Look & feel:" msgstr "介面外觀" #: settings_db_title msgid "Database" msgstr "資料庫" #: settings_db_driver msgctxt "settings_db_driver" msgid "Driver:" msgstr "驅動程式:" #: settings_options_tooltips msgid "Tooltips" msgstr "提示框" #: settings_db_url msgid "URL:" msgstr "網址:" #: settings_db_usr msgid "DB user:" msgstr "DB使用者:" #: settings_db_pwd msgctxt "settings_db_pwd" msgid "Password:" msgstr "密碼:" #: settings_server_title msgid "Reports server" msgstr "報告伺服器" #: settings_server_timeout msgctxt "settings_server_timeout" msgid "Timeout:" msgstr "逾時時間:" #: settings_server_port msgctxt "settings_server_port" msgid "Port:" msgstr "連接埠:" #: settings_server_autostart msgid "Autostart" msgstr "自動啟動" #: settings_web_title msgid "Web server" msgstr "網站伺服器" #: settings_server_logFile msgid "Write logs to file:" msgstr "填寫記錄至文件:" #: settings_button msgid "Settings..." msgstr "設定..." #: error_writting_settings msgid "Error writting settings file!" msgstr "文件設定發生錯誤!" #: form_btn_show msgid "launch browser..." msgstr "啟動瀏覽器" #: error_starting_browser msgid "Error launching browser!" msgstr "啟動瀏覽器發生錯誤" #: error_opening_logs msgid "Error opening log files!" msgstr "開啟記錄檔時發生錯誤!" #: settings_file msgid "File..." msgstr "檔案..." #: settings_tablePrefix msgid "Table names prefix:" msgstr "表格名稱前綴:" #: settings_createTables msgid "Create tables if not exist" msgstr "如果不存在則建立表格" #: settings_session_lifetime msgid "Session lifetime (minutes)\\:" msgstr "課程長度(分鐘)\\:" #: settings_browser msgid "Preferred browser\\:" msgstr "偏好的瀏覽器\\:" #: settings_browser_tooltip msgid "" "Command used to launch the browser (firefox, iexplore, mozilla, opera...)" msgstr "用來開啟瀏覧器(firefox, iexplore, mozilla, opera...)的指令" i18n/fromLaunchpad/po/jclic-reportServlets/000077500000000000000000000000001335566474600212065ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_ar.po000066400000000000000000000213761335566474600252440ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-03-26 09:16+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" #: login_title msgid "Login" msgstr "" #: submit msgid "Submit..." msgstr "" #: login_incorrect msgid "Incorrect password!" msgstr "" #: main_title msgid "Main menu" msgstr "" #: users_admin_title msgid "Users and groups admin" msgstr "" #: group_report_title msgid "Group reports" msgstr "" #: user_report_title msgid "User reports" msgstr "" #: act_report_title msgid "Activity reports" msgstr "" #: db_admin_title msgid "Database admin" msgstr "" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "" #: db_admin_param_shgl msgid "Select group in a list" msgstr "" #: db_admin_param_shul msgid "Select user name in a list" msgstr "" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "" #: db_admin_edit_btn msgid "Edit settings..." msgstr "" #: db_admin_pw_edit_btn msgid "Set password..." msgstr "" #: title msgid "Title" msgstr "" #: db_admin_edit_title msgid "Edit database settings" msgstr "" #: db_admin_pw_edit_title msgid "Change system password" msgstr "" #: db_admin_pw_newPwd msgid "New password" msgstr "" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "" #: report_group msgid "Group:" msgstr "" #: report_user msgid "User:" msgstr "" #: report_project msgid "Project:" msgstr "" #: report_all_projects msgid "All projects" msgstr "" #: report_key msgid "Key:" msgstr "" #: report_code msgid "Code:" msgstr "" #: report_context msgid "Context:" msgstr "" #: report_from msgid "From:" msgstr "" #: month_1 msgid "january" msgstr "" #: month_2 msgid "february" msgstr "" #: month_3 msgid "march" msgstr "" #: month_4 msgid "april" msgstr "" #: month_5 msgid "may" msgstr "" #: month_6 msgid "june" msgstr "" #: month_7 msgid "july" msgstr "" #: month_8 msgid "august" msgstr "" #: month_9 msgid "september" msgstr "" #: month_10 msgid "october" msgstr "" #: month_11 msgid "november" msgstr "" #: month_12 msgid "december" msgstr "" #: report_to msgid "To:" msgstr "" #: report_global_precision msgid "Global precision" msgstr "" #: report_solved_activities msgid "Solved activities" msgstr "" #: report_user_evolution msgid "User evolution" msgstr "" #: report_group_evolution msgid "Group evolution" msgstr "" #: report_project_evolution msgid "Project evolution" msgstr "" #: report_result_distribution msgid "Result distribution" msgstr "" #: report_no_data msgid "NO DATA" msgstr "" #: report_users msgid "Users:" msgstr "" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "" #: report_projects msgid "Projects:" msgstr "" #: report_actDone msgid "Activities done:" msgstr "" #: report_actSolved msgid "Activities solved:" msgstr "" #: report_totalTime msgid "Total time:" msgstr "" #: report_globalPrec msgid "Global score:" msgstr "" #: report_globalSummary msgid "Global summary" msgstr "" #: report_header_date msgid "date" msgstr "" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "" #: report_header_user msgid "user" msgstr "" #: report_header_project msgid "project" msgstr "" #: report_header_numActs msgid "activities" msgstr "" #: report_header_actsSolved msgid "acts. solved" msgstr "" #: report_header_time msgid "time" msgstr "" #: report_header_prec msgid "score" msgstr "" #: report_session_detail_show msgid "show session details" msgstr "" #: report_session_detail_title msgid "Activities done in session" msgstr "" #: report_header_activity msgid "activity" msgstr "" #: report_header_actions msgid "actions" msgstr "" #: report_header_score msgid "corrects" msgstr "" #: report_header_solved msgid "ok" msgstr "" #: Y msgctxt "Y" msgid "Y" msgstr "" #: N msgctxt "N" msgid "N" msgstr "" #: report_session_detail_hide msgid "hide session details" msgstr "" #: report_header_sessions msgid "sessions" msgstr "" #: report_all_activities msgid "All activities" msgstr "" #: report_activity msgid "Activity:" msgstr "" #: report_many msgid "several" msgstr "" #: report_n_users msgid "users" msgstr "" #: group_admin_title msgid "Groups administration" msgstr "" #: group_admin_new_button msgid "New group..." msgstr "" #: group_admin_groups msgid "Groups" msgstr "" #: report_actions msgid "Actions" msgstr "" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "" #: user_admin_title msgid "User admin" msgstr "" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "" #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "" #: group_admin_properties msgid "Group properties" msgstr "" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "" #: error msgid "ERROR" msgstr "" #: return msgid "return..." msgstr "" #: group_admin_users msgid "Users" msgstr "" #: group_admin_no_users msgid "This group has no users." msgstr "" #: group_admin_create_user_button msgid "Create a new user..." msgstr "" #: cancel msgid "Cancel" msgstr "" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "" #: group_admin_delete_group msgid "Delete group" msgstr "" #: report_areyousure msgid "Are you sure?" msgstr "" #: YES msgid "Yes" msgstr "" #: NOT msgid "Not" msgstr "" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" #: db_error msgid "Unable to complete the task." msgstr "" #: group_admin_clear_group msgid "Clear report data of group" msgstr "" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" #: db_clear_reports_date msgid "Clear report data" msgstr "" #: user_admin_invalid_name msgid "Invalid user name." msgstr "" #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "" #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "" #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "" #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "" #: user_admin_delete_user msgid "Delete user" msgstr "" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" #: user_admin_clear_user msgid "Clear report data of user" msgstr "" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" #: success msgid "Operation successful" msgstr "" #: bad_data msgid "Bad data!" msgstr "" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "" #: jclic_reports msgid "JClic reports" msgstr "" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "" #: user_admin_pw_prompt msgid "Password\\:" msgstr "" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_ast.po000066400000000000000000000272331335566474600254270ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # Xandru Armesto , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-09-30 14:01+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Contraseña:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Tien d'escribir una contraseña correuta p'acceder a la base de datos " "d'informes." #: login_title msgid "Login" msgstr "Coneutar" #: submit msgid "Submit..." msgstr "Unviar..." #: login_incorrect msgid "Incorrect password!" msgstr "¡Contraseña incorreuta!" #: main_title msgid "Main menu" msgstr "Menú principal" #: users_admin_title msgid "Users and groups admin" msgstr "Alministración de grupos y usuarios" #: group_report_title msgid "Group reports" msgstr "Informes de grupu" #: user_report_title msgid "User reports" msgstr "Informes d'usuariu/a" #: act_report_title msgid "Activity reports" msgstr "Informes de xera" #: db_admin_title msgid "Database admin" msgstr "Alministración de la base de datos" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "¡Nun se pudieron camudar los valores de la base de datos!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Permitir a los usuarios criar grupos nuevos" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Permitir a los usuarios la creación de usuarios nuevos" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Esbillar grupu d'una llista" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Esbillar el nome d'usuariu/a d'una llista" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "La base de datos tien tables d'usuarios y grupos" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Editar propiedaes..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Afitar contraseña..." #: title msgid "Title" msgstr "Títulu" #: db_admin_edit_title msgid "Edit database settings" msgstr "Editar propiedaes de la base de datos" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Camudar la contraseña del sistema" #: db_admin_pw_newPwd msgid "New password" msgstr "Contraseña nueva" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Volver a escribir la contraseña" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Los dos testos nun concasen!" #: report_group msgid "Group:" msgstr "Grupu:" #: report_user msgid "User:" msgstr "Usuariu:" #: report_project msgid "Project:" msgstr "Proyeutu:" #: report_all_projects msgid "All projects" msgstr "Tolos proyeutos" #: report_key msgid "Key:" msgstr "Contraseña:" #: report_code msgid "Code:" msgstr "Códigu:" #: report_context msgid "Context:" msgstr "Contestu:" #: report_from msgid "From:" msgstr "Dende:" #: month_1 msgid "january" msgstr "xineru" #: month_2 msgid "february" msgstr "febreru" #: month_3 msgid "march" msgstr "marzu" #: month_4 msgid "april" msgstr "abril" #: month_5 msgid "may" msgstr "mayu" #: month_6 msgid "june" msgstr "xunu" #: month_7 msgid "july" msgstr "xunetu" #: month_8 msgid "august" msgstr "agostu" #: month_9 msgid "september" msgstr "setiembre" #: month_10 msgid "october" msgstr "ochobre" #: month_11 msgid "november" msgstr "payares" #: month_12 msgid "december" msgstr "avientu" #: report_to msgid "To:" msgstr "Fasta:" #: report_global_precision msgid "Global precision" msgstr "Precisión global" #: report_solved_activities msgid "Solved activities" msgstr "Xeres resueltes" #: report_user_evolution msgid "User evolution" msgstr "Evolución del usuariu/a" #: report_group_evolution msgid "Group evolution" msgstr "Evolución del grupu" #: report_project_evolution msgid "Project evolution" msgstr "Evolución del proyeutu" #: report_result_distribution msgid "Result distribution" msgstr "Distribución de resultaos" #: report_no_data msgid "NO DATA" msgstr "ENSIN DATOS" #: report_users msgid "Users:" msgstr "Usuarios\\:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sesiones:" #: report_projects msgid "Projects:" msgstr "Proyeutos:" #: report_actDone msgid "Activities done:" msgstr "Xeres realizaes:" #: report_actSolved msgid "Activities solved:" msgstr "Xeres resueltes:" #: report_totalTime msgid "Total time:" msgstr "Tiempu total:" #: report_globalPrec msgid "Global score:" msgstr "Precisión global:" #: report_globalSummary msgid "Global summary" msgstr "Resume global" #: report_header_date msgid "date" msgstr "data" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sesiones realizaes:" #: report_header_user msgid "user" msgstr "usuariu/a" #: report_header_project msgid "project" msgstr "proyeutu" #: report_header_numActs msgid "activities" msgstr "xeres" #: report_header_actsSolved msgid "acts. solved" msgstr "xeres. resueltes" #: report_header_time msgid "time" msgstr "tiempu" #: report_header_prec msgid "score" msgstr "precisión" #: report_session_detail_show msgid "show session details" msgstr "amosar detalles de la sesión..." #: report_session_detail_title msgid "Activities done in session" msgstr "Xeres realizaes na sesión" #: report_header_activity msgid "activity" msgstr "xera" #: report_header_actions msgid "actions" msgstr "aiciones" #: report_header_score msgid "corrects" msgstr "aciertos" #: report_header_solved msgid "ok" msgstr "bien" #: Y msgctxt "Y" msgid "Y" msgstr "S" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "esconder detalles de la sesión" #: report_header_sessions msgid "sessions" msgstr "sesiones" #: report_all_activities msgid "All activities" msgstr "Toles xeres" #: report_activity msgid "Activity:" msgstr "Xera:" #: report_many msgid "several" msgstr "dellos" #: report_n_users msgid "users" msgstr "usuarios" #: group_admin_title msgid "Groups administration" msgstr "Alministración de grupos" #: group_admin_new_button msgid "New group..." msgstr "Grupu nuevu..." #: group_admin_groups msgid "Groups" msgstr "Grupos" #: report_actions msgid "Actions" msgstr "Aiciones" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Camudar..." #: user_admin_title msgid "User admin" msgstr "Alministración d'usuarios" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Esborrar..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Llimpiar informes..." #: group_admin_properties msgid "Group properties" msgstr "Propiedaes del grupu" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nome:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identificador:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Iconu:" #: error msgid "ERROR" msgstr "ERROR" #: return msgid "return..." msgstr "tornar..." #: group_admin_users msgid "Users" msgstr "Usuarios" #: group_admin_no_users msgid "This group has no users." msgstr "Esti grupu nun tien usuariu/a dengún." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Criar un usuariu/a nuevu..." #: cancel msgid "Cancel" msgstr "Encaboxar" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "El nome del grupu ye incorreutu!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "L'identificador de grupu ye incorreutu." #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "¡Yá hai un grupu con esti identificador na base de datos!" #: group_admin_delete_group msgid "Delete group" msgstr "Esborrar el grupu" #: report_areyousure msgid "Are you sure?" msgstr "¿De xuru?" #: YES msgid "Yes" msgstr "Sí" #: NOT msgid "Not" msgstr "Non" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Esta operación va desaniciar tamién de la base de datos a tolos usuarios " "d'esti grupu. Van perdese tolos datos d'estos usuarios." #: db_error msgid "Unable to complete the task." msgstr "Nun se pudo facer la operación." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Llimpiar los informes del grupu" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Esta operación va llimpiar tolos informes de les xeres realizaes polos " "miembros d'esti grupu ente les dates conseñaes." #: db_clear_reports_date msgid "Clear report data" msgstr "Llimpiar los datos d'informes" #: user_admin_invalid_name msgid "Invalid user name." msgstr "El nome d'usuariu/a ye incorreutu." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "L'identificador d'usuariu/a ye incorreutu!" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "" "Yá hai otru usuariu/a con esti identificador na base de datos. Los nomes " "puen repetise (en dellos grupos) pero los identificadores tienen de ser " "únicos." #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "L'usuariu/a foi esborráu dafechu de la base de datos." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identificador:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nome:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Iconu:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Camudar..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Esborrar..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Llimpiar informes..." #: user_admin_delete_user msgid "Delete user" msgstr "Esborrar l'usuariu/a" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Esta operación va esborrar al usuariu/a y los sos informes de la base de " "datos." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Llimpiar los informes del usuariu/a" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Esta operación va llimpiar los informes de les xeres realizaes por esti/a " "usuariu/a nel periodu especificáu." #: success msgid "Operation successful" msgstr "Operación fecha con ésitu" #: bad_data msgid "Bad data!" msgstr "¡Datos incorreutos!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Tiempu ente conexones (segundos)\\:" #: jclic_reports msgid "JClic reports" msgstr "Informes JClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "S" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Contraseña\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Confirmar contraseña\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "¡Les contraseñes nun concasen\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_bs.po000066400000000000000000000264731335566474600252510ustar00rootroot00000000000000# Bosnian translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-05-19 14:49+0000\n" "Last-Translator: Meliha Gadara \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Lozinka:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Morate osigurati validnu lozinku kako bi pristupili izvješću baze podataka." #: login_title msgid "Login" msgstr "Prijava" #: submit msgid "Submit..." msgstr "Pošalji..." #: login_incorrect msgid "Incorrect password!" msgstr "Netačna lozinka!" #: main_title msgid "Main menu" msgstr "Glavni izbornik" #: users_admin_title msgid "Users and groups admin" msgstr "Administrator korisnika i grupa" #: group_report_title msgid "Group reports" msgstr "Izvješća grupa" #: user_report_title msgid "User reports" msgstr "Izvješća korisnika" #: act_report_title msgid "Activity reports" msgstr "Izvješća aktivnosti" #: db_admin_title msgid "Database admin" msgstr "Administrator baze podataka" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Nije moguće podesiti nove vrijednosti baze podataka!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Dopustiti korisnicima kreiranje novih grupa" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Dopustiti korisnicima kreiranje novih korisnika" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Odaberi grupu u listi" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Odaberi korisničko ime u listi" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Baza podataka ima tabele korisnika i grupa" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Uredi postavke..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Podesi lozinku..." #: title msgid "Title" msgstr "Naslov" #: db_admin_edit_title msgid "Edit database settings" msgstr "Uredi postavke baze podataka" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Promjeni lozinku sistema" #: db_admin_pw_newPwd msgid "New password" msgstr "Nova lozinka" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Ponovo unesite lozinku" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Polja lozinke se ne uklapaju!" #: report_group msgid "Group:" msgstr "Grupa:" #: report_user msgid "User:" msgstr "Korisnik:" #: report_project msgid "Project:" msgstr "Projekt:" #: report_all_projects msgid "All projects" msgstr "Svi projekti" #: report_key msgid "Key:" msgstr "Tipka:" #: report_code msgid "Code:" msgstr "Kod" #: report_context msgid "Context:" msgstr "Objašnjenje:" #: report_from msgid "From:" msgstr "Od:" #: month_1 msgid "january" msgstr "januar" #: month_2 msgid "february" msgstr "februar" #: month_3 msgid "march" msgstr "mart" #: month_4 msgid "april" msgstr "april" #: month_5 msgid "may" msgstr "maj" #: month_6 msgid "june" msgstr "juni" #: month_7 msgid "july" msgstr "juli" #: month_8 msgid "august" msgstr "august" #: month_9 msgid "september" msgstr "septembar" #: month_10 msgid "october" msgstr "oktobar" #: month_11 msgid "november" msgstr "novembar" #: month_12 msgid "december" msgstr "decembar" #: report_to msgid "To:" msgstr "Do:" #: report_global_precision msgid "Global precision" msgstr "Globalna preciznost" #: report_solved_activities msgid "Solved activities" msgstr "Rješene aktivnosti" #: report_user_evolution msgid "User evolution" msgstr "Razvoj korisnika" #: report_group_evolution msgid "Group evolution" msgstr "Razvoj grupe" #: report_project_evolution msgid "Project evolution" msgstr "Razvoj projekta" #: report_result_distribution msgid "Result distribution" msgstr "Rezultat distribucije" #: report_no_data msgid "NO DATA" msgstr "NEMA PODATAKA" #: report_users msgid "Users:" msgstr "Korisnici:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sesije:" #: report_projects msgid "Projects:" msgstr "Projekti:" #: report_actDone msgid "Activities done:" msgstr "Urađene aktivnosti:" #: report_actSolved msgid "Activities solved:" msgstr "Rješene aktivnosti:" #: report_totalTime msgid "Total time:" msgstr "Ukupno vrijeme:" #: report_globalPrec msgid "Global score:" msgstr "Ukupan rezultat:" #: report_globalSummary msgid "Global summary" msgstr "Globalni pregled" #: report_header_date msgid "date" msgstr "datum" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sesije:" #: report_header_user msgid "user" msgstr "korisnik" #: report_header_project msgid "project" msgstr "projekt" #: report_header_numActs msgid "activities" msgstr "aktivnosti" #: report_header_actsSolved msgid "acts. solved" msgstr "akt.rješene" #: report_header_time msgid "time" msgstr "vrijeme" #: report_header_prec msgid "score" msgstr "rezultat" #: report_session_detail_show msgid "show session details" msgstr "pokaži datelje sesije" #: report_session_detail_title msgid "Activities done in session" msgstr "Urađene aktivnosti u sesiji" #: report_header_activity msgid "activity" msgstr "aktivnost" #: report_header_actions msgid "actions" msgstr "akcije" #: report_header_score msgid "corrects" msgstr "ispravke" #: report_header_solved msgid "ok" msgstr "uredu" #: Y msgctxt "Y" msgid "Y" msgstr "Y" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "sakrij detalje sesije" #: report_header_sessions msgid "sessions" msgstr "sesije" #: report_all_activities msgid "All activities" msgstr "Sve aktivnosti" #: report_activity msgid "Activity:" msgstr "Aktivnost:" #: report_many msgid "several" msgstr "nekoliko" #: report_n_users msgid "users" msgstr "korisnici" #: group_admin_title msgid "Groups administration" msgstr "Administracija grupa" #: group_admin_new_button msgid "New group..." msgstr "Nova grupa..." #: group_admin_groups msgid "Groups" msgstr "Grupe" #: report_actions msgid "Actions" msgstr "Akcije" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Uredi..." #: user_admin_title msgid "User admin" msgstr "Korisnik administrator" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Obriši..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Obriši izvještaje..." #: group_admin_properties msgid "Group properties" msgstr "Karakteristike grupe" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Naziv:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identifikator:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Ikona:" #: error msgid "ERROR" msgstr "GREŠKA" #: return msgid "return..." msgstr "vrati..." #: group_admin_users msgid "Users" msgstr "Korisnici" #: group_admin_no_users msgid "This group has no users." msgstr "Grupa nema korisnika." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Kreirajte novog korisnika..." #: cancel msgid "Cancel" msgstr "Odustani" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Netačan naziv grupe!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Netačan identifikator grupe!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Postoji druga grupa s istim identifikatorom u bazi podataka!" #: group_admin_delete_group msgid "Delete group" msgstr "Obriši grupu" #: report_areyousure msgid "Are you sure?" msgstr "Da li ste sigurni?" #: YES msgid "Yes" msgstr "Da" #: NOT msgid "Not" msgstr "Ne" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Ova operacija će također izbrisati sve korisnike ove grupe. Svi podaci od " "ovih korisnika će biti izgubljeni." #: db_error msgid "Unable to complete the task." msgstr "Nije moguće završiti zadatak." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Obriši izvještaje o podacima iz grupe" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Ovaj postupak će izbrisati sve izvještaje o aktivnostima učinjenim od strane " "članova ove grupe između navedenih datuma." #: db_clear_reports_date msgid "Clear report data" msgstr "Obriši izvještaje o podacima" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Neispravno korisničko ime." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Neispravan identifikator korisnika" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "Postoji drugi korisnik s istim identifikatorom u bazi podataka!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "Ovaj korisnik je uspješno izbrisan iz baze podataka." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identifikator:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Naziv:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Ikona:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Uredi..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Obriši..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Obriši izvještaje..." #: user_admin_delete_user msgid "Delete user" msgstr "Obriši korisnika" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Ovaj postupak će obrisati ovog korisnika i njegove izvještaje iz baze " "podataka." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Obriši izvješća od podacima korisnika" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Ovaj postupak će izbrisati sve izvještaje o aktivnostima učinjenim od strane " "ovog korisnika između navedenih datuma." #: success msgid "Operation successful" msgstr "Operacija uspješna" #: bad_data msgid "Bad data!" msgstr "Pogrešan podatak!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Vrijeme između konekcija (sekunde)\\:" #: jclic_reports msgid "JClic reports" msgstr "JClic izvješća" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "Y" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Lozinka\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Potvrdi lozinku\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Lozinke se ne poklapaju\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_ca.po000066400000000000000000000270071335566474600252220ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-08-31 15:01+0000\n" "Last-Translator: David Planella \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Contrasenya:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Heu d'escriure una contrasenya correcta per accedir a la base de dades " "d'informes." #: login_title msgid "Login" msgstr "Connexió a la base de dades" #: submit msgid "Submit..." msgstr "Envia dades..." #: login_incorrect msgid "Incorrect password!" msgstr "Contrasenya incorrecta!" #: main_title msgid "Main menu" msgstr "Menú principal" #: users_admin_title msgid "Users and groups admin" msgstr "Administració de grups i usuaris" #: group_report_title msgid "Group reports" msgstr "Informes de grup" #: user_report_title msgid "User reports" msgstr "Informes d'usuari/a" #: act_report_title msgid "Activity reports" msgstr "Informes d'activitat" #: db_admin_title msgid "Database admin" msgstr "Administració de la base de dades" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Ha estat impossible fixar els nous valors per a la base de dades!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Permetre als usuaris crear nous grups" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Permetre als usuaris la creació de nous usuaris" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Seleccionar grup en una llista" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Seleccionar el nom d'usuari/a en una llista" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "La base de dades té taules d'usuaris i grups" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Edita les propietats..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Estableix la contrasenya..." #: title msgid "Title" msgstr "Títol" #: db_admin_edit_title msgid "Edit database settings" msgstr "Edita les propietats de la base de dades" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Canvia la contrasenya del sistema" #: db_admin_pw_newPwd msgid "New password" msgstr "Nova contrasenya" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Torna a escriure la contrasenya" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Els dos texts no coincideixen!" #: report_group msgid "Group:" msgstr "Grup:" #: report_user msgid "User:" msgstr "Usuari:" #: report_project msgid "Project:" msgstr "Projecte:" #: report_all_projects msgid "All projects" msgstr "Tots els projectes" #: report_key msgid "Key:" msgstr "Clau:" #: report_code msgid "Code:" msgstr "Codi:" #: report_context msgid "Context:" msgstr "Context:" #: report_from msgid "From:" msgstr "Des de:" #: month_1 msgid "january" msgstr "gener" #: month_2 msgid "february" msgstr "febrer" #: month_3 msgid "march" msgstr "març" #: month_4 msgid "april" msgstr "abril" #: month_5 msgid "may" msgstr "maig" #: month_6 msgid "june" msgstr "juny" #: month_7 msgid "july" msgstr "juliol" #: month_8 msgid "august" msgstr "agost" #: month_9 msgid "september" msgstr "setembre" #: month_10 msgid "october" msgstr "octubre" #: month_11 msgid "november" msgstr "novembre" #: month_12 msgid "december" msgstr "desembre" #: report_to msgid "To:" msgstr "Fins a:" #: report_global_precision msgid "Global precision" msgstr "Precisió global" #: report_solved_activities msgid "Solved activities" msgstr "Activitats resoltes" #: report_user_evolution msgid "User evolution" msgstr "Evolució de l'usuari/a" #: report_group_evolution msgid "Group evolution" msgstr "Evolució del grup" #: report_project_evolution msgid "Project evolution" msgstr "Evolució del projecte" #: report_result_distribution msgid "Result distribution" msgstr "Distribució de resultats" #: report_no_data msgid "NO DATA" msgstr "SENSE DADES" #: report_users msgid "Users:" msgstr "Usuaris:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sessions:" #: report_projects msgid "Projects:" msgstr "Projectes:" #: report_actDone msgid "Activities done:" msgstr "Activitats fetes:" #: report_actSolved msgid "Activities solved:" msgstr "Activitats resoltes:" #: report_totalTime msgid "Total time:" msgstr "Temps total:" #: report_globalPrec msgid "Global score:" msgstr "Precisió global:" #: report_globalSummary msgid "Global summary" msgstr "Resum global" #: report_header_date msgid "date" msgstr "data" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sessions realitzades:" #: report_header_user msgid "user" msgstr "usuari/a" #: report_header_project msgid "project" msgstr "projecte" #: report_header_numActs msgid "activities" msgstr "activitats" #: report_header_actsSolved msgid "acts. solved" msgstr "act. resoltes" #: report_header_time msgid "time" msgstr "temps" #: report_header_prec msgid "score" msgstr "precisió" #: report_session_detail_show msgid "show session details" msgstr "mostrar detalls de la sessió" #: report_session_detail_title msgid "Activities done in session" msgstr "Activitats realitzades a la sessió" #: report_header_activity msgid "activity" msgstr "activitat" #: report_header_actions msgid "actions" msgstr "accions" #: report_header_score msgid "corrects" msgstr "encerts" #: report_header_solved msgid "ok" msgstr "bé" #: Y msgctxt "Y" msgid "Y" msgstr "S" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "amaga els detalls de la sessió" #: report_header_sessions msgid "sessions" msgstr "sessions" #: report_all_activities msgid "All activities" msgstr "Totes les activitats" #: report_activity msgid "Activity:" msgstr "Activitat:" #: report_many msgid "several" msgstr "diversos" #: report_n_users msgid "users" msgstr "usuaris" #: group_admin_title msgid "Groups administration" msgstr "Administració de grups" #: group_admin_new_button msgid "New group..." msgstr "Nou grup..." #: group_admin_groups msgid "Groups" msgstr "Grups" #: report_actions msgid "Actions" msgstr "Accions" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Modifica..." #: user_admin_title msgid "User admin" msgstr "Administració d'usuaris" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Elimina..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Elimina informes..." #: group_admin_properties msgid "Group properties" msgstr "Propietats del grup" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nom:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identificador:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Icona:" #: error msgid "ERROR" msgstr "ERROR" #: return msgid "return..." msgstr "torna..." #: group_admin_users msgid "Users" msgstr "Usuaris" #: group_admin_no_users msgid "This group has no users." msgstr "Aquest grup no conté cap usuari/a." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Crea un nou usuari/a..." #: cancel msgid "Cancel" msgstr "Cancel·la" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "El nom del grup és incorrecte!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "L'identificador de grup és incorrecte!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "" "Ja hi ha un altre grup amb el mateix identificador a la base de dades!" #: group_admin_delete_group msgid "Delete group" msgstr "Elimina el grup" #: report_areyousure msgid "Are you sure?" msgstr "Segur que voleu realitzar aquesta operació?" #: YES msgid "Yes" msgstr "Sí" #: NOT msgid "Not" msgstr "No" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Aquesta operació també eliminarà de la base de dades a tots els usuaris " "d'aquest grup. Totes les seves dades es perdran." #: db_error msgid "Unable to complete the task." msgstr "No s'ha pogut realitzar l'operació." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Esborra els informes del grup" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Aquesta operació esborrarà tots els informes de les activitats realitzades " "pels membres d'aquest grup entre les dates indicades." #: db_clear_reports_date msgid "Clear report data" msgstr "Esborra els informes" #: user_admin_invalid_name msgid "Invalid user name." msgstr "El nom d'usuari/a és incorrecte." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "L'identificador d'usuari/a és incorrecte!" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "" "Ja hi ha un altre usuari/a amb aquest identificador a la base de dades. Els " "noms es poden repetir (en diferents grups), però els identificadors han de " "ser únics." #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "L'usuari/a ha estat eliminat satisfactòriament de la base de dades." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identificador:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nom:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Icona:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Edita..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Elimina..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Elimina informes..." #: user_admin_delete_user msgid "Delete user" msgstr "Elimina l'usuari/a" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Aquesta operació eliminarà aquest/a usuari/a i els seus informes de la base " "de dades." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Elimina els informes de l'usuari/a" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Aquesta operació eliminarà els informes de les activitats realitzades per " "aquest/a usuari/a en el període especificat." #: success msgid "Operation successful" msgstr "Operació realitzada amb èxit" #: bad_data msgid "Bad data!" msgstr "Dades incorrectes!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Temps entre connexions (segons):" #: jclic_reports msgid "JClic reports" msgstr "Informes JClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "S" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Contrasenya:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Confirmació de la contrasenya:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Les contrasenyes no coincideixen\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_cs.po000066400000000000000000000263641335566474600252510ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-23 09:49+0000\n" "Last-Translator: Konki \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Heslo:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "Musíte zadat platné heslo pro přístup k databázi zpráv." #: login_title msgid "Login" msgstr "Přihlášení" #: submit msgid "Submit..." msgstr "Odeslat..." #: login_incorrect msgid "Incorrect password!" msgstr "Chybné heslo!" #: main_title msgid "Main menu" msgstr "Hlavní menu" #: users_admin_title msgid "Users and groups admin" msgstr "Uživatelé a administrátoři skupin" #: group_report_title msgid "Group reports" msgstr "Skupinová sestava" #: user_report_title msgid "User reports" msgstr "Uživatelská sestava" #: act_report_title msgid "Activity reports" msgstr "Sestava aktivit" #: db_admin_title msgid "Database admin" msgstr "Administrátor databáze" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Nelze nastavit hodnoty pro novou databázi!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Povolit uživatelům vytvářet nové skupiny" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Povolit uživatelům vytvářet nové uživatele" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Vybrat skupinu ze seznamu" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Vybrat uživatele ze seznamu" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Databáze má tabulky uživatelů a skupin" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Upravit nastavení..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Nastavit heslo..." #: title msgid "Title" msgstr "Titulek" #: db_admin_edit_title msgid "Edit database settings" msgstr "Upravit nastavení databáze" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Změnit heslo systému" #: db_admin_pw_newPwd msgid "New password" msgstr "Nové heslo" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Znovu zadejte heslo" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Hesla se neshodují!" #: report_group msgid "Group:" msgstr "Skupina:" #: report_user msgid "User:" msgstr "Uživatel:" #: report_project msgid "Project:" msgstr "Projekt:" #: report_all_projects msgid "All projects" msgstr "Všechny projekty" #: report_key msgid "Key:" msgstr "Klávesa:" #: report_code msgid "Code:" msgstr "Kód:" #: report_context msgid "Context:" msgstr "Kontext:" #: report_from msgid "From:" msgstr "Od:" #: month_1 msgid "january" msgstr "leden" #: month_2 msgid "february" msgstr "únor" #: month_3 msgid "march" msgstr "březen" #: month_4 msgid "april" msgstr "duben" #: month_5 msgid "may" msgstr "květen" #: month_6 msgid "june" msgstr "červen" #: month_7 msgid "july" msgstr "červenec" #: month_8 msgid "august" msgstr "srpen" #: month_9 msgid "september" msgstr "září" #: month_10 msgid "october" msgstr "říjen" #: month_11 msgid "november" msgstr "listopad" #: month_12 msgid "december" msgstr "prosinec" #: report_to msgid "To:" msgstr "Komu:" #: report_global_precision msgid "Global precision" msgstr "Globální přesnost" #: report_solved_activities msgid "Solved activities" msgstr "Vyřešené aktivity" #: report_user_evolution msgid "User evolution" msgstr "Vývoj uživatele" #: report_group_evolution msgid "Group evolution" msgstr "Vývoj skupiny" #: report_project_evolution msgid "Project evolution" msgstr "Vývoj projektu" #: report_result_distribution msgid "Result distribution" msgstr "Rozdělení výsledků" #: report_no_data msgid "NO DATA" msgstr "NO DATA" #: report_users msgid "Users:" msgstr "Uživatelé:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sezení:" #: report_projects msgid "Projects:" msgstr "Projekty:" #: report_actDone msgid "Activities done:" msgstr "Vyzkoušené aktivity:" #: report_actSolved msgid "Activities solved:" msgstr "Vyřešené aktivity:" #: report_totalTime msgid "Total time:" msgstr "Celkový čas:" #: report_globalPrec msgid "Global score:" msgstr "Celkové skóre:" #: report_globalSummary msgid "Global summary" msgstr "Souhrnný přehled" #: report_header_date msgid "date" msgstr "datum" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sezení:" #: report_header_user msgid "user" msgstr "uživatel" #: report_header_project msgid "project" msgstr "projekt" #: report_header_numActs msgid "activities" msgstr "aktivity" #: report_header_actsSolved msgid "acts. solved" msgstr "vyřešené aktivity" #: report_header_time msgid "time" msgstr "čas" #: report_header_prec msgid "score" msgstr "skóre" #: report_session_detail_show msgid "show session details" msgstr "zobrazit podrobnosti sezení (sessions)" #: report_session_detail_title msgid "Activities done in session" msgstr "Aktivity vyzkoušené v sezení" #: report_header_activity msgid "activity" msgstr "aktivita" #: report_header_actions msgid "actions" msgstr "akce" #: report_header_score msgid "corrects" msgstr "správně" #: report_header_solved msgid "ok" msgstr "ok" #: Y msgctxt "Y" msgid "Y" msgstr "Y" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "skrýt detaily sezení" #: report_header_sessions msgid "sessions" msgstr "sezení" #: report_all_activities msgid "All activities" msgstr "Všechny aktivity" #: report_activity msgid "Activity:" msgstr "Aktivita:" #: report_many msgid "several" msgstr "několik" #: report_n_users msgid "users" msgstr "uživatelé" #: group_admin_title msgid "Groups administration" msgstr "Správa skupin" #: group_admin_new_button msgid "New group..." msgstr "Nová skupina..." #: group_admin_groups msgid "Groups" msgstr "Skupiny" #: report_actions msgid "Actions" msgstr "Akce" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Upravit..." #: user_admin_title msgid "User admin" msgstr "Správce" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Smazat..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Vymazat zprávy ..." #: group_admin_properties msgid "Group properties" msgstr "Vlastnosti skupiny" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Jméno:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identifikátor:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Ikona:" #: error msgid "ERROR" msgstr "CHYBA" #: return msgid "return..." msgstr "zpět..." #: group_admin_users msgid "Users" msgstr "Uživatelé" #: group_admin_no_users msgid "This group has no users." msgstr "Tato skupina nemá žádné uživatele." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Vytvořit nového uživatele..." #: cancel msgid "Cancel" msgstr "Zrušit" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Chybný název skupiny!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Chybný identifikátor skupiny!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "V databázi existuje skupina se stejným identifikátorem!" #: group_admin_delete_group msgid "Delete group" msgstr "Smazat skupinu" #: report_areyousure msgid "Are you sure?" msgstr "Jste si jisti?" #: YES msgid "Yes" msgstr "Ano" #: NOT msgid "Not" msgstr "Ne" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Tato operace také odstraní z databáze všechny uživatele této skupiny. " "Všechna data těchto uživatelů budou smazána." #: db_error msgid "Unable to complete the task." msgstr "Nelze dokončit úkol." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Vyčistit hlášená data o skupině" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Tato operace smaže všechna hlášení činností provedených členy této skupiny " "mezi zadanými daty." #: db_clear_reports_date msgid "Clear report data" msgstr "Vyčistit hlášená data" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Neplatné uživatelské jméno." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Neplatný identifikátor uživatele" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "V databázi existuje uživatel se stejným identifikátorem!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "Uživatel byl úspěšně smazán z databáze." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identifikátor:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Název:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Ikona:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Upravit..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Smazat..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Vymazat zprávy ..." #: user_admin_delete_user msgid "Delete user" msgstr "Vymazat uživatele" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "Tato operace vymaže tohoto uživatele a jeho hlášení z databáze." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Vyčistit datová hlášení uživatele" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Tato operace smaže všechna hlášení činností tohoto uživatele mezi " "stanovenými termíny." #: success msgid "Operation successful" msgstr "Operace proběhla úspěšně" #: bad_data msgid "Bad data!" msgstr "Špatná data!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Čas mezi připojením (sekundy)\\:" #: jclic_reports msgid "JClic reports" msgstr "JClic hlášení" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "A" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Heslo\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Potvrzení hesla\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Hesla se neshodují\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_de.po000066400000000000000000000263441335566474600252320ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-08-01 14:52+0000\n" "Last-Translator: Daniel Winzen \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Passwort:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Sie benötigen ein gültiges Passwort, um auf die Datenbank zugreifen zu " "können." #: login_title msgid "Login" msgstr "Login" #: submit msgid "Submit..." msgstr "Absenden..." #: login_incorrect msgid "Incorrect password!" msgstr "Falsches Passwort!" #: main_title msgid "Main menu" msgstr "Hauptmenü" #: users_admin_title msgid "Users and groups admin" msgstr "Benutzer- und Gruppenverwaltung" #: group_report_title msgid "Group reports" msgstr "Berichte für Gruppe" #: user_report_title msgid "User reports" msgstr "Benutzerberichte" #: act_report_title msgid "Activity reports" msgstr "Übungsberichte" #: db_admin_title msgid "Database admin" msgstr "Datenbankverwaltung" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Neue Werte für Datenbank konnten nicht übernommen werden!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Benutzer dürfen neue Gruppen anlegen" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Benutzer dürfen neue User anlegen" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Gruppe aus Liste auswählen" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Benutzername aus Liste auswählen" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Datenbank beinhaltet Tabellen der Benutzer und Benutzergruppen" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Einstellungen bearbeiten..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Passwort festlegen..." #: title msgid "Title" msgstr "Titel" #: db_admin_edit_title msgid "Edit database settings" msgstr "Einstellungen für Datenbank bearbeiten" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Passwort für System ändern" #: db_admin_pw_newPwd msgid "New password" msgstr "Neues Passwort" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Passwort wiederholen" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Falsches Passwort!" #: report_group msgid "Group:" msgstr "Gruppe:" #: report_user msgid "User:" msgstr "Benutzer:" #: report_project msgid "Project:" msgstr "Projekt:" #: report_all_projects msgid "All projects" msgstr "Alle Projekte" #: report_key msgid "Key:" msgstr "Schlüssel:" #: report_code msgid "Code:" msgstr "Code:" #: report_context msgid "Context:" msgstr "Context:" #: report_from msgid "From:" msgstr "Von:" #: month_1 msgid "january" msgstr "Jänner" #: month_2 msgid "february" msgstr "Feber" #: month_3 msgid "march" msgstr "März" #: month_4 msgid "april" msgstr "April" #: month_5 msgid "may" msgstr "Mai" #: month_6 msgid "june" msgstr "Juni" #: month_7 msgid "july" msgstr "Juli" #: month_8 msgid "august" msgstr "August" #: month_9 msgid "september" msgstr "September" #: month_10 msgid "october" msgstr "Oktober" #: month_11 msgid "november" msgstr "November" #: month_12 msgid "december" msgstr "Detember" #: report_to msgid "To:" msgstr "Bis:" #: report_global_precision msgid "Global precision" msgstr "Gesamtpunkte" #: report_solved_activities msgid "Solved activities" msgstr "Richtig gelöste Übungen" #: report_user_evolution msgid "User evolution" msgstr "Benutzerfortschritt" #: report_group_evolution msgid "Group evolution" msgstr "Fortschritt der Gruppe" #: report_project_evolution msgid "Project evolution" msgstr "Projektfortschritt" #: report_result_distribution msgid "Result distribution" msgstr "Ergebnisverteilung" #: report_no_data msgid "NO DATA" msgstr "KEINE DATEN" #: report_users msgid "Users:" msgstr "Benutzer:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sitzungen:" #: report_projects msgid "Projects:" msgstr "Projekte:" #: report_actDone msgid "Activities done:" msgstr "Abgeschlossene Übungen:" #: report_actSolved msgid "Activities solved:" msgstr "Richtig gelöste Übungen:" #: report_totalTime msgid "Total time:" msgstr "Gesamtzeit:" #: report_globalPrec msgid "Global score:" msgstr "Gesamtpunktestand:" #: report_globalSummary msgid "Global summary" msgstr "Gesamtergebnis" #: report_header_date msgid "date" msgstr "Datum" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sitzungen:" #: report_header_user msgid "user" msgstr "Benutzer" #: report_header_project msgid "project" msgstr "Projekt" #: report_header_numActs msgid "activities" msgstr "Übungen" #: report_header_actsSolved msgid "acts. solved" msgstr "Richtig gelöste Übungen" #: report_header_time msgid "time" msgstr "Zeit" #: report_header_prec msgid "score" msgstr "Punktestand" #: report_session_detail_show msgid "show session details" msgstr "Details der Sitzung anzeigen" #: report_session_detail_title msgid "Activities done in session" msgstr "In der Sitzung durchgfeführte Übungen" #: report_header_activity msgid "activity" msgstr "Übung" #: report_header_actions msgid "actions" msgstr "Aktionen" #: report_header_score msgid "corrects" msgstr "Richtige" #: report_header_solved msgid "ok" msgstr "OK" #: Y msgctxt "Y" msgid "Y" msgstr "J" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "Details der Sitzung nicht anzeigen" #: report_header_sessions msgid "sessions" msgstr "Sitzungen" #: report_all_activities msgid "All activities" msgstr "Alle Übungen" #: report_activity msgid "Activity:" msgstr "Übung:" #: report_many msgid "several" msgstr "mehrere" #: report_n_users msgid "users" msgstr "Benutzer" #: group_admin_title msgid "Groups administration" msgstr "Gruppenverwaltung" #: group_admin_new_button msgid "New group..." msgstr "Neue Gruppe …" #: group_admin_groups msgid "Groups" msgstr "Gruppen" #: report_actions msgid "Actions" msgstr "Aktionen" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Bearbeiten..." #: user_admin_title msgid "User admin" msgstr "Benutzerverwaltung" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Löschen..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Berichte löschen..." #: group_admin_properties msgid "Group properties" msgstr "Gruppeneigenschaften" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Name:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Benutzername:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Symbol:" #: error msgid "ERROR" msgstr "ERROR" #: return msgid "return..." msgstr "zurück..." #: group_admin_users msgid "Users" msgstr "Benutzer" #: group_admin_no_users msgid "This group has no users." msgstr "Keine Benutzer in dieser Gruppe vorhanden." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Einen neuen Benutzer erstellen..." #: cancel msgid "Cancel" msgstr "Abbrechen" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Falscher Gruppenname!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Falscher Gruppenname!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "" "Es wurde bereits eine andere Gruppe mit gleichem Namen in die Datenbank " "eingetragen!" #: group_admin_delete_group msgid "Delete group" msgstr "Gruppe löschen" #: report_areyousure msgid "Are you sure?" msgstr "Sind Sie sicher?" #: YES msgid "Yes" msgstr "Ja" #: NOT msgid "Not" msgstr "Nein" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Dieser Vorgang löscht alle User der ausgewählten Gruppe aus der Datenbank. " "Alle Daten der ausgewählten User werden gelöscht." #: db_error msgid "Unable to complete the task." msgstr "Vorgang konnte nicht durchgeführt werden." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Daten der Gruppe löschen" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Dieser Vorgang löscht alle Übungsberichte für die Mitglieder der " "ausgewählten Gruppe im angegebenen Zeitraum aus der Datenbank." #: db_clear_reports_date msgid "Clear report data" msgstr "Daten löschen" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Ungültiger Benutzername." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Ungültiger Benutzername" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "Benutzername wird bereits von einem anderen Benutzer verwendet!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "Benutzer erfolgreich aus der Datenbank gelöscht." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Benutzername:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Name:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Symbol:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Bearbeiten..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Löschen..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Berichte löschen..." #: user_admin_delete_user msgid "Delete user" msgstr "Benutzer löschen" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Dieser Vorgang löscht den ausgewählten Benutzer und alle dazugehörigen " "Berichte aus der Datenbank." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Benutzerdaten löschen" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Dieser Vorgang löscht alle Ergebnisse des ausgewählten Benutzers innerhalb " "des angegebenen Zeitraums aus der Datenbank." #: success msgid "Operation successful" msgstr "Vorgang erfolgreich abgeschlossen" #: bad_data msgid "Bad data!" msgstr "Falsche Eingabe!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Zeitabstand zwischen Verbindungen (in Sekunden):" #: jclic_reports msgid "JClic reports" msgstr "JClic Reports" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "J" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Passwort\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Passwort bestätigen\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Falsches Passwort\\!\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_el.po000066400000000000000000000346341335566474600252430ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-16 10:56+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Κωδικός πρόσβασης:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Πρέπει να δώσετε έναν έγκυρο κωδικό πρόσβασης για να αποκτήσετε πρόσβαση στη " "βάση δεδομένων των αναφορών." #: login_title msgid "Login" msgstr "Είσοδος" #: submit msgid "Submit..." msgstr "Υποβολή..." #: login_incorrect msgid "Incorrect password!" msgstr "Λανθασμένος κωδικός πρόσβασης" #: main_title msgid "Main menu" msgstr "Κύριο Μενού" #: users_admin_title msgid "Users and groups admin" msgstr "Διαχείριση χρηστών και ομάδων" #: group_report_title msgid "Group reports" msgstr "Αναφορές ομάδας" #: user_report_title msgid "User reports" msgstr "Αναφορές χρήστη" #: act_report_title msgid "Activity reports" msgstr "Αναφορές δραστηριότητας" #: db_admin_title msgid "Database admin" msgstr "Διαχείριση βάσης δεδομένων" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Αδυναμία ορισμού νέων τιμών για τη βάση δεδομένων!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Επιτρέπεται στους χρήστες να δημιουργούν νέες ομάδες" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Επιτρέπεται στους χρήστες να δημιουργούν νέους χρήστες" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Επιλογή ομάδας από έναν κατάλογο" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Επιλογή ονόματος χρήστη από έναν κατάλογο" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Η βάση δεδομένων διαθέτει πίνακες με τους χρήστες και τις ομάδες" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Επεξεργασία ρυθμίσεων" #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Ορισμός κωδικού πρόσβασης..." #: title msgid "Title" msgstr "Τίτλος" #: db_admin_edit_title msgid "Edit database settings" msgstr "Επεξεργασία ρυθμίσεων της βάσης δεδομένων" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Αλλαγή κωδικού πρόσβασης συστήματος" #: db_admin_pw_newPwd msgid "New password" msgstr "Νέος κωδικός πρόσβασης" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Πληκτρολογήστε ξανά τον κωδικό πρόσβασης" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Ο κωδικός πρόσβασης δεν ταιριάζει!" #: report_group msgid "Group:" msgstr "Ομάδα:" #: report_user msgid "User:" msgstr "Χρήστης:" #: report_project msgid "Project:" msgstr "Έργο:" #: report_all_projects msgid "All projects" msgstr "Όλα τα έργα" #: report_key msgid "Key:" msgstr "Κλειδί:" #: report_code msgid "Code:" msgstr "Κωδικός:" #: report_context msgid "Context:" msgstr "Περιβάλλον:" #: report_from msgid "From:" msgstr "Από:" #: month_1 msgid "january" msgstr "Ιανουάριος" #: month_2 msgid "february" msgstr "Φεβρουάριος" #: month_3 msgid "march" msgstr "Μάρτιος" #: month_4 msgid "april" msgstr "Απρίλιος" #: month_5 msgid "may" msgstr "Μάιος" #: month_6 msgid "june" msgstr "Ιούνιος" #: month_7 msgid "july" msgstr "Ιούλιος" #: month_8 msgid "august" msgstr "Αύγουστος" #: month_9 msgid "september" msgstr "Σεπτέμβριος" #: month_10 msgid "october" msgstr "Οκτώβριος" #: month_11 msgid "november" msgstr "Νοέμβριος" #: month_12 msgid "december" msgstr "Δεκέμβριος" #: report_to msgid "To:" msgstr "Προς:" #: report_global_precision msgid "Global precision" msgstr "Καθολική ακρίβεια" #: report_solved_activities msgid "Solved activities" msgstr "Επιλυμένες δραστηριότητες" #: report_user_evolution msgid "User evolution" msgstr "Εξέλιξη του χρήστη" #: report_group_evolution msgid "Group evolution" msgstr "Εξέλιξη της ομάδας" #: report_project_evolution msgid "Project evolution" msgstr "Εξέλιξη του έργου" #: report_result_distribution msgid "Result distribution" msgstr "Διανομή αποτελεσμάτων" #: report_no_data msgid "NO DATA" msgstr "ΔΕΝ ΥΠΑΡΧΟΥΝ ΔΕΔΟΜΕΝΑ" #: report_users msgid "Users:" msgstr "Χρήστες;" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Συνεδρίες:" #: report_projects msgid "Projects:" msgstr "Έργα:" #: report_actDone msgid "Activities done:" msgstr "Ολοκληρωμένες δραστηριότητες:" #: report_actSolved msgid "Activities solved:" msgstr "Επιλυμένες δραστηριότητες:" #: report_totalTime msgid "Total time:" msgstr "Συνολικός χρόνος:" #: report_globalPrec msgid "Global score:" msgstr "Συνολική βαθμολογία" #: report_globalSummary msgid "Global summary" msgstr "Γενική σύνοψη" #: report_header_date msgid "date" msgstr "ημερομηνία" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Συνεδρίες:" #: report_header_user msgid "user" msgstr "χρήστης" #: report_header_project msgid "project" msgstr "έργο" #: report_header_numActs msgid "activities" msgstr "δραστηριότητες" #: report_header_actsSolved msgid "acts. solved" msgstr "επιλυμένες δραστηριότητες" #: report_header_time msgid "time" msgstr "χρόνος" #: report_header_prec msgid "score" msgstr "βαθμολογία" #: report_session_detail_show msgid "show session details" msgstr "εμφάνιση πληροφοριών συνεδρίας" #: report_session_detail_title msgid "Activities done in session" msgstr "Πραγματοποιημένες δραστηριότητες σε αυτή τη συνεδρία" #: report_header_activity msgid "activity" msgstr "δραστηριότητα" #: report_header_actions msgid "actions" msgstr "ενέργειες" #: report_header_score msgid "corrects" msgstr "διορθώνει" #: report_header_solved msgid "ok" msgstr "Εντάξει" #: Y msgctxt "Y" msgid "Y" msgstr "Ναι" #: N msgctxt "N" msgid "N" msgstr "Όχι" #: report_session_detail_hide msgid "hide session details" msgstr "απόκρυψη λεπτομερειών συνεδρίας" #: report_header_sessions msgid "sessions" msgstr "συνεδρίες" #: report_all_activities msgid "All activities" msgstr "Όλες οι δραστηριότητες" #: report_activity msgid "Activity:" msgstr "Δραστηριότητα:" #: report_many msgid "several" msgstr "αρκετά" #: report_n_users msgid "users" msgstr "χρήστες" #: group_admin_title msgid "Groups administration" msgstr "Διαχείριση ομάδων" #: group_admin_new_button msgid "New group..." msgstr "Νέα ομάδα..." #: group_admin_groups msgid "Groups" msgstr "Ομάδες" #: report_actions msgid "Actions" msgstr "Ενέργειες" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Επεξεργασία..." #: user_admin_title msgid "User admin" msgstr "Διαχείριση χρήστη" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Διαγραφή..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Καθαρισμός αναφορών..." #: group_admin_properties msgid "Group properties" msgstr "Ιδιότητες ομάδας" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Όνομα:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Αναγνωριστικό:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Εικονίδιο:" #: error msgid "ERROR" msgstr "ΣΦΑΛΜΑ" #: return msgid "return..." msgstr "επιστροφή" #: group_admin_users msgid "Users" msgstr "Χρήστες" #: group_admin_no_users msgid "This group has no users." msgstr "Αυτή η ομάδα δεν διαθέτει χρήστες." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Δημιουργία νέου χρήστη..." #: cancel msgid "Cancel" msgstr "Άκυρο" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Λανθασμένο όνομα ομάδας!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Λανθασμένο αναγνωριστικό ομάδας!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Υπάρχει μια άλλη ομάδα στη βάση δεδομένων με το ίδιο αναγνωριστικό!" #: group_admin_delete_group msgid "Delete group" msgstr "Διαγραφή ομάδας" #: report_areyousure msgid "Are you sure?" msgstr "Σίγουρα;" #: YES msgid "Yes" msgstr "Ναι" #: NOT msgid "Not" msgstr "Όχι" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Αυτή η λειτουργία θα σβήσει όλους τους χρήστες αυτής της ομάδας από τη βάση " "δεδομένων. Όλα τα δεδομένα αυτών των χρηστών θα χαθούν." #: db_error msgid "Unable to complete the task." msgstr "Αδυναμία εκπλήρωσης του στόχου." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Καθαρισμός δεδομένων αναφοράς της ομάδας" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Αυτή η λειτουργία θα καθαρίσει όλες τις αναφορές των δραστηριοτήτων που " "πραγματοποιήθηκαν από τα μέλη αυτής της ομάδας μεταξύ των καθορισμένων " "ημερομηνιών." #: db_clear_reports_date msgid "Clear report data" msgstr "Καθαρισμός δεδομένων αναφοράς" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Λανθασμένο όνομα χρήστη." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Λανθασμένο αναγνωριστικό χρήστη." #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "" "Υπάρχει ένας άλλο χρήστης με το ίδιο αναγνωριστικό στη βάση δεδομένων!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "Ο χρήστης αφαιρέθηκε με επιτυχία από τη βάση δεδομένων." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Αναγνωριστικό:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Όνομα:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Εικονίδιο:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Επεξεργασία..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Διαγραφή..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Καθαρισμός αναφορών..." #: user_admin_delete_user msgid "Delete user" msgstr "Διαγραφή χρήστη" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Αυτή η λειτουργία θα διαγράψει τον χρήστη και τις αναφορές του από τη βάση " "δεδομένων." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Καθαρισμός δεδομένων αναφοράς χρήστη" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Αυτή η λειτουργία θα κάνει εκκαθάριση όλων των αναφορών και των " "δραστηριοτήτων που έγιναν από αυτόν τον χρήστη μεταξύ των καθορισμένων " "ημερομηνιών." #: success msgid "Operation successful" msgstr "Επιτυχής λειτουργία" #: bad_data msgid "Bad data!" msgstr "Λάθος δεδομένα!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Χρόνος μεταξύ των συνδέσεων (δευτερόλεπτα)\\:" #: jclic_reports msgid "JClic reports" msgstr "Αναφορές του JClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "Ναι" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "Όχι" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Κωδικός πρόσβασης\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Επιβεβαίωση κωδικού πρόσβασης\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Ο κωδικός πρόσβασης δεν ταιριάζει\\:" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_es.po000066400000000000000000000271231335566474600252450ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-10-23 05:43+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Contraseña:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Debe escribir una contraseña correcta para acceder a la base de datos de " "informes." #: login_title msgid "Login" msgstr "Conexión a la base de datos" #: submit msgid "Submit..." msgstr "Enviar datos..." #: login_incorrect msgid "Incorrect password!" msgstr "Contraseña incorrecta!" #: main_title msgid "Main menu" msgstr "Menú principal" #: users_admin_title msgid "Users and groups admin" msgstr "Administración de grupos y usuarios" #: group_report_title msgid "Group reports" msgstr "Informes de grupo" #: user_report_title msgid "User reports" msgstr "Informes de usuario/a" #: act_report_title msgid "Activity reports" msgstr "Informes de actividad" #: db_admin_title msgid "Database admin" msgstr "Administración de la base de datos" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "¡No se han podido cambiar los valores de la base de datos!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Permitir a los usuarios crear nuevos grupos" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Permitir a los usuarios la creación de nuevos usuarios" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Seleccionar grupo en una lista" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Seleccionar el nombre de usuario/a en una lista" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "La base de datos tiene tablas de usuarios y grupos" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Editar propiedades..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Establecer contraseña..." #: title msgid "Title" msgstr "Título" #: db_admin_edit_title msgid "Edit database settings" msgstr "Editar propiedades de la base de datos" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Cambiar la contraseña del sistema" #: db_admin_pw_newPwd msgid "New password" msgstr "Nueva contraseña" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Volver a escribir la contraseña" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Los dos textos no coinciden!" #: report_group msgid "Group:" msgstr "Grupo:" #: report_user msgid "User:" msgstr "Usuario:" #: report_project msgid "Project:" msgstr "Proyecto:" #: report_all_projects msgid "All projects" msgstr "Todos los proyectos" #: report_key msgid "Key:" msgstr "Clave:" #: report_code msgid "Code:" msgstr "Código:" #: report_context msgid "Context:" msgstr "Contexto:" #: report_from msgid "From:" msgstr "Desde:" #: month_1 msgid "january" msgstr "enero" #: month_2 msgid "february" msgstr "febrero" #: month_3 msgid "march" msgstr "marzo" #: month_4 msgid "april" msgstr "abril" #: month_5 msgid "may" msgstr "mayo" #: month_6 msgid "june" msgstr "junio" #: month_7 msgid "july" msgstr "julio" #: month_8 msgid "august" msgstr "agosto" #: month_9 msgid "september" msgstr "septiembre" #: month_10 msgid "october" msgstr "octubre" #: month_11 msgid "november" msgstr "noviembre" #: month_12 msgid "december" msgstr "diciembre" #: report_to msgid "To:" msgstr "Hasta:" #: report_global_precision msgid "Global precision" msgstr "Precisión global" #: report_solved_activities msgid "Solved activities" msgstr "Actividades resueltas" #: report_user_evolution msgid "User evolution" msgstr "Evolución del usuario/a" #: report_group_evolution msgid "Group evolution" msgstr "Evolución del grupo" #: report_project_evolution msgid "Project evolution" msgstr "Evolución del proyecto" #: report_result_distribution msgid "Result distribution" msgstr "Distribución de resultados" #: report_no_data msgid "NO DATA" msgstr "SIN DATOS" #: report_users msgid "Users:" msgstr "Usuarios\\:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sessiones:" #: report_projects msgid "Projects:" msgstr "Proyectos:" #: report_actDone msgid "Activities done:" msgstr "Actividades realizadas:" #: report_actSolved msgid "Activities solved:" msgstr "Actividades resueltas:" #: report_totalTime msgid "Total time:" msgstr "Tiempo total:" #: report_globalPrec msgid "Global score:" msgstr "Precisión global:" #: report_globalSummary msgid "Global summary" msgstr "Resumen global" #: report_header_date msgid "date" msgstr "fecha" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sesiones realizadas:" #: report_header_user msgid "user" msgstr "usuario/a" #: report_header_project msgid "project" msgstr "proyecto" #: report_header_numActs msgid "activities" msgstr "actividades" #: report_header_actsSolved msgid "acts. solved" msgstr "act. resueltas" #: report_header_time msgid "time" msgstr "tiempo" #: report_header_prec msgid "score" msgstr "precisión" #: report_session_detail_show msgid "show session details" msgstr "mostrar detalles de la sesión..." #: report_session_detail_title msgid "Activities done in session" msgstr "Actividades realizadas en la sesión" #: report_header_activity msgid "activity" msgstr "actividad" #: report_header_actions msgid "actions" msgstr "acciones" #: report_header_score msgid "corrects" msgstr "aciertos" #: report_header_solved msgid "ok" msgstr "bien" #: Y msgctxt "Y" msgid "Y" msgstr "S" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "esconder detalles de la sesión" #: report_header_sessions msgid "sessions" msgstr "sesiones" #: report_all_activities msgid "All activities" msgstr "Todas las actividades" #: report_activity msgid "Activity:" msgstr "Actividad:" #: report_many msgid "several" msgstr "diversos" #: report_n_users msgid "users" msgstr "usuarios" #: group_admin_title msgid "Groups administration" msgstr "Administración de grupos" #: group_admin_new_button msgid "New group..." msgstr "Nuevo grupo..." #: group_admin_groups msgid "Groups" msgstr "Grupos" #: report_actions msgid "Actions" msgstr "Acciones" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Modificar..." #: user_admin_title msgid "User admin" msgstr "Administración de usuarios" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Eliminar..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Eliminar informes..." #: group_admin_properties msgid "Group properties" msgstr "Propiedades del grupo" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nombre:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identificador:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Icono:" #: error msgid "ERROR" msgstr "ERROR" #: return msgid "return..." msgstr "regresar..." #: group_admin_users msgid "Users" msgstr "Usuarios" #: group_admin_no_users msgid "This group has no users." msgstr "Este grupo no tiene ningún usuario/a." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Crear un nuevo usuario/a..." #: cancel msgid "Cancel" msgstr "Cancelar" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "El nombre del grupo es incorrecto!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "El identificador de grupo es incorrecto." #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "¡Ya existe un grupo con este identificador en la base de datos!" #: group_admin_delete_group msgid "Delete group" msgstr "Eliminar el grupo" #: report_areyousure msgid "Are you sure?" msgstr "¿Está seguro?" #: YES msgid "Yes" msgstr "Sí" #: NOT msgid "Not" msgstr "No" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Esta operación eliminará también de la base de datos a todos los usuarios de " "este grupo. Todos sus datos se perderán." #: db_error msgid "Unable to complete the task." msgstr "No se ha podido realizar la operación." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Eliminar los informes del grupo" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Esta operación borrará todos los informes de las actividades realizadas por " "los miembros de este grupo entre las fechas indicadas." #: db_clear_reports_date msgid "Clear report data" msgstr "Eliminar los informes" #: user_admin_invalid_name msgid "Invalid user name." msgstr "El nombre de usuario/a es incorrecto." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "El identificador de usuario/a es incorrecto!" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "" "Ya existe otro usuario/a con este identificador en la base de datos. Los " "nombres se pueden repetir (en distintos grupos) pero los identificadores han " "de ser únicos." #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "" "El usuario/a ha sido eliminado satisfactoriamente de la base de datos." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identificador:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nombre:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Icono:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Modificar..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Eliminar..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Eliminar informes..." #: user_admin_delete_user msgid "Delete user" msgstr "Eliminar el usuario/a" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Esta operación eliminará al usuario/a y sus informes de la base de datos." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Eliminar los informes del usuario/a" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Esta operación eliminará los informes de las actividades realizadas por " "este/a usuario(a en el periodo especificado." #: success msgid "Operation successful" msgstr "Operación realizada con éxito" #: bad_data msgid "Bad data!" msgstr "¡Datos incorrectos!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Tiempo entre conexiones (segundos)\\:" #: jclic_reports msgid "JClic reports" msgstr "Informes JClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "S" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Contraseña\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Confirmar contraseña\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "¡Las contraseñas no coinciden\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_eu.po000066400000000000000000000266711335566474600252560ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-02-18 16:37+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Pasahitza:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Txostenen datu-basera sartzeko balio duen pasahitza lortu behar duzu." #: login_title msgid "Login" msgstr "Saioa hasi" #: submit msgid "Submit..." msgstr "Bildatzen..." #: login_incorrect msgid "Incorrect password!" msgstr "Pasahitza ez da zuzena!" #: main_title msgid "Main menu" msgstr "Menu nagusia" #: users_admin_title msgid "Users and groups admin" msgstr "Erabiltzaile eta taldeen kudeaketa" #: group_report_title msgid "Group reports" msgstr "Talde-txostenak" #: user_report_title msgid "User reports" msgstr "Erabiltzailearen txostenak" #: act_report_title msgid "Activity reports" msgstr "Jarduera-txostenak" #: db_admin_title msgid "Database admin" msgstr "Datu-basearen kudeatzailea" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Datu-basearen baloreak ezin dira aldatu!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Utzi erabiltzaileei talde berriak sortzen" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Utzi erabiltzaileei erabiltzaile berriak sortzen" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Aukeratu taldea zerrendatik" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Aukeratu erabiltzaile-izena zerrendatik" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Datu-baseak erabiltzaile eta taldeen taulak ditu" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Editatu ezarpenak..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Ezarri pasahitza..." #: title msgid "Title" msgstr "Izenburua" #: db_admin_edit_title msgid "Edit database settings" msgstr "Editatu datu-basearen ezarpenak" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Aldatu sistemaren pasahitza" #: db_admin_pw_newPwd msgid "New password" msgstr "Pasahitz berria" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Idatzi berriz pasahitza" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Bi testuak ez datoz bat!" #: report_group msgid "Group:" msgstr "Taldea:" #: report_user msgid "User:" msgstr "Erabiltzailea:" #: report_project msgid "Project:" msgstr "Proiektua:" #: report_all_projects msgid "All projects" msgstr "Proiektu guztiak" #: report_key msgid "Key:" msgstr "Giltza:" #: report_code msgid "Code:" msgstr "Kodea:" #: report_context msgid "Context:" msgstr "Testuingurua:" #: report_from msgid "From:" msgstr "Hemendik:" #: month_1 msgid "january" msgstr "urtarrila" #: month_2 msgid "february" msgstr "otsaila" #: month_3 msgid "march" msgstr "martxoa" #: month_4 msgid "april" msgstr "apirila" #: month_5 msgid "may" msgstr "maiatza" #: month_6 msgid "june" msgstr "ekaina" #: month_7 msgid "july" msgstr "uztaila" #: month_8 msgid "august" msgstr "abuztua" #: month_9 msgid "september" msgstr "iraila" #: month_10 msgid "october" msgstr "urria" #: month_11 msgid "november" msgstr "azaroa" #: month_12 msgid "december" msgstr "abendua" #: report_to msgid "To:" msgstr "Hona:" #: report_global_precision msgid "Global precision" msgstr "Zehaztapen orokorra" #: report_solved_activities msgid "Solved activities" msgstr "Egindako jarduerak" #: report_user_evolution msgid "User evolution" msgstr "Erabiltzailearen garapena" #: report_group_evolution msgid "Group evolution" msgstr "Taldearen garapena" #: report_project_evolution msgid "Project evolution" msgstr "Proiektuaren garapena" #: report_result_distribution msgid "Result distribution" msgstr "Emaitzen banaketa" #: report_no_data msgid "NO DATA" msgstr "DATURIK EZ" #: report_users msgid "Users:" msgstr "Erabiltzaileak:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Saioak:" #: report_projects msgid "Projects:" msgstr "Proiektuak:" #: report_actDone msgid "Activities done:" msgstr "Burututako jarduerak:" #: report_actSolved msgid "Activities solved:" msgstr "Egindako jarduerak:" #: report_totalTime msgid "Total time:" msgstr "Denbora guztira:" #: report_globalPrec msgid "Global score:" msgstr "Puntuazio orokorra:" #: report_globalSummary msgid "Global summary" msgstr "Laburpen orokorra" #: report_header_date msgid "date" msgstr "data" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Saioak:" #: report_header_user msgid "user" msgstr "erabiltzailea" #: report_header_project msgid "project" msgstr "proiektua" #: report_header_numActs msgid "activities" msgstr "jarduerak" #: report_header_actsSolved msgid "acts. solved" msgstr "egindako jarduerak" #: report_header_time msgid "time" msgstr "denbora" #: report_header_prec msgid "score" msgstr "puntuazioa" #: report_session_detail_show msgid "show session details" msgstr "erakutsi saioaren zehaztasunak" #: report_session_detail_title msgid "Activities done in session" msgstr "Saioan egindako jarduerak" #: report_header_activity msgid "activity" msgstr "jarduera" #: report_header_actions msgid "actions" msgstr "ekintzak" #: report_header_score msgid "corrects" msgstr "zuzenak" #: report_header_solved msgid "ok" msgstr "ados" #: Y msgctxt "Y" msgid "Y" msgstr "B" #: N msgctxt "N" msgid "N" msgstr "E" #: report_session_detail_hide msgid "hide session details" msgstr "ezkutatu saioaren zehaztasunak" #: report_header_sessions msgid "sessions" msgstr "saioak" #: report_all_activities msgid "All activities" msgstr "Jarduera guztiak" #: report_activity msgid "Activity:" msgstr "Jarduera:" #: report_many msgid "several" msgstr "gehiegi" #: report_n_users msgid "users" msgstr "erabiltzaileak" #: group_admin_title msgid "Groups administration" msgstr "Taldeen kudeaketa" #: group_admin_new_button msgid "New group..." msgstr "Talde berria..." #: group_admin_groups msgid "Groups" msgstr "Taldeak" #: report_actions msgid "Actions" msgstr "Ekintzak" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Editatu..." #: user_admin_title msgid "User admin" msgstr "Erabiltzaileen kudeatzailea" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Ezabatu..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Garbitu txostenak..." #: group_admin_properties msgid "Group properties" msgstr "Taldearen propietateak" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Izena:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identifikatzailea:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Ikonoa:" #: error msgid "ERROR" msgstr "ERROREA" #: return msgid "return..." msgstr "itzuli..." #: group_admin_users msgid "Users" msgstr "Erabiltzaileak" #: group_admin_no_users msgid "This group has no users." msgstr "Taldeak ez du erabiltzailerik." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Sortu erabiltzaile berria..." #: cancel msgid "Cancel" msgstr "Utzi" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Okerreko talde-izena!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Okerreko talde-identifikatzailea!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Bada beste talde bat identifikatzaile bera duena datu-basean!" #: group_admin_delete_group msgid "Delete group" msgstr "Ezabatu taldea" #: report_areyousure msgid "Are you sure?" msgstr "Ziur al zaude?" #: YES msgid "Yes" msgstr "Bai" #: NOT msgid "Not" msgstr "Ez" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Eragiketa honek talde honetako erabiltzaile guztiak ere ezabatuko ditu datu-" "basetik . Horien datu guztiak galdu egingo dira." #: db_error msgid "Unable to complete the task." msgstr "Ezin izan da eragiketa burutu." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Ezabatu taldearen txostenak" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Adierazitako daten artean talde honetako erabiltzaileek egindako jardueren " "txostenak ezabatuko ditu eragiketa honek." #: db_clear_reports_date msgid "Clear report data" msgstr "Ezabatu txostenak" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Okerreko erabiltzaile-izena" #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Okerreko erabiltzaile-identifikatzailea" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "Bada datu-basean identifikatzaile bera duen beste erabiltzaile bat!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "Erabiltzailea egoki ezabatu da datu-basetik." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identifikatzailea:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Izena:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Ikonoa:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Editatu..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Ezabatu..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Garbitu txostenak..." #: user_admin_delete_user msgid "Delete user" msgstr "Ezabatu erabiltzailea" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Eragiketa honek erabiltzaile hau eta bere txostenak datu-basetik ezabatuko " "ditu." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Ezabatu erabiltzaile-txostena" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Eragiketa honek adierazitako denbora-tartean erabiltzaile honek egindako " "jardueren txostenak ezabatuko ditu." #: success msgid "Operation successful" msgstr "Eragiketa ondo burutu da" #: bad_data msgid "Bad data!" msgstr "Datuak ez dira zuzenak!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Konexio arteko denbora-tartea (segundutan)\\:" #: jclic_reports msgid "JClic reports" msgstr "JClic txostenak" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "B" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "E" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Pasahitza\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Konfirmatu pasahitza\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Pasahitzak ez datoz bat\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_fr.po000066400000000000000000000270721335566474600252500ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2015-11-29 22:16+0000\n" "Last-Translator: Jean-Marc \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Mot de passe\\:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Vous devez donner un mot de passe valide pour accéder à la base de rapports." #: login_title msgid "Login" msgstr "Login" #: submit msgid "Submit..." msgstr "Soumettre..." #: login_incorrect msgid "Incorrect password!" msgstr "Mot de passe incorrect\\!" #: main_title msgid "Main menu" msgstr "Menu principal" #: users_admin_title msgid "Users and groups admin" msgstr "Administrateur d'utilisateurs et de groupes" #: group_report_title msgid "Group reports" msgstr "Rapports de groupe" #: user_report_title msgid "User reports" msgstr "Rapports utilisateur" #: act_report_title msgid "Activity reports" msgstr "Rapports d'activités" #: db_admin_title msgid "Database admin" msgstr "Administrateur de la base de données" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Impossible de définir les valeurs de la nouvelle base de données\\!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Autoriser les utilisateurs à créer de nouveaux groupes" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Autoriser les utilisateurs à créer de nouveaux utilisateurs" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Sélectionner un groupe dans une liste" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Sélectionner un nom d'utilisateur dans une liste" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "La base de données contient des tables d'utilisateurs et de groupes" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Editer les paramètres..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Définir le mot de passe..." #: title msgid "Title" msgstr "Titre" #: db_admin_edit_title msgid "Edit database settings" msgstr "Editer les paramètres de la base de données" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Changer le mot de passe système" #: db_admin_pw_newPwd msgid "New password" msgstr "Nouveau mot de passe" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Retapez le mot de passe" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Les champs mot de passe ne doivent pas rester vides" #: report_group msgid "Group:" msgstr "Groupe :" #: report_user msgid "User:" msgstr "Utilisateur\\:" #: report_project msgid "Project:" msgstr "Projet\\:" #: report_all_projects msgid "All projects" msgstr "Tous les projets" #: report_key msgid "Key:" msgstr "Clé\\:" #: report_code msgid "Code:" msgstr "Code\\:" #: report_context msgid "Context:" msgstr "Contexte\\:" #: report_from msgid "From:" msgstr "DE\\:" #: month_1 msgid "january" msgstr "janvier" #: month_2 msgid "february" msgstr "février" #: month_3 msgid "march" msgstr "mars" #: month_4 msgid "april" msgstr "avril" #: month_5 msgid "may" msgstr "mai" #: month_6 msgid "june" msgstr "juin" #: month_7 msgid "july" msgstr "juillet" #: month_8 msgid "august" msgstr "août" #: month_9 msgid "september" msgstr "septembre" #: month_10 msgid "october" msgstr "octobre" #: month_11 msgid "november" msgstr "novembre" #: month_12 msgid "december" msgstr "décembre" #: report_to msgid "To:" msgstr "A\\:" #: report_global_precision msgid "Global precision" msgstr "Précision globale" #: report_solved_activities msgid "Solved activities" msgstr "Activités résolues" #: report_user_evolution msgid "User evolution" msgstr "Evolution de l'utilisateur" #: report_group_evolution msgid "Group evolution" msgstr "Evolution du groupe" #: report_project_evolution msgid "Project evolution" msgstr "Evolution du projet" #: report_result_distribution msgid "Result distribution" msgstr "Distribution du résultat" #: report_no_data msgid "NO DATA" msgstr "PAS DE DONNÉES" #: report_users msgid "Users:" msgstr "Utilisateurs\\:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sessions\\:" #: report_projects msgid "Projects:" msgstr "Projets\\:" #: report_actDone msgid "Activities done:" msgstr "Activités faites\\:" #: report_actSolved msgid "Activities solved:" msgstr "Activités résolues\\:" #: report_totalTime msgid "Total time:" msgstr "Temps total\\:" #: report_globalPrec msgid "Global score:" msgstr "Score global\\:" #: report_globalSummary msgid "Global summary" msgstr "Sommaire général" #: report_header_date msgid "date" msgstr "date" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sessions\\:" #: report_header_user msgid "user" msgstr "utilisateur" #: report_header_project msgid "project" msgstr "projet" #: report_header_numActs msgid "activities" msgstr "activités" #: report_header_actsSolved msgid "acts. solved" msgstr "acts. résolues" #: report_header_time msgid "time" msgstr "temps" #: report_header_prec msgid "score" msgstr "score" #: report_session_detail_show msgid "show session details" msgstr "Montrer les détails de session" #: report_session_detail_title msgid "Activities done in session" msgstr "Activités faites pendant la session" #: report_header_activity msgid "activity" msgstr "activité" #: report_header_actions msgid "actions" msgstr "actions" #: report_header_score msgid "corrects" msgstr "correctes" #: report_header_solved msgid "ok" msgstr "ok" #: Y msgctxt "Y" msgid "Y" msgstr "O" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "Cacher les détails de session" #: report_header_sessions msgid "sessions" msgstr "sessions" #: report_all_activities msgid "All activities" msgstr "Toutes les activités" #: report_activity msgid "Activity:" msgstr "Activité\\:" #: report_many msgid "several" msgstr "plusieurs" #: report_n_users msgid "users" msgstr "utilisateurs" #: group_admin_title msgid "Groups administration" msgstr "Administration des groupes" #: group_admin_new_button msgid "New group..." msgstr "Nouveau groupe..." #: group_admin_groups msgid "Groups" msgstr "Groupes" #: report_actions msgid "Actions" msgstr "Actions" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Editer..." #: user_admin_title msgid "User admin" msgstr "Utilisateur admin" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Supprimer..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Effacer rapports..." #: group_admin_properties msgid "Group properties" msgstr "Groupe propriétés" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nom :" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identifiant :" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Icône\\:" #: error msgid "ERROR" msgstr "ERREUR" #: return msgid "return..." msgstr "retour..." #: group_admin_users msgid "Users" msgstr "Utilisateurs" #: group_admin_no_users msgid "This group has no users." msgstr "Ce groupe n'a pas d'utilisateurs." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Créer un nouvel utilisateur..." #: cancel msgid "Cancel" msgstr "Annuler" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Nom de groupe incorrect\\!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "L'identifiant de groupe est incorrect\\!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "" "Il y a un autre groupe avec le même identifiant dans la base de données\\!" #: group_admin_delete_group msgid "Delete group" msgstr "Supprimer le groupe" #: report_areyousure msgid "Are you sure?" msgstr "Etes-vous sûr ?" #: YES msgid "Yes" msgstr "Oui" #: NOT msgid "Not" msgstr "Non" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Cette opération effacera aussi dans la base de données tous les utilisateurs " "de ce groupe. Toutes les données de ces utilisateurs seront perdues." #: db_error msgid "Unable to complete the task." msgstr "Impossible de terminer la tâche." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Effacer les données du rapport du groupe" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Cette opération effacera tous les rapports d'activités faites par les " "membres de ce groupe entre deux dates spécifiées." #: db_clear_reports_date msgid "Clear report data" msgstr "Effacer les données du rapport." #: user_admin_invalid_name msgid "Invalid user name." msgstr "Nom d'utilisateur invalide." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Identifiant utilisateur invalide" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "" "Il y a un autre utilisateur avec le même identifiant dans la base de " "données\\!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "L'utilisateur a été supprimé de la base de données." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identifiant\\:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nom :" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Icône :" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Éditer..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Supprimer..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Effacer les rapports..." #: user_admin_delete_user msgid "Delete user" msgstr "Supprimer l'utilisateur" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Cette opération supprimera cet utilisateur et ses rapports de la base de " "données." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Effacer les données du rapport de l'utilisateur" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Cette opération effacera tous les rapports d'activités faites par cet " "utilisateur entre des dates spécifiées." #: success msgid "Operation successful" msgstr "Opération réussie" #: bad_data msgid "Bad data!" msgstr "Mauvaise donnée\\!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Temps entre les connections (secondes)\\:" #: jclic_reports msgid "JClic reports" msgstr "JClic rapports" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "O" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Mot de passe\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Confirmer mot de passe\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Les mots de passe ne coincident pas\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_gl.po000066400000000000000000000267011335566474600252410ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-12-21 19:28+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Contrasinal:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "É imprescindíbel escribir un contrasinal correcto para acceder á base de " "datos de informes." #: login_title msgid "Login" msgstr "Conexión á base de datos" #: submit msgid "Submit..." msgstr "Enviar datos..." #: login_incorrect msgid "Incorrect password!" msgstr "Contrasinal incorrecto!" #: main_title msgid "Main menu" msgstr "Menú principal" #: users_admin_title msgid "Users and groups admin" msgstr "Administración de grupos e usuarios" #: group_report_title msgid "Group reports" msgstr "Informes de grupo" #: user_report_title msgid "User reports" msgstr "Informes de usuario/a" #: act_report_title msgid "Activity reports" msgstr "Informes de actividade" #: db_admin_title msgid "Database admin" msgstr "Administración da base de datos" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Non é posíbel mudar os valores na base de datos!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Permitir aos usuarios crear novos grupos" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Permitir aos usuarios crear novos usuarios" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Seleccionar grupo nunha lista" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Seleccionar nome de usuario/a nunha lista" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "A base de datos contén táboas de usuarios e grupos" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Editar propiedades..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Estabelecer o contrasinal..." #: title msgid "Title" msgstr "Título" #: db_admin_edit_title msgid "Edit database settings" msgstr "Editar as propiedades da base de datos" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Cambiar o contrasinal do sistema" #: db_admin_pw_newPwd msgid "New password" msgstr "Novo contrasinal" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Escribir de novo o contrasinal" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Os dous contrasinais non coinciden!" #: report_group msgid "Group:" msgstr "Grupo:" #: report_user msgid "User:" msgstr "Usuario:" #: report_project msgid "Project:" msgstr "Proxecto:" #: report_all_projects msgid "All projects" msgstr "Todos os proxectos" #: report_key msgid "Key:" msgstr "Chave:" #: report_code msgid "Code:" msgstr "Código:" #: report_context msgid "Context:" msgstr "Contexto:" #: report_from msgid "From:" msgstr "Desde:" #: month_1 msgid "january" msgstr "xaneiro" #: month_2 msgid "february" msgstr "febreiro" #: month_3 msgid "march" msgstr "marzo" #: month_4 msgid "april" msgstr "abril" #: month_5 msgid "may" msgstr "maio" #: month_6 msgid "june" msgstr "xuño" #: month_7 msgid "july" msgstr "xullo" #: month_8 msgid "august" msgstr "agosto" #: month_9 msgid "september" msgstr "setembro" #: month_10 msgid "october" msgstr "outubro" #: month_11 msgid "november" msgstr "novembro" #: month_12 msgid "december" msgstr "decembro" #: report_to msgid "To:" msgstr "Ata:" #: report_global_precision msgid "Global precision" msgstr "Precisión global" #: report_solved_activities msgid "Solved activities" msgstr "Actividades resoltas:" #: report_user_evolution msgid "User evolution" msgstr "Evolución do usuario" #: report_group_evolution msgid "Group evolution" msgstr "Evolución do grupo" #: report_project_evolution msgid "Project evolution" msgstr "Evolución do proxecto" #: report_result_distribution msgid "Result distribution" msgstr "Distribución de resultados" #: report_no_data msgid "NO DATA" msgstr "SEN DATOS" #: report_users msgid "Users:" msgstr "Usuarios:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sesións:" #: report_projects msgid "Projects:" msgstr "Proxectos:" #: report_actDone msgid "Activities done:" msgstr "Actividades feitas:" #: report_actSolved msgid "Activities solved:" msgstr "Actividades resoltas:" #: report_totalTime msgid "Total time:" msgstr "Tempo total:" #: report_globalPrec msgid "Global score:" msgstr "Puntuación global:" #: report_globalSummary msgid "Global summary" msgstr "Resumo global" #: report_header_date msgid "date" msgstr "data" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sesións:" #: report_header_user msgid "user" msgstr "usuario" #: report_header_project msgid "project" msgstr "proxecto" #: report_header_numActs msgid "activities" msgstr "actividades" #: report_header_actsSolved msgid "acts. solved" msgstr "acts. resoltas" #: report_header_time msgid "time" msgstr "tempo" #: report_header_prec msgid "score" msgstr "puntuación" #: report_session_detail_show msgid "show session details" msgstr "mostrar detalles da sesión" #: report_session_detail_title msgid "Activities done in session" msgstr "Actividades feitas na sesión" #: report_header_activity msgid "activity" msgstr "actividade" #: report_header_actions msgid "actions" msgstr "accións" #: report_header_score msgid "corrects" msgstr "acertos" #: report_header_solved msgid "ok" msgstr "ben" #: Y msgctxt "Y" msgid "Y" msgstr "S" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "agochar detalles da sesión" #: report_header_sessions msgid "sessions" msgstr "sesións" #: report_all_activities msgid "All activities" msgstr "Todas as actividades" #: report_activity msgid "Activity:" msgstr "Actividade:" #: report_many msgid "several" msgstr "diversos" #: report_n_users msgid "users" msgstr "usuarios" #: group_admin_title msgid "Groups administration" msgstr "Administración de grupos" #: group_admin_new_button msgid "New group..." msgstr "Novo grupo..." #: group_admin_groups msgid "Groups" msgstr "Grupos" #: report_actions msgid "Actions" msgstr "Accións" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Modificar..." #: user_admin_title msgid "User admin" msgstr "Administración de usuarios" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Eliminar..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Eliminar informes..." #: group_admin_properties msgid "Group properties" msgstr "Propiedades do grupo" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nome:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identificador:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Icona:" #: error msgid "ERROR" msgstr "ERRO" #: return msgid "return..." msgstr "volver..." #: group_admin_users msgid "Users" msgstr "Usuarios" #: group_admin_no_users msgid "This group has no users." msgstr "Este grupo non ten usuarios." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Crear un novo usuario..." #: cancel msgid "Cancel" msgstr "Cancelar" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Nome de grupo incorrecto!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Identificador de grupo incorrecto!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Existe outro grupo co mesmo identificador na base de datos!" #: group_admin_delete_group msgid "Delete group" msgstr "Eliminar o grupo" #: report_areyousure msgid "Are you sure?" msgstr "Tes a seguridade de realizar esta operación?" #: YES msgid "Yes" msgstr "Si" #: NOT msgid "Not" msgstr "Non" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Esta operación tamén eliminará da base de datos todos os usuarios deste " "grupo. Perderanse todos os seus datos." #: db_error msgid "Unable to complete the task." msgstr "Non é posíbel completar a operación." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Eliminar os informes do grupo" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Esta operación eliminará os informes de actividade de todos os membros deste " "grupo entre as datas especificadas." #: db_clear_reports_date msgid "Clear report data" msgstr "Eliminar os informes" #: user_admin_invalid_name msgid "Invalid user name." msgstr "O nome de usuario/a é incorrecto." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "O identificador de usuario/a é incorrecto!" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "" "Hai outro/a usuario/a co mesmo identificador na base de datos! Os nomes " "poden repetirse (en grupos distintos) pero os identificadores deben ser " "únicos." #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "O/a usuario/a foi eliminado/a axeitadamente da base de datos." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identificador:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nome:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Icona:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Modificar..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Eliminar..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Eliminar informes..." #: user_admin_delete_user msgid "Delete user" msgstr "Eliminar o/a usuario/a" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Esta operación eliminará o/a usuario/a e os seus informes da base de datos" #: user_admin_clear_user msgid "Clear report data of user" msgstr "Eliminar os informes do usuario/a" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Esta operación eliminará os informes de actividades realizadas por este/a " "usuario/a entre as datas especificadas." #: success msgid "Operation successful" msgstr "Operación realizada con éxito" #: bad_data msgid "Bad data!" msgstr "Datos incorrectos!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Tempo en segundos entre conexións:" #: jclic_reports msgid "JClic reports" msgstr "Informes JClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "S" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Sinal\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Confirmar contrasinal\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Os contrasinais non coinciden\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_it.po000066400000000000000000000264471335566474600252620ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-22 16:58+0000\n" "Last-Translator: giomu2 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Password:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Devi inserire una password valida per accedere al database dei rapporti." #: login_title msgid "Login" msgstr "Login" #: submit msgid "Submit..." msgstr "Presenta..." #: login_incorrect msgid "Incorrect password!" msgstr "Password errata!" #: main_title msgid "Main menu" msgstr "Menu principale" #: users_admin_title msgid "Users and groups admin" msgstr "Amministratore degli utenti e dei gruppi" #: group_report_title msgid "Group reports" msgstr "Rapporti del gruppo" #: user_report_title msgid "User reports" msgstr "Rapporti utente" #: act_report_title msgid "Activity reports" msgstr "Rapporti d'attività" #: db_admin_title msgid "Database admin" msgstr "Amministratore del database" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Impossibile definire i valori del nuovo database!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Permetti agli utenti di creare nuovi gruppi" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Permetti agli utenti di creare nuovi utenti" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Seleziona un gruppo in una lista" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Seleziona un nome utente in una lista" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Il database contiene tabelle di utenti e gruppi" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Modifica i parametri..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Imposta la password..." #: title msgid "Title" msgstr "Titolo" #: db_admin_edit_title msgid "Edit database settings" msgstr "Modifica la configurazione del database" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Cambia la password di sistema" #: db_admin_pw_newPwd msgid "New password" msgstr "Nuova password" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Riscrivi la password" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Le password non coincidono" #: report_group msgid "Group:" msgstr "Gruppo:" #: report_user msgid "User:" msgstr "Utente:" #: report_project msgid "Project:" msgstr "Progetto:" #: report_all_projects msgid "All projects" msgstr "Tutti i progetti" #: report_key msgid "Key:" msgstr "Chiave:" #: report_code msgid "Code:" msgstr "Codice:" #: report_context msgid "Context:" msgstr "Contesto:" #: report_from msgid "From:" msgstr "Da:" #: month_1 msgid "january" msgstr "gennaio" #: month_2 msgid "february" msgstr "febbraio" #: month_3 msgid "march" msgstr "marzo" #: month_4 msgid "april" msgstr "aprile" #: month_5 msgid "may" msgstr "maggio" #: month_6 msgid "june" msgstr "giugno" #: month_7 msgid "july" msgstr "luglio" #: month_8 msgid "august" msgstr "agosto" #: month_9 msgid "september" msgstr "settembre" #: month_10 msgid "october" msgstr "ottobre" #: month_11 msgid "november" msgstr "novembre" #: month_12 msgid "december" msgstr "dicembre" #: report_to msgid "To:" msgstr "A:" #: report_global_precision msgid "Global precision" msgstr "Precisione globale" #: report_solved_activities msgid "Solved activities" msgstr "Attività risolte" #: report_user_evolution msgid "User evolution" msgstr "Progressi dell'utente" #: report_group_evolution msgid "Group evolution" msgstr "Progressi del gruppo" #: report_project_evolution msgid "Project evolution" msgstr "Evoluzione del progetto" #: report_result_distribution msgid "Result distribution" msgstr "Distribuzione dei risultati" #: report_no_data msgid "NO DATA" msgstr "NESSUN DATO" #: report_users msgid "Users:" msgstr "Utenti:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sessioni:" #: report_projects msgid "Projects:" msgstr "Progetti:" #: report_actDone msgid "Activities done:" msgstr "Attività eseguite:" #: report_actSolved msgid "Activities solved:" msgstr "Attività risolte:" #: report_totalTime msgid "Total time:" msgstr "Tempo totale:" #: report_globalPrec msgid "Global score:" msgstr "Punteggio globale:" #: report_globalSummary msgid "Global summary" msgstr "Riassunto globale" #: report_header_date msgid "date" msgstr "data" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sessioni:" #: report_header_user msgid "user" msgstr "utente" #: report_header_project msgid "project" msgstr "progetto" #: report_header_numActs msgid "activities" msgstr "attività" #: report_header_actsSolved msgid "acts. solved" msgstr "att. risolte" #: report_header_time msgid "time" msgstr "tempo" #: report_header_prec msgid "score" msgstr "punteggio" #: report_session_detail_show msgid "show session details" msgstr "mostra i dettagli della sessione" #: report_session_detail_title msgid "Activities done in session" msgstr "Attività eseguite nella sessione" #: report_header_activity msgid "activity" msgstr "attività" #: report_header_actions msgid "actions" msgstr "azioni" #: report_header_score msgid "corrects" msgstr "corretti" #: report_header_solved msgid "ok" msgstr "ok" #: Y msgctxt "Y" msgid "Y" msgstr "S" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "nascondi dettagli sessione" #: report_header_sessions msgid "sessions" msgstr "sessioni" #: report_all_activities msgid "All activities" msgstr "Tutte le attività" #: report_activity msgid "Activity:" msgstr "Attività:" #: report_many msgid "several" msgstr "diversi" #: report_n_users msgid "users" msgstr "utenti" #: group_admin_title msgid "Groups administration" msgstr "Amministrazione gruppi" #: group_admin_new_button msgid "New group..." msgstr "Nuovo gruppo..." #: group_admin_groups msgid "Groups" msgstr "Gruppi" #: report_actions msgid "Actions" msgstr "Azioni" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Modifica..." #: user_admin_title msgid "User admin" msgstr "Amministratore degli utenti" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Elimina..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Elimina rapporti" #: group_admin_properties msgid "Group properties" msgstr "Proprietà del gruppo" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nome:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Id." #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Icona:" #: error msgid "ERROR" msgstr "ERRORE" #: return msgid "return..." msgstr "indietro..." #: group_admin_users msgid "Users" msgstr "Utenti" #: group_admin_no_users msgid "This group has no users." msgstr "Questo gruppo non ha utenti." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Crea un nuovo utente..." #: cancel msgid "Cancel" msgstr "Annulla" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Nome del gruppo errato!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "L'id del gruppo è errato!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Nel database c'è un altro gruppo con lo stesso id!" #: group_admin_delete_group msgid "Delete group" msgstr "Elimina gruppo" #: report_areyousure msgid "Are you sure?" msgstr "Sei sicuro?" #: YES msgid "Yes" msgstr "Sì" #: NOT msgid "Not" msgstr "No" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Questa operazione eliminerà anche tutti gli utenti del gruppo nel database. " "Andranno persi tutti i dati di questi utenti." #: db_error msgid "Unable to complete the task." msgstr "Impossibile completare l'operazione." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Elimina i rapporti del gruppo" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Questa operazione cancellerà tutti i rapporti sule attività eseguite dagli " "utenti di questo gruppo tra le date specificate." #: db_clear_reports_date msgid "Clear report data" msgstr "Elimina i rapporti" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Nome utente non valido." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "User id non valido" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "Nel database c'è già un altro utente con lo stesso id!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "L'utente è stato cancellato con successo dal database." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Id." #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nome:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Icona:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Modifica..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Elimina..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Elimina rapporti..." #: user_admin_delete_user msgid "Delete user" msgstr "Elimina l'utente" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Questa operazione cancellerà l'utente e i suoi rapporti dal database." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Elimina i rapporti dell'utente" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Questa operazione cancellerà tutti i rapporti sule attività eseguite " "dall'utente tra le date specificate." #: success msgid "Operation successful" msgstr "L'operazione ha avuto successo" #: bad_data msgid "Bad data!" msgstr "Dati non corretti!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Tempo tra le connessioni (secondi)\\:" #: jclic_reports msgid "JClic reports" msgstr "Rapporti JClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "S" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Password\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Conferma password\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Le password non coincidono\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_nl.po000066400000000000000000000265751335566474600252610ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-08-10 21:18+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Wachtwoord:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Je dient een geldig wachtwoord in te voeren om toegang te krijgen tot de " "rapporten database." #: login_title msgid "Login" msgstr "Aanmelden" #: submit msgid "Submit..." msgstr "Verzenden..." #: login_incorrect msgid "Incorrect password!" msgstr "Verkeer paswoord!" #: main_title msgid "Main menu" msgstr "Hoofdmenu" #: users_admin_title msgid "Users and groups admin" msgstr "Gebruikers en groepen admin" #: group_report_title msgid "Group reports" msgstr "Groep rapporten" #: user_report_title msgid "User reports" msgstr "Gebruikers rapport" #: act_report_title msgid "Activity reports" msgstr "Activiteiten rapporten" #: db_admin_title msgid "Database admin" msgstr "Database admin" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Nieuwe database waarden kunnen niet ingevoerd worden!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Laat gebruikers nieuwe groepen maken" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Laat gebruikers nieuwe gebruikers maken" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Kies groep in een lijst" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Kies gebruikersnaam in een lijst" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Database heeft tabellen met gebruikers en groepen" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Bewerk instellingen..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Wachtwoord instellen..." #: title msgid "Title" msgstr "Titel" #: db_admin_edit_title msgid "Edit database settings" msgstr "Database instellingen bewerken" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Verander systeem wachtwoord" #: db_admin_pw_newPwd msgid "New password" msgstr "Nieuw wachtwoord" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Wachtwoord opnieuw invoeren" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Wachtwoorden komen niet overeen!" #: report_group msgid "Group:" msgstr "Groep:" #: report_user msgid "User:" msgstr "Gebruiker:" #: report_project msgid "Project:" msgstr "Project:" #: report_all_projects msgid "All projects" msgstr "Alle projecten" #: report_key msgid "Key:" msgstr "Sleutel:" #: report_code msgid "Code:" msgstr "Code:" #: report_context msgid "Context:" msgstr "Inhoud:" #: report_from msgid "From:" msgstr "Van:" #: month_1 msgid "january" msgstr "januari" #: month_2 msgid "february" msgstr "februari" #: month_3 msgid "march" msgstr "maart" #: month_4 msgid "april" msgstr "april" #: month_5 msgid "may" msgstr "mei" #: month_6 msgid "june" msgstr "juni" #: month_7 msgid "july" msgstr "juli" #: month_8 msgid "august" msgstr "augustus" #: month_9 msgid "september" msgstr "september" #: month_10 msgid "october" msgstr "oktober" #: month_11 msgid "november" msgstr "november" #: month_12 msgid "december" msgstr "december" #: report_to msgid "To:" msgstr "Tot:" #: report_global_precision msgid "Global precision" msgstr "Totale nauwkeurigheid" #: report_solved_activities msgid "Solved activities" msgstr "Opgeloste activiteiten" #: report_user_evolution msgid "User evolution" msgstr "Vooruitgang gebruiker" #: report_group_evolution msgid "Group evolution" msgstr "Vooruitgang groep" #: report_project_evolution msgid "Project evolution" msgstr "Vooruitgang project" #: report_result_distribution msgid "Result distribution" msgstr "Resultaat verdeling" #: report_no_data msgid "NO DATA" msgstr "GEEN GEGEVENS" #: report_users msgid "Users:" msgstr "Gebruikers:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Reeksen:" #: report_projects msgid "Projects:" msgstr "Projecten:" #: report_actDone msgid "Activities done:" msgstr "Activiteiten klaar:" #: report_actSolved msgid "Activities solved:" msgstr "Activiteiten opgelost:" #: report_totalTime msgid "Total time:" msgstr "Totale tijd:" #: report_globalPrec msgid "Global score:" msgstr "Puntentotaal:" #: report_globalSummary msgid "Global summary" msgstr "Samenvatting overzicht" #: report_header_date msgid "date" msgstr "datum" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Reeksen:" #: report_header_user msgid "user" msgstr "gebruiker" #: report_header_project msgid "project" msgstr "project" #: report_header_numActs msgid "activities" msgstr "activiteiten" #: report_header_actsSolved msgid "acts. solved" msgstr "opgeloste activiteiten" #: report_header_time msgid "time" msgstr "tijd" #: report_header_prec msgid "score" msgstr "punten" #: report_session_detail_show msgid "show session details" msgstr "toon details reeks" #: report_session_detail_title msgid "Activities done in session" msgstr "activiteiten gedaan in reeks" #: report_header_activity msgid "activity" msgstr "activiteit" #: report_header_actions msgid "actions" msgstr "acties" #: report_header_score msgid "corrects" msgstr "juist" #: report_header_solved msgid "ok" msgstr "ok" #: Y msgctxt "Y" msgid "Y" msgstr "J" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "verberg details" #: report_header_sessions msgid "sessions" msgstr "reeksen" #: report_all_activities msgid "All activities" msgstr "Alle activiteiten" #: report_activity msgid "Activity:" msgstr "Activiteit:" #: report_many msgid "several" msgstr "verschillende" #: report_n_users msgid "users" msgstr "gebruikers" #: group_admin_title msgid "Groups administration" msgstr "Groepen administratie" #: group_admin_new_button msgid "New group..." msgstr "Nieuwe groep..." #: group_admin_groups msgid "Groups" msgstr "Groepen" #: report_actions msgid "Actions" msgstr "Acties" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Bewerken..." #: user_admin_title msgid "User admin" msgstr "Gebruikers administratie" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Verwijder..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Rapporten wissen..." #: group_admin_properties msgid "Group properties" msgstr "Groepseigenschappen" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Naam:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identificatie:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Pictogram:" #: error msgid "ERROR" msgstr "FOUT" #: return msgid "return..." msgstr "verder..." #: group_admin_users msgid "Users" msgstr "Gebruikers" #: group_admin_no_users msgid "This group has no users." msgstr "Deze groep heeft geen gebruikers" #: group_admin_create_user_button msgid "Create a new user..." msgstr "Maak nieuwe gebruiker..." #: cancel msgid "Cancel" msgstr "Annuleren" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Verkeerde groepsnaam!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Verkeerde groepsidentificatie!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Er is een andere groep met dezelfde identificatie in de database!" #: group_admin_delete_group msgid "Delete group" msgstr "Groep verwijderen" #: report_areyousure msgid "Are you sure?" msgstr "Weet u het zeker?" #: YES msgid "Yes" msgstr "Ja" #: NOT msgid "Not" msgstr "Nee" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Deze bewerking zal ook alle gebruikers van deze groep verwijderen. Alle " "gegevens zullen verloren gaan." #: db_error msgid "Unable to complete the task." msgstr "Kan de opdracht niet afwerken." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Rapport gegevens van de groep leeg maken" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Deze operatie zal alle rapporten van de activiteiten van leden tussen de " "twee opgegeven datums van deze groep verwijderen" #: db_clear_reports_date msgid "Clear report data" msgstr "Rapport gegevens verwijderen" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Ongeldige gebruikers naam." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Ongeldige gebruiker identificatie" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "" "Er is een andere gebruiker met dezelfde identificatie in de database!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "De gebruiker is verwijderd uit de database." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identificatie:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Naam:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Pictogram:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Bewerken..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Verwijder..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Rapporten wissen..." #: user_admin_delete_user msgid "Delete user" msgstr "Gebruiker verwijderen" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Deze bewerking zal de gebruiker en zijn rapporten verwijderen uit deze " "database." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Verwijder rapport gegevens van gebruiker" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Deze bewerking zal alle rapporten van de activiteiten van deze gebruiker " "tussen de opgegeven datums verwijderen." #: success msgid "Operation successful" msgstr "Geslaagde bewerking" #: bad_data msgid "Bad data!" msgstr "Verkeerde gegevens!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Tijd tussen verbindingen (in seconden)\\:" #: jclic_reports msgid "JClic reports" msgstr "JClic rapporten" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "J" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Wachtwoord\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Bevestig wachtwoord\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Wachtwoorden komen niet overeen\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_pt.po000066400000000000000000000270251335566474600252620ustar00rootroot00000000000000# Portuguese translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-12-17 22:45+0000\n" "Last-Translator: José Borges Ferreira (underspell) \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Palavra-chave:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "É necessário fornecer uma palavra-chave para ter acesso à base de dados de " "relatórios" #: login_title msgid "Login" msgstr "Utilizador" #: submit msgid "Submit..." msgstr "Enviar..." #: login_incorrect msgid "Incorrect password!" msgstr "Palavra-chave incorreta" #: main_title msgid "Main menu" msgstr "Menu principal" #: users_admin_title msgid "Users and groups admin" msgstr "Utilizadores e grupos admin" #: group_report_title msgid "Group reports" msgstr "Relatórios do grupo" #: user_report_title msgid "User reports" msgstr "Relatórios do utilizador" #: act_report_title msgid "Activity reports" msgstr "Relatórios de actividades" #: db_admin_title msgid "Database admin" msgstr "Base de dados admin" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Não foi possível definir os valores da nova base de dados!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Permitir que os utilizadores criem novos grupos" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Permitir que os utilizadores criem novos utilizadores" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Selecione o grupo numa lista" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Escolha o nome de utilizador numa lista" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Base de dados possui tabelas de utilizadores e grupos" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Edtiar configurações..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Definir palavra-chave..." #: title msgid "Title" msgstr "Título" #: db_admin_edit_title msgid "Edit database settings" msgstr "Editar configurações da base de dados" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Alterar palavra-chave do sistema" #: db_admin_pw_newPwd msgid "New password" msgstr "Nova palavra-chave" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Confirme a palavra-chave" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "As palavras-chave são diferentes!" #: report_group msgid "Group:" msgstr "Grupo:" #: report_user msgid "User:" msgstr "Utilizador:" #: report_project msgid "Project:" msgstr "Projecto:" #: report_all_projects msgid "All projects" msgstr "Todos os projectos" #: report_key msgid "Key:" msgstr "Chave:" #: report_code msgid "Code:" msgstr "Código:" #: report_context msgid "Context:" msgstr "Contexto:" #: report_from msgid "From:" msgstr "De:" #: month_1 msgid "january" msgstr "Janeiro" #: month_2 msgid "february" msgstr "Fevereiro" #: month_3 msgid "march" msgstr "Março" #: month_4 msgid "april" msgstr "Abril" #: month_5 msgid "may" msgstr "Maio" #: month_6 msgid "june" msgstr "Junho" #: month_7 msgid "july" msgstr "Julho" #: month_8 msgid "august" msgstr "Agosto" #: month_9 msgid "september" msgstr "Setembro" #: month_10 msgid "october" msgstr "Outubro" #: month_11 msgid "november" msgstr "Novembro" #: month_12 msgid "december" msgstr "Dezembro" #: report_to msgid "To:" msgstr "Até:" #: report_global_precision msgid "Global precision" msgstr "Precisão global" #: report_solved_activities msgid "Solved activities" msgstr "Actividades resolvidas" #: report_user_evolution msgid "User evolution" msgstr "Progresso do utilizador" #: report_group_evolution msgid "Group evolution" msgstr "Progresso do grupo" #: report_project_evolution msgid "Project evolution" msgstr "Progresso do projeto" #: report_result_distribution msgid "Result distribution" msgstr "Distribuição do resultado" #: report_no_data msgid "NO DATA" msgstr "SEM DADOS" #: report_users msgid "Users:" msgstr "Utilizadores:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sessões:" #: report_projects msgid "Projects:" msgstr "Projectos:" #: report_actDone msgid "Activities done:" msgstr "Actividades realizadas:" #: report_actSolved msgid "Activities solved:" msgstr "Actividades resolvidas:" #: report_totalTime msgid "Total time:" msgstr "Duração total:" #: report_globalPrec msgid "Global score:" msgstr "Pontuação global:" #: report_globalSummary msgid "Global summary" msgstr "Resumo global" #: report_header_date msgid "date" msgstr "data" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sessões:" #: report_header_user msgid "user" msgstr "Utilizador" #: report_header_project msgid "project" msgstr "projecto" #: report_header_numActs msgid "activities" msgstr "actividades" #: report_header_actsSolved msgid "acts. solved" msgstr "resolvidas" #: report_header_time msgid "time" msgstr "tempo" #: report_header_prec msgid "score" msgstr "acertos" #: report_session_detail_show msgid "show session details" msgstr "mostrar pormenores da sessão" #: report_session_detail_title msgid "Activities done in session" msgstr "Actividades concluídas na sessão" #: report_header_activity msgid "activity" msgstr "actividade" #: report_header_actions msgid "actions" msgstr "acções" #: report_header_score msgid "corrects" msgstr "correctas" #: report_header_solved msgid "ok" msgstr "ok" #: Y msgctxt "Y" msgid "Y" msgstr "S" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "Ocultar pomenores da sessão" #: report_header_sessions msgid "sessions" msgstr "sessões" #: report_all_activities msgid "All activities" msgstr "Todas as actividades" #: report_activity msgid "Activity:" msgstr "Actividade:" #: report_many msgid "several" msgstr "vários" #: report_n_users msgid "users" msgstr "utilizadores" #: group_admin_title msgid "Groups administration" msgstr "Administração de grupos" #: group_admin_new_button msgid "New group..." msgstr "Novo grupo..." #: group_admin_groups msgid "Groups" msgstr "Grupos" #: report_actions msgid "Actions" msgstr "Acções" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Editar..." #: user_admin_title msgid "User admin" msgstr "Utilizador admin" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Eliminar..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Limpar relatórios..." #: group_admin_properties msgid "Group properties" msgstr "Propriedades de grupo" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nome:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identificador:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Ícone:" #: error msgid "ERROR" msgstr "ERRO" #: return msgid "return..." msgstr "voltar..." #: group_admin_users msgid "Users" msgstr "Utilizadores" #: group_admin_no_users msgid "This group has no users." msgstr "Este grupo não possui utilizadores" #: group_admin_create_user_button msgid "Create a new user..." msgstr "Criar um novo utilizador..." #: cancel msgid "Cancel" msgstr "Cancelar" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Nome de grupo incorrecto!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Identificador de grupo incorrecto!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Há outro grupo com o mesmo identificador na base de dados!" #: group_admin_delete_group msgid "Delete group" msgstr "Eliminar grupo" #: report_areyousure msgid "Are you sure?" msgstr "Tem a certeza?" #: YES msgid "Yes" msgstr "Sim" #: NOT msgid "Not" msgstr "Não" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Esta operação também excluirá da base de dados todos os utilizadores do " "grupo. Todos os dados desses utilizadores serão perdidos." #: db_error msgid "Unable to complete the task." msgstr "Impossível concluir a tarefa." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Limpar dados dos relatórios do grupo" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Esta operação elimina todos os relatórios de actividades realizadas pelos " "membros do grupo entre as datas especificadas." #: db_clear_reports_date msgid "Clear report data" msgstr "Limpar dados de relatórios" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Nome de utilizador inválido." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Identificador de utilizador inválido" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "Há outro utilizador com o mesmo identificador na base de dados!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "O utilizador foi excluído com sucesso da base de dados." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identificador:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nome:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Ícone:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Editar..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Eliminar..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Limpar relatórios..." #: user_admin_delete_user msgid "Delete user" msgstr "Eliminar utilizador" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Esta operação elimina o utilizador e respectivos relatórios na base de dados." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Limpar os dados de relatórios do utilizador" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "Esta operação limpa todos os relatórios das actividades" #: success msgid "Operation successful" msgstr "Operação bem sucedida!" #: bad_data msgid "Bad data!" msgstr "Dados incorrectos!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Tempo entre conexões (segundos)\\:" #: jclic_reports msgid "JClic reports" msgstr "Relatórios jClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "S" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Palavra-chave\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Confirme palavra-chave\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Palavras-chave diferentes\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_pt_BR.po000066400000000000000000000267511335566474600256520ustar00rootroot00000000000000# Brazilian Portuguese translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-05-13 17:36+0000\n" "Last-Translator: Alexandre R Soares \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Senha :" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "É necessário que você forneça uma senha válida para poder acessar os " "relatórios no banco de dados." #: login_title msgid "Login" msgstr "Login" #: submit msgid "Submit..." msgstr "Enviar..." #: login_incorrect msgid "Incorrect password!" msgstr "Senha incorreta!" #: main_title msgid "Main menu" msgstr "Menu principal" #: users_admin_title msgid "Users and groups admin" msgstr "Administrador de usuários e grupos" #: group_report_title msgid "Group reports" msgstr "Relatórios de grupo" #: user_report_title msgid "User reports" msgstr "relatórios de usuário" #: act_report_title msgid "Activity reports" msgstr "Relatórios de atividades" #: db_admin_title msgid "Database admin" msgstr "Administrador de BD" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Não foi possível definir os novos valores do banco de dados!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Permitir que usuários criem novos grupos" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Permitir que usuários criem novos usuários" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Selecione grupo em uma lista" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Selecione nome de usuário em uma lista" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Banco de dados possui tabelas de usuários e grupos" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Editar preferências..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Definir senha..." #: title msgid "Title" msgstr "Título" #: db_admin_edit_title msgid "Edit database settings" msgstr "Editar configurações do banco de dados" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Alterar senha do sistema" #: db_admin_pw_newPwd msgid "New password" msgstr "Nova senha" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Confirme a senha" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "As senhas estão diferentes!" #: report_group msgid "Group:" msgstr "Grupo:" #: report_user msgid "User:" msgstr "Usuário:" #: report_project msgid "Project:" msgstr "Projeto:" #: report_all_projects msgid "All projects" msgstr "Todos os projetos" #: report_key msgid "Key:" msgstr "Chave:" #: report_code msgid "Code:" msgstr "Código:" #: report_context msgid "Context:" msgstr "Contexto:" #: report_from msgid "From:" msgstr "De:" #: month_1 msgid "january" msgstr "janeiro" #: month_2 msgid "february" msgstr "fevereiro" #: month_3 msgid "march" msgstr "março" #: month_4 msgid "april" msgstr "abril" #: month_5 msgid "may" msgstr "maio" #: month_6 msgid "june" msgstr "junho" #: month_7 msgid "july" msgstr "julho" #: month_8 msgid "august" msgstr "agosto" #: month_9 msgid "september" msgstr "setembro" #: month_10 msgid "october" msgstr "outubro" #: month_11 msgid "november" msgstr "novembro" #: month_12 msgid "december" msgstr "dezembro" #: report_to msgid "To:" msgstr "Para:" #: report_global_precision msgid "Global precision" msgstr "Precisão global" #: report_solved_activities msgid "Solved activities" msgstr "Atividades resolvidas" #: report_user_evolution msgid "User evolution" msgstr "Progresso do usuário" #: report_group_evolution msgid "Group evolution" msgstr "Progresso do grupo" #: report_project_evolution msgid "Project evolution" msgstr "Progresso do projeto" #: report_result_distribution msgid "Result distribution" msgstr "Distribuição do resultado" #: report_no_data msgid "NO DATA" msgstr "SEM DADOS" #: report_users msgid "Users:" msgstr "Usuários:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sessões:" #: report_projects msgid "Projects:" msgstr "Projetos:" #: report_actDone msgid "Activities done:" msgstr "Atividades realizadas:" #: report_actSolved msgid "Activities solved:" msgstr "Atividades resolvidas:" #: report_totalTime msgid "Total time:" msgstr "Tempo total:" #: report_globalPrec msgid "Global score:" msgstr "Pontuação geral:" #: report_globalSummary msgid "Global summary" msgstr "Resumo geral" #: report_header_date msgid "date" msgstr "Data" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sessões:" #: report_header_user msgid "user" msgstr "usuário" #: report_header_project msgid "project" msgstr "projeto" #: report_header_numActs msgid "activities" msgstr "atividades" #: report_header_actsSolved msgid "acts. solved" msgstr "ativ. feitas" #: report_header_time msgid "time" msgstr "tempo" #: report_header_prec msgid "score" msgstr "acertos" #: report_session_detail_show msgid "show session details" msgstr "mostrar detalhes da sessão" #: report_session_detail_title msgid "Activities done in session" msgstr "Atividades feitas na sessão" #: report_header_activity msgid "activity" msgstr "atividade" #: report_header_actions msgid "actions" msgstr "ações" #: report_header_score msgid "corrects" msgstr "corretas" #: report_header_solved msgid "ok" msgstr "ok" #: Y msgctxt "Y" msgid "Y" msgstr "S" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "ocultar detalhes da sessão" #: report_header_sessions msgid "sessions" msgstr "sessões" #: report_all_activities msgid "All activities" msgstr "Todas as atividades" #: report_activity msgid "Activity:" msgstr "Atividade:" #: report_many msgid "several" msgstr "vários" #: report_n_users msgid "users" msgstr "usuários" #: group_admin_title msgid "Groups administration" msgstr "Administração de grupos" #: group_admin_new_button msgid "New group..." msgstr "Novo grupo..." #: group_admin_groups msgid "Groups" msgstr "Grupos" #: report_actions msgid "Actions" msgstr "Ações" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Editar..." #: user_admin_title msgid "User admin" msgstr "Administrador de usuário" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Excluir..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Apagar registros..." #: group_admin_properties msgid "Group properties" msgstr "Propriedades do grupo" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nome:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Identificador:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Ícone:" #: error msgid "ERROR" msgstr "ERRO" #: return msgid "return..." msgstr "voltar..." #: group_admin_users msgid "Users" msgstr "Usuários" #: group_admin_no_users msgid "This group has no users." msgstr "Esse grupo não contém usuários." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Criar um novo usuário..." #: cancel msgid "Cancel" msgstr "Cancelar" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Nome de grupo incorreto!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Identificador de grupo incorreto!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Já existe outro grupo com o mesmo identificador no banco de dados!" #: group_admin_delete_group msgid "Delete group" msgstr "Excluir grupo" #: report_areyousure msgid "Are you sure?" msgstr "Você tem certeza?" #: YES msgid "Yes" msgstr "Sim" #: NOT msgid "Not" msgstr "Não" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Essa operação também excluirá do banco todos os usuários desse grupo. Todos " "os dados desses usuários serão perdidos." #: db_error msgid "Unable to complete the task." msgstr "Não foi possível completar a tarefa." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Apagar dados de relatório do grupo" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Essa operação apagará todos os registros de atividades feitas pelos membros " "desse grupo dentro do intervalo de datas indicadas." #: db_clear_reports_date msgid "Clear report data" msgstr "Apagar registros de dados" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Nome de usuário inválido." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Identificador de usuário inválido" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "Já existe outro usuário com o mesmo identificador no banco de dados!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "O usuário foi excluído com sucesso do banco de dados." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Identificador:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nome:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Ícone:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Editar..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Eliminar..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Apagar registros..." #: user_admin_delete_user msgid "Delete user" msgstr "Excluir usuário" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Essa operação excluirá do banco de dados esse usuário e seus registros." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Apagar registros de dados do usuário" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Esse operação apagará todos os registros de atividades feitas pelo usuário " "no período entre as datas indicadas." #: success msgid "Operation successful" msgstr "Operação bem sucedida" #: bad_data msgid "Bad data!" msgstr "Dados incorretos!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Tempo entre conexões (segundos)\\:" #: jclic_reports msgid "JClic reports" msgstr "Relatórios jClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "S" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Senha\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Confirme senha\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "As senhas estão diferentes\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_ru.po000066400000000000000000000323301335566474600252600ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-12-18 17:42+0000\n" "Last-Translator: Artem Vorotnikov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Пароль:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Вы должны ввести действительный пароль для доступа к базе данных отчётов." #: login_title msgid "Login" msgstr "Вход" #: submit msgid "Submit..." msgstr "Отправить..." #: login_incorrect msgid "Incorrect password!" msgstr "Неверный пароль!" #: main_title msgid "Main menu" msgstr "Главное меню" #: users_admin_title msgid "Users and groups admin" msgstr "Адм. пользователей и групп" #: group_report_title msgid "Group reports" msgstr "Групповые отчёты" #: user_report_title msgid "User reports" msgstr "Отчёты пользователя" #: act_report_title msgid "Activity reports" msgstr "Отчёты о заданиях" #: db_admin_title msgid "Database admin" msgstr "Администратор базы данных" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Невозможно задать новые значения базы данных!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Разрешить пользователям создавать новые группы" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Разрешить пользователям создавать новых пользователей" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Выберите группу из списка" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Выберите имя пользователя из списка" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "База данных содержит таблицы пользователей и групп" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Изменить настройки..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Установить пароль..." #: title msgid "Title" msgstr "Заголовок" #: db_admin_edit_title msgid "Edit database settings" msgstr "Изменить настройки базы данных" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Изменить системный пароль" #: db_admin_pw_newPwd msgid "New password" msgstr "Новый пароль" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Повторите пароль" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Поля паролей не заполнены!" #: report_group msgid "Group:" msgstr "Группа:" #: report_user msgid "User:" msgstr "Пользователь:" #: report_project msgid "Project:" msgstr "Проект:" #: report_all_projects msgid "All projects" msgstr "Все проекты" #: report_key msgid "Key:" msgstr "Ключ:" #: report_code msgid "Code:" msgstr "Код:" #: report_context msgid "Context:" msgstr "Контекст:" #: report_from msgid "From:" msgstr "От:" #: month_1 msgid "january" msgstr "январь" #: month_2 msgid "february" msgstr "февраль" #: month_3 msgid "march" msgstr "март" #: month_4 msgid "april" msgstr "апрель" #: month_5 msgid "may" msgstr "май" #: month_6 msgid "june" msgstr "июнь" #: month_7 msgid "july" msgstr "июль" #: month_8 msgid "august" msgstr "август" #: month_9 msgid "september" msgstr "сентябрь" #: month_10 msgid "october" msgstr "октябрь" #: month_11 msgid "november" msgstr "ноябрь" #: month_12 msgid "december" msgstr "декабрь" #: report_to msgid "To:" msgstr "Кому:" #: report_global_precision msgid "Global precision" msgstr "Общая точность" #: report_solved_activities msgid "Solved activities" msgstr "Решённые задания" #: report_user_evolution msgid "User evolution" msgstr "Развитие пользователя" #: report_group_evolution msgid "Group evolution" msgstr "Развитие группы" #: report_project_evolution msgid "Project evolution" msgstr "Развитие проекта" #: report_result_distribution msgid "Result distribution" msgstr "Распределение результатов" #: report_no_data msgid "NO DATA" msgstr "НЕТ ДАННЫХ" #: report_users msgid "Users:" msgstr "Пользователи" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Сессии:" #: report_projects msgid "Projects:" msgstr "Проекты:" #: report_actDone msgid "Activities done:" msgstr "Выполненных заданий:" #: report_actSolved msgid "Activities solved:" msgstr "Решённых заданий:" #: report_totalTime msgid "Total time:" msgstr "Общее время:" #: report_globalPrec msgid "Global score:" msgstr "Общий счёт" #: report_globalSummary msgid "Global summary" msgstr "Общие итоги" #: report_header_date msgid "date" msgstr "дата" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Сессии:" #: report_header_user msgid "user" msgstr "пользователь" #: report_header_project msgid "project" msgstr "проект" #: report_header_numActs msgid "activities" msgstr "задания" #: report_header_actsSolved msgid "acts. solved" msgstr "реш. заданий" #: report_header_time msgid "time" msgstr "время" #: report_header_prec msgid "score" msgstr "счёт" #: report_session_detail_show msgid "show session details" msgstr "показать подробности сессии" #: report_session_detail_title msgid "Activities done in session" msgstr "Действия завершенные в сессии" #: report_header_activity msgid "activity" msgstr "активность" #: report_header_actions msgid "actions" msgstr "действия" #: report_header_score msgid "corrects" msgstr "поправки" #: report_header_solved msgid "ok" msgstr "ok" #: Y msgctxt "Y" msgid "Y" msgstr "Y" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "скрыть подробности сессии" #: report_header_sessions msgid "sessions" msgstr "сессии" #: report_all_activities msgid "All activities" msgstr "Вся активность" #: report_activity msgid "Activity:" msgstr "Активность:" #: report_many msgid "several" msgstr "несколько" #: report_n_users msgid "users" msgstr "пользователей" #: group_admin_title msgid "Groups administration" msgstr "Управление группами" #: group_admin_new_button msgid "New group..." msgstr "Новая группа..." #: group_admin_groups msgid "Groups" msgstr "Группы" #: report_actions msgid "Actions" msgstr "Действия" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Изменить..." #: user_admin_title msgid "User admin" msgstr "Адм. пользователей" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Удалить..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Очистить отчёты..." #: group_admin_properties msgid "Group properties" msgstr "Свойства группы:" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Название:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Идентификатор:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Значок:" #: error msgid "ERROR" msgstr "ОШИБКА" #: return msgid "return..." msgstr "возврат..." #: group_admin_users msgid "Users" msgstr "Пользователи" #: group_admin_no_users msgid "This group has no users." msgstr "В этой группе нет пользователей." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Создать нового пользователя..." #: cancel msgid "Cancel" msgstr "Отмена" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Неверное название группы!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Неверный идентификатор группы!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "В базе данных имеется группа с таким же идентификатором." #: group_admin_delete_group msgid "Delete group" msgstr "Удалить группу" #: report_areyousure msgid "Are you sure?" msgstr "Вы уверены?" #: YES msgid "Yes" msgstr "Да" #: NOT msgid "Not" msgstr "Нет" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Эта операция также удалит всех пользователей этой группы, Все данные об этих " "пользователях будут потеряны." #: db_error msgid "Unable to complete the task." msgstr "Невозможно звершить действие." #: group_admin_clear_group msgid "Clear report data of group" msgstr "Очистить данные отчётов группы" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Эта операция удалит все отчёты членов этой группы между указанными датами." #: db_clear_reports_date msgid "Clear report data" msgstr "Очистить данные отчётов" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Неверное имя пользователя." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Неверный идентификатор пользователя." #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "В базе данных существует пользователь с таким же идентификатором!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "Пользователь успешно удалён из базы данных." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Идентификатор:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Имя:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Значок:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Изменить..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Удалить..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Очистить отчёты..." #: user_admin_delete_user msgid "Delete user" msgstr "Удалить пользователя" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "Эта операция удалит пользователя и его отчёты из базы данных." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Очистка данных отчётов пользователя" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "Эта операция удалит все отчёты пользователя между указанными датами." #: success msgid "Operation successful" msgstr "Операция успешно завершена" #: bad_data msgid "Bad data!" msgstr "Неверные данные!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Время между подключениями (секунд)\\:" #: jclic_reports msgid "JClic reports" msgstr "Отчёты JClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "Y" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Пароль\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Повторите пароль\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Пароли не совпадают\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_tr.po000066400000000000000000000264711335566474600252700ustar00rootroot00000000000000# Turkish translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-10-24 20:25+0000\n" "Last-Translator: Engin BAHADIR \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Şifre" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Veritabanı raporlarına erişim için geçerli bir şifreye ihtiyacınız var." #: login_title msgid "Login" msgstr "Kullanıcı adı" #: submit msgid "Submit..." msgstr "Gönder" #: login_incorrect msgid "Incorrect password!" msgstr "Hatalı şifre!" #: main_title msgid "Main menu" msgstr "Ana menü" #: users_admin_title msgid "Users and groups admin" msgstr "Kullanıcılar ve yöneticiler" #: group_report_title msgid "Group reports" msgstr "Grup raporları" #: user_report_title msgid "User reports" msgstr "Kullanıcı raporları" #: act_report_title msgid "Activity reports" msgstr "Aktivite raporları" #: db_admin_title msgid "Database admin" msgstr "Veritabanı yöneticisi" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "Yeni veritabanı değerleri yapılandırılamıyor!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Kullanıcılara yeni grup eklemelerine izin ver" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Kullanıcılara yeni kullanıcı oluşturma izni ver" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Listedeki grupları seç" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Listeden bir kullanıcı adı seç" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "Veritabanında kullanıcılar ve gruplar tablosu oluşturuldu" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Ayarları düzenle" #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Şifre belirle..." #: title msgid "Title" msgstr "Başlık" #: db_admin_edit_title msgid "Edit database settings" msgstr "Veritabanı ayarlarını düzenle" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Sistem şifresini değiştir" #: db_admin_pw_newPwd msgid "New password" msgstr "Yeni parola" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Şifrenizi tekrar giriniz" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "Şifre alanları uyuşmuyor!" #: report_group msgid "Group:" msgstr "Grup:" #: report_user msgid "User:" msgstr "Kullanıcı:" #: report_project msgid "Project:" msgstr "Proje:" #: report_all_projects msgid "All projects" msgstr "Tüm projeler" #: report_key msgid "Key:" msgstr "Anahtar:" #: report_code msgid "Code:" msgstr "Kod:" #: report_context msgid "Context:" msgstr "İçerik:" #: report_from msgid "From:" msgstr "Gönderen:" #: month_1 msgid "january" msgstr "Ocak" #: month_2 msgid "february" msgstr "Şubat" #: month_3 msgid "march" msgstr "Mart" #: month_4 msgid "april" msgstr "Nisan" #: month_5 msgid "may" msgstr "Mayıs" #: month_6 msgid "june" msgstr "Haziran" #: month_7 msgid "july" msgstr "Temmuz" #: month_8 msgid "august" msgstr "Ağustos" #: month_9 msgid "september" msgstr "Eylül" #: month_10 msgid "october" msgstr "Ekim" #: month_11 msgid "november" msgstr "Kasım" #: month_12 msgid "december" msgstr "Aralık" #: report_to msgid "To:" msgstr "Kime:" #: report_global_precision msgid "Global precision" msgstr "Genel hassasiyet" #: report_solved_activities msgid "Solved activities" msgstr "Çözülmüş aktiviteler" #: report_user_evolution msgid "User evolution" msgstr "Kullanıcı gelişimi" #: report_group_evolution msgid "Group evolution" msgstr "Grup gelişimi" #: report_project_evolution msgid "Project evolution" msgstr "Proje gelişimi" #: report_result_distribution msgid "Result distribution" msgstr "Sonuç dağılımı" #: report_no_data msgid "NO DATA" msgstr "VERİ YOK" #: report_users msgid "Users:" msgstr "Kullanıcılar:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Oturumlar:" #: report_projects msgid "Projects:" msgstr "Projeler:" #: report_actDone msgid "Activities done:" msgstr "Tamamlanan etkinlikler:" #: report_actSolved msgid "Activities solved:" msgstr "Çözülmüş aktiviteler" #: report_totalTime msgid "Total time:" msgstr "Toplam süre:" #: report_globalPrec msgid "Global score:" msgstr "Genel sonuç:" #: report_globalSummary msgid "Global summary" msgstr "Genel özet:" #: report_header_date msgid "date" msgstr "tarih" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Oturumlar:" #: report_header_user msgid "user" msgstr "kullanıcı" #: report_header_project msgid "project" msgstr "proje" #: report_header_numActs msgid "activities" msgstr "aktiviteler" #: report_header_actsSolved msgid "acts. solved" msgstr "çözülmüş aktiviteler" #: report_header_time msgid "time" msgstr "zaman" #: report_header_prec msgid "score" msgstr "sonuç" #: report_session_detail_show msgid "show session details" msgstr "oturum detaylarını göster" #: report_session_detail_title msgid "Activities done in session" msgstr "Bu oturumda tamamlanan etkinlikler" #: report_header_activity msgid "activity" msgstr "aktivite" #: report_header_actions msgid "actions" msgstr "eylemler" #: report_header_score msgid "corrects" msgstr "doğrular" #: report_header_solved msgid "ok" msgstr "tamam" #: Y msgctxt "Y" msgid "Y" msgstr "E" #: N msgctxt "N" msgid "N" msgstr "H" #: report_session_detail_hide msgid "hide session details" msgstr "oturum detaylarını sakla" #: report_header_sessions msgid "sessions" msgstr "oturumlar" #: report_all_activities msgid "All activities" msgstr "tüm aktiviteler" #: report_activity msgid "Activity:" msgstr "Aktivite:" #: report_many msgid "several" msgstr "birkaç defa" #: report_n_users msgid "users" msgstr "kullanıcılar" #: group_admin_title msgid "Groups administration" msgstr "Grup yöneticisi" #: group_admin_new_button msgid "New group..." msgstr "Yeni grup..." #: group_admin_groups msgid "Groups" msgstr "Gruplar" #: report_actions msgid "Actions" msgstr "Eylemler" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Düzenle..." #: user_admin_title msgid "User admin" msgstr "Kullanıcı yöneticisi" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Sil..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Raporları sil..." #: group_admin_properties msgid "Group properties" msgstr "Grup özellikleri" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "İsim:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "Tanımlayıcı:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Simge:" #: error msgid "ERROR" msgstr "HATA" #: return msgid "return..." msgstr "geri dön..." #: group_admin_users msgid "Users" msgstr "Kullanıcılar" #: group_admin_no_users msgid "This group has no users." msgstr "Bu grupta kullanıcı yok." #: group_admin_create_user_button msgid "Create a new user..." msgstr "Yeni kullanıcı oluştur..." #: cancel msgid "Cancel" msgstr "İptal" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Grup adı hatalı!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Grup kimliği hatalı!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Veritabanında aynı isme sahip başka bir grup var!" #: group_admin_delete_group msgid "Delete group" msgstr "Grup Sil" #: report_areyousure msgid "Are you sure?" msgstr "Emin misiniz?" #: YES msgid "Yes" msgstr "Evet" #: NOT msgid "Not" msgstr "Değil" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Bu işlem bu gruptaki tüm kullanıcıları veritabanından silecek. Kullanıcılara " "ait tüm veriler kaybolacak." #: db_error msgid "Unable to complete the task." msgstr "Görev tamamlanamadı" #: group_admin_clear_group msgid "Clear report data of group" msgstr "Grup veri raporunu sil" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Bu işlem grup üyeleri tarafından belirtilen tarihler arasında yapılmış " "aktivitelerle ilgili tüm raporları silecektir." #: db_clear_reports_date msgid "Clear report data" msgstr "Veri raporunu sil" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Geçersiz kullanıcı adı" #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Geçersiz kullanıcı kimliği" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "Veritabanında aynı kimliğe sahip başka bir kullanıcı var!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "Kullanıcı başarıyla veritabanından silindi." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Tanımlayıcı:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "İsim:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Simge:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Düzenle..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Sil..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Raporları sil..." #: user_admin_delete_user msgid "Delete user" msgstr "Kullanıcı sil" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "Bu işlem kullanıcıyı ve raporlarını veritabanından silecek." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Kullanıcı veri raporunu sil" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Bu işlem belirlenmiş tarihler arasında kullanıcı tarafından yapılmış " "etkinliklere ait raporların tamamını silecek." #: success msgid "Operation successful" msgstr "İşlem başarıyla gerçekleştirildi" #: bad_data msgid "Bad data!" msgstr "Hatalı veri!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "İki bağlantı arasındaki zaman (saniye):" #: jclic_reports msgid "JClic reports" msgstr "JClic raporları" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "E" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "H" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Şifre:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Şifreyi onaylayın\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Şifreler uyuşmuyor." i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_vec.po000066400000000000000000000263531335566474600254170ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-24 09:45+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "Password:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "" "Te gà da fornir na password vàƚida par intrar inte 'l database de i reports." #: login_title msgid "Login" msgstr "Login" #: submit msgid "Submit..." msgstr "Spedisi..." #: login_incorrect msgid "Incorrect password!" msgstr "Password no rispondente!" #: main_title msgid "Main menu" msgstr "Menu primario" #: users_admin_title msgid "Users and groups admin" msgstr "Ministrador de utenti e grupi" #: group_report_title msgid "Group reports" msgstr "Reports grupo" #: user_report_title msgid "User reports" msgstr "Reports utente" #: act_report_title msgid "Activity reports" msgstr "REports de atività" #: db_admin_title msgid "Database admin" msgstr "Ministrador de 'l database" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "No se pol inpostar i vaƚori niovi de 'l database!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "Conténteghe a i utenti de inviar grupi niovi" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "Conténteghe a i utenti de inviar utenti niovi" #: db_admin_param_shgl msgid "Select group in a list" msgstr "Desernisi un grupo da na lista" #: db_admin_param_shul msgid "Select user name in a list" msgstr "Desernisi un nòme utente da na lista" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "El database el gà tavèƚe de utenti e grupi" #: db_admin_edit_btn msgid "Edit settings..." msgstr "Modìfega inpostasion..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "Definisi password..." #: title msgid "Title" msgstr "Tìtoƚo" #: db_admin_edit_title msgid "Edit database settings" msgstr "Modìfega ƚe inpostasion de 'l database" #: db_admin_pw_edit_title msgid "Change system password" msgstr "Canbia ƚa password de 'l sistèma" #: db_admin_pw_newPwd msgid "New password" msgstr "Password niova" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "Scrivi password da novo" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "I canpi password no i conbina!" #: report_group msgid "Group:" msgstr "Grupo:" #: report_user msgid "User:" msgstr "Utente:" #: report_project msgid "Project:" msgstr "Proxèto:" #: report_all_projects msgid "All projects" msgstr "Tuti i proxèti" #: report_key msgid "Key:" msgstr "Ciave:" #: report_code msgid "Code:" msgstr "Còdexe:" #: report_context msgid "Context:" msgstr "Contenudo:" #: report_from msgid "From:" msgstr "Da:" #: month_1 msgid "january" msgstr "xenaro" #: month_2 msgid "february" msgstr "febraro" #: month_3 msgid "march" msgstr "marso" #: month_4 msgid "april" msgstr "april" #: month_5 msgid "may" msgstr "majo" #: month_6 msgid "june" msgstr "xugno" #: month_7 msgid "july" msgstr "lujo" #: month_8 msgid "august" msgstr "agosto" #: month_9 msgid "september" msgstr "setenbre" #: month_10 msgid "october" msgstr "otobre" #: month_11 msgid "november" msgstr "novenbre" #: month_12 msgid "december" msgstr "desenbre" #: report_to msgid "To:" msgstr "A:" #: report_global_precision msgid "Global precision" msgstr "Precixion global" #: report_solved_activities msgid "Solved activities" msgstr "Atività resolveste" #: report_user_evolution msgid "User evolution" msgstr "Evoƚusion utente" #: report_group_evolution msgid "Group evolution" msgstr "Evoƚusion grupo" #: report_project_evolution msgid "Project evolution" msgstr "Evoƚusion proxèto" #: report_result_distribution msgid "Result distribution" msgstr "Destribusion de i rexultadi" #: report_no_data msgid "NO DATA" msgstr "NO GHE XÉ DATI" #: report_users msgid "Users:" msgstr "Utenti:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "Sesion:" #: report_projects msgid "Projects:" msgstr "Proxèti:" #: report_actDone msgid "Activities done:" msgstr "Atività concluxe:" #: report_actSolved msgid "Activities solved:" msgstr "Atività resolveste:" #: report_totalTime msgid "Total time:" msgstr "Tenpo total:" #: report_globalPrec msgid "Global score:" msgstr "Pontexio global:" #: report_globalSummary msgid "Global summary" msgstr "Somario global" #: report_header_date msgid "date" msgstr "data" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "Sesion:" #: report_header_user msgid "user" msgstr "utente" #: report_header_project msgid "project" msgstr "proxèto" #: report_header_numActs msgid "activities" msgstr "atività" #: report_header_actsSolved msgid "acts. solved" msgstr "at. resòlte" #: report_header_time msgid "time" msgstr "tenpo" #: report_header_prec msgid "score" msgstr "pontexio" #: report_session_detail_show msgid "show session details" msgstr "mostra detali sesion" #: report_session_detail_title msgid "Activities done in session" msgstr "Atività concluxe inte ƚa sesion" #: report_header_activity msgid "activity" msgstr "atività" #: report_header_actions msgid "actions" msgstr "asion" #: report_header_score msgid "corrects" msgstr "corète" #: report_header_solved msgid "ok" msgstr "ok" #: Y msgctxt "Y" msgid "Y" msgstr "S" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "scondi detali de sesion" #: report_header_sessions msgid "sessions" msgstr "sesion" #: report_all_activities msgid "All activities" msgstr "Tute ƚe atività" #: report_activity msgid "Activity:" msgstr "Atività:" #: report_many msgid "several" msgstr "vari" #: report_n_users msgid "users" msgstr "utenti" #: group_admin_title msgid "Groups administration" msgstr "Monistrasion de 'l grupo" #: group_admin_new_button msgid "New group..." msgstr "Grupo niovo..." #: group_admin_groups msgid "Groups" msgstr "Grupi" #: report_actions msgid "Actions" msgstr "Asion" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "Modìfega..." #: user_admin_title msgid "User admin" msgstr "Ministrador de i utenti" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "Scansèƚa..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "Sneta reports..." #: group_admin_properties msgid "Group properties" msgstr "Propietà grupo" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "Nòme:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "id:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "Icona:" #: error msgid "ERROR" msgstr "EROR" #: return msgid "return..." msgstr "indrio..." #: group_admin_users msgid "Users" msgstr "Utenti" #: group_admin_no_users msgid "This group has no users." msgstr "Sto grupo no 'l gà utenti" #: group_admin_create_user_button msgid "Create a new user..." msgstr "Definisi un utente niovo..." #: cancel msgid "Cancel" msgstr "Anuƚa" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "Nòme grupo no corèto!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "Id grupo no corèto!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "Ghe xé naltro grupo co'l steso idenrifegador inte 'l database!" #: group_admin_delete_group msgid "Delete group" msgstr "Scansèƚa grupo" #: report_areyousure msgid "Are you sure?" msgstr "Sito seguro?" #: YES msgid "Yes" msgstr "Sì" #: NOT msgid "Not" msgstr "Nò" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "" "Sta fatura ƚa scanseƚarà anca tuti i utenti de sto grupo da 'l database. " "Tuti i dati de sti utenti i andarà pèrsi." #: db_error msgid "Unable to complete the task." msgstr "No se pol conpletar ƚa fatura" #: group_admin_clear_group msgid "Clear report data of group" msgstr "Sneta dati report de 'l grupo" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "" "Sta fatura ƚa snetarà tuti i reports de ƚe atività fate da i menbri de sto " "grupo fra ƚe date spesifegàe." #: db_clear_reports_date msgid "Clear report data" msgstr "Sneta dati report" #: user_admin_invalid_name msgid "Invalid user name." msgstr "Nòme utente no vàƚido." #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "Identifegaor utente invàƚido" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "Ghe xé naltro utente co'l steso identifegador inte 'l database!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "El utente el xé stà scanseƚà da 'l database." #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "Id:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "Nòme:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "Icona:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "Modìfega..." #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "Scansèƚa..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "Sneta reports..." #: user_admin_delete_user msgid "Delete user" msgstr "Scansèƚa utente" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "" "Sta operasion ƚa scanseƚarà sto utente e i so reports da 'l database." #: user_admin_clear_user msgid "Clear report data of user" msgstr "Scansèƚa dati report de 'l utente" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "" "Sta fatura ƚa scanseƚarà tuti i reports de ƚe atività fate da sto utente fra " "ƚe date spesifegàe." #: success msgid "Operation successful" msgstr "Operasion concluxa poƚito" #: bad_data msgid "Bad data!" msgstr "Dati sbaliài!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "Tenpo fra ƚe conesion (seondi)\\:" #: jclic_reports msgid "JClic reports" msgstr "Reports JClic" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "S" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "N" #: user_admin_pw_prompt msgid "Password\\:" msgstr "Password\\:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "Confirm password\\:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "Ƚe password no ƚe conbina\\!" i18n/fromLaunchpad/po/jclic-reportServlets/reportMessages_zh_TW.po000066400000000000000000000256571335566474600257030ustar00rootroot00000000000000# Traditional Chinese translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-05-07 11:05+0000\n" "Last-Translator: 李宜錚 \n" "Language-Team: Traditional Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: login_pwd msgid "Password:" msgstr "密碼:" #: login_desc msgid "" "You need to provide a valid password in order to access the reports database." msgstr "你必須提供一個有效的密碼才可以取得報告數據" #: login_title msgid "Login" msgstr "登入" #: submit msgid "Submit..." msgstr "送出" #: login_incorrect msgid "Incorrect password!" msgstr "密碼不正確" #: main_title msgid "Main menu" msgstr "主選單" #: users_admin_title msgid "Users and groups admin" msgstr "使用者與群組管理" #: group_report_title msgid "Group reports" msgstr "群組報 告" #: user_report_title msgid "User reports" msgstr "使用者報告" #: act_report_title msgid "Activity reports" msgstr "活動報告" #: db_admin_title msgid "Database admin" msgstr "資料庫管理" #: db_admin_settings_error msgid "Unable to set the new database values!" msgstr "無法設置新資料庫的數據!" #: db_admin_param_agc msgid "Allow users to create new groups" msgstr "允許使用者建立新群組" #: db_admin_param_auc msgid "Allow users to create new users" msgstr "允許使用者建立新使用者" #: db_admin_param_shgl msgid "Select group in a list" msgstr "在列表中選擇群組" #: db_admin_param_shul msgid "Select user name in a list" msgstr "在列表中選擇使用者" #: db_admin_param_ut msgid "Database has tables of users and groups" msgstr "資料庫有使用者與群組工作表" #: db_admin_edit_btn msgid "Edit settings..." msgstr "編輯偏好設定..." #: db_admin_pw_edit_btn msgid "Set password..." msgstr "設定密碼..." #: title msgid "Title" msgstr "標題" #: db_admin_edit_title msgid "Edit database settings" msgstr "編輯資料庫設定" #: db_admin_pw_edit_title msgid "Change system password" msgstr "變更系統密碼" #: db_admin_pw_newPwd msgid "New password" msgstr "新密碼" #: db_admin_pw_verifyPwd msgid "Retype password" msgstr "再一次輸入密碼" #: db_admin_pw_noFit msgid "Password fields don't fit!" msgstr "密碼欄位不一致!" #: report_group msgid "Group:" msgstr "群組:" #: report_user msgid "User:" msgstr "使用者:" #: report_project msgid "Project:" msgstr "專案:" #: report_all_projects msgid "All projects" msgstr "全部專案" #: report_key msgid "Key:" msgstr "金鑰:" #: report_code msgid "Code:" msgstr "編碼:" #: report_context msgid "Context:" msgstr "上下文:" #: report_from msgid "From:" msgstr "從:" #: month_1 msgid "january" msgstr "一月" #: month_2 msgid "february" msgstr "二月" #: month_3 msgid "march" msgstr "三月" #: month_4 msgid "april" msgstr "四月" #: month_5 msgid "may" msgstr "五月" #: month_6 msgid "june" msgstr "六月" #: month_7 msgid "july" msgstr "七月" #: month_8 msgid "august" msgstr "八月" #: month_9 msgid "september" msgstr "九月" #: month_10 msgid "october" msgstr "十月" #: month_11 msgid "november" msgstr "十一月" #: month_12 msgid "december" msgstr "十二月" #: report_to msgid "To:" msgstr "到:" #: report_global_precision msgid "Global precision" msgstr "全球準確" #: report_solved_activities msgid "Solved activities" msgstr "解答活動" #: report_user_evolution msgid "User evolution" msgstr "使用者的演變" #: report_group_evolution msgid "Group evolution" msgstr "群組的演變" #: report_project_evolution msgid "Project evolution" msgstr "專案的演進過程" #: report_result_distribution msgid "Result distribution" msgstr "結果分佈" #: report_no_data msgid "NO DATA" msgstr "無資料" #: report_users msgid "Users:" msgstr "使用者:" #: report_sessions msgctxt "report_sessions" msgid "Sessions:" msgstr "區段:" #: report_projects msgid "Projects:" msgstr "專案:" #: report_actDone msgid "Activities done:" msgstr "活動結束" #: report_actSolved msgid "Activities solved:" msgstr "已解決的活動" #: report_totalTime msgid "Total time:" msgstr "全部時間:" #: report_globalPrec msgid "Global score:" msgstr "總成績" #: report_globalSummary msgid "Global summary" msgstr "整體總結" #: report_header_date msgid "date" msgstr "日期" #: report_session_list msgctxt "report_session_list" msgid "Sessions:" msgstr "區段:" #: report_header_user msgid "user" msgstr "使用者" #: report_header_project msgid "project" msgstr "專案" #: report_header_numActs msgid "activities" msgstr "編輯" #: report_header_actsSolved msgid "acts. solved" msgstr "行動 . 已解決" #: report_header_time msgid "time" msgstr "時間" #: report_header_prec msgid "score" msgstr "分數" #: report_session_detail_show msgid "show session details" msgstr "顯示細節區段" #: report_session_detail_title msgid "Activities done in session" msgstr "此區域完成的編輯" #: report_header_activity msgid "activity" msgstr "活動" #: report_header_actions msgid "actions" msgstr "動作" #: report_header_score msgid "corrects" msgstr "更正" #: report_header_solved msgid "ok" msgstr "確定" #: Y msgctxt "Y" msgid "Y" msgstr "Y" #: N msgctxt "N" msgid "N" msgstr "N" #: report_session_detail_hide msgid "hide session details" msgstr "隱藏區段細節" #: report_header_sessions msgid "sessions" msgstr "工作階段" #: report_all_activities msgid "All activities" msgstr "全部活動" #: report_activity msgid "Activity:" msgstr "活動:" #: report_many msgid "several" msgstr "好幾個" #: report_n_users msgid "users" msgstr "使用者" #: group_admin_title msgid "Groups administration" msgstr "群組管理" #: group_admin_new_button msgid "New group..." msgstr "新群組..." #: group_admin_groups msgid "Groups" msgstr "群組" #: report_actions msgid "Actions" msgstr "動作" #: group_admin_edit_button msgctxt "group_admin_edit_button" msgid "Edit..." msgstr "編輯…" #: user_admin_title msgid "User admin" msgstr "使用者管理" #: group_admin_delete_button msgctxt "group_admin_delete_button" msgid "Delete..." msgstr "刪除..." #: group_admin_clear_button msgctxt "group_admin_clear_button" msgid "Clear reports..." msgstr "清除報告..." #: group_admin_properties msgid "Group properties" msgstr "群組屬性" #: group_admin_name msgctxt "group_admin_name" msgid "Name:" msgstr "名稱:" #: group_admin_id msgctxt "group_admin_id" msgid "Identifier:" msgstr "識別碼:" #: group_admin_icon msgctxt "group_admin_icon" msgid "Icon:" msgstr "圖示:" #: error msgid "ERROR" msgstr "錯誤" #: return msgid "return..." msgstr "返回..." #: group_admin_users msgid "Users" msgstr "使用者" #: group_admin_no_users msgid "This group has no users." msgstr "這個群組沒有使用者。" #: group_admin_create_user_button msgid "Create a new user..." msgstr "建立新使用者..." #: cancel msgid "Cancel" msgstr "取消" #: group_admin_invalid_name msgid "Incorrect group name!" msgstr "不正確的群組名稱!" #: group_admin_invalid_id msgid "Incorrect group identifier!" msgstr "不正確的群組識別碼!" #: group_admin_id_already_exists msgid "There is another group with the same identifier in the database!" msgstr "數據庫中的一個群組也有相同的標識符!" #: group_admin_delete_group msgid "Delete group" msgstr "刪除群組" #: report_areyousure msgid "Are you sure?" msgstr "您確定嗎?" #: YES msgid "Yes" msgstr "確定" #: NOT msgid "Not" msgstr "不是" #: group_admin_delete_group_explain msgid "" "This operation will also delete on the database all users of this group. All " "data of these users will be lost." msgstr "這個操作會刪除在資料庫中這個群組的所有用戶。這些用戶的所有資料將會遺失。" #: db_error msgid "Unable to complete the task." msgstr "無法完成工作" #: group_admin_clear_group msgid "Clear report data of group" msgstr "清除群組的報告資料" #: group_admin_clear_group_explain msgid "" "This operation will clear all the reports of the activities done by the " "members of this group between the specified dates." msgstr "此操作將清除這個群組的指定日期之間的所有成員進行活動的報告。" #: db_clear_reports_date msgid "Clear report data" msgstr "清除報告資料" #: user_admin_invalid_name msgid "Invalid user name." msgstr "無效的使用者名稱。" #: user_admin_invalid_id msgid "Invalid user identifier" msgstr "無效的使用者識別碼" #: user_admin_id_already_exists msgid "There is another user with the same identifier in the database!" msgstr "在資料庫中有一個相同標識符的用戶!" #: user_admin_user_deleted msgid "The user was successfully deleted from the database." msgstr "使用者已經刪除。" #: user_admin_id msgctxt "user_admin_id" msgid "Identifier:" msgstr "識別碼:" #: user_admin_name msgctxt "user_admin_name" msgid "Name:" msgstr "名稱:" #: user_admin_icon msgctxt "user_admin_icon" msgid "Icon:" msgstr "圖示:" #: user_admin_edit_button msgctxt "user_admin_edit_button" msgid "Edit..." msgstr "編輯…" #: user_admin_delete_button msgctxt "user_admin_delete_button" msgid "Delete..." msgstr "刪除..." #: user_admin_clear_button msgctxt "user_admin_clear_button" msgid "Clear reports..." msgstr "清除報告..." #: user_admin_delete_user msgid "Delete user" msgstr "刪除使用者" #: user_admin_delete_user_explain msgid "" "This operation will delete this user and his reports from the database." msgstr "這個操作會從資料庫中刪除這個使用者和他的報告。" #: user_admin_clear_user msgid "Clear report data of user" msgstr "清除使用者的報告" #: user_admin_clear_user_explain msgid "" "This operation will clear all the reports of the activities done by this " "user between the specified dates." msgstr "這個操作會刪除這個使用者在特定日期之間所完成的活動報告。" #: success msgid "Operation successful" msgstr "操作完成" #: bad_data msgid "Bad data!" msgstr "壞的資料!" #: db_admin_param_lap msgid "Time between connections (seconds)\\:" msgstr "之間的連接時間(秒)\\:" #: jclic_reports msgid "JClic reports" msgstr "JClic 報告" #: YES_SHORT msgctxt "YES_SHORT" msgid "Y" msgstr "Y" #: NOT_SHORT msgctxt "NOT_SHORT" msgid "N" msgstr "否" #: user_admin_pw_prompt msgid "Password\\:" msgstr "密碼:" #: user_admin_pw_prompt_confirm msgid "Confirm password\\:" msgstr "確認密碼:" #: user_admin_err_bad_pw msgid "Passwords don't match\\!" msgstr "密碼沒有匹配!" i18n/fromLaunchpad/po/jclic-shapers/000077500000000000000000000000001335566474600176105ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-shapers/listshapers_ar.po000066400000000000000000000017241335566474600231770ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2011-03-26 09:17+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "" #: @Holes msgid "Cuts" msgstr "" i18n/fromLaunchpad/po/jclic-shapers/listshapers_ast.po000066400000000000000000000021521335566474600233600ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-09-29 18:48+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rectangular|Recortador rectangular estándar." #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Encaxes con xuntura rectangular" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Encaxes con xuntura triangular" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Encaxes con xuntura ovalada" #: @Holes msgid "Cuts" msgstr "Recortes" i18n/fromLaunchpad/po/jclic-shapers/listshapers_ca.po000066400000000000000000000016141335566474600231560ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-18 15:55+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rectangular|Retallador rectangular estàndard." #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Encaixos amb unió rectangular" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Encaixos amb unió triangular" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Encaixos amb unió ovalada" #: @Holes msgid "Cuts" msgstr "Retalls" i18n/fromLaunchpad/po/jclic-shapers/listshapers_cs.po000066400000000000000000000021501335566474600231740ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-07-24 22:07+0000\n" "Last-Translator: Martin Slavík \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Pravoúhlý|Standardní pravoúhlý tvar" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Skládačka s pravoúhlými díly" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Skládačka s trojúhelníkovými díly" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Skládačka se zakřivenými díly" #: @Holes msgid "Cuts" msgstr "Řezy" i18n/fromLaunchpad/po/jclic-shapers/listshapers_de.po000066400000000000000000000016501335566474600231630ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-18 15:56+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rectangular|Rechteckige Standardformen" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Puzzle mit rechteckigen Verbindungsteilen" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Puzzle mit dreieckigen Verbindungsteilen" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Puzzle mit runden Verbindungsteilen" #: @Holes msgid "Cuts" msgstr "Einkerbungen" i18n/fromLaunchpad/po/jclic-shapers/listshapers_el.po000066400000000000000000000022771335566474600232010ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-18 19:45+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Ορθογώνιο|Τυπικός σχεδιαστής ορθογωνίου" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Παζλ με ορθογώνιες ενώσεις" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Παζλ με τρίγωνες ενώσεις" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Παζλ με καμπύλες ενώσεις" #: @Holes msgid "Cuts" msgstr "Τομές" i18n/fromLaunchpad/po/jclic-shapers/listshapers_es.po000066400000000000000000000016141335566474600232020ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-18 15:56+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rectangular|Recortador rectangular estándar." #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Encajes con unión rectangular" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Encajes con unión triangular" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Encajes con unión ovalada" #: @Holes msgid "Cuts" msgstr "Recortes" i18n/fromLaunchpad/po/jclic-shapers/listshapers_eu.po000066400000000000000000000021771335566474600232110ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-06-16 06:45+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Laukizuzena|Piezak laukizuzen estandarrak" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Puzzle-piezak laukizuzenen bidez lotuak" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Puzzle-piezak hirukien bidez lotuak" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Puzzle-piezak kurba bidez lotuak" #: @Holes msgid "Cuts" msgstr "Errekorteak" i18n/fromLaunchpad/po/jclic-shapers/listshapers_fr.po000066400000000000000000000021731335566474600232030ustar00rootroot00000000000000# French translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-01-17 17:55+0000\n" "Last-Translator: Renaud de Colombel \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rectangulaire|Pieces rectangulaires classiques" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Puzzle à jonctions rectangulaires" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Puzzle à jonctions triangulaires" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Puzzle à jonctions arrondies" #: @Holes msgid "Cuts" msgstr "Formes personnalisées" i18n/fromLaunchpad/po/jclic-shapers/listshapers_gl.po000066400000000000000000000016171335566474600232000ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-03-04 17:19+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rectangular|Recortador estándar rectangular" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Encaixes con unión rectangular" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Encaixes con unión triangular" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Encaixes con unión ovalada" #: @Holes msgid "Cuts" msgstr "Retrincos" i18n/fromLaunchpad/po/jclic-shapers/listshapers_it.po000066400000000000000000000021201335566474600232000ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-21 00:01+0000\n" "Last-Translator: giomu2 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rettangolare|Pezzi rettangolari standard" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Puzzle con unioni rettangolari" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Puzzle con unioni triangolari" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Puzzle con unioni a curva" #: @Holes msgid "Cuts" msgstr "Ritagli" i18n/fromLaunchpad/po/jclic-shapers/listshapers_nl.po000066400000000000000000000021361335566474600232040ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-08-11 13:18+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rechthoekige|Standaard rechthoekige vorm" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Puzzel met rechthoekige gebieden" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Puzzel met driehoekige gebieden" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Puzzel met gebogen gebieden" #: @Holes msgid "Cuts" msgstr "Openingen" i18n/fromLaunchpad/po/jclic-shapers/listshapers_pt.po000066400000000000000000000021501335566474600232120ustar00rootroot00000000000000# Portuguese translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-28 11:42+0000\n" "Last-Translator: Rui Fernandes \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Rectangular|Encaixe rectangular" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Encaixes (conexões) rectangulares" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Encaixes (conexões) triangulares" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Encaixes (conexões) curvos" #: @Holes msgid "Cuts" msgstr "Recortes" i18n/fromLaunchpad/po/jclic-shapers/listshapers_pt_BR.po000066400000000000000000000016421335566474600236020ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-03-04 17:19+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Retangular|Formatador retangular padrão" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Quebra-cabeças com uniões retangulares" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Quebra-cabeças com uniões triangulares" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Quebra-cabeças com uniões curvas" #: @Holes msgid "Cuts" msgstr "Cortes" i18n/fromLaunchpad/po/jclic-shapers/listshapers_ru.po000066400000000000000000000024151335566474600232210ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-28 13:31+0000\n" "Last-Translator: Nkolay Parukhin \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Прямоугольный|Стандартный прямоугольный формирователь" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Пила с прямоугольными соединениями" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Пила с треугольными соединениями" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Пила с изогнутыми соединениями" #: @Holes msgid "Cuts" msgstr "Разрезы" i18n/fromLaunchpad/po/jclic-shapers/listshapers_vec.po000066400000000000000000000021001335566474600233370ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-22 15:24+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "Retangoƚar|Forma retangoƚar standard" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "Dente de sega retangoƚar" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "Dente de sega triangoƚar" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "Dente de sega ondixà" #: @Holes msgid "Cuts" msgstr "Taji" i18n/fromLaunchpad/po/jclic-shapers/listshapers_zh_TW.po000066400000000000000000000021171335566474600236250ustar00rootroot00000000000000# Chinese (Traditional) translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-03-13 08:49+0000\n" "Last-Translator: xatierlike \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: @Rectangular msgid "Rectangular|Standard rectangular shaper" msgstr "矩形|標準矩形成型器" #: @JigSaw msgid "Jigsaw with rectangular unions" msgstr "矩形的拼圖" #: @TriangularJigSaw msgid "Jigsaw with triangular unions" msgstr "三角形的拼圖" #: @ClassicJigSaw msgid "Jigsaw with curved unions" msgstr "曲線的拼圖" #: @Holes msgid "Cuts" msgstr "切片" i18n/fromLaunchpad/po/jclic-utilities/000077500000000000000000000000001335566474600201565ustar00rootroot00000000000000i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_ar.po000066400000000000000000000116421335566474600237150ustar00rootroot00000000000000# Arabic translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-03-19 14:27+0000\n" "Last-Translator: hmagroun \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "خطأ" #: OK msgid "OK" msgstr "موافق" #: YES msgid "Yes" msgstr "نعم" #: NO msgid "No" msgstr "لا" #: DELETE msgid "Delete" msgstr "احذف" #: PASTE msgid "Paste" msgstr "ألصق" #: CUT msgid "Cut" msgstr "قص" #: COPY msgid "Copy" msgstr "نسخ" #: FILE_SAVE msgid "Save file" msgstr "حفظ الملف" #: CONFIRM msgid "Please confirm" msgstr "" #: FILE_OPEN msgid "Open file" msgstr "افتح ملفّ" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "مجلد" #: URL msgid "URL:" msgstr "العنوان:" #: PASSWORD msgid "Password:" msgstr "كلمة المرور:" #: WARNING msgid "Warning!" msgstr "تحذير!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "هل تود أن تستبدله؟" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "هل تود أن تستبدله؟" #: FILE_EXISTS msgid "already exists on your system." msgstr "" #: FILE_DIR_BEG msgid "The folder" msgstr "" #: FILE_BEG msgid "The file" msgstr "الملف" #: UNNAMED msgid "Unnamed" msgstr "غير مسمّى" #: FILE_ERR_READING msgid "Error reading file" msgstr "خطأ أثناء قراءة الملف" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "حدث خطأ أثناء حفظ الملف" #: FILE_FIND msgid "Find file" msgstr "" #: FILE_ERR_READONLY msgid "is read-only." msgstr "" #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "" #: FILE_ERR_BEG msgid "File" msgstr "ملف" #: LOADING msgid "loading..." msgstr "جاري التحميل..." #: FALSE msgid "false" msgstr "خطأ" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "" #: URL_ERROR msgid "Error building URL!" msgstr "" #: QUESTION msgid "Question" msgstr "سؤال" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "" #: TRUE msgid "true" msgstr "صحيح" #: CANCEL msgid "Cancel" msgstr "إلغاء" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "" #: URL_OPEN msgid "Open URL" msgstr "افتح عنوان إنترنت" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "" #: WRITING_FILE msgid "Writing file..." msgstr "" #: XML_ATTRIBUTE msgid "Attribute" msgstr "الصّفة" #: XML_VALUE msgid "Value" msgstr "قيمة" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "" #: XML_TEXT msgid "text" msgstr "نص" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "" #: WORKING msgid "Working..." msgstr "...جارٍ العمل" #: LOADING_FILE msgid "Loading file" msgstr "" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "" #: XML_ELEMENT msgid "Element" msgstr "عنصر" #: XML_NEW_ELEMENT msgid "New element" msgstr "" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "" #: XML_NAME msgid "Name" msgstr "الإسم" #: RETRY msgid "Retry" msgstr "إعادة المحاولة" #: IGNORE msgid "Ignore" msgstr "تجاهل" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "" #: BAD_NUMBER msgid "Incorrect number!" msgstr "" #: NONE msgid "None" msgstr "لا شيئ" #: COPY_keys msgid "CC" msgstr "" #: CUT_keys msgid "TX" msgstr "" #: PASTE_keys msgid "PV" msgstr "" #: DELETE_keys msgid "D#127" msgstr "" #: SELECT_ALL msgid "Select all" msgstr "اختر الكل" #: SELECT_NONE msgid "Clear selection" msgstr "" #: WIDTH msgid "Width:" msgstr "العرض:" #: HEIGHT msgid "Height:" msgstr "الطول:" #: BROWSE_FILES msgid "Browse files..." msgstr "" #: VERSION msgid "version" msgstr "الإصدارة" #: ABOUT msgid "About..." msgstr "حول..." #: YES_TO_ALL msgid "Yes to all" msgstr "نعم للجميع" #: NO_TO_ALL msgid "No to all" msgstr "" #: SAVE msgid "Save" msgstr "حفظ" #: OPEN msgid "Open" msgstr "افتح" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "" #: SAVING msgid "saving..." msgstr "" #: SAVING_FILE msgid "Saving file" msgstr "" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_ast.po000066400000000000000000000126531335566474600241050ustar00rootroot00000000000000# Asturian translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # Xandru Armesto , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-10-01 11:27+0000\n" "Last-Translator: Xandru \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERROR" #: OK msgid "OK" msgstr "Aceutar" #: YES msgid "Yes" msgstr "Sí" #: NO msgid "No" msgstr "Non" #: DELETE msgid "Delete" msgstr "Esborrar" #: PASTE msgid "Paste" msgstr "Apegar" #: CUT msgid "Cut" msgstr "Recortar" #: COPY msgid "Copy" msgstr "Copiar" #: FILE_SAVE msgid "Save file" msgstr "Guardar ficheru" #: CONFIRM msgid "Please confirm" msgstr "Confirmar" #: FILE_OPEN msgid "Open file" msgstr "Abrir ficheru" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Carpeta" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Contraseña:" #: WARNING msgid "Warning!" msgstr "¡Atención!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "¡Nun ser pudo lleer!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "¡Nun esiste!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "¡Ye de llectura namás y nun se pue camudar." #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "¿Quies camudala?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "¿Quies reemplazalu?" #: FILE_EXISTS msgid "already exists on your system." msgstr "yá esiste nel ordenador." #: FILE_DIR_BEG msgid "The folder" msgstr "La carpeta" #: FILE_BEG msgid "The file" msgstr "El ficheru" #: UNNAMED msgid "Unnamed" msgstr "Ensin nome" #: FILE_ERR_READING msgid "Error reading file" msgstr "Error al lleer el ficheru" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Error al grabar el ficheru" #: FILE_FIND msgid "Find file" msgstr "Guetar ficheru" #: FILE_ERR_READONLY msgid "is read-only." msgstr "ye de llectura namás." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "yá esiste. ¿Quies sobroescribilu?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "nun se pue lleer." #: FILE_ERR_BEG msgid "File" msgstr "El ficheru" #: LOADING msgid "loading..." msgstr "cargando..." #: FALSE msgid "false" msgstr "falso" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Error al entamar la URL!" #: URL_ERROR msgid "Error building URL!" msgstr "¡Error al construyir la URL!" #: QUESTION msgid "Question" msgstr "Entruga" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "¡Contraseña incorreuta!" #: TRUE msgid "true" msgstr "braero" #: CANCEL msgid "Cancel" msgstr "Encaboxar" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Error al esborrar el ficheru" #: URL_OPEN msgid "Open URL" msgstr "Abrir URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Error al restaurar el ficheru" #: WRITING_FILE msgid "Writing file..." msgstr "Escribiendo ficheru..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Atributu" #: XML_VALUE msgid "Value" msgstr "Valor" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "¡Esti campu nun ye editable!" #: XML_TEXT msgid "text" msgstr "testu" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Amestar un atributu nuevu" #: WORKING msgid "Working..." msgstr "Trabayando..." #: LOADING_FILE msgid "Loading file" msgstr "Lleendo'l ficheru" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Esborrar l'atributu" #: XML_ELEMENT msgid "Element" msgstr "Elementu" #: XML_NEW_ELEMENT msgid "New element" msgstr "Elementu nuevu" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Esborrar elementu" #: XML_NAME msgid "Name" msgstr "Nome" #: RETRY msgid "Retry" msgstr "Reintentar" #: IGNORE msgid "Ignore" msgstr "Ignorar" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "¡Data incorreuta!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "¡Númberu incorreutu!" #: NONE msgid "None" msgstr "Dengún" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "E#127" #: SELECT_ALL msgid "Select all" msgstr "Esbillar too" #: SELECT_NONE msgid "Clear selection" msgstr "Desfacer esbiya" #: WIDTH msgid "Width:" msgstr "Anchor:" #: HEIGHT msgid "Height:" msgstr "Altor:" #: BROWSE_FILES msgid "Browse files..." msgstr "Guetar ficheru..." #: VERSION msgid "version" msgstr "versión" #: ABOUT msgid "About..." msgstr "Tocante a..." #: YES_TO_ALL msgid "Yes to all" msgstr "Sí a toos" #: NO_TO_ALL msgid "No to all" msgstr "Non a toos" #: SAVE msgid "Save" msgstr "Guardar" #: OPEN msgid "Open" msgstr "Abrir" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Abrir el ficheru seleicionáu" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Guardar el ficheru especificáu" #: SAVING msgid "saving..." msgstr "guardando..." #: SAVING_FILE msgid "Saving file" msgstr "Guardando'l ficheru" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_bs.po000066400000000000000000000126551335566474600237240ustar00rootroot00000000000000# Bosnian translation for jclic # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-05-18 20:54+0000\n" "Last-Translator: Meliha Gadara \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "GREŠKA" #: OK msgid "OK" msgstr "Uredu" #: YES msgid "Yes" msgstr "Da" #: NO msgid "No" msgstr "Ne" #: DELETE msgid "Delete" msgstr "Obrisati" #: PASTE msgid "Paste" msgstr "Zalijepi" #: CUT msgid "Cut" msgstr "Izreži" #: COPY msgid "Copy" msgstr "Kopiraj" #: FILE_SAVE msgid "Save file" msgstr "Spremi datoteku" #: CONFIRM msgid "Please confirm" msgstr "Molimo vas, potvrdite" #: FILE_OPEN msgid "Open file" msgstr "Otvori datoteku" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Folder" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Lozinka:" #: WARNING msgid "Warning!" msgstr "Upozorenje!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Ne može biti pročitano!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Ne postoji!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Samo za čitanje. Ne može se ponovo napisati!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Da li želite prepisati preko postojećeg?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Da li želite prepisati preko postojećeg?" #: FILE_EXISTS msgid "already exists on your system." msgstr "već postoji u vašem sistemu." #: FILE_DIR_BEG msgid "The folder" msgstr "Folder" #: FILE_BEG msgid "The file" msgstr "Datoteka" #: UNNAMED msgid "Unnamed" msgstr "Neimenovano" #: FILE_ERR_READING msgid "Error reading file" msgstr "Greška kod otvaranje datoteke" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Greška pri spremanju datoteke" #: FILE_FIND msgid "Find file" msgstr "Nađi datoteku" #: FILE_ERR_READONLY msgid "is read-only." msgstr "je samo za čitanje." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "postoji. Da li želite pisati preko?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "je nečitljivo." #: FILE_ERR_BEG msgid "File" msgstr "Datoteka" #: LOADING msgid "loading..." msgstr "učitavanje..." #: FALSE msgid "false" msgstr "netačno" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "poruke/provjeritipotpis.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Greška pri pokretanju URL-a" #: URL_ERROR msgid "Error building URL!" msgstr "Greška pri podizanju URL-a" #: QUESTION msgid "Question" msgstr "Pitanje" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Netačna lozinka!" #: TRUE msgid "true" msgstr "tačno" #: CANCEL msgid "Cancel" msgstr "Odustani" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Greška pri brisanju datoteke" #: URL_OPEN msgid "Open URL" msgstr "Otvori URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Greška pri vraćanju datoteke" #: WRITING_FILE msgid "Writing file..." msgstr "Ispisivanje datoteke..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Osobina" #: XML_VALUE msgid "Value" msgstr "Vrijednost" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Ovo polje nije moguće uređivati!" #: XML_TEXT msgid "text" msgstr "tekst" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Dodaj atribut" #: WORKING msgid "Working..." msgstr "Obrada..." #: LOADING_FILE msgid "Loading file" msgstr "Učtavanje datoteke" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Ukloni osobinu" #: XML_ELEMENT msgid "Element" msgstr "Element" #: XML_NEW_ELEMENT msgid "New element" msgstr "Novi element" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Obriši element" #: XML_NAME msgid "Name" msgstr "Naziv" #: RETRY msgid "Retry" msgstr "Ponovi" #: IGNORE msgid "Ignore" msgstr "Ignoriši" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Datum netačan!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Netačan broj!" #: NONE msgid "None" msgstr "Nijedan" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Odaberi sve" #: SELECT_NONE msgid "Clear selection" msgstr "Izbriši odabrano" #: WIDTH msgid "Width:" msgstr "Širina:" #: HEIGHT msgid "Height:" msgstr "Visina:" #: BROWSE_FILES msgid "Browse files..." msgstr "Pretraga datoteka..." #: VERSION msgid "version" msgstr "verzija" #: ABOUT msgid "About..." msgstr "O..." #: YES_TO_ALL msgid "Yes to all" msgstr "Da za sve" #: NO_TO_ALL msgid "No to all" msgstr "Ne za sve" #: SAVE msgid "Save" msgstr "Spremi" #: OPEN msgid "Open" msgstr "Otvoriti" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Otvori odabranu datoteku" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Spremi navedenu datoteku" #: SAVING msgid "saving..." msgstr "spremanje..." #: SAVING_FILE msgid "Saving file" msgstr "Spremanje datoteke" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_ca.po000066400000000000000000000122461335566474600236770ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-18 16:02+0000\n" "Last-Translator: Francesc Busquets \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERROR" #: OK msgid "OK" msgstr "D'acord" #: YES msgid "Yes" msgstr "Sí" #: NO msgid "No" msgstr "No" #: DELETE msgid "Delete" msgstr "Elimina" #: PASTE msgid "Paste" msgstr "Enganxa" #: CUT msgid "Cut" msgstr "Retalla" #: COPY msgid "Copy" msgstr "Copia" #: FILE_SAVE msgid "Save file" msgstr "Desa el fitxer" #: CONFIRM msgid "Please confirm" msgstr "Confirma l'operació" #: FILE_OPEN msgid "Open file" msgstr "Obre el fitxer" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "La carpeta" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Contrasenya:" #: WARNING msgid "Warning!" msgstr "Atenció!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "No es pot llegir!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "No existeix!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "És de només lectura i no pot ser reemplaçat." #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Voleu reemplaçar-la?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Voleu reemplaçar-lo?" #: FILE_EXISTS msgid "already exists on your system." msgstr "ja es troba al vostre ordinador." #: FILE_DIR_BEG msgid "The folder" msgstr "La carpeta" #: FILE_BEG msgid "The file" msgstr "El fitxer" #: UNNAMED msgid "Unnamed" msgstr "Sense nom" #: FILE_ERR_READING msgid "Error reading file" msgstr "Error en llegir el fitxer" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Error en desar el fitxer" #: FILE_FIND msgid "Find file" msgstr "Cerca d'un fitxer" #: FILE_ERR_READONLY msgid "is read-only." msgstr "és de només lectura." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "ja existeix. Voleu sobreescriure'l?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "no es pot llegir." #: FILE_ERR_BEG msgid "File" msgstr "El fitxer" #: LOADING msgid "loading..." msgstr "carregant el programa..." #: FALSE msgid "false" msgstr "fals" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature_ca.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Error en invocar l'URL!" #: URL_ERROR msgid "Error building URL!" msgstr "Error en construir l'URL!" #: QUESTION msgid "Question" msgstr "Pregunta" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Contrasenya incorrecta!" #: TRUE msgid "true" msgstr "cert" #: CANCEL msgid "Cancel" msgstr "Cancel·la" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Error en esborrar el fitxer" #: URL_OPEN msgid "Open URL" msgstr "Obre URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Error en restaurar el fitxer" #: WRITING_FILE msgid "Writing file..." msgstr "Escrivint fitxer..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Atribut" #: XML_VALUE msgid "Value" msgstr "Valor" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Aquest camp no és editable!" #: XML_TEXT msgid "text" msgstr "text" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Afegeix un nou atribut" #: WORKING msgid "Working..." msgstr "Treballant..." #: LOADING_FILE msgid "Loading file" msgstr "Llegint el fitxer" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Suprimeix l'atribut" #: XML_ELEMENT msgid "Element" msgstr "Element" #: XML_NEW_ELEMENT msgid "New element" msgstr "Nou element" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Elimina l'element" #: XML_NAME msgid "Name" msgstr "Nom" #: RETRY msgid "Retry" msgstr "Reintenta" #: IGNORE msgid "Ignore" msgstr "Ignora" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Data incorrecta!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Nombre incorrecte!" #: NONE msgid "None" msgstr "Cap" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "NV" #: DELETE_keys msgid "D#127" msgstr "E#127" #: SELECT_ALL msgid "Select all" msgstr "Selecciona-ho tot" #: SELECT_NONE msgid "Clear selection" msgstr "Desfés la selecció" #: WIDTH msgid "Width:" msgstr "Amplada:" #: HEIGHT msgid "Height:" msgstr "Alçada:" #: BROWSE_FILES msgid "Browse files..." msgstr "Cerca el fitxer..." #: VERSION msgid "version" msgstr "versió" #: ABOUT msgid "About..." msgstr "Quant a..." #: YES_TO_ALL msgid "Yes to all" msgstr "Sí a tots" #: NO_TO_ALL msgid "No to all" msgstr "No a tots" #: SAVE msgid "Save" msgstr "Desa" #: OPEN msgid "Open" msgstr "Obre" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Obre el fitxer seleccionat" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Desa el fitxer especificat" #: SAVING msgid "saving..." msgstr "desant..." #: SAVING_FILE msgid "Saving file" msgstr "Desant el fitxer" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_cs.po000066400000000000000000000125401335566474600237160ustar00rootroot00000000000000# Czech translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-02 04:39+0000\n" "Last-Translator: David Kolibáč \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "CHYBA" #: OK msgid "OK" msgstr "OK" #: YES msgid "Yes" msgstr "Ano" #: NO msgid "No" msgstr "Ne" #: DELETE msgid "Delete" msgstr "Smazat" #: PASTE msgid "Paste" msgstr "Vložit" #: CUT msgid "Cut" msgstr "Vyjmout" #: COPY msgid "Copy" msgstr "Kopírovat" #: FILE_SAVE msgid "Save file" msgstr "Uložit soubor" #: CONFIRM msgid "Please confirm" msgstr "Prosím potvrďte" #: FILE_OPEN msgid "Open file" msgstr "Otevřít soubor" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Složka" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Heslo:" #: WARNING msgid "Warning!" msgstr "Varování!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Nelze přečíst!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Neexistuje!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Je pouze pro čtení. Nelze ho přepsat!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Chcete ho přepsat?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Chcete ho přepsat?" #: FILE_EXISTS msgid "already exists on your system." msgstr "již existuje na vašem systému" #: FILE_DIR_BEG msgid "The folder" msgstr "Složka" #: FILE_BEG msgid "The file" msgstr "Soubor" #: UNNAMED msgid "Unnamed" msgstr "Nepojmenovaný" #: FILE_ERR_READING msgid "Error reading file" msgstr "Chyba při čtení souboru" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Chyba při ukládání souboru" #: FILE_FIND msgid "Find file" msgstr "Najít soubor" #: FILE_ERR_READONLY msgid "is read-only." msgstr "je pouze pro čtení." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "existuje. Chcete ho přepsat?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "není čitelný." #: FILE_ERR_BEG msgid "File" msgstr "Soubor" #: LOADING msgid "loading..." msgstr "načítá se..." #: FALSE msgid "false" msgstr "nepravda" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Chyba při načítání URL" #: URL_ERROR msgid "Error building URL!" msgstr "Chyba při vytváření URL!" #: QUESTION msgid "Question" msgstr "Otázka" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Chybné heslo!" #: TRUE msgid "true" msgstr "pravda" #: CANCEL msgid "Cancel" msgstr "Zrušit" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Chyba při mazání souboru" #: URL_OPEN msgid "Open URL" msgstr "Otevřít URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Chyba při obnovení souboru" #: WRITING_FILE msgid "Writing file..." msgstr "Soubor je zapisován..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Vlastnost" #: XML_VALUE msgid "Value" msgstr "Hodnota" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Toto pole není editovatelné!" #: XML_TEXT msgid "text" msgstr "text" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Přidat atribut" #: WORKING msgid "Working..." msgstr "Pracuje se..." #: LOADING_FILE msgid "Loading file" msgstr "Soubor je nahráván" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Smazat atribut" #: XML_ELEMENT msgid "Element" msgstr "Prvek" #: XML_NEW_ELEMENT msgid "New element" msgstr "Nový prvek" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Smazat prvek" #: XML_NAME msgid "Name" msgstr "Název" #: RETRY msgid "Retry" msgstr "Zkusit znovu" #: IGNORE msgid "Ignore" msgstr "Ignorovat" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Nesprávná data!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Nesprávné číslo!" #: NONE msgid "None" msgstr "Nic" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Vybrat vše" #: SELECT_NONE msgid "Clear selection" msgstr "Zrušit výběr" #: WIDTH msgid "Width:" msgstr "Šířka:" #: HEIGHT msgid "Height:" msgstr "Výška:" #: BROWSE_FILES msgid "Browse files..." msgstr "Vybrat soubory..." #: VERSION msgid "version" msgstr "verze" #: ABOUT msgid "About..." msgstr "O aplikaci..." #: YES_TO_ALL msgid "Yes to all" msgstr "Ano všem" #: NO_TO_ALL msgid "No to all" msgstr "Ne všem" #: SAVE msgid "Save" msgstr "Uložit" #: OPEN msgid "Open" msgstr "Otevřít" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Otevřít vybraný soubor" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Uložit vybraný soubor" #: SAVING msgid "saving..." msgstr "ukládá se..." #: SAVING_FILE msgid "Saving file" msgstr "Soubor je ukládán" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_de.po000066400000000000000000000122751335566474600237060ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2014-05-27 17:00+0000\n" "Last-Translator: Tobias Bannert \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "Fehler" #: OK msgid "OK" msgstr "OK" #: YES msgid "Yes" msgstr "Ja" #: NO msgid "No" msgstr "Nein" #: DELETE msgid "Delete" msgstr "Löschen" #: PASTE msgid "Paste" msgstr "Einfügen" #: CUT msgid "Cut" msgstr "Ausschneiden" #: COPY msgid "Copy" msgstr "Kopieren" #: FILE_SAVE msgid "Save file" msgstr "Datei speichern" #: CONFIRM msgid "Please confirm" msgstr "Bestätigen" #: FILE_OPEN msgid "Open file" msgstr "Datei öffnen" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Ordner" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Passwort:" #: WARNING msgid "Warning!" msgstr "Warnung!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Kann nicht gelesen werden!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Nicht vorhanden!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Schreibgeschützt. Kann nicht überschrieben werden." #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Überschreiben?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Überschreiben?" #: FILE_EXISTS msgid "already exists on your system." msgstr "bereits vorhanden." #: FILE_DIR_BEG msgid "The folder" msgstr "Ordner" #: FILE_BEG msgid "The file" msgstr "Datei" #: UNNAMED msgid "Unnamed" msgstr "Ohne Namen" #: FILE_ERR_READING msgid "Error reading file" msgstr "Fehler beim Lesen der Datei" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Fehler beim Speichern der Datei" #: FILE_FIND msgid "Find file" msgstr "Datei suchen" #: FILE_ERR_READONLY msgid "is read-only." msgstr "schreibgeschützt." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "bereits vorhanden. Überschreiben?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "kann nicht gelesen werden." #: FILE_ERR_BEG msgid "File" msgstr "Datei" #: LOADING msgid "loading..." msgstr "wird geladen..." #: FALSE msgid "false" msgstr "falsch" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Fehler beim Aufrufen des URL" #: URL_ERROR msgid "Error building URL!" msgstr "Falscher URL!" #: QUESTION msgid "Question" msgstr "Frage" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Falsches Passwort!" #: TRUE msgid "true" msgstr "richtig" #: CANCEL msgid "Cancel" msgstr "Abbrechen" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Fehler beim Löschen der Datei" #: URL_OPEN msgid "Open URL" msgstr "Adresse öffnen" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Fehler beim Wiederherstellen der Datei." #: WRITING_FILE msgid "Writing file..." msgstr "Datei wird erstellt..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Eigenschaft" #: XML_VALUE msgid "Value" msgstr "Wert" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Feld kann nicht bearbeitet werden!" #: XML_TEXT msgid "text" msgstr "Text" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Eigenschaft hinzufügen" #: WORKING msgid "Working..." msgstr "Wird bearbeitet …" #: LOADING_FILE msgid "Loading file" msgstr "Datei wird geladen" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Eigenschaft löschen" #: XML_ELEMENT msgid "Element" msgstr "Element" #: XML_NEW_ELEMENT msgid "New element" msgstr "Neues Element" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Element löschen" #: XML_NAME msgid "Name" msgstr "Name" #: RETRY msgid "Retry" msgstr "Noch einmal versuchen" #: IGNORE msgid "Ignore" msgstr "Ignorieren" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Falsches Datum!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Falsche Zahl!" #: NONE msgid "None" msgstr "Keine" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Alle auswählen" #: SELECT_NONE msgid "Clear selection" msgstr "Auswahl löschen" #: WIDTH msgid "Width:" msgstr "Breite:" #: HEIGHT msgid "Height:" msgstr "Höhe:" #: BROWSE_FILES msgid "Browse files..." msgstr "Dateien durchsuchen..." #: VERSION msgid "version" msgstr "Version" #: ABOUT msgid "About..." msgstr "Über …" #: YES_TO_ALL msgid "Yes to all" msgstr "Alle auswählen" #: NO_TO_ALL msgid "No to all" msgstr "Keine von allen" #: SAVE msgid "Save" msgstr "Speichern" #: OPEN msgid "Open" msgstr "Öffnen" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Ausgewählte Datei öffnen" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Ausgewählte Datei speichern" #: SAVING msgid "saving..." msgstr "Speichern..." #: SAVING_FILE msgid "Saving file" msgstr "Datei wird gespeichert" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_el.po000066400000000000000000000150201335566474600237050ustar00rootroot00000000000000# Greek translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-02-18 19:52+0000\n" "Last-Translator: Yannis Kaskamanidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ΣΦΑΛΜΑ" #: OK msgid "OK" msgstr "Εντάξει" #: YES msgid "Yes" msgstr "Ναι" #: NO msgid "No" msgstr "Όχι" #: DELETE msgid "Delete" msgstr "Διαγραφή" #: PASTE msgid "Paste" msgstr "Επικόλληση" #: CUT msgid "Cut" msgstr "Αποκοπή" #: COPY msgid "Copy" msgstr "Αντιγραφή" #: FILE_SAVE msgid "Save file" msgstr "Αποθήκευση αρχείου" #: CONFIRM msgid "Please confirm" msgstr "Παρακαλώ επιβεβαιώστε" #: FILE_OPEN msgid "Open file" msgstr "Άνοιγμα αρχείου" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Φάκελος" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Κωδικός πρόσβασης:" #: WARNING msgid "Warning!" msgstr "Προειδοποίηση!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Αδύνατη η ανάγνωσή του!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Δεν υπάρχει!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Είναι μόνο για ανάγνωση. Αδύνατη η αντικατάστασή του!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Θέλετε να το αντικαταστήσετε;" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Θέλετε να το αντικαταστήσετε;" #: FILE_EXISTS msgid "already exists on your system." msgstr "υπάρχει ήδη στο σύστημά σας." #: FILE_DIR_BEG msgid "The folder" msgstr "Ο φάκελος" #: FILE_BEG msgid "The file" msgstr "Το αρχείο" #: UNNAMED msgid "Unnamed" msgstr "Ανώνυμο" #: FILE_ERR_READING msgid "Error reading file" msgstr "Σφάλμα ανάγνωσης αρχείου" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Σφάλμα κατά την αποθήκευση του αρχείου" #: FILE_FIND msgid "Find file" msgstr "Εύρεση αρχείου" #: FILE_ERR_READONLY msgid "is read-only." msgstr "είναι μόνο για ανάγνωση." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "υπάρχει. Θέλετε να το αντικαταστήσετε;" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "είναι μη αναγνώσιμο." #: FILE_ERR_BEG msgid "File" msgstr "Αρχείο" #: LOADING msgid "loading..." msgstr "φόρτωση..." #: FALSE msgid "false" msgstr "ψευδές" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Σφάλμα φόρτωσης URL" #: URL_ERROR msgid "Error building URL!" msgstr "Σφάλμα δημιουργίας URL!" #: QUESTION msgid "Question" msgstr "Ερώτηση" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Λανθασμένος κωδικός πρόσβασης!" #: TRUE msgid "true" msgstr "αληθές" #: CANCEL msgid "Cancel" msgstr "Άκυρο" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Σφάλμα κατά τη διαγραφή του αρχείου" #: URL_OPEN msgid "Open URL" msgstr "Άνοιγμα URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Σφάλμα κατά την αποκατάσταση του αρχείου" #: WRITING_FILE msgid "Writing file..." msgstr "Εγγραφή αρχείου..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Χαρακτηριστικό" #: XML_VALUE msgid "Value" msgstr "Τιμή" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Αυτό το πεδίο δεν είναι επεξεργάσιμο!" #: XML_TEXT msgid "text" msgstr "κείμενο" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Προσθήκη χαρακτηριστικού" #: WORKING msgid "Working..." msgstr "Εργασία..." #: LOADING_FILE msgid "Loading file" msgstr "Φόρτωση αρχείου" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Διαγραφή χαρακτηριστικού" #: XML_ELEMENT msgid "Element" msgstr "Στοιχείο" #: XML_NEW_ELEMENT msgid "New element" msgstr "Νέο στοιχείο" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Διαγραφή στοιχείου" #: XML_NAME msgid "Name" msgstr "Όνομα" #: RETRY msgid "Retry" msgstr "Επανάληψη" #: IGNORE msgid "Ignore" msgstr "Παράβλεψη" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Λανθασμένα δεδομένα!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Λανθασμένος αριθμός!" #: NONE msgid "None" msgstr "Κανένα" #: COPY_keys msgid "CC" msgstr "Κοινοποίηση" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Επιλογή όλων" #: SELECT_NONE msgid "Clear selection" msgstr "Καθαρισμός επιλογής" #: WIDTH msgid "Width:" msgstr "Πλάτος:" #: HEIGHT msgid "Height:" msgstr "Ύψος:" #: BROWSE_FILES msgid "Browse files..." msgstr "Περιήγηση αρχείων..." #: VERSION msgid "version" msgstr "έκδοση" #: ABOUT msgid "About..." msgstr "Σχετικά..." #: YES_TO_ALL msgid "Yes to all" msgstr "Ναι σε όλα" #: NO_TO_ALL msgid "No to all" msgstr "Όχι σε όλα" #: SAVE msgid "Save" msgstr "Αποθήκευση" #: OPEN msgid "Open" msgstr "Άνοιγμα" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Άνοιγμα επιλεγμένου αρχείου" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Αποθήκευση καθορισμένου αρχείου" #: SAVING msgid "saving..." msgstr "αποθήκευσ..." #: SAVING_FILE msgid "Saving file" msgstr "Αποθήκευση αρχείου" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_es.po000066400000000000000000000123211335566474600237150ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-01-30 07:08+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERROR" #: OK msgid "OK" msgstr "Aceptar" #: YES msgid "Yes" msgstr "Sí" #: NO msgid "No" msgstr "No" #: DELETE msgid "Delete" msgstr "Eliminar" #: PASTE msgid "Paste" msgstr "Pegar" #: CUT msgid "Cut" msgstr "Recortar" #: COPY msgid "Copy" msgstr "Copiar" #: FILE_SAVE msgid "Save file" msgstr "Guardar archivo" #: CONFIRM msgid "Please confirm" msgstr "Confirmar operación" #: FILE_OPEN msgid "Open file" msgstr "Abrir archivo" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "La carpeta" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Contraseña:" #: WARNING msgid "Warning!" msgstr "¡Atención!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "No puede ser leído!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "No existe!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Es de solo lectura y no puede ser reemplazado." #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "¿Desea reemplazarla?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "¿Desea reemplazarlo?" #: FILE_EXISTS msgid "already exists on your system." msgstr "ya se encuentra en su ordenador." #: FILE_DIR_BEG msgid "The folder" msgstr "La carpeta" #: FILE_BEG msgid "The file" msgstr "El archivo" #: UNNAMED msgid "Unnamed" msgstr "Sin nombre" #: FILE_ERR_READING msgid "Error reading file" msgstr "Error al leer el archivo" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Error al grabar el archivo" #: FILE_FIND msgid "Find file" msgstr "Buscar archivo" #: FILE_ERR_READONLY msgid "is read-only." msgstr "es de solo lectura." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "ya existe. ¿Desea sobreescribirlo?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "no se puede leer." #: FILE_ERR_BEG msgid "File" msgstr "El archivo" #: LOADING msgid "loading..." msgstr "cargando…" #: FALSE msgid "false" msgstr "falso" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature_es.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Error al invocar la URL!" #: URL_ERROR msgid "Error building URL!" msgstr "¡Error al construir la URL!" #: QUESTION msgid "Question" msgstr "Pregunta" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "¡Contraseña incorrecta!" #: TRUE msgid "true" msgstr "verdadero" #: CANCEL msgid "Cancel" msgstr "Cancelar" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Error al borrar el archivo" #: URL_OPEN msgid "Open URL" msgstr "Abrir URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Error al restaurar el archivo" #: WRITING_FILE msgid "Writing file..." msgstr "Escribiendo archivo..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Atributo" #: XML_VALUE msgid "Value" msgstr "Valor" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Este campo no es editable!" #: XML_TEXT msgid "text" msgstr "texto" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Añadir un nuevo atributo" #: WORKING msgid "Working..." msgstr "Trabajando..." #: LOADING_FILE msgid "Loading file" msgstr "Leyendo el archivo" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Eliminar el atributo" #: XML_ELEMENT msgid "Element" msgstr "Elemento" #: XML_NEW_ELEMENT msgid "New element" msgstr "Nuevo elemento" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Eliminar elemento" #: XML_NAME msgid "Name" msgstr "Nombre" #: RETRY msgid "Retry" msgstr "Reintentar" #: IGNORE msgid "Ignore" msgstr "Ignorar" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "¡Fecha incorrecta!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "¡Número incorrecto!" #: NONE msgid "None" msgstr "Ninguno" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "E#127" #: SELECT_ALL msgid "Select all" msgstr "Seleccionar todo" #: SELECT_NONE msgid "Clear selection" msgstr "Deshacer seleccion" #: WIDTH msgid "Width:" msgstr "Anchura:" #: HEIGHT msgid "Height:" msgstr "Altura:" #: BROWSE_FILES msgid "Browse files..." msgstr "Buscar archivo..." #: VERSION msgid "version" msgstr "versión" #: ABOUT msgid "About..." msgstr "Acerca de..." #: YES_TO_ALL msgid "Yes to all" msgstr "Sí a todos" #: NO_TO_ALL msgid "No to all" msgstr "No a todos" #: SAVE msgid "Save" msgstr "Guardar" #: OPEN msgid "Open" msgstr "Abrir" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Abrir el archivo seleccionado" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Guardar el archivo especificado" #: SAVING msgid "saving..." msgstr "guardando..." #: SAVING_FILE msgid "Saving file" msgstr "Guardando el archivo" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_eu.po000066400000000000000000000127071335566474600237270ustar00rootroot00000000000000# Basque translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-02-18 11:20+0000\n" "Last-Translator: Pedro Lonbide \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERROREA" #: OK msgid "OK" msgstr "Ados" #: YES msgid "Yes" msgstr "Bai" #: NO msgid "No" msgstr "Ez" #: DELETE msgid "Delete" msgstr "Ezabatu" #: PASTE msgid "Paste" msgstr "Itsatsi" #: CUT msgid "Cut" msgstr "Ebaki" #: COPY msgid "Copy" msgstr "Kopiatu" #: FILE_SAVE msgid "Save file" msgstr "Gorde fitxategia" #: CONFIRM msgid "Please confirm" msgstr "Baieztatu eragiketa" #: FILE_OPEN msgid "Open file" msgstr "Ireki fitxategia" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Direktorioa" #: URL msgid "URL:" msgstr "URL-a:" #: PASSWORD msgid "Password:" msgstr "Pasahitza:" #: WARNING msgid "Warning!" msgstr "Kontuz!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Ezin da irakurri!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Ez dago!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Irakurtzeko bakarrik. Ezin da bertan idatzi!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Gainidatzi nahi al duzu?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Gainidatzi nahi al duzu?" #: FILE_EXISTS msgid "already exists on your system." msgstr "dagoeneko bada zure sisteman" #: FILE_DIR_BEG msgid "The folder" msgstr "Direktorioa" #: FILE_BEG msgid "The file" msgstr "Fitxategia" #: UNNAMED msgid "Unnamed" msgstr "Izenbagea" #: FILE_ERR_READING msgid "Error reading file" msgstr "Errorea fitxategia irakurtzean" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Errorea fitxategia gordetzean" #: FILE_FIND msgid "Find file" msgstr "Bilatu fitxategia" #: FILE_ERR_READONLY msgid "is read-only." msgstr "irakurri baino ezin da." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "badago. Berridatzi egin nahi al duzu?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "ez da irakurtzeko modukoa." #: FILE_ERR_BEG msgid "File" msgstr "Fitxategia" #: LOADING msgid "loading..." msgstr "kargatzen..." #: FALSE msgid "false" msgstr "faltsua" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Errorea URL-a abiaraztean" #: URL_ERROR msgid "Error building URL!" msgstr "Errorea URL-a eraikitzean!" #: QUESTION msgid "Question" msgstr "Galdera" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Pasahitza ez da zuzena!" #: TRUE msgid "true" msgstr "egia" #: CANCEL msgid "Cancel" msgstr "Utzi" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Errorea fitxategia ezabatzean" #: URL_OPEN msgid "Open URL" msgstr "Ireki URL-a" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Errorea fitxategia berreskuratzean" #: WRITING_FILE msgid "Writing file..." msgstr "Fitxategia idazten..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Atributua" #: XML_VALUE msgid "Value" msgstr "Balorea" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Eremu hau ezin da editatu!" #: XML_TEXT msgid "text" msgstr "testua" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Gehitu atributua" #: WORKING msgid "Working..." msgstr "Lanean..." #: LOADING_FILE msgid "Loading file" msgstr "Fitxategia kargatzen" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Ezabatu atributua" #: XML_ELEMENT msgid "Element" msgstr "Elementua" #: XML_NEW_ELEMENT msgid "New element" msgstr "Elementu berria" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Ezabatu elementua" #: XML_NAME msgid "Name" msgstr "Izena" #: RETRY msgid "Retry" msgstr "Berriz saiatu" #: IGNORE msgid "Ignore" msgstr "Alde batera uzi" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Data ez da zuzena!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Zenbakia ez da zuzena!" #: NONE msgid "None" msgstr "Bat ere ez" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Aukeratu guztiak" #: SELECT_NONE msgid "Clear selection" msgstr "Garbitu aukera" #: WIDTH msgid "Width:" msgstr "Zabalera" #: HEIGHT msgid "Height:" msgstr "Altuera:" #: BROWSE_FILES msgid "Browse files..." msgstr "Arakatu fitxategiak..." #: VERSION msgid "version" msgstr "bertsioa" #: ABOUT msgid "About..." msgstr "Honi buruz..." #: YES_TO_ALL msgid "Yes to all" msgstr "Bai guztiari" #: NO_TO_ALL msgid "No to all" msgstr "Ez guztiari" #: SAVE msgid "Save" msgstr "Gorde" #: OPEN msgid "Open" msgstr "Ireki" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Ireki aukeratutako fitxategia" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Gorde zehaztutako fitxategia" #: SAVING msgid "saving..." msgstr "gordetzen..." #: SAVING_FILE msgid "Saving file" msgstr "Fitxategia gordetzen" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_fr.po000066400000000000000000000124111335566474600237150ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-11-27 08:20+0000\n" "Last-Translator: Eliovir \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERREUR" #: OK msgid "OK" msgstr "OK" #: YES msgid "Yes" msgstr "OUI" #: NO msgid "No" msgstr "Non" #: DELETE msgid "Delete" msgstr "Supprimer" #: PASTE msgid "Paste" msgstr "Coller" #: CUT msgid "Cut" msgstr "Couper" #: COPY msgid "Copy" msgstr "Copier" #: FILE_SAVE msgid "Save file" msgstr "Enregistrer fichier" #: CONFIRM msgid "Please confirm" msgstr "Confirmer" #: FILE_OPEN msgid "Open file" msgstr "Ouvrir fichier" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Dossier" #: URL msgid "URL:" msgstr "URL\\:" #: PASSWORD msgid "Password:" msgstr "Mot de passe :" #: WARNING msgid "Warning!" msgstr "Attention !" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Impossible de lire !" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "N'existe pas\\!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Est en lecture seule. Ne peut être écrasé\\!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Voulez-vous l'écraser ?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Voulez-vous l'écraser ?" #: FILE_EXISTS msgid "already exists on your system." msgstr "existe déjà sur votre système." #: FILE_DIR_BEG msgid "The folder" msgstr "Le dossier" #: FILE_BEG msgid "The file" msgstr "Le fichier" #: UNNAMED msgid "Unnamed" msgstr "Sans nom" #: FILE_ERR_READING msgid "Error reading file" msgstr "Erreur de lecture du fichier" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Erreur d'enregistrement du fichier" #: FILE_FIND msgid "Find file" msgstr "Chercher fichier" #: FILE_ERR_READONLY msgid "is read-only." msgstr "est en lecture seule." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "existe. Voulez-vous l'écraser ?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "est illisible." #: FILE_ERR_BEG msgid "File" msgstr "Fichier" #: LOADING msgid "loading..." msgstr "chargement..." #: FALSE msgid "false" msgstr "faux" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Erreur de lancement de l'URL" #: URL_ERROR msgid "Error building URL!" msgstr "Erreur de construction de l'URL\\!" #: QUESTION msgid "Question" msgstr "Question" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Mot de passe incorrect\\!" #: TRUE msgid "true" msgstr "vrai" #: CANCEL msgid "Cancel" msgstr "Annuler" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Erreur lors de la suppression du fichier" #: URL_OPEN msgid "Open URL" msgstr "Ouvrir URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Erreur lors de la restauration du fichier" #: WRITING_FILE msgid "Writing file..." msgstr "Ecriture du fichier..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Attribut" #: XML_VALUE msgid "Value" msgstr "Valeur" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Ce champ n'est pas éditable\\!" #: XML_TEXT msgid "text" msgstr "texte" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Ajouter attribut" #: WORKING msgid "Working..." msgstr "Travail en cours..." #: LOADING_FILE msgid "Loading file" msgstr "Chargement du fichier" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Supprimer attribut" #: XML_ELEMENT msgid "Element" msgstr "Elément" #: XML_NEW_ELEMENT msgid "New element" msgstr "Nouvel élément" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Supprimer élément" #: XML_NAME msgid "Name" msgstr "Nom" #: RETRY msgid "Retry" msgstr "Ressayer" #: IGNORE msgid "Ignore" msgstr "Ignorer" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Date incorrecte\\!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Nombre incorrecte\\!" #: NONE msgid "None" msgstr "Aucun" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Sélectionner tout" #: SELECT_NONE msgid "Clear selection" msgstr "Effacer sélection" #: WIDTH msgid "Width:" msgstr "Largeur\\:" #: HEIGHT msgid "Height:" msgstr "Hauteur\\:" #: BROWSE_FILES msgid "Browse files..." msgstr "Explorer fichier..." #: VERSION msgid "version" msgstr "version" #: ABOUT msgid "About..." msgstr "A propos de..." #: YES_TO_ALL msgid "Yes to all" msgstr "Oui pour tous" #: NO_TO_ALL msgid "No to all" msgstr "Non pour tous" #: SAVE msgid "Save" msgstr "Enregistrer" #: OPEN msgid "Open" msgstr "Ouvrir" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Ouvrir le fichier sélectionné" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Enregistrer le fichier spécifié" #: SAVING msgid "saving..." msgstr "enregistrement..." #: SAVING_FILE msgid "Saving file" msgstr "Enregistrement du fichier" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_gl.po000066400000000000000000000123141335566474600237120ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-01-21 21:50+0000\n" "Last-Translator: Xosé \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERRO" #: OK msgid "OK" msgstr "Aceptar" #: YES msgid "Yes" msgstr "Si" #: NO msgid "No" msgstr "Non" #: DELETE msgid "Delete" msgstr "Eliminar" #: PASTE msgid "Paste" msgstr "Pegar" #: CUT msgid "Cut" msgstr "Cortar" #: COPY msgid "Copy" msgstr "Copiar" #: FILE_SAVE msgid "Save file" msgstr "Gardar arquivo" #: CONFIRM msgid "Please confirm" msgstr "Confirmar" #: FILE_OPEN msgid "Open file" msgstr "Abrir un ficheiro" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Cartafol" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Contrasinal:" #: WARNING msgid "Warning!" msgstr "Coidado!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Non se pode ler!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Non existe!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "É de só lectura e non se pode sobrescribir!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Quer sobrescribila?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Quer sobrescribilo?" #: FILE_EXISTS msgid "already exists on your system." msgstr "xa existe no sistema" #: FILE_DIR_BEG msgid "The folder" msgstr "O cartafol" #: FILE_BEG msgid "The file" msgstr "O ficheiro" #: UNNAMED msgid "Unnamed" msgstr "Sen nome" #: FILE_ERR_READING msgid "Error reading file" msgstr "Produciuse un erro ao ler o ficheiro" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Produciuse un erro ao gardar o ficheiro" #: FILE_FIND msgid "Find file" msgstr "Buscar ficheiro" #: FILE_ERR_READONLY msgid "is read-only." msgstr "é de só lectura" #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "xa existe. Quere sobrescribilo?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "non se pode ler" #: FILE_ERR_BEG msgid "File" msgstr "Ficheiro" #: LOADING msgid "loading..." msgstr "Cargando o programa..." #: FALSE msgid "false" msgstr "falso" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature_gl.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Produciuse un erro ao chamar a URL" #: URL_ERROR msgid "Error building URL!" msgstr "Produciuse un erro ao construír a URL!" #: QUESTION msgid "Question" msgstr "Pregunta" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Contrasinal incorrecto!" #: TRUE msgid "true" msgstr "certo" #: CANCEL msgid "Cancel" msgstr "Cancelar" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Produciuse un erro ao eliminar o ficheiro" #: URL_OPEN msgid "Open URL" msgstr "Abrir URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Produciuse un erro ao restaurar o arquivo" #: WRITING_FILE msgid "Writing file..." msgstr "Escribindo ficheiro..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Atributo" #: XML_VALUE msgid "Value" msgstr "Valor" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Este campo non é editábel!" #: XML_TEXT msgid "text" msgstr "texto" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Engadir atributo" #: WORKING msgid "Working..." msgstr "Traballando..." #: LOADING_FILE msgid "Loading file" msgstr "Cargando o ficheiro" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Eliminar atributo" #: XML_ELEMENT msgid "Element" msgstr "Elemento" #: XML_NEW_ELEMENT msgid "New element" msgstr "Engadir elemento" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Eliminar elemento" #: XML_NAME msgid "Name" msgstr "Nome" #: RETRY msgid "Retry" msgstr "Tentar de novo" #: IGNORE msgid "Ignore" msgstr "Ignorar" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Data incorrecta!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Número incorrecto!" #: NONE msgid "None" msgstr "Ningún" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "E#127" #: SELECT_ALL msgid "Select all" msgstr "Seleccionar todo" #: SELECT_NONE msgid "Clear selection" msgstr "Limpar a selección" #: WIDTH msgid "Width:" msgstr "Largura:" #: HEIGHT msgid "Height:" msgstr "Altura" #: BROWSE_FILES msgid "Browse files..." msgstr "Examinar ficheiros..." #: VERSION msgid "version" msgstr "versión" #: ABOUT msgid "About..." msgstr "Sobre o..." #: YES_TO_ALL msgid "Yes to all" msgstr "Si a todo" #: NO_TO_ALL msgid "No to all" msgstr "Non a todo" #: SAVE msgid "Save" msgstr "Gardar" #: OPEN msgid "Open" msgstr "Abrir" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Abrir o ficheiro seleccionado" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Gardar o ficheiro especificado" #: SAVING msgid "saving..." msgstr "gardando..." #: SAVING_FILE msgid "Saving file" msgstr "Gardando ficheiro" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_it.po000066400000000000000000000126211335566474600237250ustar00rootroot00000000000000# Italian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-22 17:20+0000\n" "Last-Translator: giomu2 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERRORE" #: OK msgid "OK" msgstr "OK" #: YES msgid "Yes" msgstr "Sì" #: NO msgid "No" msgstr "No" #: DELETE msgid "Delete" msgstr "Cancella" #: PASTE msgid "Paste" msgstr "Incolla" #: CUT msgid "Cut" msgstr "Taglia" #: COPY msgid "Copy" msgstr "Copia" #: FILE_SAVE msgid "Save file" msgstr "Salva file" #: CONFIRM msgid "Please confirm" msgstr "Conferma, per favore" #: FILE_OPEN msgid "Open file" msgstr "Apri file" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Cartella" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Password:" #: WARNING msgid "Warning!" msgstr "Attenzione!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Non è possibile leggerlo" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Non esiste" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "E' in sola lettura. Non può essere sovrascritto!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Vuoi sovrascriverlo?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Vuoi sovrascriverlo?" #: FILE_EXISTS msgid "already exists on your system." msgstr "esiste già nel tuo sistema." #: FILE_DIR_BEG msgid "The folder" msgstr "La cartella" #: FILE_BEG msgid "The file" msgstr "Il file" #: UNNAMED msgid "Unnamed" msgstr "Senza nome" #: FILE_ERR_READING msgid "Error reading file" msgstr "Errore nella lettura del file" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Si è verificato un errore salvando il file" #: FILE_FIND msgid "Find file" msgstr "Trova file" #: FILE_ERR_READONLY msgid "is read-only." msgstr "è in sola lettura" #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "Esiste già. Vuoi sovrascriverlo?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "non è possibile leggerlo" #: FILE_ERR_BEG msgid "File" msgstr "File" #: LOADING msgid "loading..." msgstr "caricamento in corso..." #: FALSE msgid "false" msgstr "falso" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Errore nel lancio dell'URL" #: URL_ERROR msgid "Error building URL!" msgstr "Errore nella creazione dell'URL!" #: QUESTION msgid "Question" msgstr "Domanda" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Password errata!" #: TRUE msgid "true" msgstr "vero" #: CANCEL msgid "Cancel" msgstr "Annulla" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Errore durante l'eliminazione del file" #: URL_OPEN msgid "Open URL" msgstr "Apri URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Errore nel ripristino del file" #: WRITING_FILE msgid "Writing file..." msgstr "File in corso di scrittura" #: XML_ATTRIBUTE msgid "Attribute" msgstr "Attributo" #: XML_VALUE msgid "Value" msgstr "Valore" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Questo campo non è modificabile" #: XML_TEXT msgid "text" msgstr "testo" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Aggiungi attributo" #: WORKING msgid "Working..." msgstr "In esecuzione..." #: LOADING_FILE msgid "Loading file" msgstr "File in caricamento" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Cancella attributo" #: XML_ELEMENT msgid "Element" msgstr "Elemento" #: XML_NEW_ELEMENT msgid "New element" msgstr "Nuovo elemento" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Elimina elemento" #: XML_NAME msgid "Name" msgstr "Nome" #: RETRY msgid "Retry" msgstr "Riprova" #: IGNORE msgid "Ignore" msgstr "Ignora" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Data errata!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Numero errato!" #: NONE msgid "None" msgstr "Nessuno" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Seleziona tutto" #: SELECT_NONE msgid "Clear selection" msgstr "Annulla selezione" #: WIDTH msgid "Width:" msgstr "Larghezza:" #: HEIGHT msgid "Height:" msgstr "Altezza:" #: BROWSE_FILES msgid "Browse files..." msgstr "Esplora file..." #: VERSION msgid "version" msgstr "versione" #: ABOUT msgid "About..." msgstr "Informazioni..." #: YES_TO_ALL msgid "Yes to all" msgstr "Sì a tutto" #: NO_TO_ALL msgid "No to all" msgstr "No a tutto" #: SAVE msgid "Save" msgstr "Salva" #: OPEN msgid "Open" msgstr "Apri" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Apri il file selezionato" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Salva il file specificato" #: SAVING msgid "saving..." msgstr "Salvataggio in corso" #: SAVING_FILE msgid "Saving file" msgstr "Salvataggio file" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_nl.po000066400000000000000000000125731335566474600237300ustar00rootroot00000000000000# Dutch translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-08-11 13:09+0000\n" "Last-Translator: mente \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "FOUT" #: OK msgid "OK" msgstr "Akkoord" #: YES msgid "Yes" msgstr "Ja" #: NO msgid "No" msgstr "Nee" #: DELETE msgid "Delete" msgstr "Verwijderen" #: PASTE msgid "Paste" msgstr "Plakken" #: CUT msgid "Cut" msgstr "Knippen" #: COPY msgid "Copy" msgstr "Kopiëren" #: FILE_SAVE msgid "Save file" msgstr "Bestand opslaan" #: CONFIRM msgid "Please confirm" msgstr "Gelieve te bevestigen" #: FILE_OPEN msgid "Open file" msgstr "Bestand openen" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Map" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Wachtwoord:" #: WARNING msgid "Warning!" msgstr "Waarschuwing!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Kan niet lezen!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Bestaat niet!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Is read-only. Kan niet overschreven worden!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Wilt u dit bestand overschrijven?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Wilt u dit bestand overschrijven?" #: FILE_EXISTS msgid "already exists on your system." msgstr "Bestaat reeds." #: FILE_DIR_BEG msgid "The folder" msgstr "De map" #: FILE_BEG msgid "The file" msgstr "Het bestand" #: UNNAMED msgid "Unnamed" msgstr "Naamloos" #: FILE_ERR_READING msgid "Error reading file" msgstr "Fout bij het lezen van bestand" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Fout bij het bewaren van bestand" #: FILE_FIND msgid "Find file" msgstr "Zoek bestand" #: FILE_ERR_READONLY msgid "is read-only." msgstr "is read-only." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "exists. Wil je het overschrijven?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "is onleesbaar" #: FILE_ERR_BEG msgid "File" msgstr "Bestand" #: LOADING msgid "loading..." msgstr "laden..." #: FALSE msgid "false" msgstr "Onwaar" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "berichten/verifieerhandtekening.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Fout bij starten URL" #: URL_ERROR msgid "Error building URL!" msgstr "Fout bij maken URL" #: QUESTION msgid "Question" msgstr "Vraag" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Verkeer paswoord!" #: TRUE msgid "true" msgstr "waar" #: CANCEL msgid "Cancel" msgstr "Annuleren" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Fout bij verwijderen bestand" #: URL_OPEN msgid "Open URL" msgstr "Url openen" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Fout bij herstellen bestand" #: WRITING_FILE msgid "Writing file..." msgstr "Bestand schrijven..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Attribuut" #: XML_VALUE msgid "Value" msgstr "Waarde" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Dit veld kan je niet wijzigen!" #: XML_TEXT msgid "text" msgstr "tekst" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Attribuut toevoegen" #: WORKING msgid "Working..." msgstr "Bezig..." #: LOADING_FILE msgid "Loading file" msgstr "Bestand inladen" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Attribuut verwijderen" #: XML_ELEMENT msgid "Element" msgstr "Element" #: XML_NEW_ELEMENT msgid "New element" msgstr "Nieuw element" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Verwijder element" #: XML_NAME msgid "Name" msgstr "Naam" #: RETRY msgid "Retry" msgstr "Opnieuw" #: IGNORE msgid "Ignore" msgstr "Negeren" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Verkeerde gegevens!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Verkeer nummer!" #: NONE msgid "None" msgstr "Geen" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Alles selecteren" #: SELECT_NONE msgid "Clear selection" msgstr "Selectie ongedaan maken" #: WIDTH msgid "Width:" msgstr "Breedte:" #: HEIGHT msgid "Height:" msgstr "Hoogte:" #: BROWSE_FILES msgid "Browse files..." msgstr "Doorzoek bestanden..." #: VERSION msgid "version" msgstr "versie" #: ABOUT msgid "About..." msgstr "Info..." #: YES_TO_ALL msgid "Yes to all" msgstr "Ja voor alles" #: NO_TO_ALL msgid "No to all" msgstr "Nee voor alles" #: SAVE msgid "Save" msgstr "Document opslaan" #: OPEN msgid "Open" msgstr "Openen" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Het geselecteerde bestand openen" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Het geselecteerde bestand bewaren" #: SAVING msgid "saving..." msgstr "bewaren..." #: SAVING_FILE msgid "Saving file" msgstr "Bestand bewaren" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_pt.po000066400000000000000000000122221335566474600237310ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-10-08 20:54+0000\n" "Last-Translator: Tiago Silva \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERRO" #: OK msgid "OK" msgstr "OK" #: YES msgid "Yes" msgstr "Sim" #: NO msgid "No" msgstr "Não" #: DELETE msgid "Delete" msgstr "Eliminar" #: PASTE msgid "Paste" msgstr "Colar" #: CUT msgid "Cut" msgstr "Cortar" #: COPY msgid "Copy" msgstr "Copiar" #: FILE_SAVE msgid "Save file" msgstr "Guardar ficheiro" #: CONFIRM msgid "Please confirm" msgstr "Por favor, confirme" #: FILE_OPEN msgid "Open file" msgstr "Abrir ficheiro" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Pasta" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Senha:" #: WARNING msgid "Warning!" msgstr "Atenção!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Erro de leitura!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Não existe!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "É só de leitura e não pode ser substituído." #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Deseja substituí-lo?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Deseja substituí-lo?" #: FILE_EXISTS msgid "already exists on your system." msgstr "já existe no computador." #: FILE_DIR_BEG msgid "The folder" msgstr "A pasta" #: FILE_BEG msgid "The file" msgstr "O ficheiro" #: UNNAMED msgid "Unnamed" msgstr "Sem nome" #: FILE_ERR_READING msgid "Error reading file" msgstr "Erro ao ler o ficheiro" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Erro ao guardar o ficheiro" #: FILE_FIND msgid "Find file" msgstr "Procurar ficheiro" #: FILE_ERR_READONLY msgid "is read-only." msgstr "é só de leitura." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "já existe. Deseja substituí-lo?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "não pode ser lido." #: FILE_ERR_BEG msgid "File" msgstr "Ficheiro" #: LOADING msgid "loading..." msgstr "a carregar..." #: FALSE msgid "false" msgstr "falso" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature_pt.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Erro ao chamar URL!" #: URL_ERROR msgid "Error building URL!" msgstr "Erro ao construir URL!" #: QUESTION msgid "Question" msgstr "Pergunta" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Palavra-chave incorrecta" #: TRUE msgid "true" msgstr "verdadeiro" #: CANCEL msgid "Cancel" msgstr "Cancelar" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Erro ao apagar o ficheiro" #: URL_OPEN msgid "Open URL" msgstr "Abrir URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Erro ao restaurar o ficheiro" #: WRITING_FILE msgid "Writing file..." msgstr "A escrever o ficheiro..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Atributo" #: XML_VALUE msgid "Value" msgstr "Valor" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Este campo não é editável!" #: XML_TEXT msgid "text" msgstr "texto" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Adicionar atributo" #: WORKING msgid "Working..." msgstr "A processar..." #: LOADING_FILE msgid "Loading file" msgstr "A ler ficheiro" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Eliminar atributo" #: XML_ELEMENT msgid "Element" msgstr "Elemento" #: XML_NEW_ELEMENT msgid "New element" msgstr "Novo elemento" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Eliminar elemento" #: XML_NAME msgid "Name" msgstr "Nome" #: RETRY msgid "Retry" msgstr "Tentar novamente" #: IGNORE msgid "Ignore" msgstr "Ignorar" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Data incorrecta!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Número incorrecto!" #: NONE msgid "None" msgstr "Nenhum" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Seleccionar tudo" #: SELECT_NONE msgid "Clear selection" msgstr "Limpar selecção" #: WIDTH msgid "Width:" msgstr "Largura:" #: HEIGHT msgid "Height:" msgstr "Altura:" #: BROWSE_FILES msgid "Browse files..." msgstr "Procurar ficheiros..." #: VERSION msgid "version" msgstr "versão" #: ABOUT msgid "About..." msgstr "Sobre..." #: YES_TO_ALL msgid "Yes to all" msgstr "Sim para todos" #: NO_TO_ALL msgid "No to all" msgstr "Não para todos" #: SAVE msgid "Save" msgstr "Guardar" #: OPEN msgid "Open" msgstr "Abrir" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Abrir o ficheiro seleccionado" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Guardar o ficheiro especificado" #: SAVING msgid "saving..." msgstr "a guardar..." #: SAVING_FILE msgid "Saving file" msgstr "A guardar o ficheiro" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_pt_BR.po000066400000000000000000000122001335566474600243100ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: JClic 0.2.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-02-24 18:09+0000\n" "Last-Translator: Alexandre R Soares \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ERRO" #: OK msgid "OK" msgstr "Aceitar" #: YES msgid "Yes" msgstr "Sim" #: NO msgid "No" msgstr "Não" #: DELETE msgid "Delete" msgstr "Excluir" #: PASTE msgid "Paste" msgstr "Colar" #: CUT msgid "Cut" msgstr "Recortar" #: COPY msgid "Copy" msgstr "Copiar" #: FILE_SAVE msgid "Save file" msgstr "Salvar arquivo" #: CONFIRM msgid "Please confirm" msgstr "Confirmar operação" #: FILE_OPEN msgid "Open file" msgstr "Abrir arquivo" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "A pasta" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Senha:" #: WARNING msgid "Warning!" msgstr "Atenção!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Não pôde ser lido!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Não existe!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "É de somente leitura e não pode ser substituído." #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Deseja substituir?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Deseja substituí-lo?" #: FILE_EXISTS msgid "already exists on your system." msgstr "já existe no computador." #: FILE_DIR_BEG msgid "The folder" msgstr "A pasta" #: FILE_BEG msgid "The file" msgstr "O arquivo" #: UNNAMED msgid "Unnamed" msgstr "Sem nome" #: FILE_ERR_READING msgid "Error reading file" msgstr "Erro ao ler o arquivo" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Erro ao salvar o arquivo" #: FILE_FIND msgid "Find file" msgstr "Buscar arquivo" #: FILE_ERR_READONLY msgid "is read-only." msgstr "é somente leitura." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "já existe. Deseja substituir?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "não pode ser lido." #: FILE_ERR_BEG msgid "File" msgstr "Arquivo" #: LOADING msgid "loading..." msgstr "aguarde..." #: FALSE msgid "false" msgstr "falso" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature_pt_BR.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Erro ao chamar a URL!" #: URL_ERROR msgid "Error building URL!" msgstr "Erro ao construir a URL!" #: QUESTION msgid "Question" msgstr "Pergunta" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Senha incorreta!" #: TRUE msgid "true" msgstr "verdadeiro" #: CANCEL msgid "Cancel" msgstr "Cancelar" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Erro ao apagar o arquivo" #: URL_OPEN msgid "Open URL" msgstr "Abrir URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Erro ao restaurar o arquivo" #: WRITING_FILE msgid "Writing file..." msgstr "A escrever arquivo..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Atributo" #: XML_VALUE msgid "Value" msgstr "Valor" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Este campo não é editável!" #: XML_TEXT msgid "text" msgstr "texto" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Adicionar um novo atributo" #: WORKING msgid "Working..." msgstr "Trabalhando..." #: LOADING_FILE msgid "Loading file" msgstr "Lendo o arquivo" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Eliminar o atributo" #: XML_ELEMENT msgid "Element" msgstr "Elemento" #: XML_NEW_ELEMENT msgid "New element" msgstr "Novo elemento" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Excluir elemento" #: XML_NAME msgid "Name" msgstr "Nome" #: RETRY msgid "Retry" msgstr "Refazer" #: IGNORE msgid "Ignore" msgstr "Ignorar" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Data incorreta!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Número incorreto!" #: NONE msgid "None" msgstr "Nenhum" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "E#127" #: SELECT_ALL msgid "Select all" msgstr "Selecionar tudo" #: SELECT_NONE msgid "Clear selection" msgstr "Desfazer seleção" #: WIDTH msgid "Width:" msgstr "Largura:" #: HEIGHT msgid "Height:" msgstr "Altura:" #: BROWSE_FILES msgid "Browse files..." msgstr "Buscar arquivo..." #: VERSION msgid "version" msgstr "versão" #: ABOUT msgid "About..." msgstr "Sobre ..." #: YES_TO_ALL msgid "Yes to all" msgstr "Sim a todos" #: NO_TO_ALL msgid "No to all" msgstr "Não a todos" #: SAVE msgid "Save" msgstr "Salvar" #: OPEN msgid "Open" msgstr "Abrir" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Abrir o arquivo seleccionado" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Salvar o arquivo especificado" #: SAVING msgid "saving..." msgstr "salvando..." #: SAVING_FILE msgid "Saving file" msgstr "Salvando o arquivo" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_ru.po000066400000000000000000000142441335566474600237420ustar00rootroot00000000000000# Russian translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2008-05-28 07:10+0000\n" "Last-Translator: Nkolay Parukhin \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "ОШИБКА" #: OK msgid "OK" msgstr "OK" #: YES msgid "Yes" msgstr "Да" #: NO msgid "No" msgstr "Нет" #: DELETE msgid "Delete" msgstr "Удалить" #: PASTE msgid "Paste" msgstr "Вставить" #: CUT msgid "Cut" msgstr "Вырезать" #: COPY msgid "Copy" msgstr "Копировать" #: FILE_SAVE msgid "Save file" msgstr "Сохранить файл" #: CONFIRM msgid "Please confirm" msgstr "Пожалуйста, подтвердите" #: FILE_OPEN msgid "Open file" msgstr "Открыть файл" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Папка" #: URL msgid "URL:" msgstr "Адрес(URL):" #: PASSWORD msgid "Password:" msgstr "Пароль:" #: WARNING msgid "Warning!" msgstr "Внимание!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Не возможно прочесть!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Не существует!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Только для чтения. Он не может быть перезаписан!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Хотите перезаписать?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Хотите перезаписать?" #: FILE_EXISTS msgid "already exists on your system." msgstr "уже существует на вашем компьютере." #: FILE_DIR_BEG msgid "The folder" msgstr "Папка" #: FILE_BEG msgid "The file" msgstr "Файл" #: UNNAMED msgid "Unnamed" msgstr "Без имени" #: FILE_ERR_READING msgid "Error reading file" msgstr "Ошибка при чтении файла" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Ошибка во время сохранения файла" #: FILE_FIND msgid "Find file" msgstr "Поиск файла" #: FILE_ERR_READONLY msgid "is read-only." msgstr "только для чтения." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "существует. Хотите перезаписать?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "- нечитаемый." #: FILE_ERR_BEG msgid "File" msgstr "Файл" #: LOADING msgid "loading..." msgstr "загружается..." #: FALSE msgid "false" msgstr "ложь" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Ошибка запуска URL" #: URL_ERROR msgid "Error building URL!" msgstr "Ошибка создания URL!" #: QUESTION msgid "Question" msgstr "Вопрос" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Неверный пароль!" #: TRUE msgid "true" msgstr "истина" #: CANCEL msgid "Cancel" msgstr "Отмена" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Ошибка удаления файла" #: URL_OPEN msgid "Open URL" msgstr "Открыть URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Ошибка восстановления файла" #: WRITING_FILE msgid "Writing file..." msgstr "Запись файла..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Атрибут" #: XML_VALUE msgid "Value" msgstr "Значение" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Это поле не редактируемое!" #: XML_TEXT msgid "text" msgstr "текст" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Добавить атрибут" #: WORKING msgid "Working..." msgstr "Идёт работа..." #: LOADING_FILE msgid "Loading file" msgstr "Загрузка файла" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Удалить атрибут" #: XML_ELEMENT msgid "Element" msgstr "Элемент" #: XML_NEW_ELEMENT msgid "New element" msgstr "Создать элемент" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Удалить элемент" #: XML_NAME msgid "Name" msgstr "Имя" #: RETRY msgid "Retry" msgstr "Повторить" #: IGNORE msgid "Ignore" msgstr "Игнорировать" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Неверная дата!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Неверное число!" #: NONE msgid "None" msgstr "Нет" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Выделить всё" #: SELECT_NONE msgid "Clear selection" msgstr "Очистить выбор" #: WIDTH msgid "Width:" msgstr "Ширина:" #: HEIGHT msgid "Height:" msgstr "Высота:" #: BROWSE_FILES msgid "Browse files..." msgstr "Обзор файлов..." #: VERSION msgid "version" msgstr "версия" #: ABOUT msgid "About..." msgstr "О программе..." #: YES_TO_ALL msgid "Yes to all" msgstr "Да для всех" #: NO_TO_ALL msgid "No to all" msgstr "Нет для всех" #: SAVE msgid "Save" msgstr "Сохранить" #: OPEN msgid "Open" msgstr "Открыть" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Открыть выбранный файл" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Сохранение указанного файла" #: SAVING msgid "saving..." msgstr "сохранение..." #: SAVING_FILE msgid "Saving file" msgstr "Сохранение файла" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_tr.po000066400000000000000000000125001335566474600237320ustar00rootroot00000000000000# Turkish translation for jclic # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2009-11-10 18:57+0000\n" "Last-Translator: Furkan KARA \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "HATA" #: OK msgid "OK" msgstr "Tamam" #: YES msgid "Yes" msgstr "Evet" #: NO msgid "No" msgstr "Hayır" #: DELETE msgid "Delete" msgstr "Sil" #: PASTE msgid "Paste" msgstr "Yapıştır" #: CUT msgid "Cut" msgstr "Kes" #: COPY msgid "Copy" msgstr "Kopyala" #: FILE_SAVE msgid "Save file" msgstr "Dosyayı kaydet" #: CONFIRM msgid "Please confirm" msgstr "Lütfen doğrulayınız" #: FILE_OPEN msgid "Open file" msgstr "Dosya aç" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Klasör" #: URL msgid "URL:" msgstr "Adres:" #: PASSWORD msgid "Password:" msgstr "Şifre" #: WARNING msgid "Warning!" msgstr "Uyarı" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "Dosya okunamıyor!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "Dosya mevcut değil!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "Dosya salt okunabilir. Dosya üzerine yazılamaz" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Üzerine yazmak istiyor musunuz?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Üzerine yazmak istiyor musunuz?" #: FILE_EXISTS msgid "already exists on your system." msgstr "Dosya sisteminizde mevcut" #: FILE_DIR_BEG msgid "The folder" msgstr "Klasör" #: FILE_BEG msgid "The file" msgstr "Dosya" #: UNNAMED msgid "Unnamed" msgstr "İsimsiz" #: FILE_ERR_READING msgid "Error reading file" msgstr "Dosya okunamadı" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Dosya kaydetme hatası" #: FILE_FIND msgid "Find file" msgstr "Dosya bul" #: FILE_ERR_READONLY msgid "is read-only." msgstr "Salt okunabilir dosya" #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "Dosyanın üzerine yazmak istiyormusunuz?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "Dosya okunamıyor" #: FILE_ERR_BEG msgid "File" msgstr "Dosya" #: LOADING msgid "loading..." msgstr "yükleniyor..." #: FALSE msgid "false" msgstr "yanlış" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "mesajlar/imzakontrol.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "URL açılamıyor" #: URL_ERROR msgid "Error building URL!" msgstr "Adres inşasında hata!" #: QUESTION msgid "Question" msgstr "Soru" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Yanlış parola!" #: TRUE msgid "true" msgstr "doğru" #: CANCEL msgid "Cancel" msgstr "İptal" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Dosya silme hatası" #: URL_OPEN msgid "Open URL" msgstr "URL Aç" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Dosya kurtarma hatası" #: WRITING_FILE msgid "Writing file..." msgstr "Dosya yazılıyor" #: XML_ATTRIBUTE msgid "Attribute" msgstr "Öznitelik" #: XML_VALUE msgid "Value" msgstr "Değer" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "Dosya düzenlenemiyor!" #: XML_TEXT msgid "text" msgstr "Metin" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Öznitelik ekle" #: WORKING msgid "Working..." msgstr "Çalışıyor..." #: LOADING_FILE msgid "Loading file" msgstr "Dosya yükleniyor" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Öznitelik sil" #: XML_ELEMENT msgid "Element" msgstr "Öğe" #: XML_NEW_ELEMENT msgid "New element" msgstr "Yeni öğe" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Öğeyi sil" #: XML_NAME msgid "Name" msgstr "İsim" #: RETRY msgid "Retry" msgstr "Tekrar dene" #: IGNORE msgid "Ignore" msgstr "Yoksay" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Tarih hatalı!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Sayı yanlış!" #: NONE msgid "None" msgstr "Hiçbiri" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "Bugünkü değer" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Tümünü Seç" #: SELECT_NONE msgid "Clear selection" msgstr "Seçimi sil" #: WIDTH msgid "Width:" msgstr "Genişlik:" #: HEIGHT msgid "Height:" msgstr "Yükseklik:" #: BROWSE_FILES msgid "Browse files..." msgstr "Dosya tara" #: VERSION msgid "version" msgstr "sürüm" #: ABOUT msgid "About..." msgstr "Hakkında..." #: YES_TO_ALL msgid "Yes to all" msgstr "Hepsine evet" #: NO_TO_ALL msgid "No to all" msgstr "Hepsine hayır" #: SAVE msgid "Save" msgstr "Kaydet" #: OPEN msgid "Open" msgstr "Aç" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Seçili dosyaları aç" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Seçilen dosyayı kaydet" #: SAVING msgid "saving..." msgstr "Kaydediyor" #: SAVING_FILE msgid "Saving file" msgstr "Dosya saklanıyor" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_vec.po000066400000000000000000000126701335566474600240720ustar00rootroot00000000000000# Venetian translation for jclic # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2010-05-21 09:29+0000\n" "Last-Translator: Fabio \n" "Language-Team: Venetian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "EROR" #: OK msgid "OK" msgstr "OK" #: YES msgid "Yes" msgstr "Sì" #: NO msgid "No" msgstr "Nò" #: DELETE msgid "Delete" msgstr "Scansèƚa" #: PASTE msgid "Paste" msgstr "Incòƚa" #: CUT msgid "Cut" msgstr "Taja" #: COPY msgid "Copy" msgstr "Còpia" #: FILE_SAVE msgid "Save file" msgstr "Salva file" #: CONFIRM msgid "Please confirm" msgstr "Conferma" #: FILE_OPEN msgid "Open file" msgstr "Vèrxi file" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "Cartèƚa" #: URL msgid "URL:" msgstr "URL:" #: PASSWORD msgid "Password:" msgstr "Password:" #: WARNING msgid "Warning!" msgstr "Atension!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "No se pol lèxarlo!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "No 'l existe!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "El xé a letura nemeché. No se pol sorascrìvarlo!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "Vusto sorascrìvarlo?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "Vusto sorascrìvarlo?" #: FILE_EXISTS msgid "already exists on your system." msgstr "el ghe xé xà inte 'l to sistèma." #: FILE_DIR_BEG msgid "The folder" msgstr "Ƚa cartèƚa" #: FILE_BEG msgid "The file" msgstr "El file" #: UNNAMED msgid "Unnamed" msgstr "Sensa nòme" #: FILE_ERR_READING msgid "Error reading file" msgstr "Ghe xé stà un eror a verxindo el file" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "Ghe xé stà un eror a salvando el file" #: FILE_FIND msgid "Find file" msgstr "Cata file" #: FILE_ERR_READONLY msgid "is read-only." msgstr "el xé a letura nemeché." #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "el ghe xé xà. Fusto sorascrìvarlo?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "no se pol lèxarlo." #: FILE_ERR_BEG msgid "File" msgstr "File" #: LOADING msgid "loading..." msgstr "drio cargarse..." #: FALSE msgid "false" msgstr "falso" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "Ghe xé stà un eror a invianndo el URL" #: URL_ERROR msgid "Error building URL!" msgstr "Ghe xé stà un eror a costruindo el URL" #: QUESTION msgid "Question" msgstr "Dimanda" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "Password incorèta!" #: TRUE msgid "true" msgstr "vero" #: CANCEL msgid "Cancel" msgstr "Anuƚa" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "Ghe xé stà un eror a scanseƚando el file" #: URL_OPEN msgid "Open URL" msgstr "Vèrxi URL" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "Ghe xé stà un eror a repristinando el file" #: WRITING_FILE msgid "Writing file..." msgstr "Drio scrìvar el file..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "Atribudo" #: XML_VALUE msgid "Value" msgstr "Vaƚor" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "No se pol modifegar sto canpo!" #: XML_TEXT msgid "text" msgstr "tèsto" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "Xonta atribudo" #: WORKING msgid "Working..." msgstr "Drio laorar..." #: LOADING_FILE msgid "Loading file" msgstr "Cargamento file" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "Scansèƚa atribudo" #: XML_ELEMENT msgid "Element" msgstr "Elemento" #: XML_NEW_ELEMENT msgid "New element" msgstr "Elemento niovo" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "Scansèƚa elemento" #: XML_NAME msgid "Name" msgstr "Nòme" #: RETRY msgid "Retry" msgstr "Proa da novo" #: IGNORE msgid "Ignore" msgstr "Ignòra" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "Data sbaliada!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "Nùmaro no corèto!" #: NONE msgid "None" msgstr "Nisun" #: COPY_keys msgid "CC" msgstr "CC" #: CUT_keys msgid "TX" msgstr "TX" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "Seƚesiona tuto" #: SELECT_NONE msgid "Clear selection" msgstr "Refa seƚesion" #: WIDTH msgid "Width:" msgstr "Larghesa" #: HEIGHT msgid "Height:" msgstr "Altesa" #: BROWSE_FILES msgid "Browse files..." msgstr "Serca inte i files..." #: VERSION msgid "version" msgstr "version" #: ABOUT msgid "About..." msgstr "Detali..." #: YES_TO_ALL msgid "Yes to all" msgstr "Sì a tuto" #: NO_TO_ALL msgid "No to all" msgstr "Nò a tuto" #: SAVE msgid "Save" msgstr "Salva" #: OPEN msgid "Open" msgstr "Vèrxi" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "Vèrxi el file seƚesionà" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "Salva el file spesifegà" #: SAVING msgid "saving..." msgstr "drio salvar..." #: SAVING_FILE msgid "Saving file" msgstr "Salvamento file" i18n/fromLaunchpad/po/jclic-utilities/BasicMessages_zh_TW.po000066400000000000000000000123411335566474600243430ustar00rootroot00000000000000# Traditional Chinese translation for jclic # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the jclic package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: jclic\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2008-02-04 19:15+0200\n" "PO-Revision-Date: 2012-03-20 10:48+0000\n" "Last-Translator: Cho Chin-Ping \n" "Language-Team: Traditional Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-12-09 11:48+0000\n" "X-Generator: Launchpad (build 17865)\n" #: ERROR msgid "ERROR" msgstr "錯誤" #: OK msgid "OK" msgstr "確定" #: YES msgid "Yes" msgstr "是" #: NO msgid "No" msgstr "否" #: DELETE msgid "Delete" msgstr "刪除" #: PASTE msgid "Paste" msgstr "貼上" #: CUT msgid "Cut" msgstr "剪下" #: COPY msgid "Copy" msgstr "複製" #: FILE_SAVE msgid "Save file" msgstr "儲存檔案" #: CONFIRM msgid "Please confirm" msgstr "請確認" #: FILE_OPEN msgid "Open file" msgstr "開啟檔案" #: FILE_ERR_BEG_DIR msgid "Folder" msgstr "資料夾" #: URL msgid "URL:" msgstr "網址:" #: PASSWORD msgid "Password:" msgstr "密碼:" #: WARNING msgid "Warning!" msgstr "警告!" #: FILE_NOT_READABLE msgid "Cannot be read!" msgstr "無法讀取!" #: FILE_NOT_EXIST msgid "Does not exist!" msgstr "不存在!" #: FILE_READONLY msgid "Is read-only. It cannot be overwritted!" msgstr "唯讀。無法覆寫!" #: FILE_OVERWRITE_DIR_PROMPT msgctxt "FILE_OVERWRITE_DIR_PROMPT" msgid "Do you want to overwrite it?" msgstr "要覆寫嗎?" #: FILE_OVERWRITE_PROMPT msgctxt "FILE_OVERWRITE_PROMPT" msgid "Do you want to overwrite it?" msgstr "要覆寫嗎?" #: FILE_EXISTS msgid "already exists on your system." msgstr "已經存在您的系統中。" #: FILE_DIR_BEG msgid "The folder" msgstr "資料夾" #: FILE_BEG msgid "The file" msgstr "檔案" #: UNNAMED msgid "Unnamed" msgstr "未命名" #: FILE_ERR_READING msgid "Error reading file" msgstr "讀取檔案錯誤" #: FILE_ERR_SAVING msgid "Error saving file" msgstr "儲存檔案錯誤" #: FILE_FIND msgid "Find file" msgstr "尋找檔案" #: FILE_ERR_READONLY msgid "is read-only." msgstr "唯讀" #: FILE_ERR_EXISTS msgid "exists. Do you want to overwrite it?" msgstr "檔案已經存在,要覆寫嗎?" #: FILE_ERR_UNREADABLE msgid "is unreadable." msgstr "無法讀取。" #: FILE_ERR_BEG msgid "File" msgstr "檔案" #: LOADING msgid "loading..." msgstr "載入中..." #: FALSE msgid "false" msgstr "假" #: CHECK_SIGNATURE_URL msgid "messages/checksignature.html" msgstr "messages/checksignature.html" #: URL_LAUNCH_ERROR msgid "Error launching URL" msgstr "URL錯誤" #: URL_ERROR msgid "Error building URL!" msgstr "建立的URL錯誤" #: QUESTION msgid "Question" msgstr "問題" #: PASSWORD_INCORRECT msgid "Incorrect password!" msgstr "密碼不正確" #: TRUE msgid "true" msgstr "真" #: CANCEL msgid "Cancel" msgstr "取消" #: FILE_ERR_DELETING msgid "Error deleting file" msgstr "刪除檔案錯誤" #: URL_OPEN msgid "Open URL" msgstr "開啟網址" #: FILE_ERR_RESTORING msgid "Error restoring file" msgstr "還原檔案錯誤" #: WRITING_FILE msgid "Writing file..." msgstr "寫入檔案中..." #: XML_ATTRIBUTE msgid "Attribute" msgstr "屬性" #: XML_VALUE msgid "Value" msgstr "值" #: XML_NOT_EDITABLE msgid "This field is not editable!" msgstr "這個欄位無法編輯!" #: XML_TEXT msgid "text" msgstr "文字" #: XML_NEW_ATTRIBUTE msgid "Add attribute" msgstr "新增屬性" #: WORKING msgid "Working..." msgstr "工作中..." #: LOADING_FILE msgid "Loading file" msgstr "檔案載入中" #: XML_DEL_ATTRIBUTE msgid "Delete attribute" msgstr "刪除屬性" #: XML_ELEMENT msgid "Element" msgstr "元件" #: XML_NEW_ELEMENT msgid "New element" msgstr "新元件" #: XML_DEL_ELEMENT msgid "Delete element" msgstr "刪除元件" #: XML_NAME msgid "Name" msgstr "名稱" #: RETRY msgid "Retry" msgstr "重試" #: IGNORE msgid "Ignore" msgstr "略過" #: DATE_INCORRECT msgid "Date incorrect!" msgstr "日期不正確!" #: BAD_NUMBER msgid "Incorrect number!" msgstr "不正確的數字!" #: NONE msgid "None" msgstr "沒有" #: COPY_keys msgid "CC" msgstr "副本" #: CUT_keys msgid "TX" msgstr "傳送" #: PASTE_keys msgid "PV" msgstr "PV" #: DELETE_keys msgid "D#127" msgstr "D#127" #: SELECT_ALL msgid "Select all" msgstr "全部選取" #: SELECT_NONE msgid "Clear selection" msgstr "清除選取" #: WIDTH msgid "Width:" msgstr "寬:" #: HEIGHT msgid "Height:" msgstr "高:" #: BROWSE_FILES msgid "Browse files..." msgstr "瀏覽檔案..." #: VERSION msgid "version" msgstr "版本" #: ABOUT msgid "About..." msgstr "關於..." #: YES_TO_ALL msgid "Yes to all" msgstr "全部皆是" #: NO_TO_ALL msgid "No to all" msgstr "全部皆否" #: SAVE msgid "Save" msgstr "儲存" #: OPEN msgid "Open" msgstr "開啟" #: FILE_OPEN_TOOLTIP msgid "Open the selected file" msgstr "開啟選取的檔案" #: FILE_SAVE_TOOLTIP msgid "Save the specified file" msgstr "儲存指定的檔案" #: SAVING msgid "saving..." msgstr "儲存中..." #: SAVING_FILE msgid "Saving file" msgstr "正在儲存檔案" i18n/toLaunchpad/000077500000000000000000000000001335566474600141225ustar00rootroot00000000000000i18n/toLaunchpad/build.xml000066400000000000000000000300771335566474600157520ustar00rootroot00000000000000 instal/000077500000000000000000000000001335566474600123735ustar00rootroot00000000000000instal/CHANGES.txt000077700000000000000000000000001335566474600160042../CHANGES.mdustar00rootroot00000000000000instal/build.xml000066400000000000000000000077041335566474600142240ustar00rootroot00000000000000 instal/setup.nsi000066400000000000000000001025501335566474600142510ustar00rootroot00000000000000; Product version !ifndef PRODUCT_VERSION !define PRODUCT_VERSION "0.1.1.8" !endif ; Constants and variables for Java version check !define GET_JAVA_URL "http://www.java.com" !define MIN_JAVA_VERSION "1.7" Var JAVA_HOME Var JAVA_VERSION ; Constants for app registry !define SHCNE_ASSOCCHANGED 0x8000000 !define SHCNF_IDLIST 0 ; Define your application name !define APPNAME "JClic (offline)" !define APPNAMEANDVERSION "JClic 0.3" ; MUI Settings !define MUI_ABORTWARNING !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" !define MUI_LANGDLL_ALLLANGUAGES ;BGGradient 000000 800000 FFFFFF XPStyle on ; Main Install settings Name "${APPNAMEANDVERSION}" InstallDir "$PROGRAMFILES\JClic" InstallDirRegKey HKLM "Software\${APPNAME}" "" OutFile "jclic-${PRODUCT_VERSION}.exe" ; Modern interface settings !include "MUI.nsh" !insertmacro MUI_PAGE_WELCOME Page custom CheckJavaVersion "" " - Java system check" !insertmacro MUI_PAGE_LICENSE "..\LICENSE" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ; Set languages (first is default language) !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "Arabic" ;!insertmacro MUI_LANGUAGE "Asturian" !insertmacro MUI_LANGUAGE "Basque" !insertmacro MUI_LANGUAGE "Bosnian" !insertmacro MUI_LANGUAGE "Catalan" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "Galician" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Greek" !insertmacro MUI_LANGUAGE "Italian" !insertmacro MUI_LANGUAGE "Portuguese" !insertmacro MUI_LANGUAGE "PortugueseBR" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "TradChinese" !insertmacro MUI_LANGUAGE "Turkish" ;!insertmacro MUI_LANGUAGE "Venetian" !insertmacro MUI_RESERVEFILE_LANGDLL ;-------------------------------- ;Version Information VIProductVersion ${PRODUCT_VERSION} VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "JClic" ;VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment" VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "XTEC - Departament d'Educació" ;VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company" VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "© Francesc Busquets & Departament d'Educació de la Generalitat de Catalunya" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Windows installer of JClic modules" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${PRODUCT_VERSION}" ;-------------------------------- LangString javaNeeded ${LANG_CATALAN} "El JClic necessita un motor Java actualitzat, versió 1.7 o superior. El podeu descarregar gratuïtament des de http://www.java.com" LangString javaNeeded ${LANG_ENGLISH} "JClic needs an updated Java engine, version 1.7 or higher. You can download it from http://www.java.com" LangString javaNeeded ${LANG_SPANISH} "JClic necesita un motor Java actualizado, versión 1.7 o superior. Puede descargarlo gratuitamente desde http://www.java.com" LangString javaNeeded ${LANG_ITALIAN} "JClic richiede un motore Java aggiornato, versione 1.7 o superiore. Puoi scaricarla da http://www.java.com" LangString javaNeeded ${LANG_GREEK} "Το JClic χρειάζεται μια ενημερωμένη μηχανή Java, έκδοση 1.7 ή μεταγενέστερη. Μπορείτε να την κατεβάσετε από τη διεύθυνση http://www.java.com" LangString javaNeeded ${LANG_BASQUE} "JClic-ek Java 1.7 edo aurreragoko bertsioa behar du. Hemen lortu ahal duzu: http://www.java.com" LangString javaNeeded ${LANG_PORTUGUESE} "O Jclic necessita um motor Java actualizado (versão 1.7 ou superior). Pode desacrregá-lo em http://www.java.com" LangString javaNeeded ${LANG_ARABIC} "JClic needs an updated Java engine, version 1.7 or higher. You can download it from http://www.java.com" LangString javaNeeded ${LANG_FRENCH} "JClic requiert une version plus récente de la machine java, ver. 1.7 ou supérieure. Vous pouvez la télécharger sur http://www.java.com" LangString javaNeeded ${LANG_RUSSIAN} "JClic необходима Java машина версии 1.7 или выше. Вы можете загрузить её с сайта http://www.java.com" LangString javaNeeded ${LANG_GERMAN} "JClic benötigt Java Version 1.7 oder höher. Download unter http://www.java.com" LangString javaNeeded ${LANG_GALICIAN} "JClic precisa un motor Java actualizado, na versión 1.7 ou posterior. Pode descargala de http://www.java.com" LangString javaNeeded ${LANG_DUTCH} "JClic heeft een aangepaste Java engine nodig, versie 1.7 of beter. Je kan deze downloaden via http://www.java.com" LangString javaNeeded ${LANG_PORTUGUESEBR} "JClic requer Java atualizado, versão 1.7 ou superior. Você pode obtê-lo em http://www.java.com" LangString javaNeeded ${LANG_CZECH} "JClic vyžaduje novější Java engine, verze 1.7 nebo vyšší. Můžete jej nahrát z: http://www.java.com" LangString javaNeeded ${LANG_TRADCHINESE} "JClic 需要 1.7 以上版本的 Java 引擎, 您可以從 http://www.java.com 網站下載。" ;LangString javaNeeded ${LANG_ASTURIAN} "JClic necesita un motor Java anováu, versión 1.7 o superior. Pues descargalu de baldre dende http://www.java.com" LangString javaNeeded ${LANG_BOSNIAN} "JClic treba ažuriranu Java engine, verzija 1.7 ili novija. Možete ga preuzeti sa http://www.java.com" LangString javaNeeded ${LANG_TURKISH} "JClic, 1.7 veya üstü sürümde bir Java motoru gerektiriyor. http://www.java.com'dan indirebilirsiniz." ;LangString javaNeeded ${LANG_VENETIAN} "Senghe vol un motor Java axornà par JClic, version 1.7 o superior. Te pol descargarla da http://www.java.com" LangString oldJavaMsg ${LANG_CATALAN} "El sistema Java d'aquest ordinador és antic." LangString oldJavaMsg ${LANG_ENGLISH} "There is an old version of Java installed on this computer." LangString oldJavaMsg ${LANG_SPANISH} "El sistema Java de este ordenador es antiguo." LangString oldJavaMsg ${LANG_ITALIAN} "C'è una vecchia versione di Java installata in questo computer." LangString oldJavaMsg ${LANG_GREEK} "Υπάρχει μια παλαιότερη έκδοση Java εγκατεστημένη σε αυτόν τον υπολογιστή." LangString oldJavaMsg ${LANG_BASQUE} "Ordenagailu honetan Javaren bertsio zaharra dago instalatuta" LangString oldJavaMsg ${LANG_PORTUGUESE} "Possui uma versão antiga do Java instalada neste computador." LangString oldJavaMsg ${LANG_ARABIC} "يوجد إصدار قديم لنظام Java مثبّت على هذا الحاسوب." LangString oldJavaMsg ${LANG_FRENCH} "Possui uma versão antiga do Java instalada neste computador." LangString oldJavaMsg ${LANG_RUSSIAN} "Предыдущая версия Java установлена на этом компьютере." LangString oldJavaMsg ${LANG_GERMAN} "Es ist keine aktuelle Java Version auf diesem Computer installiert." LangString oldJavaMsg ${LANG_GALICIAN} "Neste ordenador hai instalada unha versión vella de Java." LangString oldJavaMsg ${LANG_DUTCH} "Er is een oudere versie van Java op deze computer geïnstalleerd." LangString oldJavaMsg ${LANG_PORTUGUESEBR} "Há uma versão antiga do Java instalada em seu computador." LangString oldJavaMsg ${LANG_CZECH} "Na vašem pčítači existuje stará verze Javy." LangString oldJavaMsg ${LANG_TRADCHINESE} "有一個舊版本的 Java 已經安裝在您的電腦中。" ;LangString oldJavaMsg ${LANG_ASTURIAN} "El sistema Java d'esti ordenador ye mui vieyu." LangString oldJavaMsg ${LANG_BOSNIAN} "Stara verzija Java softvera je instalirana na vašem komjuteru." LangString oldJavaMsg ${LANG_TURKISH} "Bilgisayarınızda eski sürüm bir Java kurulu." ;LangString oldJavaMsg ${LANG_VENETIAN} "Ghe xé na version vècia de Java istaƚada inte sto ordenaor" LangString noJavaMsg ${LANG_CATALAN} "No s'ha pogut trobar cap sistema Java instal·lat a aquest ordinador." LangString noJavaMsg ${LANG_ENGLISH} "It was impossible to find any Java system installed on this computer." LangString noJavaMsg ${LANG_SPANISH} "No se ha encontrado ningún sistema Java instalado en este ordenador." LangString noJavaMsg ${LANG_ITALIAN} "Non è stato possibile trovare una versione di Java installata in questo computer." LangString noJavaMsg ${LANG_GREEK} "Είναι αδύνατον να βρεθεί σύστημα της Java εγκατεστημένο σε αυτόν τον υπολογιστή." LangString noJavaMsg ${LANG_BASQUE} "Ezin izan da Java sistemarik aurkitu instalatuta ordenagailu honetan" LangString noJavaMsg ${LANG_PORTUGUESE} "Não foi possível encontrar uma instalação do Java neste computador." LangString noJavaMsg ${LANG_ARABIC} "يستحيل العثور على نظام Java مثبّت على هذا الحاسوب." LangString noJavaMsg ${LANG_FRENCH} "Aucune machine Java n'a été détectée sur cet ordinateur." LangString noJavaMsg ${LANG_RUSSIAN} "Не удалось найти установленную Java на этом компьютере." LangString noJavaMsg ${LANG_GERMAN} "Auf diesem Computer konnte kein Java-System gefunden werden." LangString noJavaMsg ${LANG_GALICIAN} "Foi imposíbel atopar ningunha versión de Java instalada neste ordenador." LangString noJavaMsg ${LANG_DUTCH} "Het was onmogelijk om een geïnstalleerd Java systeem te vinden op deze computer." LangString noJavaMsg ${LANG_PORTUGUESEBR} "Não foi possível localizar algum sistema de Java em seu computador." LangString noJavaMsg ${LANG_CZECH} "Nemohu najít žádný instalovaný Java systém na tomto počítači." LangString noJavaMsg ${LANG_TRADCHINESE} "在您的電腦找不到任何已經安裝的 Java 系統。" ;LangString noJavaMsg ${LANG_ASTURIAN} "Nun s'atopó sistema Java dengún instaláu nel ordenador." LangString noJavaMsg ${LANG_BOSNIAN} "Nije bilo je moguće pronaći bilo kakav Java sistem instaliran na ovom računalu." LangString noJavaMsg ${LANG_TURKISH} "Bilgisayarınızda herhangi yüklü Java bulunamadı." ;LangString noJavaMsg ${LANG_VENETIAN} "No xé stà posììbiƚƚe de catar nisun sistèma Java inte sto ordenador" LangString standardType ${LANG_CATALAN} "Estàndard" LangString standardType ${LANG_ENGLISH} "Standard" LangString standardType ${LANG_SPANISH} "Estándar" LangString standardType ${LANG_ITALIAN} "Tipica" LangString standardType ${LANG_GREEK} "Τυπική" LangString standardType ${LANG_BASQUE} "Estandarra" LangString standardType ${LANG_PORTUGUESE} "Padrão" LangString standardType ${LANG_ARABIC} "معياري" LangString standardType ${LANG_FRENCH} "Par défaut" LangString standardType ${LANG_RUSSIAN} "Стандартная" LangString standardType ${LANG_GERMAN} "Standard" LangString standardType ${LANG_GALICIAN} "Estándar" LangString standardType ${LANG_DUTCH} "Standaard" LangString standardType ${LANG_PORTUGUESEBR} "Padrão" LangString standardType ${LANG_CZECH} "Standardní" LangString standardType ${LANG_TRADCHINESE} "標準" ;LangString standardType ${LANG_ASTURIAN} "Estándar" LangString standardType ${LANG_BOSNIAN} "Standardno" LangString standardType ${LANG_TURKISH} "Standart" ;LangString standardType ${LANG_VENETIAN} "Standard" LangString fullType ${LANG_CATALAN} "Completa" LangString fullType ${LANG_ENGLISH} "Full" LangString fullType ${LANG_SPANISH} "Completa" LangString fullType ${LANG_ITALIAN} "Completa" LangString fullType ${LANG_GREEK} "Πλήρης" LangString fullType ${LANG_BASQUE} "Osoa" LangString fullType ${LANG_PORTUGUESE} "Completa" LangString fullType ${LANG_ARABIC} "كامل" LangString fullType ${LANG_FRENCH} "Complète" LangString fullType ${LANG_RUSSIAN} "Полная" LangString fullType ${LANG_GERMAN} "Komplett" LangString fullType ${LANG_GALICIAN} "Completa" LangString fullType ${LANG_DUTCH} "Volledig" LangString fullType ${LANG_PORTUGUESEBR} "Completa" LangString fullType ${LANG_CZECH} "Plná" LangString fullType ${LANG_TRADCHINESE} "完全" ;LangString fullType ${LANG_ASTURIAN} "Completa" LangString fullType ${LANG_BOSNIAN} "Puno" LangString fullType ${LANG_TURKISH} "Tam" ;LangString fullType ${LANG_VENETIAN} "Conplèta" LangString liteType ${LANG_CATALAN} "Mínima" LangString liteType ${LANG_ENGLISH} "Lite" LangString liteType ${LANG_SPANISH} "Mínima" LangString liteType ${LANG_ITALIAN} "Minima" LangString liteType ${LANG_GREEK} "Ελάχιστη" LangString liteType ${LANG_BASQUE} "Gutxienekoa" LangString liteType ${LANG_PORTUGUESE} "Mínima" LangString liteType ${LANG_ARABIC} "خفيف" LangString liteType ${LANG_FRENCH} "Minimale" LangString liteType ${LANG_RUSSIAN} "Минимальная" LangString liteType ${LANG_GERMAN} "Minimal" LangString liteType ${LANG_GALICIAN} "Mínima" LangString liteType ${LANG_DUTCH} "Licht" LangString liteType ${LANG_PORTUGUESEBR} "Mínima" LangString liteType ${LANG_CZECH} "Minimální" LangString liteType ${LANG_TRADCHINESE} "Lite" ;LangString liteType ${LANG_ASTURIAN} "Mínima" LangString liteType ${LANG_BOSNIAN} "Lite" LangString liteType ${LANG_TURKISH} "Temel" ;LangString liteType ${LANG_VENETIAN} "Minimal" InstType "$(standardType)" InstType "$(fullType)" InstType "$(liteType)" LangString captionStr ${LANG_CATALAN} "Instal·lació del JClic ${PRODUCT_VERSION}" LangString captionStr ${LANG_ENGLISH} "JClic ${PRODUCT_VERSION} offline setup" LangString captionStr ${LANG_SPANISH} "Instalación de JClic ${PRODUCT_VERSION}" LangString captionStr ${LANG_ITALIAN} "JClic ${PRODUCT_VERSION} offline setup" LangString captionStr ${LANG_GREEK} "JClic ${PRODUCT_VERSION} offline εγκατάσταση" LangString captionStr ${LANG_BASQUE} "JClic-en instalazioa ${PRODUCT_VERSION}" LangString captionStr ${LANG_PORTUGUESE} "JClic ${PRODUCT_VERSION} instalação offline" LangString captionStr ${LANG_ARABIC} "JClic ${PRODUCT_VERSION} offline setup" LangString captionStr ${LANG_FRENCH} "Installation hors-ligne de JClic ${PRODUCT_VERSION}" LangString captionStr ${LANG_RUSSIAN} "Автономная установка JClic ${PRODUCT_VERSION}" LangString captionStr ${LANG_GERMAN} "JClic ${PRODUCT_VERSION} offline setup" LangString captionStr ${LANG_GALICIAN} "Instalación de JClic ${PRODUCT_VERSION}" LangString captionStr ${LANG_DUTCH} "JClic ${PRODUCT_VERSION} offline setup" LangString captionStr ${LANG_PORTUGUESEBR} "Configuração offline JClic ${PRODUCT_VERSION}" LangString captionStr ${LANG_CZECH} "JClic ${PRODUCT_VERSION} off-line nastavení" LangString captionStr ${LANG_TRADCHINESE} "JClic ${PRODUCT_VERSION} 離線設定" ;LangString captionStr ${LANG_ASTURIAN} "Instalación offline de JClic ${PRODUCT_VERSION}" LangString captionStr ${LANG_BOSNIAN} "JClic ${PRODUCT_VERSION} isključena postava" LangString captionStr ${LANG_TURKISH} "JClic ${PRODUCT_VERSION} çevrimdışı kurulum" ;LangString captionStr ${LANG_VENETIAN} "Istaƚasion de JClic ${PRODUCT_VERSION} fora linia" Caption "$(captionStr)" Section "-JClic core" Section1 SectionIn 1 2 3 ; Set Section properties SetOverwrite ifnewer ; Set Section Files and Shortcuts SetOutPath "$INSTDIR\" File "..\dist\jclic\jclic.jar" File "..\LICENSE" File "..\CREDITS.txt" File "CHANGES.txt" File "..\HACKING.txt" File "..\INSTALL.txt" SectionEnd Section "JClic player" Section2 SectionIn 1 2 3 ; Set Section properties SetOverwrite ifnewer SetShellVarContext all ; Set Section Files and Shortcuts SetOutPath "$INSTDIR\icons" File "..\dist\jclic\icons\install.ico" File "..\dist\jclic\icons\jclic.ico" SetOutPath "$INSTDIR\" CreateShortCut "$DESKTOP\JClic.lnk" "javaw" "-jar jclic.jar" "$INSTDIR\icons\jclic.ico" CreateDirectory "$SMPROGRAMS\JClic" CreateShortCut "$SMPROGRAMS\JClic\JClic.lnk" "javaw" "-jar jclic.jar" "$INSTDIR\icons\jclic.ico" ReadRegStr $R0 HKCR ".jclic" "" StrCmp $R0 "JCLICFile" 0 +2 DeleteRegKey HKCR "JCLICFile" ReadRegStr $R0 HKCR ".jclic.zip" "" StrCmp $R0 "JCLIC.ZIPFile" 0 +2 DeleteRegKey HKCR "JCLIC.ZIPFile" WriteRegStr HKCR ".jclic" "" "JClic.project" WriteRegStr HKCR ".jclic.zip" "" "JClic.project" WriteRegStr HKCR "JClic.project" "" "JClic project file" WriteRegStr HKCR "JClic.project\DefaultIcon" "" "$INSTDIR\icons\jclic.ico" ReadRegStr $R0 HKCR "JClic.project\shell\open\command" "" StrCmp $R0 "" 0 no_open WriteRegStr HKCR "JClic.project\shell" "" "open" WriteRegStr HKCR "JClic.project\shell\open\command" "" 'javaw -jar "$INSTDIR\jclic.jar" "%1"' no_open: ReadRegStr $R0 HKCR ".jclic.inst" "" StrCmp $R0 "JCLIC.INSTFile" 0 +2 DeleteRegKey HKCR "JCLIC.INSTFile" WriteRegStr HKCR ".jclic.inst" "" "JClic.installer" WriteRegStr HKCR "JClic.installer" "" "JClic project install script" WriteRegStr HKCR "JClic.installer\DefaultIcon" "" "$INSTDIR\icons\install.ico" ReadRegStr $R0 HKCR "JClic.install\shell\open\command" "" StrCmp $R0 "" 0 no_open_inst WriteRegStr HKCR "JClic.install\shell" "" "open" WriteRegStr HKCR "JClic.install\shell\open\command" "" 'javaw -jar "$INSTDIR\jclic.jar" "%1"' no_open_inst: System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' SectionEnd Section "JClic author" Section3 sectionIn 1 2 ; Set Section properties SetOverwrite ifnewer SetShellVarContext all ; Set Section Files and Shortcuts SetOutPath "$INSTDIR\" File "..\dist\jclic\jclicauthor.jar" SetOutPath "$INSTDIR\icons" File "..\dist\jclic\icons\author.ico" SetOutPath "$INSTDIR\" CreateShortCut "$DESKTOP\JClic Author.lnk" "javaw" "-Xmx128m -jar jclicauthor.jar" "$INSTDIR\icons\author.ico" CreateDirectory "$SMPROGRAMS\JClic" CreateShortCut "$SMPROGRAMS\JClic\JClic Author.lnk" "javaw" "-Xmx128m -jar jclicauthor.jar" "$INSTDIR\icons\author.ico" ReadRegStr $R0 HKCR ".jclic.zip" "" StrCmp $R0 "JCLIC.ZIPFile" 0 +2 DeleteRegKey HKCR "JCLIC.ZIPFile" WriteRegStr HKCR ".jclic" "" "JClic.project" WriteRegStr HKCR ".jclic.zip" "" "JClic.project" WriteRegStr HKCR "JClic.project" "" "JClic project file" WriteRegStr HKCR "JClic.project\DefaultIcon" "" "$INSTDIR\icons\jclic.ico" ReadRegStr $R0 HKCR "JClic.project\shell\edit\command" "" StrCmp $R0 "" 0 no_edit ;WriteRegStr HKCR "JClic.project\shell" "" "edit" WriteRegStr HKCR "JClic.project\shell\edit\command" "" 'javaw -Xmx128m -jar "$INSTDIR\jclicauthor.jar" "%1"' no_edit: SectionEnd Section /o "JClic applet" Section4 SectionIn 2 ; Set Section properties SetOverwrite ifnewer SetShellVarContext all ; Set Section Files and Shortcuts SetOutPath "$INSTDIR\" File "..\dist\jclic\jclicplugin.js" File "..\dist\jclic\launchApplet.js" File "..\dist\jclic\author.html" SectionEnd Section "JClic reports" Section5 SectionIn 2 ; Set Section properties SetOverwrite ifnewer SetShellVarContext all ; Set Section Files and Shortcuts SetOutPath "$INSTDIR\" File "..\dist\jclic\jclicreports.jar" SetOutPath "$INSTDIR\icons" File "..\dist\jclic\icons\reports.ico" SetOutPath "$INSTDIR\" CreateShortCut "$DESKTOP\JClic Reports.lnk" "javaw" "-jar jclicreports.jar" "$INSTDIR\icons\reports.ico" CreateDirectory "$SMPROGRAMS\JClic" CreateShortCut "$SMPROGRAMS\JClic\JClic Reports.lnk" "javaw" "-jar jclicreports.jar" "$INSTDIR\icons\reports.ico" SectionEnd Section -FinishSection WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe" WriteUninstaller "$INSTDIR\uninstall.exe" SectionEnd ; A LangString for the section name LangString JClicPlayerDesc ${LANG_CATALAN} "Aplicació per visualitzar i realitzar activitats JClic." LangString JClicPlayerDesc ${LANG_ENGLISH} "Application to play JClic activities." LangString JClicPlayerDesc ${LANG_SPANISH} "Aplicación para visualizar y realizar actividades JClic." LangString JClicPlayerDesc ${LANG_ITALIAN} "Applicazione per avviare attività JClic." LangString JClicPlayerDesc ${LANG_GREEK} "Εφαρμογή αναπαραγωγής δραστηριοτήτων του JClic" LangString JClicPlayerDesc ${LANG_BASQUE} "JClic jarduerak egiteko aplikazioa" LangString JClicPlayerDesc ${LANG_PORTUGUESE} "Programa para correr actividades Jclic." LangString JClicPlayerDesc ${LANG_ARABIC} "تطبيق للعلب على JClic" LangString JClicPlayerDesc ${LANG_FRENCH} "Programme d'exécution des activités JClic." LangString JClicPlayerDesc ${LANG_RUSSIAN} "Application to play JClic activities." LangString JClicPlayerDesc ${LANG_GERMAN} "Anwendung zum Abspielen von JClic Übungen." LangString JClicPlayerDesc ${LANG_GALICIAN} "Aplicación para reproducir as actividades JClic" LangString JClicPlayerDesc ${LANG_DUTCH} "Toepassing om JClic activiteiten te spelen" LangString JClicPlayerDesc ${LANG_PORTUGUESEBR} "Aplicativo para rodar atividades do JClic" LangString JClicPlayerDesc ${LANG_CZECH} "Aplikace pro přehrávání JClic aktivit." LangString JClicPlayerDesc ${LANG_TRADCHINESE} "Application to play JClic activities." ;LangString JClicPlayerDesc ${LANG_ASTURIAN} "Aplicación pa xugar a les xeres de JClic." LangString JClicPlayerDesc ${LANG_BOSNIAN} "Aplikacije za reprodukciju JClic aktivnosti." LangString JClicPlayerDesc ${LANG_TURKISH} "Application to play JClic activities." ;LangString JClicPlayerDesc ${LANG_VENETIAN} "Programa da inviar par mostrar atività de JClic" LangString JClicAuthorDesc ${LANG_CATALAN} "Aplicació per crear i modificar activitats JClic." LangString JClicAuthorDesc ${LANG_ENGLISH} "Application to create and edit JClic activities." LangString JClicAuthorDesc ${LANG_SPANISH} "Aplicación para crear y modificar actividades JClic." LangString JClicAuthorDesc ${LANG_ITALIAN} "Applicazione per creare e modificare attività JClic." LangString JClicAuthorDesc ${LANG_GREEK} "Εφαρμογή δημιουργίας και επεξεργασίας του JClic." LangString JClicAuthorDesc ${LANG_BASQUE} "JClic jarduerak sortu eta editatzeko aplikazioa" LangString JClicAuthorDesc ${LANG_PORTUGUESE} "Programa para criar e editar actividades Jclic." LangString JClicAuthorDesc ${LANG_ARABIC} "تطبيق لإنشاء وتحرير ألعاب JClic" LangString JClicAuthorDesc ${LANG_FRENCH} "Application pour créer et modifier des activités JClic." LangString JClicAuthorDesc ${LANG_RUSSIAN} "Application to create and edit JClic activities." LangString JClicAuthorDesc ${LANG_GERMAN} "Anwendung zum Erstellen und Editieren von JClic Übungen." LangString JClicAuthorDesc ${LANG_GALICIAN} "Aplicación para crear e editar actividades JClic" LangString JClicAuthorDesc ${LANG_DUTCH} "Toepassing om JClic activiteiten aan te maken" LangString JClicAuthorDesc ${LANG_PORTUGUESEBR} "Aplicativo para criar e editar atividades do JClic" LangString JClicAuthorDesc ${LANG_CZECH} "Aplikace pro vytváření a úpravu JClic aktivit." LangString JClicAuthorDesc ${LANG_TRADCHINESE} "Application to create and edit JClic activities." ;LangString JClicAuthorDesc ${LANG_ASTURIAN} "Aplicación pa criar y camudar xeres de JClic." LangString JClicAuthorDesc ${LANG_BOSNIAN} "Aplikacije za stvaranje i uređivanje JClic aktivnosti." LangString JClicAuthorDesc ${LANG_TURKISH} "Application to create and edit JClic activities." ;LangString JClicAuthorDesc ${LANG_VENETIAN} "Programa par prodùxer e modifegar atività de JClic" LangString JClicAppletDesc ${LANG_CATALAN} "Fitxers que són necessaris només en un servidor que allotgi applets JClic." LangString JClicAppletDesc ${LANG_ENGLISH} "Files needed only in a server with hosted JClic applets." LangString JClicAppletDesc ${LANG_SPANISH} "Archivos que son necesarios únicamente en un servidor que aloje applets JClic." LangString JClicAppletDesc ${LANG_ITALIAN} "Files necessari solo in un server con applets JClic." LangString JClicAppletDesc ${LANG_GREEK} "Αρχεία απαραίτητα μόνο σε διακομιστή που φιλοξενεί μικροεφαρμογές του JClic." LangString JClicAppletDesc ${LANG_BASQUE} "JClic applets-ak ostatzen dituen zerbitzarian bakarrik beharrezko diren fitxategiak" LangString JClicAppletDesc ${LANG_PORTUGUESE} "Ficheiros necessários apenas num servidor com applets JClic." LangString JClicAppletDesc ${LANG_ARABIC} "Files needed only in a server with hosted JClic applets." LangString JClicAppletDesc ${LANG_FRENCH} "Fichiers nécessaires uniquement sur un serveur hébergeant des applets JClic." LangString JClicAppletDesc ${LANG_RUSSIAN} "Файлы требуются только на сервере, хостящем аплеты JClic." LangString JClicAppletDesc ${LANG_GERMAN} "Diese Dateien werden nur auf einem Server gebraucht, der JClic Applets hostet." LangString JClicAppletDesc ${LANG_GALICIAN} "Ficheiros só necesarios nun servidor con applets JClic aloxados" LangString JClicAppletDesc ${LANG_DUTCH} "Bestanden die enkel nodig zijn in een server met JClic applets." LangString JClicAppletDesc ${LANG_PORTUGUESEBR} "Arquivos necessários apenas em um servidor com applets JClic hospedados." LangString JClicAppletDesc ${LANG_CZECH} "Soubory potřebné pouze pro server s hostovanými JClic applety." LangString JClicAppletDesc ${LANG_TRADCHINESE} "Files needed only in a server with hosted JClic applets." ;LangString JClicAppletDesc ${LANG_ASTURIAN} "Ficheros que son necesarios namás nun sirvidor qu'agospie applets de JClic." LangString JClicAppletDesc ${LANG_BOSNIAN} "Files needed only in a server with hosted JClic applets." LangString JClicAppletDesc ${LANG_TURKISH} "Files needed only in a server with hosted JClic applets." ;LangString JClicAppletDesc ${LANG_VENETIAN} "Files che senghe vol nòma che inte un server ospitante applets JClic" LangString JClicReportsDesc ${LANG_CATALAN} "Servidor d'informes." LangString JClicReportsDesc ${LANG_ENGLISH} "Reports server." LangString JClicReportsDesc ${LANG_SPANISH} "Servidor de informes." LangString JClicReportsDesc ${LANG_ITALIAN} "Server dei rapporti." LangString JClicReportsDesc ${LANG_GREEK} "Διακομιστής αναφορών" LangString JClicReportsDesc ${LANG_BASQUE} "Txostenen zerbitzaria." LangString JClicReportsDesc ${LANG_PORTUGUESE} "Servidor de relatórios." LangString JClicReportsDesc ${LANG_ARABIC} "خادوم التقارير." LangString JClicReportsDesc ${LANG_FRENCH} "Serveur de rapports." LangString JClicReportsDesc ${LANG_RUSSIAN} "Сервер отчётов." LangString JClicReportsDesc ${LANG_GERMAN} "Reports server." LangString JClicReportsDesc ${LANG_GALICIAN} "Servidor de informes" LangString JClicReportsDesc ${LANG_DUTCH} "Rapporten server." LangString JClicReportsDesc ${LANG_PORTUGUESEBR} "Servidor de relatórios." LangString JClicReportsDesc ${LANG_CZECH} "Server sestav." LangString JClicReportsDesc ${LANG_TRADCHINESE} "Reports server." ;LangString JClicReportsDesc ${LANG_ASTURIAN} "Sirvidor d'informes." LangString JClicReportsDesc ${LANG_BOSNIAN} "Izvješća poslužitelja." LangString JClicReportsDesc ${LANG_TURKISH} "Sunucu raporları" ;LangString JClicReportsDesc ${LANG_VENETIAN} "Server par i reports" ; Modern install component descriptions !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${Section1} "JClic core components" !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(JClicPlayerDesc) !insertmacro MUI_DESCRIPTION_TEXT ${Section3} $(JClicAuthorDesc) !insertmacro MUI_DESCRIPTION_TEXT ${Section4} $(JClicAppletDesc) !insertmacro MUI_DESCRIPTION_TEXT ${Section5} $(JClicReportsDesc) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;Uninstall section Section Uninstall SetShellVarContext all ;Remove from registry... DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" DeleteRegKey HKLM "SOFTWARE\${APPNAME}" ; Clear registry ReadRegStr $R0 HKCR ".jclic" "" StrCmp $R0 "JClic.project" 0 +2 DeleteRegKey HKCR ".jclic" ReadRegStr $R0 HKCR ".jclic.zip" "" StrCmp $R0 "JClic.project" 0 +2 DeleteRegKey HKCR ".jclic.zip" ReadRegStr $R0 HKCR ".jclic.inst" "" StrCmp $R0 "JClic.installer" 0 +2 DeleteRegKey HKCR ".jclic.inst" DeleteRegKey HKCR "JClic.project" DeleteRegKey HKCR "JClic.installer" System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' ; Delete self Delete "$INSTDIR\uninstall.exe" ; Delete Shortcuts Delete "$DESKTOP\JClic.lnk" Delete "$SMPROGRAMS\JClic\JClic.lnk" Delete "$DESKTOP\JClic Author.lnk" Delete "$SMPROGRAMS\JClic\JClic Author.lnk" Delete "$DESKTOP\JClic Reports.lnk" Delete "$SMPROGRAMS\JClic\JClic Reports.lnk" ; Clean up JClic core Delete "$INSTDIR\activities.jar" Delete "$INSTDIR\dbconn.jar" Delete "$INSTDIR\extra.jar" Delete "$INSTDIR\intl.jar" Delete "$INSTDIR\jclic.jar" Delete "$INSTDIR\jclicxml.jar" Delete "$INSTDIR\jdom.jar" Delete "$INSTDIR\jmfhandlers.jar" Delete "$INSTDIR\player.jar" Delete "$INSTDIR\qt60.jar" Delete "$INSTDIR\qt61.jar" Delete "$INSTDIR\soundspi.jar" Delete "$INSTDIR\utilities.jar" Delete "$INSTDIR\COPYING.txt" Delete "$INSTDIR\LICENSE" Delete "$INSTDIR\CREDITS.txt" Delete "$INSTDIR\CHANGES.txt" Delete "$INSTDIR\HACKING.txt" Delete "$INSTDIR\INSTALL.txt" ; Clean up JClic Delete "$INSTDIR\jclicplayer.jar" Delete "$INSTDIR\icons\install.ico" Delete "$INSTDIR\icons\jclic.ico" ; Clean up JClic author Delete "$INSTDIR\jclicauthor.jar" Delete "$INSTDIR\icons\author.ico" ; Clean up JClic applet Delete "$INSTDIR\jclicapplet.jar" Delete "$INSTDIR\jclicplugin.js" Delete "$INSTDIR\launchApplet.js" Delete "$INSTDIR\author.html" Delete "$INSTDIR\edu\xtec\resources\skins\blue.png" Delete "$INSTDIR\edu\xtec\resources\skins\blue.xml" Delete "$INSTDIR\edu\xtec\resources\skins\listskins.properties" Delete "$INSTDIR\edu\xtec\resources\skins\orange.png" Delete "$INSTDIR\edu\xtec\resources\skins\orange.xml" Delete "$INSTDIR\edu\xtec\resources\skins\simple.png" Delete "$INSTDIR\edu\xtec\resources\skins\simple.xml" Delete "$INSTDIR\edu\xtec\resources\skins\green.xml" Delete "$INSTDIR\edu\xtec\resources\skins\green.png" ; Clean up JClic reports Delete "$INSTDIR\reportServer.jar" Delete "$INSTDIR\jclicreports.jar" Delete "$INSTDIR\icons\reports.ico" ; Remove remaining directories RMDir "$SMPROGRAMS\JClic" RMDir "$INSTDIR\edu\xtec\resources\skins\" RMDir "$INSTDIR\edu\xtec\resources\" RMDir "$INSTDIR\edu\xtec\" RMDir "$INSTDIR\edu\" RMDir "$INSTDIR\icons\" RMDir "$INSTDIR\" SectionEnd ; On initialization Function .onInit !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd Function CheckJavaVersion ClearErrors ReadRegStr $JAVA_VERSION HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" ReadRegStr $JAVA_HOME HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$JAVA_VERSION" "JavaHome" IfErrors Check32 Goto JavaFound Check32: ClearErrors ReadRegStr $JAVA_VERSION HKLM "SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment" "CurrentVersion" ReadRegStr $JAVA_HOME HKLM "SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\$JAVA_VERSION" "JavaHome" IfErrors CheckJDK Goto JavaFound CheckJDK: ClearErrors ReadRegStr $JAVA_VERSION HKLM "SOFTWARE\JavaSoft\JDK" "CurrentVersion" ReadRegStr $JAVA_HOME HKLM "SOFTWARE\JavaSoft\JDK\$JAVA_VERSION" "JavaHome" IfErrors NoJava Goto JavaFound NoJava: MessageBox MB_OK|MB_ICONSTOP "$(noJavaMsg) $(javaNeeded)" GetJava: ExecShell "open" ${GET_JAVA_URL} Quit JavaFound: Push ${MIN_JAVA_VERSION} Push $JAVA_VERSION Call CompareVersions Pop $R0 StrCmp $R0 "1" JavaOk MessageBox MB_OK|MB_ICONSTOP "$(oldJavaMsg) $(javaNeeded)" Goto GetJava JavaOk: DetailPrint "Found JRE $JAVA_VERSION in path $JAVA_HOME" FunctionEnd ;----------------------------------------------------------------------------- ; CompareVersions ; input: ; top of stack = existing version ; top of stack-1 = needed version ; output: ; top of stack = 1 if current version => neded version, else 0 ; version is a string in format "xx.xx.xx.xx" (number of interger sections ; can be different in needed and existing versions) Function CompareVersions ; stack: existing ver | needed ver Exch $R0 Exch Exch $R1 ; stack: $R1|$R0 Push $R1 Push $R0 ; stack: e|n|$R1|$R0 ClearErrors loop: IfErrors VersionNotFound Strcmp $R0 "" VersionTestEnd Call ParseVersion Pop $R0 Exch Call ParseVersion Pop $R1 Exch IntCmp $R1 $R0 +1 VersionOk VersionNotFound Pop $R0 Push $R0 goto loop VersionTestEnd: Pop $R0 Pop $R1 Push $R1 Push $R0 StrCmp $R0 $R1 VersionOk VersionNotFound VersionNotFound: StrCpy $R0 "0" Goto end VersionOk: StrCpy $R0 "1" end: ; stack: e|n|$R1|$R0 Exch $R0 Pop $R0 Exch $R0 ; stack: res|$R1|$R0 Exch ; stack: $R1|res|$R0 Pop $R1 ; stack: res|$R0 Exch Pop $R0 ; stack: res FunctionEnd ;--------------------------------------------------------------------------------------- ; ParseVersion ; input: ; top of stack = version string ("xx.xx.xx.xx") ; output: ; top of stack = first number in version ("xx") ; top of stack-1 = rest of the version string ("xx.xx.xx") Function ParseVersion Exch $R1 ; version Push $R2 Push $R3 StrCpy $R2 1 loop: StrCpy $R3 $R1 1 $R2 StrCmp $R3 "." loopend StrLen $R3 $R1 IntCmp $R3 $R2 loopend loopend IntOp $R2 $R2 + 1 Goto loop loopend: Push $R1 StrCpy $R1 $R1 $R2 Exch $R1 StrLen $R3 $R1 IntOp $R3 $R3 - $R2 IntOp $R2 $R2 + 1 StrCpy $R1 $R1 $R3 $R2 Push $R1 Exch 2 Pop $R3 Exch 2 Pop $R2 Exch 2 Pop $R1 FunctionEnd ;--------------------------------------------------------------------------------------- ; eof keystore/000077500000000000000000000000001335566474600127465ustar00rootroot00000000000000keystore/readme.txt000066400000000000000000000034041335566474600147450ustar00rootroot00000000000000JClic applets must be signed using a digital key. To generate a key for test purposes: - Choose a password. It must be at least 6 characters long. For example, 'passwd' - Execute the following command, replacing 'passwd' by the password. Note: the 'keytool' utility is usually located into the 'bin' folder of the JDK. If this folder is not in $path, write its full pathname. keytool -genkey -keyalg rsa -alias keyForJClic -keystore my.keystore -storepass myStorePassword -keypass myKeyPassword -validity 365 -v - Answer the questions. You will be prompted about: * Name * Organizational unit * Organization * City * State / Province * Two letter country code (see http://en.wikipedia.org/wiki/Country_code) End writting "yes" This will generate the file 'testcert.keystore'. Of course, you can change all this parameters (name of the keystore file, validity, password, alias, etc.) to fit your needs. - You can export a public certificate using this command: keytool -export -alias testcert -keystore testcert.keystore -storepass passwd -file testcert.cer -v This will generate the file 'testcert.cer' Save the files (.keystore and .cer) in a folder of your choice (for example: ~/.keystore), and change the permissions in order to protect it. To use this certificate in the build process of JClic, create a new text file in your home directory and name it ".ant-global.properties". The content of this file should be similar to this: author=Author name keystore.dir=/home/user/.keystore keystore.file=my.keystore keystore.storepass=myStorePassword keystore.keypass=myKeyPassword keystore.alias=keyForJClic That's all: launch the build process of JClic ("ant clean" followed with "ant") and the .jar files will be signed with your new certificate. keystore/testcert-gkr.cer000066400000000000000000000010501335566474600160530ustar00rootroot000000000000000$00  *H 0X1 0 U test1 0 U test1 0 U test1 0 U test1 0 U test1 0 U ad0 071228004905Z 171225004905Z0X1 0 U test1 0 U test1 0 U test1 0 U test1 0 U test1 0 U ad00  *H 0}l_|;hVQctZ.ȐecJE@K/a9ӎfC"z5S!HڰN^ΗEjWҭ忬VelPKcu1QF:&rx\y0  *H YdjW?~X6c(CjIχeQ2 VqkCK3s\/f717^Z54 O^ϗRö@W_DVm3ޢĽ tKӔ —zP,yN +mpGmJQ0ri/'(+gGo24gogC>]kE32}rƝI IWwnKsaltBECA207BBBCBBA94maclen20 alias-listtestcertmac HMAC-SHA-1Rkeylen16salt35E2C56C7159FA3EcipherAES alias-listtestcertmodeOFBp}fj6$t4#!)C!H.HhM{5A RlUJA' IBSS[n2%{5L[_cnTd֧ Ӝɬf^!r9 w9+|?<xx*?D*seƠ+5u4\KcО5k/D_agغ$&e'ԲጽE)qR$)Yzf32/OBø=KumK xIϰZZ^&[8*XȊ>}e #:9;7+{k`,Hn  r'8E,$(mP`h/ YuN\"h'z]1|A()= PkQ|WjO!"6=e3A9sm" uRp1 85_K +W)%i}Kn0  *H S Q[&_26=a[*&Es*E.&.00f~ tpx욹 ]p3IBuǶ:pqұ̐rnT,4U\M21`/9ݲ5p~YNb,ոtZpi'AA>M0ekX.509j0f0GW0  *H 0z1 0 UAQ10U Test state10U Test city10U Test organization10U  Test unit10U Test name0 071206102527Z 171203102527Z0z1 0 UAQ10U Test state10U Test city10U Test organization10U  Test unit10U Test name00  *H 0Ő٨S;H3{ۈEwn?0%F/Oz+D, _ |M>=e3A9sm" uRp1 85_K +W)%i}Kn0  *H S Q Builds, tests, and runs the project JClic. nbeans/manifest.mf000066400000000000000000000001221335566474600144740ustar00rootroot00000000000000Manifest-Version: 1.0 X-COMMENT: Main-Class will be added automatically by build nbeans/nbproject/000077500000000000000000000000001335566474600143355ustar00rootroot00000000000000nbeans/nbproject/build-impl.xml000066400000000000000000002377551335566474600171400ustar00rootroot00000000000000 Must set core.dir Must set author.dir Must set reportServer.dir Must set reportServlets.dir Must set classes.dir Must set src2.dir Must set src3.dir Must set src4.dir Must set build.dir Must set dist.dir Must set build.classes.dir Must set dist.javadoc.dir Must set build.test.classes.dir Must set build.test.results.dir Must set build.classes.excludes Must set dist.jar Must set javac.includes No tests executed. Must set JVM to use for profiling in profiler.info.jvm Must set profiler agent JVM arguments in profiler.info.jvmargs.agent Must select some files in the IDE or set javac.includes To run this application from the command line without Ant, try: java -jar "${dist.jar.resolved}" Must select one file in the IDE or set run.class Must select one file in the IDE or set run.class Must select one file in the IDE or set debug.class Must select one file in the IDE or set debug.class Must set fix.includes This target only works when run from inside the NetBeans IDE. Must select one file in the IDE or set profile.class This target only works when run from inside the NetBeans IDE. This target only works when run from inside the NetBeans IDE. This target only works when run from inside the NetBeans IDE. Must select one file in the IDE or set run.class Must select some files in the IDE or set test.includes Must select one file in the IDE or set run.class Must select one file in the IDE or set applet.url Must select some files in the IDE or set javac.includes Some tests failed; see details above. Must select some files in the IDE or set test.includes Some tests failed; see details above. Must select some files in the IDE or set test.class Must select some method in the IDE or set test.method Some tests failed; see details above. Must select one file in the IDE or set test.class Must select one file in the IDE or set test.class Must select some method in the IDE or set test.method Must select one file in the IDE or set applet.url Must select one file in the IDE or set applet.url nbeans/nbproject/genfiles.properties000066400000000000000000000007231335566474600202510ustar00rootroot00000000000000build.xml.data.CRC32=d3418e09 build.xml.script.CRC32=9cfa9cd4 build.xml.stylesheet.CRC32=8064a381@1.80.1.48 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=d3418e09 nbproject/build-impl.xml.script.CRC32=74b8a27d nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 nbeans/nbproject/project.properties000066400000000000000000000067531335566474600201340ustar00rootroot00000000000000annotation.processing.enabled=true annotation.processing.enabled.in.editor=false annotation.processing.processors.list= annotation.processing.run.all.processors=true annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output application.title=JClic application.vendor=Francesc Busquets author.dir=${file.reference.src-author} build.classes.dir=${build.dir}/classes build.classes.excludes=**/*.java,**/*.form # This directory is removed when the project is cleaned: build.dir=build build.generated.dir=${build.dir}/generated build.generated.sources.dir=${build.dir}/generated-sources # Only compile against the classpath explicitly listed here: build.sysclasspath=ignore build.test.classes.dir=${build.dir}/test/classes build.test.results.dir=${build.dir}/test/results classes.dir=${file.reference.WEB-INF-classes} core.dir=${file.reference.src-core} # Uncomment to specify the preferred debugger connection transport: #debug.transport=dt_socket debug.classpath=\ ${run.classpath} debug.test.classpath=\ ${run.test.classpath} # Files in build.classes.dir which should be excluded from distribution jar dist.archive.excludes= # This directory is removed when the project is cleaned: dist.dir=dist dist.jar=${dist.dir}/JClic.jar dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= file.reference.dbconn.jar=../lib/dbconn.jar file.reference.image4j.jar=../lib/image4j.jar file.reference.jdom.jar=../lib/jdom.jar file.reference.jmf-api-src=../lib/jmf-api/src file.reference.json.jar=../lib/json.jar file.reference.qtjava-api-src=../lib/qtjava-api/src file.reference.report-reportServer=../src/report/reportServer file.reference.report-reportServlets=../src/report/reportServlets file.reference.servlet-api-src=../lib/servlet-api/src file.reference.soundspi.jar=../lib/soundspi.jar file.reference.src-author=../src/author file.reference.src-core=../src/core file.reference.WEB-INF-classes=../src/report/webApp/WEB-INF/classes includes=** jar.compress=false javac.classpath=\ ${file.reference.dbconn.jar}:\ ${file.reference.image4j.jar}:\ ${file.reference.jdom.jar}:\ ${file.reference.json.jar}:\ ${file.reference.soundspi.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false javac.external.vm=false javac.processorpath=\ ${javac.classpath} javac.source=1.7 javac.target=1.7 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} javac.test.processorpath=\ ${javac.test.classpath} javadoc.additionalparam= javadoc.author=false javadoc.encoding=${source.encoding} javadoc.noindex=false javadoc.nonavbar=false javadoc.notree=false javadoc.private=false javadoc.splitindex=true javadoc.use=true javadoc.version=false javadoc.windowtitle= main.class=JClicPlayer manifest.file=manifest.mf meta.inf.dir=${src.dir}/META-INF mkdist.disabled=false platform.active=default_platform reportServer.dir=${file.reference.report-reportServer} reportServlets.dir=${file.reference.report-reportServlets} run.classpath=\ ${javac.classpath}:\ ${build.classes.dir} # Space-separated list of JVM arguments used when running the project. # You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. # To set system properties for unit tests define test-sys-prop.name=value: run.jvmargs= run.test.classpath=\ ${javac.test.classpath}:\ ${build.test.classes.dir} source.encoding=UTF-8 src2.dir=${file.reference.jmf-api-src} src3.dir=${file.reference.qtjava-api-src} src4.dir=${file.reference.servlet-api-src} nbeans/nbproject/project.xml000066400000000000000000000015431335566474600165300ustar00rootroot00000000000000 org.netbeans.modules.java.j2seproject JClic project.properties000066400000000000000000000002721335566474600146660ustar00rootroot00000000000000JCLIC_VERSION=0.3.2.10 JCLIC_DATE=2018-10-05 12\\\:00\\\:00 AUTHOR_VERSION=0.3.2.10 AUTHOR_DATE=2018-10-05 12\\\:00\\\:00 REPORTS_VERSION=0.3.2.10 REPORTS_DATE=2018-10-05 12\\\:00\\\:00 src/000077500000000000000000000000001335566474600116705ustar00rootroot00000000000000src/author/000077500000000000000000000000001335566474600131725ustar00rootroot00000000000000src/author/JClicAuthor.java000066400000000000000000000045301335566474600162060ustar00rootroot00000000000000/* * File : JClicAuthor.java * Created : 17-sep-2002 10:41 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.SingleInstanceJFrame; import edu.xtec.jclic.project.ProjectFileUtils; import edu.xtec.util.StrUtils; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public abstract class JClicAuthor { public static final int INSTANCE_PORT = 5874; /** @param args the command line arguments */ public static void main(String args[]) { long[] counters = { 0, 0, 0 }; int p = StrUtils.getIndexOf("-processZip", args); if (p >= 0 && args.length > p + 1) { try { if (args.length > p + 2 && !args[p + 2].startsWith("-")) { System.out.println("Processing " + args[p + 1]); ProjectFileUtils.processSingleFile(args[p + 1], args[p + 2], null, System.out, counters); } } catch (Exception ex) { System.err.println("Error processing ZIP file: " + ex.getMessage()); } return; } p = StrUtils.getIndexOf("-processZipFolder", args); if (p >= 0 && args.length > p + 2) { try { ProjectFileUtils.processRootFolder(args[p + 1], args[p + 2], null, System.out, counters); } catch (Exception ex) { System.err.println("Error processing ZIP file: " + ex.getMessage()); } return; } SingleInstanceJFrame jcp = new SingleInstanceJFrame("edu.xtec.jclic.AuthorSingleFrame", args, "JClic author", "icons/logo_author.png", "icons/miniauthor.png", INSTANCE_PORT); if (jcp.isArmed()) { jcp.setVisible(true); } else { System.exit(0); } } } src/author/JClicAuthorApplet.java000066400000000000000000000164041335566474600173570ustar00rootroot00000000000000/* * File : JClicAuthotApplet.java * Created : 27-Apr-2008 21:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.RunnableComponent; import edu.xtec.jclic.media.CheckMediaSystem; import edu.xtec.util.Check; import edu.xtec.util.LFUtil; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import java.net.URL; import javax.swing.RootPaneContainer; /** * JClic Author applet. Shows a splash screen at startup and loads a * {@link AuthorSingleFrame} in a separate process. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class JClicAuthorApplet extends javax.swing.JApplet implements edu.xtec.jclic.Constants { private Options options; private RunnableComponent rc; private String activityPack, sequence; private boolean initiated; private boolean trace; private javax.swing.JLabel splashLabel; private boolean isInstaller; // useful constants private static final String HTTP = "http:", FILE = "file:"; private static final String STRING = "string", BOOL = "boolean", URL = "url"; // parameters private static final String ACTIVITY_PACK = "activityPack"; private static final String SEQUENCE = "sequence"; private static final int NUM_PRIVATE_PARAMS = 2; private static final String[][] pInfo = { { ACTIVITY_PACK, STRING, "absolute or relative URL of the JClic project to load" }, { SEQUENCE, STRING, "optional project's starting sequence name" }, { Messages.LANGUAGE, STRING, "two-char language code" }, { Messages.COUNTRY, STRING, "two-char country code" }, { Messages.VARIANT, STRING, "locale variant code" }, { SKIN, STRING, "skin to be used" }, { COOKIE, STRING, "optional session cookie value. currently not used" }, { REPORTER_CLASS, STRING, "reporter class name" }, { REPORTER_PARAMS, STRING, "reporter parameters" }, { EXIT_URL, URL, "URL where to redirect navigation at end" }, { INFO_URL_FRAME, STRING, "optional frame where to display info documents. If unespecified, _BLANK will be used" }, { SYSTEM_SOUNDS, BOOL, "to play or not system sounds" }, { COMPRESS_IMAGES, BOOL, "to compress or not images in cells" }, { LFUtil.LOOK_AND_FEEL, STRING, "look & feel to use" }, { AUDIO_ENABLED, BOOL, "to have audio enabled or not" }, { MEDIA_SYSTEM, STRING, "preferred multimedia system: 'JMF' for Java Media Framework or 'QT' for QuickTime" }, { TRACE, BOOL, "show debug messages in console" } }; /** Creates new JClicAuthorApplet */ public JClicAuthorApplet() { super(); trace = false; rc = null; initiated = false; activityPack = null; sequence = null; options = new Options(this); splashLabel = new javax.swing.JLabel(" ", ResourceManager.getImageIcon("icons/logo_author.png"), javax.swing.SwingConstants.CENTER); splashLabel.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); splashLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); splashLabel.setBackground(BG_COLOR); splashLabel.setOpaque(true); getContentPane().add(splashLabel, java.awt.BorderLayout.CENTER); } @Override public void init() { // init only once by applet instance if (initiated) return; initiated = true; // get "trace" flag trace = TRUE.equals(getParameter(TRACE)); final StringBuilder sb = new StringBuilder(); final RootPaneContainer rpc = this; edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { @Override public Object construct() { // get parameters for (int i = NUM_PRIVATE_PARAMS; i < pInfo.length; i++) { options.put(pInfo[i][0], getParameter(pInfo[i][0])); if (trace) System.out.println(">>> param " + pInfo[i][0] + " is " + getParameter(pInfo[i][0])); } Messages messages; try { messages = edu.xtec.util.PersistentSettings.getMessages(options, DEFAULT_BUNDLE); } catch (Exception ex) { System.err.println("Unable to get default user messages language!\n" + ex); messages = Messages.getMessages(options, DEFAULT_BUNDLE); } messages.addBundle(COMMON_SETTINGS); if (splashLabel != null) splashLabel.setText(messages.get("LOADING")); if (!Check.checkSignature(options, true)) return null; CheckMediaSystem.check(options, false); // build player try { rc = new edu.xtec.jclic.AuthorSingleFrame(options); } catch (Exception ex) { sb.append("ERROR: ").append(ex); } return rc; } @Override public void finished() { if (getValue() == null) { if (isInstaller && options.getString(EXIT_URL) != null) { try { String url = options.getString(EXIT_URL); if (url.indexOf(':') < 0) // no protocol, assume "file://" url = "file://" + url; getAppletContext().showDocument(new URL(url)); } catch (Exception ex) { sb.append("ERROR: ").append(ex); } } // no player build! if (splashLabel != null) { String s = sb.substring(0); splashLabel.setText(s); System.err.println(s); } } else { // remove label and place player getContentPane().removeAll(); splashLabel = null; // rc.addTo(getContentPane(), java.awt.BorderLayout.CENTER); rc.addTo(rpc, java.awt.BorderLayout.CENTER); getRootPane().revalidate(); // load project javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { rc.start(activityPack, sequence); } }); } } }; if (trace) System.out.println(">>> initializing..."); // launch swingWorker sw.start(); } @Override public void start() { if (trace) System.out.println(">>> applet started"); } @Override public void stop() { if (rc != null) rc.stop(); if (trace) System.out.println(">>> applet stopped"); } @Override public void destroy() { if (rc != null) { if (trace) System.out.println(">>> destroying applet..."); getContentPane().removeAll(); rc.end(); rc = null; initiated = false; } if (trace) System.out.println(">>> applet destroyed"); } @Override public String getAppletInfo() { return "JClic Author applet"; } @Override public String[][] getParameterInfo() { return pInfo; } } src/author/edu/000077500000000000000000000000001335566474600137475ustar00rootroot00000000000000src/author/edu/xtec/000077500000000000000000000000001335566474600147125ustar00rootroot00000000000000src/author/edu/xtec/jclic/000077500000000000000000000000001335566474600157765ustar00rootroot00000000000000src/author/edu/xtec/jclic/ActivityEditor.java000066400000000000000000000167601335566474600216160ustar00rootroot00000000000000/* * File : ActivityEditor.java * Created : 18-sep-2002 17:28 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.automation.AutoContentProviderEditor; import edu.xtec.jclic.bags.*; import edu.xtec.jclic.boxes.ActiveBagContentEditor; import edu.xtec.jclic.boxes.ActiveBoxContentEditor; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.media.EventSoundsEditorPanel; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.jclic.skins.Skin; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.TripleString; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Stroke; import java.util.ArrayList; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class ActivityEditor extends Editor { protected static ImageIcon icon; /** Creates a new instance of ActivityEditor */ public ActivityEditor(Activity act) { super(act); } protected void createChildren() { Activity act = getActivity(); if (act.acp != null) act.acp.getEditor(this); } public AutoContentProviderEditor getAutoContentProviderEditor() { return (AutoContentProviderEditor) getFirstChild(AutoContentProviderEditor.class); } public Class getEditorPanelClass() { return ActivityEditorPanel.class; } protected static final int COMMON_PANELS = 3; public synchronized EditorPanel createEditorPanel(Options options) { ActivityEditorPanel panel = new ActivityEditorPanel(options); panel.addInternalPanel(new ActivityEditorOptionsPanel(panel), null, null); panel.addInternalPanel(new ActivityEditorFramePanel(panel), null, null); panel.addInternalPanel(new ActivityEditorMsgPanel(panel), null, null); createPanels(panel); return panel; } @Override public String getTitleKey() { return "edit_act"; } protected void createPanels(ActivityEditorPanel panel) { } public Activity getActivity() { return (Activity) getFirstObject(Activity.class); } public JClicProjectEditor getProjectEditor() { return (JClicProjectEditor) getFirstParent(JClicProjectEditor.class); } public MediaBagEditor getMediaBagEditor() { JClicProjectEditor jcpe = getProjectEditor(); return jcpe == null ? null : jcpe.getMediaBagEditor(); } public Options getOptions() { return getActivity().getProject().getBridge().getOptions(); } public ActivityBagElementEditor getActivityBagElementEditor() { return (ActivityBagElementEditor) getFirstParent(ActivityBagElementEditor.class); } public ActivityBagEditor getActivityBagEditor() { return (ActivityBagEditor) getFirstParent(ActivityBagEditor.class); } public boolean rename(String newName, Component parent, Messages msg) { String oldName = getActivity().name; String errMsg = null; newName = newName.trim(); boolean result = false; if (oldName.equals(newName)) { // do nothing } else if (newName.length() < 1) errMsg = "edit_media_rename_invalid"; else if (getActivityBagEditor().getActivityBag().getElementByName(newName) != null) errMsg = "edit_media_rename_exists"; else { result = getProjectEditor().nameChanged(Constants.T_ACTIVITY, oldName, newName); } if (errMsg != null && msg != null && parent != null) { msg.showAlert(parent, errMsg); } return result; } public synchronized void saveData() { ActivityBagElementEditor abee = getActivityBagElementEditor(); if (abee != null) { ActivityBagElement abe = abee.getActivityBagElement(); String name = abe.getName(); abe.setData(getActivity().getJDomElement()); if (!abe.getName().equals(name)) { // FIRE NAME CHANGE } if (isModified()) abee.setModified(true); } } @Override public String toString() { return getActivity().name; } @Override public void setActionsOwner() { if (getEditorParent() != null) getEditorParent().setActionsOwner(); } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/miniclic.png"); return icon; } @Override public Icon getIcon(boolean leaf, boolean expanded) { return getIcon(); } static final BasicStroke dashedStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 10.0f, new float[] { 5.0f }, 0.0f); public void drawPreview(Graphics2D g2, Rectangle bounds, int margin) { Rectangle r = new Rectangle(bounds.x + margin, bounds.y + margin, bounds.width - 2 * margin, bounds.height - 2 * margin); g2.setXORMode(Color.white); Stroke str = g2.getStroke(); g2.setStroke(dashedStroke); g2.draw(r); g2.setPaintMode(); g2.setStroke(str); } public boolean nameChanged(int type, String oldName, String newName) { boolean result = false; Activity act = getActivity(); if ((type & Constants.T_ACTIVITY) != 0 && oldName.equals(act.name)) { act.name = newName; result = true; } for (int i = 0; i < act.messages.length; i++) { if (act.messages[i] != null) result |= ActiveBoxContentEditor.nameChanged(act.messages[i], type, oldName, newName); } if ((type & Constants.T_IMAGE) != 0 && oldName.equals(act.bgImageFile)) { act.bgImageFile = newName; result = true; } if (act.eventSounds != null && (type & (Constants.T_AUDIO | Constants.T_MIDI)) != 0) { result |= EventSoundsEditorPanel.nameChanged(act.eventSounds, type, oldName, newName); } if ((type & Constants.T_XML) != 0 && oldName.equals(act.skinFileName) && !oldName.startsWith(Skin.INTERNAL_SKIN_PREFIX)) { act.skinFileName = newName; result = true; // Explore skin dependences... } if (act.abc != null) { for (int i = 0; i < act.abc.length; i++) { if (act.abc[i] != null) result |= ActiveBagContentEditor.nameChanged(act.abc[i], type, oldName, newName); } } if (result) { setModified(true); } return result; } public static final String SYSTEM_LIST = "activities.listactivities"; public static List getSystemActivityList(Options options) { List result; try { result = TripleString.getTripleList(SYSTEM_LIST, options, false, true, true); } catch (Exception ex) { System.err.println("Error reading list of activities!\n" + ex); result = new ArrayList(); } return result; } } src/author/edu/xtec/jclic/ActivityEditorFramePanel.form000066400000000000000000001061101335566474600235600ustar00rootroot00000000000000

src/author/edu/xtec/jclic/ActivityEditorFramePanel.java000066400000000000000000000654311335566474600235500ustar00rootroot00000000000000/* * File : ActivityEditorFramePanel.java * Created : 10-jun-2002 09:59 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.beans.*; import edu.xtec.jclic.misc.Gradient; import edu.xtec.jclic.misc.Utils; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.util.EventObject; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.border.BevelBorder; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ActivityEditorFramePanel extends ActivityEditorInternalPanel { edu.xtec.jclic.bags.MediaBagEditor mediaBagEditor; /** Creates new form MenuEditorPanel */ public ActivityEditorFramePanel(ActivityEditorPanel parent) { super(parent); initComponents(); setEnabled(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel actBgColorLb; javax.swing.JLabel actGradientLb; javax.swing.JLabel bgColorLb; javax.swing.JPanel gameWindowPanel; javax.swing.JLabel gradientLb; java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel imgLb; javax.swing.JPanel mainWindowPanel; javax.swing.JLabel marginLb; javax.swing.JPanel previewPanel0; javax.swing.JLabel spacer1; javax.swing.JLabel xLb; javax.swing.JLabel yLb; locationGroup = new javax.swing.ButtonGroup(); previewPanel0 = new javax.swing.JPanel(); previewPanel = new PreviewPanel(); mainWindowPanel = new javax.swing.JPanel(); bgColorLb = new javax.swing.JLabel(); bgColorBtn = new edu.xtec.jclic.beans.ColorButton(); bgColorBtn.setOptions(options); gradientLb = new javax.swing.JLabel(); gradientButton = new edu.xtec.jclic.beans.GradientButton(); gradientButton.setOptions(options); imgLb = new javax.swing.JLabel(); imgButton = new edu.xtec.jclic.beans.ImgButton(); imgButton.setOptions(options); tiledBgImgChk = new javax.swing.JCheckBox(); gameWindowPanel = new javax.swing.JPanel(); actBgColorLb = new javax.swing.JLabel(); actBgColorBtn = new edu.xtec.jclic.beans.ColorButton(); actBgColorBtn.setOptions(options); actGradientLb = new javax.swing.JLabel(); actGradientButton = new edu.xtec.jclic.beans.GradientButton(); actGradientButton.setOptions(options); transpChk = new javax.swing.JCheckBox(); borderChk = new javax.swing.JCheckBox(); marginLb = new javax.swing.JLabel(); marginInt = new edu.xtec.jclic.beans.SmallIntEditor(); spacer1 = new javax.swing.JLabel(); locationLb = new javax.swing.JLabel(); centeredBtn = new javax.swing.JRadioButton(); absoluteBtn = new javax.swing.JRadioButton(); xLb = new javax.swing.JLabel(); xInt = new edu.xtec.jclic.beans.SmallIntEditor(); yLb = new javax.swing.JLabel(); yInt = new edu.xtec.jclic.beans.SmallIntEditor(); setLayout(new java.awt.GridBagLayout()); previewPanel0.setLayout(new java.awt.BorderLayout()); previewPanel0.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_act_preview"))); previewPanel.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0))); previewPanel0.add(previewPanel, java.awt.BorderLayout.CENTER); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(previewPanel0, gridBagConstraints); mainWindowPanel.setLayout(new java.awt.GridBagLayout()); mainWindowPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_act_mainWindow"))); bgColorLb.setLabelFor(bgColorBtn); bgColorLb.setText(options.getMsg("edit_act_bgColor")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mainWindowPanel.add(bgColorLb, gridBagConstraints); bgColorBtn.setToolTipText(options.getMsg("edit_act_bgColor_tooltip")); bgColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mainWindowPanel.add(bgColorBtn, gridBagConstraints); gradientLb.setLabelFor(gradientButton); gradientLb.setText(options.getMsg("edit_act_gradient")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mainWindowPanel.add(gradientLb, gridBagConstraints); gradientButton.setToolTipText(options.getMsg("edit_act_gradient_tooltip")); gradientButton.addPropertyChangeListener(GradientButton.PROP_GRADIENT, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mainWindowPanel.add(gradientButton, gridBagConstraints); imgLb.setLabelFor(imgButton); imgLb.setText(options.getMsg("edit_act_image")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mainWindowPanel.add(imgLb, gridBagConstraints); imgButton.setToolTipText(options.getMsg("edit_act_image_tooltip")); imgButton.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; mainWindowPanel.add(imgButton, gridBagConstraints); tiledBgImgChk.setToolTipText(options.getMsg("edit_act_tiledBgImg_tooltip")); tiledBgImgChk.setText(options.getMsg("edit_act_tiledBgImg")); tiledBgImgChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; mainWindowPanel.add(tiledBgImgChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(mainWindowPanel, gridBagConstraints); gameWindowPanel.setLayout(new java.awt.GridBagLayout()); gameWindowPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_act_gameWindow"))); actBgColorLb.setLabelFor(actBgColorBtn); actBgColorLb.setText(options.getMsg("edit_act_bgColor")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gameWindowPanel.add(actBgColorLb, gridBagConstraints); actBgColorBtn.setToolTipText(options.getMsg("edit_act_bgColor_tooltip")); actBgColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gameWindowPanel.add(actBgColorBtn, gridBagConstraints); actGradientLb.setLabelFor(actGradientButton); actGradientLb.setText(options.getMsg("edit_act_gradient")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gameWindowPanel.add(actGradientLb, gridBagConstraints); actGradientButton.setToolTipText(options.getMsg("edit_act_gradient_tooltip")); actGradientButton.addPropertyChangeListener(GradientButton.PROP_GRADIENT, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gameWindowPanel.add(actGradientButton, gridBagConstraints); transpChk.setToolTipText(options.getMsg("edit_act_transparent_tooltip")); transpChk.setText(options.getMsg("edit_act_transparent")); transpChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gameWindowPanel.add(transpChk, gridBagConstraints); borderChk.setToolTipText(options.getMsg("edit_act_border_tooltip")); borderChk.setText(options.getMsg("edit_act_border")); borderChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gameWindowPanel.add(borderChk, gridBagConstraints); marginLb.setLabelFor(marginInt); marginLb.setText(options.getMsg("edit_act_margin")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gameWindowPanel.add(marginLb, gridBagConstraints); marginInt.setToolTipText(options.getMsg("edit_act_margin_tooltip")); marginInt.setMax(999); marginInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gameWindowPanel.add(marginInt, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gameWindowPanel.add(spacer1, gridBagConstraints); locationLb.setText(options.getMsg("edit_act_location")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gameWindowPanel.add(locationLb, gridBagConstraints); centeredBtn.setToolTipText(options.getMsg("edit_act_centered_tooltip")); centeredBtn.setSelected(true); centeredBtn.setText(options.getMsg("edit_act_centered")); locationGroup.add(centeredBtn); centeredBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gameWindowPanel.add(centeredBtn, gridBagConstraints); absoluteBtn.setToolTipText(options.getMsg("edit_act_absolute_tooltip")); absoluteBtn.setText(options.getMsg("edit_act_absolute")); locationGroup.add(absoluteBtn); absoluteBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gameWindowPanel.add(absoluteBtn, gridBagConstraints); xLb.setLabelFor(xInt); xLb.setText(options.getMsg("edit_act_x")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gameWindowPanel.add(xLb, gridBagConstraints); xInt.setToolTipText(options.getMsg("edit_act_x_tooltip")); xInt.setMax(999); xInt.setMin(-999); xInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gameWindowPanel.add(xInt, gridBagConstraints); yLb.setLabelFor(yInt); yLb.setText(options.getMsg("edit_act_y")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gameWindowPanel.add(yLb, gridBagConstraints); yInt.setToolTipText(options.getMsg("edit_act_y_tooltip")); yInt.setMax(999); yInt.setMin(-999); yInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gameWindowPanel.add(yInt, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(gameWindowPanel, gridBagConstraints); } // GEN-END:initComponents @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); marginInt.setEnabled(enabled); bgColorBtn.setEnabled(enabled); gradientButton.setEnabled(enabled); imgButton.setEnabled(enabled); tiledBgImgChk.setEnabled(enabled && imgButton.getObject() != null); borderChk.setEnabled(enabled); transpChk.setEnabled(enabled); actBgColorBtn.setEnabled(enabled); actGradientButton.setEnabled(enabled); absoluteBtn.setEnabled(enabled); centeredBtn.setEnabled(enabled); xInt.setEnabled(enabled && absoluteBtn.isSelected()); yInt.setEnabled(enabled && absoluteBtn.isSelected()); } @Override public boolean eventPerformed(EventObject ev) { Object cmp = ev == null ? null : ev.getSource(); if (cmp == null || cmp == imgButton) { tiledBgImgChk.setEnabled(imgButton.getObject() != null); } if (cmp == null || cmp == centeredBtn || cmp == absoluteBtn) { xInt.setEnabled(absoluteBtn.isSelected()); yInt.setEnabled(absoluteBtn.isSelected()); } ((PreviewPanel) previewPanel).reset(); return ev != null; } /* * public void clear() { mediaBagEditor=null; * marginInt.setValue(Activity.DEFAULT_MARGIN); * ((ColorButton)bgColorBtn).setColor(Activity.DEFAULT_BG_COLOR); * gradientButton.setGradient(null); imgButton.setImgName(null); * imgButton.setMediaBagEditor(null); tiledBgImgChk.setSelected(true); * borderChk.setSelected(true); transpChk.setSelected(false); * ((ColorButton)actBgColorBtn).setColor(Activity.DEFAULT_BG_COLOR); * actGradientButton.setGradient(null); centeredBtn.setSelected(true); * absoluteBtn.setSelected(false); xInt.setValue(0); yInt.setValue(0); * eventPerformed(null); } */ public void fillData() { Activity act = getActivity(); marginInt.setValue(act == null ? Activity.DEFAULT_MARGIN : act.margin); mediaBagEditor = act == null ? null : getActivityEditor().getMediaBagEditor(); ((ColorButton) bgColorBtn).setColor(act == null ? Activity.DEFAULT_BG_COLOR : act.bgColor); gradientButton.setGradient(act == null ? null : act.bgGradient); imgButton.setMediaBagEditor(mediaBagEditor); imgButton.setImgName(act == null ? null : act.bgImageFile); tiledBgImgChk.setSelected(act == null ? true : (act.tiledBgImg || act.bgImageFile == null)); ((PreviewPanel) previewPanel).reset(); borderChk.setSelected(act == null ? true : act.border); transpChk.setSelected(act == null ? false : act.transparentBg); ((ColorButton) actBgColorBtn).setColor(act == null ? Activity.DEFAULT_BG_COLOR : act.activityBgColor); actGradientButton.setGradient(act == null ? null : act.activityBgGradient); absoluteBtn.setSelected(act == null ? false : act.absolutePositioned); centeredBtn.setSelected(act == null ? true : !act.absolutePositioned); if (act != null && act.absolutePosition != null) { xInt.setValue(act.absolutePosition.x); yInt.setValue(act.absolutePosition.y); } else { xInt.setValue(0); yInt.setValue(0); } eventPerformed(null); } public void saveData() { Activity act = getActivity(); if (act != null) { act.margin = marginInt.getValue(); act.bgColor = ((ColorButton) bgColorBtn).getColor(); act.bgGradient = gradientButton.getGradient(); act.bgImageFile = imgButton.getImgName(); act.tiledBgImg = tiledBgImgChk.isSelected() && act.bgImageFile != null; act.border = borderChk.isSelected(); act.transparentBg = transpChk.isSelected(); act.activityBgColor = ((ColorButton) actBgColorBtn).getColor(); act.activityBgGradient = actGradientButton.getGradient(); act.absolutePositioned = absoluteBtn.isSelected(); if (act.absolutePositioned) { act.absolutePosition = new Point(xInt.getValue(), yInt.getValue()); } else { act.absolutePosition = null; } } } /* * public boolean dataChanged(){ boolean result=false; Activity * act=getActivity(); if(act!=null){ result = * * !act.bgColor.equals(((ColorButton)bgColorBtn).getColor()) || * !Utils.compareObjects(act.bgGradient, gradientButton.getGradient()) || * !Utils.compareObjects(act.bgImageFile, imgButton.getImgName()) || * tiledBgImgChk.isSelected()!=act.tiledBgImg || * marginInt.getValue()!=act.margin || * * !act.activityBgColor.equals(((ColorButton)actBgColorBtn).getColor()) || * !Utils.compareObjects(act.activityBgGradient, * actGradientButton.getGradient()) || transpChk.isSelected()!=act.transparentBg * || borderChk.isSelected()!=act.border || * centeredBtn.isSelected()==act.absolutePositioned || (absoluteBtn.isSelected() * && (act.absolutePosition==null || xInt.getValue()!=act.absolutePosition.x || * yInt.getValue()!=act.absolutePosition.y)); } return result; } */ protected javax.swing.Icon getIcon() { return edu.xtec.util.ResourceManager.getImageIcon("icons/frame.gif"); } protected String getTitle() { return options.getMsg("edit_act_panels_frame"); } protected String getTooltip() { return options.getMsg("edit_act_panels_frame_tooltip"); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JRadioButton absoluteBtn; private edu.xtec.jclic.beans.ColorButton actBgColorBtn; private edu.xtec.jclic.beans.GradientButton actGradientButton; private edu.xtec.jclic.beans.ColorButton bgColorBtn; private javax.swing.JCheckBox borderChk; private javax.swing.JRadioButton centeredBtn; private edu.xtec.jclic.beans.GradientButton gradientButton; private edu.xtec.jclic.beans.ImgButton imgButton; private javax.swing.ButtonGroup locationGroup; private javax.swing.JLabel locationLb; private edu.xtec.jclic.beans.SmallIntEditor marginInt; private javax.swing.JPanel previewPanel; private javax.swing.JCheckBox tiledBgImgChk; private javax.swing.JCheckBox transpChk; private edu.xtec.jclic.beans.SmallIntEditor xInt; private edu.xtec.jclic.beans.SmallIntEditor yInt; // End of variables declaration//GEN-END:variables class PreviewPanel extends JPanel { InnerPreviewPane innerPane; Image bgImage; boolean tiledBgImg; Gradient bgGradient, actBgGradient; Point bgImageOrigin = new Point(); double scale = 1.0; PreviewPanel() { super(); setLayout(null); innerPane = new InnerPreviewPane(); add(innerPane); } class InnerPreviewPane extends JPanel { InnerPreviewPane() { super(); setLayout(null); } public void fitTo(Rectangle proposedRect, Rectangle maxRect) { Activity act = getActivity(); Dimension d = new Dimension(act == null ? Activity.DEFAULT_WIDTH : act.getWindowSize().width, act == null ? Activity.DEFAULT_HEIGHT : act.getWindowSize().height); int w = Math.max(Activity.MINIMUM_WIDTH, Math.min(proposedRect.width, (int) (scale * d.width))); int h = Math.max(Activity.MINIMUM_HEIGHT, Math.min(proposedRect.height, (int) (scale * d.height))); boolean b = centeredBtn.isSelected(); int xp = (b ? 0 : bgImageOrigin.x) + Math.max(0, b ? proposedRect.x + (proposedRect.width - w) / 2 : (int) (scale * xInt.getValue())); int yp = (b ? 0 : bgImageOrigin.y) + Math.max(0, b ? proposedRect.y + (proposedRect.height - h) / 2 : (int) (scale * yInt.getValue())); if (xp > maxRect.width - Activity.MINIMUM_WIDTH) xp = maxRect.width - Activity.MINIMUM_WIDTH; if (xp + w > maxRect.width) w = maxRect.width - xp; if (yp > maxRect.height - Activity.MINIMUM_HEIGHT) yp = maxRect.height - Activity.MINIMUM_HEIGHT; if (yp + h > maxRect.height) h = maxRect.height - yp; setBounds(xp, yp, w, h); } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; Rectangle rBounds = new Rectangle(0, 0, getWidth(), getHeight()); if (!isOpaque() || actBgGradient == null || actBgGradient.hasTransparency()) super.paintComponent(g); RenderingHints rh = g2.getRenderingHints(); if (isOpaque() && actBgGradient != null) { g2.setRenderingHints(edu.xtec.jclic.Constants.DEFAULT_RENDERING_HINTS); actBgGradient.paint(g2, rBounds); } if (getActivityEditor() != null) getActivityEditor().drawPreview(g2, rBounds, marginInt.getValue()); g2.setRenderingHints(rh); } } public void reset() { bgImage = null; bgGradient = null; actBgGradient = null; bgImage = null; tiledBgImg = true; if (mediaBagEditor != null) { String bgImageFile = imgButton.getImgName(); if (bgImageFile != null) { try { bgImage = mediaBagEditor.getMediaBag().getImageElement(bgImageFile).getImage(); } catch (Exception ex) { options.getMessages().showErrorWarning(this, "ERROR", ex); } } tiledBgImg = tiledBgImgChk.isSelected(); } innerPane.setBorder(borderChk.isSelected() ? BorderFactory.createBevelBorder(BevelBorder.RAISED) : BorderFactory.createEmptyBorder()); innerPane.setOpaque(!transpChk.isSelected()); innerPane.setBackground(actBgColorBtn.getColor()); actBgGradient = actGradientButton.getGradient(); bgGradient = gradientButton.getGradient(); setBackground(bgColorBtn.getColor()); revalidate(); repaint(); } @Override public void doLayout() { scale = 1.0; bgImageOrigin.x = 0; bgImageOrigin.y = 0; Rectangle bounds = getBounds(); int margin = marginInt.getValue(); Rectangle proposedRect = new Rectangle(margin, margin, bounds.width - 2 * margin, bounds.height - 2 * margin); if (bgImage != null && !tiledBgImg) { int w = bgImage.getWidth(this); int h = bgImage.getHeight(this); if (w > 0 && h > 0 && (w > getWidth() || h > getHeight())) { scale = Math.min((double) getWidth() / w, (double) getHeight() / h); w = (int) (scale * w); h = (int) (scale * h); } else scale = 1.0; bgImageOrigin.x = (getWidth() - w) / 2; bgImageOrigin.y = (getHeight() - h) / 2; if (absoluteBtn.isSelected()) { proposedRect.x = bgImageOrigin.x; proposedRect.y = bgImageOrigin.y; proposedRect.width -= (bgImageOrigin.x - margin); proposedRect.height -= (bgImageOrigin.y - margin); proposedRect.width = Math.min(proposedRect.width, bounds.width); proposedRect.height = Math.min(proposedRect.height, bounds.height); } } innerPane.fitTo(proposedRect, bounds); } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; Rectangle rBounds = new Rectangle(0, 0, getWidth(), getHeight()); if (bgGradient == null || bgGradient.hasTransparency()) super.paintComponent(g); if (bgGradient != null || bgImage != null) { RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(edu.xtec.jclic.Constants.DEFAULT_RENDERING_HINTS); if (bgGradient != null) bgGradient.paint(g2, rBounds); if (bgImage != null) { Rectangle r = new Rectangle(0, 0, bgImage.getWidth(this), bgImage.getHeight(this)); Rectangle gBounds = g2.getClipBounds(); if (!tiledBgImg) { r.setLocation(bgImageOrigin); if (r.intersects(gBounds)) { if (scale == 1.0) g2.drawImage(bgImage, bgImageOrigin.x, bgImageOrigin.y, this); else { int w0 = bgImage.getWidth(this); int h0 = bgImage.getHeight(this); int w = (int) (scale * w0); int h = (int) (scale * h0); g2.drawImage(bgImage, bgImageOrigin.x, bgImageOrigin.y, bgImageOrigin.x + w, bgImageOrigin.y + h, 0, 0, w0, h0, this); } } } else { Utils.tileImage(g2, bgImage, rBounds, r, this); } } g2.setRenderingHints(rh); } } } } src/author/edu/xtec/jclic/ActivityEditorInternalPanel.java000066400000000000000000000035741335566474600242720ustar00rootroot00000000000000/* * File : ActivityEditorInternalPanel.java * Created : 30-sep-2002 09:41 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public abstract class ActivityEditorInternalPanel extends edu.xtec.util.CtrlPanel { protected Options options; protected ActivityEditorPanel parent; /** Creates a new instance of ActivityEditorInternalPane */ public ActivityEditorInternalPanel(ActivityEditorPanel parent) { this.parent = parent; this.options = parent.getOptions(); } public Options getOptions() { return options; }; public ActivityEditor getActivityEditor() { return parent.getActivityEditor(); } public Activity getActivity() { ActivityEditor ae = getActivityEditor(); return ae == null ? null : ae.getActivity(); } protected abstract void fillData(); protected abstract void saveData(); protected abstract javax.swing.Icon getIcon(); protected abstract String getTitle(); protected abstract String getTooltip(); // A ELIMINAR: protected final void resetPanel(java.util.EventObject ev) { } protected final void clear() { }; } src/author/edu/xtec/jclic/ActivityEditorMsgPanel.form000066400000000000000000000255501335566474600232640ustar00rootroot00000000000000
src/author/edu/xtec/jclic/ActivityEditorMsgPanel.java000066400000000000000000000232551335566474600232420ustar00rootroot00000000000000/* * File : ActivityEditorMsgPanel.java * Created : 10-jun-2002 09:59 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.ActiveBoxContentEditor; import edu.xtec.jclic.boxes.ActiveBoxPreviewPanel; import edu.xtec.jclic.boxes.BoxBase; import java.util.EventObject; import javax.swing.JCheckBox; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ActivityEditorMsgPanel extends ActivityEditorInternalPanel { int NUM_MSG = 3; ActiveBoxPreviewPanel[] abpp = new ActiveBoxPreviewPanel[NUM_MSG]; JCheckBox[] abppChk = new JCheckBox[NUM_MSG]; /** Creates new form MenuEditorPanel */ public ActivityEditorMsgPanel(ActivityEditorPanel parent) { super(parent); initComponents(); abpp[0] = (ActiveBoxPreviewPanel) initialMsgPanel; abppChk[0] = initialMsgChk; abpp[1] = (ActiveBoxPreviewPanel) finalMsgPanel; abppChk[1] = finalMsgChk; abpp[2] = (ActiveBoxPreviewPanel) errorMsgPanel; abppChk[2] = errorMsgChk; setEnabled(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel spacer; initialMsgChk = new javax.swing.JCheckBox(); initialMsgPanel = new ActiveBoxPreviewPanel(null); finalMsgChk = new javax.swing.JCheckBox(); finalMsgPanel = new ActiveBoxPreviewPanel(null); errorMsgChk = new javax.swing.JCheckBox(); errorMsgPanel = new ActiveBoxPreviewPanel(null); spacer = new javax.swing.JLabel(); setLayout(new java.awt.GridBagLayout()); initialMsgChk.setToolTipText(options.getMsg("edit_act_msg_initial_tooltip")); initialMsgChk.setText(options.getMsg("edit_act_msg_initial")); initialMsgChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST; add(initialMsgChk, gridBagConstraints); initialMsgPanel.setToolTipText(options.getMsg("edit_act_msg_initial_tooltip")); initialMsgPanel.setPreferredSize(new java.awt.Dimension(500, 40)); initialMsgPanel.setMinimumSize(new java.awt.Dimension(200, 40)); initialMsgPanel.setMaximumSize(new java.awt.Dimension(32767, 40)); initialMsgPanel.addMouseListener(getMouseClickListener()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(initialMsgPanel, gridBagConstraints); finalMsgChk.setToolTipText(options.getMsg("edit_act_msg_final_tooltip")); finalMsgChk.setText(options.getMsg("edit_act_msg_final")); finalMsgChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(finalMsgChk, gridBagConstraints); finalMsgPanel.setToolTipText(options.getMsg("edit_act_msg_final_tooltip")); finalMsgPanel.setPreferredSize(new java.awt.Dimension(500, 40)); finalMsgPanel.setMinimumSize(new java.awt.Dimension(200, 40)); finalMsgPanel.setMaximumSize(new java.awt.Dimension(32767, 40)); finalMsgPanel.addMouseListener(getMouseClickListener()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(finalMsgPanel, gridBagConstraints); errorMsgChk.setToolTipText(options.getMsg("edit_act_msg_error_tooltip")); errorMsgChk.setText(options.getMsg("edit_act_msg_error")); errorMsgChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(errorMsgChk, gridBagConstraints); errorMsgPanel.setToolTipText(options.getMsg("edit_act_msg_error_tooltip")); errorMsgPanel.setPreferredSize(new java.awt.Dimension(500, 40)); errorMsgPanel.setMinimumSize(new java.awt.Dimension(200, 40)); errorMsgPanel.setMaximumSize(new java.awt.Dimension(32767, 40)); errorMsgPanel.addMouseListener(getMouseClickListener()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; add(errorMsgPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; add(spacer, gridBagConstraints); } // GEN-END:initComponents @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); for (int i = 0; i < NUM_MSG; i++) { abppChk[i].setEnabled(enabled); abpp[i].setEnabled(enabled); } } @Override public boolean eventPerformed(EventObject ev) { Object src = (ev == null ? null : ev.getSource()); boolean result = (src != null && isEnabled()); if (result) { for (int i = 0; i < NUM_MSG; i++) { if (src == abppChk[i]) { abpp[i].getActiveBox().setInactive(!abppChk[i].isSelected()); break; } else if (src == abpp[i]) { ActiveBoxContent abc = ActiveBoxContentEditor.getActiveBoxContent(abpp[i].getActiveBoxContent(), this, options, getActivityEditor().getMediaBagEditor(), abpp[i].getActiveBox()); if (abc != null) { if (!abppChk[i].isSelected()) { abppChk[i].setSelected(true); abpp[i].getActiveBox().setInactive(false); } abpp[i].setActiveBoxContent(abc); } else result = false; } } } return result; } /* * public void clear() { for(int i=0; i
src/author/edu/xtec/jclic/ActivityEditorOptionsPanel.java000066400000000000000000001224331335566474600241450ustar00rootroot00000000000000/* * File : ActivityEditorOptionsPanel.java * Created : 10-jun-2002 09:59 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.automation.AutoContentProvider; import edu.xtec.jclic.automation.AutoContentProviderEditor; import edu.xtec.jclic.bags.ActivityBagElementEditor; import edu.xtec.jclic.bags.SelectActivityClass; import edu.xtec.jclic.beans.EventSoundsButton; import edu.xtec.jclic.beans.SmallIntEditor; import edu.xtec.util.ProgressDialog; import edu.xtec.util.StrUtils; import edu.xtec.util.TripleString; import java.util.ArrayList; import java.util.EventObject; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class ActivityEditorOptionsPanel extends ActivityEditorInternalPanel { List contentProviders, allContentProviders; /** Creates new form MenuEditorPanel */ public ActivityEditorOptionsPanel(ActivityEditorPanel parent) { super(parent); allContentProviders = AutoContentProviderEditor.getSystemContentProvidersList(options); initComponents(); checkContentProviders(); evSoundsBtn.setOptions(options); setEnabled(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.ButtonGroup helpBtnButtonGroup = new javax.swing.ButtonGroup(); javax.swing.ButtonGroup infoBtnButtonGroup = new javax.swing.ButtonGroup(); scroll = new javax.swing.JScrollPane(); scroll.getVerticalScrollBar().setUnitIncrement(16); javax.swing.JPanel mainPanel = new javax.swing.JPanel(); descPanel = new edu.xtec.jclic.beans.RollPanel(); javax.swing.JLabel classLb = new javax.swing.JLabel(); className = new javax.swing.JLabel(); chClassBtn = new javax.swing.JButton(); chClassBtn.addActionListener(this); javax.swing.JLabel nameLb = new javax.swing.JLabel(); nameText = new javax.swing.JLabel(); chNameBtn = new javax.swing.JButton(); chNameBtn.addActionListener(this); javax.swing.JLabel descLb = new javax.swing.JLabel(); descScroll = new javax.swing.JScrollPane(); descText = new javax.swing.JTextPane(); reportPanel = new edu.xtec.jclic.beans.RollPanel(); bIncludeInReportsChk = new javax.swing.JCheckBox(); javax.swing.JLabel codeLb = new javax.swing.JLabel(); codeText = new javax.swing.JTextField(); bRegisterActionsChk = new javax.swing.JCheckBox(); uiPanel = new edu.xtec.jclic.beans.RollPanel(); javax.swing.JLabel skinLb = new javax.swing.JLabel(); skinCombo = new javax.swing.JComboBox(edu.xtec.jclic.skins.Skin.getSystemSkinList(true)); javax.swing.JLabel evSoundsLb = new javax.swing.JLabel(); evSoundsBtn = new edu.xtec.jclic.beans.EventSoundsButton(); autoCpPanel = new edu.xtec.jclic.beans.RollPanel(); javax.swing.JLabel autoCpLb = new javax.swing.JLabel(); autoCpCombo = new javax.swing.JComboBox(); autoCpEditBtn = new javax.swing.JButton(); countersPanel = new edu.xtec.jclic.beans.RollPanel(); timeCounterChk = new javax.swing.JCheckBox(); javax.swing.JLabel maxTimeLb = new javax.swing.JLabel(); maxTimeInt = new edu.xtec.jclic.beans.SmallIntEditor(); countdownTimeChk = new javax.swing.JCheckBox(); actionsCounterChk = new javax.swing.JCheckBox(); javax.swing.JLabel maxActionsLb = new javax.swing.JLabel(); maxActionsInt = new edu.xtec.jclic.beans.SmallIntEditor(); countdownActionsChk = new javax.swing.JCheckBox(); scoreCounterChk = new javax.swing.JCheckBox(); buttonsPanel = new edu.xtec.jclic.beans.RollPanel(); helpBtnChk = new javax.swing.JCheckBox(); helpBtnMsg = new javax.swing.JRadioButton(); helpBtnSolution = new javax.swing.JRadioButton(); helpBtnMsgScroll = new javax.swing.JScrollPane(); helpBtnMsgText = new javax.swing.JTextArea(); infoBtnChk = new javax.swing.JCheckBox(); infoBtnUrlChk = new javax.swing.JRadioButton(); infoBtnUrlTxt = new javax.swing.JTextField(); infoBtnCmdChk = new javax.swing.JRadioButton(); infoBtnCmdTxt = new javax.swing.JTextField(); behaviorPanel = new edu.xtec.jclic.beans.RollPanel(); javax.swing.JLabel scrambleTimesLb = new javax.swing.JLabel(); scrambleTimesInt = new edu.xtec.jclic.beans.SmallIntEditor(); dragCellsChk = new javax.swing.JCheckBox(); orderChk = new javax.swing.JCheckBox(); javax.swing.JLabel spacer = new javax.swing.JLabel(); setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.LINE_AXIS)); mainPanel.setLayout(new java.awt.GridBagLayout()); descPanel.setTitle(options.getMsg("edit_act_description_block")); descPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); classLb.setText(options.getMsg("edit_act_class")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); descPanel.getMainPanel().add(classLb, gridBagConstraints); className.setText(" "); className.setPreferredSize(new java.awt.Dimension(200, 21)); className.setBorder(javax.swing.BorderFactory.createTitledBorder("")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descPanel.getMainPanel().add(className, gridBagConstraints); chClassBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/edit.gif"))); // NOI18N chClassBtn.setToolTipText(options.getMsg("edit_act_changeType")); chClassBtn.setText(""); chClassBtn.setMargin(new java.awt.Insets(2, 2, 2, 2)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descPanel.getMainPanel().add(chClassBtn, gridBagConstraints); nameLb.setText(options.getMsg("edit_act_name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); descPanel.getMainPanel().add(nameLb, gridBagConstraints); nameText.setPreferredSize(new java.awt.Dimension(200, 21)); nameText.setBorder(javax.swing.BorderFactory.createTitledBorder("")); nameText.setMinimumSize(new java.awt.Dimension(110, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descPanel.getMainPanel().add(nameText, gridBagConstraints); chNameBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/edit.gif"))); // NOI18N chNameBtn.setToolTipText(options.getMsg("edit_media_change_name")); chNameBtn.setText(""); chNameBtn.setMargin(new java.awt.Insets(2, 2, 2, 2)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descPanel.getMainPanel().add(chNameBtn, gridBagConstraints); descLb.setText(options.getMsg("edit_act_description")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); descPanel.getMainPanel().add(descLb, gridBagConstraints); descScroll.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); descScroll.setPreferredSize(new java.awt.Dimension(300, 60)); descScroll.setMinimumSize(new java.awt.Dimension(150, 60)); descText.setToolTipText(options.getMsg("edit_act_description_tooltip")); descText.getDocument().addDocumentListener(this); descScroll.setViewportView(descText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descPanel.getMainPanel().add(descScroll, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(descPanel, gridBagConstraints); reportPanel.setTitle(options.getMsg("edit_act_reports_block")); reportPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); bIncludeInReportsChk.setToolTipText(options.getMsg("edit_act_includeInReports_tooltip")); bIncludeInReportsChk.setText(options.getMsg("edit_act_includeInReports")); bIncludeInReportsChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportPanel.getMainPanel().add(bIncludeInReportsChk, gridBagConstraints); codeLb.setLabelFor(codeText); codeLb.setText(options.getMsg("edit_act_code")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); reportPanel.getMainPanel().add(codeLb, gridBagConstraints); codeText.setToolTipText(options.getMsg("edit_act_code_tooltip")); codeText.setPreferredSize(new java.awt.Dimension(80, 21)); codeText.setMinimumSize(new java.awt.Dimension(80, 21)); codeText.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); reportPanel.getMainPanel().add(codeText, gridBagConstraints); bRegisterActionsChk.setToolTipText(options.getMsg("edit_act_reportActions_tooltip")); bRegisterActionsChk.setText(options.getMsg("edit_act_reportActions")); bRegisterActionsChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 13); reportPanel.getMainPanel().add(bRegisterActionsChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(reportPanel, gridBagConstraints); uiPanel.setTitle(options.getMsg("edit_act_ui_block")); uiPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); skinLb.setText(options.getMsg("settings_skin")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); uiPanel.getMainPanel().add(skinLb, gridBagConstraints); skinCombo.setEditable(true); skinCombo.setToolTipText(options.getMsg("settings_skin_tooltip")); skinCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); uiPanel.getMainPanel().add(skinCombo, gridBagConstraints); evSoundsLb.setLabelFor(evSoundsBtn); evSoundsLb.setText(options.getMsg("edit_act_evsounds")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); uiPanel.getMainPanel().add(evSoundsLb, gridBagConstraints); evSoundsBtn.setToolTipText(options.getMsg("edit_act_evsounds_tooltip")); evSoundsBtn.addPropertyChangeListener(EventSoundsButton.PROP_EVSND_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); uiPanel.getMainPanel().add(evSoundsBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(uiPanel, gridBagConstraints); autoCpPanel.setTitle(options.getMsg("edit_autocp_block")); autoCpPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); autoCpLb.setText(options.getMsg("edit_autocp")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); autoCpPanel.getMainPanel().add(autoCpLb, gridBagConstraints); autoCpCombo.setPreferredSize(new java.awt.Dimension(200, 26)); autoCpCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); autoCpPanel.getMainPanel().add(autoCpCombo, gridBagConstraints); autoCpEditBtn.setToolTipText(options.getMsg("edit_autocp_btn_tooltip")); autoCpEditBtn.setText(options.getMsg("edit_autocp_btn")); autoCpEditBtn.setEnabled(false); autoCpEditBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); autoCpPanel.getMainPanel().add(autoCpEditBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(autoCpPanel, gridBagConstraints); countersPanel.setTitle(options.getMsg("edit_act_counters_block")); countersPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); timeCounterChk.setToolTipText(options.getMsg("edit_act_timeCounter_tooltip")); timeCounterChk.setText(options.getMsg("edit_act_timeCounter")); timeCounterChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); countersPanel.getMainPanel().add(timeCounterChk, gridBagConstraints); maxTimeLb.setText(options.getMsg("edit_act_maxTime")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); countersPanel.getMainPanel().add(maxTimeLb, gridBagConstraints); maxTimeInt.setToolTipText(options.getMsg("edit_act_maxTime_tooltip")); maxTimeInt.setMax(999); maxTimeInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); countersPanel.getMainPanel().add(maxTimeInt, new java.awt.GridBagConstraints()); countdownTimeChk.setToolTipText(options.getMsg("edit_act_countdown_tooltip")); countdownTimeChk.setText(options.getMsg("edit_act_countdown")); countdownTimeChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); countersPanel.getMainPanel().add(countdownTimeChk, gridBagConstraints); actionsCounterChk.setToolTipText(options.getMsg("edit_act_actionsCounter_tooltip")); actionsCounterChk.setText(options.getMsg("edit_act_actionsCounter")); actionsCounterChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); countersPanel.getMainPanel().add(actionsCounterChk, gridBagConstraints); maxActionsLb.setText(options.getMsg("edit_act_maxActions")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); countersPanel.getMainPanel().add(maxActionsLb, gridBagConstraints); maxActionsInt.setToolTipText(options.getMsg("edit_act_maxActions_tooltip")); maxActionsInt.setMax(999); maxActionsInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); countersPanel.getMainPanel().add(maxActionsInt, new java.awt.GridBagConstraints()); countdownActionsChk.setToolTipText(options.getMsg("edit_act_countdown_tooltip")); countdownActionsChk.setText(options.getMsg("edit_act_countdown")); countdownActionsChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); countersPanel.getMainPanel().add(countdownActionsChk, gridBagConstraints); scoreCounterChk.setText(options.getMsg("edit_act_scoreCounter")); scoreCounterChk.setToolTipText(options.getMsg("edit_act_scoreCounter_tooltip")); scoreCounterChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); countersPanel.getMainPanel().add(scoreCounterChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(countersPanel, gridBagConstraints); buttonsPanel.setTitle(options.getMsg("edit_act_buttons_block")); buttonsPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); helpBtnChk.setText(options.getMsg("edit_act_helpBtn")); helpBtnChk.setToolTipText(options.getMsg("edit_act_helpBtn_tooltip")); helpBtnChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); buttonsPanel.getMainPanel().add(helpBtnChk, gridBagConstraints); helpBtnButtonGroup.add(helpBtnMsg); helpBtnMsg.setText(options.getMsg("edit_act_helpBtn_msg")); helpBtnMsg.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); buttonsPanel.getMainPanel().add(helpBtnMsg, gridBagConstraints); helpBtnButtonGroup.add(helpBtnSolution); helpBtnSolution.setText(options.getMsg("edit_act_helpBtn_solution")); helpBtnSolution.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); buttonsPanel.getMainPanel().add(helpBtnSolution, gridBagConstraints); helpBtnMsgScroll.setPreferredSize(new java.awt.Dimension(300, 60)); helpBtnMsgScroll.setMinimumSize(new java.awt.Dimension(150, 60)); helpBtnMsgText.setWrapStyleWord(true); helpBtnMsgText.setLineWrap(true); helpBtnMsgText.getDocument().addDocumentListener(this); helpBtnMsgScroll.setViewportView(helpBtnMsgText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); buttonsPanel.getMainPanel().add(helpBtnMsgScroll, gridBagConstraints); infoBtnChk.setToolTipText(options.getMsg("edit_act_infoBtn_tooltip")); infoBtnChk.setText(options.getMsg("edit_act_infoBtn")); infoBtnChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(9, 3, 3, 3); buttonsPanel.getMainPanel().add(infoBtnChk, gridBagConstraints); infoBtnButtonGroup.add(infoBtnUrlChk); infoBtnUrlChk.setText(options.getMsg("edit_act_infoBtn_url")); infoBtnUrlChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); buttonsPanel.getMainPanel().add(infoBtnUrlChk, gridBagConstraints); infoBtnUrlTxt.setToolTipText(options.getMsg("edit_act_infoBtn_url_tooltip")); infoBtnUrlTxt.setPreferredSize(new java.awt.Dimension(300, 21)); infoBtnUrlTxt.setMinimumSize(new java.awt.Dimension(100, 21)); infoBtnUrlTxt.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); buttonsPanel.getMainPanel().add(infoBtnUrlTxt, gridBagConstraints); infoBtnButtonGroup.add(infoBtnCmdChk); infoBtnCmdChk.setText(options.getMsg("edit_act_infoBtn_cmd")); infoBtnCmdChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); buttonsPanel.getMainPanel().add(infoBtnCmdChk, gridBagConstraints); infoBtnCmdTxt.setToolTipText(options.getMsg("edit_act_infoBtn_cmd_tooltip")); infoBtnCmdTxt.setPreferredSize(new java.awt.Dimension(300, 21)); infoBtnCmdTxt.setMinimumSize(new java.awt.Dimension(100, 21)); infoBtnCmdTxt.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); buttonsPanel.getMainPanel().add(infoBtnCmdTxt, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(buttonsPanel, gridBagConstraints); behaviorPanel.setTitle(options.getMsg("edit_act_behavior_block")); behaviorPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); scrambleTimesLb.setLabelFor(scrambleTimesInt); scrambleTimesLb.setText(options.getMsg("edit_act_behavior_scramble_times")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); behaviorPanel.getMainPanel().add(scrambleTimesLb, gridBagConstraints); scrambleTimesInt.setToolTipText(options.getMsg("edit_act_behavior_scramble_times_tooltip")); scrambleTimesInt.setMax(999); scrambleTimesInt.setMin(1); scrambleTimesInt.setValue(30); scrambleTimesInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); behaviorPanel.getMainPanel().add(scrambleTimesInt, gridBagConstraints); dragCellsChk.setText(options.getMsg("edit_act_behavior_drag")); dragCellsChk.setToolTipText(options.getMsg("edit_act_behavior_drag_tooltip")); dragCellsChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); behaviorPanel.getMainPanel().add(dragCellsChk, gridBagConstraints); orderChk.setText(options.getMsg("edit_act_behavior_order")); orderChk.setToolTipText(options.getMsg("edit_act_behavior_order_tooltip")); orderChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); behaviorPanel.getMainPanel().add(orderChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(behaviorPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; mainPanel.add(spacer, gridBagConstraints); scroll.setViewportView(mainPanel); add(scroll); } // //GEN-END:initComponents @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); chNameBtn.setEnabled(enabled); chClassBtn.setEnabled(enabled); descText.setEnabled(enabled); bIncludeInReportsChk.setEnabled(enabled); skinCombo.setEnabled(enabled); evSoundsBtn.setEnabled(enabled); autoCpCombo.setEnabled(enabled); timeCounterChk.setEnabled(enabled); actionsCounterChk.setEnabled(enabled); scoreCounterChk.setEnabled(enabled); helpBtnChk.setEnabled(enabled); infoBtnChk.setEnabled(enabled); scrambleTimesInt.setEnabled(enabled); dragCellsChk.setEnabled(enabled); orderChk.setEnabled(enabled); checkEnabled(); } protected void checkEnabled() { boolean e = isEnabled(); boolean b = e && bIncludeInReportsChk.isSelected(); bRegisterActionsChk.setEnabled(b); codeText.setEnabled(b); autoCpEditBtn.setEnabled(e && autoCpCombo.getSelectedIndex() > 0); b = e && timeCounterChk.isSelected(); maxTimeInt.setEnabled(b); countdownTimeChk.setEnabled(b && maxTimeInt.getValue() > 0); b = e && actionsCounterChk.isSelected(); maxActionsInt.setEnabled(b); countdownActionsChk.setEnabled(b && maxActionsInt.getValue() > 0); b = e && helpBtnChk.isSelected(); helpBtnSolution.setEnabled(b); helpBtnMsg.setEnabled(b); helpBtnMsgText.setEnabled(b && helpBtnMsg.isSelected()); helpBtnMsgScroll.setEnabled(b && helpBtnMsg.isSelected()); b = e && infoBtnChk.isSelected(); infoBtnUrlChk.setEnabled(b); infoBtnUrlTxt.setEnabled(b && infoBtnUrlChk.isSelected()); infoBtnCmdChk.setEnabled(b); infoBtnCmdTxt.setEnabled(b && infoBtnCmdChk.isSelected()); } private void checkContentProviders() { Activity act = getActivity(); if (contentProviders == null) { contentProviders = new ArrayList(allContentProviders.size()); } else { contentProviders.clear(); } autoCpCombo.removeAllItems(); for (TripleString ts : allContentProviders) { boolean isOk = (ts.getClassName() == null); if (!isOk && act != null) isOk = AutoContentProvider.checkClient(ts.getClassName(), act.getClass()); if (isOk) { contentProviders.add(ts); autoCpCombo.addItem(ts); } } } public void fillData() { Activity act = getActivity(); nameText.setText(act == null ? options.getMsg("UNNAMED") : act.name); descText.setText(act == null ? "" : act.description == null ? "" : act.description); String s = act == null ? "" : act.getShortClassName(); if (s.startsWith(Activity.BASE_CLASS_TAG)) s = s.substring(1); className.setText(s); bIncludeInReportsChk.setSelected(act == null ? true : act.includeInReports); bRegisterActionsChk.setSelected(act == null ? false : act.reportActions); codeText.setText(act == null ? "" : act.code); skinCombo.setSelectedItem(act == null ? null : act.skinFileName); evSoundsBtn.setMediaBagEditor(act == null ? null : getActivityEditor().getProjectEditor().getMediaBagEditor()); evSoundsBtn.setEventSounds(act == null ? null : act.eventSounds); evSoundsBtn.setModified(false); checkContentProviders(); String acpClassName = (act == null || act.acp == null) ? null : act.acp.getShortClassName(); int index = Math.max(0, TripleString.getFirstItemWithClass(contentProviders, acpClassName)); autoCpCombo.setSelectedIndex(index); timeCounterChk.setSelected(act == null ? true : act.bTimeCounter); maxTimeInt.setValue(act == null ? 0 : act.maxTime); countdownTimeChk.setSelected(act == null ? false : act.countDownTime); actionsCounterChk.setSelected(act == null ? false : act.bActionsCounter); maxActionsInt.setValue(act == null ? 0 : act.maxActions); countdownActionsChk.setSelected(act == null ? false : act.countDownActions); scoreCounterChk.setSelected(act == null ? true : act.bScoreCounter); helpBtnChk.setSelected(act == null ? true : act.helpWindow); boolean helpSolution = act != null && (act.showSolution || act.helpMsg == null || act.helpMsg.length() == 0); helpBtnSolution.setSelected(helpSolution); helpBtnMsg.setSelected(!helpSolution); helpBtnMsgText.setText(act == null ? "" : act.helpMsg); int v = 0; if (act != null && act.infoUrl != null && act.infoUrl.length() > 0) v = 1; else if (act != null && act.infoCmd != null && act.infoCmd.length() > 0) v = 2; infoBtnChk.setSelected(v > 0); infoBtnUrlChk.setSelected(v != 2); infoBtnCmdChk.setSelected(v == 2); infoBtnUrlTxt.setText(act == null ? "" : act.infoUrl); infoBtnCmdTxt.setText(act == null ? "" : act.infoCmd); if (act != null && act.hasRandom()) { scrambleTimesInt.setValue(act.shuffles); } dragCellsChk.setSelected(act == null ? false : act.dragCells); orderChk.setSelected(act == null ? false : act.useOrder); checkEnabled(); } public void saveData() { Activity act = getActivity(); if (act != null) { act.description = descText.getText(); act.includeInReports = bIncludeInReportsChk.isSelected(); act.reportActions = bRegisterActionsChk.isSelected(); act.code = codeText.getText(); act.skinFileName = (String) skinCombo.getSelectedItem(); act.eventSounds = evSoundsBtn.getEventSounds(); evSoundsBtn.setModified(false); act.bTimeCounter = timeCounterChk.isSelected(); act.maxTime = maxTimeInt.getValue(); act.countDownTime = countdownTimeChk.isSelected(); act.bActionsCounter = actionsCounterChk.isSelected(); act.maxActions = maxActionsInt.getValue(); act.countDownActions = countdownActionsChk.isSelected(); act.bScoreCounter = scoreCounterChk.isSelected(); act.helpWindow = helpBtnChk.isSelected(); act.showSolution = helpBtnSolution.isSelected(); act.helpMsg = StrUtils.nullableString(helpBtnMsgText.getText()); int v = 0; if (infoBtnChk.isSelected()) { if (infoBtnUrlChk.isSelected()) { act.infoUrl = StrUtils.nullableString(infoBtnUrlTxt.getText()); act.infoCmd = null; } else { act.infoUrl = null; act.infoCmd = StrUtils.nullableString(infoBtnCmdTxt.getText()); } } else { act.infoUrl = null; act.infoCmd = null; } if (act.hasRandom()) act.shuffles = scrambleTimesInt.getValue(); act.dragCells = dragCellsChk.isSelected(); act.useOrder = orderChk.isSelected(); } } private static SelectActivityClass sac; @Override public boolean eventPerformed(EventObject ev) { Object cmp = ev == null ? null : ev.getSource(); boolean result = (cmp != null); final ActivityEditor aed = getActivityEditor(); if (cmp == chClassBtn && aed != null) { if (sac == null) { sac = new SelectActivityClass(options); sac.setAlertMsg(options.getMsg("edit_act_changeType_warning")); } String oldClassName = getActivity().getShortClassName(); sac.setCurrentClassName(oldClassName); sac.setListFilter(getActivity().getSimilarActivityClasses(), true); if ((result = getOptions().getMessages().showInputDlg(this, sac, "edit_act_changeType") && sac.getCurrentClassName() != null && !oldClassName.equals(sac.getCurrentClassName()))) { ActivityBagElementEditor abed = aed.getActivityBagElementEditor(); aed.collectData(); aed.saveData(); try { abed.changeActivityClass(sac.getCurrentClassName()); abed.reselect(); } catch (Exception ex) { options.getMessages().showErrorWarning(this, "ERROR", ex); } } } else if (cmp == chNameBtn && aed != null) { final String oldName = getActivity().name; final String newName = options.getMessages().showInputDlg(this, "edit_media_rename", "edit_media_rename_prompt", oldName, "edit_media_rename_title", false); if ((result = newName != null && !newName.equals(oldName))) { final ProgressDialog progressDialog = new ProgressDialog(this, options); edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { @Override public Object construct() { aed.rename(newName, ActivityEditorOptionsPanel.this, options.getMessages()); aed.getActivityBagElementEditor().reselect(); return null; } @Override public void finished() { progressDialog.setVisible(false); } }; progressDialog.start("edit_media_rename", "edit_media_renaming", sw, false, false, false); } } else if (cmp == autoCpCombo && aed != null) { AutoContentProviderEditor acped = aed.getAutoContentProviderEditor(); TripleString ts = (TripleString) autoCpCombo.getSelectedItem(); String acpClassName = ts == null ? null : ts.getClassName(); if (acped != null) { if (acped.getAutoContentProvider().getShortClassName().equals(acpClassName)) return false; acped.removeFromParent(); aed.getActivity().acp = null; } if (acpClassName != null) { try { AutoContentProvider acp = AutoContentProvider.getAutoContentProvider(acpClassName); aed.getActivity().acp = acp; acp.getEditor(aed); } catch (Exception ex) { options.getMessages().showErrorWarning(this, "edit_acp_err_creating", ex); aed.getActivity().acp = null; } } } else if (cmp == autoCpEditBtn && aed != null) { AutoContentProviderEditor acped = (AutoContentProviderEditor) aed.getFirstChild(AutoContentProviderEditor.class); if (acped != null) acped.editData(this, options); } if (result) checkEnabled(); return result; } protected javax.swing.Icon getIcon() { return edu.xtec.util.ResourceManager.getImageIcon("icons/options.gif"); } protected String getTitle() { return options.getMsg("edit_act_panels_options"); } protected String getTooltip() { return options.getMsg("edit_act_panels_options_tooltip"); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox actionsCounterChk; private javax.swing.JComboBox autoCpCombo; private javax.swing.JButton autoCpEditBtn; private edu.xtec.jclic.beans.RollPanel autoCpPanel; private javax.swing.JCheckBox bIncludeInReportsChk; private javax.swing.JCheckBox bRegisterActionsChk; private edu.xtec.jclic.beans.RollPanel behaviorPanel; private edu.xtec.jclic.beans.RollPanel buttonsPanel; private javax.swing.JButton chClassBtn; private javax.swing.JButton chNameBtn; private javax.swing.JLabel className; private javax.swing.JTextField codeText; private javax.swing.JCheckBox countdownActionsChk; private javax.swing.JCheckBox countdownTimeChk; private edu.xtec.jclic.beans.RollPanel countersPanel; private edu.xtec.jclic.beans.RollPanel descPanel; private javax.swing.JScrollPane descScroll; private javax.swing.JTextPane descText; private javax.swing.JCheckBox dragCellsChk; private edu.xtec.jclic.beans.EventSoundsButton evSoundsBtn; private javax.swing.JCheckBox helpBtnChk; private javax.swing.JRadioButton helpBtnMsg; private javax.swing.JScrollPane helpBtnMsgScroll; private javax.swing.JTextArea helpBtnMsgText; private javax.swing.JRadioButton helpBtnSolution; private javax.swing.JCheckBox infoBtnChk; private javax.swing.JRadioButton infoBtnCmdChk; private javax.swing.JTextField infoBtnCmdTxt; private javax.swing.JRadioButton infoBtnUrlChk; private javax.swing.JTextField infoBtnUrlTxt; private edu.xtec.jclic.beans.SmallIntEditor maxActionsInt; private edu.xtec.jclic.beans.SmallIntEditor maxTimeInt; private javax.swing.JLabel nameText; private javax.swing.JCheckBox orderChk; private edu.xtec.jclic.beans.RollPanel reportPanel; private javax.swing.JCheckBox scoreCounterChk; private edu.xtec.jclic.beans.SmallIntEditor scrambleTimesInt; private javax.swing.JScrollPane scroll; private javax.swing.JComboBox skinCombo; private javax.swing.JCheckBox timeCounterChk; private edu.xtec.jclic.beans.RollPanel uiPanel; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/ActivityEditorPanel.form000066400000000000000000000050551335566474600226130ustar00rootroot00000000000000
src/author/edu/xtec/jclic/ActivityEditorPanel.java000066400000000000000000000177521335566474600226000ustar00rootroot00000000000000/* * File : ActivityEditorPanel.java * Created : 10-jun-2002 10:15 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.activities.text.TextActivityEditorTextPanel; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.boxes.ActiveBagContentEditor; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.Options; import java.awt.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class ActivityEditorPanel extends EditorPanel { List internalPanels; String currentActivityClass; Map panelStore; public static final String SINGLE = "SINGLE", // puzzles and info SINGLE_ALT = "SINGLE_ALT", // memory SINGLE_BOOL_ALT = "SINGLE_BOOL_ALT", // identify SINGLE_LAYOUT = "SINGLE_LAYOUT", // double puzzle DOUBLE_ALT = "DOUBLE_ALT", // simple ass. DOUBLE_REL = "DOUBLE_REL", // explore DOUBLE_REL_ALT = "DOUBLE_REL_ALT", // complex ass. written answ. TEXTGRID_ALT = "TEXTGRID_ALT", // word search TEXTGRID_CRW = "TEXTGRID_CRW", // crossword TEXT_BASE = "TEXT_BASE"; /** Creates new form MenuEditorPanel */ public ActivityEditorPanel(Options options) { super(options); internalPanels = new ArrayList(4); panelStore = new HashMap(); initComponents(); postInit(250, false, false); setEnabled(false); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); Iterator it = internalPanels.iterator(); while (it.hasNext()) { it.next().setEnabled(enabled); } } public void addInternalPanel(ActivityEditorInternalPanel panel, String title, String tooltip) { if (title == null) title = panel.getTitle(); if (tooltip == null) tooltip = panel.getTooltip(); tabbedPane.addTab(title, panel.getIcon(), panel, tooltip); internalPanels.add(panel); } public void addInternalPanel(String storeKey, String title, String tooltip) { ActivityEditorInternalPanel panel = (ActivityEditorInternalPanel) panelStore.get(storeKey); if (panel == null) { if (SINGLE.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.SINGLE))); else if (SINGLE_LAYOUT.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.SINGLE_LAYOUT))); else if (SINGLE_ALT.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.SINGLE_ALT))); else if (SINGLE_BOOL_ALT.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.SINGLE_BOOL_ALT))); else if (DOUBLE_ALT.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.DOUBLE_ALT))); else if (DOUBLE_REL.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.DOUBLE_REL))); else if (DOUBLE_REL_ALT.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.DOUBLE_REL_ALT))); else if (TEXTGRID_ALT.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.TEXTGRID_ALT))); else if (TEXTGRID_CRW.equals(storeKey)) panelStore.put(storeKey, (panel = new ActiveBagContentEditor(this, ActiveBagContentEditor.TEXTGRID_CRW))); else if (TEXT_BASE.equals(storeKey)) panelStore.put(storeKey, (panel = new TextActivityEditorTextPanel(this))); } if (panel != null) addInternalPanel(panel, title, tooltip); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents mainPanel = new javax.swing.JPanel(); tabbedPane = new javax.swing.JTabbedPane(); setLayout(new java.awt.BorderLayout()); setToolTipText(options.getMsg("edit_act_descriptionTab_tooltip")); mainPanel.setLayout(new java.awt.BorderLayout()); mainPanel.add(tabbedPane, java.awt.BorderLayout.CENTER); add(mainPanel, java.awt.BorderLayout.CENTER); } // GEN-END:initComponents @Override protected synchronized void setEditor(Editor e) { if (e instanceof ActivityEditor) { ActivityEditor ae = (ActivityEditor) e; MediaBagEditor mbe = ae.getMediaBagEditor(); if (mbe != null && Utils.lowMemoryCondition()) mbe.getMediaBag().clearData(); String s = ae.getActivity().getClass().getName(); if (!s.equals(currentActivityClass)) { int cs = Math.max(tabbedPane.getSelectedIndex(), 0); int c = tabbedPane.getTabCount(); for (int i = c - 1; i >= ActivityEditor.COMMON_PANELS; i--) { tabbedPane.remove((Component) internalPanels.remove(i)); } ae.createPanels(this); final int csx = Math.min(cs, internalPanels.size() - 1); javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { if (internalPanels.size() >= csx) tabbedPane.setSelectedIndex(csx); } }); } currentActivityClass = s; } super.setEditor(e); } public boolean checkIfEditorValid(Editor e) { return e instanceof ActivityEditor; } protected ActivityEditor getActivityEditor() { return (ActivityEditor) editor; } protected Activity getActivity() { if (editor == null) return null; else return getActivityEditor().getActivity(); } /* * public void clear() { super.clear(); Iterator it=internalPanels.iterator(); * while(it.hasNext()) ((ActivityEditorInternalPanel)it.next()).clear(); } */ public void fillData() { Activity act = getActivity(); if (act != null) { Iterator it = internalPanels.iterator(); while (it.hasNext()) it.next().fillData(); } } public void saveData() { Activity act = getActivity(); if (act != null) { Iterator it = internalPanels.iterator(); while (it.hasNext()) it.next().saveData(); getActivityEditor().saveData(); } } @Override protected javax.swing.Icon getIcon() { return ActivityEditor.getIcon(); } @Override protected String getTitle() { return "activity"; } @Override public void focusLost(java.awt.event.FocusEvent focusEvent) { if (editor != null) editor.collectData(); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel mainPanel; private javax.swing.JTabbedPane tabbedPane; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/AppletHtmlCreator.form000066400000000000000000000602531335566474600222630ustar00rootroot00000000000000
src/author/edu/xtec/jclic/AppletHtmlCreator.java000066400000000000000000000417401335566474600222410ustar00rootroot00000000000000/* * File : AppletHtmlCreator.java * Created : 13-aug-2004 16:35 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.BrowserLauncher; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionListener; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class AppletHtmlCreator extends javax.swing.JPanel implements ActionListener { Options options; AuthorSettings settings; static String appletCode = "\n" + "\n" + "\n" + "\n" + "%TITLE\n" + "\n" + "\n" + "\n" + "%PRE_APPLET\n" + "\n" + "%POST_APPLET\n" + "\n" + ""; /** Creates new form AppletHtmlCreator */ public AppletHtmlCreator(Options options, AuthorSettings settings) { this.options = options; this.settings = settings; initComponents(); fullPageOption.addActionListener(this); mixedContentOption.addActionListener(this); checkEnabled(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel colorLb; javax.swing.JLabel exitUrlLb; java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel heightLb; javax.swing.JScrollPane postTextScroll; javax.swing.JLabel postTxtLb; javax.swing.JScrollPane prevTextScroll; javax.swing.JLabel prevTxtLb; javax.swing.JLabel titleLb; javax.swing.JLabel widthLb; bg = new javax.swing.ButtonGroup(); titleLb = new javax.swing.JLabel(); titleTxt = new javax.swing.JTextField(); exitUrlLb = new javax.swing.JLabel(); exitUrlTxt = new javax.swing.JTextField(); fullPageOption = new javax.swing.JRadioButton(); mixedContentOption = new javax.swing.JRadioButton(); sizePanel = new javax.swing.JPanel(); colorLb = new javax.swing.JLabel(); colorButton = new edu.xtec.jclic.beans.ColorButton(); colorButton.setOptions(options); prevTxtLb = new javax.swing.JLabel(); prevTextScroll = new javax.swing.JScrollPane(); prevTextEdit = new javax.swing.JTextArea(); widthLb = new javax.swing.JLabel(); widthText = new javax.swing.JTextField(); heightLb = new javax.swing.JLabel(); heightText = new javax.swing.JTextField(); centeredChk = new javax.swing.JCheckBox(); postTxtLb = new javax.swing.JLabel(); postTextScroll = new javax.swing.JScrollPane(); postTextEdit = new javax.swing.JTextArea(); setLayout(new java.awt.GridBagLayout()); titleLb.setLabelFor(titleTxt); titleLb.setText(options.getMsg("applet_page_title")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(titleLb, gridBagConstraints); titleTxt.setToolTipText(options.getMsg("applet_page_title_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(titleTxt, gridBagConstraints); exitUrlLb.setLabelFor(exitUrlTxt); exitUrlLb.setText(options.getMsg("applet_exitUrl")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(exitUrlLb, gridBagConstraints); exitUrlTxt.setToolTipText(options.getMsg("applet_exitUrl_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(exitUrlTxt, gridBagConstraints); fullPageOption.setSelected(true); fullPageOption.setText(options.getMsg("applet_page_full")); bg.add(fullPageOption); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(fullPageOption, gridBagConstraints); mixedContentOption.setText(options.getMsg("applet_page_mixed")); bg.add(mixedContentOption); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(mixedContentOption, gridBagConstraints); sizePanel.setLayout(new java.awt.GridBagLayout()); sizePanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("applet_size"))); sizePanel.setToolTipText(options.getMsg("applet_size_tooltip")); colorLb.setLabelFor(colorButton); colorLb.setText(options.getMsg("applet_bgcolor")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(colorLb, gridBagConstraints); colorButton.setToolTipText(options.getMsg("applet_bgcolor_tooltip")); colorButton.setColor(settings.appletBgColor); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(colorButton, gridBagConstraints); prevTxtLb.setLabelFor(prevTextEdit); prevTxtLb.setText(options.getMsg("applet_prev_text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(prevTxtLb, gridBagConstraints); prevTextScroll.setPreferredSize(new java.awt.Dimension(200, 60)); prevTextScroll.setMinimumSize(new java.awt.Dimension(200, 60)); prevTextEdit.setWrapStyleWord(true); prevTextEdit.setToolTipText(options.getMsg("applet_prev_text_tooltip")); prevTextEdit.setLineWrap(true); prevTextScroll.setViewportView(prevTextEdit); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 0.5; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(prevTextScroll, gridBagConstraints); widthLb.setLabelFor(widthText); widthLb.setText(options.getMsg("WIDTH")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(widthLb, gridBagConstraints); widthText.setToolTipText(options.getMsg("applet_width_tooltip")); widthText.setText(settings.appletWidth); widthText.setHorizontalAlignment(javax.swing.JTextField.RIGHT); widthText.setPreferredSize(new java.awt.Dimension(50, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(widthText, gridBagConstraints); heightLb.setLabelFor(heightText); heightLb.setText(options.getMsg("HEIGHT")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(heightLb, gridBagConstraints); heightText.setToolTipText(options.getMsg("applet_height_tooltip")); heightText.setText(settings.appletHeight); heightText.setHorizontalAlignment(javax.swing.JTextField.RIGHT); heightText.setPreferredSize(new java.awt.Dimension(50, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(heightText, gridBagConstraints); centeredChk.setToolTipText(options.getMsg("applet_centered_tooltip")); centeredChk.setSelected(true); centeredChk.setText(options.getMsg("applet_centered")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(centeredChk, gridBagConstraints); postTxtLb.setLabelFor(postTextEdit); postTxtLb.setText(options.getMsg("applet_post_text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(postTxtLb, gridBagConstraints); postTextScroll.setPreferredSize(new java.awt.Dimension(200, 60)); postTextScroll.setMinimumSize(new java.awt.Dimension(200, 60)); postTextEdit.setWrapStyleWord(true); postTextEdit.setToolTipText(options.getMsg("applet_post_text_tooltip")); postTextEdit.setLineWrap(true); postTextScroll.setViewportView(postTextEdit); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 0.5; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(postTextScroll, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(1, 2, 2, 2); add(sizePanel, gridBagConstraints); } // GEN-END:initComponents public void setValues(JClicProject prj) { titleTxt.setText(prj.settings.title); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup bg; private javax.swing.JCheckBox centeredChk; private edu.xtec.jclic.beans.ColorButton colorButton; private javax.swing.JTextField exitUrlTxt; private javax.swing.JRadioButton fullPageOption; private javax.swing.JTextField heightText; private javax.swing.JRadioButton mixedContentOption; private javax.swing.JTextArea postTextEdit; private javax.swing.JTextArea prevTextEdit; private javax.swing.JPanel sizePanel; private javax.swing.JTextField titleTxt; private javax.swing.JTextField widthText; // End of variables declaration//GEN-END:variables private static AppletHtmlCreator panel; public static void createHtml(JClicProject prj, AuthorSettings settings, Component parent) { Options options = prj.getBridge().getOptions(); Messages msg = options.getMessages(); if (panel == null) panel = new AppletHtmlCreator(options, settings); String prjFile = FileSystem.getFileNameOf(prj.getFullPath()); panel.setValues(prj); if (msg.showInputDlg(parent, panel, "applet_create_title")) { boolean full = panel.fullPageOption.isSelected(); String title = panel.titleTxt.getText(); String width = panel.widthText.getText(); String height = panel.heightText.getText(); String preApplet = panel.prevTextEdit.getText(); String postApplet = panel.postTextEdit.getText(); Color bgColor = panel.colorButton.getColor(); boolean centered = panel.centeredChk.isSelected(); StringBuilder optionalParams = new StringBuilder(); String ps = StrUtils.nullableString(panel.exitUrlTxt.getText()); if (ps != null) optionalParams.append("\r\nsetExitUrl('").append(ps).append("');"); int[] filters = { Utils.ALL_HTML_FF }; FileSystem fs = prj.getFileSystem(); String path = "index.htm"; String fileName = fs.chooseFile(path, true, filters, options, null, parent, false); if (fileName != null) { try { File file = new File(prj.getFileSystem().getFullFileNamePath(fileName)); FileOutputStream fos = prj.getFileSystem().createSecureFileOutputStream(fileName, false); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); PrintWriter pw = new PrintWriter(osw); String s = StrUtils.replace(appletCode, "%ENCODING", /* osw.getEncoding() */ "UTF-8"); s = StrUtils.replace(s, "%JAR_BASE", settings.appletCodeBase); s = StrUtils.replace(s, "%TITLE", title); StringBuilder sb = new StringBuilder(); if (full) sb.append( "leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\" onLoad=\"window.focus();\""); else { sb.append("bgcolor=#"); sb.append(Integer.toHexString(bgColor.getRed())); sb.append(Integer.toHexString(bgColor.getGreen())); sb.append(Integer.toHexString(bgColor.getBlue())); } s = StrUtils.replace(s, "%BODYPARAMS", sb.substring(0)); sb.setLength(0); if (!full) { if (centered) sb.append("
"); if (preApplet.length() > 0) sb.append(preApplet).append("
"); } s = StrUtils.replace(s, "%PRE_APPLET", sb.substring(0)); s = StrUtils.replace(s, "%OTHER", optionalParams.substring(0)); s = StrUtils.replace(s, "%WIDTH", full ? "100%" : width); s = StrUtils.replace(s, "%HEIGHT", full ? "100%" : height); s = StrUtils.replace(s, "%PROJECT", prjFile); sb.setLength(0); if (!full) { if (postApplet.length() > 0) sb.append("
").append(postApplet); if (centered) sb.append("
"); } s = StrUtils.replace(s, "%POST_APPLET", sb.substring(0)); pw.print(s); pw.flush(); pw.close(); String prompt = StrUtils.replace(msg.get("applet_created_info"), "%s", fileName); if (msg.showQuestionDlgObj(parent, prompt + "\n" + msg.get("applet_created_prompt"), null, "yn") == Messages.YES) { BrowserLauncher.openURL(prj.getFileSystem().getUrl(fileName)); } } catch (Exception ex) { options.getMessages().showErrorWarning(parent, "ERROR", ex); } } } } public void actionPerformed(java.awt.event.ActionEvent actionEvent) { checkEnabled(); } public final void checkEnabled() { boolean b = mixedContentOption.isSelected(); colorButton.setEnabled(b); widthText.setEnabled(b); heightText.setEnabled(b); centeredChk.setEnabled(b); prevTextEdit.setEnabled(b); postTextEdit.setEnabled(b); } } src/author/edu/xtec/jclic/AuthorSettings.java000066400000000000000000000355141335566474600216340ustar00rootroot00000000000000/* * File : AuthorSettings.java * Created : 18-sep-2002 09:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.BrowserLauncher; import edu.xtec.util.JDomUtility; import edu.xtec.util.LFUtil; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceBridge; import java.awt.Color; import java.awt.Component; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class AuthorSettings implements edu.xtec.jclic.Constants { public ResourceBridge rb; public String language, country, variant; public String lookAndFeel; public String preferredBrowser; public String rootPath; public String rootExportPath; public String rootScormPath; public String mediaSystem; public FileSystem fileSystem; public String appletCodeBase; public String appletWidth, appletHeight; public String jsCodeBase; public Color appletBgColor; public int imgMaxWidth; public int imgMaxHeight; public Map misc; public static final int MAX_RECENT = 8; public String[] recentFiles; public String cfgFile; public boolean readOnly; protected static String defaultCfgFile = null; public static final String PROJECTS_PATH = "projects", EXPORT_PATH = "export", SCORM_PATH = "scorm", CFG_FILE = "jclic_author.cfg"; public static final String DEFAULT_APPLET_CODEBASE = "http://clic.xtec.cat/dist/jclic"; public static final String DEFAULT_APPLET_WIDTH = "700"; public static final String DEFAULT_APPLET_HEIGHT = "450"; public static final Color DEFAULT_APPLET_BGCOLOR = Color.white; /** Revert codebase to clic.xtec.cat */ public static final String DEFAULT_JS_CODEBASE = "https://clic.xtec.cat/dist/jclic.js/jclic.min.js"; /** Creates new AuthorSettings */ public AuthorSettings(ResourceBridge rb, String fromPath) { this.rb = rb; misc = new HashMap(); lookAndFeel = edu.xtec.util.LFUtil.SYSTEM; preferredBrowser = ""; recentFiles = new String[MAX_RECENT]; mediaSystem = DEFAULT; readOnly = false; rootExportPath = rootScormPath = rootPath = System.getProperty("user.home"); cfgFile = (fromPath == null ? getDefaultCfgFile(rb.getOptions()) : fromPath); fileSystem = new FileSystem(rb); if (FileSystem.isStrUrl(cfgFile)) { readOnly = true; } else { File f = new File(cfgFile); readOnly = !f.canWrite(); } appletCodeBase = DEFAULT_APPLET_CODEBASE; appletWidth = DEFAULT_APPLET_WIDTH; appletHeight = DEFAULT_APPLET_HEIGHT; appletBgColor = DEFAULT_APPLET_BGCOLOR; jsCodeBase = DEFAULT_JS_CODEBASE; imgMaxWidth = MediaBagEditor.DEFAULT_IMG_MAX_WIDTH; imgMaxHeight = MediaBagEditor.DEFAULT_IMG_MAX_HEIGHT; } public static final String ELEMENT_NAME = "JClicAuthorSettings", APPLET = "applet", CODEBASE = "codebase", JSCODEBASE = "JScodebase", BGCOLOR = "bgcolor", IMGMAXSIZE = "imgMaxSize", WIDTH = "width", HEIGHT = "height", SOUND = "sound", SYSTEM = "system", MISC = "misc", PATHS = "paths", PATH = "path", ROOT = "root", EXPORT = "export", SCORM = "scorm", RECENT_FILES = "recentFiles", FILE = "file"; public static String getDefaultCfgFile(Options options) { if (defaultCfgFile == null) defaultCfgFile = edu.xtec.util.PersistentSettings.getFilePath(PROGRAM, CFG_FILE, options, true); return defaultCfgFile; } public static AuthorSettings loadAuthorSettings(ResourceBridge rb) { AuthorSettings result = null; String cfgFile = rb.getOptions().getString(ELEMENT_NAME); if (cfgFile != null) { try { result = new AuthorSettings(rb, cfgFile); result.loadSettings(result.fileSystem.getXMLDocument(cfgFile).getRootElement()); } catch (Exception ex) { result = null; System.err.println("Unable to read settings from " + cfgFile + "\n" + ex); } } if (result == null) { cfgFile = getDefaultCfgFile(rb.getOptions()); result = new AuthorSettings(rb, cfgFile); try { result.loadSettings(result.fileSystem.getXMLDocument(cfgFile).getRootElement()); } catch (Exception ex) { result.initNewSettings(); } } Options options = rb.getOptions(); options.syncProperties(result.getProperties(), true); if (!options.getBoolean(Options.LANGUAGE_BY_PARAM) && result.language != null) { options.put(Messages.LANGUAGE, result.language); if (result.country != null) options.put(Messages.COUNTRY, result.country); if (result.variant != null) options.put(Messages.VARIANT, result.variant); } return result; } private void initNewSettings() { try { Messages msg = rb.getOptions().getMessages(); if (language == null) { language = msg.getLocale().getLanguage(); country = msg.getLocale().getCountry(); variant = msg.getLocale().getVariant(); } readOnly = false; File f = new File(new File(cfgFile).getParentFile(), PROJECTS_PATH); f.mkdirs(); rootPath = f.getAbsolutePath(); f = new File(new File(cfgFile).getParentFile(), EXPORT_PATH); rootExportPath = f.getAbsolutePath(); f = new File(new File(cfgFile).getParentFile(), SCORM_PATH); rootScormPath = f.getAbsolutePath(); fileSystem = new FileSystem(rootPath, rb); imgMaxWidth = MediaBagEditor.getImgMaxWidth(); imgMaxHeight = MediaBagEditor.getImgMaxHeight(); } catch (Exception ex) { System.err.println("Unable to create new settings!\n" + ex); } } public void save() { if (!readOnly) { try { FileOutputStream fos = fileSystem.createSecureFileOutputStream(cfgFile, false); JDomUtility.saveDocument(fos, getJDomElement()); fos.close(); } catch (Exception ex) { System.err.println("unable to save settings in " + cfgFile + ": " + ex.getMessage()); } } } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); org.jdom.Element child, child2; if (language != null) { child = new org.jdom.Element(Messages.LANGUAGE); child.setAttribute(ID, language); if (country != null) child.setAttribute(Messages.COUNTRY, country); if (variant != null) child.setAttribute(Messages.VARIANT, variant); e.addContent(child); } child = new org.jdom.Element(PATHS); child2 = new org.jdom.Element(PATH); child2.setAttribute(ID, ROOT); child2.setAttribute(PATH, rootPath); child.addContent(child2); child2 = new org.jdom.Element(PATH); child2.setAttribute(ID, EXPORT); child2.setAttribute(PATH, rootExportPath); child.addContent(child2); child2 = new org.jdom.Element(PATH); child2.setAttribute(ID, SCORM); child2.setAttribute(PATH, rootScormPath); child.addContent(child2); e.addContent(child); child = new org.jdom.Element(APPLET); child.setAttribute(CODEBASE, appletCodeBase); child.setAttribute(WIDTH, appletWidth); child.setAttribute(HEIGHT, appletHeight); child.setAttribute(BGCOLOR, JDomUtility.colorToString(appletBgColor)); child.setAttribute(JSCODEBASE, jsCodeBase); e.addContent(child); child = new org.jdom.Element(SOUND); child.setAttribute(MEDIA_SYSTEM, mediaSystem); e.addContent(child); child = new org.jdom.Element(LFUtil.LOOK_AND_FEEL); child.setAttribute(ID, lookAndFeel); e.addContent(child); child = new org.jdom.Element(BrowserLauncher.BROWSER); child.setAttribute(ID, preferredBrowser); e.addContent(child); child = new org.jdom.Element(IMGMAXSIZE); child.setAttribute(WIDTH, Integer.toString(imgMaxWidth)); child.setAttribute(HEIGHT, Integer.toString(imgMaxHeight)); e.addContent(child); if (!misc.isEmpty()) { child = new org.jdom.Element(MISC); for (java.util.Map.Entry me : misc.entrySet()) { String k = (String) me.getKey(); Object v = me.getValue(); if (k != null && v != null && v instanceof String) child.setAttribute(k, (String) v); } e.addContent(child); } child = new org.jdom.Element(RECENT_FILES); for (int i = 0; i < MAX_RECENT; i++) { if (recentFiles[i] != null) { child2 = new org.jdom.Element(FILE); child2.setAttribute(PATH, recentFiles[i]); child.addContent(child2); } } e.addContent(child); return e; } protected void loadSettings(org.jdom.Element e) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child, child2; if ((child = e.getChild(PATHS)) != null) { String rp = null, rpx = null, rps = null; Iterator it = child.getChildren(PATH).iterator(); while (it.hasNext()) { child2 = (org.jdom.Element) it.next(); if (ROOT.equals(child2.getAttributeValue(ID))) { rp = JDomUtility.getStringAttr(child2, PATH, rootPath, false); } else if (EXPORT.equals(child2.getAttributeValue(ID))) { rpx = JDomUtility.getStringAttr(child2, PATH, rootExportPath, false); } else if (SCORM.equals(child2.getAttributeValue(ID))) { rps = JDomUtility.getStringAttr(child2, PATH, rootScormPath, false); } } if (rp != null) { rootPath = rp; if (!FileSystem.isStrUrl(rootPath)) fileSystem = new FileSystem(rootPath, rb); } if (rpx != null) { rootExportPath = rpx; } else { if (!FileSystem.isStrUrl(rootPath)) { File f = new File(rootPath); if (f.getName().compareToIgnoreCase(PROJECTS_PATH) == 0 && f.getParent() != null) { rootExportPath = (new File(f.getParentFile(), EXPORT_PATH)).getPath(); } else { rootExportPath = (new File(f, EXPORT_PATH)).getPath(); } } } if (rps != null) { rootScormPath = rps; } else { if (!FileSystem.isStrUrl(rootPath)) { File f = new File(rootPath); if (f.getName().compareToIgnoreCase(PROJECTS_PATH) == 0 && f.getParent() != null) { rootScormPath = (new File(f.getParentFile(), SCORM_PATH)).getPath(); } else { rootScormPath = (new File(f, SCORM_PATH)).getPath(); } } } } if ((child = e.getChild(APPLET)) != null) { appletCodeBase = JDomUtility.getStringAttr(child, CODEBASE, DEFAULT_APPLET_CODEBASE, false); appletWidth = JDomUtility.getStringAttr(child, WIDTH, DEFAULT_APPLET_WIDTH, false); appletHeight = JDomUtility.getStringAttr(child, HEIGHT, DEFAULT_APPLET_HEIGHT, false); appletBgColor = JDomUtility.getColorAttr(child, BGCOLOR, DEFAULT_APPLET_BGCOLOR); jsCodeBase = JDomUtility.getStringAttr(child, JSCODEBASE, DEFAULT_JS_CODEBASE, false); } if ((child = e.getChild(Messages.LANGUAGE)) != null) { language = JDomUtility.getStringAttr(child, ID, language, false); country = JDomUtility.getStringAttr(child, Messages.COUNTRY, country, false); variant = JDomUtility.getStringAttr(child, Messages.VARIANT, variant, false); } if ((child = e.getChild(SOUND)) != null) { mediaSystem = JDomUtility.getStringAttr(child, MEDIA_SYSTEM, mediaSystem, false); } if ((child = e.getChild(LFUtil.LOOK_AND_FEEL)) != null) { lookAndFeel = JDomUtility.getStringAttr(child, ID, lookAndFeel, false); } if ((child = e.getChild(BrowserLauncher.BROWSER)) != null) { preferredBrowser = JDomUtility.getStringAttr(child, ID, preferredBrowser, false); BrowserLauncher.setPreferredBrowser(preferredBrowser); } if ((child = e.getChild(IMGMAXSIZE)) != null) { imgMaxWidth = JDomUtility.getIntAttr(child, WIDTH, MediaBagEditor.DEFAULT_IMG_MAX_WIDTH); imgMaxHeight = JDomUtility.getIntAttr(child, HEIGHT, MediaBagEditor.DEFAULT_IMG_MAX_HEIGHT); MediaBagEditor.setImgMaxWidth(imgMaxWidth); MediaBagEditor.setImgMaxHeight(imgMaxHeight); } if ((child = e.getChild(MISC)) != null) { java.util.Iterator it = child.getAttributes().iterator(); while (it.hasNext()) { org.jdom.Attribute a = (org.jdom.Attribute) it.next(); misc.put(a.getName(), a.getValue()); } } if ((child = e.getChild(RECENT_FILES)) != null) { java.util.Iterator it = child.getChildren(FILE).iterator(); for (int i = 0; i < MAX_RECENT; i++) { if (it.hasNext()) recentFiles[i] = JDomUtility.getStringAttr(((org.jdom.Element) it.next()), PATH, null, false); else recentFiles[i] = null; } } } public Map getProperties() { Map prop = new HashMap(); String t = TRUE; String f = FALSE; if (language != null) { prop.put(Messages.LANGUAGE, language); prop.put(Messages.COUNTRY, country); prop.put(Messages.VARIANT, variant); } prop.put(LFUtil.LOOK_AND_FEEL, lookAndFeel); prop.put(MEDIA_SYSTEM, mediaSystem); prop.putAll(misc); return prop; } public boolean edit(Component parent) { AuthorSettingsDlg dlg = new AuthorSettingsDlg(this, parent); dlg.setVisible(true); if (dlg.result) { BrowserLauncher.setPreferredBrowser(preferredBrowser); MediaBagEditor.setImgMaxWidth(imgMaxWidth); MediaBagEditor.setImgMaxHeight(imgMaxHeight); } return dlg.result; } public void addRecentFile(String fName) { String[] recentBak = recentFiles; recentFiles = new String[MAX_RECENT]; recentFiles[0] = fName; for (int i = 0, j = 1; i < MAX_RECENT && j < MAX_RECENT; i++) { if (recentBak[i] != null && !recentBak[i].equals(fName)) { recentFiles[j++] = recentBak[i]; } } } } src/author/edu/xtec/jclic/AuthorSettingsDlg.form000066400000000000000000001462271335566474600223110ustar00rootroot00000000000000
src/author/edu/xtec/jclic/AuthorSettingsDlg.java000066400000000000000000000573621335566474600222700ustar00rootroot00000000000000/* * File : AuthorSettingsDlg.java * Created : 20-jun-2002 13:23 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.util.Messages; import edu.xtec.util.StrUtils; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class AuthorSettingsDlg extends edu.xtec.util.ExtendedJDialog { AuthorSettings settings; public boolean result; java.awt.Component parent; Messages msg; /** Creates new form SettingsDlg */ public AuthorSettingsDlg(AuthorSettings settings, java.awt.Component parent) { super(parent, "", true); this.parent = parent; this.settings = settings; msg = settings.rb.getOptions().getMessages(); setTitle(msg.get("settings_title")); result = false; initComponents(); centerOver(parent); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.ButtonGroup reportGroup = new javax.swing.ButtonGroup(); javax.swing.ButtonGroup mediaGroup = new javax.swing.ButtonGroup(); javax.swing.JTabbedPane mainPane = new javax.swing.JTabbedPane(); javax.swing.JPanel generalPane = new javax.swing.JPanel(); javax.swing.JLabel lookLb = new javax.swing.JLabel(); lookCombo = new javax.swing.JComboBox(edu.xtec.util.LFUtil.VALUES); javax.swing.JLabel langLb = new javax.swing.JLabel(); langCombo = new javax.swing.JComboBox(Messages.getDescriptiveLanguageCodes(msg.getLocale())); javax.swing.JLabel countryLb = new javax.swing.JLabel(); countryField = new javax.swing.JTextField(); javax.swing.JLabel variantLb = new javax.swing.JLabel(); variantField = new javax.swing.JTextField(); javax.swing.JLabel browserLb = new javax.swing.JLabel(); browserField = new javax.swing.JTextField(); imgSizePanel = new javax.swing.JPanel(); javax.swing.JLabel maxImgWidthLb = new javax.swing.JLabel(); maxImgWidthText = new javax.swing.JTextField(); javax.swing.JLabel maxImgHeightLb = new javax.swing.JLabel(); maxImgHeightText = new javax.swing.JTextField(); javax.swing.JPanel mediaPane = new javax.swing.JPanel(); javax.swing.JPanel mediaSystemPanel = new javax.swing.JPanel(); mDefaultBtn = new javax.swing.JRadioButton(); mJMFbtn = new javax.swing.JRadioButton(); mQTbtn = new javax.swing.JRadioButton(); javax.swing.JPanel htmlPane = new javax.swing.JPanel(); javax.swing.JLabel codebaseLb = new javax.swing.JLabel(); codebaseTxt = new javax.swing.JTextField(); javax.swing.JLabel colorLb = new javax.swing.JLabel(); colorButton = new edu.xtec.jclic.beans.ColorButton(); colorButton.setOptions(settings.rb.getOptions()); javax.swing.JLabel widthLb = new javax.swing.JLabel(); widthText = new javax.swing.JTextField(); javax.swing.JLabel heightLb = new javax.swing.JLabel(); heightText = new javax.swing.JTextField(); javax.swing.JLabel JScodebaseLb = new javax.swing.JLabel(); JScodebaseTxt = new javax.swing.JTextField(); javax.swing.JPanel btPanel = new javax.swing.JPanel(); javax.swing.JButton okButton = new javax.swing.JButton(); javax.swing.JButton cancelButton = new javax.swing.JButton(); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); mainPane.setToolTipText(msg.get("settings_report_tooltip")); mainPane.setPreferredSize(new java.awt.Dimension(500, 400)); generalPane.setToolTipText(msg.get("settings_general_tooltip")); generalPane.setLayout(new java.awt.GridBagLayout()); lookLb.setLabelFor(lookCombo); lookLb.setText(msg.get("settings_look")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(lookLb, gridBagConstraints); lookCombo.setSelectedItem(settings.lookAndFeel); lookCombo.setToolTipText(msg.get("settings_look_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(lookCombo, gridBagConstraints); langLb.setLabelFor(langCombo); langLb.setText(msg.get("settings_language")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(langLb, gridBagConstraints); langCombo.setSelectedItem(Messages.getDescriptiveLanguageCode(settings.language)); langCombo.setToolTipText(msg.get("settings_language_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(langCombo, gridBagConstraints); countryLb.setLabelFor(countryField); countryLb.setText(msg.get("settings_country")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(countryLb, gridBagConstraints); countryField.setText(settings.country); countryField.setToolTipText(msg.get("settings_country_tooltip")); countryField.setMinimumSize(new java.awt.Dimension(75, 21)); countryField.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(countryField, gridBagConstraints); variantLb.setLabelFor(variantField); variantLb.setText(msg.get("settings_variant")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(variantLb, gridBagConstraints); variantField.setText(settings.variant); variantField.setToolTipText(msg.get("settings_variant_tooltip")); variantField.setMinimumSize(new java.awt.Dimension(75, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(variantField, gridBagConstraints); browserLb.setText(msg.get("settings_browser")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(browserLb, gridBagConstraints); browserField.setText(settings.preferredBrowser); browserField.setToolTipText(msg.get("settings_browser_tooltip")); browserField.setMinimumSize(new java.awt.Dimension(75, 21)); browserField.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(browserField, gridBagConstraints); imgSizePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.get("img_max_size"))); imgSizePanel.setLayout(new java.awt.GridBagLayout()); maxImgWidthLb.setLabelFor(maxImgWidthText); maxImgWidthLb.setText(msg.get("WIDTH")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); imgSizePanel.add(maxImgWidthLb, gridBagConstraints); maxImgWidthText.setHorizontalAlignment(javax.swing.JTextField.RIGHT); maxImgWidthText.setText(Integer.toString(settings.imgMaxWidth)); maxImgWidthText.setToolTipText(msg.get("img_max_width_tooltip")); maxImgWidthText.setPreferredSize(new java.awt.Dimension(50, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); imgSizePanel.add(maxImgWidthText, gridBagConstraints); maxImgHeightLb.setLabelFor(maxImgHeightText); maxImgHeightLb.setText(msg.get("HEIGHT")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); imgSizePanel.add(maxImgHeightLb, gridBagConstraints); maxImgHeightText.setHorizontalAlignment(javax.swing.JTextField.RIGHT); maxImgHeightText.setText(Integer.toString(settings.imgMaxHeight)); maxImgHeightText.setToolTipText(msg.get("img_max_height_tooltip")); maxImgHeightText.setPreferredSize(new java.awt.Dimension(50, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); imgSizePanel.add(maxImgHeightText, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(imgSizePanel, gridBagConstraints); mainPane.addTab(msg.get("settings_general"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/settings.gif")), generalPane, ""); // NOI18N mediaPane.setToolTipText(msg.get("settings_media_tooltip")); mediaPane.setLayout(new java.awt.GridBagLayout()); mediaSystemPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.get("settings_media_system"))); mediaSystemPanel.setLayout(new java.awt.GridBagLayout()); mediaGroup.add(mDefaultBtn); mDefaultBtn.setSelected(edu.xtec.jclic.Constants.DEFAULT.equals(settings.mediaSystem)); mDefaultBtn.setText(msg.get("settings_media_default")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 0, 3); mediaSystemPanel.add(mDefaultBtn, gridBagConstraints); mediaGroup.add(mJMFbtn); mJMFbtn.setSelected(edu.xtec.jclic.Constants.JMF.equals(settings.mediaSystem)); mJMFbtn.setText(msg.get("settings_media_jmf")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 3); mediaSystemPanel.add(mJMFbtn, gridBagConstraints); mediaGroup.add(mQTbtn); mQTbtn.setSelected(edu.xtec.jclic.Constants.QT.equals(settings.mediaSystem)); mQTbtn.setText(msg.get("settings_media_qt")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 3, 3, 3); mediaSystemPanel.add(mQTbtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mediaPane.add(mediaSystemPanel, gridBagConstraints); mainPane.addTab(msg.get("settings_media"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/audio_on.gif")), mediaPane, ""); // NOI18N htmlPane.setToolTipText(msg.get("settings_applet_tooltip")); htmlPane.setLayout(new java.awt.GridBagLayout()); codebaseLb.setLabelFor(codebaseTxt); codebaseLb.setText(msg.get("applet_codebase")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); htmlPane.add(codebaseLb, gridBagConstraints); codebaseTxt.setText(settings.appletCodeBase); codebaseTxt.setToolTipText(msg.get("applet_codebase_tooltip")); codebaseTxt.setPreferredSize(new java.awt.Dimension(300, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); htmlPane.add(codebaseTxt, gridBagConstraints); colorLb.setLabelFor(colorButton); colorLb.setText(msg.get("applet_bgcolor")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); htmlPane.add(colorLb, gridBagConstraints); colorButton.setToolTipText(msg.get("applet_bgcolor_tooltip")); colorButton.setColor(settings.appletBgColor); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); htmlPane.add(colorButton, gridBagConstraints); widthLb.setLabelFor(widthText); widthLb.setText(msg.get("WIDTH")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); htmlPane.add(widthLb, gridBagConstraints); widthText.setHorizontalAlignment(javax.swing.JTextField.RIGHT); widthText.setText(settings.appletWidth); widthText.setToolTipText(msg.get("applet_width_tooltip")); widthText.setPreferredSize(new java.awt.Dimension(50, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); htmlPane.add(widthText, gridBagConstraints); heightLb.setLabelFor(heightText); heightLb.setText(msg.get("HEIGHT")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); htmlPane.add(heightLb, gridBagConstraints); heightText.setHorizontalAlignment(javax.swing.JTextField.RIGHT); heightText.setText(settings.appletHeight); heightText.setToolTipText(msg.get("applet_height_tooltip")); heightText.setPreferredSize(new java.awt.Dimension(50, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); htmlPane.add(heightText, gridBagConstraints); JScodebaseLb.setLabelFor(JScodebaseTxt); JScodebaseLb.setText(msg.get("js_codebase")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(20, 2, 2, 2); htmlPane.add(JScodebaseLb, gridBagConstraints); JScodebaseTxt.setText(settings.jsCodeBase); JScodebaseTxt.setToolTipText(msg.get("js_codebase_tooltip")); JScodebaseTxt.setPreferredSize(new java.awt.Dimension(300, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(20, 2, 2, 2); htmlPane.add(JScodebaseTxt, gridBagConstraints); mainPane.addTab(msg.get("settings_html"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/html_doc.gif")), htmlPane); // NOI18N getContentPane().add(mainPane, java.awt.BorderLayout.CENTER); okButton.setText(msg.get("OK")); okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okButtonActionPerformed(evt); } }); btPanel.add(okButton); cancelButton.setText(msg.get("CANCEL")); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); btPanel.add(cancelButton); getContentPane().add(btPanel, java.awt.BorderLayout.SOUTH); pack(); } // //GEN-END:initComponents private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_cancelButtonActionPerformed result = false; closeDialog(null); } // GEN-LAST:event_cancelButtonActionPerformed private void okButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_okButtonActionPerformed if (accept()) { result = true; closeDialog(null); } } // GEN-LAST:event_okButtonActionPerformed public boolean accept() { String p1 = null; settings.lookAndFeel = (String) lookCombo.getSelectedItem(); settings.preferredBrowser = browserField.getText(); settings.language = Messages.getLanguageFromDescriptive((String) langCombo.getSelectedItem()); settings.country = StrUtils.nullableString(countryField.getText()); settings.variant = StrUtils.nullableString(variantField.getText()); if (mJMFbtn.isSelected()) settings.mediaSystem = edu.xtec.jclic.Constants.JMF; else if (mQTbtn.isSelected()) settings.mediaSystem = edu.xtec.jclic.Constants.QT; else settings.mediaSystem = edu.xtec.jclic.Constants.DEFAULT; settings.appletCodeBase = StrUtils.secureString(codebaseTxt.getText(), AuthorSettings.DEFAULT_APPLET_CODEBASE); settings.appletWidth = StrUtils.secureString(widthText.getText(), AuthorSettings.DEFAULT_APPLET_WIDTH); settings.appletHeight = StrUtils.secureString(heightText.getText(), AuthorSettings.DEFAULT_APPLET_HEIGHT); settings.appletBgColor = colorButton.getColor(); settings.jsCodeBase = StrUtils.secureString(JScodebaseTxt.getText(), AuthorSettings.DEFAULT_JS_CODEBASE); settings.imgMaxWidth = Integer.parseInt(StrUtils.secureString(maxImgWidthText.getText(), Integer.toString(MediaBagEditor.DEFAULT_IMG_MAX_WIDTH))); settings.imgMaxHeight = Integer.parseInt(StrUtils.secureString(maxImgHeightText.getText(), Integer.toString(MediaBagEditor.DEFAULT_IMG_MAX_HEIGHT))); return true; } /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt) { // GEN-FIRST:event_closeDialog setVisible(false); dispose(); } // GEN-LAST:event_closeDialog // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField JScodebaseTxt; private javax.swing.JTextField browserField; private javax.swing.JTextField codebaseTxt; private edu.xtec.jclic.beans.ColorButton colorButton; private javax.swing.JTextField countryField; private javax.swing.JTextField heightText; private javax.swing.JPanel imgSizePanel; private javax.swing.JComboBox langCombo; private javax.swing.JComboBox lookCombo; private javax.swing.JRadioButton mDefaultBtn; private javax.swing.JRadioButton mJMFbtn; private javax.swing.JRadioButton mQTbtn; private javax.swing.JTextField maxImgHeightText; private javax.swing.JTextField maxImgWidthText; private javax.swing.JTextField variantField; private javax.swing.JTextField widthText; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/AuthorSingleFrame.java000066400000000000000000001402441335566474600222250ustar00rootroot00000000000000/* * File : AuthorSingleFrame.java * Created : 16-sep-2002 10:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.bags.*; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.clic3.Clic3; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.fileSystem.*; import edu.xtec.jclic.media.*; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.*; import edu.xtec.jclic.skins.AboutWindow; import edu.xtec.util.*; import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.*; import org.json.JSONObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class AuthorSingleFrame extends JPanel implements ResourceBridge, TestPlayerContainer, RunnableComponent, Constants, ActionListener { protected Options options; protected Messages messages; protected JClicProject project; protected JFrame debugFrame = null; protected int recentFilesOffset; protected JMenuBar menuBar; protected JMenu fileMenu, recentFilesMenu, toolsMenu, helpMenu, editMenu, insertMenu, viewMenu; protected AuthorSettings settings; protected Player player; protected JTabbedPane tabbedPane; protected Action[] actions; protected Action[] projectActions; private edu.xtec.util.SwingWorker worker = null; protected JDialog playerDlg; protected JClicProjectEditor projectEditor; protected EditorPanel mediaBagEditorPanel; protected EditorPanel activityBagEditorPanel; protected EditorPanel activitySequenceEditorPanel; protected EditorPanel projectSettingsEditorPanel; protected ProgressDialog progressDialog; public static final String MESSAGES_BUNDLE = "messages.AuthorMessages"; /** Creates a new instance of Author */ public AuthorSingleFrame(Options options) { this.options = options; setLayout(new BorderLayout()); init(); } protected final void init() { settings = AuthorSettings.loadAuthorSettings(this); options.setLookAndFeel(); Utils.checkRenderingHints(options); CheckMediaSystem.check(options, false); setMessages(); buildActions(); setActionsText(); progressDialog = new ProgressDialog(this, options); ActiveBox.compressImages = options.getBoolean(COMPRESS_IMAGES, true); createFrames(); } public void activate() { focusListener.focusGained(null); } // Methods inherited from ResourceBridge interface: public java.io.InputStream getProgressInputStream(java.io.InputStream is, int expectedLength, String name) { return progressDialog == null ? is : progressDialog.getProgressInputStream(is, expectedLength, name); } public edu.xtec.util.Options getOptions() { return options; } public String getMsg(String key) { return messages.get(key); } public javax.swing.JComponent getComponent() { return this; } // Methods inherited from interface RunnableComponent: public void addTo(javax.swing.RootPaneContainer cont, Object constraints) { cont.setContentPane(this); checkMenu(false); } public boolean start(String fullPath, String sequence) { boolean result = false; if (fullPath != null) { result = load(fullPath, sequence); } return result; } public void stop() { } public void end() { } public Messages setMessages() { messages = Messages.getMessages(options, DEFAULT_BUNDLE); messages.addBundle(COMMON_SETTINGS); messages.addBundle(ExtendedPlayer.MESSAGES_BUNDLE); messages.addBundle(MESSAGES_BUNDLE); setLocale(messages.getLocale()); return messages; } public boolean load(String fullPath, String sequence) { load(fullPath, sequence, null); return true; } public void load(final String sFullPath, final String sSequence, final String sActivity) { if (worker != null) { return; } if (sFullPath != null && project != null) { if (project != null) { project.mediaBag.clearData(); } if (player != null) { player.activeMediaBag.removeAll(); } System.gc(); } worker = new edu.xtec.util.SwingWorker() { ActivityBagElement abe = null; Exception exception = null; AuthorSingleFrame thisAuthor = AuthorSingleFrame.this; String fullPath = null; String sequence = null; String activityName = null; boolean imported = false; @Override public Object construct() { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { fullPath = Clic3.pacNameToLowerCase(sFullPath); sequence = Clic3.pacNameToLowerCase(sSequence); activityName = sActivity; boolean prompted = false; while (!isCancelled()) { String dn = fullPath != null ? fullPath : sequence != null ? sequence : activityName; progressDialog.setText(messages.get("msg_loading") + " " + dn); FileSystem fileSystem = project == null ? createFileSystem() : project.getFileSystem(); // Step 1: load project if (fullPath != null) { if (fileSystem != null) { fullPath = fileSystem.getUrl(fullPath); if (fullPath.startsWith("file://")) { fullPath = fullPath.substring(7); } else if (fullPath.indexOf('?') > 0) { fullPath = fullPath.substring(0, fullPath.indexOf('?')); } } if (sequence == null) { sequence = "0"; } String projectName = null; JSONObject json = null; if (fullPath.endsWith(Utils.EXT_JCLIC_ZIP)) { fileSystem = FileSystem.createFileSystem(fullPath, thisAuthor); String[] projects = ((ZipFileSystem) fileSystem).getEntries(".jclic"); if (projects == null) { throw new Exception("File " + fullPath + " does not contain any jclic project"); } projectName = projects[0]; } else if (fullPath.endsWith(Utils.EXT_SCORM_ZIP)) { fileSystem = FileSystem.createFileSystem(fullPath, thisAuthor); if (fileSystem.fileExists("project.json")) { json = new JSONObject(new String(fileSystem.getBytes("project.json"))); projectName = json.optString("mainFile", null); } if (projectName == null) { throw new Exception("Invalid JClic SCORM file: " + fullPath); } } else { fileSystem = new FileSystem(FileSystem.getPathPartOf(fullPath), thisAuthor); projectName = FileSystem.getFileNameOf(fullPath); if (fileSystem.fileExists("project.json")) json = new JSONObject(new String(fileSystem.getBytes("project.json"))); } if (projectName.endsWith(".jclic")) { org.jdom.Document doc = fileSystem.getXMLDocument(projectName); System.gc(); JClicProject prj = JClicProject.getJClicProject(doc.getRootElement(), thisAuthor, fileSystem, fullPath); if (json != null) { prj.readJSON(json, false); } setProject(prj); } else { sequence = projectName; setProject(new JClicProject(thisAuthor, fileSystem, fullPath)); } } // load sequence if (sequence != null) { ActivitySequenceElement ase = null; String seqName = FileSystem.stdFn(sequence); // get existing sequence by name if (project != null) { ase = project.activitySequence.getElementByTag(seqName, true); } // get existing sequence by number if (ase == null && project != null) { int i = StrUtils.getAbsIntValueOf(seqName); if (i >= 0) { ase = project.activitySequence.getElement(i, true); } } // load new sequence (only with Clic3 files) if (ase == null && project != null) { boolean firstPac = (project.activitySequence.getSize() == 0); boolean isPcc = seqName.endsWith(".pcc"); boolean isPac = seqName.endsWith(".pac"); if (isPcc || isPac) { imported = true; if (isPcc) { String path = fileSystem.root + seqName; fileSystem = FileSystem.createFileSystem(path, thisAuthor); if (firstPac) { project.setFileSystem(fileSystem); project.setFullPath(path); } else { setProject(new JClicProject(thisAuthor, fileSystem, path)); } firstPac = true; Clic3.readPccFile(project); ase = project.activitySequence.getCurrentAct(); } else if (isPac) { Clic3.addPacToSequence(project, seqName); ase = project.activitySequence.getElementByTag(seqName, true); } if (firstPac) { project.setName(seqName); } } } if (ase != null) { activityName = ase.getActivityName(); } } // load activity if (activityName != null && project != null) { String actName = FileSystem.stdFn(activityName); abe = project.activityBag.getElement(actName); } fullPath = null; sequence = null; activityName = null; if (project != null) { project.activitySequence.checkAllElements(); } if (project != null) { Map hm = new HashMap(); project.activityBag.listReferences(SEQUENCE_OBJECT, hm); project.activityBag.listReferences(ACTIVITY_OBJECT, hm); project.activitySequence.listReferences(null, hm); java.util.Iterator it = hm.keySet().iterator(); while (it.hasNext() && !isCancelled()) { String s = (String) it.next(); if (SEQUENCE_OBJECT.equals(hm.get(s))) { if (project.activitySequence.getElementByTag(s, false) == null) { sequence = Clic3.pacNameToLowerCase(s); break; } } else if (!project.activityBag.activityExists(s)) { activityName = s; break; } } } if (fullPath == null && sequence == null && activityName == null) { break; } else { if (!prompted) { prompted = (messages.showQuestionDlg(progressDialog, "msg_prompt_loadReferences", null, "yn") == Messages.YES); if (!prompted) { break; } } abe = null; } } if (project != null && !isCancelled()) { project.mediaBag.waitForAllImages(); } } catch (Exception ex) { exception = ex; System.err.println("Exception:" + ex); } attachProject(); if (imported && projectEditor != null) { projectEditor.setModified(true); } return abe; } @Override public void finished() { progressDialog.setVisible(false); setCursor(null); if (worker == null || exception != null) { List v = new ArrayList(); if (fullPath != null) { v.add(fullPath); } if (sequence != null) { v.add(sequence); } if (activityName != null) { v.add(activityName); } messages.showErrorWarning(thisAuthor, "err_reading_data", v, exception, null); } // unlock events worker = null; setEnabled(true); } }; // finalization process setCursor(null); // lock events setEnabled(false); // Done by progressDialog! progressDialog.start("WORKING", "msg_loading_project", worker, true, true, false); } protected void setProject(JClicProject p) { if (project != null) { project.end(); } project = p; setFrameTitle(null); checkActions(); } protected void setFrameTitle(String s) { java.awt.Frame fr = JOptionPane.getFrameForComponent(AuthorSingleFrame.this); if (fr != null) { StringBuilder sb = new StringBuilder("JClic author"); if (s != null && s.length() > 0) { sb.append(" - ").append(s); } else if (project != null) { sb.append(" - ").append(project.getName()); } fr.setTitle(sb.substring(0)); } } protected void checkActions() { if (projectActions != null) { for (int i = 0; i < projectActions.length; i++) { projectActions[i].setEnabled(project != null); } } } protected FileSystem createFileSystem() { return settings.fileSystem; } protected void createMenu() { Editor.createBasicActions(options); MediaBagEditor.createActions(options); ActivityBagEditor.createBasicActions(options); ActivitySequenceEditor.createActions(options); menuBar = new JMenuBar(); fileMenu = new JMenu(messages.get("m_File")); fileMenu.setMnemonic(messages.get("m_File_Mnemonic").charAt(0)); fileMenu.add(new KJMenuItem(getAction(ACTION_NEW_PROJECT))); fileMenu.addSeparator(); fileMenu.add(new KJMenuItem(getAction(ACTION_OPEN_FILE))); fileMenu.add(new KJMenuItem(getAction(ACTION_OPEN_URL))); fileMenu.addSeparator(); fileMenu.add(new KJMenuItem(getAction(ACTION_SAVE_FILE))); fileMenu.add(new KJMenuItem(getAction(ACTION_SAVE_FILE_AS))); fileMenu.addSeparator(); fileMenu.add(new KJMenuItem(getAction(ACTION_EXPORT_HTML5))); menuBar.add(fileMenu); editMenu = new JMenu(messages.get("m_Edit")); editMenu.setMnemonic(messages.get("m_Edit_Mnemonic").charAt(0)); editMenu.add(new KJMenuItem(Editor.cutAction)); editMenu.add(new KJMenuItem(Editor.copyAction)); editMenu.add(new KJMenuItem(Editor.pasteAction)); editMenu.add(new KJMenuItem(Editor.deleteAction)); editMenu.addSeparator(); editMenu.add(ActivityBagEditor.copyActivityAttributesAction); editMenu.addSeparator(); editMenu.add(new KJMenuItem(Editor.moveUpAction)); editMenu.add(new KJMenuItem(Editor.moveDownAction)); menuBar.add(editMenu); insertMenu = new JMenu(messages.get("m_Insert")); insertMenu.setMnemonic(messages.get("m_Insert_Mnemonic").charAt(0)); insertMenu.add(MediaBagEditor.newMediaBagElementAction); insertMenu.add(ActivityBagEditor.newActivityBagElementAction); insertMenu.add(ActivitySequenceEditor.newActivitySequenceElementAction); insertMenu.addSeparator(); insertMenu.add(new KJMenuItem(getAction(ACTION_IMPORT_ACTIVITIES))); menuBar.add(insertMenu); toolsMenu = new JMenu(messages.get("m_Tools")); toolsMenu.setMnemonic(messages.get("m_Tools_Mnemonic").charAt(0)); toolsMenu.add(new KJMenuItem(getAction(ACTION_SETTINGS))); toolsMenu.addSeparator(); toolsMenu.add(new KJMenuItem(getAction(ACTION_DOCTREE))); toolsMenu.addSeparator(); toolsMenu.add(new KJMenuItem(getAction(ACTION_CREATE_INSTALLER))); menuBar.add(toolsMenu); viewMenu = new JMenu(messages.get("m_View")); viewMenu.setMnemonic(messages.get("m_View_Mnemonic").charAt(0)); viewMenu.add(new KJMenuItem(getAction(ACTION_EDIT_PROJECT))); viewMenu.add(new KJMenuItem(getAction(ACTION_EDIT_MEDIA))); viewMenu.add(new KJMenuItem(getAction(ACTION_EDIT_ACTIVITIES))); viewMenu.add(new KJMenuItem(getAction(ACTION_EDIT_SEQ))); viewMenu.addSeparator(); viewMenu.add(ActivityBagElementEditor.testActivityAction); viewMenu.add(MediaBagElementEditor.testMediaBagElementAction); menuBar.add(viewMenu); helpMenu = new JMenu(messages.get("m_Help")); helpMenu.setMnemonic(messages.get("m_Help_Mnemonic").charAt(0)); helpMenu.add(new KJMenuItem(getAction(ACTION_ABOUT))); menuBar.add(helpMenu); } protected void postCreateMenu() { fileMenu.addSeparator(); fileMenu.add(new KJMenuItem(getAction(ACTION_EXIT))); fileMenu.addSeparator(); recentFilesMenu = fileMenu; recentFilesOffset = fileMenu.getItemCount(); updateRecentFilesMenu(); } protected void checkMenu(boolean recreate) { JRootPane rp = getRootPane(); if (rp == null) { return; } if (recreate || rp.getJMenuBar() == null) { if (recreate || menuBar == null) { createMenu(); postCreateMenu(); } rp.setJMenuBar(menuBar); rp.revalidate(); } } protected void updateRecentFilesMenu() { if (recentFilesMenu != null && recentFilesOffset >= 0) { JMenuItem jmi; int itemsToRemove = recentFilesMenu.getItemCount() - recentFilesOffset; for (int i = 0; i < itemsToRemove; i++) { recentFilesMenu.remove(recentFilesOffset); } for (int i = 0; i < PlayerSettings.MAX_RECENT; i++) { if (settings.recentFiles[i] != null) { String s = settings.recentFiles[i]; int k = s.lastIndexOf('\\'); if (k < 0) { k = s.lastIndexOf('/'); } if (k >= 0) { s = s.substring(k + 1); } createMenuItem(recentFilesMenu, Integer.toString(i + 1) + ". " + s, "recent" + i, true, KeyStroke.getKeyStroke(KeyEvent.VK_1 + i, ActionEvent.ALT_MASK)); } } } } JMenuItem createMenuItem(JComponent parent, String text, String actionCommand, boolean mnemonic, KeyStroke accelerator) { JMenuItem jmi = new JMenuItem(text); if (actionCommand != null) { jmi.setActionCommand(actionCommand); jmi.addActionListener(this); } if (mnemonic) { jmi.setMnemonic(jmi.getText().charAt(0)); } if (accelerator != null) { jmi.setAccelerator(accelerator); } parent.add(jmi); return jmi; } public static final int ACTION_OPEN_FILE = 0, ACTION_OPEN_URL = 1, ACTION_SAVE_FILE = 2, ACTION_SAVE_FILE_AS = 3, ACTION_EXIT = 4, ACTION_SETTINGS = 5, ACTION_DOCTREE = 6, ACTION_ABOUT = 7, ACTION_NEW_PROJECT = 8, ACTION_EDIT_PROJECT = 9, ACTION_EDIT_MEDIA = 10, ACTION_EDIT_ACTIVITIES = 11, ACTION_EDIT_SEQ = 12, ACTION_CREATE_INSTALLER = 13, ACTION_IMPORT_ACTIVITIES = 14, ACTION_EXPORT_HTML5 = 15, AUTHOR_NUM_ACTIONS = 16; public static final String[] ACTION_NAMES = { "openFile", "openUrl", "saveFile", "saveFileAs", "exit", "settings", "docTree", "helpAbout", "newProject", "editProject", "editMedia", "editActivities", "editSeq", "createInstaller", "importActivities", "exportProject" }; public static final String[] ACTION_ICONS = { "icons/file_open.gif", "icons/world.gif", "icons/file_save.gif", "icons/file_save_as.gif", "icons/exit_small.gif", "icons/settings.gif", "icons/tree.gif", "icons/help.gif", "icons/project_new.gif", "icons/project_settings.gif", "icons/media_bag.gif", "icons/miniclic.png", "icons/sequence.gif", "icons/installer.gif", "icons/import_act.png", "icons/html_doc.gif" }; protected int getNumActions() { return AUTHOR_NUM_ACTIONS; } protected void buildActions() { actions = new Action[getNumActions()]; actions[ACTION_OPEN_FILE] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (checkSaveChanges(false)) { int[] filters = { Utils.ALL_CLIC_FF, Utils.INSTALL_FF, Utils.ALL_JCLIC_SCORM_FF }; FileSystem fs = settings.fileSystem; String result = fs.chooseFile(null, false, filters, options, null, AuthorSingleFrame.this, false); if (result != null) { String fileName = fs.getFullFileNamePath(result); if (load(fileName, null)) { addRecentFile(fileName); } } } } }; actions[ACTION_OPEN_URL] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (checkSaveChanges(false)) { String url = messages.showInputDlg(AuthorSingleFrame.this, "URL_OPEN", "URL", "http://", "URL_OPEN", false); if (url != null) { url = url.trim(); if (url.startsWith("http://http://")) { url = url.substring(7); } if (url.length() > 0 && !url.equals("http://")) { if (load(url, null)) { addRecentFile(url); } } } } } }; actions[ACTION_SAVE_FILE] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { saveFile(false); } }; actions[ACTION_SAVE_FILE_AS] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { saveFile(true); } }; actions[ACTION_EXIT] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { exit(); } }; actions[ACTION_SETTINGS] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { String currentLook = options.getString(LFUtil.LOOK_AND_FEEL); String currentLanguage = options.getString(Messages.LANGUAGE); String currentCountry = options.getString(Messages.COUNTRY); String currentVariant = options.getString(Messages.VARIANT); String currentMediaSystem = settings.mediaSystem; if (settings.edit(AuthorSingleFrame.this)) { settings.save(); options.syncProperties(settings.getProperties(), false); boolean recreateMenu = false; if (!settings.lookAndFeel.equals(currentLook)) { options.setLookAndFeel(); recreateMenu = true; } if (settings.language != null && (!StrUtils.compareObjects(settings.language, currentLanguage) || !StrUtils.compareObjects(settings.country, currentCountry) || !StrUtils.compareObjects(settings.variant, currentVariant))) { setMessages(); recreateMenu = true; } if (recreateMenu) { checkMenu(true); } if (!currentMediaSystem.equals(settings.mediaSystem)) { options.put(MEDIA_SYSTEM, settings.mediaSystem); edu.xtec.jclic.media.CheckMediaSystem.check(options, false); } } } }; actions[ACTION_DOCTREE] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (project != null) { org.jdom.Element e = JDomTreePanel.editElement(AuthorSingleFrame.this, project.getJDomElement(), AuthorSingleFrame.this, project.getFileSystem(), project.getName(), "edit_docTree_title"); if (e != null) { try { String fullPath = project.getFullPath(); JClicProject prj = JClicProject.getJClicProject(e, AuthorSingleFrame.this, FileSystem.createFileSystem(fullPath, AuthorSingleFrame.this), fullPath); if (prj != null) { setProject(prj); attachProject(); projectEditor.setModified(true); } } catch (Exception ex) { messages.showErrorWarning(AuthorSingleFrame.this, "edit_tree_badFormat", ex); } } } } }; actions[ACTION_IMPORT_ACTIVITIES] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (project != null) { int[] filters = { Utils.ALL_JCLIC_FF }; FileSystem fs = settings.fileSystem; String result = fs.chooseFile(null, false, filters, options, "import_selectProject", AuthorSingleFrame.this, false); if (result != null) { String fullPath = fs.getFullFileNamePath(result); if ((new File(project.getFileSystem().getFullRoot())).equals(new File(fullPath))) { messages.showAlert(AuthorSingleFrame.this, "import_warn_samefile"); } else { doImportActivities(fullPath); } } } } }; actions[ACTION_ABOUT] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { AboutWindow aw = new AboutWindow(AuthorSingleFrame.this, AuthorSingleFrame.this, new Dimension(500, 400)); try { aw.buildAboutTab("JClic author", getMsg("AUTHOR_VERSION"), "logo_author_small.png", null, null, null, null); aw.buildStandardTab(aw.getHtmlSystemInfo(), "about_window_systemInfo", "about_window_lb_system", "icons/system_small.gif"); aw.setVisible(true); } catch (Exception ex) { System.err.println("Error building about window: " + ex); } } }; actions[ACTION_NEW_PROJECT] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (checkSaveChanges(false)) { JClicProject prj = NewProjectDlg.prompt(AuthorSingleFrame.this, AuthorSingleFrame.this, createFileSystem()); if (prj != null) { setProject(prj); attachProject(); } } } }; actions[ACTION_EXPORT_HTML5] = new AbstractAction() { @Override public void actionPerformed(ActionEvent ev) { if (checkSaveChanges(project.isScorm)) { String inputPath = project.getFileSystem().getFullFileNamePath(""); String[] folders = ExportToJSDlg.prompt(AuthorSingleFrame.this, AuthorSingleFrame.this, inputPath, AuthorSingleFrame.this.settings.rootExportPath, AuthorSingleFrame.this.settings.rootScormPath); if (folders != null) { try { boolean exportAll = folders[2].equals("true"); String scormFile = folders[3]; if (!exportAll) { inputPath = project.getFileSystem().getFullRoot(); } String fullPath = (new File(project.getFullPath())).getCanonicalPath(); String mainFile = project.getFileSystem().getRelativeFileNamePath(fullPath); if (mainFile.endsWith(".zip")) { mainFile = mainFile.substring(0, mainFile.length() - 4); } ExportTaskDlg.doTask(AuthorSingleFrame.this, settings, AuthorSingleFrame.this, inputPath, folders[0], mainFile, project, exportAll, scormFile); } catch (IOException ex) { System.err.println("Error: " + ex); } } } } }; actions[ACTION_EDIT_PROJECT] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (tabbedPane != null) { tabbedPane.setSelectedComponent(projectSettingsEditorPanel); } } }; actions[ACTION_EDIT_MEDIA] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (tabbedPane != null) { tabbedPane.setSelectedComponent(mediaBagEditorPanel); } } }; actions[ACTION_EDIT_ACTIVITIES] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (tabbedPane != null) { tabbedPane.setSelectedComponent(activityBagEditorPanel); } } }; actions[ACTION_EDIT_SEQ] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (tabbedPane != null) { tabbedPane.setSelectedComponent(activitySequenceEditorPanel); } } }; /* * actions[ACTION_CREATE_HTML] = new AbstractAction() { public void * actionPerformed(ActionEvent ev) { if (checkSaveChanges(project.isScorm)) { * AppletHtmlCreator.createHtml(project, settings, AuthorSingleFrame.this); } } * }; */ actions[ACTION_CREATE_INSTALLER] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (checkSaveChanges(project.isScorm)) { ProjectInstallerEditPanel.createInstaller(project, AuthorSingleFrame.this); } } }; projectActions = new Action[] { actions[ACTION_SAVE_FILE], actions[ACTION_SAVE_FILE_AS], actions[ACTION_DOCTREE], actions[ACTION_EDIT_SEQ], actions[ACTION_EDIT_ACTIVITIES], actions[ACTION_EDIT_MEDIA], actions[ACTION_EDIT_PROJECT], actions[ACTION_CREATE_INSTALLER], actions[ACTION_IMPORT_ACTIVITIES], actions[ACTION_EXPORT_HTML5] }; checkActions(); } protected boolean saveFile(boolean saveAs) { boolean ok = false; if (project != null && projectEditor.checkProject(options, this, true)) { int[] filters = { Utils.JCLIC_ZIP_FF }; FileSystem fs = project.getFileSystem(); String path = StrUtils.secureString(project.getFullPath(), project.getName() + Utils.EXT_JCLIC_ZIP); ; if (project.isScorm) { if (messages.showQuestionDlg(this, "warn_save_scorm_file", "CONFIRM", "yn") != Messages.YES) return false; saveAs = true; path = settings.fileSystem .getFullFileNamePath(project.getName() + File.separator + project.getName() + Utils.EXT_JCLIC_ZIP); } String pLower = path.toLowerCase(); if (!pLower.endsWith(Utils.EXT_JCLIC_ZIP)) { if (pLower.endsWith(".jclic")) { path = path + ".zip"; } else if (pLower.endsWith(".pac") || pLower.endsWith(".pcc")) { int dot = path.lastIndexOf('.'); if (dot >= 1) { path = path.substring(0, dot); } path = path + Utils.EXT_JCLIC_ZIP; } } String result; File f = new File(path); if (project.isScorm) { // Create folder if not exists try { f.getParentFile().mkdir(); } catch (Exception ex) { messages.showErrorWarning(this, "err_unable_to_create_folder", ex); return false; } } if (!saveAs && f.exists() && f.canWrite()) { result = path; } else { result = fs.chooseFile(path, true, filters, options, null, AuthorSingleFrame.this, false); } if (result != null) { ok = doSaveFile(result); setFrameTitle(null); } } return ok; } static boolean saveResult; protected boolean doSaveFile(final String fName) { if (worker != null) { return false; } saveResult = false; worker = new edu.xtec.util.SwingWorker() { Exception exception = null; AuthorSingleFrame thisAuthor = AuthorSingleFrame.this; @Override public Object construct() { Object o = null; setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { projectEditor.saveProject(fName); saveResult = true; project.isScorm = false; addRecentFile(project.getFullPath()); o = true; } catch (Exception ex) { exception = ex; } return o; } @Override public void finished() { progressDialog.setVisible(false); setCursor(null); if (worker == null || exception != null) { messages.showErrorWarning(thisAuthor, "FILE_ERR_SAVING", fName, exception, null); } // unlock events worker = null; setEnabled(true); } }; setCursor(null); setEnabled(false); progressDialog.start("WORKING", "msg_saving_project", worker, true, false, true); return saveResult; } protected void doImportActivities(final String fullPath) { if (worker != null) { return; } System.gc(); worker = new edu.xtec.util.SwingWorker() { Exception exception = null; AuthorSingleFrame thisAuthor = AuthorSingleFrame.this; @Override public Object construct() { Object o = null; setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { JClicProject jcp = JClicProject.getJClicProject(thisAuthor, fullPath, progressDialog); if (jcp != null) { progressDialog.setText(messages.get("import_importing")); // Select activities to import JClicProjectEditor jcped = (JClicProjectEditor) jcp.getEditor(null); javax.swing.JList actList = new javax.swing.JList(jcp.activityBag.getElements()); javax.swing.JScrollPane pane = new javax.swing.JScrollPane(actList); pane.setPreferredSize(new java.awt.Dimension(300, 300)); if (messages.showInputDlg(thisAuthor, new String[] { "import_selectActivities" }, new String[] {}, new JComponent[] { pane }, "action_importActivities_caption") && actList.getSelectedIndices().length > 0) { progressDialog.setText(messages.get("import_checkdep")); Object[] selection = actList.getSelectedValues(); // check media elements to import List mediaNames = new ArrayList(); for (int i = 0; i < selection.length; i++) { ActivityBagElement abe = (ActivityBagElement) selection[i]; Map map = abe.getReferences(); Iterator it = map.keySet().iterator(); while (it.hasNext()) { String media = (String) it.next(); Object mediaType = map.get(media); if (Constants.MEDIA_OBJECT.equals(mediaType) && !mediaNames.contains(media)) { mediaNames.add(media); } // Todo: process also objects of type Constants.EXTERNAL_OBJECT } } // get the list of media bag elements ArrayList mediaBagElements = new ArrayList(); for (int i = 0; i < mediaNames.size(); i++) { MediaBagElement mb = jcp.mediaBag.getElement((String) mediaNames.get(i)); if (mb != null) { mediaBagElements.add(mb); } } // check for repeated media names and import media for (MediaBagElement mbe : mediaBagElements) { String name = mbe.getName(); String rootName = name; progressDialog.setText(messages.get("import_impmedia") + " " + name); int prefix = 0; while (project.mediaBag.getElement(name) != null) { name = "i0" + Integer.toString(++prefix) + "-" + rootName; } String fName = mbe.getFileName(); String rootFName = fName; prefix = 0; while (project.getFileSystem().fileExists(fName)) { fName = "i0" + Integer.toString(++prefix) + "-" + rootFName; } File outFile = new File(project.getFileSystem().getFullFileNamePath(fName)); outFile.getParentFile().mkdirs(); java.io.FileOutputStream fos = new java.io.FileOutputStream(outFile); edu.xtec.util.StreamIO.writeStreamTo(jcp.mediaBag.getInputStream(mbe.getName()), fos); if (!name.equals(rootName)) { jcped.getActivityBagEditor().nameChanged(Constants.T_MEDIA, rootName, name); mbe.setName(name); } if (!fName.equals(rootFName)) { mbe.setFileName(fName); } mbe.setData(null); projectEditor.getMediaBagEditor().addMediaBagElement(mbe); } // Import activities for (int i = 0; i < selection.length; i++) { ActivityBagElement abe = (ActivityBagElement) selection[i]; String actName = abe.toString(); String rootName = actName; progressDialog.setText(messages.get("import_impact") + " " + actName); int prefix = 0; while (project.activityBag.getElementByName(actName) != null) { actName = "i0" + Integer.toString(++prefix) + rootName; } if (!actName.equals(rootName)) { jcped.nameChanged(Constants.T_ACTIVITY, rootName, actName); } ActivityBagElementEditor abeed = (ActivityBagElementEditor) abe.getEditor(null); projectEditor.getActivityBagEditor().insertEditor(abeed, true, -1, false); } o = true; } } } catch (Exception ex) { exception = ex; } return o; } @Override public void finished() { progressDialog.setVisible(false); setCursor(null); if (worker == null || exception != null) { messages.showErrorWarning(thisAuthor, "FILE_ERR_OPENING", fullPath, exception, null); } // unlock events worker = null; setEnabled(true); } }; setCursor(null); setEnabled(false); progressDialog.start("WORKING", "import_importing", worker, true, false, true); } protected void setActionsText() { if (actions != null) { for (int i = 0; i < actions.length; i++) { if (actions[i] != null) { String s = messages.get("action_" + getActionName(i) + "_caption"); if (!s.equals(actions[i].getValue(Action.NAME))) { actions[i].putValue(Action.NAME, s); } s = messages.get("action_" + getActionName(i) + "_tooltip"); if (!s.equals(actions[i].getValue(Action.SHORT_DESCRIPTION))) { actions[i].putValue(Action.SHORT_DESCRIPTION, s); } s = messages.get("action_" + getActionName(i) + "_keys"); if (s != null && s.length() == 2) { actions[i].putValue(Action.MNEMONIC_KEY, new Integer(s.charAt(0))); if (s.charAt(1) != '*') { actions[i].putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke((int) s.charAt(1), KeyEvent.CTRL_MASK)); } } Icon icon = getActionIcon(i); if (icon != null && !icon.equals(actions[i].getValue(Action.SMALL_ICON))) { actions[i].putValue(Action.SMALL_ICON, icon); } } } } } protected String getActionName(int actionId) { if (actionId < 0 || actionId >= ACTION_NAMES.length) { return null; } return ACTION_NAMES[actionId]; } protected Icon getActionIcon(int actionId) { if (actionId < 0 || actionId >= ACTION_ICONS.length) { return null; } return ResourceManager.getImageIcon(ACTION_ICONS[actionId]); } public Action getAction(int id) { if (actions == null || id < 0 || id >= actions.length) { return null; } return actions[id]; } protected boolean processActionEvent(String ac) { if (ac.startsWith("recent") && ac.length() > 6) { try { int i = Integer.parseInt(ac.substring(6)); if (i >= 0 && i < PlayerSettings.MAX_RECENT && settings.recentFiles[i] != null && checkSaveChanges(false)) { load(settings.recentFiles[i], null); } } catch (Exception ex) { System.err.println("invalid command: " + ac); } } else { return !isEnabled(); } return true; } protected void addRecentFile(String fName) { settings.addRecentFile(fName); updateRecentFilesMenu(); settings.save(); } public void actionPerformed(java.awt.event.ActionEvent actionEvent) { String cmd = actionEvent.getActionCommand(); if (cmd != null) { processActionEvent(cmd); } } public void exit() { if (checkSaveChanges(false)) { SwingUtilities.invokeLater(new Runnable() { public void run() { if (options.getApplet() == null) { try { end(); java.awt.Frame fr = JOptionPane.getFrameForComponent(AuthorSingleFrame.this); if (fr != null) { fr.dispose(); } else { System.exit(0); } } catch (Exception ex) { System.err.println("Unable to exit!\n" + ex); } } } }); } } protected void attachProject() { lastFocusedPanel = null; if (projectSettingsEditorPanel != null && mediaBagEditorPanel != null && activityBagEditorPanel != null && activitySequenceEditorPanel != null) { if (project != null) { project.activityBag.sortByName(); } projectEditor = project == null ? null : (JClicProjectEditor) project.getEditor(null); projectSettingsEditorPanel.attachEditor(projectEditor == null ? null : projectEditor.getProjectSettingsEditor(), true); mediaBagEditorPanel.attachEditor(projectEditor == null ? null : projectEditor.getMediaBagEditor(), true); activityBagEditorPanel.attachEditor(projectEditor == null ? null : projectEditor.getActivityBagEditor(), true); activitySequenceEditorPanel.attachEditor(projectEditor == null ? null : projectEditor.getActivitySequenceEditor(), true); if (project != null) { player.setProject(project); player.getHistory().clearHistory(); } // 22-Jan-2013: JClicAuthor hangs when an I/O error occurs if (projectEditor != null) { projectEditor.setTestPlayerContainer(this); } } actions[ACTION_DOCTREE].setEnabled(project != null); } private EditorPanel lastFocusedPanel; protected void checkTabbedPaneFocus(boolean focusLost) { if (tabbedPane != null) { Object o = tabbedPane.getSelectedComponent(); if (!focusLost && (o instanceof EditorPanel)) { if (lastFocusedPanel != null) { lastFocusedPanel.focusLost(null); } lastFocusedPanel = (EditorPanel) o; lastFocusedPanel.focusGained(null); } else { Editor.clearBasicActionsOwner(); } } } protected java.awt.event.FocusListener focusListener = new java.awt.event.FocusListener() { public void focusGained(java.awt.event.FocusEvent ev) { if (playerDlg != null && playerDlg.isShowing()) { playerDlg.requestFocus(); } else { checkTabbedPaneFocus(false); } } public void focusLost(java.awt.event.FocusEvent ev) { checkTabbedPaneFocus(true); } }; protected void createFrames() { tabbedPane = new JTabbedPane(); tabbedPane.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent ev) { checkTabbedPaneFocus(false); } }); JClicProject newProject = new JClicProject(this, new FileSystem(this), ""); projectEditor = (JClicProjectEditor) newProject.getEditor(null); ProjectSettingsEditor psed = projectEditor.getProjectSettingsEditor(); projectSettingsEditorPanel = psed.createEditorPanel(options); tabbedPane.addTab(messages.get("edit_project"), JClicProjectEditor.getIcon(), projectSettingsEditorPanel, messages.get("edit_project_tooltip")); mediaBagEditorPanel = new MediaBagMultiEditorPanel(options); tabbedPane.addTab(messages.get("edit_media"), MediaBagEditor.getIcon(), mediaBagEditorPanel, messages.get("edit_media_tooltip")); ActivityBagEditor abe = projectEditor.getActivityBagEditor(); activityBagEditorPanel = abe.createEditorPanel(options); tabbedPane.addTab(messages.get("edit_activities"), ActivityEditor.getIcon(), activityBagEditorPanel, messages.get("edit_activities_tooltip")); activitySequenceEditorPanel = projectEditor.getActivitySequenceEditor().createEditorPanel(options); tabbedPane.addTab(messages.get("edit_sequences"), ActivitySequenceEditor.getIcon(), activitySequenceEditorPanel, messages.get("edit_sequences_tooltip")); playerDlg = new JDialog(JOptionPane.getFrameForComponent(this), "test player", true); player = new Player(options, newProject); player.getHistory().setTestMode(true); player.appName = "JClic test player"; player.addTo(playerDlg, null); playerDlg.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { player.closeHelpWindow(); player.removeActivity(); } }); playerDlg.pack(); add(tabbedPane, BorderLayout.CENTER); } public Player getTestPlayer() { return player; } public void test() { if (playerDlg != null && player != null) { player.initReporter(); if (player.reporter != null && project != null) { player.reporter.newSession(project, player, messages); } playerDlg.setVisible(true); } } public boolean newInstanceRequest(final String param1, final String param2) { SwingUtilities.invokeLater(new Runnable() { public void run() { Frame frame = JOptionPane.getFrameForComponent(AuthorSingleFrame.this); if (frame != null) { frame.toFront(); } messages.showAlert(AuthorSingleFrame.this, new String[] { "new instance request", param1, param2 }); } }); return true; } protected boolean checkSaveChanges(boolean force) { boolean result = true; if (projectEditor != null) { projectEditor.collectData(); if (force || projectEditor.isModified()) { switch (messages.showQuestionDlg(this, "warn_project_modified", "CONFIRM", "ync")) { case Messages.YES: result = saveFile(false); break; case Messages.CANCEL: result = false; break; case Messages.NO: result = !force; break; } } } return result; } public boolean windowCloseRequested() { return checkSaveChanges(false); } public void displayUrl(String url, boolean inFrame) { try { edu.xtec.util.BrowserLauncher.openURL(url); } catch (Exception ex) { System.err.println("Unable to invoque URL " + url + "\n" + ex); } } public void editActivity(String activityName) { if (tabbedPane != null && activityBagEditorPanel != null) { if (((ActivityBagEditorPanel) activityBagEditorPanel).editActivity(activityName)) { tabbedPane.setSelectedComponent(activityBagEditorPanel); } } } } src/author/edu/xtec/jclic/CopyActivityAttributesPanel.form000066400000000000000000000177751335566474600243620ustar00rootroot00000000000000
src/author/edu/xtec/jclic/CopyActivityAttributesPanel.java000066400000000000000000000413531335566474600243250ustar00rootroot00000000000000/* * File : CopyAttributesPanel.java * Created : 30-jun-2004 16:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.activities.text.TextActivityBase; import edu.xtec.jclic.activities.text.TextActivityDocument; import edu.xtec.jclic.bags.ActivityBagEditor; import edu.xtec.jclic.bags.ActivityBagElementEditor; import edu.xtec.jclic.beans.CheckBoxTreeObject; import edu.xtec.util.Options; import edu.xtec.util.ProgressDialog; import javax.swing.text.StyleContext; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class CopyActivityAttributesPanel extends javax.swing.JPanel { Options options; ActivityBagElementEditor abed; ActivityBagEditor abe; /** Creates new form CopyActivityAttributesPanel */ public CopyActivityAttributesPanel(Options options, ActivityBagElementEditor abed) { this.options = options; this.abed = abed; abe = (ActivityBagEditor) abed.getEditorParent(); initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JScrollPane scroll = new javax.swing.JScrollPane(); checkBoxTree = new edu.xtec.jclic.beans.CheckBoxTree(); javax.swing.JPanel actPanel = new javax.swing.JPanel(); javax.swing.JScrollPane actScroll = new javax.swing.JScrollPane(); actList = new javax.swing.JList(); selectAllBtn = new javax.swing.JButton(); selectNoneBtn = new javax.swing.JButton(); setLayout(new java.awt.BorderLayout()); scroll.setPreferredSize(new java.awt.Dimension(300, 300)); checkBoxTree.setModel(getTreeModel()); int k = checkBoxTree.getRowCount(); for (int i = k + 1; i >= 0; i--) { checkBoxTree.expandRow(i); } scroll.setViewportView(checkBoxTree); add(scroll, java.awt.BorderLayout.CENTER); actPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_act_copy_dest"))); actPanel.setLayout(new java.awt.GridBagLayout()); actScroll.setPreferredSize(new java.awt.Dimension(200, 300)); actList.setModel(abe.getListModel()); actScroll.setViewportView(actList); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); actPanel.add(actScroll, gridBagConstraints); selectAllBtn.setText(options.getMsg("SELECT_ALL")); selectAllBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { selectAllBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); actPanel.add(selectAllBtn, gridBagConstraints); selectNoneBtn.setText(options.getMsg("SELECT_NONE")); selectNoneBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { selectNoneBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); actPanel.add(selectNoneBtn, gridBagConstraints); add(actPanel, java.awt.BorderLayout.EAST); } // //GEN-END:initComponents private void selectNoneBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_selectNoneBtnActionPerformed actList.clearSelection(); } // GEN-LAST:event_selectNoneBtnActionPerformed private void selectAllBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_selectAllBtnActionPerformed actList.setSelectionInterval(0, actList.getModel().getSize() - 1); } // GEN-LAST:event_selectAllBtnActionPerformed public boolean showDialog(java.awt.Component parent) { boolean result = false; if (options.getMessages().showInputDlg(parent, this, "edit_act_copy_title")) { final Object[] selectedItems = actList.getSelectedValues(); if (selectedItems == null || selectedItems.length == 0) { options.getMessages().showAlert(this, "edit_act_copy_err_noSelection"); } else { final ActivityEditor srcActEd = abed.getActivityEditor(); srcActEd.collectData(); final Activity srcAct = srcActEd.getActivity(); final ProgressDialog pd = new ProgressDialog(this, options); edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { @Override public Object construct() { int modifiedItems = 0; for (int i = 0; i < selectedItems.length; i++) { ActivityBagElementEditor targetEd = (ActivityBagElementEditor) selectedItems[i]; if (targetEd != abed) { ActivityEditor targetActEd = targetEd.getActivityEditor(); Activity targetAct = targetActEd.getActivity(); pd.setFileLabel(targetAct.name); copyAttributes(srcAct, targetAct); pd.setProgressValue(modifiedItems++); targetActEd.setModified(true); targetEd.forgetActivityEditor(); } if (isCancelled() || Thread.currentThread().isInterrupted()) break; } return new Integer(modifiedItems); } @Override public void finished() { pd.setVisible(false); } }; pd.setProgressMax(selectedItems.length); pd.start("WORKING", "edit_act_copy_action_prefix", sw, true, true, false); } } return result; } private CheckBoxTreeObject bgColor, bgGradient, bgImage, activityBgColor, activityBgGradient, transparentBg, border, position, margin, msgPrev, msgIni, msgEnd, msgErr, repInclude, repActions, skin, evSounds, cTime, maxTime, cTries, maxTries, cScore, scramble, helpBtn, infoBtn, gridA, gridB, textGrid, textFontFace, textFontSize, textStyle, textColour, targetColour, errorColour, tabSpace; private TreeModel getTreeModel() { DefaultMutableTreeNode root = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_attributes")); // Main Window DefaultMutableTreeNode node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_style_main")); node.add(bgColor = new CheckBoxTreeObject(options.getMsg("edit_act_copy_bgColor"), true)); node.add(bgGradient = new CheckBoxTreeObject(options.getMsg("edit_act_copy_gradient"), true)); node.add(bgImage = new CheckBoxTreeObject(options.getMsg("edit_act_copy_bgImage"), true)); root.add(node); // Play Window node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_style_play")); node.add(activityBgColor = new CheckBoxTreeObject(options.getMsg("edit_act_copy_bgColor"), true)); node.add(activityBgGradient = new CheckBoxTreeObject(options.getMsg("edit_act_copy_gradient"), true)); node.add(transparentBg = new CheckBoxTreeObject(options.getMsg("edit_act_copy_transparentBg"), true)); node.add(border = new CheckBoxTreeObject(options.getMsg("edit_act_copy_border"), true)); node.add(margin = new CheckBoxTreeObject(options.getMsg("edit_act_copy_margin"), true)); node.add(position = new CheckBoxTreeObject(options.getMsg("edit_act_copy_position"), false)); root.add(node); // Messages node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_messages")); node.add(msgPrev = new CheckBoxTreeObject(options.getMsg("edit_act_copy_messages_prev"), true)); node.add(msgIni = new CheckBoxTreeObject(options.getMsg("edit_act_copy_messages_ini"), true)); node.add(msgEnd = new CheckBoxTreeObject(options.getMsg("edit_act_copy_messages_end"), true)); node.add(msgErr = new CheckBoxTreeObject(options.getMsg("edit_act_copy_messages_err"), true)); root.add(node); // Reports node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_reports")); node.add(repInclude = new CheckBoxTreeObject(options.getMsg("edit_act_copy_rep_include"), false)); node.add(repActions = new CheckBoxTreeObject(options.getMsg("edit_act_copy_rep_actions"), false)); root.add(node); // Interface node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_interface")); node.add(skin = new CheckBoxTreeObject(options.getMsg("edit_act_copy_skin"), false)); node.add(evSounds = new CheckBoxTreeObject(options.getMsg("edit_act_copy_evSounds"), false)); root.add(node); // Counters node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_counters")); node.add(cTime = new CheckBoxTreeObject(options.getMsg("edit_act_copy_cTime"), true)); node.add(maxTime = new CheckBoxTreeObject(options.getMsg("edit_act_copy_maxTime"), false)); node.add(cTries = new CheckBoxTreeObject(options.getMsg("edit_act_copy_cTries"), true)); node.add(maxTries = new CheckBoxTreeObject(options.getMsg("edit_act_copy_maxTries"), false)); node.add(cScore = new CheckBoxTreeObject(options.getMsg("edit_act_copy_cScore"), true)); node.add(scramble = new CheckBoxTreeObject(options.getMsg("edit_act_copy_scramble"), false)); root.add(node); // Buttons node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_buttons")); node.add(helpBtn = new CheckBoxTreeObject(options.getMsg("edit_act_copy_btnHelp"), false)); node.add(infoBtn = new CheckBoxTreeObject(options.getMsg("edit_act_copy_btnInfo"), false)); root.add(node); // Grids node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_grids")); node.add(gridA = new CheckBoxTreeObject(options.getMsg("edit_act_copy_gridA"), true)); node.add(gridB = new CheckBoxTreeObject(options.getMsg("edit_act_copy_gridB"), true)); node.add(textGrid = new CheckBoxTreeObject(options.getMsg("edit_act_copy_textGrid"), true)); root.add(node); // Text node = new DefaultMutableTreeNode(options.getMsg("edit_act_copy_text")); node.add(textFontFace = new CheckBoxTreeObject(options.getMsg("edit_act_copy_fontFace"), true)); node.add(textFontSize = new CheckBoxTreeObject(options.getMsg("edit_act_copy_fontSize"), true)); node.add(textStyle = new CheckBoxTreeObject(options.getMsg("edit_act_copy_fontStyle"), true)); node.add(textColour = new CheckBoxTreeObject(options.getMsg("edit_act_copy_textColour"), true)); node.add(targetColour = new CheckBoxTreeObject(options.getMsg("edit_act_copy_textTargetColour"), true)); node.add(errorColour = new CheckBoxTreeObject(options.getMsg("edit_act_copy_textErrorColour"), true)); node.add(tabSpace = new CheckBoxTreeObject(options.getMsg("edit_act_copy_tabSpace"), false)); root.add(node); return new DefaultTreeModel(root); } private void copyAttributes(Activity srcAct, Activity targetAct) { // Main window if (bgColor.isSelected()) targetAct.bgColor = srcAct.bgColor; if (bgGradient.isSelected()) targetAct.bgGradient = srcAct.bgGradient; if (bgImage.isSelected()) { targetAct.bgImageFile = srcAct.bgImageFile; targetAct.tiledBgImg = srcAct.tiledBgImg; } if (margin.isSelected()) targetAct.margin = srcAct.margin; // Play window if (activityBgColor.isSelected()) targetAct.activityBgColor = srcAct.activityBgColor; if (activityBgGradient.isSelected()) targetAct.activityBgGradient = srcAct.activityBgGradient; if (transparentBg.isSelected()) targetAct.transparentBg = srcAct.transparentBg; if (border.isSelected()) targetAct.border = srcAct.border; if (position.isSelected()) { targetAct.absolutePositioned = srcAct.absolutePositioned; targetAct.absolutePosition = srcAct.absolutePosition; } // messages if (msgPrev.isSelected() && srcAct.messages[Activity.PREVIOUS] != null && targetAct.messages[Activity.PREVIOUS] != null) srcAct.messages[Activity.PREVIOUS].copyStyleTo(targetAct.messages[Activity.PREVIOUS]); if (msgIni.isSelected() && srcAct.messages[Activity.MAIN] != null && targetAct.messages[Activity.MAIN] != null) srcAct.messages[Activity.MAIN].copyStyleTo(targetAct.messages[Activity.MAIN]); if (msgEnd.isSelected() && srcAct.messages[Activity.END] != null && targetAct.messages[Activity.END] != null) srcAct.messages[Activity.END].copyStyleTo(targetAct.messages[Activity.END]); if (msgErr.isSelected() && srcAct.messages[Activity.END_ERROR] != null && targetAct.messages[Activity.END_ERROR] != null) srcAct.messages[Activity.END_ERROR].copyStyleTo(targetAct.messages[Activity.END_ERROR]); // reports if (repInclude.isSelected()) targetAct.includeInReports = srcAct.includeInReports; if (repActions.isSelected()) targetAct.reportActions = srcAct.reportActions; // interface if (skin.isSelected()) targetAct.skinFileName = srcAct.skinFileName; if (evSounds.isSelected()) targetAct.eventSounds = srcAct.eventSounds; // counters if (cTime.isSelected()) targetAct.bTimeCounter = srcAct.bTimeCounter; if (maxTime.isSelected()) { targetAct.maxTime = srcAct.maxTime; targetAct.countDownTime = srcAct.countDownTime; } if (cTries.isSelected()) targetAct.bActionsCounter = srcAct.bActionsCounter; if (maxTries.isSelected()) { targetAct.maxActions = srcAct.maxActions; targetAct.countDownActions = srcAct.countDownActions; } if (cScore.isSelected()) targetAct.bScoreCounter = srcAct.bScoreCounter; if (scramble.isSelected()) targetAct.shuffles = srcAct.shuffles; // Buttons if (helpBtn.isSelected()) { targetAct.helpWindow = srcAct.helpWindow; targetAct.showSolution = srcAct.showSolution; } if (infoBtn.isSelected()) { targetAct.infoUrl = srcAct.infoUrl; targetAct.infoCmd = srcAct.infoCmd; } // Grids if (gridA.isSelected() && srcAct.abc != null && srcAct.abc.length > 0 && srcAct.abc[0] != null && targetAct.abc != null && targetAct.abc.length > 0 && targetAct.abc[0] != null) srcAct.abc[0].copyStyleTo(targetAct.abc[0]); if (gridB.isSelected() && srcAct.abc != null && srcAct.abc.length > 1 && srcAct.abc[1] != null && targetAct.abc != null && targetAct.abc.length > 1 && targetAct.abc[1] != null) srcAct.abc[1].copyStyleTo(targetAct.abc[1]); if (textGrid.isSelected() && srcAct.tgc != null && targetAct.tgc != null) srcAct.tgc.copyStyleTo(targetAct.tgc); if (srcAct instanceof TextActivityBase && targetAct instanceof TextActivityBase) { TextActivityBase txSrcAct = (TextActivityBase) srcAct; TextActivityBase txTargetAct = (TextActivityBase) targetAct; if (textFontFace.isSelected() || textFontSize.isSelected() || textStyle.isSelected() || textColour.isSelected() || targetColour.isSelected() || errorColour.isSelected() || tabSpace.isSelected()) { StyleContext sc = TextActivityDocument.copyStylesFrom(txSrcAct.getStyleContext(), txTargetAct.getStyleContext(), textFontFace.isSelected(), textFontSize.isSelected(), textStyle.isSelected(), textColour.isSelected(), targetColour.isSelected(), errorColour.isSelected()); if (sc != null) { txTargetAct.setStyleContext(sc); } if (tabSpace.isSelected()) txTargetAct.getDocument().setTabSpc(txSrcAct.getDocument().getTabSpc()); } } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JList actList; private edu.xtec.jclic.beans.CheckBoxTree checkBoxTree; private javax.swing.JButton selectAllBtn; private javax.swing.JButton selectNoneBtn; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/TestPlayerContainer.java000066400000000000000000000021051335566474600225760ustar00rootroot00000000000000/* * File : TestPlayerContainer.java * Created : 20-jan-2004 16:14 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public interface TestPlayerContainer { public Player getTestPlayer(); public void test(); public void editActivity(String activityName); } src/author/edu/xtec/jclic/activities/000077500000000000000000000000001335566474600201425ustar00rootroot00000000000000src/author/edu/xtec/jclic/activities/associations/000077500000000000000000000000001335566474600226415ustar00rootroot00000000000000src/author/edu/xtec/jclic/activities/associations/ComplexAssociationEditor.java000066400000000000000000000025341335566474600304630ustar00rootroot00000000000000/* * File : ComplexAssociationEditor.java * Created : 10-oct-2002 15:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.associations; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ComplexAssociationEditor extends SimpleAssociationEditor { /** Creates a new instance of ComplexAssociationEditor */ public ComplexAssociationEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.DOUBLE_REL_ALT, null, null); } } src/author/edu/xtec/jclic/activities/associations/SimpleAssociationEditor.java000066400000000000000000000025611335566474600303050ustar00rootroot00000000000000/* * File : SimpleAssociationEditor.java * Created : 10-oct-2002 15:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.associations; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class SimpleAssociationEditor extends ActivityEditor { /** Creates a new instance of SimpleAssociationEditor */ public SimpleAssociationEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.DOUBLE_ALT, null, null); } } src/author/edu/xtec/jclic/activities/memory/000077500000000000000000000000001335566474600214525ustar00rootroot00000000000000src/author/edu/xtec/jclic/activities/memory/MemoryGameEditor.java000066400000000000000000000025161335566474600255320ustar00rootroot00000000000000/* * File : MemoryGameEditor.java * Created : 10-oct-2002 14:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.memory; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class MemoryGameEditor extends ActivityEditor { /** Creates a new instance of ExchangePuzzleEditor */ public MemoryGameEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.SINGLE_ALT, null, null); } } src/author/edu/xtec/jclic/activities/panels/000077500000000000000000000000001335566474600214245ustar00rootroot00000000000000src/author/edu/xtec/jclic/activities/panels/ExploreEditor.java000066400000000000000000000025211335566474600250540ustar00rootroot00000000000000/* * File : ExchangePuzzleEditor.java * Created : 10-oct-2002 14:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ExploreEditor extends ActivityEditor { /** Creates a new instance of ExchangePuzzleEditor */ public ExploreEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.DOUBLE_REL, null, null); } } src/author/edu/xtec/jclic/activities/panels/IdentifyEditor.java000066400000000000000000000026561335566474600252220ustar00rootroot00000000000000/* * File : IdentifyEditor.java * Created : 10-oct-2002 14:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class IdentifyEditor extends ActivityEditor { /** Creates a new instance of ExchangePuzzleEditor */ public IdentifyEditor(Activity act) { super(act); if (act instanceof Identify && act.abc[0] != null) act.abc[0].defaultIdValue = 0; } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.SINGLE_BOOL_ALT, null, null); } } src/author/edu/xtec/jclic/activities/panels/InformationScreenEditor.java000066400000000000000000000025371335566474600270720ustar00rootroot00000000000000/* * File : InformationScreenEditor.java * Created : 10-oct-2002 14:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class InformationScreenEditor extends ActivityEditor { /** Creates a new instance of ExchangePuzzleEditor */ public InformationScreenEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.SINGLE, null, null); } } src/author/edu/xtec/jclic/activities/puzzles/000077500000000000000000000000001335566474600216565ustar00rootroot00000000000000src/author/edu/xtec/jclic/activities/puzzles/DoublePuzzleEditor.java000066400000000000000000000025351335566474600263210ustar00rootroot00000000000000/* * File : DoublePuzzleEditor.java * Created : 10-oct-2002 14:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.puzzles; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class DoublePuzzleEditor extends ActivityEditor { /** Creates a new instance of ExchangePuzzleEditor */ public DoublePuzzleEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.SINGLE_LAYOUT, null, null); } } src/author/edu/xtec/jclic/activities/puzzles/ExchangePuzzleEditor.java000066400000000000000000000025341335566474600266300ustar00rootroot00000000000000/* * File : ExchangePuzzleEditor.java * Created : 10-oct-2002 14:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.puzzles; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ExchangePuzzleEditor extends ActivityEditor { /** Creates a new instance of ExchangePuzzleEditor */ public ExchangePuzzleEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.SINGLE, null, null); } } src/author/edu/xtec/jclic/activities/puzzles/HolePuzzleEditor.java000066400000000000000000000025271335566474600257770ustar00rootroot00000000000000/* * File : HolePuzzleEditor.java * Created : 10-oct-2002 14:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.puzzles; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class HolePuzzleEditor extends ActivityEditor { /** Creates a new instance of ExchangePuzzleEditor */ public HolePuzzleEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.SINGLE_LAYOUT, null, null); } } src/author/edu/xtec/jclic/activities/text/000077500000000000000000000000001335566474600211265ustar00rootroot00000000000000src/author/edu/xtec/jclic/activities/text/BasicEvaluatorPanel.form000066400000000000000000000117201335566474600257000ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/BasicEvaluatorPanel.java000066400000000000000000000101101335566474600256460ustar00rootroot00000000000000/* * File : BasicEvaluatorPanel.java * Created : 25-jun-2003 12:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class BasicEvaluatorPanel extends javax.swing.JPanel { Options options; /** Creates new form BasicEvaluatorPanel */ public BasicEvaluatorPanel(Options options) { this.options = options; initComponents(); } public void setEvaluator(BasicEvaluator ev) { caseChk.setSelected(ev.checkCase); accentsChk.setSelected(ev.checkAccents); punctChk.setSelected(ev.checkPunctuation); doubleSpcChk.setSelected(ev.checkDoubleSpaces); } public void collectData(BasicEvaluator ev) { ev.checkCase = caseChk.isSelected(); ev.checkAccents = accentsChk.isSelected(); ev.checkPunctuation = punctChk.isSelected(); ev.checkDoubleSpaces = doubleSpcChk.isSelected(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; caseChk = new javax.swing.JCheckBox(); accentsChk = new javax.swing.JCheckBox(); punctChk = new javax.swing.JCheckBox(); doubleSpcChk = new javax.swing.JCheckBox(); setLayout(new java.awt.GridBagLayout()); setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_text_act_checkOptions"))); caseChk.setText(options.getMsg("edit_text_act_checkCase")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; add(caseChk, gridBagConstraints); accentsChk.setText(options.getMsg("edit_text_act_checkAccents")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(accentsChk, gridBagConstraints); punctChk.setText(options.getMsg("edit_text_act_checkPunct")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(punctChk, gridBagConstraints); doubleSpcChk.setText(options.getMsg("edit_text_act_checkDoubleSpc")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(doubleSpcChk, gridBagConstraints); } // GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox punctChk; private javax.swing.JCheckBox caseChk; private javax.swing.JCheckBox doubleSpcChk; private javax.swing.JCheckBox accentsChk; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/activities/text/CheckOptionsPanel.form000066400000000000000000000114101335566474600253610ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/CheckOptionsPanel.java000066400000000000000000000106151335566474600253450ustar00rootroot00000000000000/* * File : TextOptionsPanel.java * Created : 25-jun-2003 17:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class CheckOptionsPanel extends javax.swing.JPanel { Options options; /** Creates new form TextOptionsPanel */ public CheckOptionsPanel(Options options) { this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel checkButtonTextLb; btnPanel = new javax.swing.JPanel(); checkButtonChk = new javax.swing.JCheckBox(); checkButtonTextLb = new javax.swing.JLabel(); checkButtonTxt = new javax.swing.JTextField(); setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS)); btnPanel.setLayout(new java.awt.GridBagLayout()); btnPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_text_act_checkButton"))); checkButtonChk.setText(options.getMsg("edit_text_act_checkButton_show")); checkButtonChk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { checkButtonChkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); btnPanel.add(checkButtonChk, gridBagConstraints); checkButtonTextLb.setText(options.getMsg("edit_text_act_checkButtonText")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); btnPanel.add(checkButtonTextLb, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); btnPanel.add(checkButtonTxt, gridBagConstraints); add(btnPanel); } // GEN-END:initComponents private void checkButtonChkActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_checkButtonChkActionPerformed checkButtonTxt.setEnabled(checkButtonChk.isSelected()); } // GEN-LAST:event_checkButtonChkActionPerformed public void setOptions(TextActivityBase tab) { checkButtonChk.setSelected(tab.hasCheckButton); String s = tab.checkButtonText; if (s == null || s.length() < 1) s = options.getMsg("edit_text_act_defaultCheckButtonText"); checkButtonTxt.setText(s); checkButtonTxt.setEnabled(checkButtonChk.isSelected()); } public void collectData(TextActivityBase tab) { tab.hasCheckButton = checkButtonChk.isSelected(); String s = checkButtonTxt.getText(); if (s == null || s.length() < 1) s = options.getMsg("edit_text_act_defaultCheckButtonText"); tab.checkButtonText = s; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel btnPanel; private javax.swing.JCheckBox checkButtonChk; private javax.swing.JTextField checkButtonTxt; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/activities/text/CompleteCheckPanel.form000066400000000000000000000072031335566474600255030ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/CompleteCheckPanel.java000066400000000000000000000073531335566474600254670ustar00rootroot00000000000000/* * File : FillInBlanksOptionsPanel.java * Created : 25-jun-2003 17:48 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class CompleteCheckPanel extends javax.swing.JPanel { Options options; BasicEvaluatorPanel basicPanel; ComplexEvaluatorPanel complexPanel; CheckOptionsPanel optionsPanel; /** Creates new form FillInBlanksOptionsPanel */ public CompleteCheckPanel(Options options) { this.options = options; initComponents(); optionsPanel = (CheckOptionsPanel) m_optionsPanel; basicPanel = (BasicEvaluatorPanel) m_basicPanel; complexPanel = (ComplexEvaluatorPanel) m_complexPanel; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; m_optionsPanel = new CheckOptionsPanel(options); m_basicPanel = new BasicEvaluatorPanel(options); m_complexPanel = new ComplexEvaluatorPanel(options); setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; add(m_optionsPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(m_basicPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(m_complexPanel, gridBagConstraints); } // GEN-END:initComponents public void setOptions(Complete comp) { optionsPanel.setOptions(comp); if (comp.ev instanceof BasicEvaluator) basicPanel.setEvaluator((BasicEvaluator) comp.ev); if (comp.ev instanceof ComplexEvaluator) complexPanel.setEvaluator((ComplexEvaluator) comp.ev); } public void collectData(Complete comp) { optionsPanel.collectData(comp); if (comp.ev instanceof BasicEvaluator) basicPanel.collectData((BasicEvaluator) comp.ev); if (comp.ev instanceof ComplexEvaluator) complexPanel.collectData((ComplexEvaluator) comp.ev); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel m_basicPanel; private javax.swing.JPanel m_complexPanel; private javax.swing.JPanel m_optionsPanel; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/activities/text/CompleteEditor.java000066400000000000000000000035361335566474600247170ustar00rootroot00000000000000/* * File : CompleteEditor.java * Created : 10-oct-2002 15:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; import java.awt.Component; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class CompleteEditor extends TextActivityBaseEditor { /** Creates a new instance of SimpleAssociationEditor */ public CompleteEditor(Complete act) { super(act); } protected static Map panelMap = new HashMap(1); @Override protected void editCheckOptions(Options options, Component parent) { Complete cmp = (Complete) getTextActivity(); if (cmp != null) { CompleteCheckPanel checkPanel = panelMap.get(options); if (checkPanel == null) { checkPanel = new CompleteCheckPanel(options); panelMap.put(options, checkPanel); } checkPanel.setOptions(cmp); if (options.getMessages().showInputDlg(parent, checkPanel, "edit_text_act_check_title")) { checkPanel.collectData(cmp); setModified(true); } } } } src/author/edu/xtec/jclic/activities/text/ComplexEvaluatorPanel.form000066400000000000000000000163671335566474600263020ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/ComplexEvaluatorPanel.java000066400000000000000000000124731335566474600262520ustar00rootroot00000000000000/* * File : ComplexEvaluatorPanel.java * Created : 25-jun-2003 13:07 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class ComplexEvaluatorPanel extends javax.swing.JPanel { Options options; /** Creates new form ComplexEvaluatorPanel */ public ComplexEvaluatorPanel(Options options) { this.options = options; initComponents(); } public void setEvaluator(ComplexEvaluator ev) { detailChk.setSelected(ev.detail); detailSteps.setValue(ev.checkSteps); detailField.setValue(ev.checkScope); checkEnabled(); } public void collectData(ComplexEvaluator ev) { ev.detail = detailChk.isSelected(); ev.checkSteps = detailSteps.getValue(); ev.checkScope = detailField.getValue(); } protected void checkEnabled() { detailSteps.setEnabled(detailChk.isSelected()); detailField.setEnabled(detailChk.isSelected()); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel detailLb; javax.swing.JLabel detailStepsLb; javax.swing.JLabel detailFieldLb; java.awt.GridBagConstraints gridBagConstraints; detailChk = new javax.swing.JCheckBox(); detailLb = new javax.swing.JLabel(); detailStepsLb = new javax.swing.JLabel(); detailSteps = new edu.xtec.jclic.beans.SmallIntEditor(); detailFieldLb = new javax.swing.JLabel(); detailField = new edu.xtec.jclic.beans.SmallIntEditor(); setLayout(new java.awt.GridBagLayout()); setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_text_act_advancedCorrectionOptions"))); detailChk.setText(options.getMsg("edit_text_act_checkDetail")); detailChk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { detailChkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(detailChk, gridBagConstraints); detailLb.setText(options.getMsg("edit_text_act_checkDetail_params")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(detailLb, gridBagConstraints); detailStepsLb.setText(options.getMsg("edit_text_act_checkDetail_steps")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(detailStepsLb, gridBagConstraints); detailSteps.setMax(99); detailSteps.setMin(1); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; add(detailSteps, gridBagConstraints); detailFieldLb.setText(options.getMsg("edit_text_act_checkDetail_field")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(detailFieldLb, gridBagConstraints); detailField.setMax(99); detailField.setMin(1); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(detailField, gridBagConstraints); } // GEN-END:initComponents private void detailChkActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_detailChkActionPerformed checkEnabled(); } // GEN-LAST:event_detailChkActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private edu.xtec.jclic.beans.SmallIntEditor detailField; private javax.swing.JCheckBox detailChk; private edu.xtec.jclic.beans.SmallIntEditor detailSteps; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/activities/text/FillInBlanksCheckPanel.form000066400000000000000000000147741335566474600262560ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/FillInBlanksCheckPanel.java000066400000000000000000000131421335566474600262200ustar00rootroot00000000000000/* * File : FillInBlanksOptionsPanel.java * Created : 25-jun-2003 17:48 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class FillInBlanksCheckPanel extends javax.swing.JPanel { Options options; BasicEvaluatorPanel basicPanel; ComplexEvaluatorPanel complexPanel; CheckOptionsPanel optionsPanel; /** Creates new form FillInBlanksOptionsPanel */ public FillInBlanksCheckPanel(Options options) { this.options = options; initComponents(); optionsPanel = (CheckOptionsPanel) m_optionsPanel; basicPanel = (BasicEvaluatorPanel) m_basicPanel; complexPanel = (ComplexEvaluatorPanel) m_complexPanel; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; m_optionsPanel = new CheckOptionsPanel(options); m_basicPanel = new BasicEvaluatorPanel(options); progressPanel = new javax.swing.JPanel(); autoJumpChk = new javax.swing.JCheckBox(); forceOkChk = new javax.swing.JCheckBox(); m_complexPanel = new ComplexEvaluatorPanel(options); setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; add(m_optionsPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(m_basicPanel, gridBagConstraints); progressPanel.setLayout(new java.awt.GridBagLayout()); progressPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_text_act_checkProgress"))); autoJumpChk.setText(options.getMsg("edit_text_act_checkAutoJump")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); progressPanel.add(autoJumpChk, gridBagConstraints); forceOkChk.setText(options.getMsg("edit_text_act_checkForceOk")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); progressPanel.add(forceOkChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(progressPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(m_complexPanel, gridBagConstraints); } // GEN-END:initComponents public void setOptions(FillInBlanks fib) { autoJumpChk.setSelected(fib.autoJump); forceOkChk.setSelected(fib.forceOkToAdvance); optionsPanel.setOptions(fib); if (fib.ev instanceof BasicEvaluator) basicPanel.setEvaluator((BasicEvaluator) fib.ev); if (fib.ev instanceof ComplexEvaluator) complexPanel.setEvaluator((ComplexEvaluator) fib.ev); } public void collectData(FillInBlanks fib) { fib.autoJump = autoJumpChk.isSelected(); fib.forceOkToAdvance = forceOkChk.isSelected(); optionsPanel.collectData(fib); if (fib.ev instanceof BasicEvaluator) basicPanel.collectData((BasicEvaluator) fib.ev); if (fib.ev instanceof ComplexEvaluator) complexPanel.collectData((ComplexEvaluator) fib.ev); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel m_basicPanel; private javax.swing.JCheckBox autoJumpChk; private javax.swing.JCheckBox forceOkChk; private javax.swing.JPanel m_complexPanel; private javax.swing.JPanel m_optionsPanel; private javax.swing.JPanel progressPanel; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/activities/text/FillInBlanksEditor.java000066400000000000000000000054611335566474600254560ustar00rootroot00000000000000/* * File : FillInBlanksEditor.java * Created : 10-oct-2002 15:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Component; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class FillInBlanksEditor extends TextActivityBaseEditor { /** Creates a new instance of FillInBlanksEditor */ public FillInBlanksEditor(FillInBlanks act) { super(act); } @Override protected TargetMarker createNewTarget(int ifrom, int ito, Options options, Component parent) { TargetMarker tm = super.createNewTarget(ifrom, ito, options, parent); if (tm != null) { tm.target = new TextTarget(getTextActivity().tad, from, to); if (options != null && parent != null && !editTarget(from, options, parent)) { deleteTarget(tm, null, null); } } return tm; } @Override protected boolean deleteTarget(TargetMarker tm, Options options, Component parent) { int d = 0; if (options != null) d = options.getMessages().showQuestionDlg(parent, "edit_text_act_warnDeleteTarget", null, "yn"); return d == Messages.YES ? super.deleteTarget(tm, options, parent) : false; } @Override protected boolean canEditTarget() { return true; } protected static Map panelMap = new HashMap(1); @Override protected void editCheckOptions(Options options, Component parent) { FillInBlanks fib = (FillInBlanks) getTextActivity(); if (fib != null) { FillInBlanksCheckPanel checkPanel = panelMap.get(options); if (checkPanel == null) { checkPanel = new FillInBlanksCheckPanel(options); panelMap.put(options, checkPanel); } checkPanel.setOptions(fib); if (options.getMessages().showInputDlg(parent, checkPanel, "edit_text_act_check_title")) { checkPanel.collectData(fib); setModified(true); } } } } src/author/edu/xtec/jclic/activities/text/IdentifyEditor.java000066400000000000000000000054261335566474600247220ustar00rootroot00000000000000/* * File : IdentifyEditor.java * Created : 10-oct-2002 15:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Component; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class IdentifyEditor extends TextActivityBaseEditor { /** Creates a new instance of IdentifyEditor */ public IdentifyEditor(Identify act) { super(act); } protected static Map panelMap = new HashMap(1); @Override protected void editCheckOptions(Options options, Component parent) { Identify ident = (Identify) getTextActivity(); if (ident != null) { CheckOptionsPanel checkPanel = panelMap.get(options); if (checkPanel == null) { checkPanel = new CheckOptionsPanel(options); panelMap.put(options, checkPanel); } checkPanel.setOptions(ident); if (options.getMessages().showInputDlg(parent, checkPanel, "edit_text_act_check_title")) { checkPanel.collectData(ident); setModified(true); } } } @Override protected boolean hasType() { return true; } @Override protected boolean editType(Options options, Component parent) { Identify ident = (Identify) getActivity(); int t = ident.type; boolean result = IdentifyTypePanel.editIdentify(ident, options, parent); if (result) { if (ident.type != t && ident.tad.tmb.size() > 0) { if (options.getMessages().showQuestionDlg(parent, "edit_text_act_warnChangeType", null, "yn") == Messages.YES) { ident.tad.clearAllTargets(); } else { result = false; ident.type = t; } } } if (result) { ident.tad.targetType = (ident.type == Identify.IDENTIFY_WORDS) ? TextActivityDocument.TT_WORD : TextActivityDocument.TT_CHAR; setModified(true); } return result; } } src/author/edu/xtec/jclic/activities/text/IdentifyTypePanel.form000066400000000000000000000050641335566474600254150ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/IdentifyTypePanel.java000066400000000000000000000057121335566474600253730ustar00rootroot00000000000000/* * File : OrderTypePanel.java * Created : 26-jun-2003 16:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; import java.awt.Component; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class IdentifyTypePanel extends javax.swing.JPanel { Options options; protected static final Map panels = new HashMap(1); /** Creates new form OrderTypePanel */ public IdentifyTypePanel(Options options) { this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents bGroup = new javax.swing.ButtonGroup(); identWordsBtn = new javax.swing.JRadioButton(); identCharsBtn = new javax.swing.JRadioButton(); setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS)); identWordsBtn.setText(options.getMsg("edit_text_act_identWords")); bGroup.add(identWordsBtn); add(identWordsBtn); identCharsBtn.setText(options.getMsg("edit_text_act_identChars")); bGroup.add(identCharsBtn); add(identCharsBtn); } // GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JRadioButton identWordsBtn; private javax.swing.ButtonGroup bGroup; private javax.swing.JRadioButton identCharsBtn; // End of variables declaration//GEN-END:variables public static boolean editIdentify(Identify ident, Options options, Component parent) { IdentifyTypePanel idp = panels.get(options); if (idp == null) { idp = new IdentifyTypePanel(options); panels.put(options, idp); } boolean p = (ident.type == Identify.IDENTIFY_WORDS); idp.identCharsBtn.setSelected(!p); idp.identWordsBtn.setSelected(p); boolean result = options.getMessages().showInputDlg(parent, idp, "edit_text_act_type_title"); if (result) ident.type = idp.identWordsBtn.isSelected() ? Identify.IDENTIFY_WORDS : Identify.IDENTIFY_CHARS; return result; } } src/author/edu/xtec/jclic/activities/text/OrderCheckPanel.form000066400000000000000000000055341335566474600250130ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/OrderCheckPanel.java000066400000000000000000000060131335566474600247620ustar00rootroot00000000000000/* * File : FillInBlanksOptionPanel.java * Created : 25-jun-2003 17:48 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class OrderCheckPanel extends javax.swing.JPanel { Options options; BasicEvaluatorPanel basicPanel; CheckOptionsPanel optionsPanel; /** Creates new form FillInBlanksOptionsPanel */ public OrderCheckPanel(Options options) { this.options = options; initComponents(); optionsPanel = (CheckOptionsPanel) m_optionsPanel; basicPanel = (BasicEvaluatorPanel) m_basicPanel; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; m_optionsPanel = new CheckOptionsPanel(options); m_basicPanel = new BasicEvaluatorPanel(options); setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; add(m_optionsPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(m_basicPanel, gridBagConstraints); } // GEN-END:initComponents public void setOptions(Order ord) { optionsPanel.setOptions(ord); if (ord.ev instanceof BasicEvaluator) basicPanel.setEvaluator((BasicEvaluator) ord.ev); } public void collectData(Order ord) { optionsPanel.collectData(ord); if (ord.ev instanceof BasicEvaluator) basicPanel.collectData((BasicEvaluator) ord.ev); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel m_basicPanel; private javax.swing.JPanel m_optionsPanel; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/activities/text/OrderEditor.java000066400000000000000000000054161335566474600242210ustar00rootroot00000000000000/* * File : OrderEditor.java * Created : 10-oct-2002 15:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Component; import java.util.HashMap; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class OrderEditor extends TextActivityBaseEditor { /** Creates a new instance of OrderEditor */ public OrderEditor(Order act) { super(act); } protected static HashMap panelMap = new HashMap(1); @Override protected void editCheckOptions(Options options, Component parent) { Order ord = (Order) getTextActivity(); if (ord != null) { OrderCheckPanel checkPanel = panelMap.get(options); if (checkPanel == null) { checkPanel = new OrderCheckPanel(options); panelMap.put(options, checkPanel); } checkPanel.setOptions(ord); if (options.getMessages().showInputDlg(parent, checkPanel, "edit_text_act_check_title")) { checkPanel.collectData(ord); setModified(true); } } } @Override protected boolean hasType() { return true; } @Override protected boolean editType(Options options, Component parent) { Order ord = (Order) getActivity(); int t = ord.type; boolean b = ord.amongParagraphs; boolean result = OrderTypePanel.editOrder(ord, options, parent); if (result) { if (ord.type != t && ord.tad.tmb.size() > 0) { if (options.getMessages().showQuestionDlg(parent, "edit_text_act_warnChangeType", null, "yn") == Messages.YES) { ord.tad.clearAllTargets(); } else { result = false; ord.type = t; ord.amongParagraphs = b; } } } if (result) { ord.tad.targetType = (ord.type == Order.ORDER_PARAGRAPHS) ? TextActivityDocument.TT_PARAGRAPH : TextActivityDocument.TT_WORD; setModified(true); } return result; } } src/author/edu/xtec/jclic/activities/text/OrderTypePanel.form000066400000000000000000000065741335566474600247240ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/OrderTypePanel.java000066400000000000000000000103461335566474600246720ustar00rootroot00000000000000/* * File : OrderTypePanel.java * Created : 26-jun-2003 16:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.util.Options; import java.awt.Component; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class OrderTypePanel extends javax.swing.JPanel { Options options; protected static final Map panels = new HashMap(1); /** Creates new form OrderTypePanel */ public OrderTypePanel(Options options) { this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents bGroup = new javax.swing.ButtonGroup(); orderParagraphsBtn = new javax.swing.JRadioButton(); orderWordsBtn = new javax.swing.JRadioButton(); amongstParChk = new javax.swing.JCheckBox(); setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS)); orderParagraphsBtn.setText(options.getMsg("edit_text_act_orderParagraphs")); bGroup.add(orderParagraphsBtn); orderParagraphsBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { orderParagraphsBtnActionPerformed(evt); } }); add(orderParagraphsBtn); orderWordsBtn.setText(options.getMsg("edit_text_act_orderWords")); bGroup.add(orderWordsBtn); orderWordsBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { orderWordsBtnActionPerformed(evt); } }); add(orderWordsBtn); amongstParChk.setText(options.getMsg("edit_text_act_order_amongstPar")); amongstParChk.setEnabled(false); add(amongstParChk); } // GEN-END:initComponents private void orderParagraphsBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_orderParagraphsBtnActionPerformed amongstParChk.setEnabled(!orderParagraphsBtn.isSelected()); } // GEN-LAST:event_orderParagraphsBtnActionPerformed private void orderWordsBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_orderWordsBtnActionPerformed amongstParChk.setEnabled(orderWordsBtn.isSelected()); } // GEN-LAST:event_orderWordsBtnActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JRadioButton orderWordsBtn; private javax.swing.JCheckBox amongstParChk; private javax.swing.ButtonGroup bGroup; private javax.swing.JRadioButton orderParagraphsBtn; // End of variables declaration//GEN-END:variables public static boolean editOrder(Order ord, Options options, Component parent) { OrderTypePanel otp = panels.get(options); if (otp == null) { otp = new OrderTypePanel(options); panels.put(options, otp); } boolean p = (ord.type == Order.ORDER_PARAGRAPHS); otp.orderParagraphsBtn.setSelected(p); otp.orderWordsBtn.setSelected(!p); otp.amongstParChk.setSelected(ord.amongParagraphs); otp.amongstParChk.setEnabled(!p); boolean result = options.getMessages().showInputDlg(parent, otp, "edit_text_act_type_title"); if (result) { ord.type = otp.orderParagraphsBtn.isSelected() ? Order.ORDER_PARAGRAPHS : Order.ORDER_WORDS; ord.amongParagraphs = otp.amongstParChk.isSelected(); } return result; } } src/author/edu/xtec/jclic/activities/text/TextActivityBaseEditor.java000066400000000000000000000171251335566474600264020ustar00rootroot00000000000000/* * File : TextActivityBaseEditor.java * Created : 10-oct-2002 15:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; import edu.xtec.jclic.boxes.ActiveBagContentEditor; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.ActiveBoxContentEditor; import edu.xtec.jclic.boxes.JPanelActiveBox; import edu.xtec.util.Options; import java.awt.Component; import java.awt.Dimension; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.StyleConstants; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class TextActivityBaseEditor extends ActivityEditor { /** Creates a new instance of TextActivityBaseEditor */ public TextActivityBaseEditor(TextActivityBase act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.TEXT_BASE, null, null); } protected TextActivityBase getTextActivity() { return (TextActivityBase) getActivity(); } protected JPanelActiveBox createNewBox(int pos, Options options, Component parent) { JPanelActiveBox result = null; TextActivityBase tab = getTextActivity(); AttributeSet a = tab.tad.getCharacterElement(pos).getAttributes(); if (a.isDefined(TextActivityDocument.TARGET)) { options.getMessages().showAlert(parent, "edit_text_act_err_cellInTarget"); return null; } ActiveBoxContent ab = new ActiveBoxContent(); ab.setDimension(new Dimension(100, 40)); ab.setBoxBase(tab.tad.boxesContent.bb); ab = ActiveBoxContentEditor.getActiveBoxContent(ab, parent, options, getMediaBagEditor(), null); if (ab != null) { try { result = TextActivityDocument.insertBox(ab, pos, tab.tad, tab, null); } catch (Exception ex) { options.getMessages().showErrorWarning(parent, "ERROR", ex); } } return result; } protected int from, to; protected TargetMarker createNewTarget(int ifrom, int ito, Options options, Component parent) { TargetMarker tm = null; TextActivityBase tab = getTextActivity(); if (tab != null) { from = ifrom; to = ito; if (!checkTargetSegment(options, parent)) return null; tm = new TargetMarker(tab.tad); tm.begOffset = from; tm.endOffset = to; tm.setPositions(); tab.tad.tmb.add(tm); tab.tad.applyStyleToTarget(tm, TextActivityDocument.TARGET, false, true); } return tm; } private boolean checkTargetSegment(Options options, Component parent) { String errMsg = null; if (getTextActivity() == null) return false; TextActivityDocument tad = getTextActivity().tad; String text; try { text = tad.getText(0, tad.getLength()); } catch (Exception ex) { return false; } int len = text.length(); from = Math.min(Math.max(0, from), Math.max(0, len - 1)); to = Math.min(Math.max(from, to), len); switch (tad.getTargetType()) { case TextActivityDocument.TT_FREE: int fromBk = from; int toBk = to; while (from < len && Character.isWhitespace(text.charAt(from))) from++; while (to >= from && to > 0 && Character.isWhitespace(text.charAt(to - 1))) to--; if (from >= to) { from = fromBk; to = toBk; } break; case TextActivityDocument.TT_CHAR: while (from < len && Character.isWhitespace(text.charAt(from))) from++; to = Math.min(from + 1, len); break; case TextActivityDocument.TT_WORD: while (from >= 0 && !Character.isWhitespace(text.charAt(from))) from--; from++; to = from; while (to < len && !Character.isWhitespace(text.charAt(to))) to++; break; case TextActivityDocument.TT_PARAGRAPH: javax.swing.text.Element element = tad.getParagraphElement(from); if (element == null) to = from; else { from = Math.max(0, element.getStartOffset()); to = Math.max(0, Math.min(text.length() - 1, element.getEndOffset() - 1)); while (to > from && (text.charAt(to) == 0x0D || text.charAt(to) == 0x0A)) to--; to++; } break; default: break; } if (to == from) errMsg = "edit_text_act_err_noSelection"; else if (from > to) errMsg = "ERROR"; else { try { for (int i = from; i < to; i++) { char ch = tad.getText(i, 1).charAt(0); if (ch == 0x0D || ch == 0x0A || ch == 0x08) { errMsg = "edit_text_act_err_badCharInSelection"; break; } AttributeSet a = tad.getCharacterElement(i).getAttributes(); if (a.isDefined(TextActivityDocument.TARGET)) { errMsg = "edit_text_act_err_nestedTargets"; break; } if (a.getAttribute(StyleConstants.ComponentAttribute) != null) { errMsg = "edit_text_act_err_cellInTarget"; break; } } } catch (BadLocationException ex) { } } if (errMsg != null && options != null) options.getMessages().showAlert(parent, errMsg); return errMsg == null; } protected boolean deleteTarget(TargetMarker tm, Options options, Component parent) { TextActivityBase tab = getTextActivity(); if (tab != null) { tab.tad.tmb.remove(tm); tab.tad.applyStyleToTarget(tm, null, false, true); } return true; } protected boolean canEditTarget() { return false; } protected boolean editTarget(int pos, Options options, Component parent) { boolean result = false; TextActivityBase tab = getTextActivity(); if (canEditTarget() && pos >= 0 && pos < tab.tad.getLength()) { TargetMarker tm = tab.tad.tmb.getElementByOffset(pos, true); if (tm != null && tm.target != null) result = TextTargetEditorPanel.editTextTarget(tm.target, options, getMediaBagEditor(), parent); if (result) setModified(true); } return result; } protected void editCheckOptions(Options options, Component parent) { } protected boolean hasType() { return false; } protected boolean editType(Options options, Component parent) { return false; } public boolean nameChanged(int type, String oldName, String newName) { boolean result = super.nameChanged(type, oldName, newName); result |= ActiveBagContentEditor.nameChanged(getTextActivity().tad.boxesContent, type, oldName, newName); result |= ActiveBagContentEditor.nameChanged(getTextActivity().tad.popupsContent, type, oldName, newName); if (result) setModified(true); return result; } } src/author/edu/xtec/jclic/activities/text/TextActivityEditorTextPanel.form000066400000000000000000001261601335566474600274560ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/TextActivityEditorTextPanel.java000066400000000000000000000737641335566474600274470ustar00rootroot00000000000000/* * File : TextActivityEditorTextPanel.java * Created : 10-jun-2002 09:59 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.beans.ColorButton; import edu.xtec.jclic.beans.SmallIntEditor; import edu.xtec.jclic.boxes.*; import edu.xtec.util.FontCheck; import edu.xtec.util.Messages; import edu.xtec.util.Resizer; import edu.xtec.util.ResizerPanel; import edu.xtec.util.ResourceManager; import edu.xtec.util.SmallButtonBorder; import java.awt.*; import java.util.EventObject; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class TextActivityEditorTextPanel extends ActivityEditorInternalPanel implements Resizer.ResizerListener { // protected boolean loading; protected Resizer resizer; protected boolean skipUpdate; protected String fontName; protected int fontSize; protected boolean changeCombos = true; /** Creates new form MenuEditorPanel */ public TextActivityEditorTextPanel(ActivityEditorPanel parent) { super(parent); initComponents(); textScroll.setBorder(BorderFactory.createEmptyBorder()); textScroll.getVerticalScrollBar().setBorder(BorderFactory.createLineBorder(Color.darkGray, 1)); textPane.addCaretListener(caretListener); resizer = new Resizer(previewPanel, null, false, this); } CaretListener caretListener = new CaretListener() { public void caretUpdate(CaretEvent e) { showAttributes(e.getDot()); } }; /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; alignGrp = new javax.swing.ButtonGroup(); mainScroll = new javax.swing.JScrollPane(); previewPanel = new PreviewPanel(); textScroll = new javax.swing.JScrollPane(); textPane = new javax.swing.JTextPane(); javax.swing.JTabbedPane ctrlPanel = new javax.swing.JTabbedPane(); javax.swing.JPanel actPanel = new javax.swing.JPanel(); targetBtn = new javax.swing.JToggleButton(); editTargetBtn = new javax.swing.JButton(); insertBoxBtn = new javax.swing.JButton(); prevScreenBtn = new javax.swing.JButton(); optionsBtn = new javax.swing.JButton(); typeBtn = new javax.swing.JButton(); javax.swing.JLabel widthLb = new javax.swing.JLabel(); widthEdit = new edu.xtec.jclic.beans.SmallIntEditor(); javax.swing.JLabel heightLb = new javax.swing.JLabel(); heightEdit = new edu.xtec.jclic.beans.SmallIntEditor(); javax.swing.JPanel stylePanel = new javax.swing.JPanel(); styleBtn = new javax.swing.JButton(); clearStylesBtn = new javax.swing.JButton(); fontFaceCombo = new JComboBox(FontCheck.getFontList(false)); fontSizeCombo = new JComboBox(FontCheck.fontSizes); boldBtn = new javax.swing.JToggleButton(); italicBtn = new javax.swing.JToggleButton(); underlineBtn = new javax.swing.JToggleButton(); alLeftBtn = new javax.swing.JToggleButton(); alCenterBtn = new javax.swing.JToggleButton(); alRightBtn = new javax.swing.JToggleButton(); javax.swing.JLabel textColorLb = new javax.swing.JLabel(); textColorBtn = new edu.xtec.jclic.beans.ColorButton(); textColorBtn.setOptions(options); javax.swing.JLabel bgColorLb = new javax.swing.JLabel(); bgColorBtn = new edu.xtec.jclic.beans.ColorButton(); bgColorBtn.setOptions(options); setLayout(new java.awt.BorderLayout()); previewPanel.setPreferredSize(new java.awt.Dimension(780, 580)); textPane.setPreferredSize(new java.awt.Dimension(Activity.DEFAULT_WIDTH, Activity.DEFAULT_HEIGHT)); textScroll.setViewportView(textPane); previewPanel.add(textScroll); mainScroll.setViewportView(previewPanel); add(mainScroll, java.awt.BorderLayout.CENTER); actPanel.setLayout(new java.awt.GridBagLayout()); targetBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/text_target.gif"))); // NOI18N targetBtn.setToolTipText(options.getMsg("edit_text_act_target_toggle")); targetBtn.setBorder(new SmallButtonBorder(targetBtn, true)); targetBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); actPanel.add(targetBtn, gridBagConstraints); editTargetBtn .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/text_target_edit.gif"))); // NOI18N editTargetBtn.setToolTipText(options.getMsg("edit_text_act_edit_target")); editTargetBtn.setBorder(new SmallButtonBorder(editTargetBtn, true)); editTargetBtn.setEnabled(false); editTargetBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); actPanel.add(editTargetBtn, gridBagConstraints); insertBoxBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/insert_box.gif"))); // NOI18N insertBoxBtn.setToolTipText(options.getMsg("edit_text_act_insertCell")); insertBoxBtn.setBorder(new SmallButtonBorder(prevScreenBtn, true)); insertBoxBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 8); actPanel.add(insertBoxBtn, gridBagConstraints); prevScreenBtn .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/prev_screen.gif"))); // NOI18N prevScreenBtn.setToolTipText(options.getMsg("edit_text_act_prevScreen_title")); prevScreenBtn.setBorder(new SmallButtonBorder(prevScreenBtn, true)); prevScreenBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 8); actPanel.add(prevScreenBtn, gridBagConstraints); optionsBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/check.gif"))); // NOI18N optionsBtn.setToolTipText(options.getMsg("edit_text_act_check_bt")); optionsBtn.setBorder(new SmallButtonBorder(optionsBtn, true)); optionsBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 8); actPanel.add(optionsBtn, gridBagConstraints); typeBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/type.gif"))); // NOI18N typeBtn.setToolTipText(options.getMsg("edit_text_act_typeBtn")); typeBtn.setBorder(new SmallButtonBorder(typeBtn, true)); typeBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 8); actPanel.add(typeBtn, gridBagConstraints); widthLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_width.gif"))); // NOI18N widthLb.setLabelFor(widthEdit); widthLb.setText(":"); widthLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); actPanel.add(widthLb, gridBagConstraints); widthEdit.setToolTipText(options.getMsg("edit_act_width_tooltip")); widthEdit.setMax(999); widthEdit.setMin(50); widthEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); actPanel.add(widthEdit, gridBagConstraints); heightLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_height.gif"))); // NOI18N heightLb.setLabelFor(heightEdit); heightLb.setText(":"); heightLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); actPanel.add(heightLb, gridBagConstraints); heightEdit.setToolTipText(options.getMsg("edit_act_height_tooltip")); heightEdit.setMax(999); heightEdit.setMin(50); heightEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); actPanel.add(heightEdit, gridBagConstraints); ctrlPanel.addTab(options.getMsg("edit_text_act_content"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/content.gif")), actPanel); // NOI18N stylePanel.setLayout(new java.awt.GridBagLayout()); styleBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/doc_styles.gif"))); // NOI18N styleBtn.setToolTipText(options.getMsg("edit_text_act_editStylesBtn")); styleBtn.setBorder(new SmallButtonBorder(styleBtn, true)); styleBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); stylePanel.add(styleBtn, gridBagConstraints); clearStylesBtn .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/doc_styles_clear.gif"))); // NOI18N clearStylesBtn.setToolTipText(options.getMsg("edit_text_act_clearStylesBtn")); clearStylesBtn.setBorder(new SmallButtonBorder(styleBtn, true)); clearStylesBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); stylePanel.add(clearStylesBtn, gridBagConstraints); fontFaceCombo.setEditable(true); fontFaceCombo.setPreferredSize(new java.awt.Dimension(120, fontFaceCombo.getPreferredSize().height)); fontFaceCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); stylePanel.add(fontFaceCombo, gridBagConstraints); fontSizeCombo.setEditable(true); fontSizeCombo.setPreferredSize(new java.awt.Dimension(50, fontSizeCombo.getPreferredSize().height)); fontSizeCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); stylePanel.add(fontSizeCombo, gridBagConstraints); boldBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_bold.gif"))); // NOI18N boldBtn.setToolTipText(options.getMsg("edit_font_bold")); boldBtn.setBorder(new SmallButtonBorder(boldBtn, true)); boldBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); stylePanel.add(boldBtn, gridBagConstraints); italicBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_italic.gif"))); // NOI18N italicBtn.setToolTipText(options.getMsg("edit_font_italic")); italicBtn.setBorder(new SmallButtonBorder(italicBtn, true)); italicBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); stylePanel.add(italicBtn, gridBagConstraints); underlineBtn .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_underline.gif"))); // NOI18N underlineBtn.setToolTipText(options.getMsg("edit_font_underline")); underlineBtn.setBorder(new SmallButtonBorder(underlineBtn, true)); underlineBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); stylePanel.add(underlineBtn, gridBagConstraints); alignGrp.add(alLeftBtn); alLeftBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/al_left.gif"))); // NOI18N alLeftBtn.setToolTipText(options.getMsg("edit_text_align_left")); alLeftBtn.setBorder(new SmallButtonBorder(alLeftBtn, true)); alLeftBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); stylePanel.add(alLeftBtn, gridBagConstraints); alignGrp.add(alCenterBtn); alCenterBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/al_center.gif"))); // NOI18N alCenterBtn.setToolTipText(options.getMsg("edit_text_align_center")); alCenterBtn.setBorder(new SmallButtonBorder(alCenterBtn, true)); alCenterBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); stylePanel.add(alCenterBtn, gridBagConstraints); alignGrp.add(alRightBtn); alRightBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/al_right.gif"))); // NOI18N alRightBtn.setToolTipText(options.getMsg("edit_text_align_right")); alRightBtn.setBorder(new SmallButtonBorder(alRightBtn, true)); alRightBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); stylePanel.add(alRightBtn, gridBagConstraints); textColorLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/fg.gif"))); // NOI18N textColorLb.setText(":"); textColorLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); stylePanel.add(textColorLb, gridBagConstraints); textColorBtn.setToolTipText(options.getMsg("edit_act_textColor_tooltip")); textColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 6); stylePanel.add(textColorBtn, gridBagConstraints); bgColorLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/bg.gif"))); // NOI18N bgColorLb.setText(":"); bgColorLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 6, 2, 2); stylePanel.add(bgColorLb, gridBagConstraints); bgColorBtn.setToolTipText(options.getMsg("edit_act_bgColor_tooltip")); bgColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); stylePanel.add(bgColorBtn, gridBagConstraints); ctrlPanel.addTab(options.getMsg("edit_text_act_style"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/styles.gif")), stylePanel); // NOI18N add(ctrlPanel, java.awt.BorderLayout.NORTH); } // //GEN-END:initComponents protected TextActivityBase getTextActivity() { return (TextActivityBase) getActivity(); } protected TextActivityBaseEditor getTextActivityEditor() { return (TextActivityBaseEditor) getActivityEditor(); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); textPane.setEnabled(enabled); widthEdit.setEnabled(enabled); heightEdit.setEnabled(enabled); fontFaceCombo.setEnabled(enabled); fontSizeCombo.setEnabled(enabled); boldBtn.setEnabled(enabled); italicBtn.setEnabled(enabled); underlineBtn.setEnabled(enabled); textColorBtn.setEnabled(enabled); bgColorBtn.setEnabled(enabled); targetBtn.setEnabled(enabled); alCenterBtn.setEnabled(enabled); alRightBtn.setEnabled(enabled); alLeftBtn.setEnabled(enabled); resizer.setEnabled(enabled); if (!enabled) { editTargetBtn.setEnabled(false); typeBtn.setEnabled(false); } } private static final Dimension DEFAULT_SIZE = new Dimension(TextActivityBase.DEFAULT_WIDTH, TextActivityBase.DEFAULT_HEIGHT); public void fillData() { TextActivityBaseEditor tabe = getTextActivityEditor(); TextActivityBase act = tabe == null ? null : tabe.getTextActivity(); typeBtn.setEnabled(tabe != null && tabe.hasType()); DefaultStyledDocument doc = act == null ? new DefaultStyledDocument() : act.tad; // Workaround for JRE 1.4+, part 1: Save a clean copy of the default style // attributes Style defaultStyle = doc.getStyle(StyleContext.DEFAULT_STYLE); AttributeSet as = defaultStyle.copyAttributes(); // textPane.setStyledDocument(doc); // // Workaround for JRE 1.4+, part 2: Restore lost attributes defaultStyle.addAttributes(as); doc.addDocumentListener(this); Dimension d = act == null ? DEFAULT_SIZE : act.getWindowSize(); if (act == null || act.tad.getLength() == 0) textPane.setBounds(0, 0, d.width, d.height); widthEdit.setValue(d.width); heightEdit.setValue(d.height); textPane.setBackground( act == null ? Color.white : StyleConstants.getBackground(textPane.getStyle(StyleContext.DEFAULT_STYLE))); textScroll.setBounds(0, 0, d.width, d.height); resizer.setRect(textScroll.getBounds()); resizer.setEnabled(act != null); if (act != null) { JPanelActiveBox[] boxes = act.tad.getPanelBoxes(); for (int i = 0; i < boxes.length; i++) { boxes[i].catchMouseEvents = false; Resizer rs = new Resizer(boxes[i], null, true, this); } javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { textPane.revalidate(); } }); } } public void resizeObjectTo(Rectangle r, JComponent jc) { if (jc == previewPanel) { TextActivityBase act = getTextActivity(); if (act != null) { textScroll.setBounds(r.x, r.y, r.width, r.height); act.setWindowSize(textScroll.getSize()); widthEdit.setValue(r.width); heightEdit.setValue(r.height); textScroll.revalidate(); repaint(); setModified(true); } } else if (jc instanceof JPanelActiveBox) { JPanelActiveBox jpab = (JPanelActiveBox) jc; jpab.setBounds(r.x, r.y, r.width, r.height); Dimension d = new Dimension(r.width, r.height); jpab.getActiveBoxContent().setDimension(d); jpab.setPreferredSize(d); jpab.setMaximumSize(d); setModified(true); } } public void editObject(Rectangle r, JComponent jc, Point pt) { if (jc instanceof JPanelActiveBox) { JPanelActiveBox jpab = (JPanelActiveBox) jc; if (jpab.ab != null) { ActiveBoxContent abc = ActiveBoxContentEditor.getActiveBoxContent(jpab.ab.getContent(), jpab, options, getActivityEditor().getMediaBagEditor(), jpab.ab); if (abc != null) { jpab.setActiveBoxContent(abc); Dimension d = abc.getDimension(); if (d != null) resizeObjectTo(new Rectangle(jpab.getX(), jpab.getY(), d.width, d.height), jpab); setModified(true); } } } } public void saveData() { TextActivityBase act = getTextActivity(); if (act != null) { // ??? } } protected javax.swing.Icon getIcon() { return ResourceManager.getImageIcon("icons/text_edit.gif"); } protected String getTitle() { return options.getMsg("edit_act_panels_text"); } protected String getTooltip() { return options.getMsg("edit_act_panels_text_tooltip"); } @Override public boolean documentChangePerformed(DocumentEvent ev) { if (ev != null && ev.getType() == DocumentEvent.EventType.REMOVE && getTextActivity() != null) getTextActivity().tad.tmb.removeUnattachedElements(); return ev != null; } @Override public boolean eventPerformed(EventObject ev) { boolean result = false; TextActivityBaseEditor tabe = getTextActivityEditor(); if (tabe != null && !skipUpdate) { TextActivityBase ta = tabe.getTextActivity(); MutableAttributeSet attr = new SimpleAttributeSet(); boolean paragraphAttr = false; boolean charAttr = false; boolean replace = false; Object src = (ev == null ? null : ev.getSource()); int xStart = textPane.getSelectionStart(); int xFinish = textPane.getSelectionEnd(); int len = 0; if (xStart != xFinish) { if (xFinish < xStart) { int s = xStart; xStart = xFinish; xFinish = s; } len = xFinish - xStart; } if (src != null && src.equals(fontFaceCombo)) { fontName = fontFaceCombo.getSelectedItem().toString(); StyleConstants.setFontFamily(attr, fontName); charAttr = true; } else if (src != null && src.equals(fontSizeCombo)) { int fs; try { fs = Integer.parseInt(fontSizeCombo.getSelectedItem().toString()); } catch (NumberFormatException ex) { return false; } if (fs >= 1) { fontSize = fs; StyleConstants.setFontSize(attr, fontSize); charAttr = true; } } else if (src == boldBtn) { StyleConstants.setBold(attr, boldBtn.isSelected()); charAttr = true; } else if (src == italicBtn) { StyleConstants.setItalic(attr, italicBtn.isSelected()); charAttr = true; } else if (src == underlineBtn) { StyleConstants.setUnderline(attr, underlineBtn.isSelected()); charAttr = true; } else if (src == textColorBtn) { StyleConstants.setForeground(attr, textColorBtn.getColor()); charAttr = true; } else if (src == targetBtn) { boolean b = targetBtn.isSelected(); TargetMarker tm = b ? createNewTarget() : ta.tad.tmb.getElementByOffset(xFinish, true); if (tm == null) return false; if (!b && !deleteTarget(tm)) return true; textPane.setCaretPosition(xStart); SwingUtilities.invokeLater(new Runnable() { public void run() { showAttributes(-1); } }); } else if (tabe.canEditTarget() && src == editTargetBtn) { tabe.editTarget(xFinish, options, this); } else if (src == insertBoxBtn) { JPanelActiveBox jpab = tabe.createNewBox(xStart, options, this); if (jpab != null) { jpab.catchMouseEvents = false; Resizer rs = new Resizer(jpab, null, true, this); } } else if (src == optionsBtn) { tabe.editCheckOptions(options, this); } else if (src == typeBtn && tabe.hasType()) { tabe.editType(options, this); } else if (src == bgColorBtn) { if (len == 0) { } else { StyleConstants.setBackground(attr, bgColorBtn.getColor()); charAttr = true; } } else if (src == alLeftBtn || src == alCenterBtn || src == alRightBtn) { int align = src == alCenterBtn ? StyleConstants.ALIGN_CENTER : src == alRightBtn ? StyleConstants.ALIGN_RIGHT : StyleConstants.ALIGN_LEFT; StyleConstants.setAlignment(attr, align); paragraphAttr = true; } else if (src == styleBtn) { StyleContext sc = TextStyleEditorPanel.editStyleContext(options, ta.tad.styleContext, this); if (sc != null) { try { ta.setStyleContext(sc); setInitializing(true); fillData(); setInitializing(false); } catch (Exception ex) { System.err.println("error applying styles:\n" + ex); } } } else if (src == clearStylesBtn) { int d = options.getMessages().showQuestionDlg(this, "edit_text_act_clearStylesPrompt", null, "yn"); if (d == Messages.YES) try { ta.setTextActivityDocument(ta.tad.getJDomElementWithoutStyles()); setInitializing(true); fillData(); setInitializing(false); } catch (Exception ex) { System.err.println("Error cleaning styles:\n" + ex); } } else if (src == prevScreenBtn) { if (TextPrevScreenEditorPanel.editPrevScreen(options, (TextActivityBaseEditor) getActivityEditor(), this)) setModified(true); } else if (src == widthEdit || src == heightEdit) { ta.setWindowSize(new Dimension(widthEdit.getValue(), heightEdit.getValue())); previewPanel.revalidate(); } changeCombos = false; if (paragraphAttr) ta.tad.setParagraphAttributes(xStart, len, attr, replace); if (charAttr) { if (len > 0) ta.tad.setCharacterAttributes(xStart, len, attr, replace); else { MutableAttributeSet inputAttributes = textPane.getInputAttributes(); inputAttributes.addAttributes(attr); } } textPane.grabFocus(); changeCombos = true; result = true; } return result; } protected TargetMarker createNewTarget() { TargetMarker result = null; TextActivityBaseEditor tabe = getTextActivityEditor(); if (tabe != null) { int from = textPane.getSelectionStart(); int to = textPane.getSelectionEnd(); result = tabe.createNewTarget(from, to, options, this); } return result; } protected boolean deleteTarget(TargetMarker tm) { boolean result = false; TextActivityBaseEditor tabe = getTextActivityEditor(); if (tabe != null) result = tabe.deleteTarget(tm, options, this); return result; } protected void showAttributes(int p) { TextActivityBaseEditor tabe = getTextActivityEditor(); if (tabe != null) { TextActivityBase ta = tabe.getTextActivity(); skipUpdate = true; if (p < 0) p = Math.max(0, textPane.getCaretPosition()); AttributeSet a = ta.tad.getCharacterElement(p).getAttributes(); String name = StyleConstants.getFontFamily(a); if (!name.equals(fontName) && changeCombos) { fontName = name; fontFaceCombo.setSelectedItem(name); } int size = StyleConstants.getFontSize(a); if (fontSize != size && changeCombos) { fontSize = size; fontSizeCombo.setSelectedItem(Integer.toString(fontSize)); } boldBtn.setSelected(StyleConstants.isBold(a)); italicBtn.setSelected(StyleConstants.isItalic(a)); underlineBtn.setSelected(StyleConstants.isUnderline(a)); Color c = StyleConstants.getForeground(a); if (!c.equals(textColorBtn.getColor())) textColorBtn.setColor(c); c = StyleConstants.getBackground(a); if (!c.equals(bgColorBtn.getColor())) bgColorBtn.setColor(c); targetBtn.setSelected(a.isDefined(TextActivityDocument.TARGET)); editTargetBtn.setEnabled(tabe.canEditTarget() && a.isDefined(TextActivityDocument.TARGET)); int alignment = StyleConstants.getAlignment(a); alCenterBtn.setSelected(alignment == StyleConstants.ALIGN_CENTER); alRightBtn.setSelected(alignment == StyleConstants.ALIGN_RIGHT); alLeftBtn.setSelected(alignment != StyleConstants.ALIGN_RIGHT && alignment != StyleConstants.ALIGN_CENTER); skipUpdate = false; } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JToggleButton alCenterBtn; private javax.swing.JToggleButton alLeftBtn; private javax.swing.JToggleButton alRightBtn; private javax.swing.ButtonGroup alignGrp; private edu.xtec.jclic.beans.ColorButton bgColorBtn; private javax.swing.JToggleButton boldBtn; private javax.swing.JButton clearStylesBtn; private javax.swing.JButton editTargetBtn; private javax.swing.JComboBox fontFaceCombo; private javax.swing.JComboBox fontSizeCombo; private edu.xtec.jclic.beans.SmallIntEditor heightEdit; private javax.swing.JButton insertBoxBtn; private javax.swing.JToggleButton italicBtn; private javax.swing.JScrollPane mainScroll; private javax.swing.JButton optionsBtn; private javax.swing.JButton prevScreenBtn; private javax.swing.JPanel previewPanel; private javax.swing.JButton styleBtn; private javax.swing.JToggleButton targetBtn; private edu.xtec.jclic.beans.ColorButton textColorBtn; private javax.swing.JTextPane textPane; private javax.swing.JScrollPane textScroll; private javax.swing.JButton typeBtn; private javax.swing.JToggleButton underlineBtn; private edu.xtec.jclic.beans.SmallIntEditor widthEdit; // End of variables declaration//GEN-END:variables protected class PreviewPanel extends ResizerPanel { @Override public void doLayout() { if (textScroll != null) { TextActivityBase act = getTextActivity(); Dimension d = (act != null ? act.getWindowSize() : new Dimension(Activity.DEFAULT_WIDTH, Activity.DEFAULT_HEIGHT)); textScroll.setBounds(0, 0, d.width, d.height); } } } } src/author/edu/xtec/jclic/activities/text/TextPrevScreenEditorPanel.form000066400000000000000000000311501335566474600270630ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/TextPrevScreenEditorPanel.java000066400000000000000000000240341335566474600270440ustar00rootroot00000000000000/* * File : TextPrevScreenEditorPanel.java * Created : 18-jun-2003 15:38 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.ActiveBoxContentEditor; import edu.xtec.jclic.boxes.ActiveBoxPreviewPanel; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.util.Options; import java.awt.Component; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class TextPrevScreenEditorPanel extends javax.swing.JPanel implements java.awt.event.ActionListener { Options options; ActiveBoxPreviewPanel abpp; TextActivityBaseEditor tabe; /** Creates new form TextPrevScreenEditorPanel */ public TextPrevScreenEditorPanel(Options options) { this.options = options; initComponents(); styleBtn.setOptions(options); abpp = (ActiveBoxPreviewPanel) prevMsgPanel; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JScrollPane scroll; javax.swing.JLabel prevMsgLb; javax.swing.JLabel styleLb; java.awt.GridBagConstraints gridBagConstraints; mainGroup = new javax.swing.ButtonGroup(); btnNo = new javax.swing.JRadioButton(); btnOriginal = new javax.swing.JRadioButton(); btnSpecial = new javax.swing.JRadioButton(); scroll = new javax.swing.JScrollPane(); textEdit = new javax.swing.JTextPane(); styleLb = new javax.swing.JLabel(); styleBtn = new edu.xtec.jclic.beans.BoxBaseButton(); prevMsgLb = new javax.swing.JLabel(); prevMsgPanel = new ActiveBoxPreviewPanel(null); timeLb = new javax.swing.JLabel(); timeEdit = new edu.xtec.jclic.beans.SmallIntEditor(); setLayout(new java.awt.GridBagLayout()); setMinimumSize(new java.awt.Dimension(200, 300)); btnNo.setText(options.getMsg("edit_text_act_prevScreen_no")); mainGroup.add(btnNo); btnNo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(btnNo, gridBagConstraints); btnOriginal.setText(options.getMsg("edit_text_act_prevScreen_original")); mainGroup.add(btnOriginal); btnOriginal.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(btnOriginal, gridBagConstraints); btnSpecial.setText(options.getMsg("edit_text_act_prevScreen_special")); mainGroup.add(btnSpecial); btnSpecial.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(btnSpecial, gridBagConstraints); scroll.setPreferredSize(new java.awt.Dimension(200, 100)); scroll.setMinimumSize(new java.awt.Dimension(100, 100)); scroll.setViewportView(textEdit); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(scroll, gridBagConstraints); styleLb.setText(options.getMsg("edit_style_title")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(styleLb, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(styleBtn, gridBagConstraints); prevMsgLb.setText(options.getMsg("edit_act_msg_prev")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(prevMsgLb, gridBagConstraints); prevMsgPanel.setBorder(new javax.swing.border.EtchedBorder()); prevMsgPanel.setToolTipText(options.getMsg("edit_act_msg_prev_tooltip")); prevMsgPanel.setPreferredSize(new java.awt.Dimension(200, 40)); prevMsgPanel.setMinimumSize(new java.awt.Dimension(100, 40)); prevMsgPanel.setMaximumSize(new java.awt.Dimension(32767, 40)); prevMsgPanel.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { prevMsgPanelMouseClicked(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(prevMsgPanel, gridBagConstraints); timeLb.setText(options.getMsg("edit_text_act_prevScreen_time")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(12, 2, 2, 2); add(timeLb, gridBagConstraints); timeEdit.setMax(999); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(12, 2, 2, 2); add(timeEdit, gridBagConstraints); } // GEN-END:initComponents private void prevMsgPanelMouseClicked(java.awt.event.MouseEvent evt) { // GEN-FIRST:event_prevMsgPanelMouseClicked if (tabe != null && !btnNo.isSelected()) { ActiveBoxContent abc = ActiveBoxContentEditor.getActiveBoxContent(abpp.getActiveBoxContent(), this, options, tabe.getMediaBagEditor(), abpp.getActiveBox()); if (abc != null) abpp.setActiveBoxContent(abc); } } // GEN-LAST:event_prevMsgPanelMouseClicked public void setTextActivityBaseEditor(TextActivityBaseEditor tabe) { this.tabe = tabe; if (tabe != null) { TextActivityBase tab = (TextActivityBase) tabe.getActivity(); if (!tab.prevScreen) btnNo.setSelected(true); else if (tab.prevScreenText == null) btnOriginal.setSelected(true); else btnSpecial.setSelected(true); textEdit.setText(tab.prevScreenText != null ? tab.prevScreenText : ""); timeEdit.setValue(tab.prevScreenMaxTime); styleBtn.setBoxBase(tab.prevScreenStyle); ActiveBoxContent abc = tab.getMessages()[0]; if (abc != null) abpp.setActiveBoxContent(abc); else { ActiveBoxContent nabc = new ActiveBoxContent(); nabc.setBoxBase(new BoxBase()); abpp.setActiveBoxContent(nabc); } checkEnabled(); } } public void checkEnabled() { textEdit.setEnabled(btnSpecial.isSelected()); styleBtn.setEnabled(btnSpecial.isSelected()); timeEdit.setEnabled(!btnNo.isSelected()); } public void actionPerformed(java.awt.event.ActionEvent ev) { checkEnabled(); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup mainGroup; private edu.xtec.jclic.beans.SmallIntEditor timeEdit; private javax.swing.JRadioButton btnSpecial; private javax.swing.JTextPane textEdit; private edu.xtec.jclic.beans.BoxBaseButton styleBtn; private javax.swing.JPanel prevMsgPanel; private javax.swing.JRadioButton btnOriginal; private javax.swing.JLabel timeLb; private javax.swing.JRadioButton btnNo; // End of variables declaration//GEN-END:variables private static Map panels = new HashMap(1); public static boolean editPrevScreen(Options options, TextActivityBaseEditor tabe, Component parent) { TextPrevScreenEditorPanel tpsep = panels.get(options); if (tpsep == null) { tpsep = new TextPrevScreenEditorPanel(options); panels.put(options, tpsep); } tpsep.setTextActivityBaseEditor(tabe); boolean result = options.getMessages().showInputDlg(parent, tpsep, "edit_text_act_prevScreen_title"); if (result) { TextActivityBase tab = (TextActivityBase) tabe.getActivity(); tab.prevScreen = !tpsep.btnNo.isSelected(); if (tab.prevScreen) { tab.prevScreenText = tpsep.btnOriginal.isSelected() ? null : tpsep.textEdit.getText(); tab.prevScreenStyle = tpsep.styleBtn.getBoxBase(); tab.prevScreenMaxTime = tpsep.timeEdit.getValue(); tab.getMessages()[0] = tpsep.abpp.getActiveBox().getContent(); } else tab.getMessages()[0] = null; } return result; } } src/author/edu/xtec/jclic/activities/text/TextStyleEditorPanel.form000066400000000000000000000740651335566474600261230ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/TextStyleEditorPanel.java000066400000000000000000000552421335566474600260750ustar00rootroot00000000000000/* * File : TextStyleEditorPanel.java * Created : 05-jun-2003 12:49 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.beans.ColorButton; import edu.xtec.util.FontCheck; import edu.xtec.util.Options; import edu.xtec.util.StreamIO; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.util.HashMap; import java.util.Map; import javax.swing.JComboBox; import javax.swing.text.DefaultStyledDocument; import javax.swing.text.Style; import javax.swing.text.StyleConstants; import javax.swing.text.StyleContext; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class TextStyleEditorPanel extends javax.swing.JPanel implements java.beans.PropertyChangeListener, java.awt.event.ActionListener, javax.swing.event.ChangeListener { Options options; StyleContext sc; private static StyleContext emptySc; /** Creates new form TextStyleEditorPanel */ public TextStyleEditorPanel(Options options, StyleContext sc) { this.options = options; initComponents(); setStyleContext(sc); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel mainLb = new javax.swing.JLabel(); fontFaceCombo = new JComboBox(FontCheck.getFontList(false)); fontSizeCombo = new JComboBox(FontCheck.fontSizes); boldBtn = new javax.swing.JToggleButton(); italicBtn = new javax.swing.JToggleButton(); underlineBtn = new javax.swing.JToggleButton(); javax.swing.JLabel colorsLb = new javax.swing.JLabel(); javax.swing.JLabel textColorLb = new javax.swing.JLabel(); textColorBtn = new edu.xtec.jclic.beans.ColorButton(); textColorBtn.setOptions(options); javax.swing.JLabel bgColorLb = new javax.swing.JLabel(); bgColorBtn = new edu.xtec.jclic.beans.ColorButton(); bgColorBtn.setOptions(options); javax.swing.JLabel tabLb = new javax.swing.JLabel(); tabSlider = new javax.swing.JSlider(); javax.swing.JLabel targetLb = new javax.swing.JLabel(); javax.swing.JLabel targetFgLb = new javax.swing.JLabel(); targetFgColor = new edu.xtec.jclic.beans.ColorButton(); targetFgColor.setOptions(options); javax.swing.JLabel targetBgLb = new javax.swing.JLabel(); targetBgColor = new edu.xtec.jclic.beans.ColorButton(); targetBgColor.setOptions(options); javax.swing.JLabel errorLb = new javax.swing.JLabel(); javax.swing.JLabel errorFgLb = new javax.swing.JLabel(); errorFgColor = new edu.xtec.jclic.beans.ColorButton(); errorFgColor.setOptions(options); javax.swing.JLabel errorBgLb = new javax.swing.JLabel(); errorBgColor = new edu.xtec.jclic.beans.ColorButton(); errorBgColor.setOptions(options); javax.swing.JPanel previewFrame = new javax.swing.JPanel(); javax.swing.JScrollPane previewScroll = new javax.swing.JScrollPane(); previewPanel = new javax.swing.JTextPane(); setLayout(new java.awt.GridBagLayout()); mainLb.setText(options.getMsg("edit_text_act_mainStyle")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(mainLb, gridBagConstraints); fontFaceCombo.setEditable(true); fontFaceCombo.setPreferredSize(new Dimension(125, fontFaceCombo.getPreferredSize().height)); fontFaceCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(fontFaceCombo, gridBagConstraints); fontSizeCombo.setEditable(true); fontSizeCombo.setPreferredSize(new Dimension(50, fontSizeCombo.getPreferredSize().height)); fontSizeCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); add(fontSizeCombo, gridBagConstraints); boldBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_bold.gif"))); // NOI18N boldBtn.setToolTipText(options.getMsg("edit_font_bold")); boldBtn.setPreferredSize(new java.awt.Dimension(27, 27)); boldBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); add(boldBtn, gridBagConstraints); italicBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_italic.gif"))); // NOI18N italicBtn.setToolTipText(options.getMsg("edit_font_italic")); italicBtn.setPreferredSize(new java.awt.Dimension(27, 27)); italicBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(italicBtn, gridBagConstraints); underlineBtn .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_underline.gif"))); // NOI18N underlineBtn.setToolTipText(options.getMsg("edit_font_italic")); underlineBtn.setPreferredSize(new java.awt.Dimension(27, 27)); underlineBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); add(underlineBtn, gridBagConstraints); colorsLb.setText(options.getMsg("edit_text_act_colors")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(colorsLb, gridBagConstraints); textColorLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/fg.gif"))); // NOI18N textColorLb.setText(":"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); add(textColorLb, gridBagConstraints); textColorBtn.setToolTipText(options.getMsg("edit_act_textColor_tooltip")); textColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(textColorBtn, gridBagConstraints); bgColorLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/bg.gif"))); // NOI18N bgColorLb.setText(":"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); add(bgColorLb, gridBagConstraints); bgColorBtn.setToolTipText(options.getMsg("edit_act_bgColor_tooltip")); bgColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); add(bgColorBtn, gridBagConstraints); tabLb.setText(options.getMsg("edit_text_act_tabSize")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(tabLb, gridBagConstraints); tabSlider.setMinorTickSpacing(5); tabSlider.setPaintLabels(true); tabSlider.setPaintTicks(true); tabSlider.setMajorTickSpacing(10); tabSlider.setMaximum(50); tabSlider.setValue(12); tabSlider.addChangeListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(tabSlider, gridBagConstraints); targetLb.setText(options.getMsg("edit_text_act_targetStyle")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(targetLb, gridBagConstraints); targetFgLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/fg.gif"))); // NOI18N targetFgLb.setText(":"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); add(targetFgLb, gridBagConstraints); targetFgColor.setToolTipText(options.getMsg("edit_act_textColor_tooltip")); targetFgColor.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(targetFgColor, gridBagConstraints); targetBgLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/bg.gif"))); // NOI18N targetBgLb.setText(":"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); add(targetBgLb, gridBagConstraints); targetBgColor.setToolTipText(options.getMsg("edit_act_bgColor_tooltip")); targetBgColor.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); add(targetBgColor, gridBagConstraints); errorLb.setText(options.getMsg("edit_text_act_errorStyle")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(errorLb, gridBagConstraints); errorFgLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/fg.gif"))); // NOI18N errorFgLb.setText(":"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); add(errorFgLb, gridBagConstraints); errorFgColor.setToolTipText(options.getMsg("edit_act_textColor_tooltip")); errorFgColor.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(errorFgColor, gridBagConstraints); errorBgLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/bg.gif"))); // NOI18N errorBgLb.setText(":"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); add(errorBgLb, gridBagConstraints); errorBgColor.setToolTipText(options.getMsg("edit_act_bgColor_tooltip")); errorBgColor.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); add(errorBgColor, gridBagConstraints); previewFrame.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_text_act_preview"))); previewFrame.setLayout(new java.awt.BorderLayout()); previewScroll.setPreferredSize(new java.awt.Dimension(300, 100)); previewPanel.setEditable(false); previewScroll.setViewportView(previewPanel); previewFrame.add(previewScroll, java.awt.BorderLayout.CENTER); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(previewFrame, gridBagConstraints); } // //GEN-END:initComponents private static StyleContext getEmptySc() { if (emptySc == null) { emptySc = new StyleContext(); TextActivityDocument.checkStyleContext(emptySc); } return emptySc; } public final void setStyleContext(StyleContext styleContext) { sc = (styleContext == null ? getEmptySc() : styleContext); TextActivityDocument.checkStyleContext(sc); Style defaultStyle = sc.getStyle(StyleContext.DEFAULT_STYLE); fontFaceCombo.setSelectedItem(StyleConstants.getFontFamily(defaultStyle)); fontSizeCombo.setSelectedItem(Integer.toString(StyleConstants.getFontSize(defaultStyle))); boldBtn.setSelected(StyleConstants.isBold(defaultStyle)); italicBtn.setSelected(StyleConstants.isItalic(defaultStyle)); underlineBtn.setSelected(StyleConstants.isUnderline(defaultStyle)); bgColorBtn.setColor(StyleConstants.getBackground(defaultStyle)); textColorBtn.setColor(StyleConstants.getForeground(defaultStyle)); int tabSpc = TextActivityDocument.DEFAULT_TAB; Object o = defaultStyle.getAttribute(TextActivityDocument.TABSPC); if (o != null) { try { tabSpc = Math.max(1, Math.min(Integer.parseInt(o.toString()), 50)); } catch (Exception ex) { // ??? } } tabSlider.setValue(tabSpc); Style targetStyle = sc.getStyle(TextActivityDocument.TARGET); targetBgColor.setColor(StyleConstants.getBackground(targetStyle)); targetFgColor.setColor(StyleConstants.getForeground(targetStyle)); Style errorStyle = sc.getStyle(TextActivityDocument.TARGET_ERROR); errorBgColor.setColor(StyleConstants.getBackground(errorStyle)); errorFgColor.setColor(StyleConstants.getForeground(errorStyle)); updatePreview(null); } public StyleContext getStyleContext(java.util.EventObject evt) { Object src = (evt == null ? null : evt.getSource()); Style defaultStyle = sc.getStyle(StyleContext.DEFAULT_STYLE); if (src == null || src == fontFaceCombo) { String fontFace = (String) fontFaceCombo.getSelectedItem(); if (fontFace != null && fontFace.length() > 0 && !fontFace.equals(StyleConstants.getFontFamily(defaultStyle))) StyleConstants.setFontFamily(defaultStyle, fontFace); } if (src == null || src == fontSizeCombo) { String fontSize = (String) fontSizeCombo.getSelectedItem(); if (fontSize != null && fontSize.length() > 0) { try { int fs = Integer.parseInt(fontSize); if (fs != StyleConstants.getFontSize(defaultStyle)) StyleConstants.setFontSize(defaultStyle, fs); } catch (Exception ex) { // ignore } } } if (src == null || src == boldBtn) { boolean bold = boldBtn.isSelected(); if (bold != StyleConstants.isBold(defaultStyle)) StyleConstants.setBold(defaultStyle, bold); } if (src == null || src == italicBtn) { boolean italic = italicBtn.isSelected(); if (italic != StyleConstants.isItalic(defaultStyle)) StyleConstants.setItalic(defaultStyle, italic); } if (src == null || src == underlineBtn) { boolean underline = underlineBtn.isSelected(); if (underline != StyleConstants.isUnderline(defaultStyle)) StyleConstants.setUnderline(defaultStyle, underline); } if (src == null || src == bgColorBtn) { Color c = bgColorBtn.getColor(); if (!c.equals(StyleConstants.getBackground(defaultStyle))) StyleConstants.setBackground(defaultStyle, c); } if (src == null || src == textColorBtn) { Color c = textColorBtn.getColor(); if (!c.equals(StyleConstants.getForeground(defaultStyle))) StyleConstants.setForeground(defaultStyle, c); } if (src == null || src == tabSlider) { String tabSpc = Integer.toString(Math.max(1, tabSlider.getValue())); if (!tabSpc.equals(defaultStyle.getAttribute(TextActivityDocument.TABSPC))) { defaultStyle.removeAttribute(TextActivityDocument.TABSPC); defaultStyle.addAttribute(TextActivityDocument.TABSPC, tabSpc); } } Style targetStyle = sc.getStyle(TextActivityDocument.TARGET); if (src == null || src == targetFgColor) { Color c = targetFgColor.getColor(); if (!c.equals(StyleConstants.getForeground(targetStyle))) StyleConstants.setForeground(targetStyle, c); } if (src == null || src == targetBgColor) { Color c = targetBgColor.getColor(); if (!c.equals(StyleConstants.getBackground(targetStyle))) StyleConstants.setBackground(targetStyle, c); } Style errorStyle = sc.getStyle(TextActivityDocument.TARGET_ERROR); if (src == null || src == errorFgColor) { Color c = errorFgColor.getColor(); if (!c.equals(StyleConstants.getForeground(errorStyle))) StyleConstants.setForeground(errorStyle, c); } if (src == null || src == errorBgColor) { Color c = errorBgColor.getColor(); if (!c.equals(StyleConstants.getBackground(errorStyle))) StyleConstants.setBackground(errorStyle, c); } return sc; } public void actionPerformed(java.awt.event.ActionEvent evt) { updatePreview(evt); } public void propertyChange(java.beans.PropertyChangeEvent evt) { updatePreview(evt); } public void stateChanged(javax.swing.event.ChangeEvent evt) { if (evt != null && evt.getSource() == tabSlider && !tabSlider.getValueIsAdjusting()) updatePreview(evt); } private void updatePreview(java.util.EventObject evt) { if (evt != null) getStyleContext(evt); try { Style defaultStyle = sc.getStyle(StyleContext.DEFAULT_STYLE); DefaultStyledDocument dsd; dsd = new DefaultStyledDocument((StyleContext) StreamIO.cloneObject(sc)); Object tabObj = defaultStyle.getAttribute(TextActivityDocument.TABSPC); if (tabObj != null) { int tabSpc = Math.max(1, Integer.parseInt(tabObj.toString())); TextActivityDocument.setStyledDocumentTabSpc(tabSpc, dsd, sc); } StringBuilder sb = new StringBuilder(); for (int i = 0; i < 5; i++) sb.append("T").append(i).append("\t"); dsd.insertString(0, sb.append("\n").toString(), defaultStyle); for (int i = 0; i < 2; i++) { sb.setLength(0); sb.append(options.getMsg("edit_text_act_styleSample_default_start")).append(" "); dsd.insertString(dsd.getLength(), sb.toString(), defaultStyle); sb.setLength(0); sb.append(options.getMsg("edit_text_act_styleSample_target")); dsd.insertString(dsd.getLength(), sb.toString(), sc.getStyle(TextActivityDocument.TARGET)); sb.setLength(0); sb.append(" ").append(options.getMsg("edit_text_act_styleSample_default_fill")).append(" "); dsd.insertString(dsd.getLength(), sb.toString(), defaultStyle); sb.setLength(0); sb.append(options.getMsg("edit_text_act_styleSample_error")); dsd.insertString(dsd.getLength(), sb.toString(), sc.getStyle(TextActivityDocument.TARGET_ERROR)); sb.setLength(0); sb.append(" ").append(options.getMsg("edit_text_act_styleSample_default_end")).append("\n"); dsd.insertString(dsd.getLength(), sb.toString(), defaultStyle); } previewPanel.setStyledDocument(dsd); previewPanel.setBackground(StyleConstants.getBackground(defaultStyle)); } catch (Exception ex) { System.err.println("Internal error:\n" + ex); } } // Variables declaration - do not modify//GEN-BEGIN:variables private edu.xtec.jclic.beans.ColorButton bgColorBtn; private javax.swing.JToggleButton boldBtn; private edu.xtec.jclic.beans.ColorButton errorBgColor; private edu.xtec.jclic.beans.ColorButton errorFgColor; private javax.swing.JComboBox fontFaceCombo; private javax.swing.JComboBox fontSizeCombo; private javax.swing.JToggleButton italicBtn; private javax.swing.JTextPane previewPanel; private javax.swing.JSlider tabSlider; private edu.xtec.jclic.beans.ColorButton targetBgColor; private edu.xtec.jclic.beans.ColorButton targetFgColor; private edu.xtec.jclic.beans.ColorButton textColorBtn; private javax.swing.JToggleButton underlineBtn; // End of variables declaration//GEN-END:variables private static Map panels = new HashMap(1); public static StyleContext editStyleContext(Options options, StyleContext sc, Component parent) { StyleContext result = null; StyleContext clon = null; if (sc != null) { try { clon = (StyleContext) StreamIO.cloneObject(sc); } catch (Exception ex) { System.err.println("Internal error: cannot clone object: " + sc + "\n" + ex); } } TextStyleEditorPanel tsep = panels.get(options); if (tsep == null) { tsep = new TextStyleEditorPanel(options, clon); panels.put(options, tsep); } else tsep.setStyleContext(clon); if (options.getMessages().showInputDlg(parent, tsep, "edit_style_title")) result = tsep.getStyleContext(null); return result; } } src/author/edu/xtec/jclic/activities/text/TextTargetEditorPanel.form000066400000000000000000000655231335566474600262500ustar00rootroot00000000000000
src/author/edu/xtec/jclic/activities/text/TextTargetEditorPanel.java000066400000000000000000000517571335566474600262320ustar00rootroot00000000000000/* * File : TextTargetEditorPanel.java * Created : 23-mai-2003 10:25 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.beans.SmallIntEditor; import edu.xtec.jclic.beans.TextListEditor; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.ActiveBoxContentEditor; import edu.xtec.jclic.boxes.JPanelActiveBox; import edu.xtec.util.Options; import edu.xtec.util.Resizer; import edu.xtec.util.ResizerPanel; import java.awt.CardLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import javax.swing.JComponent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class TextTargetEditorPanel extends javax.swing.JPanel implements java.beans.PropertyChangeListener, java.awt.event.ActionListener, Resizer.ResizerListener { protected Options options; TextTarget textTarget; JPanelActiveBox jpab; Resizer resizer; MediaBagEditor mbe; protected static final int[] popValues = { TextTarget.NO_INFO, TextTarget.INFO_ALWAYS, TextTarget.INFO_ON_ERROR, TextTarget.INFO_ON_DEMAND }; protected static final String[] popKeys = { "no", "always", "onError", "onDemand" }; protected String[] popItems; protected static final Map panels = new HashMap(1); /** Creates new form TextTargetPanel */ public TextTargetEditorPanel(Options options, MediaBagEditor mbe) { this.options = options; this.mbe = mbe; popItems = new String[popKeys.length]; for (int i = 0; i < popItems.length; i++) popItems[i] = options.getMsg("edit_text_act_popup_" + popKeys[i]); initComponents(); jpab = new JPanelActiveBox(null, null, popupPreview); jpab.catchMouseEvents = false; jpab.setPreferredSize(popupPreview.getPreferredSize()); popupPreview.setBounds(0, 0, popupPreview.getPreferredSize().width, popupPreview.getPreferredSize().height); popupPreview.add(jpab); resizer = new Resizer(jpab, null, true, this); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; popupOptions = new javax.swing.ButtonGroup(); javax.swing.JPanel formatPanel = new javax.swing.JPanel(); answerLb = new javax.swing.JLabel(); answerListEditor = new TextListEditor(options); maxlenLb = new javax.swing.JLabel(); maxLenEditor = new edu.xtec.jclic.beans.SmallIntEditor(); fillingChLb = new javax.swing.JLabel(); fillingCh = new javax.swing.JTextField(); iniLenLb = new javax.swing.JLabel(); iniLenEditor = new edu.xtec.jclic.beans.SmallIntEditor(); iniTextLb = new javax.swing.JLabel(); iniText = new javax.swing.JTextField(); listChk = new javax.swing.JCheckBox(); listEditor = new TextListEditor(options); javax.swing.JPanel popupPanel = new javax.swing.JPanel(); typeCombo = new javax.swing.JComboBox(popItems); cardPanel = new javax.swing.JPanel(); javax.swing.JPanel nullPanel = new javax.swing.JPanel(); javax.swing.JPanel editPanel = new javax.swing.JPanel(); javax.swing.JScrollPane popupPreviewScroll = new javax.swing.JScrollPane(); popupPreview = new ResizerPanel(); onlyPlayChk = new javax.swing.JCheckBox(); delayLb = new javax.swing.JLabel(); delayEditor = new edu.xtec.jclic.beans.SmallIntEditor(); maxTimeLb = new javax.swing.JLabel(); maxTimeEditor = new edu.xtec.jclic.beans.SmallIntEditor(); setLayout(new java.awt.GridBagLayout()); formatPanel.setLayout(new java.awt.GridBagLayout()); answerLb.setText(options.getMsg("edit_text_act_answer_label")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(answerLb, gridBagConstraints); answerListEditor.setPreferredSize(new java.awt.Dimension(180, 100)); answerListEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; formatPanel.add(answerListEditor, gridBagConstraints); maxlenLb.setText(options.getMsg("edit_text_act_maxLen")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(maxlenLb, gridBagConstraints); maxLenEditor.setToolTipText(options.getMsg("edit_text_act_maxLen_tooltip")); maxLenEditor.setMax(999); maxLenEditor.setMin(1); maxLenEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(maxLenEditor, gridBagConstraints); fillingChLb.setText(options.getMsg("edit_text_act_fillingChar")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(fillingChLb, gridBagConstraints); fillingCh.setToolTipText(options.getMsg("edit_text_act_maxLen_tooltip")); fillingCh.setColumns(1); fillingCh.setText("_"); fillingCh.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(fillingCh, gridBagConstraints); iniLenLb.setText(options.getMsg("edit_text_act_iniLen")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(iniLenLb, gridBagConstraints); iniLenEditor.setToolTipText(options.getMsg("edit_text_act_iniLen_tooltip")); iniLenEditor.setMax(999); iniLenEditor.setMin(1); iniLenEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(iniLenEditor, gridBagConstraints); iniTextLb.setText(options.getMsg("edit_text_act_iniText")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(iniTextLb, gridBagConstraints); iniText.setToolTipText(options.getMsg("edit_text_act_iniText_tooltip")); iniText.setPreferredSize(new java.awt.Dimension(140, 21)); iniText.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); formatPanel.add(iniText, gridBagConstraints); listChk.setToolTipText(options.getMsg("edit_text_act_list_tooltip")); listChk.setText(options.getMsg("edit_text_act_list")); listChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 0, 2); formatPanel.add(listChk, gridBagConstraints); listEditor.setPreferredSize(new java.awt.Dimension(180, 100)); listEditor.setEnabled(false); listEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; formatPanel.add(listEditor, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(formatPanel, gridBagConstraints); popupPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_text_act_popup"))); popupPanel.setLayout(new java.awt.GridBagLayout()); typeCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); popupPanel.add(typeCombo, gridBagConstraints); cardPanel.setLayout(new java.awt.CardLayout()); cardPanel.add(nullPanel, "card2"); editPanel.setLayout(new java.awt.GridBagLayout()); popupPreviewScroll.setPreferredSize(new java.awt.Dimension(200, 40)); popupPreview.setPreferredSize(new java.awt.Dimension(300, 300)); popupPreview.setLayout(null); popupPreviewScroll.setViewportView(popupPreview); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); editPanel.add(popupPreviewScroll, gridBagConstraints); onlyPlayChk.setText(options.getMsg("edit_text_act_popup_onlyPlay")); onlyPlayChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); editPanel.add(onlyPlayChk, gridBagConstraints); delayLb.setText(options.getMsg("edit_text_act_popup_delay")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); editPanel.add(delayLb, gridBagConstraints); delayEditor.setMax(9999); delayEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 2, 4, 2); editPanel.add(delayEditor, gridBagConstraints); maxTimeLb.setText(options.getMsg("edit_text_act_popup_maxTime")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); editPanel.add(maxTimeLb, gridBagConstraints); maxTimeEditor.setMax(9999); maxTimeEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 2, 4, 2); editPanel.add(maxTimeEditor, gridBagConstraints); cardPanel.add(editPanel, "card3"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; popupPanel.add(cardPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(popupPanel, gridBagConstraints); } // //GEN-END:initComponents /** * Getter for property textTarget. * * @return Value of property textTarget. */ public edu.xtec.jclic.activities.text.TextTarget getTextTarget() { collectData(); return textTarget; } /** * Setter for property textTarget. * * @param textTarget New value of property textTarget. */ public void setTextTarget(edu.xtec.jclic.activities.text.TextTarget textTarget) { this.textTarget = textTarget; answerListEditor.setTextList(textTarget != null ? textTarget.answer : null); listChk.setSelected(textTarget != null && textTarget.isList); maxLenEditor.setValue(textTarget != null ? textTarget.maxLenResp : 1); fillingCh.setText(textTarget != null ? new String(new char[] { textTarget.iniChar }) : "_"); iniLenEditor.setValue(textTarget != null ? textTarget.numIniChars : 1); iniText.setText(textTarget != null ? (textTarget.iniText != null ? textTarget.iniText : "") : ""); listEditor.setTextList(textTarget != null ? textTarget.options : null); int v = 0; if (textTarget != null) v = Math.max(Arrays.binarySearch(popValues, textTarget.infoMode), 0); typeCombo.setSelectedIndex(v); delayEditor.setValue(textTarget != null ? textTarget.popupDelay : 0); maxTimeEditor.setValue(textTarget != null ? textTarget.popupMaxTime : 0); onlyPlayChk.setSelected(textTarget != null && textTarget.onlyPlay); ActiveBoxContent abc = textTarget != null ? textTarget.popupContent : null; if (abc == null && textTarget != null) { abc = new ActiveBoxContent(); abc.setDimension(new Dimension(100, 40)); } jpab.setActiveBoxContent(abc); if (abc != null && abc.dimension != null) { jpab.setBounds(0, 0, abc.dimension.width, abc.dimension.height); } checkEnabled(); } /* * public boolean isModified(){ return modified || answerListEditor.isModified() * || listEditor.isModified(); } * * public void setModified(boolean value){ modified=value; if(value) * parentPanel.setModified(true); } */ public void propertyChange(java.beans.PropertyChangeEvent ev) { } public void actionPerformed(java.awt.event.ActionEvent evt) { if (evt != null) { checkEnabled(); } } public void checkEnabled() { answerListEditor.setEnabled(textTarget != null); maxLenEditor.setEnabled(textTarget != null && !listChk.isSelected()); fillingCh.setEnabled(textTarget != null && !listChk.isSelected()); iniLenEditor.setEnabled(textTarget != null && !listChk.isSelected()); iniText.setEnabled(textTarget != null); listChk.setEnabled(textTarget != null); listEditor.setEnabled(textTarget != null && listChk.isSelected()); typeCombo.setEnabled(textTarget != null); int v = typeCombo.getSelectedIndex(); delayEditor.setEnabled(textTarget != null && v > 0); maxTimeEditor.setEnabled(textTarget != null && v > 0); onlyPlayChk.setEnabled(textTarget != null && v > 0); resizer.setEnabled(textTarget != null && v > 0); if (typeCombo.isEnabled() && typeCombo.getSelectedIndex() > 0) ((CardLayout) cardPanel.getLayout()).last(cardPanel); else ((CardLayout) cardPanel.getLayout()).first(cardPanel); } public void collectData() { if (textTarget != null /* && isModified() */) { String[] answers = answerListEditor.getTextList(); if (answers.length > 0) textTarget.answer = answers; if (listChk.isSelected()) { String[] textList = listEditor.getTextList(); if (textList.length > 0) { textTarget.isList = true; textTarget.options = textList; } } else { textTarget.isList = false; textTarget.options = null; textTarget.numIniChars = Math.max(1, iniLenEditor.getValue()); textTarget.maxLenResp = Math.max(1, maxLenEditor.getValue()); textTarget.iniText = edu.xtec.util.StrUtils.nullableString(iniText.getText()); String s = fillingCh.getText(); textTarget.iniChar = (s != null && s.length() > 0) ? s.charAt(0) : '_'; } /* * textTarget.infoMode = popupAlwaysOption.isSelected() ? TextTarget.INFO_ALWAYS * : popupOnErrorOption.isSelected() ? TextTarget.INFO_ON_ERROR : * popupOnDemandOption.isSelected() ? TextTarget.INFO_ON_DEMAND : * TextTarget.NO_INFO; **/ textTarget.infoMode = popValues[Math.max(0, typeCombo.getSelectedIndex())]; textTarget.popupDelay = delayEditor.getValue(); textTarget.popupMaxTime = maxTimeEditor.getValue(); textTarget.onlyPlay = onlyPlayChk.isSelected(); if (textTarget.infoMode != TextTarget.NO_INFO) { textTarget.popupContent = jpab.getActiveBoxContent(); } } } public void resizeObjectTo(Rectangle r, JComponent jc) { if (jc == jpab) { jpab.setBounds(r.x, r.y, r.width, r.height); Dimension d = new Dimension(r.width, r.height); jpab.getActiveBoxContent().setDimension(d); jpab.setPreferredSize(d); jpab.setMaximumSize(d); } } public void editObject(Rectangle r, JComponent jc, Point pt) { if (jc == jpab) { ActiveBoxContent abc = ActiveBoxContentEditor.getActiveBoxContent(jpab.ab.getContent(), jpab, options, mbe, jpab.ab); if (abc != null) { Dimension d = abc.getDimension(); jpab.setActiveBoxContent(abc); if (d != null) jpab.setBounds(0, 0, d.width, d.height); } } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel answerLb; private edu.xtec.jclic.beans.TextListEditor answerListEditor; private javax.swing.JPanel cardPanel; private edu.xtec.jclic.beans.SmallIntEditor delayEditor; private javax.swing.JLabel delayLb; private javax.swing.JTextField fillingCh; private javax.swing.JLabel fillingChLb; private edu.xtec.jclic.beans.SmallIntEditor iniLenEditor; private javax.swing.JLabel iniLenLb; private javax.swing.JTextField iniText; private javax.swing.JLabel iniTextLb; private javax.swing.JCheckBox listChk; private edu.xtec.jclic.beans.TextListEditor listEditor; private edu.xtec.jclic.beans.SmallIntEditor maxLenEditor; private edu.xtec.jclic.beans.SmallIntEditor maxTimeEditor; private javax.swing.JLabel maxTimeLb; private javax.swing.JLabel maxlenLb; private javax.swing.JCheckBox onlyPlayChk; private javax.swing.ButtonGroup popupOptions; private javax.swing.JPanel popupPreview; private javax.swing.JComboBox typeCombo; // End of variables declaration//GEN-END:variables public static boolean editTextTarget(TextTarget tt, Options options, MediaBagEditor mbe, Component parent) { TextTargetEditorPanel ttep = panels.get(options); if (ttep == null) { ttep = new TextTargetEditorPanel(options, mbe); panels.put(options, ttep); } ttep.setTextTarget(tt); boolean result = options.getMessages().showInputDlg(parent, ttep, "edit_text_act_target"); if (result) ttep.collectData(); ttep.setTextTarget(null); return result; } } src/author/edu/xtec/jclic/activities/text/WrittenAnswerEditor.java000066400000000000000000000026141335566474600257570ustar00rootroot00000000000000/* * File : WrittenAnswerEditor.java * Created : 10-oct-2002 15:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class WrittenAnswerEditor extends ActivityEditor { /** Creates a new instance of SimpleAssociationEditor */ public WrittenAnswerEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.DOUBLE_REL_ALT, null, null); } } src/author/edu/xtec/jclic/activities/textGrid/000077500000000000000000000000001335566474600217345ustar00rootroot00000000000000src/author/edu/xtec/jclic/activities/textGrid/CrossWordEditor.java000066400000000000000000000025171335566474600257000ustar00rootroot00000000000000/* * File : CrossWordEditor.java * Created : 28-apr-2004 18:06 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.textGrid; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class CrossWordEditor extends ActivityEditor { /** Creates a new instance of CrossWordEditor */ public CrossWordEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.TEXTGRID_CRW, null, null); } } src/author/edu/xtec/jclic/activities/textGrid/WordSearchEditor.java000066400000000000000000000025161335566474600260130ustar00rootroot00000000000000/* * File : WordSearchEditor.java * Created : 20-apr-2004 11:54 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.textGrid; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.ActivityEditorPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class WordSearchEditor extends ActivityEditor { /** Creates a new instance of WordSearchEditor */ public WordSearchEditor(Activity act) { super(act); } @Override protected void createPanels(ActivityEditorPanel panel) { panel.addInternalPanel(ActivityEditorPanel.TEXTGRID_ALT, null, null); } } src/author/edu/xtec/jclic/automation/000077500000000000000000000000001335566474600201565ustar00rootroot00000000000000src/author/edu/xtec/jclic/automation/AutoContentProviderEditor.java000066400000000000000000000044521335566474600261530ustar00rootroot00000000000000/* * File : AutoContentProviderEditor.java * Created : 04-mar-2004 10:32 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation; import edu.xtec.jclic.Activity; import edu.xtec.jclic.edit.Editor; import edu.xtec.util.Options; import edu.xtec.util.TripleString; import java.util.ArrayList; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public abstract class AutoContentProviderEditor extends Editor { protected static ImageIcon icon; /** Creates a new instance of AutoContentProviderEditor */ public AutoContentProviderEditor(AutoContentProvider acp) { super(acp); } protected void createChildren() { } public AutoContentProvider getAutoContentProvider() { return (AutoContentProvider) userObject; } @Override public String getTitleKey() { return "edit_acp"; } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/miniclic.png"); return icon; } public static final String SYSTEM_LIST = "automation.contentproviders"; public static List getSystemContentProvidersList(Options options) { List result; try { result = TripleString.getTripleList(SYSTEM_LIST, options, true, true, true); } catch (Exception ex) { System.err.println("Error reading list of content providers!\n" + ex); result = new ArrayList(); } return result; } public Activity getActivity() { return (Activity) getFirstObject(Activity.class); } } src/author/edu/xtec/jclic/automation/arith/000077500000000000000000000000001335566474600212655ustar00rootroot00000000000000src/author/edu/xtec/jclic/automation/arith/ArithEditor.java000066400000000000000000000032471335566474600243540ustar00rootroot00000000000000/* * File : ArithEditor.java * Created : 04-mar-2004 10:32 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.arith; import edu.xtec.jclic.automation.*; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Options; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class ArithEditor extends AutoContentProviderEditor { /** Creates a new instance of ArithEditor */ public ArithEditor(Arith arith) { super(arith); } private static Map panels = new HashMap(); public EditorPanel createEditorPanel(Options options) { EditorPanel panel = panels.get(options); if (panel == null) { panel = new ArithEditorPanel(options); panels.put(options, panel); } return panel; } public Class getEditorPanelClass() { return ArithEditorPanel.class; } } src/author/edu/xtec/jclic/automation/arith/ArithEditorPanel.form000066400000000000000000001161471335566474600253620ustar00rootroot00000000000000
src/author/edu/xtec/jclic/automation/arith/ArithEditorPanel.java000066400000000000000000000501301335566474600253250ustar00rootroot00000000000000/* * File : ArithEditorPanel.java * Created : 10-jun-2002 09:59 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.arith; import edu.xtec.jclic.automation.AutoContentProviderEditor; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Options; import javax.swing.JComboBox; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ArithEditorPanel extends EditorPanel { private String[] ORD_LIST; private OperatorEditorPanel firstOpPanel; private OperatorEditorPanel secondOpPanel; /** Creates new form MenuEditorPanel */ public ArithEditorPanel(Options options) { super(options); ORD_LIST = new String[3]; ORD_LIST[0] = options.getMsg("edit_arith_result_random"); ORD_LIST[1] = options.getMsg("edit_arith_result_asc"); ORD_LIST[2] = options.getMsg("edit_arith_result_desc"); initComponents(); firstOpPanel = (OperatorEditorPanel) firstOpPanelX; secondOpPanel = (OperatorEditorPanel) secondOpPanelX; postInit(250, false, false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; condGrp = new javax.swing.ButtonGroup(); javax.swing.JPanel leftPanel = new javax.swing.JPanel(); operationsPanel = new javax.swing.JPanel(); chkPlus = new javax.swing.JCheckBox(); chkMinus = new javax.swing.JCheckBox(); chkMultiply = new javax.swing.JCheckBox(); chkDivide = new javax.swing.JCheckBox(); unknownPanel = new javax.swing.JPanel(); chk_aobx = new javax.swing.JCheckBox(); chk_aoxr = new javax.swing.JCheckBox(); chk_xobr = new javax.swing.JCheckBox(); chk_axbr = new javax.swing.JCheckBox(); javax.swing.JSeparator sep = new javax.swing.JSeparator(); chk_invert = new javax.swing.JCheckBox(); javax.swing.JLabel sepleft = new javax.swing.JLabel(); rightPanel = new javax.swing.JPanel(); firstOpPanelX = new OperatorEditorPanel(options); secondOpPanelX = new OperatorEditorPanel(options); resultPanel = new javax.swing.JPanel(); javax.swing.JLabel fromLb = new javax.swing.JLabel(); fromCombo = new JComboBox(OperatorEditorPanel.LIST_OF_VALUES); javax.swing.JLabel toLb = new javax.swing.JLabel(); toCombo = new JComboBox(OperatorEditorPanel.LIST_OF_VALUES); notCarryChk = new javax.swing.JCheckBox(); javax.swing.JLabel orderLb = new javax.swing.JLabel(); orderCombo = new JComboBox(ORD_LIST); avoidDupChk = new javax.swing.JCheckBox(); condPanel = new javax.swing.JPanel(); indOpt = new javax.swing.JRadioButton(); agbOpt = new javax.swing.JRadioButton(); albOpt = new javax.swing.JRadioButton(); javax.swing.JLabel sepright1 = new javax.swing.JLabel(); javax.swing.JLabel sepright = new javax.swing.JLabel(); setToolTipText(options.getMsg("edit_act_descriptionTab_tooltip")); setLayout(new java.awt.GridBagLayout()); leftPanel.setLayout(new java.awt.GridBagLayout()); operationsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_arith_operations"))); operationsPanel.setToolTipText(options.getMsg("edit_arith_operations_tooltip")); operationsPanel.setLayout(new java.awt.GridBagLayout()); chkPlus.setText(options.getMsg("edit_arith_operations_plus")); chkPlus.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); operationsPanel.add(chkPlus, gridBagConstraints); chkMinus.setText(options.getMsg("edit_arith_operations_minus")); chkMinus.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); operationsPanel.add(chkMinus, gridBagConstraints); chkMultiply.setText(options.getMsg("edit_arith_operations_multiply")); chkMultiply.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); operationsPanel.add(chkMultiply, gridBagConstraints); chkDivide.setText(options.getMsg("edit_arith_operations_divide")); chkDivide.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); operationsPanel.add(chkDivide, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; leftPanel.add(operationsPanel, gridBagConstraints); unknownPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_arith_unknown"))); unknownPanel.setToolTipText(options.getMsg("edit_arith_unknown_tooltip")); unknownPanel.setLayout(new java.awt.GridBagLayout()); chk_aobx.setToolTipText(options.getMsg("edit_arith_unknown_aobx")); chk_aobx.setText("A @ B = ?"); chk_aobx.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); unknownPanel.add(chk_aobx, gridBagConstraints); chk_aoxr.setToolTipText(options.getMsg("edit_arith_unknown_aoxr")); chk_aoxr.setText("A @ ? = C"); chk_aoxr.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); unknownPanel.add(chk_aoxr, gridBagConstraints); chk_xobr.setToolTipText(options.getMsg("edit_arith_unknown_xobr")); chk_xobr.setText("? @ B = C"); chk_xobr.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); unknownPanel.add(chk_xobr, gridBagConstraints); chk_axbr.setToolTipText(options.getMsg("edit_arith_unknown_axbr")); chk_axbr.setText("A ? B = C"); chk_axbr.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); unknownPanel.add(chk_axbr, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; unknownPanel.add(sep, gridBagConstraints); chk_invert.setToolTipText(options.getMsg("edit_arith_unknown_invert")); chk_invert.setText("C = A @ B"); chk_invert.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); unknownPanel.add(chk_invert, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; leftPanel.add(unknownPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; leftPanel.add(sepleft, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; add(leftPanel, gridBagConstraints); rightPanel.setLayout(new java.awt.GridBagLayout()); firstOpPanelX.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_arith_firstOp"))); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; rightPanel.add(firstOpPanelX, gridBagConstraints); secondOpPanelX.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_arith_secondOp"))); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; rightPanel.add(secondOpPanelX, gridBagConstraints); resultPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_arith_result"))); resultPanel.setLayout(new java.awt.GridBagLayout()); fromLb.setLabelFor(fromCombo); fromLb.setText(options.getMsg("edit_arith_op_from")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); resultPanel.add(fromLb, gridBagConstraints); fromCombo.setToolTipText(options.getMsg("edit_arith_op_from_tooltip")); fromCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); resultPanel.add(fromCombo, gridBagConstraints); toLb.setLabelFor(toCombo); toLb.setText(options.getMsg("edit_arith_op_to")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); resultPanel.add(toLb, gridBagConstraints); toCombo.setToolTipText(options.getMsg("edit_arith_op_to_tooltip")); toCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); resultPanel.add(toCombo, gridBagConstraints); notCarryChk.setText(options.getMsg("edit_arith_result_notCarry")); notCarryChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); resultPanel.add(notCarryChk, gridBagConstraints); orderLb.setText(options.getMsg("edit_arith_result_order")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); resultPanel.add(orderLb, gridBagConstraints); orderCombo.setToolTipText(options.getMsg("edit_arith_op_to_tooltip")); orderCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); resultPanel.add(orderCombo, gridBagConstraints); avoidDupChk.setText(options.getMsg("edit_arith_result_avoidDup")); avoidDupChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); resultPanel.add(avoidDupChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; rightPanel.add(resultPanel, gridBagConstraints); condPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_arith_cond"))); condPanel.setToolTipText(options.getMsg("edit_arith_cond_tooltip")); condPanel.setLayout(new java.awt.GridBagLayout()); condGrp.add(indOpt); indOpt.setText(options.getMsg("edit_arith_cond_ind")); indOpt.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); condPanel.add(indOpt, gridBagConstraints); condGrp.add(agbOpt); agbOpt.setText("A > B"); agbOpt.setToolTipText(options.getMsg("edit_arith_cond_agb")); agbOpt.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); condPanel.add(agbOpt, gridBagConstraints); condGrp.add(albOpt); albOpt.setText("A < B"); albOpt.setToolTipText(options.getMsg("edit_arith_cond_alb")); albOpt.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); condPanel.add(albOpt, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; rightPanel.add(condPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; rightPanel.add(sepright1, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; rightPanel.add(sepright, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(rightPanel, gridBagConstraints); } // //GEN-END:initComponents public boolean checkIfEditorValid(Editor e) { return e instanceof ArithEditor; } public ArithEditor getArithEditor() { return (ArithEditor) getEditor(); } public Arith getArith() { ArithEditor aed = getArithEditor(); return aed == null ? null : (Arith) aed.getAutoContentProvider(); } public void fillData() { Arith a = getArith(); chkPlus.setSelected(a == null ? true : a.use_add); chkMinus.setSelected(a == null ? false : a.use_subst); chkMultiply.setSelected(a == null ? false : a.use_mult); chkDivide.setSelected(a == null ? false : a.use_div); chk_aobx.setSelected(a == null ? true : a.exp_abx); chk_aoxr.setSelected(a == null ? false : a.exp_axc); chk_xobr.setSelected(a == null ? false : a.exp_xbc); chk_axbr.setSelected(a == null ? false : a.exp_axbc); chk_invert.setSelected(a == null ? false : a.exp_caxb); firstOpPanel.setOperator(a == null ? new Operator() : a.opA); secondOpPanel.setOperator(a == null ? new Operator() : a.opB); fromCombo.setSelectedIndex(a == null ? 1 : a.resultLimInf); toCombo.setSelectedIndex(a == null ? Operator.LIMITS.length - 1 : a.resultLimSup); notCarryChk.setSelected(a == null ? false : a.resultCarry); avoidDupChk.setSelected(a == null ? false : a.resultNoDup); orderCombo.setSelectedIndex(a == null ? 0 : a.resultOrder); int cond = (a == null ? 0 : a.opCond); indOpt.setSelected(cond == 0); agbOpt.setSelected(cond == 1); albOpt.setSelected(cond == 2); setModified(false); } public void saveData() { Arith a = getArith(); if (a != null) { a.use_add = chkPlus.isSelected(); a.use_subst = chkMinus.isSelected(); a.use_mult = chkMultiply.isSelected(); a.use_div = chkDivide.isSelected(); a.exp_abx = chk_aobx.isSelected(); a.exp_axc = chk_aoxr.isSelected(); a.exp_xbc = chk_xobr.isSelected(); a.exp_axbc = chk_axbr.isSelected(); a.exp_caxb = chk_invert.isSelected(); a.opA = firstOpPanel.getOperator(); a.opB = secondOpPanel.getOperator(); a.resultLimInf = fromCombo.getSelectedIndex(); a.resultLimSup = toCombo.getSelectedIndex(); a.resultCarry = notCarryChk.isSelected(); a.resultNoDup = avoidDupChk.isSelected(); a.resultOrder = orderCombo.getSelectedIndex(); a.opCond = agbOpt.isSelected() ? 1 : albOpt.isSelected() ? 2 : 0; } } @Override protected javax.swing.Icon getIcon() { return AutoContentProviderEditor.getIcon(); } @Override protected String getTitle() { return options.getMsg("edit_arith_title"); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JRadioButton agbOpt; private javax.swing.JRadioButton albOpt; private javax.swing.JCheckBox avoidDupChk; private javax.swing.JCheckBox chkDivide; private javax.swing.JCheckBox chkMinus; private javax.swing.JCheckBox chkMultiply; private javax.swing.JCheckBox chkPlus; private javax.swing.JCheckBox chk_aobx; private javax.swing.JCheckBox chk_aoxr; private javax.swing.JCheckBox chk_axbr; private javax.swing.JCheckBox chk_invert; private javax.swing.JCheckBox chk_xobr; private javax.swing.ButtonGroup condGrp; private javax.swing.JPanel condPanel; private javax.swing.JPanel firstOpPanelX; private javax.swing.JComboBox fromCombo; private javax.swing.JRadioButton indOpt; private javax.swing.JCheckBox notCarryChk; private javax.swing.JPanel operationsPanel; private javax.swing.JComboBox orderCombo; private javax.swing.JPanel resultPanel; private javax.swing.JPanel rightPanel; private javax.swing.JPanel secondOpPanelX; private javax.swing.JComboBox toCombo; private javax.swing.JPanel unknownPanel; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/automation/arith/OperatorEditorPanel.form000066400000000000000000000434271335566474600261060ustar00rootroot00000000000000
src/author/edu/xtec/jclic/automation/arith/OperatorEditorPanel.java000066400000000000000000000265161335566474600260640ustar00rootroot00000000000000/* * File : OperatorEditorPanel.java * Created : 08-mar-2004 09:49 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.arith; import edu.xtec.jclic.beans.TextListEditor; import edu.xtec.util.Options; import java.util.EventObject; import java.util.StringTokenizer; import javax.swing.JComboBox; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class OperatorEditorPanel extends edu.xtec.util.CtrlPanel { protected static final Integer[] LIST_OF_VALUES = new Integer[Operator.LIMITS.length]; static { for (int i = 0; i < Operator.LIMITS.length; i++) LIST_OF_VALUES[i] = new Integer(Operator.LIMITS[i]); } Options options; /** Creates new form OperandEditorPanel */ public OperatorEditorPanel(Options options) { this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; decGrp = new javax.swing.ButtonGroup(); rangePanel = new javax.swing.JPanel(); javax.swing.JLabel fromLb = new javax.swing.JLabel(); fromCombo = new JComboBox(LIST_OF_VALUES); javax.swing.JLabel toLb = new javax.swing.JLabel(); toCombo = new JComboBox(LIST_OF_VALUES); javax.swing.JLabel withLb = new javax.swing.JLabel(); opPanel = new javax.swing.JPanel(); withZeroChk = new javax.swing.JCheckBox(); withOneChk = new javax.swing.JCheckBox(); withMinusOneChk = new javax.swing.JCheckBox(); fromListChk = new javax.swing.JCheckBox(); listTxt = new javax.swing.JTextField(); javax.swing.JPanel decPanel = new javax.swing.JPanel(); opDec0 = new javax.swing.JRadioButton(); opDec1 = new javax.swing.JRadioButton(); opDec2 = new javax.swing.JRadioButton(); setLayout(new java.awt.GridBagLayout()); rangePanel.setLayout(new java.awt.GridBagLayout()); fromLb.setLabelFor(fromCombo); fromLb.setText(options.getMsg("edit_arith_op_from")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rangePanel.add(fromLb, gridBagConstraints); fromCombo.setToolTipText(options.getMsg("edit_arith_op_from_tooltip")); fromCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rangePanel.add(fromCombo, gridBagConstraints); toLb.setLabelFor(toCombo); toLb.setText(options.getMsg("edit_arith_op_to")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rangePanel.add(toLb, gridBagConstraints); toCombo.setToolTipText(options.getMsg("edit_arith_op_to_tooltip")); toCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rangePanel.add(toCombo, gridBagConstraints); withLb.setText(options.getMsg("edit_arith_op_with")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rangePanel.add(withLb, gridBagConstraints); withZeroChk.setText("0"); withZeroChk.setToolTipText(options.getMsg("edit_arith_op_with_tooltip")); withZeroChk.addActionListener(this); opPanel.add(withZeroChk); withOneChk.setText("1"); withOneChk.setToolTipText(options.getMsg("edit_arith_op_with_tooltip")); withOneChk.addActionListener(this); opPanel.add(withOneChk); withMinusOneChk.setText("-1"); withMinusOneChk.setToolTipText(options.getMsg("edit_arith_op_with_tooltip")); withMinusOneChk.addActionListener(this); opPanel.add(withMinusOneChk); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; rangePanel.add(opPanel, gridBagConstraints); fromListChk.setText(options.getMsg("edit_arith_op_fromList")); fromListChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rangePanel.add(fromListChk, gridBagConstraints); listTxt.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rangePanel.add(listTxt, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; add(rangePanel, gridBagConstraints); decPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_arith_op_decimals"))); decPanel.setLayout(new java.awt.GridBagLayout()); decGrp.add(opDec0); opDec0.setText(options.getMsg("edit_arith_op_dec0")); opDec0.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; decPanel.add(opDec0, gridBagConstraints); decGrp.add(opDec1); opDec1.setText(options.getMsg("edit_arith_op_dec1")); opDec1.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; decPanel.add(opDec1, gridBagConstraints); decGrp.add(opDec2); opDec2.setText(options.getMsg("edit_arith_op_dec2")); opDec2.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; decPanel.add(opDec2, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; add(decPanel, gridBagConstraints); } // //GEN-END:initComponents private TextListEditor buildNumList() { TextListEditor tle = new TextListEditor() { @Override protected Object editItem(Object currentValue, boolean newValue) { Object result = super.editItem(currentValue, newValue); if (result != null) { boolean ok = false; try { int v = Integer.parseInt(result.toString()); ok = Math.abs(v) < Operator.MAX_VALUE; } catch (NumberFormatException ex) { } if (!ok) { options.getMessages().showAlert(this, "BAD_NUMBER"); result = null; } } return result; } }; tle.setOptions(options); tle.setMaxItems(Operator.NUMLST); return tle; } public void setOperator(Operator op) { setInitializing(true); fromCombo.setSelectedIndex(op.limInf); toCombo.setSelectedIndex(op.limSup); withZeroChk.setSelected(op.wZero); withOneChk.setSelected(op.wOne); withMinusOneChk.setSelected(op.wMinusOne); if (op.numDec == 1) opDec1.setSelected(true); else if (op.numDec == 2) opDec2.setSelected(true); else opDec0.setSelected(true); fromListChk.setSelected(op.fromList > 0); StringBuilder sb = new StringBuilder(); for (int i = 0; i < op.fromList; i++) { sb.append(op.lst[i]).append(" "); } listTxt.setText(sb.substring(0).trim()); checkEnabled(); setInitializing(false); setModified(false); } public Operator getOperator() { Operator op = new Operator(); op.limInf = fromCombo.getSelectedIndex(); op.limSup = toCombo.getSelectedIndex(); op.wZero = withZeroChk.isSelected(); op.wOne = withOneChk.isSelected(); op.wMinusOne = withMinusOneChk.isSelected(); if (opDec1.isSelected()) op.numDec = 1; else if (opDec2.isSelected()) op.numDec = 2; else op.numDec = 0; op.fromList = 0; if (fromListChk.isSelected()) { StringTokenizer st = new StringTokenizer(listTxt.getText()); String str = ""; boolean alerted = false; while (st.hasMoreTokens() && op.fromList < Operator.NUMLST) { try { op.lst[op.fromList] = Integer.parseInt(st.nextToken()); op.fromList++; } catch (NumberFormatException ex) { if (!alerted) { options.getMessages().showAlert(this, "BAD_NUMBER"); alerted = true; } } } } return op; } protected void checkEnabled() { boolean fromList = fromListChk.isSelected(); listTxt.setEnabled(fromList); fromCombo.setEnabled(!fromList); toCombo.setEnabled(!fromList); withZeroChk.setEnabled(!fromList); withOneChk.setEnabled(!fromList); withMinusOneChk.setEnabled(!fromList); } @Override public boolean eventPerformed(EventObject ev) { checkEnabled(); return ev != null; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup decGrp; private javax.swing.JComboBox fromCombo; private javax.swing.JCheckBox fromListChk; private javax.swing.JTextField listTxt; private javax.swing.JRadioButton opDec0; private javax.swing.JRadioButton opDec1; private javax.swing.JRadioButton opDec2; private javax.swing.JPanel opPanel; private javax.swing.JPanel rangePanel; private javax.swing.JComboBox toCombo; private javax.swing.JCheckBox withMinusOneChk; private javax.swing.JCheckBox withOneChk; private javax.swing.JCheckBox withZeroChk; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/automation/tagreplace/000077500000000000000000000000001335566474600222655ustar00rootroot00000000000000src/author/edu/xtec/jclic/automation/tagreplace/TagReplaceEditor.java000066400000000000000000000032721335566474600263120ustar00rootroot00000000000000/* * File : TagReplaceEditor.java * Created : 02-oct-2006 18:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.tagreplace; import edu.xtec.jclic.automation.AutoContentProviderEditor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Options; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class TagReplaceEditor extends AutoContentProviderEditor { /** Creates a new instance of TagReplaceEditor */ public TagReplaceEditor(TagReplace tagReplace) { super(tagReplace); } private static Map panels = new HashMap(); public EditorPanel createEditorPanel(Options options) { EditorPanel panel = panels.get(options); if (panel == null) { panel = new TagReplaceEditorPanel(options); panels.put(options, panel); } return panel; } public Class getEditorPanelClass() { return TagReplaceEditorPanel.class; } } src/author/edu/xtec/jclic/automation/tagreplace/TagReplaceEditorPanel.form000066400000000000000000000353441335566474600273210ustar00rootroot00000000000000
src/author/edu/xtec/jclic/automation/tagreplace/TagReplaceEditorPanel.java000066400000000000000000000225571335566474600273010ustar00rootroot00000000000000/* * File : TagReplaceEditorPanel.java * Created : 02-oct-2006 18:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.tagreplace; import edu.xtec.jclic.Activity; import edu.xtec.jclic.automation.AutoContentProviderEditor; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.util.EventObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class TagReplaceEditorPanel extends EditorPanel { /** Creates new form TagReplaceEditorPanel */ public TagReplaceEditorPanel(Options options) { super(options); initComponents(); postInit(250, false, false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; tagPanel = new javax.swing.JPanel(); tagStartLb = new javax.swing.JLabel(); tagStartTx = new javax.swing.JTextField(); tagEndLb = new javax.swing.JLabel(); tagEndTx = new javax.swing.JTextField(); filePanel = new javax.swing.JPanel(); fileLb = new javax.swing.JLabel(); fileTx = new javax.swing.JTextField(); browseBtn = new javax.swing.JButton(); charsetLb = new javax.swing.JLabel(); charsetCombo = new javax.swing.JComboBox(); setLayout(new java.awt.GridBagLayout()); tagPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_tagRep_tags"))); tagPanel.setLayout(new java.awt.GridBagLayout()); tagStartLb.setLabelFor(tagStartTx); tagStartLb.setText(options.getMsg("edit_tagRep_tagStart")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); tagPanel.add(tagStartLb, gridBagConstraints); tagStartTx.setColumns(5); tagStartTx.setText(TagReplace.DEFAULT_TAG_START); tagStartTx.setToolTipText(options.getMsg("edit_tagRep_tagStart_tooltip")); tagStartTx.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); tagPanel.add(tagStartTx, gridBagConstraints); tagEndLb.setLabelFor(tagEndTx); tagEndLb.setText(options.getMsg("edit_tagRep_tagEnd")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); tagPanel.add(tagEndLb, gridBagConstraints); tagEndTx.setColumns(5); tagEndTx.setText(TagReplace.DEFAULT_TAG_END); tagEndTx.setToolTipText(options.getMsg("edit_tagRep_tagEnd_tooltip")); tagEndTx.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); tagPanel.add(tagEndTx, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(tagPanel, gridBagConstraints); filePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_tagRep_file"))); filePanel.setLayout(new java.awt.GridBagLayout()); fileLb.setLabelFor(fileTx); fileLb.setText(options.getMsg("edit_tagRep_fileName")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanel.add(fileLb, gridBagConstraints); fileTx.setText(TagReplace.DEFAULT_TAG_START); fileTx.setToolTipText(options.getMsg("edit_tagRep_fileName_tooltip")); fileTx.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanel.add(fileTx, gridBagConstraints); browseBtn.setText(options.getMsg("edit_tagRep_browseFile")); browseBtn.setToolTipText(options.getMsg("edit_tagRep_browseFile_tooltip")); browseBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanel.add(browseBtn, gridBagConstraints); charsetLb.setLabelFor(charsetCombo); charsetLb.setText(options.getMsg("edit_tagRep_charset")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanel.add(charsetLb, gridBagConstraints); charsetCombo.setModel( new javax.swing.DefaultComboBoxModel(new String[] { "UTF8", "UTF-16", "ISO8859_1", "ASCII" })); charsetCombo.setSelectedItem(TagReplace.DEFAULT_CHARSET); charsetCombo.setToolTipText(options.getMsg("edit_tagRep_charset_tooltip")); charsetCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanel.add(charsetCombo, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(filePanel, gridBagConstraints); } // //GEN-END:initComponents public boolean checkIfEditorValid(Editor e) { return e instanceof TagReplaceEditor; } public TagReplaceEditor getTagReplaceEditor() { return (TagReplaceEditor) getEditor(); } public TagReplace getTagReplace() { TagReplaceEditor tred = getTagReplaceEditor(); return tred == null ? null : (TagReplace) tred.getAutoContentProvider(); } protected void fillData() { TagReplace tr = getTagReplace(); tagStartTx.setText(tr == null ? "" : tr.tagStart); tagEndTx.setText(tr == null ? "" : tr.tagEnd); fileTx.setText(tr == null ? "" : tr.mapFileName); charsetCombo.setSelectedItem(tr == null ? TagReplace.DEFAULT_CHARSET : tr.fileCharset); setModified(false); } protected void saveData() { TagReplace tr = getTagReplace(); if (tr != null) { tr.tagStart = tagStartTx.getText(); tr.tagEnd = tagEndTx.getText(); tr.mapFileName = StrUtils.nullableString(fileTx.getText()); tr.fileCharset = (String) charsetCombo.getSelectedItem(); } } @Override public boolean eventPerformed(EventObject ev) { Object cmp = ev == null ? null : ev.getSource(); boolean result = (cmp != null); if (cmp == browseBtn) { selectTextFile(); } return result; } protected void selectTextFile() { TagReplaceEditor tred = getTagReplaceEditor(); if (tred != null) { Activity act = tred.getActivity(); if (act != null) { FileSystem fs = act.getProject().getFileSystem(); int[] filters = new int[] { Utils.TEXT_FF }; String[] files = fs.chooseFiles(null, false, filters, options, "edit_find_media", this, true, false); if (files != null && files.length > 0 && files[0] != null) { fileTx.setText(files[0]); setModified(true); } } } } @Override protected javax.swing.Icon getIcon() { return AutoContentProviderEditor.getIcon(); } @Override protected String getTitle() { return options.getMsg("edit_tagRep_title"); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton browseBtn; private javax.swing.JComboBox charsetCombo; private javax.swing.JLabel charsetLb; private javax.swing.JLabel fileLb; private javax.swing.JPanel filePanel; private javax.swing.JTextField fileTx; private javax.swing.JLabel tagEndLb; private javax.swing.JTextField tagEndTx; private javax.swing.JPanel tagPanel; private javax.swing.JLabel tagStartLb; private javax.swing.JTextField tagStartTx; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/bags/000077500000000000000000000000001335566474600167125ustar00rootroot00000000000000src/author/edu/xtec/jclic/bags/ActivityBagEditor.java000066400000000000000000000233361335566474600231410ustar00rootroot00000000000000/* * File : ActivityBagEditor.java * Created : 19-sep-2002 09:53 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.*; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Component; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.tree.MutableTreeNode; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class ActivityBagEditor extends Editor { public static ImageIcon icon; public static EditorAction newActivityBagElementAction; public static EditorAction copyActivityAttributesAction; public static boolean actionsCreated; private boolean initializing; private static NewActivityPanel newActivityPanel = null; /** Creates a new instance of ActivityBagEditor */ public ActivityBagEditor(ActivityBag ab) { super(ab); } protected void createChildren() { initializing = true; ActivityBag ab = getActivityBag(); if (ab != null) { int s = ab.size(); for (int i = 0; i < s; i++) { ab.elementAt(i).getEditor(this); } } initializing = false; } public EditorPanel createEditorPanel(Options options) { return new ActivityBagEditorPanel(options); } public Class getEditorPanelClass() { return ActivityBagEditorPanel.class; } @Override public String getTitleKey() { return "edit_activities"; } public ActivityBag getActivityBag() { return (ActivityBag) getUserObject(); } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/database.gif"); return icon; } @Override public javax.swing.Icon getIcon(boolean leaf, boolean expanded) { return getIcon(); } @Override public String toString() { return "Activity bag"; } public Options getOptions() { return getActivityBag().getProject().getBridge().getOptions(); } public JClicProjectEditor getProjectEditor() { return (JClicProjectEditor) getFirstParent(JClicProjectEditor.class); } public boolean createNewActivityBagElement(int index, Component dlgParent) { String actClassName = null, actName = null; // Modified: 14-09-2010 - suggested by Camille Manoury // On errors (empty class name, empty or repeated activity name...) prompt again while (true) { if (newActivityPanel == null) newActivityPanel = new NewActivityPanel(getOptions()); else newActivityPanel.setActivityName(null); if (!getOptions().getMessages().showInputDlg(dlgParent, newActivityPanel, "edit_act_newActivity")) return false; actClassName = newActivityPanel.gectActivityClassName(); if (actClassName == null) { getOptions().getMessages().showAlert(dlgParent, "edit_act_newActivity_error_noAct"); continue; } actName = newActivityPanel.getActivityName(); if (actName == null) { getOptions().getMessages().showAlert(dlgParent, "edit_act_newActivity_error_noName"); continue; } if (getActivityBag().getElementIndex(actName) >= 0) { getOptions().getMessages().showAlert(dlgParent, "edit_media_rename_exists"); continue; } break; } Activity act; try { act = Activity.getActivity(actClassName, getProjectEditor().getProject()); act.name = actName; } catch (Exception ex) { getOptions().getMessages().showErrorWarning(dlgParent, "edit_act_newActivity_error_creating", ex); return false; } org.jdom.Element e = act.getJDomElement(); if (e == null) { getOptions().getMessages().showErrorWarning(dlgParent, "edit_act_newActivity_error_creating", null); return false; } ActivityBagElement abe = new ActivityBagElement(act.getJDomElement()); ActivityBagElementEditor abeed = (ActivityBagElementEditor) abe.getEditor(null); if (index < 0) index = getChildCount(); else index = Math.min(index, getChildCount()); return insertEditor(abeed, true, index, true); } public void changeActivityClass(ActivityBagElementEditor abed, String newClassName) throws Exception { abed.collectData(); ActivityBagElement abe = abed.getActivityBagElement(); abed.forgetActivityEditor(); Activity act = Activity.getActivity(newClassName, getProjectEditor().getProject()); act.setProperties(abe.getData(), null); abe.setData(act.getJDomElement()); setModified(true); } @Override public void setActionsOwner() { allowDelete = allowCut = allowCopy = allowPaste = false; super.setActionsOwner(); if (actionsCreated) { newActivityBagElementAction.setActionOwner(this); } } @Override public void clearActionsOwner() { super.clearActionsOwner(); if (actionsCreated) { newActivityBagElementAction.setActionOwner(null); } } public static void createActions(Options options) { createBasicActions(options); if (!actionsCreated) { newActivityBagElementAction = new EditorAction("edit_act_newActivity", "icons/new_miniclic.png", "edit_act_newActivity_tooltip", options) { protected void doAction(Editor e) { Editor ch = null; if (e instanceof ActivityBagElementEditor) { ch = e; e = e.getEditorParent(); } if (e instanceof ActivityBagEditor) ((ActivityBagEditor) e).createNewActivityBagElement(e.getNearestIndex(ch, true), getComponentSrc()); } }; copyActivityAttributesAction = new EditorAction("edit_act_copyAttributes", "icons/copy_properties.gif", "edit_act_copyAttributes_tooltip", options) { protected void doAction(Editor e) { Editor ch = null; if (e instanceof ActivityBagElementEditor) { CopyActivityAttributesPanel catrp = new CopyActivityAttributesPanel(this.options, (ActivityBagElementEditor) e); catrp.showDialog(getComponentSrc()); } } }; actionsCreated = true; } } @Override public void insert(MutableTreeNode newChild, int childIndex) { super.insert(newChild, childIndex); if (!initializing) { ActivityBagElement abe = ((ActivityBagElementEditor) newChild).getActivityBagElement(); if (getActivityBag().getElementIndex(abe.getName()) >= 0) { String name = abe.getName(); int i = name.length() - 1; while (i >= 0 && Character.isDigit(name.charAt(i))) i--; name = name.substring(0, i + 1); if (!name.endsWith("_")) name = name + "_"; int suffix = 2; while (getActivityBag().getElementIndex(name + suffix) >= 0) suffix++; abe.getData().setAttribute(Activity.NAME, name + suffix); } getActivityBag().insertElementAt(abe, childIndex); } } @Override public void remove(int childIndex) { super.remove(childIndex); getActivityBag().removeElementAt(childIndex); } public boolean nameChanged(int type, String oldName, String newName) { boolean result = false; Enumeration en = children(); while (en.hasMoreElements()) result |= ((ActivityBagElementEditor) en.nextElement()).nameChanged(type, oldName, newName); return result; } public int checkOrphanElements(Options options, Component parent, boolean prompt) { int result = Messages.YES; List v = new ArrayList(); ActivityBagElement[] abel = getActivityBag().getElements(); ActivitySequenceEditor ased = getProjectEditor().getActivitySequenceEditor(); ActivitySequenceElement[] asel = ased.getActivitySequence().getElements(); for (int i = 0; i < abel.length; i++) { String actName = abel[i].getName(); int j; for (j = 0; j < asel.length; j++) { if (asel[j].getActivityName().equals(actName)) break; } if (j == asel.length) { v.add(actName); } } if (!v.isEmpty()) { boolean doIt = !prompt; if (!doIt) { Object[] object = new Object[] { options.getMsg("edit_project_orphanActivities"), v.size() > 10 ? (Object) (new javax.swing.JScrollPane(new javax.swing.JList(v.toArray()))) : (Object) v, options.getMsg("edit_project_orphanActivities_prompt"), }; result = options.getMessages().showQuestionDlgObj(parent, object, "edit_project_orphanActivities_title", "ync"); doIt = (result == Messages.YES); } if (doIt) { Iterator it = v.iterator(); while (it.hasNext()) { ased.createNewSequenceElement(it.next(), null, -1); } } } return result; } } src/author/edu/xtec/jclic/bags/ActivityBagEditorPanel.form000066400000000000000000000103271335566474600241370ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/ActivityBagEditorPanel.java000066400000000000000000000164501335566474600241200ustar00rootroot00000000000000/* * File : ProjectLibraryEditorPanel.java * Created : 10-jun-2002 16:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Options; import edu.xtec.util.SmallButton; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.FocusEvent; import java.util.HashMap; import java.util.Map; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.ListModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class ActivityBagEditorPanel extends EditorPanel implements ListSelectionListener { boolean modified; public ActivityBagElementEditor currentItem; protected Map editPanels; protected EditorPanel currentPanel; /** Creates new form ProjectLibraryEditorPanel */ public ActivityBagEditorPanel(Options options) { super(options); editPanels = new HashMap(); ActivityBagEditor.createActions(options); ActivityBagElementEditor.createActions(options); initComponents(); postInit(250, false, true); list.getSelectionModel().addListSelectionListener(this); setEnabled(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { javax.swing.JSplitPane split = new javax.swing.JSplitPane(); javax.swing.JScrollPane scroll = new javax.swing.JScrollPane(); scroll.getVerticalScrollBar().setUnitIncrement(16); list = new javax.swing.JList<>(); edit = new javax.swing.JPanel(); setLayout(new java.awt.BorderLayout()); list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); scroll.setViewportView(list); split.setLeftComponent(scroll); edit.setPreferredSize(new java.awt.Dimension(700, 600)); edit.setLayout(new java.awt.BorderLayout()); split.setRightComponent(edit); add(split, java.awt.BorderLayout.CENTER); } // //GEN-END:initComponents @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); list.setEnabled(enabled); if (currentPanel != null) currentPanel.setEnabled(enabled); } public boolean checkIfEditorValid(Editor e) { return e instanceof ActivityBagEditor; } protected ActivityBag getActivityBag() { if (editor == null) return null; else return ((ActivityBagEditor) editor).getActivityBag(); } public void fillData() { ActivityBagEditor abe = getActivityBagEditor(); list.setModel(abe == null ? new DefaultListModel() : abe.getListModel()); if (abe != null) abe.setListSelectionModel(list.getSelectionModel()); else if (currentPanel != null) { currentPanel.removeEditor(true); edit.remove(currentPanel); currentPanel = null; } } public void saveData() { ActivityBag ab = getActivityBag(); } @Override protected Icon getIcon() { return ActivityBagEditor.getIcon(); } @Override protected String getTitle() { return "Activity bag"; } ActivityBagEditor getActivityBagEditor() { return (ActivityBagEditor) getEditor(); } protected void currentItemChanged() { if (edit != null) { if (currentPanel != null) { currentPanel.removeEditor(true); } if (currentItem != null) { Class pc = currentItem.getEditorPanelClass(); EditorPanel ep = editPanels.get(pc); if (ep == null) { ep = currentItem.createEditorPanel(options); editPanels.put(pc, ep); } ep.attachEditor(currentItem.getActivityEditor(), true); if (currentPanel != ep) { if (currentPanel != null) edit.remove(currentPanel); edit.add(ep, BorderLayout.CENTER); edit.revalidate(); edit.repaint(); } currentPanel = ep; } } } public boolean editActivity(String activityName) { boolean result = false; if (activityName != null && activityName.length() > 0) { ListModel model = list.getModel(); int size = model.getSize(); for (int i = 0; i < model.getSize(); i++) { Object o = model.getElementAt(i); if (o != null && activityName.equals(o.toString())) { list.setSelectedIndex(i); list.ensureIndexIsVisible(i); result = true; break; } } } return result; } public void valueChanged(ListSelectionEvent ev) { if (ev != null && ev.getValueIsAdjusting()) return; ActivityBagEditor abe = getActivityBagEditor(); if (abe != null && currentItem != null && currentItem.getActivityEditor() != null) { currentItem.getActivityEditor().collectData(); currentItem.forgetActivityEditor(); } currentItem = null; int row = list.getSelectedIndex(); if (abe != null && row >= 0 && row < abe.getChildCount()) { currentItem = (ActivityBagElementEditor) abe.getChildAt(row); } currentItemChanged(); } @Override public void focusGained(FocusEvent focusEvent) { if (currentPanel != null) currentPanel.focusGained(focusEvent); else Editor.clearBasicActionsOwner(); } @Override public void focusLost(FocusEvent focusEvent) { if (currentPanel != null) currentPanel.focusLost(focusEvent); } @Override protected void addActionsTo(Container cnt) { cnt.add(new SmallButton(ActivityBagEditor.newActivityBagElementAction)); cnt.add(new SmallButton(ActivityBagElementEditor.testActivityAction)); cnt.add(new SmallButton(Editor.moveUpAction)); cnt.add(new SmallButton(Editor.moveDownAction)); cnt.add(new SmallButton(Editor.copyAction)); cnt.add(new SmallButton(Editor.cutAction)); cnt.add(new SmallButton(Editor.pasteAction)); cnt.add(new SmallButton(Editor.deleteAction)); cnt.add(new SmallButton(ActivityBagEditor.copyActivityAttributesAction)); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel edit; private javax.swing.JList list; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/bags/ActivityBagElementEditor.java000066400000000000000000000152541335566474600244530ustar00rootroot00000000000000/* * File : ActivityBagElementEditor.java * Created : 22-apr-2003 16:29 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditor; import edu.xtec.jclic.TestPlayerContainer; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorAction; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.project.JClicProject; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.Options; import javax.swing.Icon; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ActivityBagElementEditor extends Editor { public static ImageIcon icon; public static EditorAction testActivityAction; public static boolean actionsCreated; /** Creates a new instance of ActivityBagElementEditor */ public ActivityBagElementEditor(ActivityBagElement abe) { super(abe); } protected void createChildren() { } public EditorPanel createEditorPanel(Options options) { ActivityEditor ae = getActivityEditor(); return (ae == null ? null : ae.createEditorPanel(options)); } public Class getEditorPanelClass() { ActivityEditor ae = getActivityEditor(); return (ae == null ? null : ae.getEditorPanelClass()); } public ActivityBagElement getActivityBagElement() { return (ActivityBagElement) getUserObject(); } public ActivityEditor getActivityEditor() { ActivityEditor ae = getChildCount() > 0 ? (ActivityEditor) getFirstChild() : null; if (ae == null) { try { ActivityBagElement abel = getActivityBagElement(); JClicProject prj = ((ActivityBagEditor) getEditorParent()).getActivityBag().getProject(); Activity act = Activity.getActivity(abel.getData(), prj); ae = (ActivityEditor) act.getEditor(this); } catch (Exception ex) { System.err.println("Error loading activity!\n"); ex.printStackTrace(System.err); } } return ae; } public void changeActivityClass(String newClassName) throws Exception { ((ActivityBagEditor) getEditorParent()).changeActivityClass(this, newClassName); } public void forgetActivityEditor() { if (getChildCount() > 0) { ActivityEditor ae = (ActivityEditor) getFirstChild(); if (ae.isModified()) ae.saveData(); removeAllChildren(); } } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/miniclic.png"); return icon; } @Override public javax.swing.Icon getIcon(boolean leaf, boolean expanded) { return getIcon(); } @Override public String toString() { return getActivityBagElement().getName(); } @Override public boolean canBeParentOf(Editor e) { return (e instanceof ActivityEditor); } @Override public boolean canBeSiblingOf(Editor e) { return (e instanceof ActivityBagElementEditor); } @Override protected boolean canClone() { return true; } @Override protected Editor getClone() throws Exception { ActivityBagElement abe = (ActivityBagElement) getActivityBagElement().clone(); return abe.getEditor(null); } protected void setActionsFlag() { allowDelete = true; allowCut = true; allowCopy = true; allowPaste = true; } @Override protected boolean delete(boolean changeSelection) { ActivityEditor aed = getActivityEditor(); String activityName = aed.getActivity().name; JClicProjectEditor projectEditor = aed.getProjectEditor(); boolean result = super.delete(changeSelection); if (result) { projectEditor.getActivitySequenceEditor().removeElementsWith(activityName); } return result; } @Override public void setActionsOwner() { setActionsFlag(); super.setActionsOwner(); if (actionsCreated) { testActivityAction.setActionOwner(this); ActivityBagEditor.newActivityBagElementAction.setActionOwner(this); ActivityBagEditor.copyActivityAttributesAction.setActionOwner(this); } } @Override public void clearActionsOwner() { super.clearActionsOwner(); testActivityAction.setActionOwner(null); ActivityBagEditor.newActivityBagElementAction.setActionOwner(getEditorParent()); ActivityBagEditor.copyActivityAttributesAction.setActionOwner(null); } public void testActivity() { ActivityEditor ae = getActivityEditor(); ae.collectData(); JClicProjectEditor pe = ae.getProjectEditor(); if (pe != null) { TestPlayerContainer tpc = pe.getTestPlayerContainer(); if (tpc != null && tpc.getTestPlayer() != null) { String activityName = ae.getActivity().name; ActivitySequenceEditor ased = pe.getActivitySequenceEditor(); if (ased.getActivitySequence().getElementByActivityName(activityName) == null) { ased.createNewSequenceElement(activityName, null, -1); } pe.collectData(); pe.getProject().skin = null; pe.getProject().realize(null, tpc.getTestPlayer()); tpc.getTestPlayer().load(null, null, activityName, null); tpc.test(); } } } public static void createActions(Options options) { createBasicActions(options); if (!actionsCreated) { testActivityAction = new EditorAction("edit_act_testAction", "icons/play.gif", "edit_act_testAction_tooltip", options) { protected void doAction(Editor e) { if (e instanceof ActivityBagElementEditor) { ((ActivityBagElementEditor) e).testActivity(); } else if (e instanceof ActivitySequenceElementEditor) { ((ActivitySequenceElementEditor) e).testActivity(); } } }; actionsCreated = true; } } public boolean nameChanged(int type, String oldName, String newName) { boolean result = false; boolean hasChild = getChildCount() > 0; ActivityEditor ae = getActivityEditor(); if (ae != null) result = ae.nameChanged(type, oldName, newName); if (!hasChild) forgetActivityEditor(); return result; } } src/author/edu/xtec/jclic/bags/ActivitySequenceEditor.java000066400000000000000000000212001335566474600242040ustar00rootroot00000000000000/* * File : ActivitySequenceEditor.java * Created : 08-apr-2003 12:51 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Constants; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorAction; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.ListComboModel; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import java.util.Enumeration; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JTextField; import javax.swing.ListModel; import javax.swing.tree.MutableTreeNode; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ActivitySequenceEditor extends Editor { public static ImageIcon icon; protected DefaultListModel tagList; private boolean initializing; public static boolean actionsCreated; public static EditorAction newActivitySequenceElementAction; /** Creates a new instance of ActivitySequenceEditor */ public ActivitySequenceEditor(ActivitySequence ac) { super(ac); } protected void createChildren() { initializing = true; ActivitySequence as = getActivitySequence(); int n = as.getSize(); for (int i = 0; i < n; i++) as.getElement(i, false).getEditor(this); initializing = false; } public EditorPanel createEditorPanel(Options options) { return new ActivitySequenceEditorPanel(options); } public Class getEditorPanelClass() { return ActivitySequenceEditorPanel.class; } @Override public String getTitleKey() { return "edit_sequences"; } public ActivitySequence getActivitySequence() { return (ActivitySequence) getUserObject(); } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/sequence.gif"); return icon; } @Override public javax.swing.Icon getIcon(boolean leaf, boolean expanded) { return getIcon(); } @Override public String toString() { return "Activity sequence"; } public Options getOptions() { return getActivitySequence().getProject().getBridge().getOptions(); } public JClicProjectEditor getProjectEditor() { return (JClicProjectEditor) getFirstParent(JClicProjectEditor.class); } public void removeElementsWith(String activityName) { String act = StrUtils.nullableString(activityName); if (act != null) { act = FileSystem.stdFn(act); int i = 0; int numElements = getChildCount(); while (i < numElements) { numElements = getChildCount(); for (i = 0; i < numElements; i++) { ActivitySequenceElementEditor asee = (ActivitySequenceElementEditor) getChildAt(i); if (act.equals(asee.getActivitySequenceElement().getActivityName())) { remove(i); break; } } } } } public boolean createNewSequenceElement(int index, boolean prompt, Component dlgParent) { String act = null, tag = null; Messages msg = getOptions().getMessages(); if (prompt) { ListModel lm = getProjectEditor().getActivityBagEditor().getListModel(); if (lm.getSize() == 0) { msg.showAlert(dlgParent, "edit_seq_newElement_error_emptyList"); return false; } JComboBox actCombo = new JComboBox( new ListComboModel(getProjectEditor().getActivityBagEditor().getListModel())); actCombo.setToolTipText(msg.get("edit_seq_activity_tooltip")); JTextField tagField = new JTextField(); tagField.setToolTipText(msg.get("edit_seq_tag_tooltip")); JComponent[] prompt_objects = new JComponent[] { actCombo, tagField }; String[] prompt_keys = new String[] { "edit_seq_activity", "edit_seq_tag" }; String[] prompt_msg = new String[] { "edit_seq_newElement_msg" }; if (!msg.showInputDlg(dlgParent, prompt_msg, prompt_keys, prompt_objects, "edit_seq_newElement")) return false; act = StrUtils.nullableString(actCombo.getSelectedItem()); tag = StrUtils.nullableString(tagField.getText()); } if (act == null) { msg.showAlert(dlgParent, "edit_seq_newElement_error_noAct"); return false; } return createNewSequenceElement(act, tag, index); } public boolean createNewSequenceElement(String actName, String tag, int index) { ActivitySequenceElement ase = new ActivitySequenceElement(actName); if (tag != null) ase.setTag(tag); ActivitySequenceElementEditor aseed = (ActivitySequenceElementEditor) ase.getEditor(null); if (index < 0) index = getChildCount(); else index = Math.min(index, getChildCount()); return insertEditor(aseed, true, index, true); } public ListModel getTagList() { if (tagList == null) { tagList = new DefaultListModel(); Enumeration en = children(); while (en.hasMoreElements()) { ActivitySequenceElementEditor asee = (ActivitySequenceElementEditor) en.nextElement(); String tag = StrUtils.nullableString(asee.getActivitySequenceElement().getTag()); if (tag != null) tagList.addElement(tag); } } return tagList; } public String getTag(String tag) { String result = null; getTagList(); Enumeration en = tagList.elements(); while (en.hasMoreElements() && result == null) { String s = (String) en.nextElement(); if (s.equals(tag)) result = s; } return result; } @Override public void insert(MutableTreeNode newChild, int childIndex) { super.insert(newChild, childIndex); if (!initializing) { ActivitySequenceElementEditor asee = (ActivitySequenceElementEditor) newChild; getActivitySequence().insertElementAt(asee.getActivitySequenceElement(), childIndex); if (tagList != null) { String tag = asee.getTag(); if (tag != null && getTag(tag) == null) { tagList.addElement(tag); } } } } @Override public void remove(int childIndex) { ActivitySequenceElementEditor asee = (ActivitySequenceElementEditor) getChildAt(childIndex); super.remove(childIndex); getActivitySequence().remove(asee.getActivitySequenceElement()); if (tagList != null && asee.getTag() != null) { String s = getTag(asee.getTag()); if (s != null) tagList.removeElement(s); } } public boolean nameChanged(int type, String oldName, String newName) { boolean result = false; if ((type & (Constants.T_ACTIVITY | Constants.T_SEQUENCE)) != 0) { Enumeration en = children(); while (en.hasMoreElements()) result |= ((ActivitySequenceElementEditor) en.nextElement()).nameChanged(type, oldName, newName); } return result; } @Override public void setActionsOwner() { allowDelete = allowCut = allowCopy = allowPaste = false; super.setActionsOwner(); if (actionsCreated) { newActivitySequenceElementAction.setActionOwner(this); } } @Override public void clearActionsOwner() { super.clearActionsOwner(); if (actionsCreated) { newActivitySequenceElementAction.setActionOwner(null); } } public static void createActions(Options options) { createBasicActions(options); if (!actionsCreated) { newActivitySequenceElementAction = new EditorAction("edit_seq_newElement", "icons/sequence_new.gif", "edit_seq_newElement_tooltip", options) { protected void doAction(Editor e) { Editor ch = null; if (e instanceof ActivitySequenceElementEditor) { ch = e; e = e.getEditorParent(); } if (e instanceof ActivitySequenceEditor) ((ActivitySequenceEditor) e).createNewSequenceElement(e.getNearestIndex(ch, true), true, getComponentSrc()); } }; actionsCreated = true; } } } src/author/edu/xtec/jclic/bags/ActivitySequenceEditorPanel.form000066400000000000000000000076731335566474600252300ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/ActivitySequenceEditorPanel.java000066400000000000000000000263521335566474600252010ustar00rootroot00000000000000/* * File : ActivitySequenceEditorPanel.java * Created : 10-jun-2002 16:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import edu.xtec.util.SmallButton; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Font; import java.awt.event.FocusEvent; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ActivitySequenceEditorPanel extends EditorPanel implements ListSelectionListener, ListDataListener { public static final int ICON_WIDTH = 20; public ActivitySequenceElementEditor currentItem; protected SeqTableModel tableModel; /** Creates new form ProjectLibraryEditorPanel */ public ActivitySequenceEditorPanel(Options options) { super(options); tableModel = new SeqTableModel(); ActivitySequenceEditor.createActions(options); ActivitySequenceElementEditor.createActions(options); initComponents(); initTable(); postInit(250, false, true); setEnabled(false); } private void initTable() { TableColumn column; for (int i = 2; i < 4; i++) { column = seqTable.getColumnModel().getColumn(i); column.setMaxWidth(ICON_WIDTH); column.setPreferredWidth(ICON_WIDTH); column.setWidth(ICON_WIDTH); column.setHeaderRenderer(headerIcoCellRenderer); } seqTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); seqTable.getSelectionModel().addListSelectionListener(ActivitySequenceEditorPanel.this); } private TableCellRenderer headerIcoCellRenderer = new TableCellRenderer() { JLabel lb; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (lb == null) { lb = new JLabel(); Object o = UIManager.get("TableHeader.background"); if (o instanceof Color) lb.setBackground((Color) o); o = UIManager.get("TableHeader.cellBorder"); if (o instanceof Border) lb.setBorder((Border) o); o = UIManager.get("TableHeader.font"); if (o instanceof Font) lb.setFont((Font) o); o = UIManager.get("TableHeader.foreground"); if (o instanceof Color) lb.setForeground((Color) o); } if ("prev".equals(value)) { lb.setText(""); lb.setIcon(ResourceManager.getImageIcon("icons/prev.gif")); lb.setToolTipText(options.getMsg("action_prev_tooltip")); } else if ("next".equals(value)) { lb.setText(""); lb.setIcon(ResourceManager.getImageIcon("icons/next.gif")); lb.setToolTipText(options.getMsg("action_next_tooltip")); } return lb; } }; protected void currentItemChanged() { if (!isInitializing()) { ActivitySequenceElementEditorPanel asep = (ActivitySequenceElementEditorPanel) edit; asep.attachEditor(currentItem, true); } } public void valueChanged(ListSelectionEvent ev) { if (ev.getValueIsAdjusting() || getActivitySequenceEditor() == null) return; ActivitySequenceElementEditorPanel asep = (ActivitySequenceElementEditorPanel) edit; int row = seqTable.getSelectionModel().getAnchorSelectionIndex(); if (row >= 0 && row < getActivitySequenceEditor().getChildCount()) { currentItem = (ActivitySequenceElementEditor) getActivitySequenceEditor().getChildAt(row); } else currentItem = null; currentItemChanged(); } public void contentsChanged(ListDataEvent e) { if (tableModel != null) tableModel.fireTableDataChanged(); } public void intervalAdded(ListDataEvent e) { if (tableModel != null) tableModel.fireTableDataChanged(); } public void intervalRemoved(ListDataEvent e) { if (tableModel != null) tableModel.fireTableDataChanged(); } @Override public void focusGained(FocusEvent focusEvent) { ((ActivitySequenceElementEditorPanel) edit).focusGained(focusEvent); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JScrollPane scroll; split = new javax.swing.JSplitPane(); scroll = new javax.swing.JScrollPane(); seqTable = new ActivitySequenceTable(tableModel); edit = new ActivitySequenceElementEditorPanel(options); setLayout(new java.awt.BorderLayout()); scroll.setMinimumSize(new java.awt.Dimension(300, 50)); scroll.setViewportView(seqTable); split.setLeftComponent(scroll); split.setRightComponent(edit); add(split, java.awt.BorderLayout.CENTER); } // GEN-END:initComponents public boolean checkIfEditorValid(Editor e) { return e instanceof ActivitySequenceEditor; } protected ActivitySequence getActivitySequence() { if (editor == null) return null; else return ((ActivitySequenceEditor) editor).getActivitySequence(); } /* * public void clear() { super.clear(); ActivitySequenceElementEditorPanel * asep=(ActivitySequenceElementEditorPanel)edit; asep.removeEditor(true); * ActivitySequenceEditor ased=getActivitySequenceEditor(); if(ased!=null) * ased.setListSelectionModel(null); } */ @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); edit.setEnabled(enabled); seqTable.setEnabled(enabled); } public void fillData() { ActivitySequenceEditor ased = getActivitySequenceEditor(); if (ased == null) { ActivitySequenceElementEditorPanel asep = (ActivitySequenceElementEditorPanel) edit; asep.removeEditor(true); } else { ased.setListSelectionModel(seqTable.getSelectionModel()); if (ased.getChildCount() > 0) { seqTable.getSelectionModel().setSelectionInterval(0, 0); ActivitySequenceElementEditorPanel asep = (ActivitySequenceElementEditorPanel) edit; asep.attachEditor((Editor) ased.getChildAt(0), true); } tableModel.fireTableDataChanged(); } } public void saveData() { ActivitySequence as = getActivitySequence(); } /* * public boolean isModified(){ boolean result=super.isModified(); if(!result){ * ActivitySequenceElementEditorPanel * asep=(ActivitySequenceElementEditorPanel)edit; result=asep.isModified(); } * return result; } */ @Override protected Icon getIcon() { return ActivitySequenceEditor.getIcon(); } @Override protected String getTitle() { return "Activity sequence"; } public ActivitySequenceEditor getActivitySequenceEditor() { return (ActivitySequenceEditor) getEditor(); } @Override protected void setEditor(Editor e) { if (getEditor() != null) getEditor().getListModel().removeListDataListener(this); super.setEditor(e); if (getEditor() != null) getEditor().getListModel().addListDataListener(this); } @Override protected void addActionsTo(Container cnt) { cnt.add(new SmallButton(ActivitySequenceEditor.newActivitySequenceElementAction)); cnt.add(new SmallButton(ActivityBagElementEditor.testActivityAction)); cnt.add(new SmallButton(Editor.moveUpAction)); cnt.add(new SmallButton(Editor.moveDownAction)); cnt.add(new SmallButton(Editor.copyAction)); cnt.add(new SmallButton(Editor.cutAction)); cnt.add(new SmallButton(Editor.pasteAction)); cnt.add(new SmallButton(Editor.deleteAction)); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel edit; protected javax.swing.JTable seqTable; private javax.swing.JSplitPane split; // End of variables declaration//GEN-END:variables class SeqTableModel extends AbstractTableModel { public boolean drawDivider(int row) { boolean result = false; ActivitySequenceEditor ase = getActivitySequenceEditor(); if (ase != null) { ActivitySequenceElementEditor ased1 = (ActivitySequenceElementEditor) ase.getChildAt(row); ActivitySequenceElementEditor ased2 = (row == ase.getChildCount() - 1) ? null : (ActivitySequenceElementEditor) ase.getChildAt(row + 1); result = (ased1 != null && ased1.getActivitySequenceElement().fwdJump != null) || (ased2 != null && ased2.getActivitySequenceElement().backJump != null); } return result; } public int getRowCount() { Editor e = getEditor(); return e == null ? 0 : e.getChildCount(); } public int getColumnCount() { return 4; } @Override public Class getColumnClass(int columnIndex) { if (columnIndex == 2 || columnIndex == 3) return ImageIcon.class; else return java.lang.String.class; } public Object getValueAt(int row, int column) { Object result = null; ActivitySequenceEditor ase = getActivitySequenceEditor(); if (ase != null) { ActivitySequenceElementEditor ased = (ActivitySequenceElementEditor) ase.getChildAt(row); if (ased != null) { switch (column) { case 0: result = ased.getTag(); break; case 1: result = ased.getActivitySequenceElement().getActivityName(); break; case 2: case 3: result = ActivitySequenceElementEditor.getElementIcon(ased.getActivitySequenceElement(), column == 3); break; /* * case 4: result=ActivitySequenceElementEditor.getElementJumpDescription(asel); * break; */ } } } return result; } @Override public String getColumnName(int column) { String result = ""; switch (column) { case 0: result = options.getMsg("edit_seq_tag_header"); break; case 1: result = options.getMsg("edit_seq_activity_header"); break; case 2: result = "prev"; break; case 3: result = "next"; break; } return result; } } } src/author/edu/xtec/jclic/bags/ActivitySequenceElementEditor.java000066400000000000000000000214631335566474600255310ustar00rootroot00000000000000/* * File : ActivitySequenceElementEditor.java * Created : 08-apr-2003 16:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Constants; import edu.xtec.jclic.TestPlayerContainer; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import edu.xtec.util.StrUtils; import javax.swing.Icon; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class ActivitySequenceElementEditor extends Editor { protected static ImageIcon icon; public static boolean actionsCreated = false; protected ActivitySequence activitySequence; /** Creates a new instance of ActivitySequenceElementEditor */ public ActivitySequenceElementEditor(ActivitySequenceElement el) { super(el); } protected void createChildren() { } public Class getEditorPanelClass() { return ActivitySequenceElementEditorPanel.class; } public EditorPanel createEditorPanel(Options options) { return new ActivitySequenceElementEditorPanel(options); } public ActivitySequenceElement getActivitySequenceElement() { return (ActivitySequenceElement) getFirstObject(ActivitySequenceElement.class); } public String getTag() { ActivitySequenceElement ase = getActivitySequenceElement(); return StrUtils.nullableString(ase.getTag()); } protected void saveData() { } /* * protected boolean delete(boolean changeSelection){ ActivitySequence * as=getActivitySequenceElement().getParent(); boolean * result=super.delete(changeSelection); if(result && as!=null) * as.remove(getActivitySequenceElement()); return result; } */ @Override protected boolean canClone() { return true; } @Override protected Editor getClone() throws Exception { ActivitySequenceElement asel = (ActivitySequenceElement) getActivitySequenceElement().clone(); return asel.getEditor(null); } protected void setActionsFlag() { allowDelete = true; allowCut = true; allowCopy = true; allowPaste = true; } @Override public void setActionsOwner() { setActionsFlag(); super.setActionsOwner(); /* * if(basicActionsCreated){ setActionsFlag(); boolean eUp=false, eDown=false; * ActivitySequence as=getActivitySequenceElement().getParent(); if(as!=null){ * int i=as.getElementIndex(getActivitySequenceElement()); eUp=i>0; * eDown=i= 0) { TestPlayerContainer tpc = pe.getTestPlayerContainer(); if (tpc != null && tpc.getTestPlayer() != null) { tpc.getTestPlayer().load(null, Integer.toString(item), null, null); tpc.test(); } } } public static void createActions(Options options) { ActivityBagElementEditor.createActions(options); actionsCreated = true; } /* * public boolean moveUp(boolean updateSelection){ boolean * result=super.moveUp(updateSelection); if(result){ ActivitySequenceElement * ase=getActivitySequenceElement(); ActivitySequence as=ase.getParent(); * if(as!=null){ int index=as.getElementIndex(ase); if(index>0){ as.remove(ase); * as.insertElementAt(ase, index-1); if(updateSelection) select(); } } } return * result; } * * public boolean moveDown(boolean updateSelection){ boolean * result=super.moveDown(updateSelection); if(result){ ActivitySequenceElement * ase=getActivitySequenceElement(); ActivitySequence as=ase.getParent(); * if(as!=null && ase!=null){ int index=as.getElementIndex(ase); * if(index 0) { StringBuilder sb = new StringBuilder(100); if (result != null && result.length() > 0) sb.append(result).append(" "); sb.append("* ").append(r2); result = sb.substring(0); } } return result; } public boolean nameChanged(int type, String oldName, String newName) { boolean result = false; ActivitySequenceElement ase = getActivitySequenceElement(); if ((type & Constants.T_ACTIVITY) != 0 && oldName.equals(ase.getActivityName())) { ase.setActivityName(newName); setModified(true); result = true; } if ((type & Constants.T_SEQUENCE) != 0) { if (oldName.equals(ase.getTag())) { ase.setTag(newName); result = true; } if (ase.fwdJump != null) { result |= jumpInfoNameChanged(ase.fwdJump, oldName, newName) | jumpInfoNameChanged(ase.fwdJump.upperJump, oldName, newName) | jumpInfoNameChanged(ase.fwdJump.lowerJump, oldName, newName); } if (ase.backJump != null) { result |= jumpInfoNameChanged(ase.backJump, oldName, newName) | jumpInfoNameChanged(ase.backJump.upperJump, oldName, newName) | jumpInfoNameChanged(ase.backJump.lowerJump, oldName, newName); } if (result) setModified(true); } return result; } private boolean jumpInfoNameChanged(JumpInfo ji, String oldName, String newName) { boolean result = false; if (ji != null && ji.action == JumpInfo.JUMP && ji.projectPath == null && oldName.equals(ji.sequence)) { ji.sequence = newName; result = true; } return result; } } src/author/edu/xtec/jclic/bags/ActivitySequenceElementEditorPanel.form000066400000000000000000001215761335566474600265410ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/ActivitySequenceElementEditorPanel.java000066400000000000000000000764131335566474600265160ustar00rootroot00000000000000/* * File : ActivitySequenceElementEditorPanel.java * Created : 08-apr-2003 17:24 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.beans.NullableObject; import edu.xtec.jclic.beans.SmallIntEditor; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.ListComboModel; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import edu.xtec.util.StrUtils; import java.awt.Component; import java.awt.Container; import java.util.EventObject; import javax.swing.Icon; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JTextField; import javax.swing.ListModel; import javax.swing.event.DocumentEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class ActivitySequenceElementEditorPanel extends EditorPanel { String[] fwdOptions, backOptions; Icon[] fwdIcons, backIcons; protected ListComboModel actModel, jmpTagModel; protected JComboBox tagCombo; protected JTextField prjEdit; protected JComponent[] prompt_objects; protected String[] prompt_keys, prompt_msg; /** Creates new form ActivitySequenceElementEditorPanel */ public ActivitySequenceElementEditorPanel(Options options) { super(options); initObjects(); initComponents(); postInit(250, false, false); setEnabled(false); } private static final String[] FWD_OPTIONS_KEYS = { "edit_seq_action_fwd", "edit_seq_action_jump", "edit_seq_action_stop", "edit_seq_action_return", "edit_seq_action_exit" }, FWD_OPTIONS_ICONS = { "seq_next", "seq_next_jump", "seq_next_stop", "seq_next_return", "seq_exit" }, BACK_OPTIONS_KEYS = { "edit_seq_action_back", "edit_seq_action_jump", "edit_seq_action_stop", "edit_seq_action_return", "edit_seq_action_exit" }, BACK_OPTIONS_ICONS = { "seq_prev", "seq_prev_jump", "seq_prev_stop", "seq_prev_return", "seq_exit" }; private void initObjects() { int l = FWD_OPTIONS_KEYS.length; fwdOptions = new String[l]; fwdIcons = new Icon[l]; backOptions = new String[l]; backIcons = new Icon[l]; for (int i = 0; i < FWD_OPTIONS_KEYS.length; i++) { fwdOptions[i] = options.getMsg(FWD_OPTIONS_KEYS[i]); fwdIcons[i] = ResourceManager.getImageIcon("icons/" + FWD_OPTIONS_ICONS[i] + ".gif"); backOptions[i] = options.getMsg(BACK_OPTIONS_KEYS[i]); backIcons[i] = ResourceManager.getImageIcon("icons/" + BACK_OPTIONS_ICONS[i] + ".gif"); } tagCombo = new JComboBox(); tagCombo.setEditable(true); tagCombo.addActionListener(this); prjEdit = new JTextField(); prompt_objects = new JComponent[] { tagCombo, prjEdit }; prompt_keys = new String[] { "edit_seq_tag", "edit_seq_project" }; prompt_msg = new String[] { "edit_seq_jump_msg" }; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; mainPanel = new javax.swing.JPanel(); javax.swing.JLabel actLabel = new javax.swing.JLabel(); actCombo = new javax.swing.JComboBox<>(); editActBtn = new javax.swing.JButton(); editActBtn.addActionListener(this); javax.swing.JLabel tagLabel = new javax.swing.JLabel(); tagText = new javax.swing.JTextField(); javax.swing.JLabel descLabel = new javax.swing.JLabel(); scroll = new javax.swing.JScrollPane(); descText = new javax.swing.JTextArea(); javax.swing.JPanel fwdPanel = new javax.swing.JPanel(); javax.swing.JLabel fwIcon = new javax.swing.JLabel(); fwdEnabledChk = new javax.swing.JCheckBox(); javax.swing.JLabel fwdActionLb = new javax.swing.JLabel(); fwdActionCombo = new javax.swing.JComboBox(fwdOptions); fwdJumpBtn = new javax.swing.JButton(); fwdJumpLb = new javax.swing.JLabel(); autoChk = new javax.swing.JCheckBox(); javax.swing.JLabel delayLabel = new javax.swing.JLabel(); delayEditor = new edu.xtec.jclic.beans.SmallIntEditor(); javax.swing.JPanel condJumpPanel = new javax.swing.JPanel(); javax.swing.JLabel upperLb = new javax.swing.JLabel(); upperBtn = new CondJumpBtn(true); javax.swing.JLabel lowerLb = new javax.swing.JLabel(); lowerBtn = new CondJumpBtn(false); javax.swing.JPanel backPanel = new javax.swing.JPanel(); javax.swing.JLabel bkIcon = new javax.swing.JLabel(); backEnabledChk = new javax.swing.JCheckBox(); javax.swing.JLabel backActionLb = new javax.swing.JLabel(); backActionCombo = new javax.swing.JComboBox(backOptions); backJumpBtn = new javax.swing.JButton(); backJumpLb = new javax.swing.JLabel(); javax.swing.JLabel spacer = new javax.swing.JLabel(); setLayout(new java.awt.BorderLayout()); mainPanel.setLayout(new java.awt.GridBagLayout()); actLabel.setText(options.getMsg("edit_seq_activity")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(actLabel, gridBagConstraints); actCombo.setToolTipText(options.getMsg("edit_seq_activity_tooltip")); actCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(actCombo, gridBagConstraints); editActBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/miniclic.png"))); // NOI18N editActBtn.setToolTipText(options.getMsg("edit_act_editActivity_tooltip")); editActBtn.setText(options.getMsg("edit_act_editActivity")); editActBtn.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(editActBtn, gridBagConstraints); tagLabel.setText(options.getMsg("edit_seq_tag")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(tagLabel, gridBagConstraints); tagText.setToolTipText(options.getMsg("edit_seq_tag_tooltip")); tagText.setPreferredSize(new java.awt.Dimension(130, 21)); tagText.setMinimumSize(new java.awt.Dimension(130, 21)); tagText.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(tagText, gridBagConstraints); descLabel.setText(options.getMsg("edit_seq_description")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(descLabel, gridBagConstraints); scroll.setPreferredSize(new java.awt.Dimension(200, 60)); scroll.setMinimumSize(new java.awt.Dimension(200, 40)); descText.setWrapStyleWord(true); descText.setToolTipText(options.getMsg("edit_seq_description_tooltip")); descText.setLineWrap(true); descText.setRows(2); descText.getDocument().addDocumentListener(this); scroll.setViewportView(descText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(scroll, gridBagConstraints); fwdPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_seq_arrow_fwd"))); fwdPanel.setLayout(new java.awt.GridBagLayout()); fwIcon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/next.gif"))); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); fwdPanel.add(fwIcon, gridBagConstraints); fwdEnabledChk.setToolTipText(options.getMsg("edit_seq_button_enabled_tooltip")); fwdEnabledChk.setText(options.getMsg("edit_seq_button_enabled")); fwdEnabledChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); fwdPanel.add(fwdEnabledChk, gridBagConstraints); fwdActionLb.setText(options.getMsg("edit_seq_action")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); fwdPanel.add(fwdActionLb, gridBagConstraints); fwdActionCombo.setToolTipText(options.getMsg("edit_seq_action_tooltip_fw")); fwdActionCombo.setRenderer(new edu.xtec.util.CustomListCellRenderer(fwdOptions, fwdIcons)); fwdActionCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); fwdPanel.add(fwdActionCombo, gridBagConstraints); fwdJumpBtn.setToolTipText(options.getMsg("edit_seq_jump_tooltip")); fwdJumpBtn.setText("..."); fwdJumpBtn.setMargin(new java.awt.Insets(0, 3, 0, 3)); fwdJumpBtn.setEnabled(false); fwdJumpBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); fwdPanel.add(fwdJumpBtn, gridBagConstraints); fwdJumpLb.setText(" "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); fwdPanel.add(fwdJumpLb, gridBagConstraints); autoChk.setText(options.getMsg("edit_seq_auto")); autoChk.setToolTipText(options.getMsg("edit_seq_auto_tooltip")); autoChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); fwdPanel.add(autoChk, gridBagConstraints); delayLabel.setText(options.getMsg("edit_seq_delay")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); fwdPanel.add(delayLabel, gridBagConstraints); delayEditor.setToolTipText(options.getMsg("edit_seq_delay_tooltip")); delayEditor.setMax(999); delayEditor.setMin(1); delayEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); fwdPanel.add(delayEditor, gridBagConstraints); condJumpPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_seq_condJump"))); condJumpPanel.setToolTipText(options.getMsg("edit_seq_condJump_tooltip")); condJumpPanel.setLayout(new java.awt.GridBagLayout()); upperLb.setLabelFor(upperBtn); upperLb.setText(options.getMsg("edit_seq_condJump_upper")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); condJumpPanel.add(upperLb, gridBagConstraints); upperBtn.setToolTipText(options.getMsg("edit_seq_condJump_upper_tooltip")); upperBtn.setText(""); upperBtn.addPropertyChangeListener(NullableObject.PROP_CUSTOM_OBJECT, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); condJumpPanel.add(upperBtn, gridBagConstraints); lowerLb.setLabelFor(lowerBtn); lowerLb.setText(options.getMsg("edit_seq_condJump_lower")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); condJumpPanel.add(lowerLb, gridBagConstraints); lowerBtn.setToolTipText(options.getMsg("edit_seq_condJump_lower_tooltip")); lowerBtn.setText(""); lowerBtn.addPropertyChangeListener(NullableObject.PROP_CUSTOM_OBJECT, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); condJumpPanel.add(lowerBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); fwdPanel.add(condJumpPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(fwdPanel, gridBagConstraints); backPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_seq_arrow_back"))); backPanel.setLayout(new java.awt.GridBagLayout()); bkIcon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/prev.gif"))); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); backPanel.add(bkIcon, gridBagConstraints); backEnabledChk.setToolTipText(options.getMsg("edit_seq_button_enabled_tooltip")); backEnabledChk.setText(options.getMsg("edit_seq_button_enabled")); backEnabledChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); backPanel.add(backEnabledChk, gridBagConstraints); backActionLb.setText(options.getMsg("edit_seq_action")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); backPanel.add(backActionLb, gridBagConstraints); backActionCombo.setToolTipText(options.getMsg("edit_seq_action_tooltip_bk")); backActionCombo.setRenderer(new edu.xtec.util.CustomListCellRenderer(backOptions, backIcons)); backActionCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); backPanel.add(backActionCombo, gridBagConstraints); backJumpBtn.setText("..."); backJumpBtn.setToolTipText(options.getMsg("edit_seq_jump_tooltip")); backJumpBtn.setMargin(new java.awt.Insets(0, 3, 0, 3)); backJumpBtn.setEnabled(false); backJumpBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); backPanel.add(backJumpBtn, gridBagConstraints); backJumpLb.setText(" "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); backPanel.add(backJumpLb, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(backPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; mainPanel.add(spacer, gridBagConstraints); add(mainPanel, java.awt.BorderLayout.WEST); } // //GEN-END:initComponents public boolean checkIfEditorValid(Editor e) { return e instanceof ActivitySequenceElementEditor; } protected ActivitySequenceElement getActivitySequenceElement() { if (editor == null) return null; else return ((ActivitySequenceElementEditor) editor).getActivitySequenceElement(); } protected int getRealDelayValue() { return autoChk.isSelected() ? delayEditor.getValue() : 0; } protected int getBtnValue() { boolean fw = fwdEnabledChk.isSelected(); boolean bk = backEnabledChk.isSelected(); return fw ? (bk ? ActivitySequenceElement.NAV_BOTH : ActivitySequenceElement.NAV_FWD) : (bk ? ActivitySequenceElement.NAV_BACK : ActivitySequenceElement.NAV_NONE); } protected void fillData() { ActivitySequenceElement ase = getActivitySequenceElement(); JClicProjectEditor jcpe = ase == null ? null : ((ActivitySequenceElementEditor) getEditor()).getProjectEditor(); if (jcpe != null) { ListModel lm = jcpe.getActivityBagEditor().getListModel(); if (actModel == null || actModel.getListModel() != lm) { actModel = new ListComboModel(lm); actCombo.setModel(actModel); } if (ase != null) actCombo.setSelectedItem(jcpe.getActivityBagEditor().getChildByName(ase.getActivityName())); } else { actModel = new ListComboModel(); actCombo.setModel(actModel); actCombo.setSelectedItem(null); } fwdEnabledChk.setSelected(ase == null ? true : (ase.navButtons & ActivitySequenceElement.NAV_FWD) != 0); fwdActionCombo.setSelectedIndex((ase == null || ase.fwdJump == null) ? 0 : ase.fwdJump.action + 1); backEnabledChk.setSelected(ase == null ? true : (ase.navButtons & ActivitySequenceElement.NAV_BACK) != 0); backActionCombo.setSelectedIndex((ase == null || ase.backJump == null) ? 0 : ase.backJump.action + 1); tagText.setText(StrUtils.secureString(ase == null ? null : ase.getTag())); descText.setText(StrUtils.secureString(ase == null ? null : ase.getDescription())); autoChk.setSelected(ase != null && ase.delay > 0); delayEditor.setValue(Math.max(1, ase == null ? 0 : ase.delay)); ((CondJumpBtn) upperBtn).setConditionalJumpInfo(ase == null || ase.fwdJump == null ? null : ase.fwdJump.upperJump); ((CondJumpBtn) lowerBtn).setConditionalJumpInfo(ase == null || ase.fwdJump == null ? null : ase.fwdJump.lowerJump); setJumpLabels(); checkEnabled(); repaint(); } @Override public boolean eventPerformed(EventObject ev) { Object src = (ev == null ? null : ev.getSource()); ActivitySequenceElement ase = getActivitySequenceElement(); if (src == null || ase == null) return false; if (src == tagCombo) { if (tagCombo.getSelectedIndex() >= 0) { tagCombo.getEditor().setItem(tagCombo.getSelectedItem()); } return false; } else if (src == editActBtn && getEditor() != null && actCombo.getSelectedItem() != null) { JClicProjectEditor prjed = ((ActivitySequenceElementEditor) getEditor()).getProjectEditor(); if (prjed != null && prjed.getTestPlayerContainer() != null) { prjed.getTestPlayerContainer().editActivity(actCombo.getSelectedItem().toString()); } return false; } else if (src == fwdActionCombo || src == fwdJumpBtn) { ase.fwdJump = (ActivitySequenceJump) checkJump(ase.fwdJump, fwdActionCombo, true, src == fwdJumpBtn); setJumpLabels(); } else if (src == backActionCombo || src == backJumpBtn) { ase.backJump = (ActivitySequenceJump) checkJump(ase.backJump, backActionCombo, true, src == backJumpBtn); setJumpLabels(); } checkEnabled(); repaint(); updateTable(); return true; } @Override public boolean documentChangePerformed(DocumentEvent documentEvent) { if (documentEvent != null && documentEvent.getDocument().equals(tagText.getDocument())) updateTable(); return true; } private void updateTable() { Container cnt = getAWTAncestor(ActivitySequenceEditorPanel.class); if (cnt != null) { setInitializing(true); saveData(); int row = ((ActivitySequenceEditorPanel) cnt).seqTable.getSelectionModel().getAnchorSelectionIndex(); ((ActivitySequenceEditorPanel) cnt).tableModel.fireTableDataChanged(); ((ActivitySequenceEditorPanel) cnt).seqTable.getSelectionModel().setSelectionInterval(row, row); setInitializing(false); } } protected JumpInfo checkJump(JumpInfo ji, JComboBox combo, boolean allowNull, boolean forcePrompt) { int offset = allowNull ? 1 : 0; int v = combo.getSelectedIndex(); if (v == 0 && allowNull) ji = null; else { if (ji == null) ji = new ActivitySequenceJump(v - offset); else ji.action = v - offset; if (ji.action == JumpInfo.JUMP && (forcePrompt || (ji.sequence == null && ji.projectPath == null))) { boolean b = promptJumpParams(ji, this); if (!b || (ji.sequence == null && ji.projectPath == null)) { if (allowNull) ji = null; else ji.action = JumpInfo.RETURN; setInitializing(true); combo.setSelectedIndex(ji == null ? 0 : ji.action + offset); setInitializing(false); } } } return ji; } @Override public final void setEnabled(boolean enabled) { super.setEnabled(enabled); actCombo.setEnabled(enabled); fwdEnabledChk.setEnabled(enabled); backEnabledChk.setEnabled(enabled); tagText.setEnabled(enabled); descText.setEnabled(enabled); autoChk.setEnabled(enabled); checkEnabled(); } public void checkEnabled() { boolean e = isEnabled(); boolean fw = fwdEnabledChk.isSelected() || autoChk.isSelected(); boolean fwBtn = fw && fwdActionCombo.getSelectedIndex() == JumpInfo.JUMP + 1; boolean fwCond = fw && fwdActionCombo.getSelectedIndex() > 0; boolean bk = backEnabledChk.isSelected(); boolean bkBtn = bk && backActionCombo.getSelectedIndex() == JumpInfo.JUMP + 1; fwdActionCombo.setEnabled(e && fw); fwdJumpBtn.setEnabled(e && fwBtn); delayEditor.setEnabled(e && autoChk.isSelected()); backActionCombo.setEnabled(e && bk); backJumpBtn.setEnabled(e && bkBtn); upperBtn.setEnabled(e && fwCond); lowerBtn.setEnabled(e && fwCond); } protected void saveData() { ActivitySequenceElement ase = getActivitySequenceElement(); ActivityBagElementEditor abed = (ActivityBagElementEditor) actCombo.getSelectedItem(); if (ase != null && abed != null) { ase.setActivityName(abed.toString()); String tag = StrUtils.nullableString(tagText.getText()); if (!StrUtils.compareObjects(tag, ase.getTag())) { ActivitySequenceEditor ased = (ActivitySequenceEditor) getEditor().getEditorParent(); if (ase.getTag() != null && ased != null && ased.tagList != null) ased.tagList.removeElement(ased.getTag(ase.getTag())); ase.setTag(tag); if (tag != null && ased != null && ased.tagList != null) ased.tagList.addElement(tag); } ase.setTag(StrUtils.nullableString(tagText.getText())); ase.setDescription(StrUtils.nullableString(descText.getText())); ase.navButtons = getBtnValue(); ase.delay = getRealDelayValue(); if (ase.fwdJump != null) { ase.fwdJump.upperJump = ((CondJumpBtn) upperBtn).getConditionalJumpInfo(); ase.fwdJump.lowerJump = ((CondJumpBtn) lowerBtn).getConditionalJumpInfo(); } } } @Override protected Icon getIcon() { return ActivitySequenceElementEditor.getIcon(); } @Override protected String getTitle() { return "Activity sequence element"; } protected boolean promptJumpParams(JumpInfo ji, Component parent) { boolean result = false; ActivitySequenceElement ase = getActivitySequenceElement(); if (ase != null) { JClicProjectEditor jcpe = ((ActivitySequenceElementEditor) getEditor()).getProjectEditor(); if (jcpe != null) { ListModel lm = jcpe.getActivitySequenceEditor().getTagList(); if (jmpTagModel == null || jmpTagModel.getListModel() != lm) jmpTagModel = new ListComboModel(lm); tagCombo.setModel(jmpTagModel); tagCombo.setSelectedItem(ji.sequence); String tx = ji.projectPath; prjEdit.setText(tx == null ? "" : tx); result = options.getMessages().showInputDlg(parent, prompt_msg, prompt_keys, prompt_objects, "edit_seq_jump_title"); if (result) { ji.sequence = StrUtils.nullableString(tagCombo.getEditor().getItem()); ji.projectPath = StrUtils.nullableString(prjEdit.getText()); } } } return result; } private void setJumpLabels() { StringBuilder sb = new StringBuilder(); ActivitySequenceElement ase = getActivitySequenceElement(); if (ase != null && ase.fwdJump != null) { if (ase.fwdJump.sequence != null) sb.append(ase.fwdJump.sequence); if (ase.fwdJump.projectPath != null) sb.append(" (").append(ase.fwdJump.projectPath).append(")"); } fwdJumpLb.setText(sb.append(' ').substring(0)); sb.setLength(0); if (ase != null && ase.backJump != null) { if (ase.backJump.sequence != null) sb.append(ase.backJump.sequence); if (ase.backJump.projectPath != null) sb.append(" (").append(ase.backJump.projectPath).append(")"); } backJumpLb.setText(sb.append(' ').substring(0)); } class CondJumpBtn extends NullableObject { boolean upper; ConditionalJumpPanel cjp; CondJumpBtn(boolean upper) { super(); this.upper = upper; setOptions(ActivitySequenceElementEditorPanel.this.options); } ConditionalJumpInfo getConditionalJumpInfo() { return (ConditionalJumpInfo) getObject(); } void setConditionalJumpInfo(ConditionalJumpInfo cji) { setObject(cji); checkIcon(); } @Override protected Object createObject() { return new ConditionalJumpInfo(JumpInfo.RETURN, null, upper ? 80 : 20); } @Override protected Object editObject(Object o) { if (o == null) o = createObject(); ConditionalJumpInfo cji = (ConditionalJumpInfo) o; if (cjp == null) { cjp = new ConditionalJumpPanel(options, ActivitySequenceElementEditorPanel.this, upper); } cjp.setJumpInfo((ConditionalJumpInfo) o, upper); boolean b = options.getMessages().showInputDlg(this, cjp, "edit_seq_condJump_" + (upper ? "upper" : "lower")); return b ? cjp.getJumpInfo() : null; }; @Override public void changeObject(Object o) { super.changeObject(o); checkIcon(); } private void checkIcon() { JumpInfo o = getConditionalJumpInfo(); if (o == null || fwdIcons == null) setIcon(null); else setIcon(fwdIcons[o.action + 1]); repaint(); } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JComboBox actCombo; private javax.swing.JCheckBox autoChk; private javax.swing.JComboBox backActionCombo; private javax.swing.JCheckBox backEnabledChk; private javax.swing.JButton backJumpBtn; private javax.swing.JLabel backJumpLb; private edu.xtec.jclic.beans.SmallIntEditor delayEditor; private javax.swing.JTextArea descText; private javax.swing.JButton editActBtn; private javax.swing.JComboBox fwdActionCombo; private javax.swing.JCheckBox fwdEnabledChk; private javax.swing.JButton fwdJumpBtn; private javax.swing.JLabel fwdJumpLb; private edu.xtec.jclic.beans.NullableObject lowerBtn; private javax.swing.JPanel mainPanel; private javax.swing.JScrollPane scroll; private javax.swing.JTextField tagText; private edu.xtec.jclic.beans.NullableObject upperBtn; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/bags/ActivitySequenceTable.java000066400000000000000000000062571335566474600240240ustar00rootroot00000000000000/* * File : ActivitySequenceTable.java * Created : 11-apr-2003 16:09 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import javax.swing.JTable; import javax.swing.table.TableModel; /** * Subclass of BasicTableUI * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ActivitySequenceTable extends JTable { public static final Color DIVIDER_COLOR = Color.red; public static final int DIVIDER_WIDTH = 1; private BasicStroke stroke; /** Creates a new instance of ActivitySequenceTable */ public ActivitySequenceTable(TableModel model) { super(model); stroke = new BasicStroke((float) DIVIDER_WIDTH); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); ActivitySequenceEditorPanel.SeqTableModel model; if (getModel() instanceof ActivitySequenceEditorPanel.SeqTableModel) model = (ActivitySequenceEditorPanel.SeqTableModel) getModel(); else return; if (getRowCount() <= 0 || getColumnCount() <= 0) { return; } Rectangle clip = g.getClipBounds(); Point minLocation = clip.getLocation(); Point maxLocation = new Point(clip.x + clip.width - 1, clip.y + clip.height - 1); int rMin = rowAtPoint(minLocation); int rMax = rowAtPoint(maxLocation); // This should never happen. if (rMin == -1) { rMin = 0; } // If the table does not have enough rows to fill the view we'll get -1. // Replace this with the index of the last row. if (rMax == -1) { rMax = getRowCount() - 1; } int cMin = columnAtPoint(minLocation); int cMax = columnAtPoint(maxLocation); // This should never happen. if (cMin == -1) { cMin = 0; } // If the table does not have enough columns to fill the view we'll get -1. // Replace this with the index of the last column. if (cMax == -1) { cMax = getColumnCount() - 1; } g.setColor(DIVIDER_COLOR); ((Graphics2D) g).setStroke(stroke); Rectangle minCell = getCellRect(rMin, cMin, true); Rectangle maxCell = getCellRect(rMax, cMax, true); int tableWidth = maxCell.x + maxCell.width; int y = minCell.y; for (int row = rMin; row <= rMax; row++) { int rh = getRowHeight(row); y += rh; if (model.drawDivider(row)) g.drawLine(0, y - 1, tableWidth - 1, y - 1); } } } src/author/edu/xtec/jclic/bags/ConditionalJumpPanel.form000066400000000000000000000251531335566474600236640ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/ConditionalJumpPanel.java000066400000000000000000000206571335566474600236460ustar00rootroot00000000000000/* * File : ConditionalJumpPanel.java * Created : 19-mar-2004 11:44 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.beans.SmallIntEditor; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import java.util.EventObject; import javax.swing.Icon; import javax.swing.JComboBox; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class ConditionalJumpPanel extends edu.xtec.util.CtrlPanel { Options options; protected String[] jmpOptions; protected Icon[] jmpIcons; ActivitySequenceElementEditorPanel asep; ConditionalJumpInfo ji; String sType; /** Creates new form ConditionalJumpPanel */ public ConditionalJumpPanel(Options options, ActivitySequenceElementEditorPanel asep, boolean up) { this.options = options; this.asep = asep; sType = up ? "up" : "down"; ji = new ConditionalJumpInfo(JumpInfo.RETURN, null, 60); initObjects(); initComponents(); } private static final String[] OPTIONS_KEYS = { "edit_seq_action_jump", "edit_seq_action_stop", "edit_seq_action_return", "edit_seq_action_exit" }, OPTIONS_ICONS = { "seq_next_jump", "seq_next_stop", "seq_next_return", "seq_exit" }; private void initObjects() { int l = OPTIONS_KEYS.length; jmpOptions = new String[l]; jmpIcons = new Icon[l]; for (int i = 0; i < l; i++) { jmpOptions[i] = options.getMsg(OPTIONS_KEYS[i]); jmpIcons[i] = ResourceManager.getImageIcon("icons/" + OPTIONS_ICONS[i] + ".gif"); } } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel actionLb = new javax.swing.JLabel(); actionCombo = new JComboBox(jmpOptions); jumpBtn = new javax.swing.JButton(); jumpLb = new javax.swing.JLabel(); javax.swing.JLabel thresholdLb = new javax.swing.JLabel(); thresholdInt = new edu.xtec.jclic.beans.SmallIntEditor(); javax.swing.JLabel timeLb = new javax.swing.JLabel(); timeInt = new edu.xtec.jclic.beans.SmallIntEditor(); setLayout(new java.awt.GridBagLayout()); actionLb.setLabelFor(actionCombo); actionLb.setText(options.getMsg("edit_seq_action")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(actionLb, gridBagConstraints); actionCombo.setToolTipText(options.getMsg("edit_seq_action_tooltip")); actionCombo.setRenderer(new edu.xtec.util.CustomListCellRenderer(jmpOptions, jmpIcons)); actionCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(actionCombo, gridBagConstraints); jumpBtn.setText("..."); jumpBtn.setToolTipText(options.getMsg("edit_seq_jump_tooltip")); jumpBtn.setMargin(new java.awt.Insets(0, 3, 0, 3)); jumpBtn.setEnabled(false); jumpBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(jumpBtn, gridBagConstraints); jumpLb.setText(" "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(jumpLb, gridBagConstraints); thresholdLb.setLabelFor(thresholdInt); thresholdLb.setText(options.getMsg("edit_seq_threshold")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(thresholdLb, gridBagConstraints); thresholdInt.setToolTipText(options.getMsg("edit_seq_threshold_tooltip_" + sType)); thresholdInt.setMax(100); thresholdInt.setMin(-1); thresholdInt.setValue(60); thresholdInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(thresholdInt, gridBagConstraints); timeLb.setLabelFor(timeInt); timeLb.setText(options.getMsg("edit_seq_time")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(timeLb, gridBagConstraints); timeInt.setToolTipText(options.getMsg("edit_seq_time_tooltip_" + sType)); timeInt.setMax(9999); timeInt.setMin(-1); timeInt.setValue(-1); timeInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(timeInt, gridBagConstraints); } // //GEN-END:initComponents public void setJumpInfo(ConditionalJumpInfo ji, boolean up) { if (ji == null) ji = new ConditionalJumpInfo(JumpInfo.RETURN, null, up ? 80 : 20); else ji = new ConditionalJumpInfo(ji.action, ji.sequence, ji.threshold, ji.time); this.ji = ji; thresholdInt.setValue(ji.threshold); timeInt.setValue(ji.time); actionCombo.setSelectedIndex(ji.action); thresholdInt.setToolTipText(options.getMsg("edit_seq_threshold_tooltip_" + (up ? "up" : "down"))); timeInt.setToolTipText(options.getMsg("edit_seq_time_tooltip_" + (up ? "up" : "down"))); setJumpLabel(); checkEnabled(); setModified(false); } public ConditionalJumpInfo getJumpInfo() { ji.threshold = thresholdInt.getValue(); ji.time = timeInt.getValue(); return ji; } @Override public boolean eventPerformed(EventObject ev) { Object src = (ev == null ? null : ev.getSource()); if (src == null) return false; if (src == actionCombo || src == jumpBtn) { asep.checkJump(ji, actionCombo, false, src == jumpBtn); setJumpLabel(); } checkEnabled(); repaint(); return true; } public void checkEnabled() { jumpBtn.setEnabled(ji.action == JumpInfo.JUMP); } private void setJumpLabel() { StringBuilder sb = new StringBuilder(); if (ji.action == JumpInfo.JUMP && ji.sequence != null) { sb.append(ji.sequence); if (ji.projectPath != null) sb.append(" (").append(ji.projectPath).append(")"); } jumpLb.setText(sb.append(' ').substring(0)); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JComboBox actionCombo; private javax.swing.JButton jumpBtn; private javax.swing.JLabel jumpLb; private edu.xtec.jclic.beans.SmallIntEditor thresholdInt; private edu.xtec.jclic.beans.SmallIntEditor timeInt; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/bags/MediaBagEditor.java000066400000000000000000000450161335566474600223630ustar00rootroot00000000000000/* * File : MediaBagEditor.java * Created : 17-sep-2002 16:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Constants; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.fileSystem.ZipFileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ProgressDialog; import edu.xtec.util.StrUtils; import edu.xtec.util.StreamIO; import java.awt.Color; import java.awt.Component; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import javax.swing.Icon; import javax.swing.JComponent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class MediaBagEditor extends Editor { public static final int DEFAULT_IMG_MAX_WIDTH = 800; public static final int DEFAULT_IMG_MAX_HEIGHT = 600; public static final int IMG_MIN_SIZE = 10; public static final String RESIZED = "resized"; public static boolean actionsCreated; private boolean initializing; public static EditorAction newMediaBagElementAction, updateAllMediaAction, exportAllMediaAction; private static Icon icon; protected static int imgMaxWidth = DEFAULT_IMG_MAX_WIDTH; protected static int imgMaxHeight = DEFAULT_IMG_MAX_HEIGHT; /** Creates a new instance of MediaBagEditor */ public MediaBagEditor(MediaBag mb) { super(mb); } public Options getOptions() { return getMediaBag().getProject().getBridge().getOptions(); } protected void createChildren() { initializing = true; Iterator it = getMediaBag().getElementsByName().iterator(); while (it.hasNext()) { ((MediaBagElement) it.next()).getEditor(this); } initializing = false; } public EditorPanel createEditorPanel(Options options) { return new MediaBagMultiEditorPanel(options); } public Class getEditorPanelClass() { return MediaBagMultiEditorPanel.class; } @Override public String getTitleKey() { return "edit_media"; } public MediaBag getMediaBag() { return (MediaBag) getUserObject(); } public JClicProjectEditor getProjectEditor() { return (JClicProjectEditor) getFirstParent(JClicProjectEditor.class); } public static String[] selectMediaFiles(MediaBag mediaBag, Options options, Component dlgOwner, int fileFilters, String defaultFile) { String[] result; FileSystem fs = mediaBag.getProject().getFileSystem(); int[] filters = new int[] { Utils.ALL_IMAGES_FF, Utils.ALL_SOUNDS_FF, Utils.MIDI_FF, Utils.ALL_VIDEO_FF, Utils.ALL_ANIM_FF, Utils.FONTS_FF, Utils.SKINS_FF, Utils.ALL_MEDIA_FF }; result = fs.chooseFiles(defaultFile, false, filters, options, "edit_find_media", dlgOwner, true, true); if (result != null) { for (int i = 0; i < result.length; i++) { if (result[i] != null) { result[i] = result[i].replace(File.separatorChar, '/'); } } } return result; } public String getValidMediaName(String suggestedName) { String name = suggestedName; int i = 1; while (getMediaBag().getElement(name) != null) { name = name + "_" + i++; } return name; } public MediaBagElementEditor addMediaBagElement(MediaBagElement mbe) { MediaBagElementEditor result = null; if (getMediaBag().addElement(mbe)) { result = (MediaBagElementEditor) mbe.getEditor(this); fireEditorDataChanged(null); } return result; } public MediaBagElementEditor[] createNewMediaBagElements(Options options, Component dlgOwner, int fileFilters) { MediaBagElementEditor[] result = null; Messages msg = options.getMessages(); MediaBag mb = getMediaBag(); FileSystem fs = mb.getProject().getFileSystem(); String[] fNames = selectMediaFiles(getMediaBag(), options, dlgOwner, fileFilters, null); if (fNames != null) { List v = new ArrayList(); for (int i = 0; i < fNames.length; i++) { if (mb.getElementByFileName(fNames[i]) != null) { msg.showAlert(dlgOwner, new String[] { msg.get("edit_media_exists_1"), fNames[i], msg.get("edit_media_exists_2") }); } else { MediaBagElement mbe = new MediaBagElement(fNames[i], null, getValidMediaName(fNames[i])); boolean cancel = false; // Check image size if (mbe.isImage()) { Image img = null; try { img = mbe.prepareAndGetImage(fs); if (img == null) { throw new Exception("invalid image!"); } } catch (Exception ex) { msg.showErrorWarning(dlgOwner, "err_reading_data", fNames[i], ex, null); cancel = true; } if (img != null) { int imgWidth = img.getWidth(null); int imgHeight = img.getHeight(null); if ((imgWidth > imgMaxWidth || imgHeight > imgMaxHeight)) { int answer = msg.showQuestionDlgObj( dlgOwner, new String[] { StrUtils.replace(msg.get("img_resize_prompt"), "%s", new String[] { fNames[i], "" + imgWidth + "x" + imgHeight, "" + imgMaxWidth + "x" + imgMaxHeight }) }, "CONFIRM", "ync"); if (answer == Messages.CANCEL) { cancel = true; } else if (answer == Messages.YES) { // TODO: Process can be long. Display wait cursor String baseName = fNames[i]; int lastDot = baseName.lastIndexOf("."); if (lastDot > 0) { baseName = baseName.substring(0, lastDot); } String newName = baseName + "-" + RESIZED + ".jpg"; File destFile = new File(fs.getFullFileNamePath(newName)); int counter = 0; while (destFile.exists()) { newName = baseName + "-" + RESIZED + Integer.toString(++counter) + ".jpg"; destFile = new File(fs.getFullFileNamePath(newName)); } try { javax.swing.ImageIcon resizedImg = mbe.getThumbNail(imgMaxWidth, imgMaxHeight, fs); BufferedImage bimg = Utils.toBufferedImage(resizedImg.getImage(), Color.white, null); javax.imageio.ImageIO.write(bimg, "jpg", destFile); fNames[i] = newName; mbe = new MediaBagElement(fNames[i], null, getValidMediaName(fNames[i])); } catch (Exception ex) { cancel = true; msg.showErrorWarning(dlgOwner, "err_file_save", ex); } } } } } if (!cancel && mb.addElement(mbe)) { v.add((MediaBagElementEditor) mbe.getEditor(this)); } } } if (v.size() > 0) { result = v.toArray(new MediaBagElementEditor[v.size()]); fireEditorDataChanged(null); } } return result; } public void updateAllElements(JComponent parent) { final ProgressDialog progressDialog = new ProgressDialog(parent, getOptions()); edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { @Override public Object construct() { FileSystem fs = getMediaBag().getProject().getFileSystem(); ZipFileSystem zfs = (fs instanceof ZipFileSystem) ? (ZipFileSystem) fs : null; int count = 0, updated = 0; progressDialog.setProgressMax(getChildCount()); progressDialog.setProgressValue(count); Enumeration en = children(); while (en.hasMoreElements() && !isCancelled()) { MediaBagElementEditor mbeled = (MediaBagElementEditor) en.nextElement(); String fName = mbeled.getMediaBagElement().getFileName(); progressDialog.setFileLabel(fName); if (fs.realFileExists(fName)) { if (zfs != null) { ZipFileSystem.ExtendedZipEntry ze = zfs.getEntry(fName); if (ze != null && zfs.fileExists(fName)) { ze.ignore = true; } } mbeled.updateContent(null); updated++; } progressDialog.setProgressValue(++count); } progressDialog.setFileLabel(null); if (updated > 0) { setModified(true); fireEditorDataChanged(null); } return null; } @Override public void finished() { progressDialog.setVisible(false); } }; progressDialog.start("edit_media_refreshAll", "edit_media_refreshAll_working", sw, true, true, false); } public void exportAllElements(final JComponent parent) { final Options options = getOptions(); final ProgressDialog progressDialog = new ProgressDialog(parent, options); edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { @Override public Object construct() { FileSystem fs = getMediaBag().getProject().getFileSystem(); ZipFileSystem zfs = (fs instanceof ZipFileSystem) ? (ZipFileSystem) fs : null; String dlgMsg = options.getMessages().get("filesystem_copyFile"); int count = 0; progressDialog.setProgressMax(getChildCount()); progressDialog.setProgressValue(count); Enumeration en = children(); boolean overwriteAll = false; boolean overwriteNone = false; while (en.hasMoreElements() && !isCancelled()) { MediaBagElementEditor mbeled = (MediaBagElementEditor) en.nextElement(); String fName = mbeled.getMediaBagElement().getFileName(); if (zfs != null) { ZipFileSystem.ExtendedZipEntry ze = zfs.getEntry(fName); if (ze != null && !ze.ignore) { progressDialog.setFileLabel(fName); String fNameDest = zfs.getFullFileNamePath(fName); File fileDest = new File(fNameDest); boolean prompt = true; if (fileDest.exists()) { if (overwriteNone) { continue; } else if (!overwriteAll) { boolean next = false; boolean cancel = false; switch (options.getMessages().confirmOverwriteFile(parent, fileDest, "yYnNc")) { case Messages.NO_TO_ALL: overwriteNone = true; case Messages.NO: next = true; break; case Messages.YES_TO_ALL: overwriteAll = true; case Messages.YES: break; default: cancel = true; } if (next) { continue; } else if (cancel) { break; } } } try { OutputStream os = zfs.createSecureFileOutputStream(fNameDest, false); InputStream is = zfs.getInputStream(fName); StreamIO.writeStreamTo(is, os); } catch (Exception ex) { options.getMessages().showErrorWarning(progressDialog, "FILE_ERR_SAVING", ex); break; } } progressDialog.setProgressValue(++count); } } progressDialog.setFileLabel(null); return null; } @Override public void finished() { progressDialog.setVisible(false); } }; progressDialog.start("edit_media_refreshAll", "edit_media_refreshAll_working", sw, true, true, false); } @Override public void setActionsOwner() { allowDelete = allowCut = allowCopy = allowPaste = false; super.setActionsOwner(); if (actionsCreated) { newMediaBagElementAction.setActionOwner(this); FileSystem fs = getMediaBag().getProject().getFileSystem(); boolean isZipFileSystem = (fs instanceof ZipFileSystem); updateAllMediaAction.setActionOwner(isZipFileSystem ? this : null); exportAllMediaAction.setActionOwner(isZipFileSystem ? this : null); } } @Override public void clearActionsOwner() { super.clearActionsOwner(); if (actionsCreated) { newMediaBagElementAction.setActionOwner(null); updateAllMediaAction.setActionOwner(null); exportAllMediaAction.setActionOwner(null); } } public static void createActions(Options opt) { createBasicActions(opt); if (!actionsCreated) { newMediaBagElementAction = new EditorAction("edit_media_new", "icons/media_new.gif", "edit_media_new_tooltip", opt) { protected void doAction(Editor e) { Editor ch = null; if (e instanceof MediaBagElementEditor) { ch = e; e = e.getEditorParent(); } if (e instanceof MediaBagEditor) { EditorPanel ep = getEditorPanelSrc(); MediaBagMultiEditorPanel mbep = null; if (ep instanceof MediaBagMultiEditorPanel) { mbep = (MediaBagMultiEditorPanel) ep; } int filters = (mbep == null ? -1 : mbep.getFilters()); MediaBagElementEditor[] mbed = ((MediaBagEditor) e).createNewMediaBagElements(options, getComponentSrc(), filters); if (mbed != null && mbed.length > 0 && mbep != null) { mbep.setSelected(mbed[0]); } } } }; updateAllMediaAction = new EditorAction("edit_media_refreshAll", "icons/reset_all.gif", "edit_media_refreshAll_tooltip", opt) { protected void doAction(Editor e) { if (e instanceof MediaBagEditor) { ((MediaBagEditor) e).updateAllElements(getJComponentSrc()); } } }; exportAllMediaAction = new EditorAction("edit_media_exportAll", "icons/file_save_all.gif", "edit_media_exportAll_tooltip", opt) { protected void doAction(Editor e) { if (e instanceof MediaBagEditor) { ((MediaBagEditor) e).exportAllElements(getJComponentSrc()); } } }; actionsCreated = true; } } public MediaBagElementEditor getChildFor(MediaBagElement mbe) { MediaBagElementEditor result = null; if (mbe != null) { Enumeration en = children(); while (en.hasMoreElements()) { Editor e = (Editor) en.nextElement(); if (e.getUserObject() == mbe) { result = (MediaBagElementEditor) e; break; } } } return result; } public List getChildrenList(int filters) { List v = new ArrayList(); Iterator it = getMediaBag().getElementsByName().iterator(); String[] extFilters = Utils.getFileFilterExtensions(filters); while (it.hasNext()) { MediaBagElement mbe = (MediaBagElement) it.next(); int i = 0; String s = mbe.getFileName().toLowerCase(); if (extFilters != null) { while (i < extFilters.length && !s.endsWith(extFilters[i])) { i++; } } if (extFilters == null || i < extFilters.length) { MediaBagElementEditor mbed = getChildFor(mbe); if (mbed != null) { v.add(mbed); } } } return v; } public boolean nameChanged(int type, String oldName, String newName) { boolean result = false; if ((type & Constants.T_MEDIA) != 0) { Enumeration e = children(); while (e.hasMoreElements()) { result |= ((MediaBagElementEditor) e.nextElement()).nameChanged(type, oldName, newName); } } return result; } public static Icon getIcon() { if (icon == null) { icon = edu.xtec.util.ResourceManager.getImageIcon("icons/media_bag.gif"); } return icon; } public int checkOrphanElements(Options options, Component parent, boolean prompt) { int result = Messages.YES; List v = new ArrayList(); Enumeration en = children(); while (en.hasMoreElements()) { MediaBagElementEditor mbed = (MediaBagElementEditor) en.nextElement(); if (mbed.listReferences().isEmpty()) { v.add(mbed); } } if (!v.isEmpty()) { boolean doIt = !prompt; if (!doIt) { Object[] object = new Object[] { options.getMsg("edit_project_orphanMedia"), v.size() > 10 ? (Object) (new javax.swing.JScrollPane(new javax.swing.JList(v.toArray()))) : (Object) v, options.getMsg("edit_project_orphanMedia_prompt"), }; result = options.getMessages().showQuestionDlgObj(parent, object, "edit_project_orphanMedia_title", "ync"); doIt = (result == Messages.YES); } if (doIt) { Iterator it = v.iterator(); while (it.hasNext()) { it.next().delete(true); } } } return result; } public static int getImgMaxWidth() { return imgMaxWidth; } public static void setImgMaxWidth(int width) { imgMaxWidth = Math.max(IMG_MIN_SIZE, width); } public static int getImgMaxHeight() { return imgMaxHeight; } public static void setImgMaxHeight(int height) { imgMaxHeight = Math.max(IMG_MIN_SIZE, height); } } src/author/edu/xtec/jclic/bags/MediaBagElementEditor.java000066400000000000000000000227501335566474600236750ustar00rootroot00000000000000/* * File : MediaBagElementEditor.java * Created : 02-feb-2004 13:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Constants; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorAction; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Component; import java.awt.Image; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.Icon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class MediaBagElementEditor extends Editor { private static boolean actionsCreated; private static Icon icon; public static EditorAction testMediaBagElementAction; /** Creates a new instance of MediaBagElementEditor */ public MediaBagElementEditor(MediaBagElement el) { super(el); } protected void createChildren() { } public Class getEditorPanelClass() { return MediaBagElementEditorPanel.class; } public EditorPanel createEditorPanel(Options options) { return new MediaBagElementEditorPanel(options); } public MediaBagElement getMediaBagElement() { return (MediaBagElement) getFirstObject(MediaBagElement.class); } public MediaBag getMediaBag() { MediaBag result = null; if (getEditorParent() instanceof MediaBagEditor) { result = ((MediaBagEditor) getParent()).getMediaBag(); } return result; } public String getName() { return getMediaBagElement().getName(); } private static MediaPreviewPanel previewPanel = null; public void testMedia(java.awt.Component parent, Options options) { if (previewPanel == null) { previewPanel = new MediaPreviewPanel(this, options); options.getMessages().showInputDlg(parent, previewPanel, "edit_media_preview_tooltip", null); previewPanel.end(); previewPanel = null; } } public boolean rename(String newName, Editor.EditorListener agent, Messages msg) { String oldName = getName(); String errMsg = null; newName = newName.trim(); Component parentComponent = (agent instanceof Component) ? (Component) agent : null; boolean result = false; if (oldName.equals(newName)) { // do nothing } else if (newName.length() < 1) errMsg = "edit_media_rename_invalid"; else if (getMediaBag().getElement(newName) != null) errMsg = "edit_media_rename_exists"; else { result = getProjectEditor().nameChanged(Utils.T_CODES[Utils.getFileType(getMediaBagElement().getFileName())], oldName, newName); } if (errMsg != null && msg != null && parentComponent != null) { msg.showAlert(parentComponent, errMsg); } return result; } public void updateContent(Editor.EditorListener agent) { MediaBagElement mbe = getMediaBagElement(); FileSystem fs = getMediaBag().getProject().getFileSystem(); if (fs.realFileExists(mbe.getFileName())) { mbe.setData(null); fireEditorDataChanged(/* agent */ null); } } public boolean changeFileName(String newFileName, Editor.EditorListener agent, Messages msg) { boolean result = false; String errMsg = null; String oldFileName = getMediaBagElement().getFileName(); FileSystem fs = getMediaBag().getProject().getFileSystem(); newFileName = FileSystem.stdFn(newFileName.trim()); Component parentComponent = (agent instanceof Component) ? (Component) agent : null; if (oldFileName.equals(newFileName)) { // do nothing } else if (Utils.getFileType(oldFileName) != Utils.getFileType(newFileName)) { errMsg = "edit_media_chfile_different"; } else if (newFileName.length() < 1) errMsg = "edit_media_chfile_invalid"; else if (getMediaBag().getElementByFileName(newFileName) != null) { if (msg != null && parentComponent != null) { msg.showAlert(parentComponent, new String[] { msg.get("edit_media_exists_1"), newFileName, msg.get("edit_media_exists_2") }); } } else { getMediaBagElement().setFileName(newFileName); result = true; fireEditorDataChanged(agent); } if (errMsg != null && msg != null && parentComponent != null) { msg.showAlert(parentComponent, errMsg); } return result; } @Override public String toString() { return getName(); } protected void saveData() { } @Override protected boolean delete(boolean changeSelection) { MediaBagEditor mbe = (MediaBagEditor) getEditorParent(); boolean result = super.delete(changeSelection); if (result && mbe != null) { result = mbe.getMediaBag().removeElement(getMediaBagElement()); mbe.fireEditorDataChanged(null); } return result; } @Override protected boolean canClone() { return false; } protected void setActionsFlag() { // WARNING: allowDelete = true; allowCut = false; allowCopy = false; allowPaste = false; } @Override public void setActionsOwner() { setActionsFlag(); super.setActionsOwner(); if (actionsCreated) { testMediaBagElementAction.setActionOwner(this); } } @Override public void clearActionsOwner() { super.clearActionsOwner(); if (actionsCreated) { testMediaBagElementAction.setActionOwner(null); } } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/movie.gif"); return icon; } @Override public Icon getIcon(boolean leaf, boolean expanded) { return getIcon(); } @Override public boolean canBeParentOf(Editor e) { return false; } @Override public boolean canBeSiblingOf(Editor e) { return (e instanceof MediaBagElementEditor); } public JClicProjectEditor getProjectEditor() { return (JClicProjectEditor) getFirstParent(JClicProjectEditor.class); } public static void createActions(Options opt) { createBasicActions(opt); if (!actionsCreated) { testMediaBagElementAction = new EditorAction("edit_media_preview", "icons/media_view.gif", "edit_media_preview_tooltip", opt) { protected void doAction(Editor e) { EditorPanel ep = getEditorPanelSrc(); if (ep != null && e instanceof MediaBagElementEditor) { ((MediaBagElementEditor) e).testMedia(ep, ep.getOptions()); } } }; actionsCreated = true; } } public String getDescription(Options options) { MediaBagElement mbe = getMediaBagElement(); StringBuilder sb = new StringBuilder(); String fileName = mbe.getFileName(); if (fileName != null) { int type = Utils.getFileType(fileName); sb.append(options.getMsg(Utils.TYPE_CODES[type])); if (type == Utils.TYPE_IMAGE) { if (mbe.animated) sb.append(" ").append(options.getMsg("ftype_animated")); try { Image img = mbe.getImage(); if (img != null) { sb.append(" (").append(img.getWidth(null)).append("x").append(img.getHeight(null)).append(")"); } } catch (Exception ex) { sb.append(" - ").append(options.getMsg("ERROR")); System.err.println("Error reading image " + fileName); } } } return sb.substring(0); } public long getFileSize() { MediaBagElement mbe = getMediaBagElement(); long result = -1L; if (mbe != null) { String fileName = mbe.getFileName(); if (fileName != null && getMediaBag() != null) { try { result = getMediaBag().getProject().getFileSystem().getFileLength(fileName); } catch (Exception ex) { System.err.println("ERROR getting the size of " + fileName); } } } return result; } public boolean nameChanged(int type, String oldName, String newName) { boolean result = false; if ((type & Constants.T_MEDIA) != 0 && oldName.equals(getMediaBagElement().getName())) { getMediaBagElement().setName(newName); setModified(true); result = true; } return result; } public List listReferences() { List result = null; MediaBag mb = getMediaBag(); if (mb != null) { Map hm = new HashMap(); mb.listReferencesTo(getName(), Constants.MEDIA_OBJECT, hm); result = new ArrayList(hm.keySet()); } allowDelete = (result == null || result.isEmpty()); deleteAction.setEnabled(allowDelete); return result; } } src/author/edu/xtec/jclic/bags/MediaBagElementEditorPanel.form000066400000000000000000000566161335566474600247070ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/MediaBagElementEditorPanel.java000066400000000000000000000475061335566474600246630ustar00rootroot00000000000000/* * File : MediaBagElementEditorPanel.java * Created : 02-feb-2004 13:50 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.fileSystem.ZipFileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ProgressDialog; import edu.xtec.util.StreamIO; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.util.EventObject; import java.util.List; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.14 */ public class MediaBagElementEditorPanel extends EditorPanel { protected ZipFileSystem.ExtendedZipEntry zipEntry; protected ZipFileSystem zipFileSystem; /** Creates new form MediaBagElementEditorPanel */ public MediaBagElementEditorPanel(Options options) { super(options); initComponents(); refList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { editActBtn.setEnabled(e.getFirstIndex() >= 0); } } }); postInit(250, false, false); } @Override protected String getTitle() { return options.getMsg("edit_media_title"); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; mainPanel = new javax.swing.JPanel(); settingsPanel = new javax.swing.JPanel(); javax.swing.JLabel nameLb = new javax.swing.JLabel(); nameText = new javax.swing.JLabel(); chNameBtn = new javax.swing.JButton(); chNameBtn.addActionListener(this); javax.swing.JLabel fileLb = new javax.swing.JLabel(); fileText = new javax.swing.JLabel(); chFileBtn = new javax.swing.JButton(); chFileBtn.addActionListener(this); saveFileBtn = new javax.swing.JButton(); refreshFileBtn = new javax.swing.JButton(); refreshFileBtn.addActionListener(this); javax.swing.JLabel typeLb = new javax.swing.JLabel(); typeTx = new javax.swing.JLabel(); javax.swing.JLabel sizeLb = new javax.swing.JLabel(); sizeTx = new javax.swing.JLabel(); zipIncludeChk = new javax.swing.JCheckBox(); zipIncludeChk.addActionListener(this); refPanel = new javax.swing.JPanel(); refScroll = new javax.swing.JScrollPane(); refList = new javax.swing.JList<>(); editActBtn = new javax.swing.JButton(); editActBtn.addActionListener(this); setLayout(new java.awt.BorderLayout()); mainPanel.setLayout(new java.awt.GridBagLayout()); settingsPanel.setLayout(new java.awt.GridBagLayout()); nameLb.setText(options.getMsg("edit_name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(nameLb, gridBagConstraints); nameText.setBorder(javax.swing.BorderFactory.createTitledBorder("")); nameText.setMinimumSize(new java.awt.Dimension(200, 21)); nameText.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(nameText, gridBagConstraints); chNameBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/edit.gif"))); // NOI18N chNameBtn.setToolTipText(options.getMsg("edit_media_change_name")); chNameBtn.setText(""); chNameBtn.setMargin(new java.awt.Insets(2, 2, 2, 2)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(chNameBtn, gridBagConstraints); fileLb.setText(options.getMsg("edit_file")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(fileLb, gridBagConstraints); fileText.setBorder(javax.swing.BorderFactory.createTitledBorder("")); fileText.setMinimumSize(new java.awt.Dimension(200, 21)); fileText.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(fileText, gridBagConstraints); chFileBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/file_open.gif"))); // NOI18N chFileBtn.setToolTipText(options.getMsg("edit_media_change_file")); chFileBtn.setText(""); chFileBtn.setMargin(new java.awt.Insets(2, 2, 2, 2)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(chFileBtn, gridBagConstraints); saveFileBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/file_save.gif"))); // NOI18N saveFileBtn.setToolTipText(options.getMsg("edit_media_save_file")); saveFileBtn.setText(""); saveFileBtn.setMargin(new java.awt.Insets(2, 2, 2, 2)); saveFileBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(saveFileBtn, gridBagConstraints); refreshFileBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/reset.gif"))); // NOI18N refreshFileBtn.setToolTipText(options.getMsg("edit_media_refresh_file")); refreshFileBtn.setText(""); refreshFileBtn.setMargin(new java.awt.Insets(2, 2, 2, 2)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(refreshFileBtn, gridBagConstraints); typeLb.setText(options.getMsg("edit_media_type")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(typeLb, gridBagConstraints); typeTx.setText("-"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(typeTx, gridBagConstraints); sizeLb.setText(options.getMsg("edit_media_size")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(sizeLb, gridBagConstraints); sizeTx.setText("0 Kb"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(sizeTx, gridBagConstraints); zipIncludeChk.setText(options.getMsg("edit_media_includeInZip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); settingsPanel.add(zipIncludeChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(settingsPanel, gridBagConstraints); refPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_media_referencedBy"))); refPanel.setMinimumSize(new java.awt.Dimension(180, 100)); refPanel.setPreferredSize(new java.awt.Dimension(180, 100)); refPanel.setLayout(new java.awt.BorderLayout()); refList.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { refListMouseClicked(evt); } }); refScroll.setViewportView(refList); refPanel.add(refScroll, java.awt.BorderLayout.CENTER); editActBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/miniclic.png"))); // NOI18N editActBtn.setToolTipText(options.getMsg("edit_act_editActivity_tooltip")); editActBtn.setText(options.getMsg("edit_act_editActivity")); editActBtn.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); refPanel.add(editActBtn, java.awt.BorderLayout.SOUTH); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(refPanel, gridBagConstraints); add(mainPanel, java.awt.BorderLayout.CENTER); } // //GEN-END:initComponents private void refListMouseClicked(java.awt.event.MouseEvent evt) { // GEN-FIRST:event_refListMouseClicked if (refList.getSelectedValue() != null && evt.getClickCount() == 2) { editActivity(refList.getSelectedValue().toString()); } } // GEN-LAST:event_refListMouseClicked protected void editActivity(String activityName) { MediaBagElementEditor mbed = getMediaBagElementEditor(); if (mbed != null && activityName != null) { JClicProjectEditor prjed = (JClicProjectEditor) mbed.getFirstParent(JClicProjectEditor.class); if (prjed != null && prjed.getTestPlayerContainer() != null) { prjed.getTestPlayerContainer().editActivity(activityName); } } } public boolean checkIfEditorValid(Editor e) { return e instanceof MediaBagElementEditor; } protected MediaBagElementEditor getMediaBagElementEditor() { return (MediaBagElementEditor) editor; } protected MediaBagElement getMediaBagElement() { if (editor == null) { return null; } else { return getMediaBagElementEditor().getMediaBagElement(); } } protected MediaBag getMediaBag() { if (editor == null) { return null; } else { return getMediaBagElementEditor().getMediaBag(); } } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (!enabled) { chNameBtn.setEnabled(false); chFileBtn.setEnabled(false); saveFileBtn.setEnabled(false); refreshFileBtn.setEnabled(false); zipIncludeChk.setEnabled(false); } refList.setEnabled(enabled); } protected FileSystem fileSystem; protected void fillData() { MediaBagElementEditor mbed = getMediaBagElementEditor(); String fileName = mbed == null ? "" : mbed.getMediaBagElement().getFileName(); fileSystem = (mbed == null || mbed.getMediaBag() == null ? null : mbed.getMediaBag().getProject().getFileSystem()); if (fileSystem instanceof edu.xtec.jclic.fileSystem.ZipFileSystem) { zipFileSystem = (edu.xtec.jclic.fileSystem.ZipFileSystem) fileSystem; zipEntry = zipFileSystem.getEntry(fileName); } else { zipFileSystem = null; zipEntry = null; } String name = (mbed == null ? "" : mbed.getName()); nameText.setText(name); nameText.setToolTipText(name); chNameBtn.setEnabled(mbed != null); fileText.setText(fileName); fileText.setToolTipText(fileName); chFileBtn.setEnabled(mbed != null); saveFileBtn.setEnabled(zipEntry != null); refreshFileBtn.setEnabled(mbed != null); typeTx.setText(mbed == null ? "" : mbed.getDescription(options)); long fSize = -1; if (mbed != null) { fSize = mbed.getFileSize(); } sizeTx.setText(fSize < 0 ? "" : options.getMessages().fileSize(fSize)); zipIncludeChk.setSelected(mbed == null ? true : mbed.getMediaBagElement().saveFlag); zipIncludeChk.setEnabled(mbed != null); checkReferences(); } protected void checkReferences() { MediaBagElementEditor mbed = getMediaBagElementEditor(); List references = null; if (mbed != null) { references = mbed.listReferences(); } refList.setListData(references == null ? new String[0] : references.toArray()); refList.setSelectedIndex(-1); editActBtn.setEnabled(false); } /* * public boolean isModified(){ MediaBagElement mbe=getMediaBagElement(); return * mbe!=null && mbe.saveFlag!=zipIncludeChk.isSelected(); } */ protected void saveData() { MediaBagElementEditor mbed = getMediaBagElementEditor(); if (mbed != null) { mbed.getMediaBagElement().saveFlag = zipIncludeChk.isSelected(); } } @Override public boolean eventPerformed(EventObject ev) { if (ev != null) { if (ev.getSource() == refreshFileBtn) { refreshFile(); } else if (ev.getSource() == saveFileBtn) { saveFile(); } else if (ev.getSource() == chFileBtn) { changeFileName(); } else if (ev.getSource() == chNameBtn) { changeName(); } else if (ev.getSource() == editActBtn && refList.getSelectedValue() != null) { editActivity(refList.getSelectedValue().toString()); return false; } } return true; } private void refreshFile() { MediaBagElementEditor mbed = getMediaBagElementEditor(); if (mbed != null) { if (zipEntry != null) { if (!zipFileSystem.realFileExists(getMediaBagElement().getFileName())) { options.getMessages().showAlert(this, "edit_media_warn_zipFileNotExternal"); return; } zipEntry.ignore = true; zipEntry = null; mbed.updateContent(this); notifyChangesToParentPanel(); getEditor().setModified(true); } getMediaBagElement().setData(null); } } private void saveFile() { if (zipEntry != null) { String fName = getMediaBagElement().getFileName(); String fNameDest = zipFileSystem.chooseFile(fName, true, null, options, "FILE_SAVE", this, false); if (fNameDest != null) { try { OutputStream os = zipFileSystem.createSecureFileOutputStream(fNameDest, false); int len = (int) zipFileSystem.getFileLength(fName); InputStream is = zipFileSystem.getInputStream(fName); StreamIO.writeStreamDlg(is, os, len, options.getMessages().get("filesystem_copyFile"), this, options); } catch (Exception ex) { options.getMessages().showErrorWarning(this, "FILE_ERR_SAVING", ex); } } } } private void changeFileName() { MediaBagElementEditor mbed = getMediaBagElementEditor(); if (mbed != null) { MediaBagElement mbe = mbed.getMediaBagElement(); Messages msg = options.getMessages(); String oldFileName = mbe.getFileName(); FileSystem fs = mbed.getMediaBag().getProject().getFileSystem(); int[] fileFilters = new int[] { Utils.getFileFilterCode(oldFileName) }; String newFileName = fs.chooseFile(oldFileName.replace('/', File.separatorChar), false, fileFilters, options, "edit_find_media", this, true); if (newFileName != null) { newFileName = newFileName.replace(File.separatorChar, '/'); if (mbed.changeFileName(newFileName, this, msg)) { notifyChangesToParentPanel(); } } } } private void changeName() { final MediaBagElementEditor mbed = getMediaBagElementEditor(); if (mbed != null) { Messages msg = options.getMessages(); final String oldName = getMediaBagElement().getName(); final String newName = msg.showInputDlg(MediaBagElementEditorPanel.this, "edit_media_rename", "edit_media_rename_prompt", oldName, "edit_media_rename_title", false); if (newName != null) { final ProgressDialog progressDialog = new ProgressDialog(this, options); edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { @Override public Object construct() { mbed.rename(newName, MediaBagElementEditorPanel.this, options.getMessages()); return null; } @Override public void finished() { notifyChangesToParentPanel(); progressDialog.setVisible(false); } }; progressDialog.start("edit_media_rename", "edit_media_renaming", sw, false, false, false); } } } private void notifyChangesToParentPanel() { MediaBagMultiEditorPanel mbep = (MediaBagMultiEditorPanel) getAWTAncestor(MediaBagMultiEditorPanel.class); if (mbep != null) { mbep.editorDataChanged(getEditor()); } } @Override public void focusGained(java.awt.event.FocusEvent focusEvent) { super.focusGained(focusEvent); checkReferences(); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton chFileBtn; private javax.swing.JButton chNameBtn; private javax.swing.JButton editActBtn; private javax.swing.JLabel fileText; private javax.swing.JPanel mainPanel; private javax.swing.JLabel nameText; private javax.swing.JList refList; private javax.swing.JPanel refPanel; private javax.swing.JScrollPane refScroll; private javax.swing.JButton refreshFileBtn; private javax.swing.JButton saveFileBtn; private javax.swing.JPanel settingsPanel; private javax.swing.JLabel sizeTx; private javax.swing.JLabel typeTx; private javax.swing.JCheckBox zipIncludeChk; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/bags/MediaBagMultiEditorPanel.form000066400000000000000000000155211335566474600243760ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/MediaBagMultiEditorPanel.java000066400000000000000000000304601335566474600243530ustar00rootroot00000000000000/* * File : MediaBagMultiEditorPanel.java * Created : 23-jan-2004 15:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.boxes.ThumbsExplorerPanel; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.SmallButton; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class MediaBagMultiEditorPanel extends EditorPanel { public static final int ICON_MAX_WIDTH = 100; public static final int BUTTON_WIDTH = 130; public static final int ICON_MAX_HEIGHT = 70; public static final int BUTTON_HEIGHT = 110; public static final String[] COMBO_ITEMS = { "filefilter_all_media", "filefilter_all_images", "filefilter_all_sounds", "filefilter_midi", "filefilter_all_video", "filefilter_all_anim", "filefilter_skins", "filefilter_fonts" }; public static final int[] COMBO_FILTERS = { Utils.ALL_FF, Utils.ALL_IMAGES_FF, Utils.ALL_SOUNDS_FF, Utils.MIDI_FF, Utils.ALL_VIDEO_FF, Utils.ALL_ANIM_FF, Utils.SKINS_FF, Utils.FONTS_FF }; private ThumbsExplorerPanel selectPanel; private MediaBagElementEditor current; int filters = -1; /** Creates new form MediaBagMultiEditorPanel */ public MediaBagMultiEditorPanel(Options options) { super(options); MediaBagEditor.createActions(options); MediaBagElementEditor.createActions(options); initComponents(); selectPanel = (ThumbsExplorerPanel) sPanel; scrollPanel.getVerticalScrollBar().setUnitIncrement(selectPanel.boxSize.height); selectPanel.addListSelectionListener(btSelListener); selectPanel.addActionListener(btActListener); filterCombo.setSelectedIndex(0); postInit(250, false, true); setEnabled(false); } @Override protected String getTitle() { return options.getMsg("edit_media_title"); } protected List getComboItems() { List result = new ArrayList(); for (String item : COMBO_ITEMS) result.add(options.getMsg(item)); return result; } @Override public void focusGained(FocusEvent focusEvent) { ((MediaBagElementEditorPanel) elementEditPanel).focusGained(focusEvent); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; bGroup = new javax.swing.ButtonGroup(); mainPanel = new javax.swing.JPanel(); filterPanel = new javax.swing.JPanel(); filterLb = new javax.swing.JLabel(); filterCombo = new javax.swing.JComboBox(getComboItems().toArray()); scrollPanel = new javax.swing.JScrollPane(); sPanel = new ThumbsExplorerPanel(); statusLb = new javax.swing.JLabel(); elementEditPanel = new MediaBagElementEditorPanel(options); setLayout(new java.awt.BorderLayout()); mainPanel.setLayout(new java.awt.GridBagLayout()); filterPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); filterLb.setText(options.getMsg("edit_media_show_type")); filterPanel.add(filterLb); filterCombo.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { filterComboActionPerformed(evt); } }); filterPanel.add(filterCombo); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; mainPanel.add(filterPanel, gridBagConstraints); scrollPanel.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); scrollPanel.addComponentListener(new java.awt.event.ComponentAdapter() { public void componentResized(java.awt.event.ComponentEvent evt) { scrollPanelComponentResized(evt); } }); scrollPanel.setViewportView(sPanel); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; mainPanel.add(scrollPanel, gridBagConstraints); statusLb.setText("0 " + options.getMsg("edit_media_objects")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(statusLb, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; mainPanel.add(elementEditPanel, gridBagConstraints); add(mainPanel, java.awt.BorderLayout.CENTER); } // //GEN-END:initComponents private void filterComboActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_filterComboActionPerformed setFilters(COMBO_FILTERS[filterCombo.getSelectedIndex()]); } // GEN-LAST:event_filterComboActionPerformed private void scrollPanelComponentResized(java.awt.event.ComponentEvent evt) { // GEN-FIRST:event_scrollPanelComponentResized selectPanel.resizeTo(scrollPanel.getViewport().getSize().width); } // GEN-LAST:event_scrollPanelComponentResized @Override public void editorDataChanged(Editor e) { if (e != null) { if (e.equals(getEditor())) fillData(); else { ThumbsExplorerPanel.ThumbElement th = selectPanel.getElementFor(e); if (th != null) { MediaBagElementEditor mbed = (MediaBagElementEditor) e; Dimension d = selectPanel.maxThumbSize; th.setImage( mbed.getMediaBagElement().getThumbNail(d.width, d.height, getMediaBag().getProject().getFileSystem())); th.setText(mbed.getName()); // Free discardable objects from memory mbed.getMediaBagElement().clearData(); btSelListener.valueChanged(null); repaint(); } } } } public boolean checkIfEditorValid(Editor e) { return e instanceof MediaBagEditor; } protected MediaBagEditor getMediaBagEditor() { return (MediaBagEditor) editor; } protected MediaBag getMediaBag() { if (editor == null) return null; else return getMediaBagEditor().getMediaBag(); } public void setFilters(int filters) { this.filters = filters; for (int i = 0; i < COMBO_FILTERS.length; i++) { if (COMBO_FILTERS[i] == filters) { filterCombo.setSelectedIndex(i); break; } } fillData(); } public int getFilters() { return filters; } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); selectPanel.setEnabled(enabled); filterCombo.setEnabled(enabled); elementEditPanel.setEnabled(enabled); } protected void fillData() { current = null; selectPanel.removeAllThumbElements(); ((MediaBagElementEditorPanel) elementEditPanel).attachEditor(null, true); MediaBagEditor mbe = getMediaBagEditor(); int n = 0; if (mbe != null) { Dimension d = selectPanel.maxThumbSize; List v = mbe.getChildrenList(filters); n = v.size(); FileSystem fs = getMediaBag().getProject().getFileSystem(); for (MediaBagElementEditor mbed : v) { // ATENCIO!!! // Provoca bucles i stack overflow // mbed.addEditorListener(this); selectPanel.addThumbElement(mbed, mbed.getMediaBagElement().getThumbNail(d.width, d.height, fs), mbed.getName()); // Free discardable objects from memory mbed.getMediaBagElement().clearData(); } } btSelListener.valueChanged(null); statusLb.setText(Integer.toString(n) + " " + options.getMsg(n == 1 ? "edit_media_object" : "edit_media_objects")); scrollPanelComponentResized(null); } private ListSelectionListener btSelListener = new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { current = (MediaBagElementEditor) selectPanel.getCurrentObject(); ((MediaBagElementEditorPanel) elementEditPanel).attachEditor(current, true); SwingUtilities.invokeLater(new Runnable() { public void run() { selectPanel.checkCurrentVisibility(); } }); } }; private ActionListener btActListener = new ActionListener() { public void actionPerformed(ActionEvent evt) { MediaBagElementEditor.testMediaBagElementAction .actionPerformed(new ActionEvent(elementEditPanel, ActionEvent.ACTION_PERFORMED, "")); } }; protected void saveData() { } public MediaBagElementEditor getSelected() { return current; } public void setSelected(MediaBagElementEditor value) { selectPanel.setCurrentObject(value); btSelListener.valueChanged(null); } private static Map dlgPanels = new HashMap(1); public static String getMediaName(String initialValue, Options options, Component parent, MediaBagEditor mbe, int filters) { String result = null; Messages msg = options.getMessages(); MediaBagMultiEditorPanel mbep = dlgPanels.get(options); if (mbep == null) { mbep = new MediaBagMultiEditorPanel(options); mbep.setPreferredSize(new Dimension(500, 500)); dlgPanels.put(options, mbep); } mbep.attachEditor(mbe, true); mbep.setFilters(filters); if (filters >= 0) mbep.filterCombo.setEnabled(false); mbep.setSelected(initialValue == null ? null : (MediaBagElementEditor) mbe.getChildByName(initialValue)); boolean b = msg.showInputDlg(parent, mbep, "edit_media_dlg_title"); if (b) { MediaBagElementEditor mbele = mbep.getSelected(); if (mbele != null) result = mbele.getName(); } mbep.filterCombo.setEnabled(true); mbep.removeEditor(true); return result; } @Override protected void addActionsTo(Container cnt) { cnt.add(new SmallButton(MediaBagEditor.newMediaBagElementAction)); cnt.add(new SmallButton(MediaBagElementEditor.testMediaBagElementAction)); cnt.add(new SmallButton(Editor.deleteAction)); cnt.add(new SmallButton(MediaBagEditor.updateAllMediaAction)); cnt.add(new SmallButton(MediaBagEditor.exportAllMediaAction)); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup bGroup; private javax.swing.JPanel elementEditPanel; private javax.swing.JComboBox filterCombo; private javax.swing.JLabel filterLb; private javax.swing.JPanel filterPanel; private javax.swing.JPanel mainPanel; private javax.swing.JPanel sPanel; private javax.swing.JScrollPane scrollPanel; private javax.swing.JLabel statusLb; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/bags/MediaBagSelector.form000066400000000000000000000340231335566474600227330ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/MediaBagSelector.java000066400000000000000000000261401335566474600227120ustar00rootroot00000000000000/* * File : MediaBagSelector.java * Created : 22-mar-2004 15:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import java.awt.Component; import java.util.HashMap; import java.util.Map; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class MediaBagSelector extends javax.swing.JPanel { // Modified: 14-09-2010 - suggested by Camille Manoury // The cell properties editor now allows to directly import images // and other files into the media library Options options; /** Creates new form MediaBagSelector */ public MediaBagSelector(Options options) { this.options = options; initComponents(); mediaList.addListSelectionListener(selListener); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; listPanel = new javax.swing.JPanel(); scrollList = new javax.swing.JScrollPane(); mediaList = new javax.swing.JList<>(); addMediaBtn = new javax.swing.JButton(); elementPanel = new javax.swing.JPanel(); previewLabel = new javax.swing.JLabel(); nameLb = new javax.swing.JLabel(); nameText = new javax.swing.JLabel(); fileLb = new javax.swing.JLabel(); fileText = new javax.swing.JLabel(); javax.swing.JLabel typeLb = new javax.swing.JLabel(); typeTx = new javax.swing.JLabel(); javax.swing.JLabel sizeLb = new javax.swing.JLabel(); sizeTx = new javax.swing.JLabel(); setLayout(new java.awt.GridBagLayout()); listPanel.setLayout(new java.awt.BorderLayout()); scrollList.setMinimumSize(new java.awt.Dimension(200, 400)); scrollList.setPreferredSize(new java.awt.Dimension(200, 400)); scrollList.setViewportView(mediaList); listPanel.add(scrollList, java.awt.BorderLayout.CENTER); addMediaBtn.setIcon(ResourceManager.getImageIcon("icons/media_new.gif")); addMediaBtn.setText(options.getMsg("edit_media_new")); addMediaBtn.setToolTipText(options.getMsg("edit_media_new_tooltip")); addMediaBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addMediaBtnActionPerformed(evt); } }); listPanel.add(addMediaBtn, java.awt.BorderLayout.PAGE_END); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; add(listPanel, gridBagConstraints); elementPanel.setLayout(new java.awt.GridBagLayout()); previewLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); previewLabel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); previewLabel.setMinimumSize(new java.awt.Dimension(100, 100)); previewLabel.setPreferredSize(new java.awt.Dimension(100, 100)); previewLabel.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { previewLabelMousePressed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 7, 3); elementPanel.add(previewLabel, gridBagConstraints); nameLb.setText(options.getMsg("edit_name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); elementPanel.add(nameLb, gridBagConstraints); nameText.setMinimumSize(new java.awt.Dimension(200, 16)); nameText.setPreferredSize(new java.awt.Dimension(200, 17)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); elementPanel.add(nameText, gridBagConstraints); fileLb.setText(options.getMsg("edit_file")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); elementPanel.add(fileLb, gridBagConstraints); fileText.setMinimumSize(new java.awt.Dimension(200, 16)); fileText.setPreferredSize(new java.awt.Dimension(200, 17)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); elementPanel.add(fileText, gridBagConstraints); typeLb.setText(options.getMsg("edit_media_type")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); elementPanel.add(typeLb, gridBagConstraints); typeTx.setText("-"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); elementPanel.add(typeTx, gridBagConstraints); sizeLb.setText(options.getMsg("edit_media_size")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); elementPanel.add(sizeLb, gridBagConstraints); sizeTx.setText("0 Kb"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); elementPanel.add(sizeTx, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(elementPanel, gridBagConstraints); } // //GEN-END:initComponents private void previewLabelMousePressed(java.awt.event.MouseEvent evt) { // GEN-FIRST:event_previewLabelMousePressed if (current != null) current.testMedia(this, options); } // GEN-LAST:event_previewLabelMousePressed private void addMediaBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_addMediaBtnActionPerformed if (mbe != null) { MediaBagElementEditor[] mbele = mbe.createNewMediaBagElements(options, this, filters); if (mbele != null && mbele.length > 0) { mediaList.setListData(mbe.getChildrenList(filters).toArray()); setSelected(mbele[0]); mediaList.setSelectedValue(mbele[0], true); } } } // GEN-LAST:event_addMediaBtnActionPerformed MediaBagEditor mbe; MediaBagElementEditor current; int filters; protected void setMediaBagEditor(MediaBagEditor mbe, int filters) { this.mbe = mbe; this.filters = filters; setSelected(null); mediaList.setListData(mbe == null ? new String[0] : mbe.getChildrenList(filters).toArray()); } protected void setSelected(MediaBagElementEditor mbed) { current = mbed; nameText.setText(current == null ? "" : current.getName()); fileText.setText(current == null ? "" : current.getMediaBagElement().getFileName()); typeTx.setText(mbed == null ? "" : mbed.getDescription(options)); long fSize = -1; if (mbed != null) fSize = mbed.getFileSize(); sizeTx.setText(fSize < 0 ? "" : options.getMessages().fileSize(fSize)); previewLabel.setIcon(mbed == null ? null : mbed.getMediaBagElement().getThumbNail(90, 90, mbed.getMediaBag().getProject().getFileSystem())); if (mbed != null) mbed.getMediaBagElement().clearData(); } protected MediaBagElementEditor getSelected() { return current; } private ListSelectionListener selListener = new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { if (evt != null && !evt.getValueIsAdjusting()) { setSelected((MediaBagElementEditor) mediaList.getSelectedValue()); } } }; private static Map dlgPanels = new HashMap(1); public static String getMediaName(String initialValue, Options options, Component parent, MediaBagEditor mbe, int filters) { String result = null; Messages msg = options.getMessages(); MediaBagSelector mbs = dlgPanels.get(options); if (mbs == null) { mbs = new MediaBagSelector(options); dlgPanels.put(options, mbs); } mbs.setMediaBagEditor(mbe, filters); MediaBagElementEditor mbed = initialValue == null ? null : (MediaBagElementEditor) mbe.getChildByName(initialValue); mbs.setSelected(mbed); mbs.mediaList.setSelectedValue(mbed, true); boolean b = msg.showInputDlg(parent, mbs, "edit_media_dlg_title"); if (b) { MediaBagElementEditor mbele = mbs.getSelected(); if (mbele != null) result = mbele.getName(); } mbs.setMediaBagEditor(null, -1); return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addMediaBtn; private javax.swing.JPanel elementPanel; private javax.swing.JLabel fileLb; private javax.swing.JLabel fileText; private javax.swing.JPanel listPanel; private javax.swing.JList mediaList; private javax.swing.JLabel nameLb; private javax.swing.JLabel nameText; private javax.swing.JLabel previewLabel; private javax.swing.JScrollPane scrollList; private javax.swing.JLabel sizeTx; private javax.swing.JLabel typeTx; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/bags/MediaPreviewPanel.java000066400000000000000000000117011335566474600231160ustar00rootroot00000000000000/* * File : MediaPreviewPanel.java * Created : 17-feb-2004 13:32 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.beans.ImgPanel; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.JPanelActiveBox; import edu.xtec.jclic.media.MediaContent; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.JClicProjectEditor; import edu.xtec.util.Options; import java.awt.Dimension; import java.awt.Font; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class MediaPreviewPanel extends JPanel { public static final int PREFERRED_CMP_WIDTH = 600; public static final int PREFERRED_CMP_HEIGHT = 400; public static final String SAMPLE_TEXT = "ABCDEFGHIJ\nKLMNOPQRST\nUVWXYZ\nabcdefghij\nklmnopqrst\nuvwxyz\n0123456789\n"; MediaBagElementEditor mbed; Options options; PlayStation ps; int mediaType; /** Creates a new instance of MediaPreviewPanel */ public MediaPreviewPanel(MediaBagElementEditor mbed, Options options) { super(); this.mbed = mbed; this.options = options; setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS)); if (mbed != null) { JComponent cmp = null; mediaType = Utils.getFileType(mbed.getMediaBagElement().getFileName()); switch (mediaType) { case Utils.TYPE_IMAGE: cmp = buildImgComponent(); break; case Utils.TYPE_AUDIO: case Utils.TYPE_MIDI: case Utils.TYPE_ANIM: case Utils.TYPE_VIDEO: cmp = buildMediaComponent(); break; case Utils.TYPE_FONT: cmp = buildFontComponent(); break; default: break; } if (cmp != null) add(cmp); } } public void end() { if (ps != null) ps.stopMedia(1); } protected JComponent buildImgComponent() { Image img = null; JComponent result = null; try { img = mbed.getMediaBagElement().prepareAndGetImage(mbed.getMediaBag().getProject().getFileSystem()); } catch (Exception ex) { System.err.println("Error loading image " + mbed.getMediaBagElement().getFileName()); } if (img != null) { result = new JScrollPane(new ImgPanel(new ImageIcon(img))); result.setPreferredSize(new Dimension(PREFERRED_CMP_WIDTH, PREFERRED_CMP_HEIGHT)); } return result; } protected JComponent buildFontComponent() { Object o = mbed.getMediaBagElement().getData(); JTextArea textArea = new JTextArea(); if (o instanceof Font) { textArea.setFont(((Font) o).deriveFont(Font.PLAIN, 48)); textArea.setText(SAMPLE_TEXT); } else { textArea.setText(options.getMsg("edit_media_font_error")); } return new JScrollPane(textArea); } protected JComponent buildMediaComponent() { ActiveBoxContent abc = new ActiveBoxContent(); abc.mediaContent = new MediaContent(); int mt = MediaContent.UNKNOWN; switch (mediaType) { case Utils.TYPE_AUDIO: mt = MediaContent.PLAY_AUDIO; break; case Utils.TYPE_MIDI: mt = MediaContent.PLAY_MIDI; break; case Utils.TYPE_ANIM: case Utils.TYPE_VIDEO: mt = MediaContent.PLAY_VIDEO; break; } abc.mediaContent.mediaType = mt; abc.mediaContent.mediaFileName = mbed.getMediaBagElement().getFileName(); abc.mediaContent.stretch = true; abc.mediaContent.free = false; abc.dimension = new Dimension(PREFERRED_CMP_WIDTH, PREFERRED_CMP_HEIGHT); JPanelActiveBox jpab = new JPanelActiveBox(null, null, this); JClicProjectEditor prjed = (JClicProjectEditor) mbed.getFirstParent(JClicProjectEditor.class); if (prjed != null && prjed.getTestPlayerContainer() != null) { ps = prjed.getTestPlayerContainer().getTestPlayer(); jpab.setPlayStation(ps); } jpab.setActiveBoxContent(abc); try { abc.realizeContent(mbed.getMediaBag()); } catch (Exception ex) { System.err.println("Error: " + ex); } JScrollPane result = new JScrollPane(jpab); result.setPreferredSize(new Dimension(PREFERRED_CMP_WIDTH, PREFERRED_CMP_HEIGHT)); return result; } } src/author/edu/xtec/jclic/bags/NewActivityPanel.form000066400000000000000000000142771335566474600230400ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/NewActivityPanel.java000066400000000000000000000102001335566474600227740ustar00rootroot00000000000000/* * File : NewActivityPanel.java * Created : 28-apr-2003 17:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class NewActivityPanel extends javax.swing.JPanel { Options options; SelectActivityClass sac; /** Creates new form NewActivityPanel */ public NewActivityPanel(Options options) { this.options = options; initComponents(); sac = (SelectActivityClass) classPanel; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel nameLb; javax.swing.JPanel namePanel; classPanel = new SelectActivityClass(options); namePanel = new javax.swing.JPanel(); nameLb = new javax.swing.JLabel(); nameField = new javax.swing.JTextField(); setLayout(new java.awt.GridBagLayout()); classPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_act_prompt_class"))); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(classPanel, gridBagConstraints); namePanel.setLayout(new java.awt.GridBagLayout()); namePanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_act_prompt_name"))); nameLb.setLabelFor(nameField); nameLb.setText(options.getMsg("edit_act_newActivity_name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; namePanel.add(nameLb, gridBagConstraints); nameField.setToolTipText(options.getMsg("edit_act_newActivity_name_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; namePanel.add(nameField, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(namePanel, gridBagConstraints); } // GEN-END:initComponents public String gectActivityClassName() { return sac.getCurrentClassName(); } public void setActivityClassName(String className) { sac.setCurrentClassName(className); } public String getActivityName() { return StrUtils.nullableString(nameField.getText()); } public void setActivityName(String name) { nameField.setText(StrUtils.secureString(name)); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel classPanel; protected javax.swing.JTextField nameField; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/bags/SelectActivityClass.form000066400000000000000000000212651335566474600235270ustar00rootroot00000000000000
src/author/edu/xtec/jclic/bags/SelectActivityClass.java000066400000000000000000000220501335566474600234760ustar00rootroot00000000000000/* * File : SelectActivityClass.java * Created : 09-aug-2004 11:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.ActivityEditor; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import edu.xtec.util.TripleString; import java.awt.BorderLayout; import java.util.ArrayList; import java.util.List; import javax.swing.JLabel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class SelectActivityClass extends javax.swing.JPanel { Options options; private List activityClasses; private List currentSet; private String currentClassName; /** Creates new form SelectActivityClass */ public SelectActivityClass(Options options) { this.options = options; activityClasses = ActivityEditor.getSystemActivityList(options); currentSet = new ArrayList(); initComponents(); classList.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { updateSelection(); } } }); setListFilter(null, true); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jSplitPane1 = new javax.swing.JSplitPane(); javax.swing.JScrollPane scroll = new javax.swing.JScrollPane(); classList = new javax.swing.JList<>(); javax.swing.JPanel rightPanel = new javax.swing.JPanel(); scroll2 = new javax.swing.JScrollPane(); descText = new javax.swing.JEditorPane(); promptPanel = new javax.swing.JPanel(); javax.swing.JLabel classLb = new javax.swing.JLabel(); classField = new javax.swing.JTextField(); setMinimumSize(new java.awt.Dimension(400, 300)); setPreferredSize(new java.awt.Dimension(500, 300)); setLayout(new java.awt.BorderLayout()); scroll.setMinimumSize(new java.awt.Dimension(100, 200)); classList.setMinimumSize(new java.awt.Dimension(200, 0)); scroll.setViewportView(classList); jSplitPane1.setLeftComponent(scroll); rightPanel.setLayout(new java.awt.GridBagLayout()); scroll2.setMinimumSize(new java.awt.Dimension(200, 200)); descText.setEditable(false); descText.setContentType("text/html"); // NOI18N scroll2.setViewportView(descText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rightPanel.add(scroll2, gridBagConstraints); promptPanel.setLayout(new java.awt.GridBagLayout()); classLb.setText(options.getMsg("edit_act_newActivity_class")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); promptPanel.add(classLb, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); promptPanel.add(classField, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); rightPanel.add(promptPanel, gridBagConstraints); jSplitPane1.setRightComponent(rightPanel); add(jSplitPane1, java.awt.BorderLayout.CENTER); } // //GEN-END:initComponents @SuppressWarnings("unchecked") public final void setListFilter(String[] allowedClasses, boolean allowOther) { List v = new ArrayList(); if (allowedClasses != null) { for (int i = 0; i < allowedClasses.length; i++) { int p = TripleString.getFirstItemWithClass(activityClasses, allowedClasses[i]); if (p >= 0) v.add(activityClasses.get(p)); } } else { v.addAll(activityClasses); } if (allowOther) { v.add(new TripleString(options.getMsg("edit_act_newActivity_other"), null, null)); } classList.setListData(v.toArray()); currentSet = v; setCurrentClassName(currentClassName); } private void updateSelection() { Object o = classList.getSelectedValue(); boolean showPrompt = false; if (o instanceof TripleString) { TripleString ts = (TripleString) o; currentClassName = ts.getClassName(); descText.setContentType("text/html"); descText.setText(getFormattedHtmlText(ts.toString(), ts.getDescription(), ts.getClassName())); } else if (o != null) { showPrompt = true; currentClassName = StrUtils.nullableString(classField.getText()); descText.setContentType("text/html"); descText.setText(getFormattedHtmlText(o.toString(), options.getMsg("edit_act_newActivity_info"), null)); } else { currentClassName = null; descText.setContentType("text/html"); descText.setText(""); } promptPanel.setVisible(showPrompt); if (classList.getSelectedIndex() >= 0) { SwingUtilities.invokeLater(new Runnable() { public void run() { classList.ensureIndexIsVisible(classList.getSelectedIndex()); } }); } } private static final String TYPE_STYLE = "font-family:Helvetica;font-size:12;font-weight:bold;"; private static final String DESC_STYLE = "font-family:Helvetica;font-size:12;"; String getFormattedHtmlText(String type, String desc, String className) { StringBuilder sb = new StringBuilder(); sb.append(""); if (type != null) { sb.append("

").append(type).append("

"); } if (desc != null) { sb.append("

").append(desc).append("

"); } if (className != null) { sb.append("

"); sb.append(options.getMsg("edit_act_newActivity_class")).append(" ").append(className); sb.append("

"); } sb.append(""); return sb.substring(0); } /** * Getter for property currentClassName. * * @return Value of property currentClassName. */ public java.lang.String getCurrentClassName() { updateSelection(); return StrUtils.nullableString(currentClassName); } /** * Setter for property currentClassName. * * @param currentClassName New value of property currentClassName. */ public void setCurrentClassName(java.lang.String currentClassName) { this.currentClassName = currentClassName; if (currentClassName != null) { int p = TripleString.getFirstItemWithClass(currentSet, currentClassName); if (p >= 0) classList.setSelectedIndex(p); else classField.setText(StrUtils.secureString(currentClassName)); } updateSelection(); } private JLabel alertLabel; public void setAlertMsg(String alertMsg) { if (alertLabel != null) remove(alertLabel); alertLabel = new JLabel(alertMsg); add(alertLabel, BorderLayout.NORTH); } // Variables declaration - do not modify//GEN-BEGIN:variables protected javax.swing.JTextField classField; private javax.swing.JList classList; private javax.swing.JEditorPane descText; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JPanel promptPanel; private javax.swing.JScrollPane scroll2; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/beans/000077500000000000000000000000001335566474600170665ustar00rootroot00000000000000src/author/edu/xtec/jclic/beans/AlphaColorChooserPanel.form000066400000000000000000000117661335566474600243150ustar00rootroot00000000000000
src/author/edu/xtec/jclic/beans/AlphaColorChooserPanel.java000066400000000000000000000144471335566474600242720ustar00rootroot00000000000000/* * File : AlphaColorChooserPanel.java * Created : 25-sep-2002 16:51 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.util.Options; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JColorChooser; import javax.swing.colorchooser.ColorSelectionModel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class AlphaColorChooserPanel extends javax.swing.colorchooser.AbstractColorChooserPanel { protected javax.swing.JColorChooser currentChooser = null; protected Options options; /** Creates new form AlphaColorChooserPanel */ public AlphaColorChooserPanel(Options options) { super(); this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel alphaLabel; java.awt.GridBagConstraints gridBagConstraints; alphaSlider = new javax.swing.JSlider(); alphaLabel = new javax.swing.JLabel(); alphaTxt = new javax.swing.JTextField(); setLayout(new java.awt.GridBagLayout()); alphaSlider.setMajorTickSpacing(50); alphaSlider.setMaximum(255); alphaSlider.setMinorTickSpacing(10); alphaSlider.setPaintLabels(true); alphaSlider.setPaintTicks(true); alphaSlider.setToolTipText(options.getMsg("edit_color_opacity_tooltip")); alphaSlider.setValue(0); alphaSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { alphaSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(alphaSlider, gridBagConstraints); alphaLabel.setText(options.getMsg("edit_color_opacity")); alphaLabel.setLabelFor(alphaTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(alphaLabel, gridBagConstraints); alphaTxt.setText("0"); alphaTxt.setToolTipText(options.getMsg("edit_color_opacity_tooltip")); alphaTxt.setPreferredSize(new java.awt.Dimension(40, 21)); alphaTxt.setEnabled(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(alphaTxt, gridBagConstraints); } // GEN-END:initComponents private void alphaSliderStateChanged(javax.swing.event.ChangeEvent evt) { // GEN-FIRST:event_alphaSliderStateChanged int v = alphaSlider.getValue(); alphaTxt.setText(Integer.toString(v)); ColorSelectionModel csm = getColorSelectionModel(); if (csm != null) { Color c = csm.getSelectedColor(); Color nc = v < 255 ? new Color(c.getRed(), c.getGreen(), c.getBlue(), v) : new Color(c.getRed(), c.getGreen(), c.getBlue()); csm.setSelectedColor(nc); } } // GEN-LAST:event_alphaSliderStateChanged public String getDisplayName() { return options.getMsg("edit_color_opacity"); } public javax.swing.Icon getLargeDisplayIcon() { return null; } public javax.swing.Icon getSmallDisplayIcon() { return null; } @Override public void installChooserPanel(javax.swing.JColorChooser jColorChooser) { super.installChooserPanel(jColorChooser); currentChooser = jColorChooser; setColor(jColorChooser.getColor()); } protected void setColor(Color c) { int a = c.getAlpha(); alphaSlider.setValue(a); alphaTxt.setText(Integer.toString(a)); } public void updateChooser() { /* * ColorSelectionModel csm=getColorSelectionModel(); if(csm!=null){ int * a=csm.getSelectedColor().getAlpha(); alphaSlider.setValue(a); * alphaTxt.setText(Integer.toString(a)); } */ } protected void buildChooser() { } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JSlider alphaSlider; private javax.swing.JTextField alphaTxt; // End of variables declaration//GEN-END:variables static JColorChooser chooser; static AlphaColorChooserPanel accp; static ActionListener okListener; static ActionListener cancelListener; static Object[] result; public static Color chooseColor(Options options, java.awt.Component parent, Color initialColor) { if (chooser == null) { chooser = new JColorChooser(initialColor); accp = new AlphaColorChooserPanel(options); chooser.addChooserPanel(accp); result = new Object[1]; okListener = new ActionListener() { public void actionPerformed(ActionEvent e) { result[0] = chooser.getColor(); } }; cancelListener = new ActionListener() { public void actionPerformed(ActionEvent e) { result[0] = null; } }; } // 30-mai-2007 // Clear result between calls to chooseColor result[0] = null; chooser.setColor(initialColor); accp.setColor(initialColor); JColorChooser.createDialog(parent, options.getMsg("edit_color_dlgTitle"), true, chooser, okListener, cancelListener) .setVisible(true); return (Color) result[0]; } } src/author/edu/xtec/jclic/beans/BoxBaseButton.java000066400000000000000000000063361335566474600224600ustar00rootroot00000000000000/* * File : BoxBaseButton.java * Created : 12-oct-2002 18:51 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.jclic.boxes.AbstractBox; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.jclic.boxes.BoxBaseEditor; import java.awt.FontMetrics; import java.awt.Graphics; import javax.swing.AbstractButton; import javax.swing.JButton; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class BoxBaseButton extends NullableObject { public static final String PROP_BOX_BASE = "boxBase"; public static final String SAMPLE_STR = "abc"; AbstractBox preview; /** Creates a new instance of BoxBasePanel */ /* * public BoxBaseButton(Options options, String tooltipKey) { super(options, * tooltipKey); } */ public BoxBaseButton() { super(); } @Override protected String getObjectType() { return PROP_BOX_BASE; } public BoxBase getBoxBase() { return (BoxBase) getObject(); } public void setBoxBase(BoxBase bb) { setObject(bb); } @Override public void setObject(Object value) { super.setObject(value); /* * if(nullValue || object==null){ * button.setBackground(UIManager.getColor("Button.background")); * button.setForeground(UIManager.getColor("Button.foreground")); * button.setText(""); } else{ BoxBase bb=(BoxBase)value; * button.setBackground(bb.backColor); button.setForeground(bb.textColor); * button.setText("S"); } */ } @Override protected AbstractButton buildButton() { return new JButton() { @Override public void paintComponent(Graphics g) { super.paintComponent(g); BoxBase bb = getBoxBase(); if (bb != null) { java.awt.Rectangle r = new java.awt.Rectangle(0, 0, getWidth(), getHeight()); r.grow(-3, -3); g.setColor(bb.backColor); g.fillRect(r.x, r.y, r.width, r.height); g.setColor(bb.textColor); FontMetrics fm = g.getFontMetrics(); int y = r.y + r.height - (r.height - fm.getAscent()) / 2 - fm.getDescent(); int x = r.x + (r.width - fm.stringWidth(SAMPLE_STR)) / 2; g.drawString(SAMPLE_STR, x, y); } } }; } public void setPreview(AbstractBox preview) { this.preview = preview; } @Override protected Object createObject() { return new BoxBase(); } @Override protected Object editObject(Object o) { BoxBase bb = (BoxBase) (o == null ? createObject() : o); return BoxBaseEditor.getBoxBase(bb, this, options, preview); } } src/author/edu/xtec/jclic/beans/CheckBoxTree.form000066400000000000000000000030031335566474600222550ustar00rootroot00000000000000
src/author/edu/xtec/jclic/beans/CheckBoxTree.java000066400000000000000000000071041335566474600222410ustar00rootroot00000000000000/* * File : CheckBoxTree.java * Created : 15-jul-2004 14:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Point; import javax.swing.JCheckBox; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class CheckBoxTree extends javax.swing.JTree { /** Creates new form BeanForm */ public CheckBoxTree() { initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents setCellRenderer(new CellRenderer()); addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { treeMouseClicked(evt); } }); } // GEN-END:initComponents private void treeMouseClicked(java.awt.event.MouseEvent evt) { // GEN-FIRST:event_treeMouseClicked Point pt = evt.getPoint(); TreePath tp = getPathForLocation(pt.x, pt.y); if (tp != null && tp.getLastPathComponent() instanceof CheckBoxTreeObject) { ((CheckBoxTreeObject) tp.getLastPathComponent()).switchSelected(); repaint(getPathBounds(tp)); } } // GEN-LAST:event_treeMouseClicked class CellRenderer extends DefaultTreeCellRenderer { JCheckBox checkBox = new JCheckBox() { @Override public void paint(Graphics g) { if (hasFocus) { Color bsColor = getBorderSelectionColor(); if (bsColor != null) { g.setColor(bsColor); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); } } super.paint(g); } }; public CellRenderer() { super(); checkBox.setBackground(getBackground()); checkBox.setOpaque(isOpaque()); checkBox.setFont(getFont()); checkBox.setForeground(getForeground()); } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { Component result = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); if (value instanceof CheckBoxTreeObject) { CheckBoxTreeObject cho = (CheckBoxTreeObject) value; checkBox.setText(cho.getLabel()); checkBox.setSelected(cho.isSelected()); checkBox.setEnabled(tree.isEnabled()); checkBox.setComponentOrientation(tree.getComponentOrientation()); result = checkBox; } return result; } } // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/beans/CheckBoxTreeObject.java000066400000000000000000000042251335566474600233710ustar00rootroot00000000000000/* * File : CheckBoxTreeObject.java * Created : 15-jul-2004 14:14 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import javax.swing.tree.DefaultMutableTreeNode; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class CheckBoxTreeObject extends DefaultMutableTreeNode { protected String label; protected boolean selected; /** Creates a new instance of CheckBoxTreeObject */ public CheckBoxTreeObject(String label, boolean selected) { super(); this.label = label; this.selected = selected; } /** Creates a new instance of CheckBoxTreeObject */ public CheckBoxTreeObject() { this("", false); } public void switchSelected() { selected = !selected; } @Override public String toString() { return label == null ? "" : label; } /** * Getter for property selecetd. * * @return Value of property selected. */ public boolean isSelected() { return selected; } /** * Setter for property selected. * * @param selected New value of property selected. */ public void setSelected(boolean selected) { this.selected = selected; } /** * Getter for property label. * * @return Value of property label. */ public java.lang.String getLabel() { return label; } /** * Setter for property label. * * @param label New value of property label. */ public void setLabel(java.lang.String label) { this.label = label; } } src/author/edu/xtec/jclic/beans/ColorButton.java000066400000000000000000000046561335566474600222160ustar00rootroot00000000000000/* * File : ColorButton.java * Created : 26-sep-2002 13:38 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.util.Options; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import javax.swing.JButton; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ColorButton extends JButton { Options options; public static final String PROP_COLOR = "color"; public static final int BT_PREF_WIDTH = 31, BT_PREF_HEIGHT = 21; public static final int SAMPLE_WIDTH = 21, SAMPLE_HEIGHT = 14; Color color; /** Creates a new instance of ColorButton */ public ColorButton() { super(); setPreferredSize(new java.awt.Dimension(BT_PREF_WIDTH, BT_PREF_HEIGHT)); setMinimumSize(getPreferredSize()); setMaximumSize(getPreferredSize()); setColor(Color.lightGray); } public void setOptions(Options options) { this.options = options; } @Override protected void fireActionPerformed(ActionEvent event) { if (options != null) { Color c = AlphaColorChooserPanel.chooseColor(options, this, getColor()); if (c != null) changeColor(c); } super.fireActionPerformed(event); } public void setColor(Color c) { color = c; repaint(); } public Color getColor() { return color; } public void changeColor(Color c) { Color oldColor = getColor(); setColor(c); if (!oldColor.equals(c)) firePropertyChange(PROP_COLOR, oldColor, c); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); java.awt.Rectangle r = new java.awt.Rectangle(3, 3, getWidth() - 6, getHeight() - 6); g.setColor(color); g.fillRect(r.x, r.y, r.width, r.height); } } src/author/edu/xtec/jclic/beans/Compass.java000066400000000000000000000063171335566474600213450ustar00rootroot00000000000000/* * File : Compass.java * Created : 04-nov-2002 09:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.JToggleButton; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class Compass extends JPanel { public static final String PROP_DIRECTION = "direction"; public static final String[] BT_NAMES = { "nw", "n", "ne", "w", "c", "e", "sw", "s", "se" }; public static final java.awt.Dimension BT_DIMENSION = new java.awt.Dimension(16, 16); private JToggleButton[] buttons; private int direction; /** Creates new Compass */ public Compass() { super(new java.awt.GridLayout(3, 3)); setOpaque(false); direction = -1; ActionListener lst = new ActionListener() { public void actionPerformed(ActionEvent ev) { String c = ev.getActionCommand(); for (int i = 0; i < 9; i++) { if (BT_NAMES[i].equals(c)) { setDirection(i); break; } } } }; ButtonGroup bg = new ButtonGroup(); buttons = new JToggleButton[9]; for (int i = 0; i < 9; i++) { JToggleButton btn = new JToggleButton( new ImageIcon(getClass().getResource("/edu/xtec/resources/icons/" + BT_NAMES[i] + ".gif"))); btn.setPreferredSize(BT_DIMENSION); bg.add(btn); btn.setActionCommand(BT_NAMES[i]); btn.addActionListener(lst); btn.setFocusPainted(false); add(btn); buttons[i] = btn; } } public int getDirection() { return direction; } public void setDirection(int value) { int oldValue = direction; direction = value; firePropertyChange(PROP_DIRECTION, oldValue, direction); if (value >= 0) { if (buttons[value] != null && !buttons[value].isSelected()) buttons[value].setSelected(true); } else if (oldValue >= 0) buttons[oldValue].setSelected(false); } public int[] getDoubleDirection() { int[] result = new int[2]; int v = (direction < 0 ? 4 : direction); result[0] = v % 3; result[1] = v / 3; return result; } public void setDoubleDirection(int[] value) { if (value == null || value.length != 2 || value[0] < 0 || value[1] < 0) setDirection(-1); else setDirection(3 * value[1] + value[0]); } } src/author/edu/xtec/jclic/beans/EventSoundsButton.java000066400000000000000000000052531335566474600234070ustar00rootroot00000000000000/* * File : EventSoundsButton.java * Created : 27-sep-2002 15:34 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.media.EventSoundsEditorPanel; import edu.xtec.util.JDomUtility; import edu.xtec.util.ResourceManager; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class EventSoundsButton extends NullableObject { public static final String PROP_EVSND_NAME = "eventSounds"; MediaBagEditor mbe; EventSounds evs = new EventSounds(null); /** Creates a new instance of ImgPanel */ public EventSoundsButton() { super(); button.setIcon(ResourceManager.getImageIcon("icons/audio_off.gif")); } @Override protected String getObjectType() { return PROP_EVSND_NAME; } public void setMediaBagEditor(MediaBagEditor mbe) { this.mbe = mbe; } public EventSounds getEventSounds() { evs.setEnabled(getObject() == null ? JDomUtility.FALSE : JDomUtility.DEFAULT); return evs; } public void setEventSounds(EventSounds evs) { if (evs == null) evs = new EventSounds(null); this.evs = evs; setObject(evs.getEnabled() == JDomUtility.FALSE ? null : evs); } @Override public void setObject(Object value) { boolean preStatus = (object != null); super.setObject(value); boolean status = (object != null); if (preStatus != status) { button.setIcon(ResourceManager.getImageIcon(status ? "icons/audio_on.gif" : "icons/audio_off.gif")); } if (value instanceof EventSounds) evs = (EventSounds) value; evs.setEnabled(status ? JDomUtility.DEFAULT : JDomUtility.FALSE); } @Override protected Object createObject() { evs.setEnabled(JDomUtility.DEFAULT); return evs; } @Override protected Object editObject(Object o) { if (options == null || mbe == null) return null; return EventSoundsEditorPanel.getEventSounds(evs, options, this, mbe); } } src/author/edu/xtec/jclic/beans/GradientButton.java000066400000000000000000000046551335566474600226740ustar00rootroot00000000000000/* * File : GradientButton.java * Created : 27-sep-2002 11:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.jclic.misc.Gradient; import edu.xtec.jclic.misc.GradientEditor; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import javax.swing.AbstractButton; import javax.swing.JButton; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class GradientButton extends NullableObject { public static final String PROP_GRADIENT = "gradient"; /** Creates a new instance of GradientPanel */ public GradientButton() { super(); } @Override protected String getObjectType() { return PROP_GRADIENT; } public Gradient getGradient() { return (Gradient) getObject(); } public void setGradient(Gradient g) { setObject(g); } @Override protected AbstractButton buildButton() { return new JButton() { @Override public void paintComponent(Graphics g) { super.paintComponent(g); Gradient gradient = getGradient(); if (gradient != null) { Rectangle r = new Rectangle(0, 0, getWidth(), getHeight()); r.grow(-3, -3); Graphics2D g2 = (Graphics2D) g; RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(edu.xtec.jclic.Constants.DEFAULT_RENDERING_HINTS); gradient.paint(g2, r); g2.setRenderingHints(rh); } } }; } @Override protected Object createObject() { return new Gradient(); } @Override protected Object editObject(Object o) { Gradient g = (Gradient) (o == null ? createObject() : o); return GradientEditor.getGradient(g, this, options); } } src/author/edu/xtec/jclic/beans/ImgButton.java000066400000000000000000000047131335566474600216460ustar00rootroot00000000000000/* * File : ImgButton.java * Created : 27-sep-2002 15:34 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.bags.MediaBagSelector; import edu.xtec.jclic.misc.Utils; import java.awt.Rectangle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ImgButton extends NullableObject { public static final String PROP_IMG_NAME = "imageName"; MediaBagEditor mbe; /** Creates a new instance of ImgPanel */ public ImgButton() { super(); } @Override protected String getObjectType() { return PROP_IMG_NAME; } public void setMediaBagEditor(MediaBagEditor mbe) { this.mbe = mbe; } public String getImgName() { return (String) getObject(); } public void setImgName(String name) { setObject(name); } @Override public void setObject(Object value) { super.setObject(value); if (nullValue || object == null || mbe == null) button.setIcon(null); else { try { Rectangle r = button.getVisibleRect(); int w = r.width - 4; int h = r.height - 4; if (w > 0 && h > 0) { String s = (String) object; MediaBag mb = mbe.getMediaBag(); button.setIcon(mb.getImageElement(s).getThumbNail(w, h, mb.getProject().getFileSystem())); } } catch (Exception ex) { System.err.println("Error reading image:\n" + ex); } } } @Override protected Object createObject() { return null; } @Override protected Object editObject(Object o) { if (options == null || mbe == null) return null; return MediaBagSelector.getMediaName((String) o, options, this, mbe, Utils.ALL_IMAGES_FF); } } src/author/edu/xtec/jclic/beans/ImgPanel.java000066400000000000000000000031061335566474600214250ustar00rootroot00000000000000/* * File : ImgPanel.java * Created : 17-feb-2004 14:57 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import java.awt.Dimension; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JLabel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ImgPanel extends JLabel { private boolean missingPicture = false; public ImgPanel(Image img) { this(new ImageIcon(img)); } public ImgPanel(ImageIcon i) { super(i); if (i == null) { missingPicture = true; setText("No picture found."); setHorizontalAlignment(CENTER); setOpaque(true); } setAutoscrolls(true); // enable synthetic drag events } @Override public Dimension getPreferredSize() { if (missingPicture) { return new Dimension(320, 480); } else { return super.getPreferredSize(); } } } src/author/edu/xtec/jclic/beans/MediaContentButton.java000066400000000000000000000057031335566474600235040ustar00rootroot00000000000000/* * File : MediaContentButton.java * Created : 23-dec-2002 16:26 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.media.MediaContent; import edu.xtec.jclic.media.MediaContentEditor; import edu.xtec.util.ResourceManager; import javax.swing.UIManager; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class MediaContentButton extends NullableObject { public static final String PROP_MEDIA_CONTENT = "mediaContent"; public static final String[] MEDIA_ICONS = { "icons/unknown_small.gif", "icons/audio_on.gif", "icons/movie.gif", "icons/music.gif", "icons/cdaudio.gif", "icons/speak.gif", "icons/play_speaked.gif", "icons/jump_to_activity.gif", "icons/jump_to_sequence.gif", "icons/run_external.gif", "icons/html_doc.gif", "icons/cancel.gif", "icons/return.gif" }; MediaBagEditor mbe; /** Creates a new instance of MediaContentButton */ public MediaContentButton() { super(); } @Override protected String getObjectType() { return PROP_MEDIA_CONTENT; } public MediaContent getMediaContent() { return (MediaContent) getObject(); } public void setMediaContent(MediaContent mc) { setObject(mc); } public void setMediaBagEditor(MediaBagEditor mbe) { this.mbe = mbe; } @Override public void setObject(Object value) { super.setObject(value); if (nullValue || object == null) { button.setBackground(UIManager.getColor("Button.background")); button.setForeground(UIManager.getColor("Button.foreground")); button.setIcon(null); } else { MediaContent mc = (MediaContent) value; String imgName = "unknown_small.gif"; if (mc.mediaType >= 0 && mc.mediaType < MEDIA_ICONS.length) imgName = MEDIA_ICONS[mc.mediaType]; button.setIcon(ResourceManager.getImageIcon(imgName)); } } @Override protected Object createObject() { return new MediaContent(); } @Override protected Object editObject(Object o) { MediaContent mc = (MediaContent) (o == null ? createObject() : o); return MediaContentEditor.getMediaContent(mc, this, options, mbe); } } src/author/edu/xtec/jclic/beans/NullableObject.java000066400000000000000000000115531335566474600226230ustar00rootroot00000000000000/* * File : NullableObject.java * Created : 04-nov-2002 15:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.util.Options; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractButton; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class NullableObject extends JPanel implements ActionListener { public static final String PROP_CUSTOM_OBJECT = "customObject"; protected Object object; protected JCheckBox check; protected boolean nullValue; protected AbstractButton button; protected Options options; protected boolean modified; public static final int PANEL_HEIGHT = 21, CHECK_WIDTH = 14, BUTTON_WIDTH = 31; public static final Dimension btDim = new Dimension(BUTTON_WIDTH, PANEL_HEIGHT); public static final Dimension checkDim = new Dimension(CHECK_WIDTH, PANEL_HEIGHT); public static final Dimension panelDim = new Dimension(BUTTON_WIDTH + CHECK_WIDTH, PANEL_HEIGHT); /** Creates new NullableObject */ public NullableObject() { super(new java.awt.BorderLayout()); setOpaque(false); nullValue = true; check = new JCheckBox(); check.setPreferredSize(checkDim); check.setMinimumSize(checkDim); check.setFocusPainted(false); check.setSelected(false); add(check, java.awt.BorderLayout.WEST); button = buildButton(); button.setPreferredSize(btDim); button.setMinimumSize(btDim); button.setFocusPainted(false); add(button, java.awt.BorderLayout.CENTER); check.addActionListener(this); button.addActionListener(this); } protected String getObjectType() { return PROP_CUSTOM_OBJECT; } protected Object createObject() { return new Object(); } protected AbstractButton buildButton() { return new JButton(); } public boolean isModified() { return modified; } public void setModified(boolean modified) { this.modified = modified; } protected Object editObject(Object o) { return o; }; @Override public void setToolTipText(String text) { super.setToolTipText(text); if (button != null) button.setToolTipText(text); if (check != null) check.setToolTipText(text); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (button != null) button.setEnabled(enabled); if (check != null) check.setEnabled(enabled); } @Override public void setName(String name) { if (check != null) check.setText(name); } public void setText(String text) { if (check != null) check.setText(text); } public void setOptions(Options options) { this.options = options; } public Options getOptions() { return options; } public Object getObject() { return nullValue ? null : object; } public void clear() { setObject((object = null)); } public void setObject(Object value) { nullValue = (value == null); if (!nullValue) object = value; check.setSelected(!nullValue); button.repaint(); } public void changeObject(Object o) { Object oldValue = getObject(); setObject(o); Object newValue = getObject(); if ((oldValue == null && newValue != null) || (oldValue != null && !oldValue.equals(newValue))) firePropertyChange(getObjectType(), oldValue, getObject()); } public void setIcon(Icon icon) { button.setIcon(icon); } public Icon getIcon() { return button.getIcon(); } public void actionPerformed(ActionEvent ev) { if (ev != null) { if (button.equals(ev.getSource())) { modified = true; Object o = editObject(object); if (o != null) changeObject(o); } else if (check.equals(ev.getSource())) { changeObject(check.isSelected() ? (object == null ? createObject() : object) : null); modified = true; } } } } src/author/edu/xtec/jclic/beans/RollPanel.form000066400000000000000000000134171335566474600216510ustar00rootroot00000000000000
src/author/edu/xtec/jclic/beans/RollPanel.java000066400000000000000000000103761335566474600216300ustar00rootroot00000000000000/* * File : RollPanel.java * Created : 10-mar-2004 09:50 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class RollPanel extends javax.swing.JPanel { /** Creates new form RollPanel */ public RollPanel() { initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents mainPanel = new javax.swing.JPanel(); titleBarPanel = new javax.swing.JPanel(); rollBtn = new javax.swing.JToggleButton(); titleLb = new javax.swing.JLabel(); separator = new javax.swing.JSeparator(); setLayout(new java.awt.BorderLayout()); setBorder(new javax.swing.border.EtchedBorder()); add(mainPanel, java.awt.BorderLayout.CENTER); titleBarPanel.setLayout(new java.awt.BorderLayout()); titleBarPanel.setBackground(edu.xtec.util.LFUtil.getColor("TableHeader.background", getBackground())); rollBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/panel_opened.gif"))); rollBtn.setBorder(null); rollBtn.setSelectedIcon( new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/panel_closed.gif"))); rollBtn.setFocusPainted(false); rollBtn.setContentAreaFilled(false); rollBtn.setBorderPainted(false); rollBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { rollBtnActionPerformed(evt); } }); titleBarPanel.add(rollBtn, java.awt.BorderLayout.WEST); titleLb.setText("title"); titleLb.setForeground(edu.xtec.util.LFUtil.getColor("TableHeader.foreground", getForeground())); titleLb.setFont(edu.xtec.util.LFUtil.getFont("TableHeader.font", getFont())); titleBarPanel.add(titleLb, java.awt.BorderLayout.CENTER); titleBarPanel.add(separator, java.awt.BorderLayout.SOUTH); add(titleBarPanel, java.awt.BorderLayout.NORTH); } // GEN-END:initComponents private void rollBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_rollBtnActionPerformed mainPanel.setVisible(!rollBtn.isSelected()); separator.setVisible(!rollBtn.isSelected()); } // GEN-LAST:event_rollBtnActionPerformed /** * Getter for property mainPanel. * * @return Value of property mainPanel. */ public javax.swing.JPanel getMainPanel() { return mainPanel; } public void setTitle(String title) { titleLb.setText(title); } public String getTitle() { return titleLb.getText(); } public void setIcon(javax.swing.Icon icon) { titleLb.setIcon(icon); } public javax.swing.Icon getIcon() { return titleLb.getIcon(); } public boolean isOpened() { return !rollBtn.isSelected(); } public void setOpened(boolean value) { rollBtn.setSelected(!value); rollBtnActionPerformed(null); } @Override public void setToolTipText(String text) { super.setToolTipText(text); mainPanel.setToolTipText(text); titleBarPanel.setToolTipText(text); titleLb.setToolTipText(text); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel mainPanel; private javax.swing.JToggleButton rollBtn; private javax.swing.JSeparator separator; private javax.swing.JPanel titleBarPanel; private javax.swing.JLabel titleLb; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/beans/RollPanelBeanInfo.java000066400000000000000000000027001335566474600232220ustar00rootroot00000000000000/* * File : RollPanelBeanInfo.java * Created : 10-mar-2004 11:35 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import java.beans.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class RollPanelBeanInfo extends SimpleBeanInfo { /** * Gets the bean's BeanDescriptors. * * @return BeanDescriptor describing the editable properties of this bean. May * return null if the information should be obtained by automatic * analysis. */ @Override public BeanDescriptor getBeanDescriptor() { BeanDescriptor beanDescriptor = new BeanDescriptor(RollPanel.class, null); beanDescriptor.setValue("containerDelegate", "getMainPanel"); return beanDescriptor; } } src/author/edu/xtec/jclic/beans/SmallIntEditor.java000066400000000000000000000170041335566474600226250ustar00rootroot00000000000000/* * File : SmallIntEditor.java * Created : 02-dec-2002 16:14 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import java.awt.BorderLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.NumberFormat; import java.text.ParseException; import javax.swing.*; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class SmallIntEditor extends JPanel implements ActionListener { public static final String PROP_VALUE = "value"; private JButton plusButton, minusButton; private NumberField textFld; private int max, min, lastValue; private Toolkit toolkit; private NumberFormat integerFormatter; private int[] values; boolean editable; /** Creates a new instance of SmallIntEditor */ public SmallIntEditor() { setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); setOpaque(false); editable = true; toolkit = Toolkit.getDefaultToolkit(); integerFormatter = NumberFormat.getNumberInstance(); integerFormatter.setParseIntegerOnly(true); max = 10; min = 0; plusButton = new JButton(new ImageIcon(getClass().getResource("/edu/xtec/resources/icons/plus.gif"))); plusButton.setMnemonic('+'); plusButton.addActionListener(this); plusButton.setPreferredSize(new java.awt.Dimension(16, 16)); minusButton = new JButton(new ImageIcon(getClass().getResource("/edu/xtec/resources/icons/minus.gif"))); minusButton.setMnemonic('-'); minusButton.addActionListener(this); minusButton.setPreferredSize(new java.awt.Dimension(16, 16)); textFld = new NumberField(4); textFld.setColumns(4); textFld.setHorizontalAlignment(JTextField.CENTER); textFld.setText("0"); textFld.addActionListener(this); add(minusButton, BorderLayout.WEST); add(textFld, BorderLayout.CENTER); add(plusButton, BorderLayout.EAST); } @Override public void setToolTipText(String text) { super.setToolTipText(text); textFld.setToolTipText(text); plusButton.setToolTipText(text); minusButton.setToolTipText(text); } public void actionPerformed(ActionEvent ev) { int oldValue = lastValue; boolean btPlus = (plusButton == ev.getSource()); boolean btMinus = (minusButton == ev.getSource()); int delta = btPlus ? 1 : btMinus ? -1 : 0; if (delta != 0 && values != null && values.length > 0) { int p = 0; while (p < values.length && oldValue > values[p]) p++; if (delta < 0 || (p < values.length && values[p] == oldValue)) p += delta; if (p >= 0 && p < values.length) delta = values[p] - oldValue; else delta = 0; } if (delta != 0) { setValue(getValue() + delta); } checkValueRanges(); checkEnabled(); lastValue = getValue(); firePropertyChange(PROP_VALUE, oldValue, lastValue); } private void checkEnabled() { int value = getValue(); minusButton.setEnabled(isEnabled() && value > min); plusButton.setEnabled(isEnabled() && value < max); textFld.setEnabled(isEnabled() && editable); } @Override public void setEnabled(boolean b) { super.setEnabled(b); checkEnabled(); } public int getValue() { int retVal = 0; String s = textFld.getText(); if (s != null && s.length() > 0) { try { retVal = integerFormatter.parse(s).intValue(); } catch (ParseException e) { // This should never happen because insertString allows // only properly formatted data to get in the field. toolkit.beep(); System.err.println("Bad integer value " + s + ": " + e.getMessage()); } } return correctValue(retVal); } public void setValue(int value) { lastValue = correctValue(value); textFld.setText(integerFormatter.format(lastValue)); } public int correctValue(int value) { return Math.min(max, Math.max(min, value)); } private void checkValueRanges() { int v = 0; try { v = integerFormatter.parse(textFld.getText()).intValue(); } catch (ParseException e) { } if (v < min || v > max) setValue(correctValue(v)); } public void setEditColumns(int columns) { textFld.setColumns(columns); } public int getEditColumns() { return textFld.getColumns(); } /** * Getter for property max. * * @return Value of property max. */ public int getMax() { return max; } /** * Setter for property max. * * @param max New value of property max. */ public void setMax(int max) { this.max = max; } /** * Getter for property min. * * @return Value of property min. */ public int getMin() { return min; } /** * Setter for property min. * * @param min New value of property min. */ public void setMin(int min) { this.min = min; } /** * Getter for property values. * * @return Value of property values. */ public int[] getValues() { return this.values; } /** * Setter for property values. * * @param values New value of property values. */ public void setValues(int[] values) { this.values = values; } /** * Getter for property editable. * * @return Value of property editable. */ public boolean isEditable() { return editable; } /** * Setter for property editable. * * @param editable New value of property editable. */ public void setEditable(boolean editable) { this.editable = editable; checkEnabled(); } class NumberField extends JTextField { public NumberField(int columns) { super(columns); } @Override protected Document createDefaultModel() { return new WholeNumberDocument(); } protected class WholeNumberDocument extends PlainDocument { @Override public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { char[] source = str.toCharArray(); char[] result = new char[source.length]; int j = 0; for (int i = 0; i < result.length; i++) { if (Character.isDigit(source[i]) || source[i] == '-') result[j++] = source[i]; else { toolkit.beep(); } } super.insertString(offs, new String(result, 0, j), a); checkEnabled(); } @Override public void remove(int offs, int len) throws BadLocationException { super.remove(offs, len); checkEnabled(); } } } } src/author/edu/xtec/jclic/beans/SoundButton.java000066400000000000000000000043061335566474600222200ustar00rootroot00000000000000/* * File : SoundButton.java * Created : 27-sep-2002 15:34 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.bags.MediaBagSelector; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.ResourceManager; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class SoundButton extends NullableObject { public static final String PROP_SND_NAME = "soundName"; MediaBagEditor mbe; /** Creates a new instance of ImgPanel */ public SoundButton() { super(); button.setIcon(ResourceManager.getImageIcon("icons/audio_off.gif")); } @Override protected String getObjectType() { return PROP_SND_NAME; } public void setMediaBagEditor(MediaBagEditor mbe) { this.mbe = mbe; } public String getSoundName() { return (String) getObject(); } public void setSoundName(String name) { setObject(name); } @Override public void setObject(Object value) { boolean preStatus = (object != null); super.setObject(value); boolean status = (object != null); if (preStatus != status) button.setIcon(ResourceManager.getImageIcon(status ? "icons/audio_on.gif" : "icons/audio_off.gif")); } @Override protected Object createObject() { return null; } @Override protected Object editObject(Object o) { if (options == null || mbe == null) return null; return MediaBagSelector.getMediaName((String) o, options, this, mbe, Utils.ALL_SOUNDS_FF); } } src/author/edu/xtec/jclic/beans/TextListEditor.form000066400000000000000000000217561335566474600227150ustar00rootroot00000000000000
src/author/edu/xtec/jclic/beans/TextListEditor.java000066400000000000000000000332221335566474600226620ustar00rootroot00000000000000/* * File : TextListEditor.java * Created : 23-may-2003 11:19 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.beans; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.swing.DefaultListModel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.10.29 */ public class TextListEditor extends javax.swing.JPanel implements javax.swing.event.ListSelectionListener { public static final String PROP_LIST = "list"; Options options; DefaultListModel listModel; boolean modified; int maxItems = 999; int minItems = 0; boolean upperCase; /** Creates new form TextListEditor */ public TextListEditor() { this(null); } /** Creates new form TextListEditor */ public TextListEditor(Options options) { this.options = options; listModel = new DefaultListModel(); initComponents(); list.addListSelectionListener(this); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JScrollPane listScroll = new javax.swing.JScrollPane(); list = new javax.swing.JList(); btnPanel = new javax.swing.JPanel(); addBtn = new javax.swing.JButton(); removeBtn = new javax.swing.JButton(); editBtn = new javax.swing.JButton(); upBtn = new javax.swing.JButton(); downBtn = new javax.swing.JButton(); setLayout(new java.awt.GridBagLayout()); listScroll.setPreferredSize(new java.awt.Dimension(100, 60)); list.setModel(listModel); list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); listScroll.setViewportView(list); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(listScroll, gridBagConstraints); btnPanel.setLayout(new javax.swing.BoxLayout(btnPanel, javax.swing.BoxLayout.LINE_AXIS)); addBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/plus16.gif"))); // NOI18N addBtn.setToolTipText(options == null ? "" : options.getMsg("edit_list_newElement_tooltip")); addBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); addBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addBtnActionPerformed(evt); } }); btnPanel.add(addBtn); removeBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/minus16.gif"))); // NOI18N removeBtn.setToolTipText(options == null ? "" : options.getMsg("edit_list_deleteElement_tooltip")); removeBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); removeBtn.setEnabled(false); removeBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeBtnActionPerformed(evt); } }); btnPanel.add(removeBtn); editBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/edit.gif"))); // NOI18N editBtn.setToolTipText(options == null ? "" : options.getMsg("edit_list_editElement_tooltip")); editBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); editBtn.setEnabled(false); editBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editBtnActionPerformed(evt); } }); btnPanel.add(editBtn); upBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/up.gif"))); // NOI18N upBtn.setToolTipText(options == null ? "" : options.getMsg("edit_list_upBtn_tooltip")); upBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); upBtn.setEnabled(false); upBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { upBtnActionPerformed(evt); } }); btnPanel.add(upBtn); downBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/down.gif"))); // NOI18N downBtn.setToolTipText(options == null ? "" : options.getMsg("edit_list_downBtn_tooltip")); downBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); downBtn.setEnabled(false); downBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { downBtnActionPerformed(evt); } }); btnPanel.add(downBtn); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 2, 2, 2); add(btnPanel, gridBagConstraints); } // //GEN-END:initComponents private void addBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_addBtnActionPerformed int v = list.getSelectedIndex(); if (options != null) { Object s = editItem(null, true); if (s != null && s.toString().length() > 0) { if (upperCase) s = s.toString().toUpperCase(); listModel.add(v + 1, s); list.setSelectedIndex(v + 1); firePropertyChange(PROP_LIST, "", s); modified = true; } } } // GEN-LAST:event_addBtnActionPerformed private void editBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_editBtnActionPerformed int v = list.getSelectedIndex(); if (v >= 0 && options != null) { Object s = listModel.getElementAt(v); Object r = editItem(s, false); if (r != null && r.toString().length() > 0 && !r.equals(s)) { if (upperCase) r = r.toString().toUpperCase(); listModel.setElementAt(r, v); firePropertyChange(PROP_LIST, s, r); modified = true; } } } // GEN-LAST:event_editBtnActionPerformed private void downBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_downBtnActionPerformed int i = list.getSelectedIndex(); if (i >= 0 && i < listModel.getSize() - 1) { listModel.add(i + 1, listModel.remove(i)); list.setSelectedIndex(i + 1); firePropertyChange(PROP_LIST, i, i + 1); modified = true; } } // GEN-LAST:event_downBtnActionPerformed private void upBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_upBtnActionPerformed int i = list.getSelectedIndex(); if (i > 0) { listModel.add(i - 1, listModel.remove(i)); list.setSelectedIndex(i - 1); firePropertyChange(PROP_LIST, i, i - 1); modified = true; } } // GEN-LAST:event_upBtnActionPerformed private void removeBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_removeBtnActionPerformed Object o = list.getSelectedValue(); if (o != null) { listModel.removeElement(o); firePropertyChange(PROP_LIST, o, null); modified = true; checkEnabled(); } } // GEN-LAST:event_removeBtnActionPerformed /** * Getter for property options. * * @return Value of property options. */ public edu.xtec.util.Options getOptions() { return options; } /** * Setter for property options. * * @param options New value of property options. */ public void setOptions(edu.xtec.util.Options options) { this.options = options; } public void valueChanged(javax.swing.event.ListSelectionEvent listSelectionEvent) { if (listSelectionEvent == null || !listSelectionEvent.getValueIsAdjusting()) { checkEnabled(); } } protected void checkEnabled() { boolean enabled = isEnabled(); int v = list.getSelectedIndex(); int c = listModel.size(); addBtn.setEnabled(enabled && c < maxItems); upBtn.setEnabled(enabled && v > 0); downBtn.setEnabled(enabled && v >= 0 && v < list.getModel().getSize() - 1); removeBtn.setEnabled(enabled && v >= 0 && c > minItems); editBtn.setEnabled(enabled && v >= 0); } /** * Getter for property listData. * * @return Value of property listData. */ public List getListData() { Enumeration en = listModel.elements(); List result = new ArrayList(listModel.getSize()); while (en.hasMoreElements()) { Object o = en.nextElement(); // In some cases, DefaultListModel returns elements as a "list of elements" // with only one object inside if (o instanceof List) { List al = (List) o; o = al.get(0); } result.add(o); } return result; } /** * Setter for property listData. * * @param listData New value of property listData. */ public void setListData(List listData) { listModel.removeAllElements(); if (listData != null) { for (Object o : listData) { if (upperCase) o = o.toString().toUpperCase(); listModel.addElement(o); } } modified = false; checkEnabled(); } /** * Setter for property listData. * * @param textList String array with the list values. */ public void setTextList(String[] textList) { listModel.removeAllElements(); if (textList != null) { for (int i = 0; i < textList.length && i < maxItems; i++) { String s = textList[i]; if (upperCase) s = s.toUpperCase(); listModel.addElement(s); } } modified = false; checkEnabled(); } public String[] getTextList() { List v = getListData(); int n = v.size(); String[] result = new String[n]; for (int i = 0; i < n; i++) result[i] = v.get(i).toString(); return result; } /** * Getter for property modified. * * @return Value of property modified. */ public boolean isModified() { return modified; } /** * Setter for property modified. * * @param modified New value of property modified. */ public void setModified(boolean modified) { this.modified = modified; } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); checkEnabled(); } /** * Getter for property maxItems. * * @return Value of property maxItems. */ public int getMaxItems() { return maxItems; } /** * Setter for property maxItems. * * @param maxItems New value of property maxItems. */ public void setMaxItems(int maxItems) { this.maxItems = maxItems; checkEnabled(); } /** * Getter for property minItems. * * @return Value of property minItems. */ public int getMinItems() { return minItems; } /** * Setter for property minItems. * * @param minItems New value of property minItems. */ public void setMinItems(int minItems) { this.minItems = minItems; checkEnabled(); } protected Object editItem(Object currentValue, boolean newValue) { Object result; if (newValue) result = options.getMessages().showInputDlg(this, (String) null, "edit_list_newValue", "", "edit_list_addElement", false); else result = options.getMessages().showInputDlg(this, (String) null, "edit_list_newValue", StrUtils.nullableString(currentValue), "edit_list_modifyValue", false); return result; } @Override public void setToolTipText(String text) { super.setToolTipText(text); list.setToolTipText(text); btnPanel.setToolTipText(text); } /** * Getter for property upperCase. * * @return Value of property upperCase. */ public boolean isUpperCase() { return upperCase; } /** * Setter for property upperCase. * * @param upperCase New value of property upperCase. */ public void setUpperCase(boolean upperCase) { this.upperCase = upperCase; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addBtn; private javax.swing.JPanel btnPanel; private javax.swing.JButton downBtn; private javax.swing.JButton editBtn; private javax.swing.JList list; private javax.swing.JButton removeBtn; private javax.swing.JButton upBtn; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/boxes/000077500000000000000000000000001335566474600171165ustar00rootroot00000000000000src/author/edu/xtec/jclic/boxes/ActiveBagContentControlPanel.form000066400000000000000000000615231335566474600255130ustar00rootroot00000000000000
src/author/edu/xtec/jclic/boxes/ActiveBagContentControlPanel.java000066400000000000000000000547321335566474600254750ustar00rootroot00000000000000/* * File : ActiveBagContentControlPanel.java * Created : 01-apr-2003 10:38 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity; import edu.xtec.jclic.beans.*; import edu.xtec.jclic.shapers.Shaper; import edu.xtec.util.Options; import edu.xtec.util.TripleString; import java.awt.Dimension; import java.util.EventObject; import javax.swing.ComboBoxModel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActiveBagContentControlPanel extends edu.xtec.util.CtrlPanel { ActiveBagContentEditor parent; ActiveBagContent abc, altAbc; ActiveBagContentControlPanel syncPanel; boolean altNull; Options options; int index; int altIndex; int visualIndex; boolean simpleMode; /** Creates new form ActiveBagContentControlPanel */ public ActiveBagContentControlPanel(ActiveBagContentEditor parent, int index, int altIndex, int visualIndex, boolean simpleMode) { setInitializing(true); this.simpleMode = simpleMode; this.parent = parent; options = parent.getOptions(); this.index = index; this.altIndex = altIndex; this.visualIndex = visualIndex; altNull = altIndex >= 0; initComponents(); if (altIndex < 0 || simpleMode) { altChk.setEnabled(false); altChk.setVisible(false); toggleAlt.setEnabled(false); toggleAlt.setVisible(false); } if (simpleMode) { shaperLb.setVisible(false); shaperCombo.setVisible(false); shaperEditBtn.setVisible(false); scrambleChk.setVisible(false); nRowsLb.setVisible(false); nRowsEdit.setVisible(false); nColsLb.setVisible(false); nColsEdit.setVisible(false); imgLb.setVisible(false); imgButton.setVisible(false); } setInitializing(false); } protected void setSyncpanel(ActiveBagContentControlPanel syncPanel) { this.syncPanel = syncPanel; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel spacer3 = new javax.swing.JLabel(); shaperLb = new javax.swing.JLabel(); shaperCombo = new javax.swing.JComboBox( edu.xtec.jclic.shapers.Shaper.getSystemShaperList(options).toArray()); shaperEditBtn = new javax.swing.JButton(); scrambleChk = new javax.swing.JCheckBox(); altChk = new javax.swing.JCheckBox(); toggleAlt = new javax.swing.JToggleButton(); javax.swing.JLabel spacer2 = new javax.swing.JLabel(); nRowsLb = new javax.swing.JLabel(); nRowsEdit = new edu.xtec.jclic.beans.SmallIntEditor(); nColsLb = new javax.swing.JLabel(); nColsEdit = new edu.xtec.jclic.beans.SmallIntEditor(); imgLb = new javax.swing.JLabel(); imgButton = new edu.xtec.jclic.beans.ImgButton(); imgButton.setOptions(options); javax.swing.JLabel widthLb = new javax.swing.JLabel(); widthEdit = new edu.xtec.jclic.beans.SmallIntEditor(); javax.swing.JLabel heightLb = new javax.swing.JLabel(); heightEdit = new edu.xtec.jclic.beans.SmallIntEditor(); javax.swing.JLabel styleLb = new javax.swing.JLabel(); boxBaseButton = new edu.xtec.jclic.beans.BoxBaseButton(); boxBaseButton.setOptions(options); borderChk = new javax.swing.JCheckBox(); setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; add(spacer3, gridBagConstraints); shaperLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/select_shaper.gif"))); // NOI18N shaperLb.setLabelFor(shaperCombo); shaperLb.setText(":"); shaperLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(shaperLb, gridBagConstraints); shaperCombo.setToolTipText(options.getMsg("edit_act_shaper_tooltip")); shaperCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(shaperCombo, gridBagConstraints); shaperEditBtn.setText("..."); shaperEditBtn.setMargin(new java.awt.Insets(0, 4, 0, 4)); shaperEditBtn.setEnabled(false); shaperEditBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(shaperEditBtn, gridBagConstraints); scrambleChk.setText(options.getMsg("edit_act_scramble")); scrambleChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(scrambleChk, gridBagConstraints); altChk.setToolTipText(options.getMsg("edit_act_alt_tooltip")); altChk.setText(options.getMsg("edit_act_alt")); altChk.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); altChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(altChk, gridBagConstraints); toggleAlt.setToolTipText(options.getMsg("edit_act_alt_toggle_tooltip")); toggleAlt.setText(options.getMsg("edit_act_alt_toggle")); toggleAlt.setMargin(new java.awt.Insets(0, 4, 0, 4)); toggleAlt.setEnabled(false); toggleAlt.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(toggleAlt, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(spacer2, gridBagConstraints); nRowsLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_rows.gif"))); // NOI18N nRowsLb.setLabelFor(nRowsEdit); nRowsLb.setText(":"); nRowsLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(nRowsLb, gridBagConstraints); nRowsEdit.setToolTipText(options.getMsg("edit_act_num_rows_tooltip")); nRowsEdit.setMax(30); nRowsEdit.setMin(1); nRowsEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(nRowsEdit, gridBagConstraints); nColsLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_cols.gif"))); // NOI18N nColsLb.setLabelFor(nColsEdit); nColsLb.setText(":"); nColsLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(nColsLb, gridBagConstraints); nColsEdit.setToolTipText(options.getMsg("edit_act_num_cols_tooltip")); nColsEdit.setMax(30); nColsEdit.setMin(1); nColsEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(nColsEdit, gridBagConstraints); imgLb.setLabelFor(imgButton); imgLb.setText(options.getMsg("edit_act_image")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(imgLb, gridBagConstraints); imgButton.setToolTipText(options.getMsg("edit_act_image_tooltip")); imgButton.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(imgButton, gridBagConstraints); widthLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_width.gif"))); // NOI18N widthLb.setLabelFor(widthEdit); widthLb.setText(":"); widthLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(widthLb, gridBagConstraints); widthEdit.setToolTipText(options.getMsg("edit_act_cell_width_tooltip")); widthEdit.setMax(999); widthEdit.setMin(edu.xtec.jclic.Constants.MIN_CELL_SIZE); widthEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(widthEdit, gridBagConstraints); heightLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_height.gif"))); // NOI18N heightLb.setLabelFor(heightEdit); heightLb.setText(":"); heightLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(heightLb, gridBagConstraints); heightEdit.setToolTipText(options.getMsg("edit_act_cell_height_tooltip")); heightEdit.setMax(999); heightEdit.setMin(edu.xtec.jclic.Constants.MIN_CELL_SIZE); heightEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(heightEdit, gridBagConstraints); styleLb.setLabelFor(boxBaseButton); styleLb.setText(options.getMsg("edit_act_style")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(styleLb, gridBagConstraints); boxBaseButton.setToolTipText(options.getMsg("edit_style_tooltip")); boxBaseButton.addPropertyChangeListener(BoxBaseButton.PROP_BOX_BASE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(boxBaseButton, gridBagConstraints); borderChk.setText(options.getMsg("edit_act_border")); borderChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(borderChk, gridBagConstraints); } // //GEN-END:initComponents @Override public boolean eventPerformed(EventObject ev) { boolean result = true; if (abc != null && ev != null && ev.getSource() != null) { Object src = ev.getSource(); if (src == altChk) altChkActionPerformed(); else if (src == toggleAlt) { toggleAltActionPerformed(); result = false; } else if (src == shaperCombo) { shaperComboActionPerformed(); } else if (src == shaperEditBtn) { result = shaperEditBtnActionPerformed(); } else if (src == boxBaseButton) { boxBaseButtonActionPerformed(); } else if (src == imgButton) { imgButtonActionPerformed(); } else if (src == borderChk) { borderChkActionPerformed(); } if (src == widthEdit || src == heightEdit) { parent.abcpp.doResize(visualIndex, widthEdit.getValue(), heightEdit.getValue(), true); } else { if (src == nColsEdit || src == nRowsEdit || src == shaperCombo || src == shaperEditBtn) { shaperChange(); sync(); } parent.abcpp.setActiveBagContent(visualIndex, abc, altNull ? null : altAbc, null); ActiveBoxBag abg = (ActiveBoxBag) parent.abcpp.getAbstractBox(visualIndex); if (abg != null) { boxBaseButton.setPreview(abg); abg.setAlternative(toggleAlt.isSelected()); } } } return result; } protected void resized() { if (abc != null) { widthEdit.setValue((int) abc.w); heightEdit.setValue((int) abc.h); } } public void fillData(Activity act) { abc = (act != null && act.abc != null && act.abc.length > index ? act.abc[index] : null); altAbc = (act != null && act.abc != null && altIndex >= 0 && altIndex < act.abc.length) ? act.abc[altIndex] : null; setActiveBagContent(abc, altAbc); scrambleChk.setSelected(act != null && (act.shuffleAlways() || (act.scramble != null && act.scramble.length > index ? act.scramble[index] : false))); scrambleChk.setEnabled(act != null && !act.shuffleAlways()); } public void setActiveBagContent(ActiveBagContent abc, ActiveBagContent altAbc) { this.abc = abc; this.altAbc = altAbc; altNull = (altAbc == null); if (abc != null && !simpleMode) abc.checkCells(); if (altAbc != null && !simpleMode) altAbc.checkCells(); altChk.setSelected(!altNull); altChk.setEnabled(abc != null); toggleAlt.setSelected(false); toggleAlt.setEnabled(!altNull); imgButton.setMediaBagEditor(parent.mediaBagEditor); imgButton.setImgName(abc != null ? abc.imgName : null); imgButton.setEnabled(abc != null); boxBaseButton.setBoxBase(abc != null ? abc.bb : null); parent.abcpp.setActiveBagContent(visualIndex, abc, altAbc, null); boxBaseButton.setPreview(parent.abcpp.getAbstractBox(visualIndex)); boxBaseButton.setEnabled(abc != null); Shaper sh = (abc != null ? abc.getShaper() : null); ComboBoxModel model = shaperCombo.getModel(); int modelSize = model.getSize(); int i = -1; if (sh != null) { String s = sh.getClassName(); for (i = 0; i < modelSize; i++) { TripleString ts = (TripleString) model.getElementAt(i); if (s.equals(ts.getClassName())) break; } } shaperCombo.setSelectedIndex(i < modelSize ? i : -1); shaperCombo.setEnabled(abc != null); shaperEditBtn.setEnabled(sh != null && sh.getEditorPanelClassName() != null); nColsEdit.setValue(sh != null ? sh.getNumColumns() : 1); nColsEdit.setEnabled(abc != null); nRowsEdit.setValue(sh != null ? sh.getNumRows() : 1); nRowsEdit.setEnabled(abc != null); widthEdit.setValue(abc != null ? (int) abc.w : 30); widthEdit.setEnabled(abc != null); heightEdit.setValue(abc != null ? (int) abc.h : 20); heightEdit.setEnabled(abc != null); borderChk.setSelected(abc != null ? abc.border : false); borderChk.setEnabled(abc != null); } public void saveData(Activity act) { if (act != null && act.abc != null && act.abc.length > index) { act.abc[index] = abc; act.scramble[index] = scrambleChk.isSelected(); if (altIndex >= 0 && altIndex < act.abc.length) act.abc[altIndex] = altNull ? null : altAbc; } } // Control actions private void altChkActionPerformed() { if (toggleAlt.isSelected()) { toggleAlt.setSelected(false); toggleAltActionPerformed(); } altNull = !altChk.isSelected(); if (abc != null && !altNull && altAbc == null) { altAbc = ActiveBagContent.initNew(abc.ncw, abc.nch, 'A'); if (parent.abcpp != null) parent.abcpp.setActiveBagContent(visualIndex, abc, altAbc, null); } toggleAlt.setEnabled(!altNull); } private void toggleAltActionPerformed() { if (abc != null && !altNull && altAbc != null && parent.abcpp != null && parent.abcpp.getAbstractBox(visualIndex) != null) { boolean alt = toggleAlt.isSelected(); ((ActiveBoxGrid) parent.abcpp.getAbstractBox(visualIndex)).setAlternative(alt); imgButton.setImgName(alt ? altAbc.imgName : abc.imgName); } } private void shaperComboActionPerformed() { TripleString ts = (TripleString) shaperCombo.getSelectedItem(); } private boolean shaperEditBtnActionPerformed() { if (abc == null) return false; AbstractBox bx = parent.abcpp.getAbstractBox(visualIndex); Dimension d = new Dimension((int) bx.getWidth(), (int) bx.getHeight()); Dimension dBak = (Dimension) d.clone(); Shaper sh = abc.shaper.edit(this, options, d, abc.img, bx.getBoxBaseResolve()); if (sh == null) return false; abc.setShaper(sh); abc.ncw = Math.max(1, sh.getNumColumns()); abc.nch = Math.max(1, sh.getNumRows()); nColsEdit.setValue(abc.ncw); nRowsEdit.setValue(abc.nch); abc.checkCells(); if (!dBak.equals(d)) { abc.w = d.width / abc.ncw; abc.h = d.height / abc.nch; } return true; } private void boxBaseButtonActionPerformed() { BoxBase bb = boxBaseButton.getBoxBase(); if (abc != null && bb != null) { abc.setBoxBase(bb); if (altAbc != null && simpleMode) { altAbc.setBoxBase(bb); } } } private void imgButtonActionPerformed() { if (abc != null) { ActiveBagContent abcDest = toggleAlt.isSelected() ? altAbc : abc; if (abcDest.imgName != null) abcDest.img = null; abcDest.imgName = imgButton.getImgName(); if (parent.mediaBagEditor != null) { try { if (abcDest.imgName != null) abcDest.setImgContent(parent.mediaBagEditor.getMediaBag().getImageElement(abcDest.imgName), true); else abcDest.setImgContent(null, false); } catch (Exception ex) { options.getMessages().showErrorWarning(this, "ERROR", ex); } } } } protected void sync() { if (abc != null && syncPanel != null && syncPanel.abc != null) { syncPanel.nColsEdit.setValue(nColsEdit.getValue()); syncPanel.nRowsEdit.setValue(nRowsEdit.getValue()); syncPanel.shaperCombo.setSelectedItem(shaperCombo.getSelectedItem()); syncPanel.shaperChange(); } } private void shaperChange() { if (abc == null) return; try { abc.ncw = nColsEdit.getValue(); abc.nch = nRowsEdit.getValue(); TripleString ts = (TripleString) shaperCombo.getSelectedItem(); String newShaperClass = ts.getClassName(); if (!abc.getShaper().getClassName().equals(newShaperClass)) { abc.setShaper(Shaper.createShaper(newShaperClass, abc.ncw, abc.nch)); abc.checkCells(); } else { abc.getShaper().reset(abc.ncw, abc.nch); abc.checkCells(); } if (abc.imgName != null) abc.setImgContent(parent.mediaBagEditor.getMediaBag().getImageElement(abc.imgName), true); if (altAbc != null) { altAbc.setShaper(abc.getShaper()); altAbc.checkCells(); if (altAbc.imgName != null) altAbc.setImgContent(parent.mediaBagEditor.getMediaBag().getImageElement(altAbc.imgName), true); } shaperEditBtn.setEnabled(abc.getShaper().getEditorPanelClassName() != null); } catch (Exception ex) { options.getMessages().showErrorWarning(this, "edit_act_shaper_err", ex); } } private void borderChkActionPerformed() { if (abc != null) abc.border = borderChk.isSelected(); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox altChk; private javax.swing.JCheckBox borderChk; private edu.xtec.jclic.beans.BoxBaseButton boxBaseButton; private edu.xtec.jclic.beans.SmallIntEditor heightEdit; private edu.xtec.jclic.beans.ImgButton imgButton; private javax.swing.JLabel imgLb; private edu.xtec.jclic.beans.SmallIntEditor nColsEdit; private javax.swing.JLabel nColsLb; private edu.xtec.jclic.beans.SmallIntEditor nRowsEdit; private javax.swing.JLabel nRowsLb; private javax.swing.JCheckBox scrambleChk; private javax.swing.JComboBox shaperCombo; private javax.swing.JButton shaperEditBtn; private javax.swing.JLabel shaperLb; private javax.swing.JToggleButton toggleAlt; private edu.xtec.jclic.beans.SmallIntEditor widthEdit; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/boxes/ActiveBagContentEditor.form000066400000000000000000000046211335566474600243350ustar00rootroot00000000000000
src/author/edu/xtec/jclic/boxes/ActiveBagContentEditor.java000066400000000000000000000236551335566474600243230ustar00rootroot00000000000000/* * File : ActiveBagContentEditor.java * Created : 09-oct-2002 17:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity; import edu.xtec.jclic.ActivityEditorInternalPanel; import edu.xtec.jclic.ActivityEditorPanel; import edu.xtec.jclic.Constants; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.util.ResourceManager; import java.awt.BorderLayout; import javax.swing.JComponent; import javax.swing.JTabbedPane; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActiveBagContentEditor extends ActivityEditorInternalPanel { JTabbedPane ctrlTab; ActiveBagContentPreviewPanel abcpp; ActiveBagContentControlPanel[] cp; TextGridContentControlPanel tgp; ActiveBagContentRelPanel rp; ActiveBagContentLayoutPanel lp; MediaBagEditor mediaBagEditor; boolean useRel = false; boolean useBoolRel = false; boolean crossWord = false; int relIndex = -1; public static final int SINGLE = 0, // puzzles and info SINGLE_ALT = 1, // memory SINGLE_BOOL_ALT = 2, // identify SINGLE_LAYOUT = 3, // double puzzle DOUBLE_ALT = 4, // simple ass. DOUBLE_REL = 5, // explore DOUBLE_REL_ALT = 6, // complex ass. written answ. TEXTGRID_ALT = 7, // wordsearch TEXTGRID_CRW = 8; // crossWord /** Creates new form ActiveBagContentEditor */ public ActiveBagContentEditor(ActivityEditorPanel parent, int type) { super(parent); int altIndex = -1; int indexBis = -1; boolean showLayout = false; boolean useTextGrid = false; switch (type) { case SINGLE_BOOL_ALT: useBoolRel = true; altIndex = 1; break; case SINGLE_ALT: showLayout = true; altIndex = 1; break; case SINGLE_LAYOUT: showLayout = true; case SINGLE: break; case DOUBLE_REL_ALT: altIndex = 2; case DOUBLE_REL: useRel = true; indexBis = 1; showLayout = true; break; case DOUBLE_ALT: altIndex = 2; indexBis = 1; showLayout = true; break; case TEXTGRID_ALT: useTextGrid = true; indexBis = 0; showLayout = true; break; case TEXTGRID_CRW: useTextGrid = true; indexBis = 0; altIndex = 1; showLayout = true; crossWord = true; break; } initComponents(); abcpp = (ActiveBagContentPreviewPanel) previewPanel; cp = new ActiveBagContentControlPanel[2]; if (useTextGrid) tgp = new TextGridContentControlPanel(this, 0, !crossWord); else cp[0] = new ActiveBagContentControlPanel(this, 0, altIndex, 0, crossWord); if (indexBis >= 0) { cp[1] = new ActiveBagContentControlPanel(this, indexBis, crossWord ? 1 : -1, useTextGrid ? 1 : indexBis, crossWord); } if (cp[1] != null || useRel || useBoolRel || showLayout) { ctrlTab = new JTabbedPane(); ctrlTab.addTab(options.getMsg("edit_act_grid" + (cp[1] == null ? "" : "_A")), ResourceManager.getImageIcon("icons/grid.gif"), getFirstComponent()); if (cp[1] != null) ctrlTab.addTab(options.getMsg("edit_act_grid_B"), ResourceManager.getImageIcon("icons/grid.gif"), cp[1]); if (showLayout) { lp = new ActiveBagContentLayoutPanel(this); ctrlTab.addTab(options.getMsg("edit_act_grid_layout"), ResourceManager.getImageIcon("icons/grid_layout.gif"), lp); } if (useRel || useBoolRel) { relIndex = ctrlTab.getTabCount(); rp = new ActiveBagContentRelPanel(this, useBoolRel); ctrlTab.addTab(options.getMsg("edit_act_grid_relationship"), ResourceManager.getImageIcon("icons/relationship.gif"), rp); } add(ctrlTab, BorderLayout.NORTH); ctrlTab.getModel().addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { abcpp.setEditMode(ctrlTab.getSelectedIndex() == relIndex ? useBoolRel ? ActiveBagContentPreviewPanel.EDIT_BOOL : ActiveBagContentPreviewPanel.EDIT_LINKS : ActiveBagContentPreviewPanel.EDIT_GRIDS); } }); } else add(getFirstComponent(), BorderLayout.NORTH); if (type == DOUBLE_ALT && cp[0] != null && cp[1] != null) { cp[0].setSyncpanel(cp[1]); cp[1].setSyncpanel(cp[0]); } } private JComponent getFirstComponent() { JComponent result = tgp; if (result == null) result = cp[0]; return result; } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents previewScroll = new javax.swing.JScrollPane(); previewPanel = new ActiveBagContentPreviewPanel(this, crossWord); setLayout(new java.awt.BorderLayout()); previewPanel.setPreferredSize(new java.awt.Dimension(800, 600)); previewScroll.setViewportView(previewPanel); add(previewScroll, java.awt.BorderLayout.CENTER); } // GEN-END:initComponents public void fillData() { saveBag = null; saveBagAlt = null; Activity act = getActivity(); mediaBagEditor = act == null ? null : getActivityEditor().getMediaBagEditor(); if (tgp != null) tgp.fillData(act); if (cp[0] != null) cp[0].fillData(act); if (cp[1] != null) cp[1].fillData(act); if (rp != null) rp.fillData(act); if (lp != null) lp.fillData(act); checkTabs(); abcpp.setMediaBagEditor(mediaBagEditor); abcpp.setBoxGridPos(act == null ? Activity.AB : act.boxGridPos); } public void saveData() { Activity act = getActivity(); if (act != null) { if (tgp != null) tgp.saveData(act); if (cp[0] != null) cp[0].saveData(act); if (cp[1] != null) cp[1].saveData(act); if (rp != null) rp.saveData(act); if (lp != null) lp.saveData(act); } } private ActiveBagContent saveBag, saveBagAlt; protected void enableGridB(boolean value) { Activity act = getActivity(); if (cp[1] != null && act != null && act.abc != null) { int index = cp[1].index; if (value == false) { saveBag = cp[1].abc; saveBagAlt = cp[1].altAbc; act.abc[index] = null; } else { if (saveBag != null) { act.abc[index] = saveBag; if (cp[1].altIndex >= 0) act.abc[cp[1].altIndex] = saveBagAlt; } else { act.abc[index] = ActiveBagContent.initNew(2, 2, 'A'); } } cp[1].setInitializing(true); cp[1].fillData(act); cp[1].setInitializing(false); setModified(true); checkTabs(); } } protected void checkTabs() { Activity act = getActivity(); if (act != null && cp[1] != null && lp != null && ctrlTab != null) { boolean visible = (cp[1].abc != null); if (!visible && ctrlTab.getTabCount() == 3) { ctrlTab.remove(lp); ctrlTab.remove(cp[1]); } else if (visible && ctrlTab.getTabCount() == 1) { ctrlTab.addTab(options.getMsg("edit_act_grid_B"), ResourceManager.getImageIcon("icons/grid.gif"), cp[1]); ctrlTab.addTab(options.getMsg("edit_act_grid_layout"), ResourceManager.getImageIcon("icons/grid_layout.gif"), lp); } } } /* * public boolean dataChanged(){ return false; } */ protected javax.swing.Icon getIcon() { return edu.xtec.util.ResourceManager.getImageIcon("icons/panel.gif"); } protected String getTitle() { return options.getMsg("edit_act_panels_panel"); } protected String getTooltip() { return options.getMsg("edit_act_panels_panel_tooltip"); } // only called by abcpp; protected void panelSelected(int panel) { if (ctrlTab != null && panel >= 0 && panel < ctrlTab.getTabCount()) ctrlTab.setSelectedIndex(panel); } protected void resized(int panel) { if (panel >= 0 && (ctrlTab == null || panel < ctrlTab.getTabCount())) { if (panel == 0 && tgp != null) tgp.resized(); else if (cp != null && panel < cp.length && cp[panel] != null) cp[panel].resized(); } } public static boolean nameChanged(ActiveBagContent abc, int type, String oldName, String newName) { boolean result = false; if ((type & Constants.T_IMAGE) != 0 && oldName.equals(abc.imgName)) { abc.imgName = newName; result = true; } if (abc.backgroundContent != null) result |= ActiveBoxContentEditor.nameChanged(abc.backgroundContent, type, oldName, newName); for (int i = 0; i < abc.activeBoxContentArray.size(); i++) result |= ActiveBoxContentEditor.nameChanged(abc.getActiveBoxContent(i), type, oldName, newName); return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel previewPanel; private javax.swing.JScrollPane previewScroll; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/boxes/ActiveBagContentLayoutPanel.form000066400000000000000000000160551335566474600253500ustar00rootroot00000000000000
src/author/edu/xtec/jclic/boxes/ActiveBagContentLayoutPanel.java000066400000000000000000000142311335566474600253200ustar00rootroot00000000000000/* * File : ActiveBagContentLayoutPanel.java * Created : 03-apr-2003 12:54 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity; import edu.xtec.util.Options; import java.util.EventObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActiveBagContentLayoutPanel extends javax.swing.JPanel { ActiveBagContentEditor parent; Options options; int boxGridPos = Activity.AB; /** Creates new form ActiveBagContentRelPanel */ public ActiveBagContentLayoutPanel(ActiveBagContentEditor parent) { this.parent = parent; options = parent.getOptions(); initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; layoutGroup = new javax.swing.ButtonGroup(); abBtn = new javax.swing.JToggleButton(); baBtn = new javax.swing.JToggleButton(); aubBtn = new javax.swing.JToggleButton(); buaBtn = new javax.swing.JToggleButton(); setLayout(new java.awt.GridBagLayout()); abBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/ab_icon.gif"))); abBtn.setToolTipText(options.getMsg("edit_act_gridLayout_tooltip")); layoutGroup.add(abBtn); abBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { abBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 0); add(abBtn, gridBagConstraints); baBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/ba_icon.gif"))); baBtn.setToolTipText(options.getMsg("edit_act_gridLayout_tooltip")); layoutGroup.add(baBtn); baBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { baBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 0, 3, 0); add(baBtn, gridBagConstraints); aubBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/aub_icon.gif"))); aubBtn.setToolTipText(options.getMsg("edit_act_gridLayout_tooltip")); layoutGroup.add(aubBtn); aubBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { aubBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 0, 3, 0); add(aubBtn, gridBagConstraints); buaBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/bua_icon.gif"))); buaBtn.setToolTipText(options.getMsg("edit_act_gridLayout_tooltip")); layoutGroup.add(buaBtn); buaBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buaBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 0, 3, 3); add(buaBtn, gridBagConstraints); } // GEN-END:initComponents private void buaBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_buaBtnActionPerformed resetPanel(evt); } // GEN-LAST:event_buaBtnActionPerformed private void aubBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_aubBtnActionPerformed resetPanel(evt); } // GEN-LAST:event_aubBtnActionPerformed private void baBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_baBtnActionPerformed resetPanel(evt); } // GEN-LAST:event_baBtnActionPerformed private void abBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_abBtnActionPerformed resetPanel(evt); } // GEN-LAST:event_abBtnActionPerformed private void resetPanel(EventObject ev) { if (ev != null && ev.getSource() != null) { Object src = ev.getSource(); int v = src == abBtn ? Activity.AB : src == baBtn ? Activity.BA : src == aubBtn ? Activity.AUB : src == buaBtn ? Activity.BUA : boxGridPos; if (v != boxGridPos) { boxGridPos = v; selectItem(); parent.abcpp.setBoxGridPos(boxGridPos); } parent.setModified(true); } } private void selectItem() { abBtn.setSelected(boxGridPos == Activity.AB); baBtn.setSelected(boxGridPos == Activity.BA); aubBtn.setSelected(boxGridPos == Activity.AUB); buaBtn.setSelected(boxGridPos == Activity.BUA); } public void clear() { boxGridPos = Activity.AB; } public void fillData(Activity act) { if (act != null) { boxGridPos = act.boxGridPos; selectItem(); } } public void saveData(Activity act) { if (act != null) act.boxGridPos = boxGridPos; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JToggleButton abBtn; private javax.swing.JToggleButton aubBtn; private javax.swing.JToggleButton baBtn; private javax.swing.JToggleButton buaBtn; private javax.swing.ButtonGroup layoutGroup; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/boxes/ActiveBagContentPreviewPanel.java000066400000000000000000000635271335566474600255000ustar00rootroot00000000000000/* * File : ActiveBagContentPreviewPanel.java * Created : 10-oct-2002 10:57 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity; import edu.xtec.jclic.Constants; import edu.xtec.jclic.activities.textGrid.CrossWord; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.util.ResizerPanel; import java.awt.AWTEvent; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActiveBagContentPreviewPanel extends ResizerPanel implements FocusListener { public static final int MARGIN = 10; AbstractBox[] bg = new AbstractBox[2]; ActiveBoxBag[] abg = new ActiveBoxBag[2]; TextGrid[] grid = new TextGrid[2]; ActiveBagContent[] abc = new ActiveBagContent[2]; ActiveBagContent[] altAbc = new ActiveBagContent[2]; ActiveBagContent[][] allAbc = new ActiveBagContent[][] { abc, altAbc }; TextGridContent[] tgc = new TextGridContent[2]; MediaBagEditor mbe; boolean[] allowResize = new boolean[2]; boolean dragCursorX = false, dragCursorY = false; boolean dragging = false; int margin = MARGIN; private int cgrid = 0; int boxGridPos = Activity.AB; ActiveBagContentEditor parent; int editMode; int currentLine, highlightLine; BoxConnector bc; boolean showAllArrows = true; boolean crossWord = false; ActiveBox hClue, vClue; Color softLineColor = Color.blue; Color activeLineColor = Color.red; Color arrowColor = BoxConnector.DEFAULT_XOR_COLOR; public static final int EDIT_GRIDS = 0, EDIT_LINKS = 1, EDIT_BOOL = 2; public static final float ARROW_WIDTH = 2.0F; /** Creates a new instance of ActiveBagContentPreviewPanel */ public ActiveBagContentPreviewPanel(ActiveBagContentEditor parent, boolean isCrossWord) { this.parent = parent; crossWord = isCrossWord; bc = new BoxConnector(this); bc.arrow = true; bc.line_width = ARROW_WIDTH; bc.lineColor = activeLineColor; currentLine = -1; highlightLine = -1; editMode = EDIT_GRIDS; enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.KEY_EVENT_MASK); addFocusListener(this); } /* * ATENCIO: DEPRECATED A Java 1.4!! * * public boolean isFocusTraversable(){ if(grid[0]!=null || grid[1]!=null) * return true; return super.isFocusTraversable(); } */ public AbstractBox getAbstractBox(int index) { return bg[index]; } public boolean isCrossWord() { return crossWord; } public void setActiveBagContent(int index, ActiveBagContent abcx, ActiveBagContent altAbcx, TextGridContent tgcx) { abc[index] = abcx; altAbc[index] = altAbcx; tgc[index] = tgcx; bg[index] = null; grid[index] = null; abg[index] = null; if (tgc[index] != null) { grid[index] = TextGrid.createEmptyGrid(null, this, margin, margin, tgc[index], false); bg[index] = grid[index]; grid[index].setChars(tgc[index].text); if (crossWord) grid[index].setCellAttributes(true, false); grid[index].setCursorAt(0, 0, false); grid[index].setCursorEnabled(true); checkCursor(false); allowResize[index] = true; } else if (crossWord && index == 1 && abc[index] != null && altAbc[index] != null) { abg[1] = new ActiveBoxBag(null, this, abc[1].bb); bg[1] = abg[1]; ActiveBox ab = new ActiveBox(abg[1], this, null); ActiveBoxContent abct = new ActiveBoxContent(); abct.setImgContent(edu.xtec.util.ResourceManager.getImageIcon("buttons/textright.png").getImage(), null); ab.setContent(abct); abg[1].addActiveBox(ab); hClue = new ActiveBox(abg[1], this, null); abg[1].addActiveBox(hClue); ab = new ActiveBox(abg[1], this, null); abct = new ActiveBoxContent(); abct.setImgContent(edu.xtec.util.ResourceManager.getImageIcon("buttons/textdown.png").getImage(), null); ab.setContent(abct); abg[1].addActiveBox(ab); vClue = new ActiveBox(abg[1], this, null); abg[1].addActiveBox(vClue); abg[1].setBorder(true); resizeCrossWordPanel((int) abc[1].w, (int) abc[1].h); cursorPosChanged(); allowResize[1] = true; } else if (abc[index] != null) { abg[index] = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[index]); bg[index] = abg[index]; abg[index].setContent(abc[index], altAbc[index]); allowResize[index] = (abc[index].img == null); } if (bg[index] != null) bg[index].setVisible(true); /* * if(index==0 && bg[index]!=null && abcx!=null){ * activeLineColor=bg[index].getBoxBaseResolve().textColor; * bc.lineColor=activeLineColor; } */ if (bc.active) bc.end(); currentLine = -1; highlightLine = -1; dragCursorX = false; dragCursorY = false; setCursor(null); revalidate(); BoxBase.resetAllFonts(); repaint(); } protected void resizeCrossWordPanel(int w, int h) { if (crossWord && abg[1] != null && abg[1].getNumCells() == 4) { boolean rowDist = (boxGridPos == Activity.AUB || boxGridPos == Activity.BUA); int x = (int) (abg[1].getX()); int y = (int) (abg[1].getY()); ActiveBox ab = abg[1].getActiveBox(0); ab.setBounds(x, y, CrossWord.LABEL_WIDTH, h); ab = abg[1].getActiveBox(1); ab.setBounds(x + CrossWord.LABEL_WIDTH, y, w, h); int x0 = rowDist ? x + CrossWord.LABEL_WIDTH + w : x; int y0 = rowDist ? y : y + h; ab = abg[1].getActiveBox(2); ab.setBounds(x0, y0, CrossWord.LABEL_WIDTH, h); ab = abg[1].getActiveBox(3); ab.setBounds(x0 + CrossWord.LABEL_WIDTH, y0, w, h); abg[1].recalcSize(); /* * abg[1].width = rowDist ? (2*CrossWord.LABEL_WIDTH)+2*w : * CrossWord.LABEL_WIDTH+w; abg[1].height = rowDist ? h : 2*h; */ } } @Override public void doLayout() { if (bg[0] != null) { if (bg[1] != null) BoxBag.layoutDouble(getSize(), (Resizable) bg[0], (Resizable) bg[1], boxGridPos, margin); else BoxBag.layoutSingle(getSize(), (Resizable) bg[0], margin); } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (bg[0] != null) { Graphics2D g2 = (Graphics2D) g; RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(Constants.DEFAULT_RENDERING_HINTS); while (true) { BoxBase.flagFontReduced = false; for (int i = 0; i < 2; i++) if (bg[i] != null) bg[i].update(g2, g2.getClipBounds(), this); if (!BoxBase.flagFontReduced) break; } if (editMode == EDIT_LINKS && abg[1] != null && abc[0] != null) { for (int i = 0; i < abc[0].getNumCells(); i++) { if (showAllArrows && i != currentLine && i != highlightLine) drawArrow(g2, i); } if (highlightLine >= 0) drawArrow(g2, highlightLine); bc.update(g2, g2.getClipBounds(), this); } g2.setRenderingHints(rh); } } private void drawArrow(Graphics2D g2, int i) { if (abg[0] == null || abg[1] == null) return; ActiveBox bx = abg[0].getActiveBox(i); int id = abc[0].getActiveBoxContent(i).id; if (id >= 0 && id < abc[1].getNumCells()) { ActiveBox bx2 = abg[1].getActiveBox(id); if (bx != null && bx2 != null) { BoxConnector.drawLine(g2, new Point2D.Double(bx.getX() + bx.getWidth() / 2, bx.getY() + bx.getHeight() / 2), new Point2D.Double(bx2.getX() + bx2.getWidth() / 2, bx2.getY() + bx2.getHeight() / 2), true, (i == highlightLine ? activeLineColor : softLineColor), arrowColor, BoxConnector.ARROW_L, BoxConnector.ARROW_ANGLE, (i == highlightLine ? ARROW_WIDTH : BoxConnector.LINE_WIDTH)); } } } public void setMediaBagEditor(MediaBagEditor mbe) { this.mbe = mbe; } @Override protected void processEvent(AWTEvent e) { boolean consumed = false; if (bg[0] != null) { if (e instanceof MouseEvent) { switch (editMode) { case EDIT_GRIDS: consumed = processMouseGrids((MouseEvent) e); break; case EDIT_LINKS: consumed = processMouseLinks((MouseEvent) e); break; case EDIT_BOOL: consumed = processMouseBool((MouseEvent) e); break; } } else if (e instanceof KeyEvent && (grid[0] != null || grid[1] != null)) consumed = processKey((KeyEvent) e); } if (!consumed) super.processEvent(e); } private boolean processMouseGrids(MouseEvent ev) { boolean consumed = false; Point p = ev.getPoint(); int id = ev.getID(); int index = cgrid; if (!dragging && (id == MouseEvent.MOUSE_MOVED || id == MouseEvent.MOUSE_PRESSED)) { if (bg[0] != null && bg[0].contains(p)) index = 0; else if (bg[1] != null && bg[1].contains(p)) index = 1; else index = -1; } AbstractBox xbox = index >= 0 ? bg[index] : null; ActiveBoxBag xbg = (abg[0] == xbox ? abg[0] : (abg[1] == xbox ? abg[1] : null)); TextGrid xgrid = (grid[0] == xbox ? grid[0] : (grid[1] == xbox ? grid[1] : null)); switch (ev.getID()) { case MouseEvent.MOUSE_MOVED: if (!dragging) { Cursor newCursor = null; if (xbox != null && allowResize[index]) { dragCursorX = Math.abs(p.x - xbox.x - xbox.width) < 5 && p.y >= xbox.y && p.y < (xbox.y + xbox.height + 5); dragCursorY = Math.abs(p.y - xbox.y - xbox.height) < 5 && p.x >= xbox.x && p.x < (xbox.x + xbox.width + 5); if (dragCursorX && dragCursorY) newCursor = Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR); else if (dragCursorY) newCursor = Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR); else if (dragCursorX) newCursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR); } if (newCursor == null && xbg != null && xbg.findActiveBox(p) != null) newCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); setCursor(newCursor); } break; case MouseEvent.MOUSE_PRESSED: if (xbox != null) { setPanelSelected(index); if (dragCursorX || dragCursorY) { dragging = true; resizeByDrag(p, false); } else if (xgrid != null) { if (xgrid.contains(p)) { Point pt = xgrid.getLogicalCoords(p); if (pt != null) { setCursorAt(pt.x, pt.y); } } } consumed = true; } break; case MouseEvent.MOUSE_RELEASED: if (xbox != null) { if (dragging) { resizeByDrag(p, true); dragging = false; } else if (xbg != null) { ActiveBox ab = xbg.findActiveBox(p); if (ab != null) { ActiveBoxContent abxcnt = ab.getCurrentContent(); int group = -1; int bag = -1; int item = -1; for (int i = 0; i < allAbc.length && item < 0; i++) { for (int j = 0; j < allAbc[i].length && item < 0; j++) { if (allAbc[i][j] != null) { item = allAbc[i][j].indexOf(abxcnt); if (item >= 0) { bag = j; group = i; } } } } if (item >= 0) { ActiveBoxContent abxc = ActiveBoxContentEditor.getActiveBoxContent(abxcnt, this, parent.getOptions(), mbe, ab); if (abxc != null) { allAbc[group][bag].setActiveBoxContentAt(abxc, item); setModified(true); if (!ab.isAlternative()) { ab.setContent(abxc); } else { ab.setAltContent(abxc); } BoxBase.resetAllFonts(); repaint(); } } } } consumed = true; } break; case MouseEvent.MOUSE_DRAGGED: if (xbox != null && dragging) { resizeByDrag(p, false); consumed = true; } break; } return consumed; } protected boolean processMouseLinks(MouseEvent ev) { boolean consumed = false; if (abg[0] != null && abg[1] != null) { Point pt = ev.getPoint(); switch (ev.getID()) { case MouseEvent.MOUSE_DRAGGED: case MouseEvent.MOUSE_MOVED: if (bc.active) bc.moveTo(pt); else { int newLine = -1; ActiveBox bx = abg[0].findActiveBox(pt); if (bx != null) { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); newLine = bx.idOrder; } else setCursor(null); if (newLine != highlightLine) { highlightLine = newLine; repaint(); } } consumed = true; break; case MouseEvent.MOUSE_PRESSED: if (bc.active) { bc.end(); ActiveBox bx = abg[1].findActiveBox(bc.dest); ActiveBoxContent bc0 = abc[0].getActiveBoxContent(currentLine); bc0.id = (bx == null ? -1 : bx.idOrder); highlightLine = currentLine; currentLine = -1; setModified(true); repaint(); } else { ActiveBox bx = abg[0].findActiveBox(pt); if (bx != null) { highlightLine = -1; currentLine = bx.idOrder; repaint(); bc.begin(pt); } } consumed = true; break; } } return consumed; } private void resizeByDrag(Point p, boolean finish) { if (cgrid >= 0 && bg[cgrid] != null) { int ncw = 0, nch = 0; if (abg[cgrid] == bg[cgrid] && abc[cgrid] != null) { if (crossWord) { ncw = 1; nch = 1; } else { ncw = abc[cgrid].ncw; nch = abc[cgrid].nch; } } else if (grid[cgrid] == bg[cgrid] && tgc[cgrid] != null) { ncw = tgc[cgrid].ncw; nch = tgc[cgrid].nch; } if (ncw > 0 && nch > 0) { int w = (int) (bg[cgrid].width / ncw); int h = (int) (bg[cgrid].height / nch); if (dragCursorX) w = (int) ((p.x - bg[cgrid].x) / ncw); if (dragCursorY) h = (int) ((p.y - bg[cgrid].y) / nch); if (crossWord && cgrid == 1) { if (boxGridPos == Activity.AUB || boxGridPos == Activity.BUA) { w = (w - 2 * 40) / 2; } else { w = w - 40; h = h / 2; } } if (w > 10 && h > 10) { doResize(cgrid, w, h, finish); if (finish && crossWord) cursorPosChanged(); } } } /* * if(cgrid>=0 && bg[cgrid]!=null && ((abc[cgrid]!=null && abc[cgrid].ncw>0 && * abc[cgrid].nch>0) || (tgc[cgrid]!=null && tgc[cgrid].ncw>0 && * tgc[cgrid].nch>0))){ int ncw = tgc[cgrid]!=null ? tgc[cgrid].ncw : * abc[cgrid].ncw; int nch = tgc[cgrid]!=null ? tgc[cgrid].nch : abc[cgrid].nch; * int w=(int)(bg[cgrid].width/ncw); int h=(int)(bg[cgrid].height/nch); * if(dragCursorX) w=(int)((p.x-bg[cgrid].x)/ncw); if(dragCursorY) * h=(int)((p.y-bg[cgrid].y)/nch); if(w>10 && h>10){ doResize(cgrid, w, h, * finish); } } */ } protected void doResize(int index, int w, int h, boolean finish) { AbstractBox xbox = (index >= 0 ? bg[index] : null); if (xbox != null) { setModified(true); if (tgc[index] != null) { tgc[index].w = w; tgc[index].h = h; } else if (abc[index] != null) { abc[index].w = w; abc[index].h = h; } if (crossWord && index == 1) { altAbc[index].w = w; altAbc[index].h = h; resizeCrossWordPanel(w, h); } else { int ncw = tgc[index] != null ? tgc[index].ncw : abc[index].ncw; int nch = tgc[index] != null ? tgc[index].nch : abc[index].nch; Rectangle r = new Rectangle((int) bg[index].getX(), (int) bg[index].getY(), w * ncw, h * nch); xbox.setBounds(r); } if (finish) { /* * setActiveBagContent(index, abc[index], altAbc[index], tgc[index]); * ActiveBoxBag xbg=(xbox==abg[0] ? abg[0] : (xbox==abg[1] ? abg[1] : null)); * if(xbg!=null && xbg.isAlternative()) xbg.setAlternative(true); */ boolean xbgAlt; ActiveBoxBag xbg = (xbox == abg[0] ? abg[0] : (xbox == abg[1] ? abg[1] : null)); xbgAlt = xbg != null && xbg.isAlternative(); setActiveBagContent(index, abc[index], altAbc[index], tgc[index]); if (xbgAlt && abg[index] != null) abg[index].setAlternative(true); } parent.resized(index); } repaint(); } protected boolean processMouseBool(MouseEvent ev) { boolean consumed = false; if (abg[0] != null) { ActiveBox bx = abg[0].findActiveBox(ev.getPoint()); switch (ev.getID()) { case MouseEvent.MOUSE_MOVED: setCursor(bx != null ? Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) : null); consumed = true; break; case MouseEvent.MOUSE_RELEASED: if (bx != null) { int v = bx.getContent().id; v = v > 0 ? 0 : 1; bx.getContent().id = v; bx.setInverted(v > 0); bx.setMarked(v > 0); setModified(true); consumed = true; } break; } } return consumed; } public void setModified(boolean modified) { parent.setModified(modified); } /** * Getter for property boxGridPos. * * @return Value of property boxGridPos. */ public int getBoxGridPos() { return boxGridPos; } /** * Setter for property boxGridPos. * * @param boxGridPos New value of property boxGridPos. */ public void setBoxGridPos(int boxGridPos) { this.boxGridPos = boxGridPos; if (crossWord && abc[1] != null) { resizeCrossWordPanel((int) abc[1].w, (int) abc[1].h); } BoxBase.resetAllFonts(); revalidate(); } /** * Getter for property editMode. * * @return Value of property editMode. */ public int getEditMode() { return editMode; } /** * Setter for property editMode. * * @param editMode New value of property editMode. */ public void setEditMode(int editMode) { boolean checkBool = (editMode == EDIT_BOOL || this.editMode == EDIT_BOOL); this.editMode = editMode; if (checkBool && abg[0] != null) { for (int i = 0; i < abg[0].getNumCells(); i++) { ActiveBox bx = abg[0].getActiveBox(i); if (bx != null) { bx.setInverted(editMode == EDIT_BOOL ? bx.getContent().id > 0 : false); bx.setMarked(editMode == EDIT_BOOL ? bx.getContent().id > 0 : false); } } } repaint(); } /** * Getter for property showAllArrows. * * @return Value of property showAllArrows. */ public boolean isShowAllArrows() { return showAllArrows; } /** * Setter for property showAllArrows. * * @param showAllArrows New value of property showAllArrows. */ public void setShowAllArrows(boolean showAllArrows) { this.showAllArrows = showAllArrows; repaint(); } protected void moveCursor(int dx, int dy) { if (cgrid >= 0 && grid[cgrid] != null) { grid[cgrid].moveCursor(dx, dy, false); cursorPosChanged(); } } protected void setCursorAt(int x, int y) { if (cgrid >= 0 && grid[cgrid] != null) grid[cgrid].setCursorAt(x, y, false); cursorPosChanged(); } protected void cursorPosChanged() { if (crossWord && grid[0] != null && hClue != null && vClue != null) { Point pt = grid[0].getCursor(); if (pt != null) { Point items = grid[0].getItemFor(pt.x, pt.y); if (items != null) { ActiveBoxContent abxc = abc[1].getActiveBoxContentWith(pt.y, items.x); if (abxc == null) { abc[1].insertActiveBoxContentWith(pt.y, items.x); abxc = abc[1].getActiveBoxContentWith(pt.y, items.x); } hClue.setContent(abxc); abxc = altAbc[1].getActiveBoxContentWith(pt.x, items.y); if (abxc == null) { altAbc[1].insertActiveBoxContentWith(pt.x, items.y); abxc = altAbc[1].getActiveBoxContentWith(pt.x, items.y); } vClue.setContent(abxc); } } } } public boolean processKey(KeyEvent e) { boolean consumed = false; if (cgrid >= 0 && grid[cgrid] != null && tgc[cgrid] != null) { int dx = 0, dy = 0; boolean delete = false, moveFirst = false; Point cur = grid[cgrid].getCursor(); char ch1 = 0; switch (e.getID()) { case KeyEvent.KEY_PRESSED: switch (e.getKeyCode()) { case KeyEvent.VK_RIGHT: dx = 1; break; case KeyEvent.VK_LEFT: dx = -1; break; case KeyEvent.VK_DOWN: dy = 1; break; case KeyEvent.VK_UP: dy = -1; break; case KeyEvent.VK_BACK_SPACE: dx = -1; delete = true; moveFirst = true; break; case KeyEvent.VK_DELETE: delete = true; break; } break; case KeyEvent.KEY_TYPED: char ch0 = e.getKeyChar(); int kk = e.getKeyCode(); if (cur != null) { dx = 1; if (Character.isLetterOrDigit(ch0)) ch1 = Character.toUpperCase(ch0); else if (ch0 == tgc[cgrid].wild || Character.isSpaceChar(ch0)) delete = true; else dx = 0; } break; } if (moveFirst && (dx != 0 || dy != 0)) { moveCursor(dx, dy); cur = grid[cgrid].getCursor(); consumed = true; } if (delete) ch1 = tgc[cgrid].wild; if (ch1 != 0 && cur != null) { if (crossWord) { checkWildChanges(cur, ch1); } grid[cgrid].setCharAt(cur.x, cur.y, ch1); tgc[cgrid].setCharAt(cur.x, cur.y, ch1); setModified(true); consumed = true; } if (!moveFirst && (dx != 0 || dy != 0)) { moveCursor(dx, dy); consumed = true; } } return consumed; } protected void checkWildChanges(Point pt, char ch) { if (!crossWord) return; char oldCh = grid[cgrid].getCharAt(pt.x, pt.y); boolean deleteWild = (oldCh == tgc[cgrid].wild && ch != oldCh); boolean addWild = (!deleteWild && ch == tgc[cgrid].wild && ch != oldCh); if (addWild || deleteWild) { Point items = grid[cgrid].getItemFor(pt.x, pt.y); if (items != null) { boolean intoWhitesH = grid[cgrid].isIntoWhites(pt, true); boolean intoWhitesV = grid[cgrid].isIntoWhites(pt, false); boolean intoBlacksH = grid[cgrid].isIntoBlacks(pt, true); boolean intoBlacksV = grid[cgrid].isIntoBlacks(pt, false); if (deleteWild) { if (intoWhitesH) { abc[1].deleteActiveBoxContentWith(pt.y, items.x); } else if (intoBlacksH) { abc[1].insertActiveBoxContentWith(pt.y, items.x); } if (intoWhitesV) { altAbc[1].deleteActiveBoxContentWith(pt.x, items.y); } else if (intoBlacksV) { altAbc[1].insertActiveBoxContentWith(pt.x, items.y); } } else { if (intoWhitesH) { abc[1].insertActiveBoxContentWith(pt.y, items.x); } else if (intoBlacksH) { abc[1].deleteActiveBoxContentWith(pt.y, items.x); } if (intoWhitesV) { altAbc[1].insertActiveBoxContentWith(pt.x, items.y); } else if (intoBlacksV) { altAbc[1].deleteActiveBoxContentWith(pt.x, items.y); } } grid[cgrid].setCellLocked(pt.x, pt.y, addWild); } } } public void focusGained(FocusEvent e) { checkCursor(false); } public void focusLost(FocusEvent e) { checkCursor(true); } public void checkCursor(boolean forceLost) { for (int i = 0; i < 2; i++) { if (grid[i] != null) { if (cgrid == i && !forceLost && hasFocus()) grid[i].startCursorBlink(); else grid[i].stopCursorBlink(); } } } private void setPanelSelected(int index) { cgrid = index; parent.panelSelected(cgrid); if (!hasFocus()) requestFocus(); else checkCursor(false); } } src/author/edu/xtec/jclic/boxes/ActiveBagContentRelPanel.form000066400000000000000000000140161335566474600246100ustar00rootroot00000000000000
src/author/edu/xtec/jclic/boxes/ActiveBagContentRelPanel.java000066400000000000000000000135171335566474600245730ustar00rootroot00000000000000/* * File : ActiveBagContentRelPanel.java * Created : 03-apr-2003 12:54 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity; import edu.xtec.jclic.activities.associations.ComplexAssociation; import edu.xtec.jclic.activities.text.WrittenAnswer; import edu.xtec.util.Options; import java.util.EventObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActiveBagContentRelPanel extends edu.xtec.util.CtrlPanel { ActiveBagContentEditor parent = null; Options options = null; boolean isBoolean = false; /** Creates new form ActiveBagContentRelPanel */ public ActiveBagContentRelPanel(ActiveBagContentEditor parent, boolean isBoolean) { setInitializing(true); this.parent = parent; options = parent.getOptions(); this.isBoolean = isBoolean; initComponents(); if (isBoolean) { showAllArrowsChk.setVisible(false); arrowColorBtn.setVisible(false); arrowColorLb.setVisible(false); } setInitializing(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; layoutGroup = new javax.swing.ButtonGroup(); showAllArrowsChk = new javax.swing.JCheckBox(); showAllArrowsChk.addActionListener(this); arrowColorLb = new javax.swing.JLabel(); arrowColorBtn = new edu.xtec.jclic.beans.ColorButton(); arrowColorBtn.addActionListener(this); inverseResolutionChk = new javax.swing.JCheckBox(); inverseResolutionChk.addActionListener(this); setLayout(new java.awt.GridBagLayout()); showAllArrowsChk.setSelected(true); showAllArrowsChk.setText(options.getMsg("edit_act_showAllArrows")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(showAllArrowsChk, gridBagConstraints); arrowColorLb.setLabelFor(arrowColorBtn); arrowColorLb.setText(options.getMsg("edit_act_arrowColor")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(arrowColorLb, gridBagConstraints); arrowColorBtn.setToolTipText(options.getMsg("edit_act_arrowColor_tooltip")); arrowColorBtn.setColor(BoxConnector.getXORColor(BoxConnector.DEFAULT_XOR_COLOR)); arrowColorBtn.setOptions(options); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; add(arrowColorBtn, gridBagConstraints); inverseResolutionChk.setToolTipText(options.getMsg("edit_act_inverseResolution_tooltip")); inverseResolutionChk.setText(options.getMsg("edit_act_inverseResolution")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(inverseResolutionChk, gridBagConstraints); } // GEN-END:initComponents @Override public boolean eventPerformed(EventObject ev) { boolean result = true; if (ev != null && ev.getSource() != null) { Object src = ev.getSource(); if (src == showAllArrowsChk) { parent.abcpp.setShowAllArrows(showAllArrowsChk.isSelected()); result = false; } else if (src == arrowColorBtn) { parent.abcpp.arrowColor = BoxConnector.getXORColor(arrowColorBtn.getColor()); parent.abcpp.repaint(); result = false; } else if (src == inverseResolutionChk) { } } return result; } public void clear() { inverseResolutionChk.setSelected(false); } public void fillData(Activity act) { if (act != null) { inverseResolutionChk.setSelected(act.invAss); inverseResolutionChk.setVisible(act instanceof ComplexAssociation || act instanceof WrittenAnswer); } } public void saveData(Activity act) { if (act != null) { act.invAss = inverseResolutionChk.isSelected(); } } // Variables declaration - do not modify//GEN-BEGIN:variables private edu.xtec.jclic.beans.ColorButton arrowColorBtn; private javax.swing.JLabel arrowColorLb; private javax.swing.JCheckBox inverseResolutionChk; private javax.swing.ButtonGroup layoutGroup; private javax.swing.JCheckBox showAllArrowsChk; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/boxes/ActiveBoxContentEditor.form000066400000000000000000000610731335566474600244000ustar00rootroot00000000000000
src/author/edu/xtec/jclic/boxes/ActiveBoxContentEditor.java000066400000000000000000000455501335566474600243600ustar00rootroot00000000000000/* * File : ActiveBoxContentEditor.java * Created : 02-oct-2002 12:53 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Constants; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.beans.*; import edu.xtec.jclic.media.MediaContentEditor; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import java.awt.Dimension; import java.util.EventObject; import java.util.HashMap; import java.util.Map; import javax.swing.event.DocumentEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class ActiveBoxContentEditor extends edu.xtec.util.CtrlPanel { Options options; ActiveBoxContent abc; MediaBagEditor mbe; boolean eventsEnabled = true; public static final String PROP_ABC = "activeBoxContent"; ActiveBox preview; /** Creates new form ActiveBoxContentEditor */ public ActiveBoxContentEditor(Options options, ActiveBoxContent abc, MediaBagEditor mbe, ActiveBox ab) { this.options = options; initComponents(); setMediaBagEditor(mbe); setActiveBoxContent(abc); textArea.getDocument().addDocumentListener(this); setPreview(ab); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel imgLb; javax.swing.JSeparator sep1; javax.swing.JSeparator sep11; javax.swing.JSeparator sep2; javax.swing.JLabel textLb; hAlignGrp = new javax.swing.ButtonGroup(); vAlignGrp = new javax.swing.ButtonGroup(); textLb = new javax.swing.JLabel(); textScroll = new javax.swing.JScrollPane(); textArea = new javax.swing.JTextArea(); textCompass = new edu.xtec.jclic.beans.Compass(); sep1 = new javax.swing.JSeparator(); imgLb = new javax.swing.JLabel(); imgButton = new edu.xtec.jclic.beans.ImgButton(); imgButton.setOptions(options); overlapChk = new javax.swing.JCheckBox(); imgCompass = new edu.xtec.jclic.beans.Compass(); sep2 = new javax.swing.JSeparator(); styleLb = new javax.swing.JLabel(); boxBaseButton = new edu.xtec.jclic.beans.BoxBaseButton(); boxBaseButton.setOptions(options); borderChk = new javax.swing.JCheckBox(); sep11 = new javax.swing.JSeparator(); mcLb = new javax.swing.JLabel(); mcButton = new edu.xtec.jclic.beans.MediaContentButton(); mcButton.setOptions(options); sizeSep = new javax.swing.JSeparator(); sizeLb = new javax.swing.JLabel(); sizePanel = new javax.swing.JPanel(); widthLb = new javax.swing.JLabel(); widthEdit = new edu.xtec.jclic.beans.SmallIntEditor(); heightLb = new javax.swing.JLabel(); heightEdit = new edu.xtec.jclic.beans.SmallIntEditor(); setLayout(new java.awt.GridBagLayout()); setBorder(new javax.swing.border.EtchedBorder()); textLb.setLabelFor(textArea); textLb.setText(options.getMsg("edit_act_text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; add(textLb, gridBagConstraints); textScroll.setPreferredSize(new java.awt.Dimension(300, 3)); textArea.setWrapStyleWord(true); textArea.setLineWrap(true); textScroll.setViewportView(textArea); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; add(textScroll, gridBagConstraints); textCompass.addPropertyChangeListener(Compass.PROP_DIRECTION, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(textCompass, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sep1, gridBagConstraints); imgLb.setText(options.getMsg("edit_act_image")); imgLb.setLabelFor(imgButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(imgLb, gridBagConstraints); imgButton.setToolTipText(options.getMsg("edit_act_image_tooltip")); imgButton.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(imgButton, gridBagConstraints); overlapChk.setToolTipText(options.getMsg("edit_act_overlap_tooltip")); overlapChk.setText(options.getMsg("edit_act_overlap")); overlapChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(0, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(overlapChk, gridBagConstraints); imgCompass.addPropertyChangeListener(Compass.PROP_DIRECTION, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = 2; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(imgCompass, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sep2, gridBagConstraints); styleLb.setText(options.getMsg("edit_act_style")); styleLb.setLabelFor(boxBaseButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(styleLb, gridBagConstraints); boxBaseButton.setToolTipText(options.getMsg("edit_style_tooltip")); boxBaseButton.addPropertyChangeListener(BoxBaseButton.PROP_BOX_BASE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(boxBaseButton, gridBagConstraints); borderChk.setToolTipText(options.getMsg("edit_act_border_tooltip")); borderChk.setText(options.getMsg("edit_act_border")); borderChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(borderChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sep11, gridBagConstraints); mcLb.setLabelFor(mcButton); mcLb.setText(options.getMsg("edit_mc_label")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(mcLb, gridBagConstraints); mcButton.addPropertyChangeListener(MediaContentButton.PROP_MEDIA_CONTENT, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(mcButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sizeSep, gridBagConstraints); sizeLb.setLabelFor(sizePanel); sizeLb.setText(options.getMsg("edit_cell_size")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(sizeLb, gridBagConstraints); sizePanel.setLayout(new java.awt.GridBagLayout()); widthLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_width.gif"))); widthLb.setLabelFor(widthEdit); widthLb.setText(":"); widthLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; sizePanel.add(widthLb, gridBagConstraints); widthEdit.setToolTipText(options.getMsg("edit_act_cell_width_tooltip")); widthEdit.setMax(999); widthEdit.setMin(edu.xtec.jclic.Constants.MIN_CELL_SIZE); widthEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 2, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; sizePanel.add(widthEdit, gridBagConstraints); heightLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_height.gif"))); heightLb.setLabelFor(widthEdit); heightLb.setText(":"); heightLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 12, 3, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; sizePanel.add(heightLb, gridBagConstraints); heightEdit.setToolTipText(options.getMsg("edit_act_cell_height_tooltip")); heightEdit.setMax(999); heightEdit.setMin(edu.xtec.jclic.Constants.MIN_CELL_SIZE); heightEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 2, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; sizePanel.add(heightEdit, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(sizePanel, gridBagConstraints); } // GEN-END:initComponents public void setPreview(ActiveBox ab) { preview = ab; boxBaseButton.setPreview(ab); } @Override public boolean genericEvent(Object event) { Object src = (event instanceof EventObject) ? ((EventObject) event).getSource() : (event instanceof DocumentEvent) ? textArea : null; if (eventsEnabled && src != null) { eventsEnabled = false; ActiveBoxContent oldAbc = getAbcClone(); boolean resetPreviewFont = false; if (src == textArea) { String txt = textArea.getText(); if (!StrUtils.compareTrimStringsIgnoreCase(txt, abc.rawText)) { abc.setTextContent(txt != null && txt.length() > 0 ? txt : null); if (abc.bb != null) abc.bb.resetFont(); } } else if (src == imgButton) { if (abc.imgName != null) abc.img = null; abc.imgName = imgButton.getImgName(); } else if (src == borderChk) abc.border = borderChk.isSelected(); else if (src == overlapChk) { abc.avoidOverlapping = overlapChk.isSelected(); resetPreviewFont = true; } else if (src == textCompass) { abc.txtAlign = textCompass.getDoubleDirection(); resetPreviewFont = true; } else if (src == imgCompass) { abc.imgAlign = imgCompass.getDoubleDirection(); resetPreviewFont = true; } else if (src == boxBaseButton) { abc.bb = boxBaseButton.getBoxBase(); resetPreviewFont = true; } else if (src == mcButton) { abc.mediaContent = mcButton.getMediaContent(); } else if (abc.dimension != null && src == widthEdit || src == heightEdit) { abc.setDimension(new Dimension(widthEdit.getValue(), heightEdit.getValue())); } if (mbe != null && (src == textArea || src == imgButton)) { try { abc.realizeContent(mbe.getMediaBag()); } catch (Exception ex) { options.getMessages().showErrorWarning(this, "ERROR", ex); } } if (preview != null) { BoxBase bb = abc.bb; if (resetPreviewFont && bb != null) bb.resetFont(); preview.setCurrentContent(abc); } checkAndFirePropertyChange(oldAbc); eventsEnabled = true; } return true; } public void setActiveBoxContent(ActiveBoxContent c) { if (c == null) c = new ActiveBoxContent(); eventsEnabled = false; abc = (ActiveBoxContent) c.clone(); textArea.setText(abc.text); imgButton.clear(); imgButton.setImgName(abc.imgName); borderChk.setSelected(abc.border == null ? false : abc.border.booleanValue()); textCompass.setDoubleDirection(abc.txtAlign); imgCompass.setDoubleDirection(abc.imgAlign); overlapChk.setSelected(abc.avoidOverlapping); boxBaseButton.setBoxBase(abc.bb); mcButton.clear(); mcButton.setMediaContent(abc.mediaContent); Dimension size = abc.getDimension(); sizeSep.setVisible(size != null); sizeLb.setVisible(size != null); sizePanel.setVisible(size != null); widthEdit.setValue(size == null ? 0 : size.width); heightEdit.setValue(size == null ? 0 : size.height); if (preview != null) preview.setCurrentContent(abc); eventsEnabled = true; } public ActiveBoxContent getAbc() { if (abc.dimension != null) { abc.setDimension(new Dimension(widthEdit.getValue(), heightEdit.getValue())); } return abc; } public ActiveBoxContent getAbcClone() { return abc == null ? null : (ActiveBoxContent) abc.clone(); } private void checkAndFirePropertyChange(ActiveBoxContent oldAbc) { ActiveBoxContent currentAbc = getAbc(); boolean eq = ((oldAbc == null && currentAbc == null) || (oldAbc != null && oldAbc.equals(currentAbc))); if (!eq) firePropertyChange(PROP_ABC, oldAbc, currentAbc); } public void setMediaBagEditor(MediaBagEditor mbe) { this.mbe = mbe; imgButton.setMediaBagEditor(mbe); mcButton.setMediaBagEditor(mbe); } private static Map panels = new HashMap(); public static ActiveBoxContent getActiveBoxContent(ActiveBoxContent initialAbc, Component parent, Options options, MediaBagEditor mbe, ActiveBox preview) { if (initialAbc == null) initialAbc = new ActiveBoxContent(); Messages msg = options.getMessages(); ActiveBoxContentEditor abce = panels.get(options); if (abce == null) { abce = new ActiveBoxContentEditor(options, initialAbc, mbe, preview); panels.put(options, abce); } else { abce.setPreview(null); abce.setMediaBagEditor(mbe); abce.setActiveBoxContent(initialAbc); abce.setPreview(preview); } ActiveBoxContent abcBackup = null, abcOriginal = null; if (preview != null) { abcOriginal = preview.getCurrentContent(); if (abcOriginal != null) abcBackup = (ActiveBoxContent) abcOriginal.clone(); } boolean b = msg.showInputDlg(parent, abce, "edit_cell_title"); if (!b && preview != null) { if (abcOriginal != null && abcBackup != null) { abcOriginal.copyRawDataFrom(abcBackup); } preview.setCurrentContent(abcOriginal); } return b ? abce.getAbc() : null; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox borderChk; private edu.xtec.jclic.beans.BoxBaseButton boxBaseButton; private javax.swing.ButtonGroup hAlignGrp; private edu.xtec.jclic.beans.SmallIntEditor heightEdit; private javax.swing.JLabel heightLb; private edu.xtec.jclic.beans.ImgButton imgButton; private edu.xtec.jclic.beans.Compass imgCompass; private edu.xtec.jclic.beans.MediaContentButton mcButton; private javax.swing.JLabel mcLb; private javax.swing.JCheckBox overlapChk; private javax.swing.JLabel sizeLb; private javax.swing.JPanel sizePanel; private javax.swing.JSeparator sizeSep; private javax.swing.JLabel styleLb; private javax.swing.JTextArea textArea; private edu.xtec.jclic.beans.Compass textCompass; private javax.swing.JScrollPane textScroll; private javax.swing.ButtonGroup vAlignGrp; private edu.xtec.jclic.beans.SmallIntEditor widthEdit; private javax.swing.JLabel widthLb; // End of variables declaration//GEN-END:variables // Utility functions public static boolean nameChanged(ActiveBoxContent abc, int type, String oldName, String newName) { boolean result = false; if ((type & Constants.T_IMAGE) != 0 && oldName.equals(abc.imgName)) { abc.imgName = newName; result = true; } if (abc.mediaContent != null) result |= MediaContentEditor.nameChanged(abc.mediaContent, type, oldName, newName); return result; } } src/author/edu/xtec/jclic/boxes/ActiveBoxPreviewPanel.java000066400000000000000000000044231335566474600241720ustar00rootroot00000000000000/* * File : ActiveBoxPreviewPanel.java * Created : 02-oct-2002 18:45 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Constants; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActiveBoxPreviewPanel extends JPanel { ActiveBox ab; ActiveBoxContent abc; /** Creates a new instance of ActiveBoxPreviewPanel */ public ActiveBoxPreviewPanel(AbstractBox parent) { super(); ab = new ActiveBox(parent, this, null); abc = new ActiveBoxContent(); ab.setContent(abc); ab.setAltContent(abc); } public void setActiveBoxContent(ActiveBoxContent b) { abc = (b == null ? new ActiveBoxContent() : b); ab.setContent(abc); ab.setAltContent(abc); } public ActiveBox getActiveBox() { return ab; } public ActiveBoxContent getActiveBoxContent() { return abc; } @Override public void setBounds(int x, int y, int width, int height) { super.setBounds(x, y, width, height); ab.setBounds(getVisibleRect()); BoxBase.resetAllFonts(); } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; super.paintComponent(g); RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(Constants.DEFAULT_RENDERING_HINTS); while (true) { BoxBase.flagFontReduced = false; ab.update(g2, g2.getClipBounds(), this); if (!BoxBase.flagFontReduced) break; } g2.setRenderingHints(rh); } } src/author/edu/xtec/jclic/boxes/BoxBaseEditor.form000066400000000000000000001145041335566474600225020ustar00rootroot00000000000000
src/author/edu/xtec/jclic/boxes/BoxBaseEditor.java000066400000000000000000000537561335566474600224730ustar00rootroot00000000000000/* * File : BoxBaseEditor.java * Created : 02-oct-2002 13:45 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.beans.ColorButton; import edu.xtec.jclic.beans.GradientButton; import edu.xtec.jclic.beans.SmallIntEditor; import edu.xtec.util.FontCheck; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.Map; import javax.swing.JComboBox; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class BoxBaseEditor extends javax.swing.JPanel { Options options; BoxBase bb; /** Creates new form BoxBaseEditor */ public BoxBaseEditor(Options options, BoxBase bb) { this.options = options; initComponents(); setBoxBase(bb); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel bgColorLb = new javax.swing.JLabel(); bgColorBtn = new edu.xtec.jclic.beans.ColorButton(); bgColorBtn.setOptions(options); javax.swing.JLabel gradientLb = new javax.swing.JLabel(); gradientButton = new edu.xtec.jclic.beans.GradientButton(); gradientButton.setOptions(options); transparentChk = new javax.swing.JCheckBox(); javax.swing.JSeparator sep1 = new javax.swing.JSeparator(); javax.swing.JLabel fontLb = new javax.swing.JLabel(); typefacePanel = new javax.swing.JPanel(); fontFaceCombo = new JComboBox(FontCheck.getFontList(false)); javax.swing.JLabel sizeLb = new javax.swing.JLabel(); fontSizeCombo = new JComboBox(FontCheck.fontSizes); boldBtn = new javax.swing.JToggleButton(); italicBtn = new javax.swing.JToggleButton(); javax.swing.JSeparator sep2 = new javax.swing.JSeparator(); javax.swing.JLabel textColorLb = new javax.swing.JLabel(); textColorBtn = new edu.xtec.jclic.beans.ColorButton(); textColorBtn.setOptions(options); javax.swing.JLabel altColorLb = new javax.swing.JLabel(); altColorBtn = new edu.xtec.jclic.beans.ColorButton(); altColorBtn.setOptions(options); javax.swing.JLabel textMarginLb = new javax.swing.JLabel(); textMarginInt = new edu.xtec.jclic.beans.SmallIntEditor(); shadowChk = new javax.swing.JCheckBox(); javax.swing.JLabel shadowColorLb = new javax.swing.JLabel(); shadowColorBtn = new edu.xtec.jclic.beans.ColorButton(); shadowColorBtn.setOptions(options); javax.swing.JLabel borderColorLb = new javax.swing.JLabel(); borderColorBtn = new edu.xtec.jclic.beans.ColorButton(); borderColorBtn.setOptions(options); javax.swing.JLabel borderWidthLb = new javax.swing.JLabel(); borderWidthSlider = new javax.swing.JSlider(); javax.swing.JLabel inactiveColorLb = new javax.swing.JLabel(); inactiveColorBtn = new edu.xtec.jclic.beans.ColorButton(); inactiveColorBtn.setOptions(options); javax.swing.JLabel markerWidthLb = new javax.swing.JLabel(); markerWidthSlider = new javax.swing.JSlider(); setBorder(javax.swing.BorderFactory.createEtchedBorder()); setLayout(new java.awt.GridBagLayout()); bgColorLb.setLabelFor(bgColorBtn); bgColorLb.setText(options.getMsg("edit_act_bgColor")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(bgColorLb, gridBagConstraints); bgColorBtn.setToolTipText(options.getMsg("edit_act_bgColor_tooltip")); bgColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, propListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(bgColorBtn, gridBagConstraints); gradientLb.setText(options.getMsg("edit_act_gradient")); gradientLb.setLabelFor(gradientButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(gradientLb, gridBagConstraints); gradientButton.setToolTipText(options.getMsg("edit_act_gradient_tooltip")); gradientButton.addPropertyChangeListener(GradientButton.PROP_GRADIENT, propListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(gradientButton, gridBagConstraints); transparentChk.setToolTipText(options.getMsg("edit_act_transparent_tooltip")); transparentChk.setText(options.getMsg("edit_act_transparent")); transparentChk.addActionListener(actionListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(transparentChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; add(sep1, gridBagConstraints); fontLb.setLabelFor(fontFaceCombo); fontLb.setText(options.getMsg("edit_font_face")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(fontLb, gridBagConstraints); typefacePanel.setLayout(new java.awt.GridBagLayout()); fontFaceCombo.setEditable(true); fontFaceCombo.setPreferredSize(new Dimension(125, fontFaceCombo.getPreferredSize().height)); fontFaceCombo.addActionListener(cfListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); typefacePanel.add(fontFaceCombo, gridBagConstraints); sizeLb.setText(options.getMsg("edit_font_size")); sizeLb.setLabelFor(fontSizeCombo); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); typefacePanel.add(sizeLb, gridBagConstraints); fontSizeCombo.setEditable(true); fontSizeCombo.setPreferredSize(new Dimension(50, fontSizeCombo.getPreferredSize().height)); fontSizeCombo.addActionListener(cfListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); typefacePanel.add(fontSizeCombo, gridBagConstraints); boldBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_bold.gif"))); // NOI18N boldBtn.setToolTipText(options.getMsg("edit_font_bold")); boldBtn.setPreferredSize(new java.awt.Dimension(27, 27)); boldBtn.addActionListener(cfListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); typefacePanel.add(boldBtn, gridBagConstraints); italicBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_italic.gif"))); // NOI18N italicBtn.setToolTipText(options.getMsg("edit_font_italic")); italicBtn.setPreferredSize(new java.awt.Dimension(27, 27)); italicBtn.addActionListener(cfListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); typefacePanel.add(italicBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(typefacePanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; add(sep2, gridBagConstraints); textColorLb.setText(options.getMsg("edit_act_textColor")); textColorLb.setLabelFor(textColorBtn); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(textColorLb, gridBagConstraints); textColorBtn.setToolTipText(options.getMsg("edit_act_textColor_tooltip")); textColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, propListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(textColorBtn, gridBagConstraints); altColorLb.setText(options.getMsg("edit_act_altColor")); altColorLb.setLabelFor(altColorBtn); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(altColorLb, gridBagConstraints); altColorBtn.setToolTipText(options.getMsg("edit_act_altColor_tooltip")); altColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, propListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(altColorBtn, gridBagConstraints); textMarginLb.setLabelFor(textMarginInt); textMarginLb.setText(options.getMsg("edit_cell_textMargin")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(textMarginLb, gridBagConstraints); textMarginInt.setToolTipText(options.getMsg("edit_cell_textMargin_tooltip")); textMarginInt.setMax(50); textMarginInt.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, propListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(textMarginInt, gridBagConstraints); shadowChk.setToolTipText(options.getMsg("edit_act_shadow_tooltip")); shadowChk.setText(options.getMsg("edit_act_shadow")); shadowChk.addActionListener(actionListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(shadowChk, gridBagConstraints); shadowColorLb.setText(options.getMsg("edit_act_shadowColor")); shadowColorLb.setLabelFor(shadowColorBtn); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(shadowColorLb, gridBagConstraints); shadowColorBtn.setToolTipText(options.getMsg("edit_act_shadowColor_tooltip")); shadowColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, propListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(shadowColorBtn, gridBagConstraints); borderColorLb.setText(options.getMsg("edit_act_borderColor")); borderColorLb.setLabelFor(borderColorBtn); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(borderColorLb, gridBagConstraints); borderColorBtn.setToolTipText(options.getMsg("edit_act_borderColor_tooltip")); borderColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, propListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(borderColorBtn, gridBagConstraints); borderWidthLb.setText(options.getMsg("edit_cell_borderWidth")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(borderWidthLb, gridBagConstraints); borderWidthSlider.setMinorTickSpacing(10); borderWidthSlider.setPaintTicks(true); borderWidthSlider.setMajorTickSpacing(50); borderWidthSlider.setToolTipText(options.getMsg("edit_cell_borderWidth_tooltip")); borderWidthSlider.setPreferredSize(new java.awt.Dimension(100, 27)); borderWidthSlider.addChangeListener(borderListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(borderWidthSlider, gridBagConstraints); inactiveColorLb.setText(options.getMsg("edit_act_inactiveColor")); inactiveColorLb.setLabelFor(inactiveColorBtn); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(inactiveColorLb, gridBagConstraints); inactiveColorBtn.setToolTipText(options.getMsg("edit_act_inactiveColor_tooltip")); inactiveColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, propListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(inactiveColorBtn, gridBagConstraints); markerWidthLb.setText(options.getMsg("edit_cell_markerWidth")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(markerWidthLb, gridBagConstraints); markerWidthSlider.setMinorTickSpacing(10); markerWidthSlider.setPaintTicks(true); markerWidthSlider.setMajorTickSpacing(50); markerWidthSlider.setToolTipText(options.getMsg("edit_cell_markerWidth_tooltip")); markerWidthSlider.setPreferredSize(new java.awt.Dimension(100, 27)); borderWidthSlider.addChangeListener(borderListener); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(markerWidthSlider, gridBagConstraints); } // //GEN-END:initComponents public void setBoxBase(BoxBase b) { if (b == null) b = new BoxBase(); bb = (BoxBase) b.clone(); Font f = bb.getOriginalFont(); fontFaceCombo.setSelectedItem(f.getFamily()); fontSizeCombo.setSelectedItem(Integer.toString(f.getSize())); boldBtn.setSelected(f.isBold()); italicBtn.setSelected(f.isItalic()); bgColorBtn.setColor(b.backColor); gradientButton.setGradient(b.bgGradient); textColorBtn.setColor(b.textColor); shadowColorBtn.setColor(b.shadowColor); shadowChk.setSelected(b.shadow); transparentChk.setSelected(b.transparent); borderColorBtn.setColor(b.borderColor); inactiveColorBtn.setColor(b.inactiveColor); altColorBtn.setColor(b.alternativeColor); textMarginInt.setValue(b.textMargin); borderWidthSlider.setValue((int) (b.borderStroke.getLineWidth() * 10)); markerWidthSlider.setValue((int) (b.markerStroke.getLineWidth() * 10)); } protected void createFont() { Font f = bb.getFont(); int s; try { s = Integer.parseInt((String) fontSizeCombo.getSelectedItem()); } catch (Exception ex) { s = f.getSize(); } s = Math.min(Math.max(s, 6), 140); int style = Font.PLAIN; if (boldBtn.isSelected()) style |= Font.BOLD; if (italicBtn.isSelected()) style |= Font.ITALIC; bb.setFont(new Font((String) fontFaceCombo.getSelectedItem(), style, s)); } public static final String PROP_BOX_BASE = "boxBase"; private void checkAndFirePropertyChange(BoxBase oldBb) { BoxBase currentBb = getBoxBase(); boolean eq = ((oldBb == null && currentBb == null) || (oldBb != null && oldBb.equals(currentBb))); if (!eq) firePropertyChange(PROP_BOX_BASE, oldBb, currentBb); } ActionListener cfListener = new ActionListener() { public void actionPerformed(ActionEvent ev) { BoxBase oldBb = getBoxBaseClone(); createFont(); checkAndFirePropertyChange(oldBb); } }; PropertyChangeListener propListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { BoxBase oldBb = getBoxBaseClone(); bb.backColor = bgColorBtn.getColor(); bb.bgGradient = gradientButton.getGradient(); bb.textColor = textColorBtn.getColor(); bb.shadowColor = shadowColorBtn.getColor(); bb.shadow = shadowChk.isSelected(); bb.transparent = transparentChk.isSelected(); bb.borderColor = borderColorBtn.getColor(); bb.inactiveColor = inactiveColorBtn.getColor(); bb.alternativeColor = altColorBtn.getColor(); bb.textMargin = textMarginInt.getValue(); checkAndFirePropertyChange(oldBb); } }; ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent ev) { BoxBase oldBb = getBoxBaseClone(); bb.shadow = shadowChk.isSelected(); bb.transparent = transparentChk.isSelected(); checkAndFirePropertyChange(oldBb); } }; ChangeListener borderListener = new ChangeListener() { public void stateChanged(ChangeEvent e) { BoxBase oldBb = getBoxBaseClone(); bb.borderStroke = new java.awt.BasicStroke(((float) borderWidthSlider.getValue()) / 10f); bb.markerStroke = new java.awt.BasicStroke(((float) markerWidthSlider.getValue()) / 10f); checkAndFirePropertyChange(oldBb); } }; public BoxBase getBoxBase() { return bb; } public BoxBase getBoxBaseClone() { if (bb != null) return (BoxBase) bb.clone(); return null; } private static Map panels = new HashMap(1); public static BoxBase getBoxBase(BoxBase initialBoxBase, Component parent, Options options, final AbstractBox preview) { Messages msg = options.getMessages(); BoxBaseEditor bbe = panels.get(options); if (bbe == null) { bbe = new BoxBaseEditor(options, initialBoxBase); panels.put(options, bbe); } else { bbe.setBoxBase(initialBoxBase); } PropertyChangeListener lst = null; final BoxBaseEditor bb_ed = bbe; if (preview != null) { lst = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent ev) { if (preview != null) preview.setBoxBase(bb_ed.getBoxBase()); } }; bbe.addPropertyChangeListener(PROP_BOX_BASE, lst); } BoxBase bbBackup = preview != null ? bbe.getBoxBaseClone() : null; boolean b = msg.showInputDlg(parent, bbe, "edit_style_title"); if (lst != null) bbe.removePropertyChangeListener(PROP_BOX_BASE, lst); if (!b && preview != null) preview.setBoxBase(bbBackup); return b ? bbe.bb : null; } // Variables declaration - do not modify//GEN-BEGIN:variables private edu.xtec.jclic.beans.ColorButton altColorBtn; private edu.xtec.jclic.beans.ColorButton bgColorBtn; private javax.swing.JToggleButton boldBtn; private edu.xtec.jclic.beans.ColorButton borderColorBtn; private javax.swing.JSlider borderWidthSlider; private javax.swing.JComboBox fontFaceCombo; private javax.swing.JComboBox fontSizeCombo; private edu.xtec.jclic.beans.GradientButton gradientButton; private edu.xtec.jclic.beans.ColorButton inactiveColorBtn; private javax.swing.JToggleButton italicBtn; private javax.swing.JSlider markerWidthSlider; private javax.swing.JCheckBox shadowChk; private edu.xtec.jclic.beans.ColorButton shadowColorBtn; private edu.xtec.jclic.beans.ColorButton textColorBtn; private edu.xtec.jclic.beans.SmallIntEditor textMarginInt; private javax.swing.JCheckBox transparentChk; private javax.swing.JPanel typefacePanel; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/boxes/TextGridContentControlPanel.form000066400000000000000000000556641335566474600254310ustar00rootroot00000000000000
src/author/edu/xtec/jclic/boxes/TextGridContentControlPanel.java000066400000000000000000000364771335566474600254100ustar00rootroot00000000000000/* * File : TextGridContentControlPanel.java * Created : 01-apr-2003 10:38 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity; import edu.xtec.jclic.activities.textGrid.CrossWord; import edu.xtec.jclic.activities.textGrid.WordSearch; import edu.xtec.jclic.beans.*; import edu.xtec.util.Options; import java.util.EventObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class TextGridContentControlPanel extends edu.xtec.util.CtrlPanel { ActiveBagContentEditor parent; TextGridContent tgc; Options options; boolean isWordSearch; int index; /** Creates new form ActiveBagContentControlPanel */ public TextGridContentControlPanel(ActiveBagContentEditor parent, int index, boolean isWordSearch) { setInitializing(true); this.isWordSearch = isWordSearch; this.parent = parent; options = parent.getOptions(); this.index = index; initComponents(); if (!isWordSearch) { wordListLb.setVisible(false); wordListEditor.setEnabled(false); wordListEditor.setVisible(false); useGridBChk.setEnabled(false); useGridBChk.setVisible(false); } else { wildTransparentChk.setEnabled(false); wildTransparentChk.setVisible(false); } setInitializing(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel heightLb; javax.swing.JPanel leftPanel; javax.swing.JLabel nColsLb; javax.swing.JLabel nRowsLb; javax.swing.JLabel spacer; javax.swing.JLabel spacer2; javax.swing.JLabel styleLb; javax.swing.JLabel widthLb; leftPanel = new javax.swing.JPanel(); spacer = new javax.swing.JLabel(); useGridBChk = new javax.swing.JCheckBox(); nRowsLb = new javax.swing.JLabel(); nRowsEdit = new edu.xtec.jclic.beans.SmallIntEditor(); nColsLb = new javax.swing.JLabel(); nColsEdit = new edu.xtec.jclic.beans.SmallIntEditor(); wildTransparentChk = new javax.swing.JCheckBox(); spacer2 = new javax.swing.JLabel(); widthLb = new javax.swing.JLabel(); widthEdit = new edu.xtec.jclic.beans.SmallIntEditor(); heightLb = new javax.swing.JLabel(); heightEdit = new edu.xtec.jclic.beans.SmallIntEditor(); styleLb = new javax.swing.JLabel(); boxBaseButton = new edu.xtec.jclic.beans.BoxBaseButton(); boxBaseButton.setOptions(options); borderChk = new javax.swing.JCheckBox(); wordSearchPanel = new javax.swing.JPanel(); wordListLb = new javax.swing.JLabel(); wordListEditor = new TextListEditor(options); setLayout(new java.awt.GridBagLayout()); leftPanel.setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; leftPanel.add(spacer, gridBagConstraints); useGridBChk.setToolTipText(options.getMsg("edit_act_wordSearch_panelB_tooltip")); useGridBChk.setText(options.getMsg("edit_act_wordSearch_panelB")); useGridBChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(useGridBChk, gridBagConstraints); nRowsLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_rows.gif"))); nRowsLb.setText(":"); nRowsLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(nRowsLb, gridBagConstraints); nRowsEdit.setToolTipText(options.getMsg("edit_act_num_rows_tooltip")); nRowsEdit.setMax(30); nRowsEdit.setMin(1); nRowsEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(nRowsEdit, gridBagConstraints); nColsLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_cols.gif"))); nColsLb.setText(":"); nColsLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(nColsLb, gridBagConstraints); nColsEdit.setToolTipText(options.getMsg("edit_act_num_cols_tooltip")); nColsEdit.setMax(30); nColsEdit.setMin(1); nColsEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(nColsEdit, gridBagConstraints); wildTransparentChk.setToolTipText(options.getMsg("edit_act_wildTransparent_tooltip")); wildTransparentChk.setText(options.getMsg("edit_act_wildTransparent")); wildTransparentChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(wildTransparentChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; leftPanel.add(spacer2, gridBagConstraints); widthLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_width.gif"))); widthLb.setLabelFor(widthEdit); widthLb.setText(":"); widthLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(widthLb, gridBagConstraints); widthEdit.setToolTipText(options.getMsg("edit_act_cell_width_tooltip")); widthEdit.setMax(999); widthEdit.setMin(edu.xtec.jclic.Constants.MIN_CELL_SIZE); widthEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(widthEdit, gridBagConstraints); heightLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_height.gif"))); heightLb.setLabelFor(heightEdit); heightLb.setText(":"); heightLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(heightLb, gridBagConstraints); heightEdit.setToolTipText(options.getMsg("edit_act_cell_height_tooltip")); heightEdit.setMax(999); heightEdit.setMin(edu.xtec.jclic.Constants.MIN_CELL_SIZE); heightEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(heightEdit, gridBagConstraints); styleLb.setText(options.getMsg("edit_act_style")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(styleLb, gridBagConstraints); boxBaseButton.setToolTipText(options.getMsg("edit_style_tooltip")); boxBaseButton.addPropertyChangeListener(BoxBaseButton.PROP_BOX_BASE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(boxBaseButton, gridBagConstraints); borderChk.setText(options.getMsg("edit_act_border")); borderChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); leftPanel.add(borderChk, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(leftPanel, gridBagConstraints); wordSearchPanel.setLayout(new java.awt.GridBagLayout()); wordListLb.setText(options.getMsg("edit_act_hiddenWords")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); wordSearchPanel.add(wordListLb, gridBagConstraints); wordListEditor.setToolTipText(options.getMsg("edit_act_hiddenWords_tooltip")); wordListEditor.setPreferredSize(new java.awt.Dimension(160, 80)); wordListEditor.setUpperCase(true); wordListEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 3); wordSearchPanel.add(wordListEditor, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(wordSearchPanel, gridBagConstraints); } // GEN-END:initComponents @Override public boolean eventPerformed(EventObject ev) { boolean result = true; if (tgc != null && ev != null && ev.getSource() != null) { Object src = ev.getSource(); if (src == boxBaseButton) { boxBaseButtonActionPerformed(); } else if (src == borderChk) { borderChkActionPerformed(); } else if (src == useGridBChk && isWordSearch) { parent.enableGridB(useGridBChk.isSelected()); return result; } if (src == widthEdit || src == heightEdit) { parent.abcpp.doResize(index, widthEdit.getValue(), heightEdit.getValue(), true); } else { if (src == nColsEdit || src == nRowsEdit) { tgc.ncw = nColsEdit.getValue(); tgc.nch = nRowsEdit.getValue(); tgc.completeText(); } parent.abcpp.setActiveBagContent(index, null, null, tgc); AbstractBox abx = parent.abcpp.getAbstractBox(index); if (abx != null) { boxBaseButton.setPreview(abx); } } } return result; } protected void resized() { if (tgc != null) { widthEdit.setValue((int) tgc.w); heightEdit.setValue((int) tgc.h); } } public void fillData(Activity act) { tgc = (act != null ? act.tgc : null); boxBaseButton.setBoxBase(tgc != null ? tgc.bb : null); parent.abcpp.setActiveBagContent(index, null, null, tgc); boxBaseButton.setPreview(parent.abcpp.getAbstractBox(index)); boxBaseButton.setEnabled(tgc != null); nColsEdit.setValue(tgc != null ? tgc.ncw : 1); nColsEdit.setEnabled(tgc != null); nRowsEdit.setValue(tgc != null ? tgc.nch : 1); nRowsEdit.setEnabled(tgc != null); widthEdit.setValue(tgc != null ? (int) tgc.w : 20); widthEdit.setEnabled(tgc != null); heightEdit.setValue(tgc != null ? (int) tgc.h : 20); heightEdit.setEnabled(tgc != null); borderChk.setSelected(tgc != null ? tgc.border : true); borderChk.setEnabled(tgc != null); if (isWordSearch && (act instanceof WordSearch)) { useGridBChk.setSelected(act.abc != null && act.abc[0] != null); wordListEditor.setTextList(((WordSearch) act).getClues()); } else { wordListEditor.setTextList(null); wordListEditor.setEnabled(false); } if (!isWordSearch && (act instanceof CrossWord)) { wildTransparentChk.setSelected(((CrossWord) act).wildTransparent); } else { wildTransparentChk.setSelected(false); } } public void saveData(Activity act) { if (act != null) { act.tgc = tgc; if (isWordSearch && (act instanceof WordSearch)) { ((WordSearch) act).setClues(wordListEditor.getTextList(), null); } else if (!isWordSearch && (act instanceof CrossWord)) { ((CrossWord) act).wildTransparent = wildTransparentChk.isSelected(); } } } private void boxBaseButtonActionPerformed() { BoxBase bb = boxBaseButton.getBoxBase(); if (bb != null && tgc != null) tgc.bb = bb; } private void borderChkActionPerformed() { if (tgc != null) tgc.border = borderChk.isSelected(); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox borderChk; private edu.xtec.jclic.beans.BoxBaseButton boxBaseButton; private edu.xtec.jclic.beans.SmallIntEditor heightEdit; private edu.xtec.jclic.beans.SmallIntEditor nColsEdit; private edu.xtec.jclic.beans.SmallIntEditor nRowsEdit; private javax.swing.JCheckBox useGridBChk; private edu.xtec.jclic.beans.SmallIntEditor widthEdit; private javax.swing.JCheckBox wildTransparentChk; private edu.xtec.jclic.beans.TextListEditor wordListEditor; private javax.swing.JLabel wordListLb; private javax.swing.JPanel wordSearchPanel; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/media/000077500000000000000000000000001335566474600170555ustar00rootroot00000000000000src/author/edu/xtec/jclic/media/EventSoundsEditorPanel.form000066400000000000000000000620311335566474600243500ustar00rootroot00000000000000
src/author/edu/xtec/jclic/media/EventSoundsEditorPanel.java000066400000000000000000000416101335566474600243260ustar00rootroot00000000000000/* * File : EventSoundsEditorPanel.java * Created : 10-feb-2004 13:33 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.Constants; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.beans.SoundButton; import edu.xtec.util.JDomUtility; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.Map; import javax.swing.JCheckBox; import javax.swing.JLabel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class EventSoundsEditorPanel extends javax.swing.JPanel implements PropertyChangeListener, ActionListener { Options options; JLabel[] txFields; JCheckBox[] chkBoxes; SoundButton[] buttons; EventSounds evs; /** Creates new form EventSoundsEditorPanel */ public EventSoundsEditorPanel(Options options, MediaBagEditor mbe) { this.options = options; evs = new EventSounds(null); initComponents(); txFields = new JLabel[] { evStart, evClick, evActionError, evActionOk, evFinishedError, evFinishedOk }; buttons = new SoundButton[] { evStartBtn, evClickBtn, evActionErrorBtn, evActionOkBtn, evFinishedErrorBtn, evFinishedOkBtn }; chkBoxes = new JCheckBox[] { evStartChk, evClickChk, evActionErrorChk, evActionOkChk, evFinishedErrorChk, evFinishedOkChk }; for (int i = 0; i < buttons.length; i++) { buttons[i].setOptions(options); buttons[i].setMediaBagEditor(mbe); buttons[i].addPropertyChangeListener(SoundButton.PROP_SND_NAME, this); chkBoxes[i].addActionListener(this); chkBoxes[i].setSelected(true); } } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; evStartLb = new javax.swing.JLabel(); evStartChk = new javax.swing.JCheckBox(); evStart = new javax.swing.JLabel(); evStartBtn = new edu.xtec.jclic.beans.SoundButton(); evClickLb = new javax.swing.JLabel(); evClickChk = new javax.swing.JCheckBox(); evClick = new javax.swing.JLabel(); evClickBtn = new edu.xtec.jclic.beans.SoundButton(); evActionOkLb = new javax.swing.JLabel(); evActionOkChk = new javax.swing.JCheckBox(); evActionOk = new javax.swing.JLabel(); evActionOkBtn = new edu.xtec.jclic.beans.SoundButton(); evActionErrorLb = new javax.swing.JLabel(); evActionErrorChk = new javax.swing.JCheckBox(); evActionError = new javax.swing.JLabel(); evActionErrorBtn = new edu.xtec.jclic.beans.SoundButton(); evFinishedOkLb = new javax.swing.JLabel(); evFinishedOkChk = new javax.swing.JCheckBox(); evFinishedOk = new javax.swing.JLabel(); evFinishedOkBtn = new edu.xtec.jclic.beans.SoundButton(); evFinishedErrorLb = new javax.swing.JLabel(); evFinishedErrorChk = new javax.swing.JCheckBox(); evFinishedError = new javax.swing.JLabel(); evFinishedErrorBtn = new edu.xtec.jclic.beans.SoundButton(); setLayout(new java.awt.GridBagLayout()); evStartLb.setLabelFor(evStartBtn); evStartLb.setText(options.getMsg("edit_evsounds_start")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evStartLb, gridBagConstraints); evStartChk.setToolTipText(options.getMsg("edit_evsounds_chk_tooltip")); evStartChk.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evStartChk, gridBagConstraints); evStart.setText(options.getMsg("edit_evsounds_default")); evStart.setPreferredSize(new java.awt.Dimension(140, 27)); evStart.setBorder(new javax.swing.border.TitledBorder("")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evStart, gridBagConstraints); evStartBtn.setToolTipText(options.getMsg("edit_evsounds_select_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evStartBtn, gridBagConstraints); evClickLb.setLabelFor(evClickBtn); evClickLb.setText(options.getMsg("edit_evsounds_click")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evClickLb, gridBagConstraints); evClickChk.setToolTipText(options.getMsg("edit_evsounds_chk_tooltip")); evClickChk.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evClickChk, gridBagConstraints); evClick.setText(options.getMsg("edit_evsounds_default")); evClick.setPreferredSize(new java.awt.Dimension(140, 27)); evClick.setBorder(new javax.swing.border.TitledBorder("")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evClick, gridBagConstraints); evClickBtn.setToolTipText(options.getMsg("edit_evsounds_select_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evClickBtn, gridBagConstraints); evActionOkLb.setLabelFor(evActionOkBtn); evActionOkLb.setText(options.getMsg("edit_evsounds_actionOk")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evActionOkLb, gridBagConstraints); evActionOkChk.setToolTipText(options.getMsg("edit_evsounds_chk_tooltip")); evActionOkChk.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evActionOkChk, gridBagConstraints); evActionOk.setText(options.getMsg("edit_evsounds_default")); evActionOk.setPreferredSize(new java.awt.Dimension(140, 27)); evActionOk.setBorder(new javax.swing.border.TitledBorder("")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evActionOk, gridBagConstraints); evActionOkBtn.setToolTipText(options.getMsg("edit_evsounds_select_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evActionOkBtn, gridBagConstraints); evActionErrorLb.setLabelFor(evActionErrorBtn); evActionErrorLb.setText(options.getMsg("edit_evsounds_actionError")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evActionErrorLb, gridBagConstraints); evActionErrorChk.setToolTipText(options.getMsg("edit_evsounds_chk_tooltip")); evActionErrorChk.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evActionErrorChk, gridBagConstraints); evActionError.setText(options.getMsg("edit_evsounds_default")); evActionError.setPreferredSize(new java.awt.Dimension(140, 27)); evActionError.setBorder(new javax.swing.border.TitledBorder("")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evActionError, gridBagConstraints); evActionErrorBtn.setToolTipText(options.getMsg("edit_evsounds_select_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evActionErrorBtn, gridBagConstraints); evFinishedOkLb.setLabelFor(evFinishedOkBtn); evFinishedOkLb.setText(options.getMsg("edit_evsounds_finishedOk")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evFinishedOkLb, gridBagConstraints); evFinishedOkChk.setToolTipText(options.getMsg("edit_evsounds_chk_tooltip")); evFinishedOkChk.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evFinishedOkChk, gridBagConstraints); evFinishedOk.setText(options.getMsg("edit_evsounds_default")); evFinishedOk.setPreferredSize(new java.awt.Dimension(140, 27)); evFinishedOk.setBorder(new javax.swing.border.TitledBorder("")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evFinishedOk, gridBagConstraints); evFinishedOkBtn.setToolTipText(options.getMsg("edit_evsounds_select_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evFinishedOkBtn, gridBagConstraints); evFinishedErrorLb.setLabelFor(evFinishedErrorBtn); evFinishedErrorLb.setText(options.getMsg("edit_evsounds_finishedError")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evFinishedErrorLb, gridBagConstraints); evFinishedErrorChk.setToolTipText(options.getMsg("edit_evsounds_chk_tooltip")); evFinishedErrorChk.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evFinishedErrorChk, gridBagConstraints); evFinishedError.setText(options.getMsg("edit_evsounds_default")); evFinishedError.setPreferredSize(new java.awt.Dimension(140, 27)); evFinishedError.setBorder(new javax.swing.border.TitledBorder("")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evFinishedError, gridBagConstraints); evFinishedErrorBtn.setToolTipText(options.getMsg("edit_evsounds_select_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(evFinishedErrorBtn, gridBagConstraints); } // GEN-END:initComponents public static boolean nameChanged(EventSounds ev, int type, String oldName, String newName) { boolean result = false; if ((type & (Constants.T_AUDIO | Constants.T_MIDI)) != 0) { if (ev.parent != null) result |= nameChanged(ev.parent, type, oldName, newName); for (int i = 0; i < ev.elements.length; i++) { if (ev.elements[i] != null && oldName.equals(ev.elements[i].fileName)) { ev.elements[i].fileName = newName; result = true; } } } return result; } public void propertyChange(PropertyChangeEvent ev) { if (ev != null && ev.getSource() instanceof SoundButton) { SoundButton src = (SoundButton) ev.getSource(); javax.swing.JLabel destLb = null; for (int i = 0; i < buttons.length; i++) { if (src == buttons[i]) { EventSoundsElement evse = evs.createElement(i); evse.setFileName(src.getSoundName()); updateDisplayFor(i); break; } } } } protected void updateDisplayFor(int event) { EventSoundsElement evse = evs.getElement(event); boolean enabled = true; String msgKey = null; String msg = null; String fName = null; if (evse == null) { msgKey = "edit_evsounds_default"; } else { enabled = (evse.getEnabled() != JDomUtility.FALSE); if (!enabled) msgKey = "edit_evsounds_disabled"; else { fName = StrUtils.nullableString(evse.getFileName()); if (fName == null) msgKey = "edit_evsounds_default"; else msg = fName; } } if (msgKey != null) msg = options.getMsg(msgKey); txFields[event].setText(msg); buttons[event].setEnabled(enabled); buttons[event].setSoundName(fName); chkBoxes[event].setSelected(enabled); } public void setEventSounds(EventSounds evs) { if ((this.evs = evs) == null) this.evs = new EventSounds(null); for (int i = 0; i < buttons.length; i++) { updateDisplayFor(i); } } public EventSounds getEventSounds() { return evs; } private static Map dlgPanels = new HashMap(1); public static EventSounds getEventSounds(EventSounds initialValue, Options options, Component parent, MediaBagEditor mbe) { EventSounds result = null; Messages msg = options.getMessages(); EventSoundsEditorPanel evsed = dlgPanels.get(options); if (evsed == null) { evsed = new EventSoundsEditorPanel(options, mbe); dlgPanels.put(options, evsed); } evsed.setEventSounds((EventSounds) initialValue.clone()); boolean b = msg.showInputDlg(parent, evsed, "edit_evsounds_dlg_title"); if (b) { result = evsed.getEventSounds(); } return result; } public void actionPerformed(java.awt.event.ActionEvent ev) { if (ev != null && ev.getSource() instanceof JCheckBox) { for (int i = 0; i < chkBoxes.length; i++) { if (chkBoxes[i] == ev.getSource()) { EventSoundsElement evse = evs.createElement(i); evse.setEnabled(chkBoxes[i].isSelected() ? JDomUtility.DEFAULT : JDomUtility.FALSE); updateDisplayFor(i); break; } } } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel evActionError; private edu.xtec.jclic.beans.SoundButton evActionErrorBtn; private javax.swing.JCheckBox evActionErrorChk; private javax.swing.JLabel evActionErrorLb; private javax.swing.JLabel evActionOk; private edu.xtec.jclic.beans.SoundButton evActionOkBtn; private javax.swing.JCheckBox evActionOkChk; private javax.swing.JLabel evActionOkLb; private javax.swing.JLabel evClick; private edu.xtec.jclic.beans.SoundButton evClickBtn; private javax.swing.JCheckBox evClickChk; private javax.swing.JLabel evClickLb; private javax.swing.JLabel evFinishedError; private edu.xtec.jclic.beans.SoundButton evFinishedErrorBtn; private javax.swing.JCheckBox evFinishedErrorChk; private javax.swing.JLabel evFinishedErrorLb; private javax.swing.JLabel evFinishedOk; private edu.xtec.jclic.beans.SoundButton evFinishedOkBtn; private javax.swing.JCheckBox evFinishedOkChk; private javax.swing.JLabel evFinishedOkLb; private javax.swing.JLabel evStart; private edu.xtec.jclic.beans.SoundButton evStartBtn; private javax.swing.JCheckBox evStartChk; private javax.swing.JLabel evStartLb; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/media/MediaContentEditor.form000066400000000000000000002013661335566474600234730ustar00rootroot00000000000000
src/author/edu/xtec/jclic/media/MediaContentEditor.java000066400000000000000000001246211335566474600234470ustar00rootroot00000000000000/* * File : MediaContentEditor.java * Created : 23-dec-2002 11:58 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.Constants; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.bags.MediaBagSelector; import edu.xtec.jclic.beans.MediaContentButton; import edu.xtec.jclic.beans.SmallIntEditor; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import edu.xtec.util.StrUtils; import java.awt.CardLayout; import java.awt.Component; import java.util.ArrayList; import java.util.Enumeration; import java.util.EventObject; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.event.DocumentEvent; import javax.swing.text.Document; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class MediaContentEditor extends edu.xtec.util.CtrlPanel { MediaContent mc; Options options; MediaBagEditor mbe; public static final String PROP_MC = "mediaContent"; private static final String[] LOCATION_FROM_MSG_CODES = { "box", "window", "frame" }; List locationFromNames; private JTextField[] textFields; /** Creates new form MediaContentEditor */ public MediaContentEditor(Options options, MediaContent mc, MediaBagEditor mbe) { this.options = options; pre_init(); initComponents(); post_init(); setMediaBagEditor(mbe); setMediaContent(mc); } private void pre_init() { locationFromNames = new ArrayList(); for (String code : LOCATION_FROM_MSG_CODES) locationFromNames.add(options.getMsg("edit_mc_location_from_" + code)); } private void post_init() { textFields = new JTextField[] { fileTxt, externalTxt, fromTxt, toTxt, xTxt, yTxt }; for (int i = 0; i < textFields.length; i++) textFields[i].getDocument().addDocumentListener(this); Enumeration en = mediaTypes.getElements(); while (en.hasMoreElements()) { JToggleButton rb = (JToggleButton) en.nextElement(); rb.addActionListener(this); } } public void setMediaBagEditor(MediaBagEditor mbe) { this.mbe = mbe; } private void checkAndFirePropertyChange(MediaContent oldMc) { MediaContent currentMc = getMc(); boolean eq = ((oldMc == null && currentMc == null) || (oldMc != null && oldMc.equals(currentMc))); if (!eq) firePropertyChange(PROP_MC, oldMc, currentMc); } public void setMediaContent(MediaContent c) { if (c == null) c = new MediaContent(); setInitializing(true); mc = (MediaContent) c.clone(); Enumeration en = mediaTypes.getElements(); JToggleButton rb = (JToggleButton) en.nextElement(); int i = 0; for (; i < mc.mediaType; i++) rb = (JToggleButton) en.nextElement(); rb.setSelected(true); levelEditor.setValue(mc.level); recBufferEditor.setValue(mc.recBuffer); fileTxt.setText(mc.mediaFileName); externalTxt.setText(mc.externalParam); fromTxt.setText(Integer.toString(mc.from)); toTxt.setText(Integer.toString(mc.to)); lengthEditor.setValue(mc.length); stretchChk.setSelected(mc.stretch); if (mc.absLocation != null) posAbsoluteRadio.setSelected(true); else if (mc.free) posWindowRadio.setSelected(true); else posCellRadio.setSelected(true); syncPointValues(); loopChk.setSelected(mc.loop); autostartChk.setSelected(mc.autoStart); catchMouseChk.setSelected(mc.catchMouseEvents); checkEnabled(); setInitializing(false); } public boolean check(Component parent) { boolean result = false; switch (mc.mediaType) { case MediaContent.PLAY_AUDIO: case MediaContent.PLAY_VIDEO: case MediaContent.PLAY_MIDI: case MediaContent.RUN_EXTERNAL: case MediaContent.URL: case MediaContent.RUN_CLIC_ACTIVITY: result = StrUtils.nullableString(mc.mediaFileName) != null; break; case MediaContent.RECORD_AUDIO: case MediaContent.PLAY_RECORDED_AUDIO: result = (mc.recBuffer >= 0 && mc.recBuffer < 10); break; case MediaContent.RUN_CLIC_PACKAGE: result = StrUtils.nullableString(mc.mediaFileName) != null || StrUtils.nullableString(mc.externalParam) != null; break; case MediaContent.EXIT: case MediaContent.RETURN: result = true; break; } if (!result) options.getMessages().showAlert(parent, "edit_mc_err_nullContent"); return result; } public MediaContent getMc() { return mc; } public MediaContent getMcClone() { return mc == null ? null : (MediaContent) mc.clone(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; mediaTypes = new javax.swing.ButtonGroup(); posTypes = new javax.swing.ButtonGroup(); mediaTypePanel = new javax.swing.JPanel(); javax.swing.JToggleButton toggleType00 = new javax.swing.JToggleButton(); toggleType01 = new javax.swing.JToggleButton(); toggleType02 = new javax.swing.JToggleButton(); toggleType03 = new javax.swing.JToggleButton(); toggleType04 = new javax.swing.JToggleButton(); toggleType05 = new javax.swing.JToggleButton(); toggleType06 = new javax.swing.JToggleButton(); toggleType07 = new javax.swing.JToggleButton(); toggleType08 = new javax.swing.JToggleButton(); toggleType09 = new javax.swing.JToggleButton(); toggleType10 = new javax.swing.JToggleButton(); toggleType11 = new javax.swing.JToggleButton(); toggleType12 = new javax.swing.JToggleButton(); mainPanel = new javax.swing.JPanel(); lbLevel = new javax.swing.JLabel(); levelEditor = new edu.xtec.jclic.beans.SmallIntEditor(); loopChk = new javax.swing.JCheckBox(); autostartChk = new javax.swing.JCheckBox(); filePanel = new javax.swing.JPanel(); javax.swing.JPanel filePanelCard0 = new javax.swing.JPanel(); javax.swing.JPanel filePanelCard1 = new javax.swing.JPanel(); lbFile = new javax.swing.JLabel(); fileTxt = new javax.swing.JTextField(); findFileBtn = new javax.swing.JButton(); javax.swing.JPanel filePanelCard2 = new javax.swing.JPanel(); lbRecbuffer = new javax.swing.JLabel(); recBufferEditor = new edu.xtec.jclic.beans.SmallIntEditor(); lbLength = new javax.swing.JLabel(); lengthEditor = new edu.xtec.jclic.beans.SmallIntEditor(); fragmentPanel = new javax.swing.JPanel(); javax.swing.JPanel fragmentPanelCard0 = new javax.swing.JPanel(); javax.swing.JPanel fragmentPanelCard1 = new javax.swing.JPanel(); lbFrom = new javax.swing.JLabel(); fromTxt = new javax.swing.JTextField(); lbTo = new javax.swing.JLabel(); toTxt = new javax.swing.JTextField(); javax.swing.JPanel fragmentPanelCard2 = new javax.swing.JPanel(); lbExternal = new javax.swing.JLabel(); externalTxt = new javax.swing.JTextField(); locationPanel = new javax.swing.JPanel(); javax.swing.JPanel locationPanelCard0 = new javax.swing.JPanel(); javax.swing.JPanel locationPanelCard1 = new javax.swing.JPanel(); javax.swing.JPanel lpanel = new javax.swing.JPanel(); posCellRadio = new javax.swing.JRadioButton(); posWindowRadio = new javax.swing.JRadioButton(); posAbsoluteRadio = new javax.swing.JRadioButton(); lbX = new javax.swing.JLabel(); xTxt = new javax.swing.JTextField(); lbY = new javax.swing.JLabel(); yTxt = new javax.swing.JTextField(); lbLocFrom = new javax.swing.JLabel(); locFromCombo = new javax.swing.JComboBox(locationFromNames.toArray()); catchMouseChk = new javax.swing.JCheckBox(); stretchChk = new javax.swing.JCheckBox(); setBorder(javax.swing.BorderFactory.createEtchedBorder()); setLayout(new java.awt.BorderLayout()); mediaTypePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_mc_type"))); mediaTypePanel.setLayout(new java.awt.GridBagLayout()); mediaTypes.add(toggleType00); toggleType00.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[0])); toggleType00.setText(options.getMsg("edit_mc_type_unknown")); toggleType00.setToolTipText(options.getMsg("edit_mc_type_unknown")); toggleType00.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType00, gridBagConstraints); mediaTypes.add(toggleType01); toggleType01.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[1])); toggleType01.setText(options.getMsg("edit_mc_type_sound")); toggleType01.setToolTipText(options.getMsg("edit_mc_type_sound")); toggleType01.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType01, gridBagConstraints); mediaTypes.add(toggleType02); toggleType02.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[2])); toggleType02.setText(options.getMsg("edit_mc_type_video")); toggleType02.setToolTipText(options.getMsg("edit_mc_type_video")); toggleType02.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType02, gridBagConstraints); mediaTypes.add(toggleType03); toggleType03.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[3])); toggleType03.setText(options.getMsg("edit_mc_type_midi")); toggleType03.setToolTipText(options.getMsg("edit_mc_type_midi")); toggleType03.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType03, gridBagConstraints); mediaTypes.add(toggleType04); toggleType04.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[4])); toggleType04.setText(options.getMsg("edit_mc_type_cdaudio")); toggleType04.setToolTipText(options.getMsg("edit_mc_type_cdaudio")); toggleType04.setEnabled(false); toggleType04.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType04, gridBagConstraints); mediaTypes.add(toggleType05); toggleType05.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[5])); toggleType05.setText(options.getMsg("edit_mc_type_record")); toggleType05.setToolTipText(options.getMsg("edit_mc_type_record")); toggleType05.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType05, gridBagConstraints); mediaTypes.add(toggleType06); toggleType06.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[6])); toggleType06.setText(options.getMsg("edit_mc_type_play_recorded")); toggleType06.setToolTipText(options.getMsg("edit_mc_type_play_recorded")); toggleType06.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType06, gridBagConstraints); mediaTypes.add(toggleType07); toggleType07.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[7])); toggleType07.setText(options.getMsg("edit_mc_type_run_activity")); toggleType07.setToolTipText(options.getMsg("edit_mc_type_run_activity")); toggleType07.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType07, gridBagConstraints); mediaTypes.add(toggleType08); toggleType08.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[8])); toggleType08.setText(options.getMsg("edit_mc_type_run_sequence")); toggleType08.setToolTipText(options.getMsg("edit_mc_type_run_sequence")); toggleType08.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType08, gridBagConstraints); mediaTypes.add(toggleType09); toggleType09.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[9])); toggleType09.setText(options.getMsg("edit_mc_type_run_external")); toggleType09.setToolTipText(options.getMsg("edit_mc_type_run_external")); toggleType09.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType09, gridBagConstraints); mediaTypes.add(toggleType10); toggleType10.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[10])); toggleType10.setText(options.getMsg("edit_mc_type_url")); toggleType10.setToolTipText(options.getMsg("edit_mc_type_url")); toggleType10.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType10, gridBagConstraints); mediaTypes.add(toggleType11); toggleType11.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[11])); toggleType11.setText(options.getMsg("edit_mc_type_exit")); toggleType11.setToolTipText(options.getMsg("edit_mc_type_exit")); toggleType11.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType11, gridBagConstraints); mediaTypes.add(toggleType12); toggleType12.setIcon(ResourceManager.getImageIcon(MediaContentButton.MEDIA_ICONS[12])); toggleType12.setText(options.getMsg("edit_mc_type_return")); toggleType12.setToolTipText(options.getMsg("edit_mc_type_return")); toggleType12.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mediaTypePanel.add(toggleType12, gridBagConstraints); add(mediaTypePanel, java.awt.BorderLayout.WEST); mainPanel.setLayout(new java.awt.GridBagLayout()); lbLevel.setText(options.getMsg("edit_mc_level")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(lbLevel, gridBagConstraints); levelEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(levelEditor, gridBagConstraints); loopChk.setText(options.getMsg("edit_mc_loop")); loopChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(loopChk, gridBagConstraints); autostartChk.setText(options.getMsg("edit_mc_autostart")); autostartChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(autostartChk, gridBagConstraints); filePanel.setLayout(new java.awt.CardLayout()); filePanel.add(filePanelCard0, "card0"); filePanelCard1.setLayout(new java.awt.GridBagLayout()); lbFile.setText(options.getMsg("edit_mc_file")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanelCard1.add(lbFile, gridBagConstraints); fileTxt.setHorizontalAlignment(javax.swing.JTextField.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanelCard1.add(fileTxt, gridBagConstraints); findFileBtn.setText("..."); findFileBtn.addActionListener(this); filePanelCard1.add(findFileBtn, new java.awt.GridBagConstraints()); filePanel.add(filePanelCard1, "card1"); filePanelCard2.setLayout(new java.awt.GridBagLayout()); lbRecbuffer.setText(options.getMsg("edit_mc_recBuffer")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanelCard2.add(lbRecbuffer, gridBagConstraints); recBufferEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanelCard2.add(recBufferEditor, gridBagConstraints); lbLength.setText(options.getMsg("edit_mc_length")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanelCard2.add(lbLength, gridBagConstraints); lengthEditor.setMax(180); lengthEditor.setMin(1); lengthEditor.setValue(5); lengthEditor.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); filePanelCard2.add(lengthEditor, gridBagConstraints); filePanel.add(filePanelCard2, "card2"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(filePanel, gridBagConstraints); fragmentPanel.setLayout(new java.awt.CardLayout()); fragmentPanel.add(fragmentPanelCard0, "card0"); fragmentPanelCard1.setLayout(new java.awt.GridBagLayout()); lbFrom.setLabelFor(fromTxt); lbFrom.setText(options.getMsg("edit_mc_from")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); fragmentPanelCard1.add(lbFrom, gridBagConstraints); fromTxt.setHorizontalAlignment(javax.swing.JTextField.RIGHT); fromTxt.setPreferredSize(new java.awt.Dimension(60, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); fragmentPanelCard1.add(fromTxt, gridBagConstraints); lbTo.setLabelFor(toTxt); lbTo.setText(options.getMsg("edit_mc_to")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); fragmentPanelCard1.add(lbTo, gridBagConstraints); toTxt.setHorizontalAlignment(javax.swing.JTextField.RIGHT); toTxt.setPreferredSize(new java.awt.Dimension(60, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); fragmentPanelCard1.add(toTxt, gridBagConstraints); fragmentPanel.add(fragmentPanelCard1, "card1"); fragmentPanelCard2.setLayout(new java.awt.GridBagLayout()); lbExternal.setLabelFor(externalTxt); lbExternal.setText(options.getMsg("edit_mc_externalParam")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); fragmentPanelCard2.add(lbExternal, gridBagConstraints); externalTxt.setHorizontalAlignment(javax.swing.JTextField.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); fragmentPanelCard2.add(externalTxt, gridBagConstraints); fragmentPanel.add(fragmentPanelCard2, "card2"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(fragmentPanel, gridBagConstraints); locationPanel.setLayout(new java.awt.CardLayout()); locationPanel.add(locationPanelCard0, "card0"); locationPanelCard1.setLayout(new java.awt.GridBagLayout()); lpanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_mc_location"))); lpanel.setLayout(new java.awt.GridBagLayout()); posTypes.add(posCellRadio); posCellRadio.setText(options.getMsg("edit_mc_pos_cell")); posCellRadio.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 0, 3); lpanel.add(posCellRadio, gridBagConstraints); posTypes.add(posWindowRadio); posWindowRadio.setText(options.getMsg("edit_mc_pos_window")); posWindowRadio.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); lpanel.add(posWindowRadio, gridBagConstraints); posTypes.add(posAbsoluteRadio); posAbsoluteRadio.setText(options.getMsg("edit_mc_pos_absolute")); posAbsoluteRadio.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 3, 3, 3); lpanel.add(posAbsoluteRadio, gridBagConstraints); lbX.setText(options.getMsg("edit_mc_location_x")); lbX.setLabelFor(xTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); lpanel.add(lbX, gridBagConstraints); xTxt.setHorizontalAlignment(javax.swing.JTextField.RIGHT); xTxt.setPreferredSize(new java.awt.Dimension(60, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); lpanel.add(xTxt, gridBagConstraints); lbY.setText(options.getMsg("edit_mc_location_y")); lbY.setLabelFor(yTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); lpanel.add(lbY, gridBagConstraints); yTxt.setHorizontalAlignment(javax.swing.JTextField.RIGHT); yTxt.setPreferredSize(new java.awt.Dimension(60, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); lpanel.add(yTxt, gridBagConstraints); lbLocFrom.setText(options.getMsg("edit_mc_location_from")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); lpanel.add(lbLocFrom, gridBagConstraints); locFromCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); lpanel.add(locFromCombo, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); locationPanelCard1.add(lpanel, gridBagConstraints); catchMouseChk.setText(options.getMsg("edit_mc_catchmouse")); catchMouseChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); locationPanelCard1.add(catchMouseChk, gridBagConstraints); stretchChk.setText(options.getMsg("edit_mc_stretch")); stretchChk.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); locationPanelCard1.add(stretchChk, gridBagConstraints); locationPanel.add(locationPanelCard1, "card1"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(locationPanel, gridBagConstraints); add(mainPanel, java.awt.BorderLayout.CENTER); } // //GEN-END:initComponents @Override public boolean documentChangePerformed(DocumentEvent ev) { Document doc = ev.getDocument(); int v = 0; for (; v < textFields.length; v++) if (textFields[v].getDocument() == doc) break; if (v < textFields.length) return eventPerformed(new EventObject(textFields[v])); return false; } @Override public boolean eventPerformed(EventObject ev) { if (ev != null && ev.getSource() != null) { setInitializing(true); MediaContent oldMc = getMcClone(); Object src = ev.getSource(); if (src == levelEditor) mc.level = levelEditor.getValue(); else if (src == recBufferEditor) mc.recBuffer = recBufferEditor.getValue(); else if (src == lengthEditor) mc.length = lengthEditor.getValue(); else if (src == fileTxt) { String s = fileTxt.getText(); mc.mediaFileName = (s.length() > 0 ? s : null); } else if (src == externalTxt) { String s = externalTxt.getText(); mc.externalParam = (s.length() > 0 ? s : null); } else if (src == fromTxt) mc.from = getIntValue(fromTxt, -1); else if (src == toTxt) mc.to = getIntValue(toTxt, -1); else if (src == stretchChk) mc.stretch = stretchChk.isSelected(); else if (src == posCellRadio) { mc.free = false; mc.absLocation = null; syncPointValues(); checkEnabled(); } else if (src == posWindowRadio) { mc.free = true; mc.absLocation = null; syncPointValues(); checkEnabled(); } else if (src == posAbsoluteRadio) { mc.free = false; mc.absLocation = new java.awt.Point(); syncPointValues(); checkEnabled(); } else if (src == locFromCombo) mc.absLocationFrom = Math.max(0, locFromCombo.getSelectedIndex()); else if (src == xTxt && mc.absLocation != null) mc.absLocation.x = getIntValue(xTxt, 0); else if (src == yTxt && mc.absLocation != null) mc.absLocation.y = getIntValue(yTxt, 0); else if (src == loopChk) mc.loop = loopChk.isSelected(); else if (src == autostartChk) mc.autoStart = autostartChk.isSelected(); else if (src == catchMouseChk) mc.catchMouseEvents = catchMouseChk.isSelected(); else if (src == findFileBtn) { selectBtnPressed(); } else if (src instanceof JToggleButton) { Enumeration en = mediaTypes.getElements(); int v = -1, j = 0; while (en.hasMoreElements()) { JToggleButton rb = (JToggleButton) en.nextElement(); if (rb == src) { v = j; break; } j++; } if (v >= 0) { int currentType = mc.mediaType; mc.mediaType = v; if (mc.mediaType != currentType) { MediaContent mc2 = new MediaContent(); mc2.mediaType = mc.mediaType; setMediaContent(mc2); } } } checkAndFirePropertyChange(oldMc); setInitializing(false); } return true; } protected void selectBtnPressed() { String value = null; JList list = null; String dlgTitleKey = null; if (mc.mediaType == MediaContent.RUN_CLIC_ACTIVITY) { list = new JList(mbe.getProjectEditor().getActivityBagEditor().getListModel()); dlgTitleKey = "edit_mc_activity_selection"; } else if (mc.mediaType == MediaContent.RUN_CLIC_PACKAGE) { list = new JList(mbe.getProjectEditor().getActivitySequenceEditor().getTagList()); dlgTitleKey = "edit_mc_sequence_selection"; } if (list != null) { JScrollPane pane = new JScrollPane(list); if (options.getMessages().showInputDlg(this, pane, dlgTitleKey)) { Object o = list.getSelectedValue(); if (o != null) value = o.toString(); } } else { int filter = mc.mediaType == MediaContent.PLAY_AUDIO ? Utils.ALL_SOUNDS_FF : mc.mediaType == MediaContent.PLAY_MIDI ? Utils.MIDI_FF : mc.mediaType == MediaContent.PLAY_VIDEO ? Utils.ALL_VIDEO_FF : Utils.ALL_MULTIMEDIA_FF; value = MediaBagSelector.getMediaName(mc.mediaFileName, options, this, mbe, filter); } if (value != null) { mc.mediaFileName = value; fileTxt.setText(value); } } protected void checkEnabled() { boolean bLevel = true, bRecBuffer = false, bLength = false, bFile = false; boolean bExternal = false, bFrom = false, bTo = false, bStretch = false; boolean bLocation = false; boolean bLoop = false, bAutostart = true, bCatchMouse = false; int filePanelItem = 0, fragmentPanelItem = 0, locationPanelItem = 0; switch (mc.mediaType) { case MediaContent.PLAY_VIDEO: bStretch = true; bLocation = true; bCatchMouse = true; locationPanelItem = 1; case MediaContent.PLAY_AUDIO: case MediaContent.PLAY_MIDI: bFile = true; bFrom = true; bTo = true; bLoop = true; filePanelItem = 1; fragmentPanelItem = 1; break; case MediaContent.PLAY_CDAUDIO: break; case MediaContent.RECORD_AUDIO: bLength = true; case MediaContent.PLAY_RECORDED_AUDIO: bRecBuffer = true; filePanelItem = 2; break; case MediaContent.RUN_CLIC_ACTIVITY: case MediaContent.RUN_CLIC_PACKAGE: case MediaContent.RUN_EXTERNAL: bExternal = true; case MediaContent.URL: bFile = true; bLevel = false; filePanelItem = 1; fragmentPanelItem = 2; break; case MediaContent.EXIT: case MediaContent.RETURN: bLevel = false; break; default: bLevel = false; break; } levelEditor.setEnabled(bLevel); recBufferEditor.setEnabled(bRecBuffer); lengthEditor.setEnabled(bLength); fileTxt.setEnabled(bFile); findFileBtn.setEnabled(bFile); externalTxt.setEnabled(bExternal); fromTxt.setEnabled(bFrom); toTxt.setEnabled(bTo); stretchChk.setEnabled(bStretch); posCellRadio.setEnabled(bLocation); posWindowRadio.setEnabled(bLocation); posAbsoluteRadio.setEnabled(bLocation); locFromCombo.setEnabled(bLocation && mc.absLocation != null); xTxt.setEnabled(bLocation && mc.absLocation != null); yTxt.setEnabled(bLocation && mc.absLocation != null); loopChk.setEnabled(bLoop); autostartChk.setEnabled(bAutostart); catchMouseChk.setEnabled(bCatchMouse); CardLayout cl = (CardLayout) filePanel.getLayout(); cl.show(filePanel, "card" + Integer.toString(filePanelItem)); if (filePanelItem == 1) { String s = mc.mediaType == MediaContent.RUN_CLIC_ACTIVITY ? "edit_mc_activity" : mc.mediaType == MediaContent.RUN_CLIC_PACKAGE ? "edit_mc_sequence" : mc.mediaType == MediaContent.URL ? "edit_mc_url" : "edit_mc_file"; lbFile.setText(options.getMsg(s)); boolean b = (mc.mediaType != MediaContent.URL && mc.mediaType != MediaContent.RUN_EXTERNAL); findFileBtn.setVisible(b); filePanel.revalidate(); } cl = (CardLayout) fragmentPanel.getLayout(); cl.show(fragmentPanel, "card" + Integer.toString(fragmentPanelItem)); if (fragmentPanelItem == 2) { String s = mc.mediaType == MediaContent.RUN_CLIC_ACTIVITY || mc.mediaType == MediaContent.RUN_CLIC_PACKAGE ? "edit_mc_project" : "edit_mc_externalParam"; lbExternal.setText(options.getMsg(s)); fragmentPanel.revalidate(); } cl = (CardLayout) locationPanel.getLayout(); cl.show(locationPanel, "card" + Integer.toString(locationPanelItem)); } private void syncPointValues() { java.awt.Point p = mc.absLocation; if (p == null) p = new java.awt.Point(); xTxt.setText(Integer.toString(p.x)); yTxt.setText(Integer.toString(p.y)); locFromCombo.setSelectedIndex(mc.absLocationFrom); } protected int getIntValue(JTextField txf, int defaultValue) { String s = txf.getText(); int result = defaultValue; try { result = Integer.parseInt(s); } catch (Exception ex) { } return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox autostartChk; private javax.swing.JCheckBox catchMouseChk; private javax.swing.JTextField externalTxt; private javax.swing.JPanel filePanel; private javax.swing.JTextField fileTxt; private javax.swing.JButton findFileBtn; private javax.swing.JPanel fragmentPanel; private javax.swing.JTextField fromTxt; private javax.swing.JLabel lbExternal; private javax.swing.JLabel lbFile; private javax.swing.JLabel lbFrom; private javax.swing.JLabel lbLength; private javax.swing.JLabel lbLevel; private javax.swing.JLabel lbLocFrom; private javax.swing.JLabel lbRecbuffer; private javax.swing.JLabel lbTo; private javax.swing.JLabel lbX; private javax.swing.JLabel lbY; private edu.xtec.jclic.beans.SmallIntEditor lengthEditor; private edu.xtec.jclic.beans.SmallIntEditor levelEditor; private javax.swing.JComboBox locFromCombo; private javax.swing.JPanel locationPanel; private javax.swing.JCheckBox loopChk; private javax.swing.JPanel mainPanel; private javax.swing.JPanel mediaTypePanel; private javax.swing.ButtonGroup mediaTypes; private javax.swing.JRadioButton posAbsoluteRadio; private javax.swing.JRadioButton posCellRadio; private javax.swing.ButtonGroup posTypes; private javax.swing.JRadioButton posWindowRadio; private edu.xtec.jclic.beans.SmallIntEditor recBufferEditor; private javax.swing.JCheckBox stretchChk; private javax.swing.JTextField toTxt; private javax.swing.JToggleButton toggleType01; private javax.swing.JToggleButton toggleType02; private javax.swing.JToggleButton toggleType03; private javax.swing.JToggleButton toggleType04; private javax.swing.JToggleButton toggleType05; private javax.swing.JToggleButton toggleType06; private javax.swing.JToggleButton toggleType07; private javax.swing.JToggleButton toggleType08; private javax.swing.JToggleButton toggleType09; private javax.swing.JToggleButton toggleType10; private javax.swing.JToggleButton toggleType11; private javax.swing.JToggleButton toggleType12; private javax.swing.JTextField xTxt; private javax.swing.JTextField yTxt; // End of variables declaration//GEN-END:variables private static Map panels = new HashMap(); public static MediaContent getMediaContent(MediaContent initialMc, Component parent, Options options, MediaBagEditor mbe) { MediaContent result = null; Messages msg = options.getMessages(); MediaContentEditor mce = panels.get(options); if (mce == null) { mce = new MediaContentEditor(options, initialMc, mbe); panels.put(options, mce); } else { mce.setMediaBagEditor(mbe); mce.setMediaContent(initialMc); } if (msg.showInputDlg(parent, mce, "edit_mc_title") && mce.check(parent)) result = mce.getMc(); return result; } public static boolean nameChanged(MediaContent mc, int type, String oldName, String newName) { boolean result = false; if ((type & (Constants.T_MEDIA | Constants.T_SEQUENCE | Constants.T_URL)) != 0 && oldName.equals(mc.mediaFileName)) { mc.mediaFileName = newName; result = true; } return result; } } src/author/edu/xtec/jclic/misc/000077500000000000000000000000001335566474600167315ustar00rootroot00000000000000src/author/edu/xtec/jclic/misc/GradientEditor.form000066400000000000000000000353661335566474600225370ustar00rootroot00000000000000
src/author/edu/xtec/jclic/misc/GradientEditor.java000066400000000000000000000312261335566474600225040ustar00rootroot00000000000000/* * File : GradientEditor.java * Created : 25-sep-2002 19:18 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.misc; import edu.xtec.jclic.beans.ColorButton; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class GradientEditor extends javax.swing.JPanel { Options options; Gradient gradient; /** Creates new form GradientEditor */ public GradientEditor(Options options, Gradient gradient) { this.options = options; initComponents(); setGradient(gradient); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel endColorLb; javax.swing.JLabel orientationLb; java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel cyclesLb; javax.swing.JLabel startColorLb; previewPanel = new GradientPreview(); startColorLb = new javax.swing.JLabel(); startColorBtn = new edu.xtec.jclic.beans.ColorButton(); startColorBtn.setOptions(options); endColorLb = new javax.swing.JLabel(); endColorBtn = new edu.xtec.jclic.beans.ColorButton(); endColorBtn.setOptions(options); cyclesLb = new javax.swing.JLabel(); cyclesTxt = new javax.swing.JTextField(); cyclesSlider = new javax.swing.JSlider(); orientationLb = new javax.swing.JLabel(); orientationTxt = new javax.swing.JTextField(); orientationSlider = new javax.swing.JSlider(); setLayout(new java.awt.GridBagLayout()); previewPanel.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED)); previewPanel.setPreferredSize(new java.awt.Dimension(100, 100)); previewPanel.setMinimumSize(new java.awt.Dimension(100, 100)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridheight = 4; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; add(previewPanel, gridBagConstraints); startColorLb.setText(options.getMsg("edit_gradient_startColor")); startColorLb.setLabelFor(startColorBtn); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(startColorLb, gridBagConstraints); startColorBtn.setToolTipText(options.getMsg("edit_gradient_startColor_tooltip")); startColorBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { startColorBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(startColorBtn, gridBagConstraints); endColorLb.setText(options.getMsg("edit_gradient_endColor")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(endColorLb, gridBagConstraints); endColorBtn.setToolTipText(options.getMsg("edit_gradient_endColor_tooltip")); endColorBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { endColorBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(endColorBtn, gridBagConstraints); cyclesLb.setText(options.getMsg("edit_gradient_cycles")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(cyclesLb, gridBagConstraints); cyclesTxt.setToolTipText(options.getMsg("edit_gradient_cycles_tooltip")); cyclesTxt.setPreferredSize(new java.awt.Dimension(40, 21)); cyclesTxt.setMinimumSize(new java.awt.Dimension(40, 21)); cyclesTxt.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cyclesTxtActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(cyclesTxt, gridBagConstraints); cyclesSlider.setMinorTickSpacing(10); cyclesSlider.setPaintTicks(true); cyclesSlider.setMinimum(1); cyclesSlider.setMajorTickSpacing(10); cyclesSlider.setToolTipText(options.getMsg("edit_gradient_cycles_tooltip")); cyclesSlider.setMaximum(50); cyclesSlider.setPreferredSize(new java.awt.Dimension(100, 27)); cyclesSlider.setMinimumSize(new java.awt.Dimension(100, 27)); cyclesSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { cyclesSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(cyclesSlider, gridBagConstraints); orientationLb.setText(options.getMsg("edit_gradient_orientation")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(orientationLb, gridBagConstraints); orientationTxt.setToolTipText(options.getMsg("edit_gradient_orientation_tooltip")); orientationTxt.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { orientationTxtActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(orientationTxt, gridBagConstraints); orientationSlider.setMinorTickSpacing(30); orientationSlider.setPaintTicks(true); orientationSlider.setMajorTickSpacing(90); orientationSlider.setToolTipText(options.getMsg("edit_gradient_orientation_tooltip")); orientationSlider.setMaximum(360); orientationSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { orientationSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(orientationSlider, gridBagConstraints); } // GEN-END:initComponents private void endColorBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_endColorBtnActionPerformed gradient.setColors(((ColorButton) startColorBtn).getColor(), ((ColorButton) endColorBtn).getColor()); previewPanel.repaint(); } // GEN-LAST:event_endColorBtnActionPerformed private void startColorBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_startColorBtnActionPerformed gradient.setColors(((ColorButton) startColorBtn).getColor(), ((ColorButton) endColorBtn).getColor()); previewPanel.repaint(); } // GEN-LAST:event_startColorBtnActionPerformed private void orientationSliderStateChanged(javax.swing.event.ChangeEvent evt) { // GEN-FIRST:event_orientationSliderStateChanged int v = orientationSlider.getValue(); orientationTxt.setText(Integer.toString(v)); orientationSlider.setValue(v); gradient.setAngle(v); previewPanel.repaint(); } // GEN-LAST:event_orientationSliderStateChanged private void cyclesSliderStateChanged(javax.swing.event.ChangeEvent evt) { // GEN-FIRST:event_cyclesSliderStateChanged int v = cyclesSlider.getValue(); cyclesTxt.setText(Integer.toString(v)); cyclesSlider.setValue(v); gradient.setCycles(v); previewPanel.repaint(); } // GEN-LAST:event_cyclesSliderStateChanged private void orientationTxtActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_orientationTxtActionPerformed int v = gradient.angle; try { v = Math.max(0, Integer.parseInt(orientationTxt.getText())) % 360; } catch (Exception ex) { options.getMessages().showErrorWarning(this, "ERROR", ex); } orientationTxt.setText(Integer.toString(v)); orientationSlider.setValue(v); gradient.setAngle(v); previewPanel.repaint(); } // GEN-LAST:event_orientationTxtActionPerformed private void cyclesTxtActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_cyclesTxtActionPerformed int v = gradient.cycles; try { v = Math.max(1, Integer.parseInt(cyclesTxt.getText())); } catch (Exception ex) { options.getMessages().showErrorWarning(this, "ERROR", ex); } cyclesTxt.setText(Integer.toString(v)); cyclesSlider.setValue(v); gradient.setCycles(v); previewPanel.repaint(); } // GEN-LAST:event_cyclesTxtActionPerformed public void setGradient(Gradient g) { if (g == null) g = new Gradient(); gradient = new Gradient(g.getColors()[0], g.getColors()[1], g.getAngle(), g.getCycles()); ((ColorButton) startColorBtn).setColor(gradient.c1); ((ColorButton) endColorBtn).setColor(gradient.c2); cyclesSlider.setValue(gradient.cycles); cyclesTxt.setText(Integer.toString(gradient.cycles)); orientationSlider.setValue(gradient.angle); orientationTxt.setText(Integer.toString(gradient.angle)); } class GradientPreview extends javax.swing.JPanel { GradientPreview() { super(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(edu.xtec.jclic.Constants.DEFAULT_RENDERING_HINTS); gradient.paint(g2, new Rectangle(0, 0, getWidth(), getHeight())); g2.setRenderingHints(rh); } } private static Map panels = new HashMap(); public static Gradient getGradient(Gradient initialGradient, Component parent, Options options) { Messages msg = options.getMessages(); GradientEditor ge = panels.get(options); if (ge == null) { ge = new GradientEditor(options, initialGradient); panels.put(options, ge); } else { ge.setGradient(initialGradient); } boolean b = msg.showInputDlg(parent, ge, "edit_gradient_title"); return b ? ge.gradient : null; } // Variables declaration - do not modify//GEN-BEGIN:variables private edu.xtec.jclic.beans.ColorButton startColorBtn; private javax.swing.JTextField cyclesTxt; private edu.xtec.jclic.beans.ColorButton endColorBtn; private javax.swing.JSlider cyclesSlider; private javax.swing.JPanel previewPanel; private javax.swing.JSlider orientationSlider; private javax.swing.JTextField orientationTxt; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/project/000077500000000000000000000000001335566474600174445ustar00rootroot00000000000000src/author/edu/xtec/jclic/project/AuthorEditPanel.form000066400000000000000000000363151335566474600233710ustar00rootroot00000000000000
src/author/edu/xtec/jclic/project/AuthorEditPanel.java000066400000000000000000000214731335566474600233460ustar00rootroot00000000000000/* * File : AuthorEditPanel.java * Created : 27-feb-2004 17:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class AuthorEditPanel extends javax.swing.JPanel { Options options; /** Creates new form AuthorEditPanel */ public AuthorEditPanel(Options options) { this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel commentsLb; javax.swing.JScrollPane commentsScroll; java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel mailLb; javax.swing.JLabel nameLb; javax.swing.JLabel organizationLb; javax.swing.JLabel rolLb; javax.swing.JLabel urlLb; nameLb = new javax.swing.JLabel(); nameText = new javax.swing.JTextField(); rolLb = new javax.swing.JLabel(); rolText = new javax.swing.JTextField(); mailLb = new javax.swing.JLabel(); mailText = new javax.swing.JTextField(); urlLb = new javax.swing.JLabel(); urlText = new javax.swing.JTextField(); organizationLb = new javax.swing.JLabel(); organizationText = new javax.swing.JTextField(); commentsLb = new javax.swing.JLabel(); commentsScroll = new javax.swing.JScrollPane(); commentsText = new javax.swing.JTextArea(); setLayout(new java.awt.GridBagLayout()); nameLb.setLabelFor(nameText); nameLb.setText(options.getMsg("edit_project_author_name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(nameLb, gridBagConstraints); nameText.setToolTipText(options.getMsg("edit_project_author_name_tooltip")); nameText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(nameText, gridBagConstraints); rolLb.setLabelFor(rolText); rolLb.setText(options.getMsg("edit_project_author_rol")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(rolLb, gridBagConstraints); rolText.setToolTipText(options.getMsg("edit_project_author_rol_tooltip")); rolText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(rolText, gridBagConstraints); mailLb.setLabelFor(mailText); mailLb.setText(options.getMsg("edit_project_author_mail")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(mailLb, gridBagConstraints); mailText.setToolTipText(options.getMsg("edit_project_author_mail_tooltip")); mailText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(mailText, gridBagConstraints); urlLb.setLabelFor(urlText); urlLb.setText(options.getMsg("edit_project_author_url")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(urlLb, gridBagConstraints); urlText.setToolTipText(options.getMsg("edit_project_author_url_tooltip")); urlText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(urlText, gridBagConstraints); organizationLb.setLabelFor(organizationText); organizationLb.setText(options.getMsg("edit_project_author_organization")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(organizationLb, gridBagConstraints); organizationText.setToolTipText(options.getMsg("edit_project_author_organization_tooltip")); organizationText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(organizationText, gridBagConstraints); commentsLb.setLabelFor(commentsText); commentsLb.setText(options.getMsg("edit_project_author_comments")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(commentsLb, gridBagConstraints); commentsScroll.setPreferredSize(new java.awt.Dimension(300, 60)); commentsText.setWrapStyleWord(true); commentsText.setToolTipText(options.getMsg("edit_project_author_comments_tooltip")); commentsText.setLineWrap(true); commentsScroll.setViewportView(commentsText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(commentsScroll, gridBagConstraints); } // GEN-END:initComponents public void setAuthor(Author author) { nameText.setText(author != null ? author.name : ""); mailText.setText(author != null ? author.mail : ""); urlText.setText(author != null ? author.url : ""); organizationText.setText(author != null ? author.organization : ""); commentsText.setText(author != null ? author.comments : ""); rolText.setText(author != null ? author.rol : ""); } public Author getAuthor() { Author author = new Author(); author.name = nameText.getText().trim(); author.mail = StrUtils.nullableString(mailText.getText().trim()); author.url = StrUtils.nullableString(urlText.getText().trim()); author.organization = StrUtils.nullableString(organizationText.getText().trim()); author.comments = StrUtils.nullableString(commentsText.getText().trim()); author.rol = StrUtils.nullableString(rolText.getText().trim()); return author; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextArea commentsText; private javax.swing.JTextField mailText; private javax.swing.JTextField nameText; private javax.swing.JTextField organizationText; private javax.swing.JTextField rolText; private javax.swing.JTextField urlText; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/project/ExportTaskDlg.form000066400000000000000000000132541335566474600230710ustar00rootroot00000000000000
src/author/edu/xtec/jclic/project/ExportTaskDlg.java000066400000000000000000000436161335566474600230540ustar00rootroot00000000000000/* * File : ExportTaskDlg.java * Created : 24-nov-2015 16:37 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.AuthorSettings; import edu.xtec.util.BrowserLauncher; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceBridge; import edu.xtec.util.StrUtils; import edu.xtec.util.StreamIO; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashSet; import java.util.ListIterator; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.swing.JDialog; import javax.swing.JOptionPane; import org.json.JSONObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 24.11.15 */ public class ExportTaskDlg extends javax.swing.JPanel { ResourceBridge rb; Options options; edu.xtec.util.SwingWorker sw; File exportPath; static String indexHtml = "\n" + "\n" + " \n" + " \n" + " %TITLE%\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
\n" + " \n" + ""; static String imsmanifest = "\n" + "\n" + "\n" + " \n" + " ADL SCORM\n" + " 1.2\n" + " \n" + " \n" + " \n" + " %SCORMTITLE%\n" + " \n" + " %SCORMTITLE%\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "%FILETAGS% \n" + " \n" + ""; /** * Creates new ExportTaskDlg * * @param rb */ public ExportTaskDlg(ResourceBridge rb) { this.rb = rb; options = rb.getOptions(); initComponents(); } PrintStream ps = new PrintStream(new ByteArrayOutputStream()) { @Override public synchronized void println(String s) { logArea.append(s + "\n"); logArea.setCaretPosition(logArea.getText().length()); } @Override public synchronized void print(String s) { logArea.append(s); logArea.setCaretPosition(logArea.getText().length()); } }; /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); logArea = new javax.swing.JTextArea(); javax.swing.JPanel bottomPanel = new javax.swing.JPanel(); copyBtn = new javax.swing.JButton(); browserBtn = new javax.swing.JButton(); cancelBtn = new javax.swing.JButton(); setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10)); setLayout(new java.awt.BorderLayout(0, 10)); jScrollPane1.setPreferredSize(new java.awt.Dimension(600, 500)); logArea.setEditable(false); logArea.setLineWrap(true); logArea.setWrapStyleWord(true); jScrollPane1.setViewportView(logArea); add(jScrollPane1, java.awt.BorderLayout.CENTER); bottomPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 10, 5)); copyBtn.setText(options.getMsg("export_project_copyLog")); copyBtn.setEnabled(false); copyBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { copyBtnActionPerformed(evt); } }); bottomPanel.add(copyBtn); browserBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/html_doc.gif"))); // NOI18N browserBtn.setText(options.getMsg("export_project_launchBrowser")); browserBtn.setEnabled(false); browserBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { browserBtnActionPerformed(evt); } }); bottomPanel.add(browserBtn); cancelBtn.setText(options.getMsg("CANCEL")); cancelBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelBtnActionPerformed(evt); } }); bottomPanel.add(cancelBtn); add(bottomPanel, java.awt.BorderLayout.SOUTH); } // //GEN-END:initComponents private void copyBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_copyBtnActionPerformed StringSelection stringSelection = new StringSelection(logArea.getText()); Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard(); clpbrd.setContents(stringSelection, null); } // GEN-LAST:event_copyBtnActionPerformed private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_cancelBtnActionPerformed if (sw != null) { ProjectFileUtils.interrupt = true; } else { JDialog myDlg = (JDialog) javax.swing.SwingUtilities.getAncestorOfClass(JDialog.class, this); if (myDlg != null) { myDlg.dispose(); } } } // GEN-LAST:event_cancelBtnActionPerformed private void browserBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_browserBtnActionPerformed String url = exportPath + "/index.html"; BrowserLauncher.openURL(url); ps.println("File " + url + " opened in web browser."); } // GEN-LAST:event_browserBtnActionPerformed public static void doTask(ResourceBridge rb, AuthorSettings settings, Component parent, final String inputPath, final String outputPath, final String mainFileName, final JClicProject project, final boolean copyAll, final String scormFile) { final Messages msg = rb.getOptions().getMessages(); final ExportTaskDlg exportDlg = new ExportTaskDlg(rb); final AuthorSettings set = settings; JDialog dlg = new JDialog(JOptionPane.getFrameForComponent(parent), true); dlg.setTitle(msg.get("export_project_exporting")); dlg.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); dlg.getContentPane().setLayout(new BorderLayout(10, 10)); dlg.getContentPane().add(exportDlg, BorderLayout.CENTER); dlg.pack(); dlg.setLocationRelativeTo(parent); dlg.setLocation((parent.getWidth() - dlg.getWidth()) / 2, (parent.getHeight() - dlg.getHeight()) / 2); exportDlg.sw = new edu.xtec.util.SwingWorker() { @Override public Object construct() { try { long[] counters = { 0, 0, 0 }; ArrayList fileList = new ArrayList(); fileList.add("imsmanifest.xml"); if (!copyAll) { exportDlg.ps.println("Processing: " + inputPath); ProjectFileUtils.processSingleFile(inputPath, outputPath, fileList, exportDlg.ps, counters); } else { exportDlg.ps.println("Processing all projects in: " + inputPath); ProjectFileUtils.processRootFolder(inputPath, outputPath, fileList, exportDlg.ps, counters); } // Get normalized filenames project.mediaBag.setNormalizedFileNames(); exportDlg.ps.println("Generating file " + outputPath + "/index.html"); FileOutputStream fos = new FileOutputStream(new File(outputPath, "index.html")); PrintWriter pw = new PrintWriter(new OutputStreamWriter(fos, "UTF-8")); String s = indexHtml.replaceAll("%TITLE%", StrUtils.safeHtml(project.settings.title)); s = StrUtils.replace(s, "%MAINFILE%", mainFileName); s = StrUtils.replace(s, "%JSCODEBASE%", set.jsCodeBase); s = StrUtils.replace(s, "%FAVICONICO%", project.settings.icon16 == null ? "favicon.ico" : project.settings.icon16); s = StrUtils.replace(s, "%ICON72PNG%", project.settings.icon72 == null ? "icon-72.png" : project.settings.icon72); s = StrUtils.replace(s, "%ICON192PNG%", project.settings.icon192 == null ? "icon-192.png" : project.settings.icon192); pw.print(s); pw.flush(); counters[ProjectFileUtils.TOTAL_FILESIZE] += fos.getChannel().size(); pw.close(); fileList.add("index.html"); JSONObject json = project.settings.toJSON(msg); json.put("mainFile", mainFileName); exportDlg.exportPath = new File(outputPath); String fn = "favicon.ico"; if (project.settings.icon16 == null) { exportDlg.ps.println("Copying " + fn); fos = new FileOutputStream(new File(outputPath, fn)); counters[ProjectFileUtils.TOTAL_FILESIZE] += StreamIO .writeStreamTo(getClass().getResourceAsStream("/edu/xtec/resources/icons/" + fn), fos); fos.close(); fileList.add(fn); counters[ProjectFileUtils.NUM_MEDIA]++; } if (project.settings.icon192 == null) { fn = "icon-192.png"; exportDlg.ps.println("Copying " + fn); fos = new FileOutputStream(new File(outputPath, fn)); counters[ProjectFileUtils.TOTAL_FILESIZE] += StreamIO .writeStreamTo(getClass().getResourceAsStream("/edu/xtec/resources/icons/" + fn), fos); fos.close(); fileList.add(fn); counters[ProjectFileUtils.NUM_MEDIA]++; } if (project.settings.icon72 == null) { fn = "icon-72.png"; exportDlg.ps.println("Copying " + fn); fos = new FileOutputStream(new File(outputPath, fn)); counters[ProjectFileUtils.TOTAL_FILESIZE] += StreamIO .writeStreamTo(getClass().getResourceAsStream("/edu/xtec/resources/icons/" + fn), fos); fos.close(); fileList.add(fn); counters[ProjectFileUtils.NUM_MEDIA]++; } String cover = project.settings.coverFileName; if (cover == null) { exportDlg.ps.println("Copying project cover model"); cover = "project-cover.jpg"; fos = new FileOutputStream(new File(outputPath, cover)); counters[ProjectFileUtils.TOTAL_FILESIZE] += StreamIO .writeStreamTo(getClass().getResourceAsStream("/edu/xtec/resources/icons/cover-base.jpg"), fos); fos.close(); ; fileList.add(cover); counters[ProjectFileUtils.NUM_MEDIA]++; } else { cover = project.mediaBag.getElement(cover).getFileName(); } json.put("cover", cover); String thumb = project.settings.thumbnailFileName; if (thumb == null) { thumb = "project-thumb.jpg"; exportDlg.ps.println("Copying project thumbnail model"); fos = new FileOutputStream(new File(outputPath, thumb)); counters[ProjectFileUtils.TOTAL_FILESIZE] += StreamIO .writeStreamTo(getClass().getResourceAsStream("/edu/xtec/resources/icons/thumb-base.jpg"), fos); fos.close(); fileList.add(thumb); counters[ProjectFileUtils.NUM_MEDIA]++; } else { thumb = project.mediaBag.getElement(thumb).getFileName(); } json.put("thumbnail", thumb); exportDlg.ps.println("Generating project.json"); fileList.add("project.json"); // Order fileList and remove duplicate values Collections.sort(fileList); fileList = new ArrayList(new LinkedHashSet(fileList)); // Write imsmanifest exportDlg.ps.println("Generating imsmanifest.xml"); fos = new FileOutputStream(new File(outputPath, "imsmanifest.xml")); pw = new PrintWriter(new OutputStreamWriter(fos, "UTF-8")); s = imsmanifest.replaceAll("%SCORMTITLE%", StrUtils.safeHtml(project.settings.title)); s = StrUtils.replace(s, "%SCORMID%", "JClic-" + Integer.toHexString((int) (Math.random() * 0xEFFFFF + 0x100000)).toUpperCase()); StringBuilder sb = new StringBuilder(); ListIterator it = fileList.listIterator(); while (it.hasNext()) { sb.append(" \n"); } s = StrUtils.replace(s, "%FILETAGS%", sb.toString()); pw.print(s); pw.flush(); counters[ProjectFileUtils.TOTAL_FILESIZE] += fos.getChannel().size(); pw.close(); // Save statistics and file list json.put("activities", counters[ProjectFileUtils.NUM_ACTS]); json.put("mediaFiles", counters[ProjectFileUtils.NUM_MEDIA]); json.put("totalSize", counters[ProjectFileUtils.TOTAL_FILESIZE]); json.append("files", fileList); counters[ProjectFileUtils.TOTAL_FILESIZE] += json.toString(2).length(); json.put("totalSize", counters[ProjectFileUtils.TOTAL_FILESIZE]); // Write project.json fos = new FileOutputStream(new File(outputPath, "project.json")); pw = new PrintWriter(new OutputStreamWriter(fos, "UTF-8")); pw.print(json.toString(2)); pw.flush(); pw.close(); if (scormFile != null) { final byte[] BUFFER = new byte[1024]; exportDlg.ps.println("Generating file \"" + scormFile + "\" with all content inside"); ZipOutputStream out = new ZipOutputStream(new FileOutputStream(scormFile)); it = fileList.listIterator(); while (it.hasNext()) { String file = it.next(); FileInputStream in = new FileInputStream(new File(outputPath, file)); ZipEntry entry = new ZipEntry(file); out.putNextEntry(entry); int i; while ((i = in.read(BUFFER)) != -1) { out.write(BUFFER, 0, i); } out.closeEntry(); } out.close(); } exportDlg.ps.println("\n" + msg.get("export_project_finished") + " " + outputPath); exportDlg.ps .println("\n" + msg.get("export_project_numActivities") + " " + counters[ProjectFileUtils.NUM_ACTS]); exportDlg.ps.println(msg.get("export_project_mediaFiles") + " " + counters[ProjectFileUtils.NUM_MEDIA]); exportDlg.ps.println(msg.get("export_project_totalSize") + " " + counters[ProjectFileUtils.TOTAL_FILESIZE]); exportDlg.ps.println("\n" + msg.get("export_project_notice")); if (scormFile != null) { exportDlg.ps.printf("\n" + msg.get("export_project_scorm_notice") + "\n\n", scormFile); } exportDlg.browserBtn.setEnabled(true); } catch (InterruptedException iex) { exportDlg.ps .println("\nWARNING: The process was interrupted! Contents of the output folder might be unsuitable."); } catch (Exception ex) { exportDlg.ps.println("\nERROR processing ZIP file: " + ex.getMessage()); } return null; } @Override public void finished() { exportDlg.cancelBtn.setText(msg.get("OK")); exportDlg.copyBtn.setEnabled(true); exportDlg.sw = null; } }; exportDlg.sw.start(); dlg.setVisible(true); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton browserBtn; private javax.swing.JButton cancelBtn; private javax.swing.JButton copyBtn; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea logArea; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/project/ExportToJSDlg.form000066400000000000000000000342771335566474600230160ustar00rootroot00000000000000
src/author/edu/xtec/jclic/project/ExportToJSDlg.java000066400000000000000000000332371335566474600227670ustar00rootroot00000000000000/* * File : ExportToJSDlg.java * Created : 23-nov-2015 16:37 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceBridge; import edu.xtec.util.StrUtils; import java.awt.Component; import java.io.File; import javax.swing.JFileChooser; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 23.11.15 */ public class ExportToJSDlg extends javax.swing.JPanel { ResourceBridge rb; Options options; String outputFolder; String scormFile; boolean exportAll = true; boolean exportScorm = true; /** Creates new form ExportToJSDlg */ public ExportToJSDlg(ResourceBridge rb) { this.rb = rb; options = rb.getOptions(); initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; exportPanel = new javax.swing.JPanel(); exportLb = new javax.swing.JLabel(); outputFolderLb = new javax.swing.JLabel(); outputFolderText = new javax.swing.JTextField(); outputFolderBtn = new javax.swing.JButton(); javax.swing.JLabel spacer2 = new javax.swing.JLabel(); allPrjChk = new javax.swing.JCheckBox(); spacer = new javax.swing.JLabel(); scormPanel = new javax.swing.JPanel(); exportScormChk = new javax.swing.JCheckBox(); scormFolderLb = new javax.swing.JLabel(); scormFileText = new javax.swing.JTextField(); scormFileBtn = new javax.swing.JButton(); javax.swing.JLabel spacer3 = new javax.swing.JLabel(); setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10)); setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS)); exportPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("HTML5")); exportPanel.setLayout(new java.awt.GridBagLayout()); exportLb.setText(options.getMsg("export_project_desc")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); exportPanel.add(exportLb, gridBagConstraints); outputFolderLb.setLabelFor(outputFolderText); outputFolderLb.setText(options.getMsg("export_project_output_folder")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); exportPanel.add(outputFolderLb, gridBagConstraints); outputFolderText.setToolTipText(options.getMsg("edit_new_project_folder_tooltip")); outputFolderText.setMinimumSize(new java.awt.Dimension(320, 21)); outputFolderText.setPreferredSize(new java.awt.Dimension(320, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); exportPanel.add(outputFolderText, gridBagConstraints); outputFolderBtn.setText(options.getMsg("edit_new_project_folder_browse")); outputFolderBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { outputFolderBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); exportPanel.add(outputFolderBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.weightx = 1.0; exportPanel.add(spacer2, gridBagConstraints); allPrjChk.setText(options.getMsg("export_project_includeAll")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; exportPanel.add(allPrjChk, gridBagConstraints); add(exportPanel); spacer.setPreferredSize(new java.awt.Dimension(25, 25)); add(spacer); scormPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("SCORM")); scormPanel.setLayout(new java.awt.GridBagLayout()); exportScormChk.setText(options.getMsg("export_project_exportSCORM")); exportScormChk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { scormSelChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; scormPanel.add(exportScormChk, gridBagConstraints); scormFolderLb.setLabelFor(scormFileText); scormFolderLb.setText(options.getMsg("export_project_scorm_file")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); scormPanel.add(scormFolderLb, gridBagConstraints); scormFileText.setToolTipText(options.getMsg("export_project_scorm_file_tooltip")); scormFileText.setMinimumSize(new java.awt.Dimension(320, 21)); scormFileText.setPreferredSize(new java.awt.Dimension(320, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); scormPanel.add(scormFileText, gridBagConstraints); scormFileBtn.setText(options.getMsg("export_project_scorm_file_browse")); scormFileBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { scormFileBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); scormPanel.add(scormFileBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.weightx = 1.0; scormPanel.add(spacer3, gridBagConstraints); add(scormPanel); } // //GEN-END:initComponents private JFileChooser chooser; private JFileChooser scormFileChooser; private void outputFolderBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_outputFolderBtnActionPerformed if (chooser == null) { chooser = new JFileChooser(); chooser.setApproveButtonText(options.getMsg("export_project_selectFolder")); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } outputFolder = StrUtils.nullableString(outputFolderText.getText()); if (outputFolder != null) { try { File f = new File(outputFolder); if (!f.exists()) { f.mkdirs(); } chooser.setSelectedFile(f); } catch (Exception ex) { // Unable to create folders. By now, do nothing } } if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { outputFolder = chooser.getSelectedFile().getAbsolutePath(); outputFolderText.setText(outputFolder); } } // GEN-LAST:event_outputFolderBtnActionPerformed private void scormFileBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_scormFileBtnActionPerformed if (scormFileChooser == null) { scormFileChooser = new JFileChooser(); scormFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); } scormFile = StrUtils.nullableString(scormFileText.getText()); if (scormFile != null) { try { File f = new File(scormFile); if (!f.getParentFile().exists()) { f.getParentFile().mkdirs(); } scormFileChooser.setSelectedFile(f); } catch (Exception ex) { // Unable to create folders. By now, do nothing } } if (scormFileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { scormFile = scormFileChooser.getSelectedFile().getAbsolutePath(); scormFileText.setText(scormFile); } } // GEN-LAST:event_scormFileBtnActionPerformed private void scormSelChanged(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_scormSelChanged scormFileBtn.setEnabled(exportScormChk.isSelected()); scormFolderLb.setEnabled(exportScormChk.isSelected()); } // GEN-LAST:event_scormSelChanged public void fillData() { outputFolderText.setText(outputFolder == null ? "" : outputFolder); scormFileText.setText(scormFile == null ? "" : scormFile); allPrjChk.setSelected(exportAll); exportScormChk.setSelected(exportScorm); } public void getData() { outputFolder = StrUtils.nullableString(outputFolderText.getText()); exportAll = allPrjChk.isSelected(); exportScorm = exportScormChk.isSelected(); scormFile = StrUtils.nullableString(scormFileText.getText()); } public static String[] prompt(ResourceBridge rb, Component parent, String inputPath, String exportBasePath, String scormBasePath) { String[] result = null; ExportToJSDlg exportDlg = new ExportToJSDlg(rb); Messages msg = rb.getOptions().getMessages(); File inputFile = new File(inputPath); String inputBase = inputFile.getName(); exportDlg.exportAll = !inputBase.toLowerCase().equals("projects"); exportDlg.outputFolder = (new File(new File(exportBasePath), inputBase)).getPath(); exportDlg.scormFile = (new File(new File(scormBasePath), inputBase + ".scorm.zip")).getPath(); exportDlg.fillData(); while (result == null) { if (!msg.showInputDlg(parent, exportDlg, "export_project_title")) { break; } exportDlg.getData(); if (exportDlg.outputFolder == null) { msg.showErrorWarning(parent, "export_project_err_empty", null); } else { try { boolean folderOk = true; boolean scormOk = true; File outputFolderFile = new File(exportDlg.outputFolder); if (exportDlg.outputFolder.equals(inputPath)) { msg.showErrorWarning(parent, "export_project_err_sameFolder", null); folderOk = false; } else if (exportDlg.outputFolder.startsWith(inputPath)) { msg.showErrorWarning(parent, "export_project_err_nestedFolders", null); folderOk = false; } else if (outputFolderFile.exists() && outputFolderFile.isDirectory()) { if (outputFolderFile.list().length > 0) { folderOk = msg.showQuestionDlg(parent, "export_project_warning_noEmptyFolder", null, "yn") == Messages.YES; } } else if (!outputFolderFile.mkdirs()) { msg.showErrorWarning(parent, "edit_new_project_err_folderCreation", null); folderOk = false; } if (folderOk && exportDlg.exportScorm) { if (exportDlg.scormFile == null) { msg.showErrorWarning(parent, "export_project_scorm_file_err_empty", null); scormOk = false; } else { File scormFile = new File(exportDlg.scormFile); if (scormFile.exists()) { scormOk = msg.showQuestionDlg(parent, "export_project_scorm_file_exists", null, "yn") == Messages.YES; } else if (!scormFile.getParentFile().exists() && !scormFile.getParentFile().mkdirs()) { msg.showErrorWarning(parent, "edit_new_project_err_folderCreation", null); scormOk = false; } } } if (folderOk && scormOk) { result = new String[] { exportDlg.outputFolder, inputPath, exportDlg.exportAll ? "true" : "false", exportDlg.exportScorm ? exportDlg.scormFile : null }; } } catch (Exception ex) { msg.showErrorWarning(parent, "ERROR", ex); } } } return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox allPrjChk; private javax.swing.JLabel exportLb; private javax.swing.JPanel exportPanel; private javax.swing.JCheckBox exportScormChk; private javax.swing.JButton outputFolderBtn; private javax.swing.JLabel outputFolderLb; private javax.swing.JTextField outputFolderText; private javax.swing.JButton scormFileBtn; private javax.swing.JTextField scormFileText; private javax.swing.JLabel scormFolderLb; private javax.swing.JPanel scormPanel; private javax.swing.JLabel spacer; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/project/JClicProjectEditor.java000066400000000000000000000076031335566474600237770ustar00rootroot00000000000000/* * File : JClicProjctEditor.java * Created : 27-sep-2002 15:52 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.TestPlayerContainer; import edu.xtec.jclic.bags.ActivityBagEditor; import edu.xtec.jclic.bags.ActivitySequenceEditor; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Component; import javax.swing.Icon; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class JClicProjectEditor extends Editor { protected static ImageIcon icon; ActivityBagEditor abe; ActivitySequenceEditor ase; MediaBagEditor mbe; ProjectSettingsEditor pse; TestPlayerContainer testPlayerContainer; /** Creates a new instance of JClicProjectEditor */ public JClicProjectEditor(JClicProject project) { super(project); } protected void createChildren() { JClicProject jcp = getProject(); jcp.mediaBag.addListener(jcp.activityBag); abe = (ActivityBagEditor) jcp.activityBag.getEditor(this); ase = (ActivitySequenceEditor) jcp.activitySequence.getEditor(this); mbe = (MediaBagEditor) jcp.mediaBag.getEditor(this); pse = (ProjectSettingsEditor) jcp.settings.getEditor(this); } public EditorPanel createEditorPanel(Options options) { // todo: create editor panel return null; } public Class getEditorPanelClass() { // todo: create panel class return null; } public JClicProject getProject() { return (JClicProject) getFirstObject(JClicProject.class); } public ActivityBagEditor getActivityBagEditor() { return abe; } public ActivitySequenceEditor getActivitySequenceEditor() { return ase; } public MediaBagEditor getMediaBagEditor() { return mbe; } public ProjectSettingsEditor getProjectSettingsEditor() { return pse; } public void setTestPlayerContainer(TestPlayerContainer tpc) { testPlayerContainer = tpc; } public TestPlayerContainer getTestPlayerContainer() { return testPlayerContainer; } public boolean nameChanged(int type, String oldName, String newName) { boolean result = getActivityBagEditor().nameChanged(type, oldName, newName) | getActivitySequenceEditor().nameChanged(type, oldName, newName) | getMediaBagEditor().nameChanged(type, oldName, newName); return result; } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/project_settings.gif"); return icon; } public void saveProject(String fileName) throws Exception { collectData(); getProject().setName(fileName); getProject().saveProject(fileName); setModified(false); } public boolean checkProject(Options options, Component parent, boolean prompt) { collectData(); return getActivityBagEditor().checkOrphanElements(options, parent, prompt) != Messages.CANCEL && getMediaBagEditor().checkOrphanElements(options, parent, prompt) != Messages.CANCEL; } } src/author/edu/xtec/jclic/project/NewProjectDlg.form000066400000000000000000000241571335566474600230510ustar00rootroot00000000000000
src/author/edu/xtec/jclic/project/NewProjectDlg.java000066400000000000000000000242021335566474600230160ustar00rootroot00000000000000/* * File : NewProjectDlg.java * Created : 08-jul-2004 14:32 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceBridge; import edu.xtec.util.SimpleFileFilter; import edu.xtec.util.StrUtils; import java.awt.Component; import java.io.File; import java.io.FilenameFilter; import javax.swing.JFileChooser; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class NewProjectDlg extends javax.swing.JPanel { ResourceBridge rb; Options options; public String name; public String fileName; public String folder; String baseFolder; /** Creates new form NewProjectDlg */ public NewProjectDlg(ResourceBridge rb, String baseFolder) { this.rb = rb; options = rb.getOptions(); this.baseFolder = baseFolder.replace('/', File.separatorChar); folder = baseFolder; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; nameLb = new javax.swing.JLabel(); nameText = new javax.swing.JTextField(); nameText.getDocument().addDocumentListener(dl); spacer = new javax.swing.JLabel(); fileNameLb = new javax.swing.JLabel(); fileNameText = new javax.swing.JTextField(); fileNameText.getDocument().addDocumentListener(dl); extLb = new javax.swing.JLabel(); folderLb = new javax.swing.JLabel(); folderText = new javax.swing.JTextField(); folderBtn = new javax.swing.JButton(); setLayout(new java.awt.GridBagLayout()); nameLb.setLabelFor(nameText); nameLb.setText(options.getMsg("edit_new_project_name")); nameLb.setToolTipText(options.getMsg("edit_new_project_name_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(nameLb, gridBagConstraints); nameText.setToolTipText(options.getMsg("edit_new_project_name_tooltip")); nameText.setPreferredSize(new java.awt.Dimension(100, 20)); nameText.setMinimumSize(new java.awt.Dimension(100, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 1); add(nameText, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; add(spacer, gridBagConstraints); fileNameLb.setText(options.getMsg("edit_new_project_filename")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(fileNameLb, gridBagConstraints); fileNameText.setToolTipText(options.getMsg("edit_new_project_filename_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 1); add(fileNameText, gridBagConstraints); extLb.setText(Utils.EXT_JCLIC_ZIP); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 1, 4, 4); add(extLb, gridBagConstraints); folderLb.setLabelFor(folderText); folderLb.setText(options.getMsg("edit_new_project_folder")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(folderLb, gridBagConstraints); folderText.setToolTipText(options.getMsg("edit_new_project_folder_tooltip")); folderText.setPreferredSize(new java.awt.Dimension(280, 21)); folderText.setMinimumSize(new java.awt.Dimension(280, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(folderText, gridBagConstraints); folderBtn.setText(options.getMsg("edit_new_project_folder_browse")); folderBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { folderBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); add(folderBtn, gridBagConstraints); } // //GEN-END:initComponents private JFileChooser chooser; private void folderBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_folderBtnActionPerformed if (chooser == null) { chooser = new JFileChooser(baseFolder); chooser.setDialogType(JFileChooser.DIRECTORIES_ONLY); } if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { baseFolder = chooser.getCurrentDirectory().getAbsolutePath(); folderText.setText(baseFolder); } } // GEN-LAST:event_folderBtnActionPerformed public void fillData() { nameText.setText(name == null ? "" : name); fileNameText.setText(fileName == null ? "" : fileName); folderText.setText(folder == null ? "" : folder); } public void getData() { name = StrUtils.nullableString(nameText.getText()); fileName = StrUtils.nullableString(fileNameText.getText()); folder = StrUtils.nullableString(folderText.getText()); } DocumentListener dl = new DocumentListener() { public void changedUpdate(DocumentEvent e) { changeName(e); } public void insertUpdate(DocumentEvent e) { changeName(e); } public void removeUpdate(DocumentEvent e) { changeName(e); } protected void changeName(DocumentEvent e) { String s; boolean fromName = false; if (nameText.getDocument() == e.getDocument()) { s = nameText.getText(); fromName = true; } else s = fileNameText.getText(); s = FileSystem.getValidFileName(s.trim()); if (fromName) fileNameText.setText(s); if (s.length() > 0) { StringBuilder sb = new StringBuilder(baseFolder); if (!baseFolder.endsWith(File.separator)) sb.append(File.separatorChar); sb.append(s); folderText.setText(sb.substring(0)); } } }; public static JClicProject prompt(ResourceBridge rb, Component parent, FileSystem baseFS) { JClicProject result = null; NewProjectDlg prjDlg = new NewProjectDlg(rb, baseFS.root); Messages msg = rb.getOptions().getMessages(); prjDlg.fillData(); while (result == null) { if (!msg.showInputDlg(parent, prjDlg, "edit_new_project_title")) break; prjDlg.getData(); if (prjDlg.name == null || prjDlg.fileName == null || prjDlg.folder == null) { msg.showErrorWarning(parent, "edit_new_project_err_empty", null); } else { try { boolean folderOk = true; File folderFile = new File(prjDlg.folder); if (folderFile.exists() && folderFile.isDirectory()) { FilenameFilter ff = ((SimpleFileFilter) Utils.getFileFilter(Utils.ALL_JCLIC_CLIC_FF, msg)) .getFilenameFilter(); if (folderFile.list(ff).length > 0) { folderOk = msg.showQuestionDlg(parent, "edit_new_project_warning_noEmptyFolder", null, "yn") == Messages.YES; } } else { if (!folderFile.mkdirs()) { msg.showErrorWarning(parent, "edit_new_project_err_folderCreation", null); folderOk = false; } } if (folderOk) { File projectFile = new File(folderFile, prjDlg.fileName + Utils.EXT_JCLIC_ZIP); if (msg.confirmOverwriteFile(parent, projectFile, "yn") == Messages.YES) { result = new JClicProject(rb, new FileSystem(folderFile.getAbsolutePath(), rb), projectFile.getAbsolutePath()); result.settings.title = prjDlg.name; result.setName(prjDlg.fileName); result.saveProject(projectFile.getAbsolutePath()); } } } catch (Exception ex) { msg.showErrorWarning(parent, "ERROR", ex); } } } return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel extLb; private javax.swing.JLabel fileNameLb; private javax.swing.JTextField fileNameText; private javax.swing.JButton folderBtn; private javax.swing.JLabel folderLb; private javax.swing.JTextField folderText; private javax.swing.JLabel nameLb; private javax.swing.JTextField nameText; private javax.swing.JLabel spacer; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/project/OrganizationEditPanel.form000066400000000000000000000533761335566474600246010ustar00rootroot00000000000000
src/author/edu/xtec/jclic/project/OrganizationEditPanel.java000066400000000000000000000275571335566474600245610ustar00rootroot00000000000000/* * File : OrganizationEditPanel.java * Created : 27-feb-2004 17:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class OrganizationEditPanel extends javax.swing.JPanel { Options options; /** Creates new form AuthorEditPanel */ public OrganizationEditPanel(Options options) { this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel addressLb; javax.swing.JLabel cityLb; javax.swing.JLabel commentsLb; javax.swing.JScrollPane commentsScroll; javax.swing.JLabel countryLb; java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel mailLb; javax.swing.JLabel nameLb; javax.swing.JLabel pcLb; javax.swing.JLabel stateLb; javax.swing.JLabel urlLb; nameLb = new javax.swing.JLabel(); nameText = new javax.swing.JTextField(); mailLb = new javax.swing.JLabel(); mailText = new javax.swing.JTextField(); urlLb = new javax.swing.JLabel(); urlText = new javax.swing.JTextField(); addressLb = new javax.swing.JLabel(); addressText = new javax.swing.JTextField(); pcLb = new javax.swing.JLabel(); pcText = new javax.swing.JTextField(); cityLb = new javax.swing.JLabel(); cityText = new javax.swing.JTextField(); stateLb = new javax.swing.JLabel(); stateText = new javax.swing.JTextField(); countryLb = new javax.swing.JLabel(); countryText = new javax.swing.JTextField(); commentsLb = new javax.swing.JLabel(); commentsScroll = new javax.swing.JScrollPane(); commentsText = new javax.swing.JTextArea(); setLayout(new java.awt.GridBagLayout()); nameLb.setLabelFor(nameText); nameLb.setText(options.getMsg("edit_project_org_name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(nameLb, gridBagConstraints); nameText.setToolTipText(options.getMsg("edit_project_org_name_tooltip")); nameText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(nameText, gridBagConstraints); mailLb.setLabelFor(mailText); mailLb.setText(options.getMsg("edit_project_org_mail")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(mailLb, gridBagConstraints); mailText.setToolTipText(options.getMsg("edit_project_org_mail_tooltip")); mailText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(mailText, gridBagConstraints); urlLb.setLabelFor(urlText); urlLb.setText(options.getMsg("edit_project_org_url")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(urlLb, gridBagConstraints); urlText.setToolTipText(options.getMsg("edit_project_org_url_tooltip")); urlText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(urlText, gridBagConstraints); addressLb.setLabelFor(addressText); addressLb.setText(options.getMsg("edit_project_org_address")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(addressLb, gridBagConstraints); addressText.setToolTipText(options.getMsg("edit_project_org_address_tooltip")); addressText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(addressText, gridBagConstraints); pcLb.setLabelFor(pcText); pcLb.setText(options.getMsg("edit_project_org_pc")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(pcLb, gridBagConstraints); pcText.setToolTipText(options.getMsg("edit_project_org_pc_tooltip")); pcText.setPreferredSize(new java.awt.Dimension(100, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(pcText, gridBagConstraints); cityLb.setLabelFor(cityText); cityLb.setText(options.getMsg("edit_project_org_city")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(cityLb, gridBagConstraints); cityText.setToolTipText(options.getMsg("edit_project_org_city_tooltip")); cityText.setPreferredSize(new java.awt.Dimension(100, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(cityText, gridBagConstraints); stateLb.setLabelFor(stateText); stateLb.setText(options.getMsg("edit_project_org_state")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(stateLb, gridBagConstraints); stateText.setToolTipText(options.getMsg("edit_project_org_state_tooltip")); stateText.setPreferredSize(new java.awt.Dimension(100, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(stateText, gridBagConstraints); countryLb.setLabelFor(countryText); countryLb.setText(options.getMsg("edit_project_org_country")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(countryLb, gridBagConstraints); countryText.setToolTipText(options.getMsg("edit_project_org_country_tooltip")); countryText.setPreferredSize(new java.awt.Dimension(100, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(countryText, gridBagConstraints); commentsLb.setLabelFor(commentsText); commentsLb.setText(options.getMsg("edit_project_org_comments")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; add(commentsLb, gridBagConstraints); commentsScroll.setPreferredSize(new java.awt.Dimension(300, 60)); commentsText.setLineWrap(true); commentsText.setToolTipText(options.getMsg("edit_project_org_comments_tooltip")); commentsText.setWrapStyleWord(true); commentsScroll.setViewportView(commentsText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; add(commentsScroll, gridBagConstraints); } // GEN-END:initComponents public void setOrganization(Organization org) { nameText.setText(org != null ? org.name : ""); mailText.setText(org != null ? org.mail : ""); urlText.setText(org != null ? org.url : ""); addressText.setText(org != null ? org.address : ""); pcText.setText(org != null ? org.pc : ""); cityText.setText(org != null ? org.city : ""); countryText.setText(org != null ? org.country : ""); stateText.setText(org != null ? org.state : ""); commentsText.setText(org != null ? org.comments : ""); } public Organization getOrganization() { Organization org = new Organization(); org.name = nameText.getText().trim(); org.mail = StrUtils.nullableString(mailText.getText().trim()); org.url = StrUtils.nullableString(urlText.getText().trim()); org.address = StrUtils.nullableString(addressText.getText().trim()); org.pc = StrUtils.nullableString(pcText.getText().trim()); org.city = StrUtils.nullableString(cityText.getText().trim()); org.country = StrUtils.nullableString(countryText.getText().trim()); org.state = StrUtils.nullableString(stateText.getText().trim()); org.comments = StrUtils.nullableString(commentsText.getText().trim()); return org; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField addressText; private javax.swing.JTextField cityText; private javax.swing.JTextArea commentsText; private javax.swing.JTextField countryText; private javax.swing.JTextField mailText; private javax.swing.JTextField nameText; private javax.swing.JTextField pcText; private javax.swing.JTextField stateText; private javax.swing.JTextField urlText; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/project/ProjectFileUtils.java000066400000000000000000000407271335566474600235500ustar00rootroot00000000000000/* * File : ProjectFileUtils.java * Created : 10-aug-2015 09:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.bags.ActivityBagElement; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.bags.JumpInfo; import edu.xtec.jclic.bags.MediaBagElement; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.fileSystem.FileZip; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.JDomUtility; import edu.xtec.util.ResourceBridge; import edu.xtec.util.StreamIO; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import org.json.JSONObject; /** * Miscellaneous utilities to process ".jclic", ".jclic.zip" and ".scorm.zip" * files, normalizing media file names, avoiding links to other "zip" files and * extracting contents to a given folder. * * @author fbusquet */ public class ProjectFileUtils implements ResourceBridge { FileSystem fileSystem; String fullFilePath; String projectName; String jclicFileName; String plainProjectName; String basePath; String relativePath; JClicProject project; public boolean isScorm; // Interruption flag public static boolean interrupt = false; // Offsets in "counters" array public static int NUM_ACTS = 0, NUM_MEDIA = 1, TOTAL_FILESIZE = 2; /** * Builds a ProjectFileUtils object, initializing a @link{JClicProject} * * @param fileName - Relative or absolute path to the ".jclic" or ".jclic.zip" * file to be processed * @param basePath - Base path of this project. Relative paths are based on this * one. When null, the parent folder of fileName will be used. * @throws Exception */ public ProjectFileUtils(String fileName, String basePath) throws Exception { fullFilePath = new File(fileName).getCanonicalPath(); isScorm = fullFilePath.endsWith(Utils.EXT_SCORM_ZIP); boolean isZip = isScorm || fullFilePath.endsWith(Utils.EXT_JCLIC_ZIP); if (!isZip && !fullFilePath.endsWith(".jclic")) { throw new Exception("File " + fileName + " is not a JClic project file!"); } File fullFilePathFile = new File(fullFilePath); String fileBase = fullFilePathFile.getParent(); this.basePath = (basePath == null ? fileBase : basePath); relativePath = this.basePath.equals(fileBase) ? "" : fileBase.substring(this.basePath.length() + 1); fileSystem = FileSystem.createFileSystem(fullFilePath, this); String file = fullFilePathFile.getName(); JSONObject json = null; if (isZip && !isScorm) { file = ((FileZip) fileSystem).getZipName(); jclicFileName = file.substring(0, file.lastIndexOf(".")); String[] projects = ((FileZip) fileSystem).getEntries(".jclic"); if (projects == null) { throw new Exception("File " + fullFilePath + " does not contain any jclic project"); } projectName = projects[0]; } else if (isScorm) { if (fileSystem.fileExists("project.json")) { json = new JSONObject(new String(fileSystem.getBytes("project.json"))); projectName = json.optString("mainFile", null); jclicFileName = projectName; } if (projectName == null) { throw new Exception("Invalid JClic SCORM file: " + fullFilePath); } } else { jclicFileName = projectName = file; } plainProjectName = FileSystem.getValidFileName(projectName.substring(0, projectName.lastIndexOf("."))); org.jdom.Document doc = fileSystem.getXMLDocument(projectName); project = JClicProject.getJClicProject(doc.getRootElement(), this, fileSystem, file); if (json != null) { project.readJSON(json, false); } } /** * Normalizes the file names of the media bag, restricting it to URL-safe * characters. * * @param ps - The @link{PrintStream} where progress messages will be * outputed. Can be null. * @param fileList - The list of currently exported files, used to avoid * duplicates * @throws java.lang.InterruptedException */ public void normalizeFileNames(PrintStream ps, Collection fileList) throws InterruptedException { HashSet currentNames = new HashSet(); Iterator it = project.mediaBag.getElements().iterator(); while (it.hasNext()) { boolean renamed = false; if (interrupt) { interrupt = false; throw new InterruptedException(); } MediaBagElement mbe = it.next(); String fn = mbe.getFileName(); mbe.setMetaData(fn); String fnv = FileSystem.getValidFileName(fn); // Avoid filenames starting with a dot if (fnv.charAt(0) == '.') { fnv = "_" + fnv; } if (!fnv.equals(fn)) { String fn0 = fnv; int n = 0; while (currentNames.contains(fnv)) { fnv = Integer.toString(n++) + fn0; } renamed = true; } // Avoid duplicate filenames if (fileList != null && fileList.contains(getRelativeFn(fnv))) { int p = fnv.lastIndexOf("."); fnv = fnv.substring(0, p) + "-" + plainProjectName + fnv.substring(p); renamed = true; } if (renamed && ps != null) { mbe.setFileName(fnv); ps.println("Renaming \"" + fn + "\" as \"" + fnv + "\""); } currentNames.add(fnv); } } /** * Searchs for links to ".jclic.zip" files in @link{ActiveBox} and * * @link{JumpInfo} objects, and redirects it to ".jclic" files * @param ps - The @link{PrintStream} where progress messages will be outputed. * Can be null. * @throws java.lang.InterruptedException */ public void avoidZipLinks(PrintStream ps) throws InterruptedException { // Scan Activity elements for (ActivityBagElement ab : project.activityBag.getElements()) { if (interrupt) { interrupt = false; throw new InterruptedException(); } avoidZipLinksInElement(ab.getData(), ps); } for (ActivitySequenceElement ase : project.activitySequence.getElements()) { if (interrupt) { interrupt = false; throw new InterruptedException(); } if (ase.fwdJump != null) { avoidZipLinksInJumpInfo(ase.fwdJump, ps); avoidZipLinksInJumpInfo(ase.fwdJump.upperJump, ps); avoidZipLinksInJumpInfo(ase.fwdJump.lowerJump, ps); } if (ase.backJump != null) { avoidZipLinksInJumpInfo(ase.backJump, ps); avoidZipLinksInJumpInfo(ase.backJump.upperJump, ps); avoidZipLinksInJumpInfo(ase.backJump.lowerJump, ps); } } } /** * Searchs for ".jclic.zip" links in JumpInfo elements, changing it to links to * plain ".jclic" files. * * @param ji - The JumpInfo to scan for links * @param ps - The @link{PrintStream} where progress messages will be outputed. * Can be null. * @throws java.lang.InterruptedException */ public void avoidZipLinksInJumpInfo(JumpInfo ji, PrintStream ps) throws InterruptedException { if (ji != null && ji.projectPath != null && ji.projectPath.endsWith(Utils.EXT_JCLIC_ZIP)) { String p = ji.projectPath; String pv = p.substring(0, p.length() - 4); ji.projectPath = pv; if (ps != null) { ps.println("Changing sequence link from \"" + p + "\" to \"" + pv + "\""); } } } /** * Searchs for links to ".jclic.zip" files in the given JDOM element. This * method makes recursive calls on all the child elements of the provided * starting point. * * @param el - The org.jdom.Element to scan for links * @param ps - The @link{PrintStream} where progress messages will be outputed. * Can be null. * @throws java.lang.InterruptedException */ public void avoidZipLinksInElement(org.jdom.Element el, PrintStream ps) throws InterruptedException { if (el.getAttribute("params") != null || (el.getName().equals("menuElement") && el.getAttribute("path") != null)) { String attr = el.getName().equals("menuElement") ? "path" : "params"; String p = el.getAttributeValue(attr); if (p != null && p.endsWith(Utils.EXT_JCLIC_ZIP)) { String pv = p.substring(0, p.length() - 4); if (ps != null) { ps.println("Changing media link from \"" + p + "\" to \"" + pv + "\""); } el.setAttribute(attr, pv); } } Iterator it = el.getChildren().iterator(); while (it.hasNext()) { if (interrupt) { interrupt = false; throw new InterruptedException(); } avoidZipLinksInElement((org.jdom.Element) it.next(), ps); } } public String getRelativeFn(String fName) { return relativePath.length() > 0 ? relativePath + '/' + fName : fName; } /** * Saves the JClic project and all its contents in plain format (not zipped) * into the specified path * * @param path - The path where the project will be saved * @param fileList - Dynamic list containing relative paths of all exported * files * @param ps - The @link{PrintStream} where progress messages will be * outputed. Can be null. * @throws Exception * @throws java.lang.InterruptedException */ public void saveTo(String path, Collection fileList, PrintStream ps, long[] counters) throws Exception, InterruptedException { counters[NUM_ACTS] += project.activityBag.size(); counters[NUM_MEDIA] += project.mediaBag.getElements().size(); File outPath = new File(path); path = outPath.getCanonicalPath(); // Check outPath exists and is writtable if (!outPath.exists()) { outPath.mkdirs(); } if (!outPath.isDirectory() || !outPath.canWrite()) { throw new Exception("Unable to write to: \"" + path + "\""); } // Export media fileList Iterator it = project.mediaBag.getElements().iterator(); while (it.hasNext()) { if (interrupt) { interrupt = false; throw new InterruptedException(); } MediaBagElement mbe = it.next(); String fn = mbe.getMetaData(); if (fn == null) { fn = mbe.getFileName(); } InputStream is = fileSystem.getInputStream(fn); File outFile = new File(outPath, mbe.getFileName()); FileOutputStream fos = new FileOutputStream(outFile); if (ps != null) { ps.println("Extracting " + fn + " to " + outFile.getCanonicalPath()); } counters[TOTAL_FILESIZE] += StreamIO.writeStreamTo(is, fos); if (fileList != null) { fileList.add(getRelativeFn(outFile.getName())); } } // Save ".jclic" file org.jdom.Document doc = project.getDocument(); File outFile = new File(outPath, jclicFileName); FileOutputStream fos = new FileOutputStream(outFile); if (ps != null) { ps.println("Saving project to: " + outFile.getCanonicalPath()); } JDomUtility.saveDocument(fos, doc); counters[TOTAL_FILESIZE] += fos.getChannel().size(); fos.close(); // Save ".jclic.js" file String jsFileName = jclicFileName + ".js"; outFile = new File(outPath, jsFileName); fos = new FileOutputStream(outFile); PrintWriter pw = new PrintWriter(new OutputStreamWriter(fos, "UTF-8")); if (ps != null) { ps.println("Saving project to: " + outFile.getCanonicalPath()); } org.jdom.output.XMLOutputter xmlOutputter = new org.jdom.output.XMLOutputter(); ByteArrayOutputStream bas = new ByteArrayOutputStream(); xmlOutputter.output(doc, bas); JSONObject json = new JSONObject(); json.put("xml", bas.toString("UTF-8")); String sequence = json.toString(); sequence = sequence.substring(8, sequence.length() - 2); pw.println( "if(JClicObject){JClicObject.projectFiles[\"" + getRelativeFn(jclicFileName) + "\"]=\"" + sequence + "\";}"); pw.flush(); counters[TOTAL_FILESIZE] += fos.getChannel().size(); pw.close(); if (fileList != null) { fileList.add(getRelativeFn(jclicFileName)); fileList.add(getRelativeFn(jsFileName)); } if (ps != null) { ps.println("Done processing: " + fullFilePath); } } public static void processSingleFile(String sourceFile, String destPath, Collection fileList, PrintStream ps, long[] counters) throws Exception, InterruptedException { processSingleFile(sourceFile, destPath, null, fileList, ps, counters); } public static void processSingleFile(String sourceFile, String destPath, String basePath, Collection fileList, PrintStream ps, long[] counters) throws Exception, InterruptedException { ProjectFileUtils prjFU = new ProjectFileUtils(sourceFile, basePath); prjFU.normalizeFileNames(ps, fileList); prjFU.avoidZipLinks(ps); prjFU.saveTo(destPath, fileList, ps, counters); } public static void processRootFolder(String sourcePath, String destPath, Collection fileList, PrintStream ps, long[] counters) throws Exception, InterruptedException { String basePath = (new File(sourcePath)).getCanonicalPath(); processFolder(sourcePath, destPath, basePath, fileList, ps, counters); } public static void processFolder(String sourcePath, String destPath, String basePath, Collection fileList, PrintStream ps, long[] counters) throws Exception, InterruptedException { File src = new File(sourcePath); Collection thisFolderList = (fileList == null ? new ArrayList() : fileList); if (!src.isDirectory() || !src.canRead()) { throw new Exception("Source directory \"" + sourcePath + "\" does not exist, not a directory or not readable"); } if (ps != null) { ps.println("Writting all jclic.zip files in \"" + src.getCanonicalPath() + "\" to \"" + destPath + "\""); } File dest = new File(destPath); File[] jclicFiles = src.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { String lowerName = name.toLowerCase(); return lowerName.endsWith(Utils.EXT_JCLIC_ZIP) || lowerName.endsWith(Utils.EXT_SCORM_ZIP) || lowerName.endsWith(Utils.EXT_JCLIC); } }); for (File f : jclicFiles) { if (interrupt) { interrupt = false; throw new InterruptedException(); } if (ps != null) { ps.println("\nProcessing file: " + f.getAbsolutePath()); } processSingleFile(f.getAbsolutePath(), dest.getAbsolutePath(), basePath, thisFolderList, ps, counters); } // Force garbage collection jclicFiles = null; System.gc(); // Process subdirectories File[] subDirs = src.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return new File(dir, name).isDirectory(); } }); for (File f : subDirs) { if (interrupt) { interrupt = false; throw new InterruptedException(); } ProjectFileUtils.processFolder(new File(src, f.getName()).getCanonicalPath(), new File(dest, f.getName()).getCanonicalPath(), basePath, fileList, ps, counters); } // Force garbage collection subDirs = null; System.gc(); } // Void implementation of "ResourceBridge" methods: @Override public java.io.InputStream getProgressInputStream(java.io.InputStream is, int expectedLength, String name) { return is; } @Override public edu.xtec.util.Options getOptions() { return null; } @Override public String getMsg(String key) { return key; } @Override public javax.swing.JComponent getComponent() { return null; } @Override public void displayUrl(String url, boolean inFrame) { throw new UnsupportedOperationException("Not supported"); } } src/author/edu/xtec/jclic/project/ProjectInstallerEditPanel.form000066400000000000000000000621651335566474600254150ustar00rootroot00000000000000
src/author/edu/xtec/jclic/project/ProjectInstallerEditPanel.java000066400000000000000000000456721335566474600253770ustar00rootroot00000000000000/* * File : ProjectInstallerEditPanel.java * Created : 02-sep-2004 12:08 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.JDomUtility; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.JList; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class ProjectInstallerEditPanel extends javax.swing.JPanel implements ListSelectionListener, ActionListener { Options options; DefaultListModel availModel, filesModel; /** Creates new form ProjectInstallerEditPanel */ public ProjectInstallerEditPanel(Options options) { this.options = options; availModel = new DefaultListModel(); filesModel = new DefaultListModel(); initComponents(); availFiles.addListSelectionListener(this); includedFiles.addListSelectionListener(this); addBtn.addActionListener(this); removeBtn.addActionListener(this); checkButtons(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel titleLb = new javax.swing.JLabel(); titleFld = new javax.swing.JTextField(); javax.swing.JLabel authLb = new javax.swing.JLabel(); authFld = new javax.swing.JTextField(); javax.swing.JLabel folderLb = new javax.swing.JLabel(); folderFld = new javax.swing.JTextField(); javax.swing.JPanel filesPanel = new javax.swing.JPanel(); availFilesSP = new javax.swing.JScrollPane(); availFiles = new javax.swing.JList<>(); addBtn = new javax.swing.JButton(); removeBtn = new javax.swing.JButton(); includedFilesSP = new javax.swing.JScrollPane(); includedFiles = new javax.swing.JList<>(); javax.swing.JPanel buttonPanel = new javax.swing.JPanel(); javax.swing.JLabel projectLb = new javax.swing.JLabel(); projectFld = new javax.swing.JTextField(); javax.swing.JLabel txtLb = new javax.swing.JLabel(); textFld = new javax.swing.JTextField(); javax.swing.JLabel iconLb = new javax.swing.JLabel(); iconFld = new javax.swing.JTextField(); javax.swing.JLabel descLb = new javax.swing.JLabel(); descFld = new javax.swing.JTextField(); setLayout(new java.awt.GridBagLayout()); titleLb.setLabelFor(titleFld); titleLb.setText(options.getMsg("installer_title")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(titleLb, gridBagConstraints); titleFld.setToolTipText(options.getMsg("installer_title_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(titleFld, gridBagConstraints); authLb.setLabelFor(authFld); authLb.setText(options.getMsg("installer_authors")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(authLb, gridBagConstraints); authFld.setToolTipText(options.getMsg("installer_authors_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(authFld, gridBagConstraints); folderLb.setLabelFor(folderFld); folderLb.setText(options.getMsg("installer_folder")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(folderLb, gridBagConstraints); folderFld.setToolTipText(options.getMsg("installer_folder_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(folderFld, gridBagConstraints); filesPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("installer_files"))); filesPanel.setToolTipText(options.getMsg("installer_files_tooltip")); filesPanel.setLayout(new java.awt.GridBagLayout()); availFilesSP.setPreferredSize(new java.awt.Dimension(120, 100)); availFiles.setModel(availModel); availFiles.setToolTipText(options.getMsg("installer_files_available")); availFilesSP.setViewportView(availFiles); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); filesPanel.add(availFilesSP, gridBagConstraints); addBtn.setToolTipText(options.getMsg("installer_files_add_tooltip")); addBtn.setText(options.getMsg("installer_files_add")); addBtn.setEnabled(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); filesPanel.add(addBtn, gridBagConstraints); removeBtn.setToolTipText(options.getMsg("installer_files_tooltip")); removeBtn.setText(options.getMsg("installer_files_remove")); removeBtn.setEnabled(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); filesPanel.add(removeBtn, gridBagConstraints); includedFilesSP.setPreferredSize(new java.awt.Dimension(120, 100)); includedFiles.setModel(filesModel); includedFiles.setToolTipText(options.getMsg("installer_files_selected")); includedFilesSP.setViewportView(includedFiles); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); filesPanel.add(includedFilesSP, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(filesPanel, gridBagConstraints); buttonPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("installer_button"))); buttonPanel.setToolTipText(options.getMsg("installer_button_tooltip")); buttonPanel.setLayout(new java.awt.GridBagLayout()); projectLb.setLabelFor(projectFld); projectLb.setText(options.getMsg("installer_button_project")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); buttonPanel.add(projectLb, gridBagConstraints); projectFld.setToolTipText(options.getMsg("installer_button_project_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); buttonPanel.add(projectFld, gridBagConstraints); txtLb.setLabelFor(textFld); txtLb.setText(options.getMsg("installer_button_text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); buttonPanel.add(txtLb, gridBagConstraints); textFld.setToolTipText(options.getMsg("installer_button_text_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); buttonPanel.add(textFld, gridBagConstraints); iconLb.setLabelFor(iconFld); iconLb.setText(options.getMsg("installer_button_icon")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); buttonPanel.add(iconLb, gridBagConstraints); iconFld.setToolTipText(options.getMsg("installer_button_icon_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); buttonPanel.add(iconFld, gridBagConstraints); descLb.setLabelFor(descFld); descLb.setText(options.getMsg("installer_button_description")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); buttonPanel.add(descLb, gridBagConstraints); descFld.setToolTipText(options.getMsg("installer_button_description_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); buttonPanel.add(descFld, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(buttonPanel, gridBagConstraints); } // //GEN-END:initComponents private String suggestedFileName; public void setValues(JClicProject prj) { suggestedFileName = null; ProjectInstaller pi = null; ProjectInstaller.IconItem ii; FileSystem fs = prj.getFileSystem(); File base = new File(FileSystem.sysFn(fs.getFullFileNamePath(null))); try { File[] files = base.listFiles(Utils.getFileFilter(Utils.INSTALL_FF, options.getMessages())); if (files != null) { for (int i = 0; i < files.length; i++) { if (files[i].isFile()) { suggestedFileName = files[i].getName(); pi = ProjectInstaller.getProjectInstaller(fs.getFullFileNamePath(suggestedFileName)); break; } } } } catch (Exception ex) { System.err.println("Error reading installer: " + ex); } if (suggestedFileName == null) { suggestedFileName = FileSystem.getValidFileName(prj.getName().trim()) + ".jclic.inst"; } if (pi == null) { pi = new ProjectInstaller(); pi.projectTitle = prj.settings.title; pi.baseFolder = base.getName(); StringBuilder sb = new StringBuilder(); if (prj.settings.authors != null) { for (int i = 0; i < prj.settings.authors.length; i++) { if (i > 0) sb.append(", "); sb.append(prj.settings.authors[i].name); } } pi.authors = sb.substring(0); String projectFileName = prj.getFullPath(); if (projectFileName != null) projectFileName = FileSystem.getFileNameOf(projectFileName); else projectFileName = prj.getName() + Utils.EXT_JCLIC_ZIP; pi.addFile(projectFileName); ii = pi.createIconItem(); ii.project = projectFileName; ii.text = prj.settings.title; ii.icon = prj.settings.iconFileName; } titleFld.setText(StrUtils.secureString(pi.projectTitle)); authFld.setText(StrUtils.secureString(pi.authors)); folderFld.setText(StrUtils.secureString(pi.baseFolder)); availModel.removeAllElements(); List v = new ArrayList(); FileSystem.exploreFiles(null, base, v, '/', null, 3, 300); for (String v1 : v) availModel.addElement(v1); filesModel.removeAllElements(); for (int i = 0; i < pi.files.size(); i++) { String s = pi.getFile(i); if (availModel.contains(s)) availModel.removeElement(s); filesModel.addElement(s); } ii = pi.getIconItem(0); if (ii != null) { projectFld.setText(StrUtils.secureString(ii.project)); textFld.setText(StrUtils.secureString(ii.text)); iconFld.setText(StrUtils.secureString(ii.icon)); descFld.setText(StrUtils.secureString(ii.description)); } checkButtons(); } private void checkButtons() { addBtn.setEnabled(!availFiles.isSelectionEmpty()); removeBtn.setEnabled(!includedFiles.isSelectionEmpty()); } public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) checkButtons(); } public void actionPerformed(ActionEvent ev) { if (ev != null && ev.getSource() != null) { DefaultListModel src = null, dest = null; JList list = null; if (ev.getSource() == addBtn) { src = availModel; dest = filesModel; list = availFiles; } else if (ev.getSource() == removeBtn) { dest = availModel; src = filesModel; list = includedFiles; } if (dest != null && src != null & list != null) { Object[] values = list.getSelectedValuesList().toArray(); if (values != null) { for (int i = 0; i < values.length; i++) { src.removeElement(values[i]); dest.addElement(values[i]); } } checkButtons(); } } } public ProjectInstaller getProjectInstaller(Component parent) { ProjectInstaller result = new ProjectInstaller(); String errorKey = null; result.projectTitle = StrUtils.nullableString(titleFld.getText()); result.authors = StrUtils.nullableString(authFld.getText()); result.baseFolder = StrUtils.nullableString(folderFld.getText()); int numFiles = filesModel.getSize(); for (int i = 0; i < numFiles; i++) result.addFile((String) filesModel.get(i)); ProjectInstaller.IconItem ii = result.createIconItem(); ii.project = StrUtils.nullableString(projectFld.getText()); ii.text = StrUtils.nullableString(textFld.getText()); ii.icon = StrUtils.nullableString(iconFld.getText()); ii.description = StrUtils.nullableString(descFld.getText()); if (result.projectTitle == null) errorKey = "noTitle"; else if (result.baseFolder == null) errorKey = "noBaseFolder"; else if (numFiles == 0) errorKey = "noFilesSelected"; else if (ii.project == null) errorKey = "noProjectSelected"; else if (ii.text == null) errorKey = "noButtonText"; else if (!result.files.contains(ii.project)) errorKey = "projectNotInFiles"; if (errorKey != null) options.getMessages().showErrorWarning(parent, "installer_error_" + errorKey, null); return errorKey != null ? null : result; } public static void createInstaller(JClicProject prj, Component parent) { Options options = prj.getBridge().getOptions(); Messages msg = options.getMessages(); ProjectInstallerEditPanel panel = new ProjectInstallerEditPanel(options); panel.setValues(prj); boolean exit = false; while (!exit) { if (msg.showInputDlg(parent, panel, "installer_caption")) { ProjectInstaller result = panel.getProjectInstaller(parent); if (result != null) { int[] filters = { Utils.INSTALL_FF }; FileSystem fs = prj.getFileSystem(); String fileName = fs.chooseFile(panel.suggestedFileName, true, filters, options, null, parent, false); if (fileName != null) { try { FileOutputStream fos = fs.createSecureFileOutputStream(fileName, false); JDomUtility.saveDocument(fos, new org.jdom.Document(result.getJDomElement(false))); fos.close(); exit = true; } catch (Exception ex) { options.getMessages().showErrorWarning(parent, null, ex); } } else exit = true; } } else exit = true; } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addBtn; private javax.swing.JTextField authFld; private javax.swing.JList availFiles; private javax.swing.JScrollPane availFilesSP; private javax.swing.JTextField descFld; private javax.swing.JTextField folderFld; private javax.swing.JTextField iconFld; private javax.swing.JList includedFiles; private javax.swing.JScrollPane includedFilesSP; private javax.swing.JTextField projectFld; private javax.swing.JButton removeBtn; private javax.swing.JTextField textFld; private javax.swing.JTextField titleFld; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/project/ProjectSettingsEditor.java000066400000000000000000000032501335566474600246050ustar00rootroot00000000000000/* * File : ProjectSettingsEditor.java * Created : 27-feb-2004 11:39 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ProjectSettingsEditor extends Editor { /** Creates a new instance of ProjectSettingsEditor */ public ProjectSettingsEditor(ProjectSettings ps) { super(ps); } protected void createChildren() { } public EditorPanel createEditorPanel(Options options) { return new ProjectSettingsEditorPanel(options); } public Class getEditorPanelClass() { return ProjectSettingsEditorPanel.class; } public ProjectSettings getProjectSettings() { return (ProjectSettings) getFirstObject(ProjectSettings.class); } public JClicProjectEditor getProjectEditor() { return (JClicProjectEditor) getFirstParent(JClicProjectEditor.class); } } src/author/edu/xtec/jclic/project/ProjectSettingsEditorPanel.form000066400000000000000000002311561335566474600256170ustar00rootroot00000000000000
src/author/edu/xtec/jclic/project/ProjectSettingsEditorPanel.java000066400000000000000000001360021335566474600255670ustar00rootroot00000000000000/* * File : ProjectSettingsEditorPanel.java * Created : 27-feb-2004 10:33 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.bags.MediaBagEditor; import edu.xtec.jclic.beans.*; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.jclic.media.EventSounds; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.10.29 */ public class ProjectSettingsEditorPanel extends EditorPanel { private javax.swing.JTextPane[] descPanels; private Locale[] meta_langs = new Locale[] {}; private javax.swing.JCheckBox[] levelChkBoxes; private javax.swing.JCheckBox[] areaChkBoxes; /** Creates new form JClicProjectEditorPanel */ public ProjectSettingsEditorPanel(Options options) { super(options); initComponents(); // Order based in ProjectSettings.KNOWN_LEVEL_CODES levelChkBoxes = new javax.swing.JCheckBox[] { levels_INF, levels_PRI, levels_SEC, levels_BTX }; areaChkBoxes = new javax.swing.JCheckBox[] { areas_lleng, areas_mat, areas_soc, areas_exp, areas_mus, areas_vip, areas_ef, areas_tec, areas_div }; listenButtonActions(levelChkBoxes); listenButtonActions(areaChkBoxes); evSoundsBtn.setOptions(options); postInit(250, false, false); setEnabled(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; scroll = new javax.swing.JScrollPane(); scroll.getVerticalScrollBar().setUnitIncrement(16); mainPanel = new javax.swing.JPanel(); descrPanel = new edu.xtec.jclic.beans.RollPanel(); javax.swing.JLabel titleLb = new javax.swing.JLabel(); titleText = new javax.swing.JTextField(); javax.swing.JLabel descLb = new javax.swing.JLabel(); tabDesc = new javax.swing.JTabbedPane(); addBtn = new javax.swing.JButton(); removeBtn = new javax.swing.JButton(); coverPanel = new edu.xtec.jclic.beans.RollPanel(); imgPanel1 = new javax.swing.JPanel(); javax.swing.JLabel coverLb = new javax.swing.JLabel(); coverButton = new edu.xtec.jclic.beans.ImgButton(); coverButton.setOptions(options); javax.swing.JLabel thumbLb = new javax.swing.JLabel(); thumbButton = new edu.xtec.jclic.beans.ImgButton(); thumbButton.setOptions(options); imgPanel2 = new javax.swing.JPanel(); javax.swing.JLabel icon16Lb = new javax.swing.JLabel(); icon16Button = new edu.xtec.jclic.beans.ImgButton(); icon16Button.setOptions(options); javax.swing.JLabel icon72Lb = new javax.swing.JLabel(); icon72Button = new edu.xtec.jclic.beans.ImgButton(); icon72Button.setOptions(options); javax.swing.JLabel icon192Lb = new javax.swing.JLabel(); icon192Button = new edu.xtec.jclic.beans.ImgButton(); icon192Button.setOptions(options); authPanel = new edu.xtec.jclic.beans.RollPanel(); javax.swing.JLabel authorLb = new javax.swing.JLabel(); authorListEditor = new TextListEditor(options) { protected Object editItem(Object currentValue, boolean newValue) { return editAuthor(currentValue, newValue); } }; javax.swing.JLabel orgLb = new javax.swing.JLabel(); orgListEditor = new TextListEditor(options) { protected Object editItem(Object currentValue, boolean newValue) { return editOrg(currentValue, newValue); } }; javax.swing.JLabel revLb = new javax.swing.JLabel(); revListEditor = new TextListEditor(options) { protected Object editItem(Object currentValue, boolean newValue) { return editRevision(currentValue, newValue); } }; javax.swing.JLabel licenseLb = new javax.swing.JLabel(); licenseCombo = new javax.swing.JComboBox( edu.xtec.jclic.project.ProjectSettings.getLicensesList(this.options.getMsg("settings_license_other"))); licenseCombo.setSelectedIndex(edu.xtec.jclic.project.ProjectSettings.CC_BY_NC_SA); descPanel = new edu.xtec.jclic.beans.RollPanel(); javax.swing.JLabel langLb = new javax.swing.JLabel(); langListEditor = new TextListEditor(options) { protected Object editItem(Object currentValue, boolean newValue) { return editLanguage(currentValue, newValue); } }; javax.swing.JLabel levelLb = new javax.swing.JLabel(); levels_INF = new javax.swing.JCheckBox(); levels_PRI = new javax.swing.JCheckBox(); levels_SEC = new javax.swing.JCheckBox(); levels_BTX = new javax.swing.JCheckBox(); javax.swing.JLabel levelOtherLb = new javax.swing.JLabel(); levelText = new javax.swing.JTextField(); javax.swing.JLabel areaLb = new javax.swing.JLabel(); areas_lleng = new javax.swing.JCheckBox(); areas_mat = new javax.swing.JCheckBox(); areas_soc = new javax.swing.JCheckBox(); areas_exp = new javax.swing.JCheckBox(); areas_mus = new javax.swing.JCheckBox(); areas_vip = new javax.swing.JCheckBox(); areas_ef = new javax.swing.JCheckBox(); areas_tec = new javax.swing.JCheckBox(); areas_div = new javax.swing.JCheckBox(); javax.swing.JLabel areaOtherLb = new javax.swing.JLabel(); areaText = new javax.swing.JTextField(); javax.swing.JLabel descriptorslLb = new javax.swing.JLabel(); descriptorsText = new javax.swing.JTextField(); uiPanel = new edu.xtec.jclic.beans.RollPanel(); javax.swing.JLabel skinLb = new javax.swing.JLabel(); skinCombo = new javax.swing.JComboBox(edu.xtec.jclic.skins.Skin.getSystemSkinList(false)); skinCombo.setSelectedItem(null); javax.swing.JLabel evSoundsLb = new javax.swing.JLabel(); evSoundsBtn = new edu.xtec.jclic.beans.EventSoundsButton(); javax.swing.JLabel spacer = new javax.swing.JLabel(); setLayout(new java.awt.BorderLayout()); mainPanel.setLayout(new java.awt.GridBagLayout()); descrPanel.setTitle(options.getMsg("edit_project_description_block")); descrPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); titleLb.setLabelFor(titleText); titleLb.setText(options.getMsg("edit_project_title")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descrPanel.getMainPanel().add(titleLb, gridBagConstraints); titleText.setToolTipText(options.getMsg("edit_project_title_tooltip")); titleText.setPreferredSize(new java.awt.Dimension(500, 21)); titleText.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descrPanel.getMainPanel().add(titleText, gridBagConstraints); descLb.setText(options.getMsg("edit_project_description")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descrPanel.getMainPanel().add(descLb, gridBagConstraints); tabDesc.setToolTipText(options.getMsg("edit_project_description_tooltip")); tabDesc.setPreferredSize(new java.awt.Dimension(500, 200)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descrPanel.getMainPanel().add(tabDesc, gridBagConstraints); addBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/plus16.gif"))); // NOI18N addBtn.setToolTipText(options == null ? "" : options.getMsg("edit_list_newElement_tooltip")); addBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); addBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 0); descrPanel.getMainPanel().add(addBtn, gridBagConstraints); removeBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/minus16.gif"))); // NOI18N removeBtn.setToolTipText(options == null ? "" : options.getMsg("edit_list_deleteElement_tooltip")); removeBtn.setEnabled(false); removeBtn.setMargin(new java.awt.Insets(0, 0, 0, 0)); removeBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descrPanel.getMainPanel().add(removeBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(descrPanel, gridBagConstraints); coverPanel.setTitle(options.getMsg("edit_project_images_block")); coverPanel.getMainPanel().setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEADING, 0, 0)); imgPanel1.setFocusable(false); imgPanel1.setLayout(new java.awt.GridBagLayout()); coverLb.setLabelFor(coverButton); coverLb.setText(options.getMsg("edit_project_cover")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); imgPanel1.add(coverLb, gridBagConstraints); coverButton.setToolTipText(options.getMsg("edit_project_cover_tooltip")); coverButton.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 30); imgPanel1.add(coverButton, gridBagConstraints); thumbLb.setLabelFor(thumbButton); thumbLb.setText(options.getMsg("edit_project_thumb")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); imgPanel1.add(thumbLb, gridBagConstraints); thumbButton.setToolTipText(options.getMsg("edit_project_thumb_tooltip")); thumbButton.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 30, 3); imgPanel1.add(thumbButton, gridBagConstraints); coverPanel.getMainPanel().add(imgPanel1); imgPanel2.setLayout(new java.awt.GridBagLayout()); icon16Lb.setLabelFor(icon16Button); icon16Lb.setText(options.getMsg("edit_project_icon16")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); imgPanel2.add(icon16Lb, gridBagConstraints); icon16Button.setToolTipText(options.getMsg("edit_project_icons_tooltip")); icon16Button.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); imgPanel2.add(icon16Button, gridBagConstraints); icon72Lb.setLabelFor(icon72Button); icon72Lb.setText(options.getMsg("edit_project_icon72")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); imgPanel2.add(icon72Lb, gridBagConstraints); icon72Button.setToolTipText(options.getMsg("edit_project_icons_tooltip")); icon72Button.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); imgPanel2.add(icon72Button, gridBagConstraints); icon192Lb.setLabelFor(icon192Button); icon192Lb.setText(options.getMsg("edit_project_icon192")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); imgPanel2.add(icon192Lb, gridBagConstraints); icon192Button.setToolTipText(options.getMsg("edit_project_icons_tooltip")); icon192Button.addPropertyChangeListener(ImgButton.PROP_IMG_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); imgPanel2.add(icon192Button, gridBagConstraints); coverPanel.getMainPanel().add(imgPanel2); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(coverPanel, gridBagConstraints); authPanel.setTitle(options.getMsg("edit_project_author_group")); authPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); authorLb.setLabelFor(authorListEditor); authorLb.setText(options.getMsg("edit_project_authors")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); authPanel.getMainPanel().add(authorLb, gridBagConstraints); authorListEditor.setToolTipText(options.getMsg("edit_project_authors_tooltip")); authorListEditor.setPreferredSize(new java.awt.Dimension(500, 80)); authorListEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; authPanel.getMainPanel().add(authorListEditor, gridBagConstraints); orgLb.setLabelFor(orgListEditor); orgLb.setText(options.getMsg("edit_project_org")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); authPanel.getMainPanel().add(orgLb, gridBagConstraints); orgListEditor.setToolTipText(options.getMsg("edit_project_org_tooltip")); orgListEditor.setPreferredSize(new java.awt.Dimension(500, 80)); orgListEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; authPanel.getMainPanel().add(orgListEditor, gridBagConstraints); revLb.setLabelFor(revListEditor); revLb.setText(options.getMsg("edit_project_rev")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); authPanel.getMainPanel().add(revLb, gridBagConstraints); revListEditor.setToolTipText(options.getMsg("edit_project_rev_tooltip")); revListEditor.setPreferredSize(new java.awt.Dimension(500, 80)); revListEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; authPanel.getMainPanel().add(revListEditor, gridBagConstraints); licenseLb.setLabelFor(licenseCombo); licenseLb.setText(options.getMsg("settings_license")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); authPanel.getMainPanel().add(licenseLb, gridBagConstraints); licenseCombo.setToolTipText(options.getMsg("settings_license_tooltip")); licenseCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); authPanel.getMainPanel().add(licenseCombo, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(authPanel, gridBagConstraints); descPanel.setTitle(options.getMsg("edit_project_descriptors_block")); descPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); langLb.setLabelFor(langListEditor); langLb.setText(options.getMsg("edit_project_languages")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descPanel.getMainPanel().add(langLb, gridBagConstraints); langListEditor.setToolTipText(options.getMsg("edit_project_languages_tooltip")); langListEditor.setPreferredSize(new java.awt.Dimension(200, 80)); langListEditor.addPropertyChangeListener(TextListEditor.PROP_LIST, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(0, 0, 10, 0); descPanel.getMainPanel().add(langListEditor, gridBagConstraints); levelLb.setText(options.getMsg("edit_project_level")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descPanel.getMainPanel().add(levelLb, gridBagConstraints); levels_INF.setText(options.getMsg("levels_INF")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(levels_INF, gridBagConstraints); levels_PRI.setText(options.getMsg("levels_PRI")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(levels_PRI, gridBagConstraints); levels_SEC.setText(options.getMsg("levels_SEC")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(levels_SEC, gridBagConstraints); levels_BTX.setText(options.getMsg("levels_BTX")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(levels_BTX, gridBagConstraints); levelOtherLb.setLabelFor(levelText); levelOtherLb.setText(options.getMsg("levels_other")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 10, 3); descPanel.getMainPanel().add(levelOtherLb, gridBagConstraints); levelText.setToolTipText(options.getMsg("edit_project_level_tooltip")); levelText.setPreferredSize(new java.awt.Dimension(300, 21)); levelText.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 10, 3); descPanel.getMainPanel().add(levelText, gridBagConstraints); areaLb.setText(options.getMsg("edit_project_area")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); descPanel.getMainPanel().add(areaLb, gridBagConstraints); areas_lleng.setText(options.getMsg("areas_lleng")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_lleng, gridBagConstraints); areas_mat.setText(options.getMsg("areas_mat")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_mat, gridBagConstraints); areas_soc.setText(options.getMsg("areas_soc")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_soc, gridBagConstraints); areas_exp.setText(options.getMsg("areas_exp")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_exp, gridBagConstraints); areas_mus.setText(options.getMsg("areas_mus")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_mus, gridBagConstraints); areas_vip.setText(options.getMsg("areas_vip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_vip, gridBagConstraints); areas_ef.setText(options.getMsg("areas_ef")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_ef, gridBagConstraints); areas_tec.setText(options.getMsg("areas_tec")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_tec, gridBagConstraints); areas_div.setText(options.getMsg("areas_div")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; descPanel.getMainPanel().add(areas_div, gridBagConstraints); areaOtherLb.setLabelFor(areaText); areaOtherLb.setText(options.getMsg("areas_other")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 10, 3); descPanel.getMainPanel().add(areaOtherLb, gridBagConstraints); areaText.setToolTipText(options.getMsg("edit_project_area_tooltip")); areaText.setPreferredSize(new java.awt.Dimension(300, 21)); areaText.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 10, 3); descPanel.getMainPanel().add(areaText, gridBagConstraints); descriptorslLb.setLabelFor(descriptorsText); descriptorslLb.setText(options.getMsg("edit_project_descriptors")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 10, 3); descPanel.getMainPanel().add(descriptorslLb, gridBagConstraints); descriptorsText.setToolTipText(options.getMsg("edit_project_descriptors_tooltip")); descriptorsText.setPreferredSize(new java.awt.Dimension(500, 21)); descriptorsText.getDocument().addDocumentListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 10, 3); descPanel.getMainPanel().add(descriptorsText, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(descPanel, gridBagConstraints); uiPanel.setTitle(options.getMsg("edit_project_ui_block")); uiPanel.getMainPanel().setLayout(new java.awt.GridBagLayout()); skinLb.setLabelFor(skinCombo); skinLb.setText(options.getMsg("settings_skin")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); uiPanel.getMainPanel().add(skinLb, gridBagConstraints); skinCombo.setEditable(true); skinCombo.setToolTipText(options.getMsg("settings_skin_tooltip")); skinCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); uiPanel.getMainPanel().add(skinCombo, gridBagConstraints); evSoundsLb.setLabelFor(revListEditor); evSoundsLb.setText(options.getMsg("edit_project_evsounds")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); uiPanel.getMainPanel().add(evSoundsLb, gridBagConstraints); evSoundsBtn.setToolTipText(options.getMsg("edit_project_evsounds_tooltip")); evSoundsBtn.addPropertyChangeListener(EventSoundsButton.PROP_EVSND_NAME, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); uiPanel.getMainPanel().add(evSoundsBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mainPanel.add(uiPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; mainPanel.add(spacer, gridBagConstraints); scroll.setViewportView(mainPanel); add(scroll, java.awt.BorderLayout.CENTER); } // //GEN-END:initComponents private void addBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_addBtnActionPerformed String lang = (String) editLanguage(null, true); if (lang != null) { lang = Messages.getLanguageFromDescriptive(lang); Locale loc = Locale.forLanguageTag(lang); Locale[] ml = Arrays.copyOf(meta_langs, meta_langs.length + 1); for (Locale meta_lang : meta_langs) { if (meta_lang.equals(loc)) { options.getMessages().showAlert(this, "edit_project_languages_already_selected"); return; } } ml[meta_langs.length] = loc; meta_langs = ml; addDescTab(""); } } // GEN-LAST:event_addBtnActionPerformed private void removeBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_removeBtnActionPerformed if (meta_langs.length > 1) { int p = tabDesc.getSelectedIndex(); if (this.options.getMessages().showQuestionDlg(this, "edit_project_languages_confirm_delete", meta_langs[p].getDisplayName(), "yn") == Messages.YES) { tabDesc.remove(p); Locale[] ml = new Locale[meta_langs.length - 1]; for (int i = 0, c = 0; i < meta_langs.length; i++) { if (i != p) { ml[c++] = meta_langs[i]; } } checkEnabled(); } } } // GEN-LAST:event_removeBtnActionPerformed @Override public boolean checkIfEditorValid(Editor e) { return (e instanceof ProjectSettingsEditor); } protected ProjectSettingsEditor getProjectSettingsEditor() { return (ProjectSettingsEditor) getEditor(); } protected ProjectSettings getProjectSettings() { ProjectSettings result = null; ProjectSettingsEditor pse = getProjectSettingsEditor(); if (pse != null) { result = pse.getProjectSettings(); } return result; } @Override protected void fillData() { ProjectSettings ps = getProjectSettings(); JClicProjectEditor prjed = (ps == null ? null : getProjectSettingsEditor().getProjectEditor()); MediaBagEditor mbe = (prjed == null ? null : prjed.getMediaBagEditor()); if (prjed != null) { evSoundsBtn.setMediaBagEditor(mbe); } evSoundsBtn.setEventSounds(ps == null ? null : ps.eventSounds); coverButton.setMediaBagEditor(mbe); coverButton.setImgName(ps == null ? null : ps.coverFileName); thumbButton.setMediaBagEditor(mbe); thumbButton.setImgName(ps == null ? null : ps.thumbnailFileName); icon16Button.setMediaBagEditor(mbe); icon16Button.setImgName(ps == null ? null : ps.icon16); icon72Button.setMediaBagEditor(mbe); icon72Button.setImgName(ps == null ? null : ps.icon72); icon192Button.setMediaBagEditor(mbe); icon192Button.setImgName(ps == null ? null : ps.icon192); titleText.setText(ps == null || ps.title == null ? options.getMsg("UNNAMED") : ps.title); tabDesc.removeAll(); descPanels = null; meta_langs = new Locale[] {}; if (ps != null) { meta_langs = new Locale[ps.meta_langs.length]; descPanels = new javax.swing.JTextPane[ps.meta_langs.length]; for (int i = 0; i < meta_langs.length; i++) { meta_langs[i] = ps.meta_langs[i]; addDescTab(ps.descriptions[i]); } } for (int i = 0; i < levelChkBoxes.length; i++) levelChkBoxes[i].setSelected( ps != null && ps.level_codes != null && ps.level_codes.contains(ProjectSettings.KNOWN_LEVEL_CODES[i])); for (int i = 0; i < areaChkBoxes.length; i++) areaChkBoxes[i].setSelected( ps != null && ps.area_codes != null && ps.area_codes.contains(ProjectSettings.KNOWN_AREA_CODES[i])); areaText.setText(ps == null ? "" : StrUtils.secureString(ps.area)); levelText.setText(ps == null ? "" : StrUtils.secureString(ps.level)); descriptorsText.setText(ps == null ? "" : StrUtils.secureString(ps.descriptors)); skinCombo.setSelectedItem(ps == null ? null : ps.skinFileName); licenseCombo.setSelectedIndex(ps == null ? edu.xtec.jclic.project.ProjectSettings.CC_BY_NC_SA : ps.license); List v = new ArrayList(); if (ps != null && ps.languages != null) { for (String language : ps.languages) { String code = (String) Messages.getNamesToCodes().get(language.toLowerCase()); if (code != null) { v.add(Messages.getDescriptiveLanguageCode(code)); } else { v.add(language); } } } langListEditor.setListData(v); v.clear(); if (ps != null && ps.authors != null) { v.addAll(Arrays.asList(ps.authors)); } authorListEditor.setListData(v); v.clear(); if (ps != null && ps.organizations != null) { v.addAll(Arrays.asList(ps.organizations)); } orgListEditor.setListData(v); v.clear(); if (ps != null && ps.revisions != null) { v.addAll(Arrays.asList(ps.revisions)); } revListEditor.setListData(v); } private void addDescTab(String text) { int i = tabDesc.getTabCount(); if (i >= descPanels.length) { javax.swing.JTextPane[] dp = new javax.swing.JTextPane[descPanels.length + 1]; for (int p = 0; p < descPanels.length; p++) { dp[p] = descPanels[p]; } descPanels = dp; } javax.swing.JScrollPane scr = new javax.swing.JScrollPane(); descPanels[i] = new javax.swing.JTextPane(); descPanels[i].setText(StrUtils.secureString(text)); descPanels[i].getDocument().addDocumentListener(this); scr.setViewportView(descPanels[i]); scr.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); tabDesc.addTab(meta_langs[i].toLanguageTag(), scr); checkEnabled(); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); evSoundsBtn.setEnabled(enabled); titleText.setEnabled(enabled); tabDesc.setEnabled(enabled); addBtn.setEnabled(enabled); removeBtn.setEnabled(enabled && meta_langs != null && meta_langs.length > 1); descriptorsText.setEnabled(enabled); skinCombo.setEnabled(enabled); licenseCombo.setEnabled(enabled); langListEditor.setEnabled(enabled); authorListEditor.setEnabled(enabled); orgListEditor.setEnabled(enabled); revListEditor.setEnabled(enabled); coverButton.setEnabled(enabled); thumbButton.setEnabled(enabled); icon16Button.setEnabled(enabled); icon72Button.setEnabled(enabled); icon192Button.setEnabled(enabled); for (javax.swing.JCheckBox check : levelChkBoxes) { check.setEnabled(enabled); } levelText.setEnabled(enabled); for (javax.swing.JCheckBox check : areaChkBoxes) { check.setEnabled(enabled); } areaText.setEnabled(enabled); } protected void checkEnabled() { removeBtn.setEnabled(meta_langs != null && meta_langs.length > 1); } /* * public boolean isModified(){ boolean result=super.isModified(); * ProjectSettings ps=getProjectSettings(); if(ps!=null && !result){ result= * !titleText.getText().equals(ps.title) || * !descText.getText().equals(ps.description) || * !areaText.getText().equals(ps.area) || !levelText.getText().equals(ps.level) * || !descriptorsText.getText().equals(ps.descriptors) || * !Utils.compareObjects(skinCombo.getSelectedItem(), ps.skinFileName) || * langListEditor.isModified() || authorListEditor.isModified() || * orgListEditor.isModified() || revListEditor.isModified() || * evSoundsBtn.isModified(); } return result; } */ @Override protected void saveData() { ProjectSettings ps = getProjectSettings(); if (ps != null) { ps.title = StrUtils.secureString(titleText.getText(), options.getMsg("UNNAMED")); ps.meta_langs = meta_langs; ps.descriptions = new String[meta_langs.length]; for (int i = 0; i < meta_langs.length; i++) { ps.descriptions[i] = descPanels[i].getText(); } ps.description = ps.descriptions[0]; ps.coverFileName = coverButton.getImgName(); ps.thumbnailFileName = thumbButton.getImgName(); ps.icon16 = icon16Button.getImgName(); ps.icon72 = icon72Button.getImgName(); ps.icon192 = icon192Button.getImgName(); List v = authorListEditor.getListData(); ps.authors = (Author[]) v.toArray(new Author[v.size()]); v = orgListEditor.getListData(); ps.organizations = (Organization[]) v.toArray(new Organization[v.size()]); v = revListEditor.getListData(); ps.revisions = (Revision[]) v.toArray(new Revision[v.size()]); ps.level_codes = new ArrayList(); for (int i = 0; i < levelChkBoxes.length; i++) if (levelChkBoxes[i].isSelected()) ps.level_codes.add(ProjectSettings.KNOWN_LEVEL_CODES[i]); ps.level = StrUtils.nullableString(levelText.getText()); ps.area_codes = new ArrayList(); for (int i = 0; i < areaChkBoxes.length; i++) if (areaChkBoxes[i].isSelected()) ps.area_codes.add(ProjectSettings.KNOWN_AREA_CODES[i]); ps.area = StrUtils.nullableString(areaText.getText()); ps.descriptors = StrUtils.nullableString(descriptorsText.getText()); String[] langs = langListEditor.getTextList(); ps.languages = new String[langs.length]; for (int i = 0; i < langs.length; i++) { String ln = langs[i]; int p = ln.length(); if (p > 5) { String code = ln.substring(p - 3, p - 1); ln = (String) Messages.getNamesToCodes().get(code); } ps.languages[i] = (ln == null ? langs[i] : ln); } ps.skinFileName = StrUtils.nullableString(skinCombo.getSelectedItem()); ps.license = licenseCombo.getSelectedIndex(); EventSounds evs = evSoundsBtn.getEventSounds(); ps.eventSounds = (evs == null ? new EventSounds(null) : evs); } } private static JScrollPane langListPanel; private static JList langList; private Object editLanguage(final Object currentValue, boolean newValue) { if (langList == null || langListPanel == null) { langList = new JList(options.getMessages().getDescriptiveLanguageCodes()); langListPanel = new JScrollPane(langList); } Object result = null; if (!newValue && currentValue != null) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { langList.setSelectedValue(currentValue, true); } }); } else { langList.setSelectedIndex(-1); } if (options.getMessages().showInputDlg(this, new String[] { "edit_project_languages_select" }, null, new JComponent[] { langListPanel }, (newValue ? "edit_project_languages_add" : "edit_project_languages_modify"))) { result = langList.getSelectedValue(); } return result; } private AuthorEditPanel authorEditPanel; private Object editAuthor(Object currentValue, boolean newValue) { Author result = null; if (authorEditPanel == null) { authorEditPanel = new AuthorEditPanel(options); } if (newValue) { currentValue = null; } authorEditPanel.setAuthor((Author) currentValue); if (options.getMessages().showInputDlg(this, new String[] { "edit_project_author_info" }, null, new JComponent[] { authorEditPanel }, (newValue ? "edit_project_author_add" : "edit_project_author_edit"))) { result = authorEditPanel.getAuthor(); if (result.name.length() < 1) { result = null; } } return result; } private OrganizationEditPanel organizationEditPanel; private Object editOrg(Object currentValue, boolean newValue) { Organization result = null; if (organizationEditPanel == null) { organizationEditPanel = new OrganizationEditPanel(options); } if (newValue) { currentValue = null; } organizationEditPanel.setOrganization((Organization) currentValue); if (options.getMessages().showInputDlg(this, new String[] { "edit_project_org_info" }, null, new JComponent[] { organizationEditPanel }, (newValue ? "edit_project_org_add" : "edit_project_org_edit"))) { result = organizationEditPanel.getOrganization(); if (result.name.length() < 1) { result = null; } } return result; } private RevisionEditPanel revisionEditPanel; private Object editRevision(Object currentValue, boolean newValue) { Revision result = null; if (revisionEditPanel == null) { revisionEditPanel = new RevisionEditPanel(options); } if (newValue) { currentValue = null; } revisionEditPanel.setRevision((Revision) currentValue); if (options.getMessages().showInputDlg(this, new String[] { "edit_project_rev_info" }, null, new JComponent[] { revisionEditPanel }, (newValue ? "edit_project_rev_add" : "edit_project_rev_edit"))) { result = revisionEditPanel.getRevision(); if (result != null && result.description.length() < 1) { result = null; } } return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addBtn; private javax.swing.JTextField areaText; private javax.swing.JCheckBox areas_div; private javax.swing.JCheckBox areas_ef; private javax.swing.JCheckBox areas_exp; private javax.swing.JCheckBox areas_lleng; private javax.swing.JCheckBox areas_mat; private javax.swing.JCheckBox areas_mus; private javax.swing.JCheckBox areas_soc; private javax.swing.JCheckBox areas_tec; private javax.swing.JCheckBox areas_vip; private edu.xtec.jclic.beans.RollPanel authPanel; private edu.xtec.jclic.beans.TextListEditor authorListEditor; private edu.xtec.jclic.beans.ImgButton coverButton; private edu.xtec.jclic.beans.RollPanel coverPanel; private edu.xtec.jclic.beans.RollPanel descPanel; private edu.xtec.jclic.beans.RollPanel descrPanel; private javax.swing.JTextField descriptorsText; private edu.xtec.jclic.beans.EventSoundsButton evSoundsBtn; private edu.xtec.jclic.beans.ImgButton icon16Button; private edu.xtec.jclic.beans.ImgButton icon192Button; private edu.xtec.jclic.beans.ImgButton icon72Button; private javax.swing.JPanel imgPanel1; private javax.swing.JPanel imgPanel2; private edu.xtec.jclic.beans.TextListEditor langListEditor; private javax.swing.JTextField levelText; private javax.swing.JCheckBox levels_BTX; private javax.swing.JCheckBox levels_INF; private javax.swing.JCheckBox levels_PRI; private javax.swing.JCheckBox levels_SEC; private javax.swing.JComboBox licenseCombo; private javax.swing.JPanel mainPanel; private edu.xtec.jclic.beans.TextListEditor orgListEditor; private javax.swing.JButton removeBtn; private edu.xtec.jclic.beans.TextListEditor revListEditor; private javax.swing.JScrollPane scroll; private javax.swing.JComboBox skinCombo; private javax.swing.JTabbedPane tabDesc; private edu.xtec.jclic.beans.ImgButton thumbButton; private javax.swing.JTextField titleText; private edu.xtec.jclic.beans.RollPanel uiPanel; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/project/RevisionEditPanel.form000066400000000000000000000242721335566474600237240ustar00rootroot00000000000000
src/author/edu/xtec/jclic/project/RevisionEditPanel.java000066400000000000000000000175401335566474600237020ustar00rootroot00000000000000/* * File : RevisionEditPanel.java * Created : 27-feb-2004 17:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.beans.TextListEditor; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.swing.JComponent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.10.29 */ public class RevisionEditPanel extends javax.swing.JPanel { Options options; /** Creates new form AuthorEditPanel */ public RevisionEditPanel(Options options) { this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel authorLb; javax.swing.JLabel commentsLb; javax.swing.JScrollPane commentsScroll; javax.swing.JLabel dateLb; javax.swing.JLabel descLb; java.awt.GridBagConstraints gridBagConstraints; dateLb = new javax.swing.JLabel(); dateText = new javax.swing.JTextField(); descLb = new javax.swing.JLabel(); descText = new javax.swing.JTextField(); authorLb = new javax.swing.JLabel(); authorListEditor = new TextListEditor(options) { protected Object editItem(Object currentValue, boolean newValue) { return editAuthor(currentValue, newValue); } }; commentsLb = new javax.swing.JLabel(); commentsScroll = new javax.swing.JScrollPane(); commentsText = new javax.swing.JTextArea(); setLayout(new java.awt.GridBagLayout()); dateLb.setLabelFor(dateText); dateLb.setText(options.getMsg("edit_project_rev_date")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(dateLb, gridBagConstraints); dateText.setToolTipText(options.getMsg("edit_project_rev_date_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(dateText, gridBagConstraints); descLb.setLabelFor(descText); descLb.setText(options.getMsg("edit_project_rev_description")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; add(descLb, gridBagConstraints); descText.setToolTipText(options.getMsg("edit_project_rev_description_tooltip")); descText.setPreferredSize(new java.awt.Dimension(300, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(descText, gridBagConstraints); authorLb.setLabelFor(authorListEditor); authorLb.setText(options.getMsg("edit_project_rev_authors")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; add(authorLb, gridBagConstraints); authorListEditor.setToolTipText(options.getMsg("edit_project_rev_authors_tooltip")); authorListEditor.setPreferredSize(new java.awt.Dimension(400, 80)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; add(authorListEditor, gridBagConstraints); commentsLb.setLabelFor(commentsText); commentsLb.setText(options.getMsg("edit_project_rev_comments")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; add(commentsLb, gridBagConstraints); commentsScroll.setPreferredSize(new java.awt.Dimension(300, 60)); commentsText.setLineWrap(true); commentsText.setToolTipText(options.getMsg("edit_project_rev_comments_tooltip")); commentsText.setWrapStyleWord(true); commentsScroll.setViewportView(commentsText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; add(commentsScroll, gridBagConstraints); } // GEN-END:initComponents public void setRevision(Revision rev) { dateText.setText(options.getMessages().getShortDateStr(rev == null ? new Date() : rev.date)); descText.setText(rev != null ? rev.description : ""); commentsText.setText(rev != null ? rev.comments : ""); List v = new ArrayList(); if (rev != null && rev.authors != null) { for (Author a : rev.authors) v.add(a); } authorListEditor.setListData(v); } public Revision getRevision() { Revision rev = null; Date date = options.getMessages().parseShortDate(dateText.getText()); String desc = StrUtils.nullableString(descText.getText().trim()); if (date == null) { options.getMessages().showAlert(this, "DATE_INCORRECT"); } else if (desc == null) { options.getMessages().showAlert(this, "edit_project_rev_err_nodesc"); } else { rev = new Revision(); rev.date = date; rev.description = desc; rev.comments = StrUtils.nullableString(commentsText.getText().trim()); List v = authorListEditor.getListData(); rev.authors = (Author[]) v.toArray(new Author[v.size()]); } return rev; } private AuthorEditPanel authorEditPanel; private Object editAuthor(Object currentValue, boolean newValue) { Author result = null; if (authorEditPanel == null) authorEditPanel = new AuthorEditPanel(options); if (newValue) currentValue = null; authorEditPanel.setAuthor((Author) currentValue); if (options.getMessages().showInputDlg(this, new String[] { "edit_project_author_info" }, null, new JComponent[] { authorEditPanel }, (newValue ? "edit_project_author_add" : "edit_project_author_edit"))) { result = authorEditPanel.getAuthor(); if (result.name.length() < 1) result = null; } return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private edu.xtec.jclic.beans.TextListEditor authorListEditor; private javax.swing.JTextArea commentsText; private javax.swing.JTextField dateText; private javax.swing.JTextField descText; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/jclic/shapers/000077500000000000000000000000001335566474600174435ustar00rootroot00000000000000src/author/edu/xtec/jclic/shapers/EditableCubicCurve2D.java000066400000000000000000000222241335566474600241620ustar00rootroot00000000000000/* * File : EditableCubicCurve2D.java * Created : 25-feb-2002 11:47 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import java.awt.*; import java.awt.geom.*; /** * @author allastar * @version 1.0 */ public class EditableCubicCurve2D extends CubicCurve2D.Double implements EditableShape { private boolean selected = false; private int border = -1; private int selectedBorder = -1; /** Creates new EditableCubicCurve2D */ public EditableCubicCurve2D(CubicCurve2D curve) { super(); setCurve(curve); } public EditableCubicCurve2D(double x1, double y1, double ctrlx1, double ctrly1, double ctrlx2, double ctrly2, double x2, double y2) { super(x1, y1, ctrlx1, ctrly1, ctrlx2, ctrly2, x2, y2); } public boolean isSelected() { return selected; } public boolean isInto(java.awt.geom.Rectangle2D r) { return (r.contains(getP1()) || r.contains(getP2()) || r.contains(getCtrlP1()) || r.contains(getCtrlP2())); } public void drawBorders(java.awt.Graphics g) { if (getP1().getX() != -1) g.drawRect((int) getP1().getX() - (EditableShapeConstants.selectLength / 2), (int) getP1().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (getP2().getX() != -1) g.drawRect((int) getP2().getX() - (EditableShapeConstants.selectLength / 2), (int) getP2().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (getCtrlP1().getX() != -1) g.fillRect((int) getCtrlP1().getX() - (EditableShapeConstants.selectLength / 2), (int) getCtrlP1().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (getCtrlP2().getX() != -1) g.fillRect((int) getCtrlP2().getX() - (EditableShapeConstants.selectLength / 2), (int) getCtrlP2().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); g.setColor(EditableShapeConstants.SELECTED_BORDER_COLOR); if (selectedBorder == 1) { g.fillRect((int) getP1().getX() - (EditableShapeConstants.selectLength / 2), (int) getP1().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } else if (selectedBorder == 2) { g.fillRect((int) getP2().getX() - (EditableShapeConstants.selectLength / 2), (int) getP2().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } } public boolean hasClickedBorder(double x, double y, boolean needSelected) { boolean hasClicked = false; if (!needSelected || selected) { Rectangle r1 = new Rectangle((int) getP1().getX() - (EditableShapeConstants.selectLength / 2), (int) getP1().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r2 = new Rectangle((int) getP2().getX() - (EditableShapeConstants.selectLength / 2), (int) getP2().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r3 = new Rectangle((int) getCtrlP1().getX() - (EditableShapeConstants.selectLength / 2), (int) getCtrlP1().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r4 = new Rectangle((int) getCtrlP2().getX() - (EditableShapeConstants.selectLength / 2), (int) getCtrlP2().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (r1.contains(x, y)) { border = 1; hasClicked = true; } else if (r2.contains(x, y)) { border = 2; hasClicked = true; } else if (r3.contains(x, y)) { border = 3; hasClicked = true; } else if (r4.contains(x, y)) { border = 4; hasClicked = true; } } return hasClicked; } public void aproximateNearestBorder(double x, double y) { if (hasClickedBorder(x, y, false)) changeBorder(x, y); } public java.awt.geom.Point2D getNearestBorder(double x, double y) { Point2D p1, p2; double d1 = getP1().distance(x, y); double d2 = getP2().distance(x, y); double d3 = getCtrlP1().distance(x, y); double d4 = getCtrlP2().distance(x, y); if (d1 < d2) p1 = getP1(); else p1 = getP2(); if (d3 < d4) p2 = getCtrlP1(); else p2 = getCtrlP2(); if (p1.distance(x, y) < p2.distance(x, y)) return p1; else return p2; } public void setSelected(boolean b) { selected = b; } public void changeBorder(double x, double y) { Point2D p = new Point2D.Double(x, y); if (border == 1) { setCurve(p, getCtrlP1(), getCtrlP2(), getP2()); } else if (border == 2) { setCurve(getP1(), getCtrlP1(), getCtrlP2(), p); } else if (border == 3) { setCurve(getP1(), p, getCtrlP2(), getP2()); } else { // border==4 setCurve(getP1(), getCtrlP1(), p, getP2()); } } public double distanceTo(double x, double y) { /* * double d1=getNearestBorder(x,y).distance(x,y); double d2=d1; Rectangle2D * r=new Rectangle2D.Double(x-2,y-2,4,4); if (intersects(r)) d2=0; return * Math.min(d1,d2); */ double d1 = getNearestBorder(x, y).distance(x, y); double d2 = (new Line2D.Double(getP1(), getP2())).ptSegDist(x, y); return Math.min(d1, d2); } public void paintWithColor(java.awt.Graphics g, int drawingMode, java.awt.Color c) { g.setColor(EditableShapeConstants.BORDER_COLOR); drawBorders(g); if (selected) { paintSelection(g); } else if (drawingMode == PolygonDrawPanel.NEW_POINT) { g.setColor(Color.red); drawBorders(g); g.setColor(c); } else g.setColor(c); ((Graphics2D) g).draw(this); } public void paint(java.awt.Graphics g, int drawingMode) { paintWithColor(g, drawingMode, EditableShapeConstants.defaultColor); } public void paintSelection(java.awt.Graphics g) { g.setColor(Color.black); drawBorders(g); g.setColor(EditableShapeConstants.selectedColor); } public void move(double incX, double incY) { setCurve(getP1().getX() + incX, getP1().getY() + incY, getCtrlX1() + incX, getCtrlY1() + incY, getCtrlX2() + incX, getCtrlY2() + incY, getP2().getX() + incX, getP2().getY() + incY); } public void transform(java.awt.geom.AffineTransform aTransf) { Point2D p1 = getP1(); Point2D p2 = getCtrlP1(); Point2D p3 = getCtrlP2(); Point2D p4 = getP2(); aTransf.transform(p1, p1); aTransf.transform(p2, p2); aTransf.transform(p3, p3); aTransf.transform(p4, p4); setCurve(p1, p2, p3, p4); } public EditableShape[] divide(double x, double y) { EditableShape[] newShapes = new EditableShape[2]; CubicCurve2D left = new CubicCurve2D.Double(); CubicCurve2D right = new CubicCurve2D.Double(); subdivide(left, right); newShapes[0] = new EditableCubicCurve2D(right); newShapes[1] = new EditableCubicCurve2D(left); return newShapes; } public boolean isAdjacentTo(java.awt.geom.Point2D p) { if (getP1().equals(p)) return true; else if (getP2().equals(p)) { setCurve(getP2(), getCtrlP2(), getCtrlP1(), getP1()); return true; } else return false; } public java.awt.geom.Point2D getEndPoint() { return getP2(); } public java.awt.geom.Point2D getInitialPoint() { return getP1(); } public Object clone() { return new EditableCubicCurve2D(this); } public java.awt.geom.Point2D[] getBorders() { return new Point2D[] { getP1(), getP2(), getCtrlP1(), getCtrlP2() }; } public void selectBorder(double x, double y) { Point2D p = new Point2D.Double(x, y); if (getP1().equals(p)) selectedBorder = 1; else if (getP2().equals(p)) selectedBorder = 2; else selectedBorder = -1; } public void deselectBorder() { selectedBorder = -1; } public boolean hasSelectedBorder() { return (selectedBorder != -1); } public java.awt.geom.Point2D getNotSelectedBorder() { if (selectedBorder == 1) return getP2(); else return getP1(); } } src/author/edu/xtec/jclic/shapers/EditableEllipse2D.java000066400000000000000000000077101335566474600235300ustar00rootroot00000000000000/* * File : EditableEllipse2D.java * Created : 28-feb-2002 09:45 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import java.awt.*; import java.awt.geom.*; /** * @author allastar * @version 1.0 */ public class EditableEllipse2D extends EditableRectangle implements Cloneable { public EditableEllipse2D(Point2D ini, Point2D end) { super(ini, end); } public EditableEllipse2D(int x, int y, int width, int height) { super(x, y, width, height); } public void paintWithColor(java.awt.Graphics g, int drawingMode, java.awt.Color c) { g.setColor(EditableShapeConstants.BORDER_COLOR); drawBorders(g); if (selected) { paintSelection(g); } else if (drawingMode == PolygonDrawPanel.NEW_POINT) { g.setColor(Color.red); drawBorders(g); g.setColor(c); } else g.setColor(c); g.drawOval((int) getX(), (int) getY(), (int) getWidth(), (int) getHeight()); } public boolean contains(double x, double y) { return new Ellipse2D.Double(getX(), getY(), getWidth(), getHeight()).contains(x, y); } public boolean contains(double x, double y, double w, double h) { return new Ellipse2D.Double(getX(), getY(), getWidth(), getHeight()).contains(x, y, w, h); } public PathIterator getPathIterator(AffineTransform at) { return new Ellipse2D.Double(getX(), getY(), getWidth(), getHeight()).getPathIterator(at); } public boolean intersects(double x, double y, double w, double h) { return new Ellipse2D.Double(getX(), getY(), getWidth(), getHeight()).intersects(x, y, w, h); } public EditableShape[] divide(double x, double y, boolean b) { return divide(x, y); } public EditableShape[] divide(double x, double y) { // The ellipse will be converted to an array of Bezier curves EditableShape[] shapes = new EditableShape[10]; int currentShape = 0; double currentX = 0, currentY = 0; PathIterator pi = getPathIterator(new AffineTransform()); while (!pi.isDone()) { double[] points = new double[6]; int type = pi.currentSegment(points); switch (type) { case PathIterator.SEG_MOVETO: currentX = points[0]; currentY = points[1]; break; case PathIterator.SEG_LINETO: shapes[currentShape] = new EditableLine2D(currentX, currentY, points[0], points[1]); currentShape++; currentX = points[0]; currentY = points[1]; break; case PathIterator.SEG_CUBICTO: shapes[currentShape] = new EditableCubicCurve2D(currentX, currentY, points[0], points[1], points[2], points[3], points[4], points[5]); currentShape++; currentX = points[4]; currentY = points[5]; break; case PathIterator.SEG_QUADTO: shapes[currentShape] = new EditableQuadCurve2D(currentX, currentY, points[0], points[1], points[2], points[3]); currentShape++; currentX = points[2]; currentY = points[3]; break; } pi.next(); } return shapes; } public Ellipse2D getEllipse() { return new Ellipse2D.Double(getX(), getY(), getWidth(), getHeight()); } public Object clone() { return new EditableEllipse2D(getLocation(), new Point2D.Double(getLocation().getX() + getWidth(), getLocation().getY() + getHeight())); } } src/author/edu/xtec/jclic/shapers/EditableLine2D.java000066400000000000000000000147411335566474600230240ustar00rootroot00000000000000/* * File : EditableLine2D.java * Created : 25-feb-2002 09:29 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import java.awt.*; import java.awt.geom.*; /** * @author allastar * @version 1.0 */ public class EditableLine2D extends Line2D.Double implements EditableShape { private boolean selected = false; private int border = 0; // Border indicates if the last clicked point was the first or the second private int selectedBorder = -1; /** Creates new EditableLine2D */ public EditableLine2D(double x1, double y1, double x2, double y2) { super(x1, y1, x2, y2); } public EditableLine2D(Point2D p1, Point2D p2) { super(p1, p2); } public boolean isSelected() { return selected; } public void drawBorders(java.awt.Graphics g) { g.drawRect((int) x1 - (EditableShapeConstants.selectLength / 2), (int) y1 - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); g.drawRect((int) x2 - (EditableShapeConstants.selectLength / 2), (int) y2 - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); g.setColor(EditableShapeConstants.SELECTED_BORDER_COLOR); if (selectedBorder == 1) { g.fillRect((int) x1 - (EditableShapeConstants.selectLength / 2), (int) y1 - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } else if (selectedBorder == 2) { g.fillRect((int) x2 - (EditableShapeConstants.selectLength / 2), (int) y2 - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } } public boolean hasClickedBorder(double x, double y, boolean needSelected) { boolean hasClicked = false; if (!needSelected || selected) { Rectangle r1 = new Rectangle((int) x1 - (EditableShapeConstants.selectLength / 2), (int) y1 - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r2 = new Rectangle((int) x2 - (EditableShapeConstants.selectLength / 2), (int) y2 - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (r1.contains(x, y)) { border = 1; hasClicked = true; } else if (r2.contains(x, y)) { border = 2; hasClicked = true; } } return hasClicked; } public void aproximateNearestBorder(double x, double y) { if (getP1().distance(x, y) < getP2().distance(x, y)) { x1 = x; y1 = y; } else { x2 = x; y2 = y; } } public java.awt.geom.Point2D getNearestBorder(double x, double y) { return (getP1().distance(x, y) < getP2().distance(x, y)) ? getP1() : getP2(); } public void setSelected(boolean b) { selected = b; } public void paintWithColor(java.awt.Graphics g, int drawingMode, java.awt.Color c) { g.setColor(EditableShapeConstants.BORDER_COLOR); drawBorders(g); if (selected && drawingMode != PolygonDrawPanel.MOVING) { paintSelection(g); } else if (drawingMode == PolygonDrawPanel.NEW_POINT) { g.setColor(Color.red); drawBorders(g); g.setColor(c); } else g.setColor(c); g.drawLine((int) getX1(), (int) getY1(), (int) getX2(), (int) getY2()); } public void paint(java.awt.Graphics g, int drawingMode) { paintWithColor(g, drawingMode, EditableShapeConstants.defaultColor); } public void paintSelection(java.awt.Graphics g) { g.setColor(Color.black); drawBorders(g); g.setColor(EditableShapeConstants.selectedColor); } public void changeBorder(double x, double y) { if (border == 1) { x1 = x; y1 = y; } else { x2 = x; y2 = y; } } public double distanceTo(double x, double y) { return ptSegDist(x, y); } public boolean isInto(java.awt.geom.Rectangle2D r) { return r.intersectsLine(this); } public void move(double incX, double incY) { x1 += incX; x2 += incX; y1 += incY; y2 += incY; } public void transform(java.awt.geom.AffineTransform aTransf) { Point2D p1 = getP1(); Point2D p2 = getP2(); aTransf.transform(p1, p1); aTransf.transform(p2, p2); setLine(p1, p2); } public EditableShape[] divide(double x, double y) { EditableShape[] newShapes = new EditableShape[2]; Point2D p = new Point2D.Double(x, y); newShapes[0] = new EditableLine2D(p, getP2()); newShapes[1] = new EditableLine2D(getP1(), p); return newShapes; } public boolean isAdjacentTo(java.awt.geom.Point2D p) { if (getP1().equals(p)) return true; else if (getP2().equals(p)) { setLine(getP2(), getP1()); return true; } else return false; } public java.awt.geom.Point2D getEndPoint() { return getP2(); } public java.awt.geom.Point2D getInitialPoint() { return getP1(); } public Object clone() { EditableLine2D el = new EditableLine2D(getInitialPoint(), getEndPoint()); el.setSelected(isSelected()); return el; } public java.awt.geom.Point2D[] getBorders() { return new Point2D[] { getP1(), getP2() }; } public void selectBorder(double x, double y) { Point2D p = new Point2D.Double(x, y); if (getP1().equals(p)) selectedBorder = 1; else if (getP2().equals(p)) selectedBorder = 2; else selectedBorder = -1; } public void deselectBorder() { selectedBorder = -1; } public boolean hasSelectedBorder() { return (selectedBorder != -1); } public java.awt.geom.Point2D getNotSelectedBorder() { if (selectedBorder == 1) return getP2(); else return getP1(); } } src/author/edu/xtec/jclic/shapers/EditableQuadCurve2D.java000066400000000000000000000175541335566474600240410ustar00rootroot00000000000000/* * File : EditableQuadCurve2D.java * Created : 26-feb-2002 11:35 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import java.awt.*; import java.awt.geom.*; /** * @author allastar * @version 1.0 */ public class EditableQuadCurve2D extends QuadCurve2D.Double implements EditableShape { private boolean selected = false; private int border = -1; private int selectedBorder = -1; /** Creates new EditableQuadCurve2D */ public EditableQuadCurve2D(QuadCurve2D curve) { super(); setCurve(curve); } public EditableQuadCurve2D(double x1, double y1, double ctrlx, double ctrly, double x2, double y2) { super(x1, y1, ctrlx, ctrly, x2, y2); } public boolean isSelected() { return selected; } public boolean isInto(java.awt.geom.Rectangle2D r) { return (r.contains(getP1()) || r.contains(getP2()) || r.contains(getCtrlPt())); } public void drawBorders(java.awt.Graphics g) { if (getP1().getX() != -1) g.drawRect((int) getP1().getX() - (EditableShapeConstants.selectLength / 2), (int) getP1().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (getP2().getX() != -1) g.drawRect((int) getP2().getX() - (EditableShapeConstants.selectLength / 2), (int) getP2().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (getCtrlPt().getX() != -1) g.fillRect((int) getCtrlPt().getX() - (EditableShapeConstants.selectLength / 2), (int) getCtrlPt().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); g.setColor(EditableShapeConstants.SELECTED_BORDER_COLOR); if (selectedBorder == 1) { g.fillRect((int) getP1().getX() - (EditableShapeConstants.selectLength / 2), (int) getP1().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } else if (selectedBorder == 2) { g.fillRect((int) getP2().getX() - (EditableShapeConstants.selectLength / 2), (int) getP2().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } } public boolean hasClickedBorder(double x, double y, boolean needSelected) { boolean hasClicked = false; if (!needSelected || selected) { Rectangle r1 = new Rectangle((int) getP1().getX() - (EditableShapeConstants.selectLength / 2), (int) getP1().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r2 = new Rectangle((int) getP2().getX() - (EditableShapeConstants.selectLength / 2), (int) getP2().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r3 = new Rectangle((int) getCtrlPt().getX() - (EditableShapeConstants.selectLength / 2), (int) getCtrlPt().getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (r1.contains(x, y)) { border = 1; hasClicked = true; } else if (r2.contains(x, y)) { border = 2; hasClicked = true; } else if (r3.contains(x, y)) { border = 3; hasClicked = true; } } return hasClicked; } public void aproximateNearestBorder(double x, double y) { if (hasClickedBorder(x, y, false)) changeBorder(x, y); } public java.awt.geom.Point2D getNearestBorder(double x, double y) { Point2D p1; double d1 = getP1().distance(x, y); double d2 = getP2().distance(x, y); double d3 = getCtrlPt().distance(x, y); if (d1 < d2) p1 = getP1(); else { p1 = getP2(); d1 = d2; } if (d3 < d1) p1 = getCtrlPt(); return p1; } public void setSelected(boolean b) { selected = b; } public void changeBorder(double x, double y) { Point2D p = new Point2D.Double(x, y); if (border == 1) { setCurve(p, getCtrlPt(), getP2()); } else if (border == 2) { setCurve(getP1(), getCtrlPt(), p); } else { // border==3 setCurve(getP1(), p, getP2()); } } public double distanceTo(double x, double y) { double d1 = getNearestBorder(x, y).distance(x, y); double d2 = (new Line2D.Double(getP1(), getP2())).ptSegDist(x, y); return Math.min(d1, d2); } public void paintWithColor(java.awt.Graphics g, int drawingMode, java.awt.Color c) { g.setColor(EditableShapeConstants.BORDER_COLOR); drawBorders(g); if (selected) { paintSelection(g); } else if (drawingMode == PolygonDrawPanel.NEW_POINT) { g.setColor(Color.red); drawBorders(g); g.setColor(c); } else g.setColor(c); ((Graphics2D) g).draw(this); } public void paint(java.awt.Graphics g, int drawingMode) { paintWithColor(g, drawingMode, EditableShapeConstants.defaultColor); } public void paintSelection(java.awt.Graphics g) { g.setColor(Color.black); drawBorders(g); g.setColor(EditableShapeConstants.selectedColor); } public void move(double incX, double incY) { setCurve(getP1().getX() + incX, getP1().getY() + incY, getCtrlX() + incX, getCtrlY() + incY, getP2().getX() + incX, getP2().getY() + incY); } public void transform(java.awt.geom.AffineTransform aTransf) { Point2D p1 = getP1(); Point2D p2 = getCtrlPt(); Point2D p3 = getP2(); aTransf.transform(p1, p1); aTransf.transform(p2, p2); aTransf.transform(p3, p3); setCurve(p1, p2, p3); } public EditableShape[] divide(double x, double y) { EditableShape[] newShapes = new EditableShape[2]; QuadCurve2D left = new QuadCurve2D.Double(); QuadCurve2D right = new QuadCurve2D.Double(); subdivide(left, right); newShapes[0] = new EditableQuadCurve2D(left); newShapes[1] = new EditableQuadCurve2D(right); return newShapes; } public boolean isAdjacentTo(java.awt.geom.Point2D p) { if (getP1().equals(p)) return true; else if (getP2().equals(p)) { setCurve(getP2(), getCtrlPt(), getP1()); return true; } else return false; } public java.awt.geom.Point2D getEndPoint() { return getP2(); } public java.awt.geom.Point2D getInitialPoint() { return getP1(); } public Object clone() { return new EditableQuadCurve2D(this); } public java.awt.geom.Point2D[] getBorders() { return new Point2D[] { getP1(), getP2(), getCtrlPt() }; } public void selectBorder(double x, double y) { Point2D p = new Point2D.Double(x, y); if (getP1().equals(p)) selectedBorder = 1; else if (getP2().equals(p)) selectedBorder = 2; else selectedBorder = -1; } public void deselectBorder() { selectedBorder = -1; } public boolean hasSelectedBorder() { return (selectedBorder != -1); } public java.awt.geom.Point2D getNotSelectedBorder() { if (selectedBorder == 1) return getP2(); else return getP1(); } } src/author/edu/xtec/jclic/shapers/EditableRectangle.java000066400000000000000000000273401335566474600236520ustar00rootroot00000000000000/* * File : EditableRectangle.java * Created : 26-feb-2002 13:32 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import java.awt.*; import java.awt.geom.*; /** * @author allastar * @version 1.0 */ public class EditableRectangle extends Rectangle2D.Double implements EditableShape, Cloneable { protected boolean selected = false; protected int border = -1; private int selectedBorder = -1; protected Point2D p1, p2, p3, p4; protected Point2D lastP1, lastP2; /** Creates new EditableRectangle */ public EditableRectangle(Point2D ini, Point2D end) { super(); setLimits(ini, end); } public EditableRectangle(int x, int y, int width, int height) { super(); setLimits(x, y, width, height); } public void setLimits(int x, int y, int width, int height) { if (width < 0) { width *= -1; x -= width; } if (height < 0) { height *= -1; y -= height; } p1 = new Point2D.Double(x, y); p2 = new Point2D.Double(x + width, y + height); p3 = new Point2D.Double(); p4 = new Point2D.Double(); lastP1 = new Point2D.Double(1, 1); lastP2 = new Point2D.Double(1, 1); setRect(p1, p2); } public void setLimits(Point2D ini, Point2D end) { p1 = new Point2D.Double(); p2 = new Point2D.Double(); p3 = new Point2D.Double(); p4 = new Point2D.Double(); lastP1 = new Point2D.Double(1, 1); lastP2 = new Point2D.Double(1, 1); setRect(ini, end); } public EditableShape[] divide(double x, double y) { // Deixara de ser un Rectangle. Retornem un array amb 5 linies return divide(x, y, true); } public EditableShape[] divide(double x, double y, boolean newPoint) { // Retornem un array amb les noves linies del Rectangle. Si newPoint=true partim // la recta que conte (x,y) EditableShape[] lines = new EditableShape[5]; lines[0] = new EditableLine2D(p1, p3); lines[1] = new EditableLine2D(p3, p2); lines[2] = new EditableLine2D(p2, p4); lines[3] = new EditableLine2D(p4, p1); if (newPoint) { double minDist = ((EditableLine2D) lines[0]).ptLineDistSq(x, y); short nearestLine = 0; for (short i = 1; i < 4; i++) { double dist = ((EditableLine2D) lines[i]).ptLineDistSq(x, y); if (dist < minDist) { minDist = dist; nearestLine = i; } } Point2D p = new Point2D.Double(x, y); Point2D p1 = ((EditableLine2D) lines[nearestLine]).getP1(); Point2D p2 = ((EditableLine2D) lines[nearestLine]).getP2(); lines[nearestLine] = new EditableLine2D(p1, p); lines[4] = new EditableLine2D(p, p2); } return lines; } public void setSelected(boolean b) { selected = b; } public double distanceTo(double x, double y) { Line2D l1 = new Line2D.Double(p1, p3); Line2D l2 = new Line2D.Double(p3, p2); Line2D l3 = new Line2D.Double(p2, p4); Line2D l4 = new Line2D.Double(p4, p1); double d1 = l1.ptLineDistSq(x, y); double d2 = l2.ptLineDistSq(x, y); double d3 = l3.ptLineDistSq(x, y); double d4 = l4.ptLineDistSq(x, y); double d5, d6; if (d1 < d2) d5 = d1; else d5 = d2; if (d3 < d4) d6 = d3; else d6 = d4; if (d5 < d6) return d5; else return d6; } public boolean hasClickedBorder(double x, double y, boolean needSelected) { boolean hasClicked = false; if (!needSelected || selected) { Rectangle r1 = new Rectangle((int) p1.getX() - (EditableShapeConstants.selectLength / 2), (int) p1.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r2 = new Rectangle((int) p2.getX() - (EditableShapeConstants.selectLength / 2), (int) p2.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r3 = new Rectangle((int) p3.getX() - (EditableShapeConstants.selectLength / 2), (int) p3.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); Rectangle r4 = new Rectangle((int) p4.getX() - (EditableShapeConstants.selectLength / 2), (int) p4.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (r1.contains(x, y)) { border = 1; hasClicked = true; } else if (r2.contains(x, y)) { border = 2; hasClicked = true; } else if (r3.contains(x, y)) { border = 3; hasClicked = true; } else if (r4.contains(x, y)) { border = 4; hasClicked = true; } } return hasClicked; } public void paintSelection(java.awt.Graphics g) { g.setColor(Color.black); drawBorders(g); g.setColor(EditableShapeConstants.selectedColor); } public boolean isSelected() { return selected; } public void aproximateNearestBorder(double x, double y) { boolean b = hasClickedBorder(x, y, false); // Marca la cantonada mes propera changeBorder(x, y); // Posa la cantonada mes propera a (x,y) en la posicio (x,y) } public void paintWithColor(java.awt.Graphics g, int drawingMode, java.awt.Color c) { g.setColor(EditableShapeConstants.BORDER_COLOR); drawBorders(g); if (selected) { paintSelection(g); } else if (drawingMode == PolygonDrawPanel.NEW_POINT) { g.setColor(Color.red); drawBorders(g); g.setColor(c); } else g.setColor(c); g.drawRect((int) getX(), (int) getY(), (int) getWidth(), (int) getHeight()); } public void transform(java.awt.geom.AffineTransform aTransf) { aTransf.transform(p1, p1); aTransf.transform(p2, p2); setRect(p1, p2); } public boolean isAdjacentTo(java.awt.geom.Point2D p) { if (p.equals(p1) || p.equals(p2) || p.equals(p3) || p.equals(p4)) return true; else return false; } public boolean isInto(java.awt.geom.Rectangle2D r) { return (r.intersects(this)); } public java.awt.geom.Point2D getEndPoint() { return p2; } private void setRect(Point2D ini, Point2D end) { if (!(lastP1.equals(ini) && lastP2.equals(end))) { p1 = ini; p2 = end; p3.setLocation(p2.getX(), p1.getY()); p4.setLocation(p1.getX(), p2.getY()); double x = Math.min(p1.getX(), p2.getX()); double y = Math.min(p1.getY(), p2.getY()); double width = Math.abs(p2.getX() - p1.getX()); double height = Math.abs(p2.getY() - p1.getY()); setRect(x, y, width, height); lastP1 = (Point2D) p1.clone(); lastP2 = (Point2D) p2.clone(); } } public void changeBorder(double x, double y) { Point2D newPoint = new Point2D.Double(x, y); if (border == 1) { setRect(newPoint, p2); } else if (border == 2) { setRect(p1, newPoint); } else if (border == 3) { p1.setLocation(p1.getX(), newPoint.getY()); p2.setLocation(newPoint.getX(), p2.getY()); setRect(p1, p2); } else if (border == 4) { p1.setLocation(newPoint.getX(), p1.getY()); p2.setLocation(p2.getX(), newPoint.getY()); setRect(p1, p2); } } public void drawBorders(java.awt.Graphics g) { g.drawRect((int) p1.getX() - (EditableShapeConstants.selectLength / 2), (int) p1.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); g.drawRect((int) p2.getX() - (EditableShapeConstants.selectLength / 2), (int) p2.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); g.drawRect((int) p3.getX() - (EditableShapeConstants.selectLength / 2), (int) p3.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); g.drawRect((int) p4.getX() - (EditableShapeConstants.selectLength / 2), (int) p4.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); g.setColor(EditableShapeConstants.SELECTED_BORDER_COLOR); if (selectedBorder == 1) { g.fillRect((int) p1.getX() - (EditableShapeConstants.selectLength / 2), (int) p1.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } else if (selectedBorder == 2) { g.fillRect((int) p2.getX() - (EditableShapeConstants.selectLength / 2), (int) p2.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } else if (selectedBorder == 3) { g.fillRect((int) p3.getX() - (EditableShapeConstants.selectLength / 2), (int) p3.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } else if (selectedBorder == 4) { g.fillRect((int) p4.getX() - (EditableShapeConstants.selectLength / 2), (int) p4.getY() - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); } } public java.awt.geom.Point2D getInitialPoint() { return getLocation(); } public void paint(java.awt.Graphics g, int drawingMode) { paintWithColor(g, drawingMode, EditableShapeConstants.defaultColor); } public java.awt.geom.Point2D getNearestBorder(double x, double y) { double d1 = p1.distance(x, y); double d2 = p2.distance(x, y); double d3 = p3.distance(x, y); double d4 = p4.distance(x, y); Point2D p5, p6; if (d1 < d2) p5 = p1; else p5 = p2; if (d3 < d4) p6 = p3; else p6 = p4; if (p5.distance(x, y) < p6.distance(x, y)) return p5; else return p6; } public Point2D getLocation() { return new Point2D.Double(getX(), getY()); } /* * public Rectangle2D getRectangle(){ return new * Rectangle2D.Double(getX(),getY(),getWidth(),getHeight()); } */ public Object clone() { return new EditableRectangle(getLocation(), new Point2D.Double(getLocation().getX() + getWidth(), getLocation().getY() + getHeight())); } public java.awt.geom.Point2D[] getBorders() { return new Point2D[] { p1, p2, p3, p4 }; } public void selectBorder(double x, double y) { Point2D p = new Point2D.Double(x, y); if (p1.equals(p)) selectedBorder = 1; else if (p2.equals(p)) selectedBorder = 2; else if (p3.equals(p)) selectedBorder = 3; else if (p4.equals(p)) selectedBorder = 4; else selectedBorder = -1; } public void deselectBorder() { selectedBorder = -1; } public boolean hasSelectedBorder() { return (selectedBorder != -1); } public java.awt.geom.Point2D getNotSelectedBorder() { if (selectedBorder == 1) return p1; else if (selectedBorder == 2) return p2; else if (selectedBorder == 3) return p3; else return p4; } } src/author/edu/xtec/jclic/shapers/EditableShape.java000066400000000000000000000155511335566474600230070ustar00rootroot00000000000000/* * File : EditableShape.java * Created : 25-feb-2002 08:55 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; /** * This interface defines a {@link java.awt.Shape} that implements specific * methods to be modified (edited) in a graphic environment * * @author allastar * @version 1.0 */ public interface EditableShape extends java.awt.Shape { /** * Selects/unselects the shape * * @param b The state (selected/unselected) of the shape */ public void setSelected(boolean b); /** * Checks if the shape is selected * * @return true if the shape is selected, false * otherwise. */ public boolean isSelected(); /** * Draws the shape with the default colour * * @param g The graphic environment where to draw the shape * @param drawingMode The drawing mode. Squares are drawed in red when this * value is ShapeGenPanel.NEW_POINT */ public void paint(java.awt.Graphics g, int drawingMode); /** * Draws the shape with the indicated color. * * @param g The graphic environment where to draw the shape * @param drawingMode The drawing mode. Squares are drawed in red when this * value is ShapeGenPanel.NEW_POINT * @param c The color to be used to draw the shape */ public void paintWithColor(java.awt.Graphics g, int drawingMode, java.awt.Color c); /** * Draws squares in black and the remainder objects in the selection color * (EditableShapeConstants.selectedColor) * * @param g The graphic environment where to draw the shape */ public void paintSelection(java.awt.Graphics g); /** * Draws the shape with dragable sides * * @param g The graphic environment where to draw the shape */ public void drawBorders(java.awt.Graphics g); /** * Checks if the specified point lies within a side of the shape * * @param x The horizontal co-ordinate of the point to check * @param y The vertical co-ordinate of the point to check * @param needSelected When the value of this param is true, the * side must be selected. * @return Returns true when a side of the shape is near the point * defined by x and y. */ public boolean hasClickedBorder(double x, double y, boolean needSelected); /** * Selects the side of the shape that lies with the specified point (if any). * * @param x The horizontal co-ordinate of the point to check * @param y The vertical co-ordinate of the point to check */ public void selectBorder(double x, double y); /** * Rerturns the starting point of the side of the shape nearest to a specific * point. * * @param x The horizontal co-ordinate of the point * @param y The vertical co-ordinate of the point * @return The starting point of the side nearest to the point */ public java.awt.geom.Point2D getNearestBorder(double x, double y); /** * Moves towards a specific point the side of the shape that is located nearest * it. . * * @param x The horizontal co-ordinate of the point * @param y The vertival co-ordinate of the point */ public void aproximateNearestBorder(double x, double y); /** * Computes the distance between a supplied point and the nearest limit of the * shape. * * @param x The horizontal co-ordinate of the point * @param y The vertical co-ordinate of the point * @return The distance between the point and the shape */ public double distanceTo(double x, double y); /** * Checks if the shape is into the limits of a specific * {@link java.awt.Rectangle}. * * @param r The rectangle to be checked * @return true if the shape intersects with the rectangle, * false otherwise. */ public boolean isInto(java.awt.geom.Rectangle2D r); /** * Changes the co-ordinates of the previously marked corner to (x, y) * * @param x The horizontal co-ordinate of the point * @param y The vertical co-ordinate of the point */ public void changeBorder(double x, double y); /** Unselects the selected border of the shape, if any. */ public void deselectBorder(); /** * Gets the starting point of the first non-selected side of the shape * * @return The starting point of the side */ public java.awt.geom.Point2D getNotSelectedBorder(); /** * Checks if the shape currently has a selected side. * * @return true if the shape has a selected side, * false otherwise. */ public boolean hasSelectedBorder(); /** * Applies an affine transformation (rotation, trnaslation, scale...) to the * shape * * @param aTransf The affine transformation to be applied */ public void transform(java.awt.geom.AffineTransform aTransf); /** * Divides the shape taking (x,y) as the "significant" point of the division. * * @param x The horizontal co-ordinate of the point * @param y The vertical co-ordinate of the point * @return An array with the two shapes resulting of the division. */ public EditableShape[] divide(double x, double y); /** * Checks if the shape is adjacent to a specific point. * * @param p The point to be checked * @return true if the shape is adjacent to the point, * false otherwise */ public boolean isAdjacentTo(java.awt.geom.Point2D p); /** * Returns the point of the shape that acts as "starting" point. It is needed to * establish the path that draws the shape. * * @return The starting point of the shape */ public java.awt.geom.Point2D getInitialPoint(); /** * Gets the point of the shape that is considered as "ending" point. * * @return The ending point of the shape. */ public java.awt.geom.Point2D getEndPoint(); /** * Gets an array with all the corners and other special points of the shape. * * @return The array of the points used to build the path that draws the shape. */ public java.awt.geom.Point2D[] getBorders(); /** * Makes a copy of the shape. * * @return The copy of the object */ public Object clone(); } src/author/edu/xtec/jclic/shapers/EditableShapeConstants.java000066400000000000000000000044121335566474600246760ustar00rootroot00000000000000/* * File : EditableShapeConstants.java * Created : 28-feb-2002 11:33 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; /** * @author allastar * @version */ public class EditableShapeConstants { public static int selectLength = 8; public static double scaleXFactor = 1.1; public static double scaleYFactor = 1.1; public static int gridWidth = -1; // -1->Without grid public static java.awt.Color selectedColor = java.awt.Color.blue; public static java.awt.Color defaultColor = java.awt.Color.black; public static java.awt.Color gridColor = java.awt.Color.lightGray; public static java.awt.Color selectingAreaColor = java.awt.Color.darkGray; public static java.awt.Color lightColor = java.awt.Color.lightGray; public static java.awt.Color BORDER_COLOR = java.awt.Color.black; public static java.awt.Color DRAWN_BORDER_COLOR = java.awt.Color.black; public static java.awt.Color CUT_COLOR = java.awt.Color.red; public static java.awt.Color ACTIVE_COLOR = new java.awt.Color(128, 128, 255); // When the polygon can be modified public static java.awt.Color SELECTED_BORDER_COLOR = java.awt.Color.orange; // When there is a point selected public static java.awt.Color movingColor = java.awt.Color.green; public static java.awt.Color inactiveFillColor = new java.awt.Color(240, 240, 240); public static java.awt.Color inactiveBorderColor = new java.awt.Color(100, 100, 100); public static boolean fillDrawn = true; public static boolean pointsOnGrid = false; // magnet public static boolean showDrawnPoints = true; } src/author/edu/xtec/jclic/shapers/HolesEditorPanel.form000066400000000000000000001343661335566474600235460ustar00rootroot00000000000000
src/author/edu/xtec/jclic/shapers/HolesEditorPanel.java000066400000000000000000001054211335566474600235120ustar00rootroot00000000000000/* * File : HolesEditorPanel.java * Created : 03-dec-2002 10:03 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import edu.xtec.jclic.Constants; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Stroke; import java.awt.event.*; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import javax.swing.*; import javax.swing.event.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class HolesEditorPanel extends javax.swing.JPanel implements PointListener, ActionListener, PropertyChangeListener { public static final double ROTATE_UNIT = Math.PI / 180 * 15; Options options; Holes shaper; Image img; Rectangle previewArea; BoxBase previewBb; ShapeListModel listModel; ListSelectionListener listSelectionListener; boolean modified; int currentShape; protected PolygonDrawPanel pdp; private boolean shapeDrawn = false; double xFactor = 1, yFactor = 1; double lastWidth = -1, lastHeight = -1; Dimension previewDim; private boolean initializing; private int zoomFactor = 1; public static final int MAX_ZOOM = 10, MIN_ZOOM = -2; /** Creates new form JigSawEditor */ public HolesEditorPanel(Options options, Holes shaper, Dimension previewDim, Image img, BoxBase previewBb) { this.options = options; this.shaper = shaper; this.img = img; this.previewDim = previewDim; initializing = true; currentShape = shaper.getNumCells() + 1; previewArea = new Rectangle(img == null ? previewDim : new Dimension(img.getWidth(this), img.getHeight(this))); this.previewBb = previewBb; initMembers(); initComponents(); customizeComponents(); pdp = new PolygonDrawPanel(img == null ? (int) (previewDim.getWidth()) : img.getWidth(this), img == null ? ((int) previewDim.getHeight()) : img.getHeight(this), this, (img == null)); pdp.addPointListener(this); if (previewPanel != null) { ((PreviewPanel) previewPanel).vp.addMouseMotionListener(pdp); ((PreviewPanel) previewPanel).vp.addMouseListener(pdp); } initializing = false; shapeChanged(); } @Override public void setCursor(java.awt.Cursor c) { if (previewPanel != null) ((PreviewPanel) previewPanel).vp.setCursor(c); } public void setCursor(java.awt.Cursor c, boolean onlyPreviewPanel) { if (previewPanel != null) ((PreviewPanel) previewPanel).vp.setCursor(c); } class ShapeListModel extends AbstractListModel { public int getSize() { return shaper.shapeData.length; } public Object getElementAt(int index) { ShapeData sd = shaper.shapeData[index]; return (sd.comment == null || sd.comment.length() == 0) ? Integer.toString(index) : sd.comment; } public void switchShapes(int index1, int index2) { if (shaper != null && index1 >= 0 && index1 < shaper.shapeData.length && index2 >= 0 && index2 < shaper.shapeData.length) { // ... } } } private void initMembers() { listModel = new ShapeListModel(); listSelectionListener = new ListSelectionListener() { public void valueChanged(ListSelectionEvent ev) { if (ev.getValueIsAdjusting()) return; int v = shapesList.getSelectedIndex(); if (v != currentShape && v >= 0) { if (pdp.getNumShapes() > 0) pdp.endPolygon(true, false, v); if (v >= 0 && getHoles().getShapeData(v) != null) tfName.setText(getHoles().getShapeData(v).comment); else tfName.setText(""); setCurrentShapeNoList(v); } else tfName.setText(""); upBtn.setEnabled(v > 0); downBtn.setEnabled(v < shapesList.getModel().getSize() - 1); } }; } protected void confirmChanges() { pdp.endPolygon(); } protected void customizeComponents() { btShowDrawnPoints.setSelected(EditableShapeConstants.showDrawnPoints); btGrid.setSelected(EditableShapeConstants.gridWidth != -1); gridSizeEdit.setEnabled(btGrid.isSelected()); btMagnet.setSelected(EditableShapeConstants.pointsOnGrid); magnetRadiusEdit.setEnabled(btMagnet.isSelected()); btSelect.setSelected(true); } public void updateList() { initMembers(); shapesList.setModel(listModel); } protected void setCurrentShape(int v) { if (shapesList.getSelectedIndex() != v) shapesList.setSelectedIndex(v); btDelete.setEnabled(pdp.getNumShapes() > 0); updateTransformingButtons(); currentShape = v; } protected void setCurrentShapeNoList(int v) { currentShape = v; pdp.selectShape(v); btDelete.setEnabled(pdp.getNumShapes() > 0); ((PreviewPanel) previewPanel).updateView(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; bgMode = new javax.swing.ButtonGroup(); javax.swing.JPanel topPanel = new javax.swing.JPanel(); javax.swing.JToolBar tbTop1 = new javax.swing.JToolBar(); btShowDrawnPoints = new javax.swing.JToggleButton(); btShowDrawnPoints.addActionListener(this); javax.swing.JSeparator sept1 = new JToolBar.Separator(); btGrid = new javax.swing.JToggleButton(); btGrid.addActionListener(this); gridSizeEdit = new edu.xtec.jclic.beans.SmallIntEditor(); gridSizeEdit.addPropertyChangeListener(this); javax.swing.JSeparator sept2 = new JToolBar.Separator(); btDelete = new javax.swing.JButton(); btDelete.addActionListener(this); btCopy = new javax.swing.JButton(); btCopy.addActionListener(this); btPaste = new javax.swing.JButton(); btPaste.addActionListener(this); javax.swing.JSeparator sept3 = new JToolBar.Separator(); btMagnet = new javax.swing.JToggleButton(); btMagnet.addActionListener(this); magnetRadiusEdit = new edu.xtec.jclic.beans.SmallIntEditor(); magnetRadiusEdit.addPropertyChangeListener(this); javax.swing.JSeparator sept4 = new JToolBar.Separator(); javax.swing.JPanel zoomPanel = new javax.swing.JPanel(); javax.swing.JLabel zoomLb = new javax.swing.JLabel(); btZoomOut = new javax.swing.JButton(); btZoomOut.addActionListener(this); lbZoom = new javax.swing.JTextField(); btZoomIn = new javax.swing.JButton(); btZoomIn.addActionListener(this); javax.swing.JLabel spacerTop = new javax.swing.JLabel(); javax.swing.JSeparator sep0 = new javax.swing.JSeparator(); javax.swing.JPanel leftPanel = new javax.swing.JPanel(); javax.swing.JToolBar tbLeft1 = new javax.swing.JToolBar(); btSelect = new javax.swing.JToggleButton(); btSelect.addActionListener(this); btDivide = new javax.swing.JToggleButton(); btDivide.addActionListener(this); javax.swing.JSeparator sep1 = new JToolBar.Separator(); btRect = new javax.swing.JToggleButton(); btRect.addActionListener(this); btEllipse = new javax.swing.JToggleButton(); btEllipse.addActionListener(this); btPolygon = new javax.swing.JToggleButton(); btPolygon.addActionListener(this); btLine = new javax.swing.JButton(); btLine.addActionListener(this); btBezier = new javax.swing.JButton(); btBezier.addActionListener(this); btQuad = new javax.swing.JButton(); btQuad.addActionListener(this); javax.swing.JSeparator sep2 = new JToolBar.Separator(); btExpand = new javax.swing.JButton(); btExpand.addActionListener(this); btContract = new javax.swing.JButton(); btContract.addActionListener(this); javax.swing.JSeparator sep4 = new JToolBar.Separator(); btRotateRight = new javax.swing.JButton(); btRotateRight.addActionListener(this); btRotateLeft = new javax.swing.JButton(); btRotateLeft.addActionListener(this); javax.swing.JLabel spacerLeft = new javax.swing.JLabel(); javax.swing.JSplitPane splitPane = new javax.swing.JSplitPane(); previewPanel = new PreviewPanel(); previewPanel.addPropertyChangeListener(this); javax.swing.JPanel listPanel = new javax.swing.JPanel(); orderBtnPanel = new javax.swing.JPanel(); upBtn = new javax.swing.JButton(); downBtn = new javax.swing.JButton(); listScroll = new javax.swing.JScrollPane(); shapesList = new javax.swing.JList<>(); tfName = new javax.swing.JTextField(); tfName.addActionListener(this); setLayout(new java.awt.GridBagLayout()); topPanel.setLayout(new java.awt.GridBagLayout()); tbTop1.setFloatable(false); btShowDrawnPoints .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/vertex_off.gif"))); // NOI18N btShowDrawnPoints.setToolTipText(options.getMsg("edit_shape_showPoints_tooltip")); btShowDrawnPoints .setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/vertex_on.gif"))); // NOI18N tbTop1.add(btShowDrawnPoints); sept1.setOrientation(javax.swing.SwingConstants.VERTICAL); tbTop1.add(sept1); btGrid.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/grid.gif"))); // NOI18N btGrid.setToolTipText(options.getMsg("edit_shape_hideGrid")); tbTop1.add(btGrid); gridSizeEdit.setToolTipText(options.getMsg("edit_shape_gridSize_tooltip")); gridSizeEdit.setEditColumns(2); gridSizeEdit.setMax(50); gridSizeEdit.setMin(5); gridSizeEdit.setValue(10); gridSizeEdit.setValues(new int[] { 5, 10, 15, 20, 30, 50 }); tbTop1.add(gridSizeEdit); sept2.setOrientation(javax.swing.SwingConstants.VERTICAL); tbTop1.add(sept2); btDelete.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/delete.gif"))); // NOI18N btDelete.setToolTipText(options.getMsg("edit_shape_deletePoint")); btDelete.setMaximumSize(new java.awt.Dimension(32, 32)); btDelete.setMinimumSize(new java.awt.Dimension(32, 32)); tbTop1.add(btDelete); btCopy.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/copy.gif"))); // NOI18N btCopy.setToolTipText(options.getMsg("COPY")); tbTop1.add(btCopy); btPaste.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/paste.gif"))); // NOI18N btPaste.setToolTipText(options.getMsg("PASTE")); tbTop1.add(btPaste); sept3.setOrientation(javax.swing.SwingConstants.VERTICAL); tbTop1.add(sept3); btMagnet.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/imant.gif"))); // NOI18N btMagnet.setToolTipText(options.getMsg("edit_shape_aproxPoints")); tbTop1.add(btMagnet); magnetRadiusEdit.setToolTipText(options.getMsg("edit_shape_magnetRadius_tooltip")); magnetRadiusEdit.setEditColumns(2); magnetRadiusEdit.setMax(15); magnetRadiusEdit.setMin(1); magnetRadiusEdit.setValue(4); magnetRadiusEdit.setValues(new int[] { 1, 2, 4, 6, 10, 15 }); tbTop1.add(magnetRadiusEdit); sept4.setOrientation(javax.swing.SwingConstants.VERTICAL); tbTop1.add(sept4); zoomPanel.setOpaque(false); zoomPanel.setLayout(new javax.swing.BoxLayout(zoomPanel, javax.swing.BoxLayout.LINE_AXIS)); zoomLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/zoom.gif"))); // NOI18N zoomLb.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 3, 1, 3)); zoomPanel.add(zoomLb); btZoomOut.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/minus.gif"))); // NOI18N btZoomOut.setToolTipText(options.getMsg("edit_shape_zoomOut")); btZoomOut.setPreferredSize(new java.awt.Dimension(16, 16)); zoomPanel.add(btZoomOut); lbZoom.setColumns(3); lbZoom.setEditable(false); lbZoom.setHorizontalAlignment(javax.swing.JTextField.CENTER); lbZoom.setText("1x"); zoomPanel.add(lbZoom); btZoomIn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/plus.gif"))); // NOI18N btZoomIn.setToolTipText(options.getMsg("edit_shape_zoomIn")); btZoomIn.setPreferredSize(new java.awt.Dimension(16, 16)); zoomPanel.add(btZoomIn); tbTop1.add(zoomPanel); topPanel.add(tbTop1, new java.awt.GridBagConstraints()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.weightx = 1.0; topPanel.add(spacerTop, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(topPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sep0, gridBagConstraints); leftPanel.setLayout(new java.awt.GridBagLayout()); tbLeft1.setFloatable(false); tbLeft1.setOrientation(javax.swing.SwingConstants.VERTICAL); bgMode.add(btSelect); btSelect.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/selectionMode.gif"))); // NOI18N btSelect.setToolTipText(options.getMsg("edit_shape_select")); btSelect.setMaximumSize(new java.awt.Dimension(32, 32)); btSelect.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btSelect); bgMode.add(btDivide); btDivide.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/add_point.gif"))); // NOI18N btDivide.setToolTipText(options.getMsg("edit_shape_addPoint")); btDivide.setMaximumSize(new java.awt.Dimension(32, 32)); btDivide.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btDivide); tbLeft1.add(sep1); bgMode.add(btRect); btRect.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/rect.gif"))); // NOI18N btRect.setToolTipText(options.getMsg("edit_shape_drawRect")); btRect.setMaximumSize(new java.awt.Dimension(32, 32)); btRect.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btRect); bgMode.add(btEllipse); btEllipse.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/rodona.gif"))); // NOI18N btEllipse.setToolTipText(options.getMsg("edit_shape_drawEllipse")); btEllipse.setMaximumSize(new java.awt.Dimension(32, 32)); btEllipse.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btEllipse); bgMode.add(btPolygon); btPolygon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/pent.gif"))); // NOI18N btPolygon.setToolTipText(options.getMsg("edit_shape_drawPoly")); btPolygon.setMaximumSize(new java.awt.Dimension(32, 32)); btPolygon.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btPolygon); btLine.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/line.gif"))); // NOI18N btLine.setToolTipText(options.getMsg("edit_shape_toLine")); btLine.setMaximumSize(new java.awt.Dimension(32, 32)); btLine.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btLine); btBezier.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/bezier.gif"))); // NOI18N btBezier.setToolTipText(options.getMsg("edit_shape_toBezier")); btBezier.setMaximumSize(new java.awt.Dimension(32, 32)); btBezier.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btBezier); btQuad.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/quad.gif"))); // NOI18N btQuad.setToolTipText(options.getMsg("edit_shape_toQuad")); btQuad.setMaximumSize(new java.awt.Dimension(32, 32)); btQuad.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btQuad); tbLeft1.add(sep2); btExpand.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/expand.gif"))); // NOI18N btExpand.setToolTipText(options.getMsg("edit_shape_expand")); tbLeft1.add(btExpand); btContract.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/contract.gif"))); // NOI18N btContract.setToolTipText(options.getMsg("edit_shape_contract")); tbLeft1.add(btContract); tbLeft1.add(sep4); btRotateRight .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/rotate_right.gif"))); // NOI18N btRotateRight.setToolTipText(options.getMsg("edit_shape_rRight")); tbLeft1.add(btRotateRight); btRotateLeft .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/rotate_left.gif"))); // NOI18N btRotateLeft.setToolTipText(options.getMsg("edit_shape_rLeft")); tbLeft1.add(btRotateLeft); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; leftPanel.add(tbLeft1, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.weighty = 1.0; leftPanel.add(spacerLeft, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(leftPanel, gridBagConstraints); splitPane.setResizeWeight(1.0); previewPanel.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); previewPanel.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); splitPane.setLeftComponent(previewPanel); listPanel.setLayout(new java.awt.BorderLayout(10, 8)); upBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/up.gif"))); upBtn.setToolTipText(options.getMsg("edit_list_upBtn_tooltip")); upBtn.setEnabled(false); upBtn.setPreferredSize(new java.awt.Dimension(16, 16)); upBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { upBtnActionPerformed(evt); } }); orderBtnPanel.add(upBtn); downBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/down.gif"))); downBtn.setToolTipText(options.getMsg("edit_list_downBtn_tooltip")); downBtn.setEnabled(false); downBtn.setPreferredSize(new java.awt.Dimension(16, 16)); downBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { downBtnActionPerformed(evt); } }); orderBtnPanel.add(downBtn); listPanel.add(orderBtnPanel, java.awt.BorderLayout.NORTH); listScroll.setToolTipText(options.getMsg("edit_shape_elements")); listScroll.setPreferredSize(new java.awt.Dimension(80, 100)); shapesList.setModel(listModel); shapesList.addListSelectionListener(listSelectionListener); listScroll.setViewportView(shapesList); listPanel.add(listScroll, java.awt.BorderLayout.CENTER); tfName.setToolTipText(options.getMsg("edit_shape_elemName")); listPanel.add(tfName, java.awt.BorderLayout.SOUTH); splitPane.setRightComponent(listPanel); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(splitPane, gridBagConstraints); } // //GEN-END:initComponents private void upBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_upBtnActionPerformed if (listModel != null) { int sel = shapesList.getSelectedIndex(); if (sel > 0 && sel < listModel.getSize() - 1) { listModel.switchShapes(sel, sel - 1); shapesList.setSelectedIndex(sel - 1); modified = true; repaint(0); } } } // GEN-LAST:event_upBtnActionPerformed private void downBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_downBtnActionPerformed if (listModel != null) { int sel = shapesList.getSelectedIndex(); if (sel >= 0 && sel < listModel.getSize() - 2) { listModel.switchShapes(sel, sel + 1); shapesList.setSelectedIndex(sel + 1); modified = true; repaint(0); } } } // GEN-LAST:event_downBtnActionPerformed private void setDrawingRectangleMode() { deselectAll(); btRect.setSelected(true); pdp.setDrawingMode(PolygonDrawPanel.DRAWING_RECT); pdp.deSelectAll(); repaint(0); } private void deselectAll() { pdp.cancelCurrentOperations(); btSelect.setSelected(false); btRect.setSelected(false); btEllipse.setSelected(false); btPolygon.setSelected(false); btBezier.setSelected(false); btQuad.setSelected(false); btDivide.setSelected(false); } public void setDrawingMode(int drawingMode) { pdp.setDrawingMode(drawingMode); switch (drawingMode) { case PolygonDrawPanel.SELECTING: btSelect.setSelected(true); break; case PolygonDrawPanel.NEW_POINT: btDivide.setSelected(true); break; } btDelete.setEnabled(pdp.getNumShapes() > 0); } public void shapeChanged() { if (pdp.getNumShapes() > 0) { // Ja no podem crear un rectangle o el.lipse btDelete.setEnabled(true); shapeDrawn = true; repaint(0); } else { btDelete.setEnabled(pdp.hasSelectedPoint()); clean(); } if (!btDivide.isSelected()) { pdp.setDrawingMode(PolygonDrawPanel.SELECTING); deselectAll(); btSelect.setSelected(true); } else btSelect.setSelected(false); updateTransformingButtons(); } protected void updateTransformingButtons() { List v = pdp.getSelectedShapes(); if (v.size() == 1) { EditableShape shape = v.get(0); // El te segur: size==1 if (!(shape instanceof EditableRectangle)) { btBezier.setEnabled(true); btQuad.setEnabled(true); } if (!(shape instanceof EditableEllipse2D)) btLine.setEnabled(true); } else { btBezier.setEnabled(false); btQuad.setEnabled(false); btLine.setEnabled(false); repaint(0); } } public JComponent getPreviewPanel() { return previewPanel; } private void clean() { pdp.deleteSelected(false); shapeDrawn = false; deselectAll(); btRect.setEnabled(true); btEllipse.setEnabled(true); btPolygon.setEnabled(true); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup bgMode; private javax.swing.JButton btBezier; private javax.swing.JButton btContract; private javax.swing.JButton btCopy; private javax.swing.JButton btDelete; private javax.swing.JToggleButton btDivide; private javax.swing.JToggleButton btEllipse; private javax.swing.JButton btExpand; private javax.swing.JToggleButton btGrid; private javax.swing.JButton btLine; private javax.swing.JToggleButton btMagnet; private javax.swing.JButton btPaste; private javax.swing.JToggleButton btPolygon; private javax.swing.JButton btQuad; private javax.swing.JToggleButton btRect; private javax.swing.JButton btRotateLeft; private javax.swing.JButton btRotateRight; private javax.swing.JToggleButton btSelect; private javax.swing.JToggleButton btShowDrawnPoints; private javax.swing.JButton btZoomIn; private javax.swing.JButton btZoomOut; private javax.swing.JButton downBtn; private edu.xtec.jclic.beans.SmallIntEditor gridSizeEdit; private javax.swing.JTextField lbZoom; private javax.swing.JScrollPane listScroll; private edu.xtec.jclic.beans.SmallIntEditor magnetRadiusEdit; private javax.swing.JPanel orderBtnPanel; private javax.swing.JScrollPane previewPanel; private javax.swing.JList shapesList; private javax.swing.JTextField tfName; private javax.swing.JButton upBtn; // End of variables declaration//GEN-END:variables public void updateView() { ((PreviewPanel) previewPanel).updateView(); } class PreviewPanel extends JScrollPane { public VP vp; public PreviewPanel() { vp = new VP(); setViewportView(vp); updateView(); } public void updateView() { vp.updateView(); } } class VP extends JPanel { private int xBak = -1, yBak = -1, wBak = -1, hBak = -1; List shapes; VP() { this.shapes = new ArrayList(); } public void updateView() { setSize(getSize()); setPreferredSize(getSize()); updateComponentsView(); } public void updateComponentsView() { shapes.clear(); for (int i = 0; i < shaper.getNumCells(); i++) { shapes.add(shaper.getShape(i, previewArea)); } if (pdp != null) pdp.updateView(); super.updateUI(); repaint(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(Constants.DEFAULT_RENDERING_HINTS); Color defaultBgColor = g2.getBackground(); Color defaultColor = g2.getColor(); g2.setColor(previewBb.backColor); g2.fill(previewArea); g2.setBackground(previewBb.backColor); g2.setColor(previewBb.borderColor); Stroke defaultStroke = g2.getStroke(); g2.setStroke(previewBb.getBorder()); if (img != null) { g2.drawImage(img, previewArea.x, previewArea.y, previewArea.width, previewArea.height, this); } pdp.drawGrid(g, EditableShapeConstants.gridWidth); g2.setColor(Color.black); for (int i = 0; i < shapes.size(); i++) { if (i != currentShape) g2.draw((Shape) shapes.get(i)); } g2.setColor(Color.red); pdp.paint(g2); g2.setStroke(defaultStroke); g2.setColor(defaultColor); g2.setBackground(defaultBgColor); g2.setRenderingHints(rh); } protected void drawBorder(Graphics g, Color c) { g.setColor(c); g.fillRect(0, 0, (int) previewArea.getX(), getHeight()); } @Override public void doLayout() { previewArea.x = (getBounds().width - previewArea.width) / 2; previewArea.y = (getBounds().height - previewArea.height) / 2; if (previewArea.x != xBak || previewArea.y != yBak || previewArea.width != wBak || previewArea.height != hBak) { xBak = previewArea.x; yBak = previewArea.y; wBak = previewArea.width; hBak = previewArea.height; pdp.initDrawnBorders(); } updateComponentsView(); } @Override public Dimension getSize() { return new Dimension(previewArea.x + (int) previewArea.getBounds().getWidth(), previewArea.y + (int) previewArea.getBounds().getHeight()); } } public Holes getHoles() { return shaper; } public Rectangle getPreviewArea() { return previewArea; } public void setPreviewArea(Rectangle r) { previewArea = r; } public int getNumShapes() { return shaper.getNumCells(); } public static Shaper getShaper(Shaper initialShaper, Component parent, Options options, Dimension dim, Image img, BoxBase bb) { Messages msg = options.getMessages(); if (initialShaper == null || !(initialShaper instanceof Holes)) return null; Holes sh; try { sh = (Holes) initialShaper.clone(); } catch (CloneNotSupportedException ex) { msg.showErrorWarning(parent, "edit_act_shaper_err", ex); return null; } HolesEditorPanel he = new HolesEditorPanel(options, sh, dim, img, bb); boolean b = msg.showInputDlg(parent, he, "edit_act_shaper_properties"); if (b) he.confirmChanges(); return b ? sh : null; } public void updatePreviewArea(double xFactor, double yFactor) { if (lastWidth != -1) { lastWidth *= xFactor; lastHeight *= yFactor; } else { lastWidth = previewArea.getWidth() * xFactor; lastHeight = previewArea.getHeight() * yFactor; } this.xFactor *= xFactor; this.yFactor *= yFactor; previewArea = new Rectangle(new Dimension((int) (lastWidth), (int) (lastHeight))); updateView(); } public void incDrawingArea(double incWidth, double incHeight) { modifyDrawingArea(previewArea.width + incWidth, previewArea.height + incHeight); } protected void modifyDrawingArea(double newWidth, double newHeight) { if (newWidth > 0 && newHeight > 0) { double xFactorMod = newWidth / previewArea.width; double yFactorMod = newHeight / previewArea.height; for (int i = 0; i < shaper.getNumCells(); i++) { ShapeData sd = shaper.getShapeData(i); sd.scaleTo(xFactorMod, yFactorMod); } previewArea.setSize((int) newWidth, (int) newHeight); previewDim.setSize(previewArea.getSize()); shaper.scaleW = newWidth; shaper.scaleH = newHeight; updateView(); } } public void pointMoved(java.awt.geom.Point2D p) { } public void actionPerformed(java.awt.event.ActionEvent actionEvent) { if (!initializing && actionEvent != null) { Object obj = actionEvent.getSource(); if (obj == btDivide) { deselectAll(); requestFocus(); btDivide.setSelected(true); pdp.setDrawingMode(PolygonDrawPanel.NEW_POINT); pdp.deSelectAll(); repaint(0); } else if (obj == btDelete) { clean(); shapeChanged(); repaint(0); } else if (obj == btEllipse) { requestFocus(); pdp.setDrawingMode(PolygonDrawPanel.DRAWING_ELLIPSE); } else if (obj == btRect) { requestFocus(); pdp.setDrawingMode(PolygonDrawPanel.DRAWING_RECT); } else if (obj == btLine) { requestFocus(); pdp.convertToLine(); repaint(0); } else if (obj == btBezier) { requestFocus(); pdp.convertToBezier(); repaint(0); } else if (obj == btQuad) { requestFocus(); pdp.convertToQuad(); repaint(0); } else if (obj == btPolygon) { requestFocus(); pdp.setDrawingMode(PolygonDrawPanel.DRAWING_POLYGON); } else if (obj == btSelect) { requestFocus(); pdp.setDrawingMode(PolygonDrawPanel.SELECTING); } else if (obj == btShowDrawnPoints) { EditableShapeConstants.showDrawnPoints = btShowDrawnPoints.isSelected(); repaint(0); } else if (obj == btGrid) { EditableShapeConstants.gridWidth = btGrid.isSelected() ? gridSizeEdit.getValue() : -1; gridSizeEdit.setEnabled(btGrid.isSelected()); repaint(); } else if (obj == btMagnet) { EditableShapeConstants.pointsOnGrid = btMagnet.isSelected(); magnetRadiusEdit.setEnabled(btMagnet.isSelected()); repaint(0); } else if (obj == btRotateRight) { pdp.rotate(ROTATE_UNIT, false, false); } else if (obj == btRotateLeft) { pdp.rotate(-ROTATE_UNIT, false, false); } else if (obj == btExpand) { pdp.scale(EditableShapeConstants.scaleXFactor, EditableShapeConstants.scaleYFactor, false, false); } else if (obj == btContract) { if (EditableShapeConstants.scaleXFactor != 0 && EditableShapeConstants.scaleYFactor != 0) pdp.scale(1 / EditableShapeConstants.scaleXFactor, 1 / EditableShapeConstants.scaleYFactor, false, false); } else if (obj == btZoomIn) { doZoom(true); } else if (obj == btZoomOut) { doZoom(false); } else if (obj == btCopy) { pdp.copy(false); updateView(); } else if (obj == btPaste) { pdp.endPolygon(); pdp.paste(); updateView(); } else if (obj == tfName) { ShapeData sd; if (currentShape >= 0) { sd = getHoles().getShapeData(currentShape); String txt = tfName.getText().trim(); // Potser caldria comprovar que no estigui repetit el nom if (sd != null && txt.length() > 0) sd.comment = txt; updateList(); } } } } public void propertyChange(java.beans.PropertyChangeEvent ev) { if (!initializing && ev != null) { Object obj = ev.getSource(); if (obj == gridSizeEdit) { int v = btGrid.isSelected() ? gridSizeEdit.getValue() : -1; if (v != EditableShapeConstants.gridWidth) { EditableShapeConstants.gridWidth = v; repaint(); } } else if (obj == magnetRadiusEdit) { int v = magnetRadiusEdit.getValue() * 2; if (v != EditableShapeConstants.selectLength) { EditableShapeConstants.selectLength = v; pdp.initDrawnBorders(); repaint(); } } else if (obj == previewPanel) { repaint(0); } } } protected void doZoom(boolean in) { double zoomDelta = 1.0; if (in) { if (zoomFactor < MAX_ZOOM) { if (zoomFactor >= 1) { zoomDelta = ((double) zoomFactor + 1) / zoomFactor; } else { double den = Math.abs(zoomFactor - 2); zoomDelta = (1 / (den - 1)) / (1 / den); } zoomFactor++; } } else { if (zoomFactor > MIN_ZOOM) { if (zoomFactor > 1) { zoomDelta = ((double) zoomFactor - 1) / zoomFactor; } else { double den = Math.abs(zoomFactor - 2); zoomDelta = (1 / (den + 1)) / (1 / den); } zoomFactor--; } } if (zoomDelta != 1) { pdp.endPolygon(); updatePreviewArea(zoomDelta, zoomDelta); } btZoomIn.setEnabled(zoomFactor < MAX_ZOOM); btZoomOut.setEnabled(zoomFactor > MIN_ZOOM); String sFactor = (zoomFactor >= 1) ? Integer.toString(zoomFactor) : ("1/" + Math.abs(zoomFactor - 2)); lbZoom.setText(sFactor + "x"); } } src/author/edu/xtec/jclic/shapers/JigSawEditorPanel.form000066400000000000000000000220111335566474600236370ustar00rootroot00000000000000
src/author/edu/xtec/jclic/shapers/JigSawEditorPanel.java000066400000000000000000000220571335566474600236270ustar00rootroot00000000000000/* * File : JigSawEditor.java * Created : 03-dec-2002 10:03 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import edu.xtec.jclic.Constants; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Stroke; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class JigSawEditorPanel extends javax.swing.JPanel { Options options; JigSaw shaper; Image img; Rectangle previewArea; BoxBase previewBb; boolean modified; static final int MARGIN = 40; /** Creates new form JigSawEditor */ public JigSawEditorPanel(Options options, JigSaw shaper, Dimension previewDim, Image img, BoxBase previewBb) { this.options = options; this.shaper = shaper; this.img = img; previewArea = new Rectangle(img == null ? previewDim : new Dimension(img.getWidth(this), img.getHeight(this))); this.previewBb = previewBb; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel toothWidthLb; javax.swing.JLabel toothHeightLb; java.awt.GridBagConstraints gridBagConstraints; controlPanel = new javax.swing.JPanel(); toothHeightLb = new javax.swing.JLabel(); toothHeightSlider = new javax.swing.JSlider(); toothWidthLb = new javax.swing.JLabel(); toothWidthSlider = new javax.swing.JSlider(); randomChk = new javax.swing.JCheckBox(); previewPanel = new PreviewPanel(); setLayout(new java.awt.BorderLayout()); controlPanel.setLayout(new java.awt.GridBagLayout()); toothHeightLb.setText(options.getMsg("edit_act_toothHeightFactor")); toothHeightLb.setLabelFor(toothHeightSlider); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(toothHeightLb, gridBagConstraints); toothHeightSlider.setMinorTickSpacing(5); toothHeightSlider.setPaintLabels(true); toothHeightSlider.setPaintTicks(true); toothHeightSlider.setMajorTickSpacing(25); toothHeightSlider.setMaximum(50); toothHeightSlider.setValue((int) (shaper.toothHeightFactor * 50 / shaper.getBaseFactor() * 100)); toothHeightSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { toothHeightSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(toothHeightSlider, gridBagConstraints); toothWidthLb.setText(options.getMsg("edit_act_toothWidthFactor")); toothWidthLb.setLabelFor(toothWidthSlider); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(toothWidthLb, gridBagConstraints); toothWidthSlider.setMinorTickSpacing(5); toothWidthSlider.setPaintLabels(true); toothWidthSlider.setPaintTicks(true); toothWidthSlider.setMajorTickSpacing(25); toothWidthSlider.setValue((int) (shaper.baseWidthFactor * 100)); toothWidthSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { toothWidthSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(toothWidthSlider, gridBagConstraints); randomChk.setSelected(shaper.randomLines); randomChk.setText(options.getMsg("edit_act_toothRandom")); randomChk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { randomChkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(randomChk, gridBagConstraints); add(controlPanel, java.awt.BorderLayout.NORTH); previewPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_act_preview"))); previewPanel.setPreferredSize(new Dimension(previewArea.width + MARGIN, previewArea.height + MARGIN)); add(previewPanel, java.awt.BorderLayout.CENTER); } // GEN-END:initComponents private void toothHeightSliderStateChanged(javax.swing.event.ChangeEvent evt) { // GEN-FIRST:event_toothHeightSliderStateChanged shaper.toothHeightFactor = ((double) toothHeightSlider.getValue() * shaper.getBaseFactor() / 50) / 100; ((PreviewPanel) previewPanel).updateView(); } // GEN-LAST:event_toothHeightSliderStateChanged private void toothWidthSliderStateChanged(javax.swing.event.ChangeEvent evt) { // GEN-FIRST:event_toothWidthSliderStateChanged shaper.baseWidthFactor = ((double) toothWidthSlider.getValue()) / 100; ((PreviewPanel) previewPanel).updateView(); } // GEN-LAST:event_toothWidthSliderStateChanged private void randomChkActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_randomChkActionPerformed shaper.randomLines = randomChk.isSelected(); ((PreviewPanel) previewPanel).updateView(); } // GEN-LAST:event_randomChkActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox randomChk; private javax.swing.JSlider toothHeightSlider; private javax.swing.JPanel controlPanel; private javax.swing.JPanel previewPanel; private javax.swing.JSlider toothWidthSlider; // End of variables declaration//GEN-END:variables class PreviewPanel extends JPanel { List shapes; PreviewPanel() { this.shapes = new ArrayList(); } public void updateView() { shapes.clear(); shaper.reset(); for (int i = 0; i < shaper.getNumCells(); i++) { shapes.add(shaper.getShape(i, previewArea)); } repaint(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(Constants.DEFAULT_RENDERING_HINTS); Color defaultBgColor = g2.getBackground(); Color defaultColor = g2.getColor(); g2.setColor(previewBb.backColor); g2.fill(previewArea); g2.setBackground(previewBb.backColor); g2.setColor(previewBb.borderColor); Stroke defaultStroke = g2.getStroke(); g2.setStroke(previewBb.getBorder()); if (img != null) g2.drawImage(img, previewArea.x, previewArea.y, this); for (int i = 0; i < shapes.size(); i++) g2.draw((Shape) shapes.get(i)); g2.setStroke(defaultStroke); g2.setColor(defaultColor); g2.setBackground(defaultBgColor); g2.setRenderingHints(rh); } @Override public void doLayout() { previewArea.x = (getBounds().width - previewArea.width) / 2; previewArea.y = (getBounds().height - previewArea.height) / 2; updateView(); } } public static Shaper getShaper(Shaper initialShaper, Component parent, Options options, Dimension dim, Image img, BoxBase bb) { Messages msg = options.getMessages(); if (initialShaper == null || !(initialShaper instanceof JigSaw)) return null; JigSaw sh; try { sh = (JigSaw) initialShaper.clone(); } catch (CloneNotSupportedException ex) { msg.showErrorWarning(parent, "edit_act_shaper_err", ex); return null; } JigSawEditorPanel jse = new JigSawEditorPanel(options, sh, dim, img, bb); boolean b = msg.showInputDlg(parent, jse, "edit_act_shaper_properties"); return b ? sh : null; } } src/author/edu/xtec/jclic/shapers/PointListener.java000066400000000000000000000017351335566474600231130ustar00rootroot00000000000000/* * File : PointListener.java * Created : 26-feb-2002 09:57 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; /** * @author allastar * @version */ public interface PointListener { public void pointMoved(java.awt.geom.Point2D p); public void shapeChanged(); } src/author/edu/xtec/jclic/shapers/PolygonDrawPanel.java000066400000000000000000001510341335566474600235370ustar00rootroot00000000000000/* * File : PolygonDrawPanel.java * Created : 17-may-2002 10:20 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import edu.xtec.util.StrUtils; import java.awt.Cursor; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.Shape; import java.awt.Toolkit; import java.awt.event.*; import java.awt.geom.*; import java.util.ArrayList; import java.util.List; import javax.swing.JComponent; /** * @author allastar * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class PolygonDrawPanel implements java.awt.event.MouseMotionListener, java.awt.event.MouseListener { // List containing the polygon currently being modified private List vShapes; private static List vCopied; private List vRedrawingLines, vRedrawingLinesBeforeModify, vShapeBeforeModify; private List vPointListeners; private double iniX, iniY, finX, finY, lastFinX, lastFinY; private Point2D iniPoint = null, lastPoint = null; private boolean bSelectedPoint = false; private double zoomX = 0, zoomY = 0, zoomH = -1, zoomW = -1; private boolean creatingRect = false, creatingEllipse = false, creatingPolygon = false, bRedrawingLines = false, bSelectingArea = false; private boolean bResizing = false; private int resizingDirection = NO_RESIZING; private boolean bSpecialLine = false; private boolean bMoving = false; private EditableShape specialLine = null; private int drawingMode = SELECTING; static double defaultSensibility = 1.5; private AffineTransform at; private List vDrawnBorders = null; private Shape current = null; private JComponent container; private short INITIAL = 0; private short END = 1; public static final int SELECTING = 1; public static final int MOVING = 2; public static final int NEW_POINT = 4; public static final int DRAWING_RECT = 5; public static final int DRAWING_ELLIPSE = 6; public static final int DRAWING_POLYGON = 7; public static final int ZOOM = 12; public static final int NO_RESIZING = -1; public static final int EAST = 0; public static final int SOUTH = 1; public static final int SOUTH_EAST = 2; private int backgroundComposite = 0; protected HolesEditorPanel hep; protected boolean canResize; protected Rectangle lastPreviewArea; static Cursor[] cursors = null; public static final int PEN_CURSOR = 0; public static final int CIRCLE_CURSOR = 1; protected Shape esborram = null; /** Creates new PolygonDrawPanel */ public PolygonDrawPanel(int width, int height, HolesEditorPanel hep, boolean canResize) { this.hep = hep; this.canResize = canResize; vShapes = new ArrayList(); if (vCopied == null) vCopied = new ArrayList(); vRedrawingLines = new ArrayList(); vRedrawingLinesBeforeModify = new ArrayList(); vPointListeners = new ArrayList(); at = new AffineTransform(); initDrawnBorders(); if (cursors == null) { cursors = new Cursor[2]; Toolkit tk = Toolkit.getDefaultToolkit(); cursors[PEN_CURSOR] = tk.createCustomCursor( edu.xtec.util.ResourceManager.getImageIcon("cursors/llapis.gif").getImage(), new Point(12, 24), "pen"); cursors[CIRCLE_CURSOR] = tk.createCustomCursor( edu.xtec.util.ResourceManager.getImageIcon("cursors/cercle.gif").getImage(), new Point(16, 16), "circle"); } hep.addKeyListener(new PolygonDrawPanel.KeyHandler()); } public void setDrawingMode(int drawingMode) { if (this.drawingMode != drawingMode) { this.drawingMode = drawingMode; if (creatingPolygon) joinPolygon(); if (drawingMode != NEW_POINT && drawingMode != SELECTING) { endPolygon(); } hep.repaint(0); } } public int getVisibleWidth() { return hep.getPreviewPanel().getWidth(); } public int getVisibleHeight() { return hep.getPreviewPanel().getHeight(); } public void initDrawnBorders() { if (vDrawnBorders != null) vDrawnBorders.clear(); else vDrawnBorders = new ArrayList(); for (int i = 0; i < hep.getNumShapes(); i++) { if (i != hep.currentShape) { Shape s = hep.getHoles().getShape(i, hep.previewArea); if (s != null) vDrawnBorders.addAll(getBorders(s)); } } } private List getBorders(Shape s) { // Utility function that returns the points that define the "segments" of the // polygon 's'. int xIni = 0; int yIni = 0; if (s == null) return null; List vPoints = new ArrayList(); double x, y; if (s instanceof GeneralPath) { GeneralPath gp = (GeneralPath) s; PathIterator it = gp.getPathIterator(new AffineTransform()); double[] coords = new double[6]; while (!it.isDone()) { int type = it.currentSegment(coords); switch (type) { case PathIterator.SEG_MOVETO: x = coords[0]; y = coords[1]; vPoints.add(new Rectangle((int) (x + xIni) - (EditableShapeConstants.selectLength / 2), (int) (y + yIni) - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength)); break; case PathIterator.SEG_LINETO: x = coords[0]; y = coords[1]; vPoints.add(new Rectangle((int) (x + xIni) - (EditableShapeConstants.selectLength / 2), (int) (y + yIni) - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength)); break; case PathIterator.SEG_CUBICTO: x = coords[4]; y = coords[5]; vPoints.add(new Rectangle((int) (x + xIni) - (EditableShapeConstants.selectLength / 2), (int) (y + yIni) - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength)); break; case PathIterator.SEG_QUADTO: x = coords[2]; y = coords[3]; vPoints.add(new Rectangle((int) (x + xIni) - (EditableShapeConstants.selectLength / 2), (int) (y + yIni) - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength)); break; case PathIterator.SEG_CLOSE: break; default: } it.next(); } } return vPoints; } public void paint(java.awt.Graphics2D g) { Graphics2D g2d = (Graphics2D) g; if (EditableShapeConstants.showDrawnPoints) paintDrawnBorders(g); for (EditableShape esh : vShapes) { if (bSpecialLine && esh == specialLine) esh.paintWithColor(g, drawingMode, EditableShapeConstants.CUT_COLOR); else esh.paintWithColor(g, drawingMode, EditableShapeConstants.ACTIVE_COLOR); } if (bMoving) paintMoved(g); if (creatingRect) { g.setColor(EditableShapeConstants.selectedColor); EditableRectangle rect = new EditableRectangle((int) iniX, (int) iniY, (int) (finX - iniX), (int) (finY - iniY)); rect.paintWithColor(g, drawingMode, EditableShapeConstants.selectedColor); } if (creatingEllipse) { g.setColor(EditableShapeConstants.selectedColor); EditableEllipse2D ellipse = new EditableEllipse2D((int) iniX, (int) iniY, (int) (finX - iniX), (int) (finY - iniY)); ellipse.paintWithColor(g, drawingMode, EditableShapeConstants.selectedColor); } if (creatingPolygon) { if (lastPoint != null) { EditableLine2D el = new EditableLine2D(lastPoint.getX(), lastPoint.getY(), finX, finY); el.paintWithColor(g, drawingMode, EditableShapeConstants.selectedColor); } } } public void drawGrid(java.awt.Graphics g, int gridWidth) { if (gridWidth <= 1) return; int width = (int) (hep.previewArea.getWidth()); int height = (int) (hep.previewArea.getHeight()); g.setColor(EditableShapeConstants.gridColor); for (double i = hep.previewArea.x; i <= hep.previewArea.x + width; i += (gridWidth * hep.xFactor)) { // from 0 in order to avoid changes in the location of the grid when zoomed // vertical g.drawLine((int) i, hep.previewArea.y, (int) i, (int) (hep.previewArea.y + height)); } for (double i = hep.previewArea.y; i <= hep.previewArea.y + height; i += (gridWidth * hep.yFactor)) { // horitzontal g.drawLine(hep.previewArea.x, (int) i, (int) (hep.previewArea.x + width), (int) i); } } protected void paintDrawnBorders(java.awt.Graphics2D g) { for (Rectangle r : vDrawnBorders) { double x = r.getX(); double y = r.getY(); double w = r.getWidth(); double h = r.getHeight(); x = x + (w / 4); y = y + (h / 4); w = w / 2; h = h / 2; g.setColor(EditableShapeConstants.DRAWN_BORDER_COLOR); g.fillRect((int) x, (int) y, (int) w, (int) h); } } private void paintMoved(java.awt.Graphics2D g) { for (EditableShape esh : vCopied) { EditableShape copied = (EditableShape) esh.clone(); copied.transform(AffineTransform.getTranslateInstance(finX - iniX, finY - iniY)); copied.paintWithColor(g, drawingMode, EditableShapeConstants.movingColor); } } public void updateView() { List v = getGeneralPath(); if (lastPreviewArea == null) lastPreviewArea = hep.previewArea; if (v.size() > 0) { move(hep.previewArea.x - lastPreviewArea.x, hep.previewArea.y - lastPreviewArea.y, false, false); } try { lastPreviewArea = (Rectangle) (hep.previewArea.clone()); } catch (Exception e) { System.err.println("Error updating view:\n" + e); } } public void setShapeData(ShapeData sd, double x, double y, double scaleX, double scaleY) { // x,y indicate the current position clean(); current = (sd != null) ? sd.getShape(hep.previewArea) : null; double firstX = -1, firstY = -1; if (sd != null && sd.primitiveType >= 0 && sd.primitivePoints != null && sd.primitivePoints.length > 3) { EditableShape es; double xTr = (sd.primitivePoints[0] * hep.previewArea.getWidth()) + hep.previewArea.getX(); double yTr = (sd.primitivePoints[1] * hep.previewArea.getHeight()) + hep.previewArea.getY(); double wSc = sd.primitivePoints[2] * hep.previewArea.getWidth(); double hSc = sd.primitivePoints[3] * hep.previewArea.getHeight(); switch (sd.primitiveType) { case ShapeData.RECTANGLE: es = new EditableRectangle((int) xTr, (int) yTr, (int) wSc, (int) hSc); vShapes.add(es); break; case ShapeData.ELLIPSE: es = new EditableEllipse2D((int) xTr, (int) yTr, (int) wSc, (int) hSc); vShapes.add(es); break; } } else if (sd != null) { Shape s = sd.getShape(hep.previewArea); if (s instanceof GeneralPath) { GeneralPath gp = (GeneralPath) s; PathIterator it = gp.getPathIterator(new AffineTransform()); double[] coords = new double[6]; while (!it.isDone()) { int type = it.currentSegment(coords); switch (type) { case PathIterator.SEG_MOVETO: x = coords[0]; y = coords[1]; if (firstX == -1) { // Too close firstX = x; firstY = y; } break; case PathIterator.SEG_LINETO: vShapes.add(new EditableLine2D(x, y, coords[0], coords[1])); x = coords[0]; y = coords[1]; break; case PathIterator.SEG_CUBICTO: vShapes .add(new EditableCubicCurve2D(x, y, coords[0], coords[1], coords[2], coords[3], coords[4], coords[5])); x = coords[4]; y = coords[5]; break; case PathIterator.SEG_QUADTO: vShapes.add(new EditableQuadCurve2D(x, y, coords[0], coords[1], coords[2], coords[3])); x = coords[2]; y = coords[3]; break; case PathIterator.SEG_CLOSE: if (firstX != -1 && (x != firstX || y != firstY)) { vShapes.add(new EditableLine2D(x, y, firstX, firstY)); x = firstX; y = firstY; } break; default: break; } it.next(); } if (firstX != -1 && (x != firstX || y != firstY)) { // That's to be sure that the shape is always closed vShapes.add(new EditableLine2D(x, y, firstX, firstY)); } } } removeDrawnBorders(sd); } public void clean() { vShapes = new ArrayList(); vRedrawingLines = new ArrayList(); vRedrawingLinesBeforeModify = new ArrayList(); } public boolean selectDrawnShape(Point2D p) { endPolygon(); for (int i = 0; i < hep.getNumShapes(); i++) { Shape s = hep.getHoles().getShape(i, hep.previewArea); if (s.contains(p) && hep.currentShape != i) { hep.setCurrentShape(i); setShapeData(hep.getHoles().getShapeData(i), 0, 0, 1, 1); return true; } } hep.setCurrentShape(hep.getHoles().getNumCells() + 1); clean(); return false; } public void selectShape(int iIndex) { if (iIndex < 0) return; ShapeData sd = hep.getHoles().getShapeData(iIndex); if (sd != null) { setShapeData(sd, 0, 0, 1, 1); } } private EditableShape aproximationToLine(double x, double y) { return aproximationToLine(x, y, null); } private EditableShape aproximationToLine(double x, double y, List vRedrawingLines) { // returns an EditableShape when there is a corner at (x,y) that not belongs to // the lines in the Rectangle List vRedrawingLines. Otherwise returns null if (vRedrawingLines != null) { for (EditableShape esh : vRedrawingLines) { if (!vRedrawingLines.contains(esh)) { if (esh.hasClickedBorder((int) x, (int) y, false)) { return esh; } } } } return null; } private Point2D getTransformedPoint(Point2D p, boolean mustBeOnGrid) { // mustBeOnGrid is used to discard the approach Point2D mousePoint = new Point2D.Double(p.getX(), p.getY()); if (EditableShapeConstants.gridWidth != -1 && EditableShapeConstants.pointsOnGrid && mustBeOnGrid) moveToGrid(mousePoint); return mousePoint; } private void moveToGrid(Point2D p) { // Moves the supplied point to the closest grid point int x = (int) p.getX(); int y = (int) p.getY(); x -= hep.previewArea.getX(); y -= hep.previewArea.getY(); double wd = EditableShapeConstants.gridWidth * hep.xFactor; int w = (int) wd; if (w == -1) return; int xLeft = (int) (((int) (x / wd)) * wd); if ((x - xLeft) < (w / 2)) x = xLeft; else x = (int) (((int) ((x + w - 1) / wd)) * wd); int yUp = (int) (((int) (y / wd)) * wd); if ((y - yUp) < (w / 2)) y = yUp; else y = (int) (((int) ((y + w - 1) / wd)) * wd); x += hep.previewArea.getX(); y += hep.previewArea.getY(); p.setLocation(x, y); } public Point2D aproximationToDrawnBorder(double x, double y) { // Returns true if a rectangle in vDrawnBorders contains the point (x,y) for (Rectangle2D r : vDrawnBorders) { if (r.contains(x, y)) return new Point2D.Double(r.getX() + (r.getWidth() / 2), r.getY() + (r.getHeight() / 2)); } return null; } protected void redrawingLines(double x, double y) { // moves all the selected shapes containing (x,y) in one of its corners for (EditableShape esh : vRedrawingLines) esh.changeBorder(x, y); } private void cleanZoom() { zoomX = 0; zoomY = 0; zoomW = -1; zoomH = -1; at = new AffineTransform(); cancelCurrentOperations(); bSelectingArea = false; hep.repaint(0); } public void cancelCurrentOperations() { creatingRect = false; creatingEllipse = false; } public void cut(double x, double y) { copy(false); clean(); bMoving = true; iniX = x; iniY = y; finX = iniX; finY = iniY; } public void cut() { cut(-1, -1); } public void copy(boolean needSelected) { vCopied.clear(); for (EditableShape esh : vShapes) { esh = (EditableShape) esh.clone(); if (!needSelected || esh.isSelected()) { vCopied.add(esh); } } } public void paste() { bMoving = true; iniX = -1; iniY = -1; finX = -1; finY = -1; paste(5, 5); } public void paste(double x, double y) { List newCopied = new ArrayList(); deSelectAll(); for (EditableShape esh : vCopied) { EditableShape copied = (EditableShape) esh.clone(); copied.transform(AffineTransform.getTranslateInstance(x, y)); copied.setSelected(true); vShapes.add(copied); newCopied.add(copied); // to avoid overlap of shapes when the user makes "paste" two times } vCopied = newCopied; } public void deSelectAll() { for (EditableShape esh : vShapes) { esh.setSelected(false); } bSelectedPoint = false; hep.repaint(0); } private EditableShape nearestLine(double x, double y) { EditableShape nearest = null; double distance = 0; double currentDistance; for (EditableShape esh : vShapes) { currentDistance = esh.distanceTo(x, y); if (nearest == null || (currentDistance < distance)) { distance = currentDistance; nearest = esh; } } return nearest; } private void clicatISeleccionada(int x, int y, boolean needSelected) { // With needSelected=false it's not necessary to have selected a shape in order // to drag it leaves in vRedrawingLines the selected lines with one point near // the supplied co-ordinates (x,y) Point2D redrawingPoint = null; vRedrawingLines.clear(); for (EditableShape esh : vShapes) { if ((!needSelected || esh.isSelected()) && esh.hasClickedBorder(x, y, needSelected)) { Point2D p = esh.getNearestBorder(x, y); if (redrawingPoint == null || redrawingPoint.equals(p)) { redrawingPoint = p; vRedrawingLines.add(esh); } } } vRedrawingLinesBeforeModify = cloneVector(vRedrawingLines); } private List cloneVector(List v) { List vClone = new ArrayList(); if (v != null) { for (EditableShape es : v) { vClone.add((EditableShape) es.clone()); } } return vClone; } private void divideShape(EditableShape specialLine, double x, double y) { if (specialLine != null) { EditableShape[] shapes = specialLine.divide(x, y); if (shapes != null) { // -> The two following lines are necessary in order to grant the connection of // the resulting shape // Dividing two times in the same point can create an independent line out of // the shape List vCheckPoint = new ArrayList(); vCheckPoint.addAll(vShapes); vShapes.remove(specialLine); for (int i = 0; i < shapes.length; i++) { if (shapes[i] != null) vShapes.add(shapes[i]); } boolean bValidate = validateShape(); if (!bValidate) vShapes = vCheckPoint; } hep.updateView(); } hep.repaint(0); } private boolean validateShape() { return (getGeneralPath().size() == 1); } public List getGeneralPath() { List vGpaths = new ArrayList(); GeneralPath currentPolygon = new GeneralPath(); List shapes = new ArrayList(); shapes.addAll(vShapes); if (!(shapes.size() > 0)) return vGpaths; EditableShape esh = shapes.get(0); shapes.remove(esh); currentPolygon.append(esh, true); short notUsedPoint = END; // indicates the side of the last shape non-adjacent to anyone while (shapes.size() > 0) { EditableShape shape = getAdjacent(shapes, esh, notUsedPoint); if (shape != null) { currentPolygon.append(shape, true); notUsedPoint = getNotUsed(esh, shape); // returns the point of the shape non-adjacent to "current" shapes.remove(shape); esh = shape; } else { vGpaths.add(currentPolygon); currentPolygon = new GeneralPath(); notUsedPoint = END; esh = (EditableShape) shapes.get(0); shapes.remove(esh); currentPolygon.append(esh, true); } } vGpaths.add(currentPolygon); return vGpaths; } private short getNotUsed(EditableShape current, EditableShape shape) { // returns the point of the shape non-adjacent to "current" if (shape.getInitialPoint().equals(current.getInitialPoint()) || shape.getInitialPoint().equals(current.getEndPoint())) return END; else return INITIAL; } private EditableShape getAdjacent(List shapes, EditableShape sh, short notUsedPoint) { Point2D p; if (notUsedPoint == INITIAL) p = sh.getInitialPoint(); else p = sh.getEndPoint(); for (EditableShape shape : shapes) { if (shape.isAdjacentTo(p)) return shape; } return null; } public boolean hasSelectedDrawnShape(Point2D p) { for (int i = 0; i < hep.getNumShapes(); i++) { Shape s = hep.getHoles().getShape(i, hep.previewArea); if (s.contains(p)) { return true; } } return false; } private double distanceToNearest(double x, double y) { EditableShape nearest = nearestLine(x, y); if (nearest != null) return nearest.distanceTo(x, y); else return -1; } public void deleteSelected(boolean isCut) { if (hasSelectedPoint()) { joinAdjacentsToSelectedPoint(); bSelectedPoint = false; } else { List vShapesCopy = new ArrayList(); boolean allSelected = true, noneSelected = true; vShapesCopy.addAll(vShapes); for (EditableShape esh : vShapesCopy) { if (!esh.isSelected()) allSelected = false; else { noneSelected = false; if (isCut || vShapes.size() >= 4) { // Avoid to delete objects when there are only 3 or less elements, unless // is a "cut" vShapes.remove(esh); if (!isCut) joinAdjacentsTo(esh, vShapes); } } } // allSelected indicates if all the object was selected if (allSelected || noneSelected) { vShapes.clear(); this.current = null; hep.getHoles().removeShape(hep.currentShape); hep.setCurrentShape(hep.getHoles().getNumCells()); } } } private void joinAdjacentsTo(EditableShape current, List vShapes) { // All the shapes in vShapes will converge in one of the "current" points. EditableShape s1 = getAdjacent(vShapes, current, INITIAL); if (s1 != null) { // Always s1.hasClickedBorder(current.getInitialPoint().getX(), current.getInitialPoint().getY(), false); // hasClickedBorder marks the shape corner nearest to the supplied point. // Calling changeBorder this corner will be modified to the new point. s1.changeBorder(current.getEndPoint().getX(), current.getEndPoint().getY()); } } private void joinAdjacentsToSelectedPoint() { if (vShapes.size() != 1 && vShapes.size() <= 3) return; EditableShape other = null; int count = 0; for (EditableShape esh : vShapes) { if (esh.hasSelectedBorder()) { if (esh instanceof EditableRectangle) { Point2D p = esh.getNotSelectedBorder(); convertToSimpleShapes(); selectBorder(p.getX(), p.getY()); joinAdjacentsToSelectedPoint(); break; } else { count++; if (count == 1) other = esh; else if (other != null) { Point2D p1 = esh.getNotSelectedBorder(); Point2D p2 = other.getNotSelectedBorder(); vShapes.add(new EditableLine2D(p1, p2)); vShapes.remove(esh); vShapes.remove(other); } } } } hep.repaint(0); } private void setEndToVector(double finX, double finY, List vRedrawingLines) { // approach of all the lines of vRedrawingLines to the point finX, finY for (EditableShape esh : vRedrawingLines) esh.aproximateNearestBorder(finX, finY); } public boolean hasSelectedPoint() { return bSelectedPoint; } public List getSelectedShapes() { List v = new ArrayList(); for (EditableShape esh : vShapes) { if (esh.isSelected()) v.add(esh); } return v; } public int getNumShapes() { return vShapes.size(); } public void deleteCurrent() { clean(); current = null; } public ShapeData getShapeData() { ShapeData sd = null; AffineTransform aft = AffineTransform.getScaleInstance((1 / hep.previewArea.getWidth()), (1 / hep.previewArea.getHeight())); aft.concatenate(AffineTransform.getTranslateInstance(-hep.previewArea.x, -hep.previewArea.y)); if (getNumShapes() == 1) { // Is a rectangle or a ellipse EditableShape es = (EditableShape) vShapes.get(0).clone(); es.transform(aft); Shape s; if (es instanceof EditableEllipse2D) s = ((EditableEllipse2D) es).getEllipse(); else s = es; sd = ShapeData.getShapeData(s, null, false); } else { List v = getGeneralPath(); // Get only the first polygon found (should be unique) if (v.size() > 0) { GeneralPath gp = (v.get(0)); Shape s = gp.createTransformedShape(aft); sd = ShapeData.getShapeData(s, null); } } return sd; } public void endPolygon() { endPolygon(false, true); } public void endPolygon(boolean changeShape, boolean updateList) { endPolygon(changeShape, updateList, -1); } public void endPolygon(boolean changeShape, boolean updateList, int iNextShape) { ShapeData sd = getShapeData(); addCurrentDrawnBorders(sd); endPolygon(sd, changeShape, updateList, iNextShape); if (sd != null) clean(); bSelectedPoint = false; } private void addCurrentDrawnBorders(ShapeData sd) { if (sd != null && hep != null) { Shape s = sd.getShape(hep.previewArea); vDrawnBorders.addAll(getBorders(s)); } } private void removeDrawnBorders(ShapeData sd) { Shape s = sd.getShape(hep.previewArea); vDrawnBorders.removeAll(getBorders(s)); // removeAll removes all the instances of the elements passed over the // shapedata (only one instance is needed) } public void endPolygon(ShapeData sd, boolean changeShape, boolean updateList, int iNextShape) { // Save the created/modified polygon. changeShape indicates if we "come" from a // tab key. if (sd != null) { addCurrentDrawnBorders(sd); if (hep.currentShape < hep.getHoles().getNumCells()) { // hep.currentShape has been modified hep.getHoles().modifyShape(hep.currentShape, sd); hep.updateView(); } else { // A comment has been created sd.comment = StrUtils.secureString(sd.comment, "" + hep.currentShape); hep.getHoles().addShape(sd); hep.updateList(); hep.updateView(); } } int iCurrentShape = hep.currentShape + 1; if (changeShape) { if (iNextShape >= 0) iCurrentShape = iNextShape; else iCurrentShape = iCurrentShape % hep.getHoles().getNumCells(); } else iCurrentShape = hep.getHoles().getNumCells(); // Next one will be new if (hep.currentShape != iCurrentShape) hep.setCurrentShape(iCurrentShape); } private void aplicateTransformation(AffineTransform aTransf, boolean needSelected) { for (EditableShape esh : vShapes) { if (!needSelected || esh.isSelected()) { esh.transform(aTransf); } } } public void move(int xInc, int yInc, boolean needSelected, boolean moveAll) { // moveAll indicates if we want to move also the inactive objects AffineTransform aTransf = AffineTransform.getTranslateInstance(xInc, yInc); aplicateTransformation(aTransf, needSelected); hep.repaint(0); } public void scale(double xInc, double yInc, boolean needSelected, boolean scaleAll) { Point2D center = getCenter(scaleAll); AffineTransform aTransf = AffineTransform.getTranslateInstance(center.getX(), center.getY()); aTransf.concatenate(AffineTransform.getScaleInstance(xInc, yInc)); aTransf.concatenate(AffineTransform.getTranslateInstance(-center.getX(), -center.getY())); aplicateTransformation(aTransf, needSelected); hep.repaint(0); } public void rotate(double theta, boolean needSelected, boolean rotateAll) { convertToSimpleShapes(); // If it is a triangle, it will be necessary to convert it to lines in // order to rotate the shape Point2D center = getCenter(rotateAll); AffineTransform aTransf = AffineTransform.getRotateInstance(theta, center.getX(), center.getY()); aplicateTransformation(aTransf, needSelected); hep.repaint(0); } private Point2D getCenter(boolean cellCenter) { // Returns the central point of the edited shape when cellCenter==false, // otherwise, returns the center of the cell if (!cellCenter) { GeneralPath gp = new GeneralPath(); for (EditableShape esh : vShapes) gp.append(esh, false); Rectangle2D r = gp.getBounds(); // to calculate the central point return new Point2D.Double(r.getCenterX(), r.getCenterY()); } else return new Point2D.Double(hep.getPreviewPanel().getX(), hep.getPreviewPanel().getY()); } private void convertToSimpleShapes() { // If the edited shape is a rectangle or a ellipse, transform it to a set of // segments or cubic lines for (EditableShape esh : vShapes) { if (esh instanceof EditableRectangle) { // Rectangular shapes must be converted to simple shapes in order to // rotate it vShapes.remove(esh); EditableShape[] lines = ((EditableRectangle) esh).divide(-1, -1, false); // Do no add any point for (int i = 0; i < lines.length; i++) if (lines[i] != null) vShapes.add(lines[i]); } } } private EditableShape getSelectedShape(boolean hasToBeALine) { // Returns the selected line when there is only one EditableShape selected = null; int i = 0; for (EditableShape esh : vShapes) { if (esh.isSelected()) { if (!hasToBeALine || esh instanceof EditableLine2D) { selected = esh; i++; } else { i = 2; // Do nothing } } if (i >= 2) break; } if (i == 1) return selected; else return null; } public void convertToBezier() { EditableShape selected = getSelectedShape(false); if (selected != null) { double x1 = selected.getInitialPoint().getX(); double y1 = selected.getInitialPoint().getY(); double x2 = selected.getEndPoint().getX(); double y2 = selected.getEndPoint().getY(); double ctrl1x = x1 + ((x2 - x1) / 3); double ctrl2x = x1 + (2 * ((x2 - x1) / 3)); double ctrl1y = y1 + ((y2 - y1) / 3); double ctrl2y = y1 + (2 * ((y2 - y1) / 3)); EditableCubicCurve2D bez = new EditableCubicCurve2D(x1, y1, ctrl1x, ctrl1y, ctrl2x, ctrl2y, x2, y2); bez.setSelected(true); vShapes.remove(selected); vShapes.add(bez); } } public void convertToQuad() { EditableShape selected = getSelectedShape(false); if (selected != null) { double x1 = selected.getInitialPoint().getX(); double y1 = selected.getInitialPoint().getY(); double x2 = selected.getEndPoint().getX(); double y2 = selected.getEndPoint().getY(); double ctrlx = x1 + ((x2 - x1) / 2); double ctrly = y1 + ((y2 - y1) / 2); EditableQuadCurve2D quad = new EditableQuadCurve2D(x1, y1, ctrlx, ctrly, x2, y2); quad.setSelected(true); vShapes.remove(selected); vShapes.add(quad); } } public void convertToLine() { EditableShape selected = getSelectedShape(false); if (selected != null && !(selected instanceof EditableRectangle)) { EditableLine2D line = new EditableLine2D(selected.getInitialPoint(), selected.getEndPoint()); line.setSelected(true); vShapes.remove(selected); vShapes.add(line); } else if (selected != null && selected instanceof EditableRectangle) { // Convert a rectangle into four lines vShapes.remove(selected); EditableShape[] lines = ((EditableRectangle) selected).divide(-1, -1, false); // Do not add any point for (int i = 0; i < lines.length; i++) if (lines[i] != null) vShapes.add(lines[i]); } } public void notifyShapeChanged() { for (PointListener pl : vPointListeners) { pl.shapeChanged(); } } public void addPointListener(PointListener listener) { vPointListeners.add(listener); } public void undoLastMove(List vRedrawingLines, List vRedrawingLinesBeforeModify) { vShapes.removeAll(vRedrawingLines); vShapes.addAll(vRedrawingLinesBeforeModify); vRedrawingLines.clear(); } private boolean isIntoArea(List vShapes, boolean move) { boolean isInto = true; Rectangle2D r = new Rectangle2D.Double(hep.previewArea.getX() - 1, hep.previewArea.getY() - 1, hep.previewArea.getWidth() + 2, hep.previewArea.getHeight() + 2); Point2D[] borders; for (EditableShape esh : vShapes) { if (!isInto) break; EditableShape es; if (!move) es = esh; else { es = (EditableShape) esh.clone(); es.transform(AffineTransform.getTranslateInstance(finX - iniX, finY - iniY)); } borders = es.getBorders(); if (borders == null) continue; for (int j = 0; j < borders.length && isInto; j++) isInto = r.contains(borders[j]); } return isInto; } private void joinPolygon() { if (vShapes.size() >= 2) { vShapes.add(new EditableLine2D(lastPoint.getX(), lastPoint.getY(), iniPoint.getX(), iniPoint.getY())); } else vShapes.clear(); creatingPolygon = false; lastPoint = null; iniPoint = null; if (bSelectedPoint) deselectBorder(); bSelectedPoint = false; hep.setDrawingMode(SELECTING); } public void mouseDragged(java.awt.event.MouseEvent mouseEvent) { if ((mouseEvent.getModifiers() & java.awt.event.MouseEvent.BUTTON1_MASK) == 0) return; // Button 1 was not pressed Point2D mousePoint = getTransformedPoint(mouseEvent.getPoint(), true); if (bMoving) hep.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); if (mousePoint.getX() < hep.previewArea.x || mousePoint.getY() < hep.previewArea.y || mousePoint.getX() > hep.previewArea.x + hep.previewArea.getWidth() || mousePoint.getY() > hep.previewArea.y + hep.previewArea.getHeight()) { return; } vShapeBeforeModify = (drawingMode == SELECTING && !bMoving) ? cloneVector(vRedrawingLines) : cloneVector(vCopied); EditableShape near = null; Point2D nearDrawn = aproximationToDrawnBorder(mouseEvent.getX(), mouseEvent.getY()); if (nearDrawn != null && EditableShapeConstants.pointsOnGrid) { finX = nearDrawn.getX(); finY = nearDrawn.getY(); } else { finX = mousePoint.getX(); finY = mousePoint.getY(); } if (creatingRect || creatingEllipse) { near = aproximationToLine(finX, finY); hep.getPreviewPanel().repaint(0); } else if (bRedrawingLines) { redrawingLines(finX, finY); near = aproximationToLine(finX, finY, vRedrawingLines); // we are over a shape corner not selected near (at less)... hep.repaint(0); } else if (bMoving || esInterior(finX, finY)) { near = nearestLine(finX, finY); if (near != null) { double d = near.distanceTo(finX, finY); if (!bMoving && d > (EditableShapeConstants.selectLength / 2)) cut(finX, finY); } hep.repaint(0); } if (creatingRect || creatingEllipse || bRedrawingLines) { if ((near != null || nearDrawn != null) && EditableShapeConstants.pointsOnGrid) hep.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); else hep.setCursor(cursors[PEN_CURSOR]); } boolean b = isIntoArea((drawingMode == SELECTING && !bMoving) ? vRedrawingLines : vCopied, (bMoving)); if (!b) { if (drawingMode == SELECTING && !bMoving) { undoLastMove(vRedrawingLines, vShapeBeforeModify); finX = lastFinX; finY = lastFinY; } if (bMoving) { finX = lastFinX; finY = lastFinY; } } else { lastFinX = finX; lastFinY = finY; } if (bResizing) setResizingCursor(resizingDirection); } protected boolean esCantonada(double x, double y) { EditableShape near = aproximationToLine(x, y); return (near != null || aproximationToDrawnBorder(x, y) != null); } protected boolean esSobreFigura(double x, double y) { int minimumDistance = Math.max(Math.max(2, EditableShapeConstants.selectLength / 2), EditableShapeConstants.gridWidth); double dist = distanceToNearest(x, y); return (dist >= 0 && dist < minimumDistance); } protected boolean esInterior(double x, double y) { return (current != null && current.contains(x, y)); } public void mouseMoved(java.awt.event.MouseEvent mouseEvent) { double x, y; Point2D mousePoint = mouseEvent.getPoint(); boolean esCantonada = esCantonada(mouseEvent.getPoint().getX(), mouseEvent.getPoint().getY()); if (drawingMode == NEW_POINT || (esCantonada && EditableShapeConstants.pointsOnGrid)) { x = mousePoint.getX(); y = mousePoint.getY(); } else { x = mousePoint.getX(); y = mousePoint.getY(); } if (x < hep.previewArea.x || y < hep.previewArea.y || x > hep.previewArea.x + hep.previewArea.getWidth() || y > hep.previewArea.y + hep.previewArea.getHeight()) return; if (drawingMode != NEW_POINT) { if (esCantonada && (!creatingPolygon || EditableShapeConstants.pointsOnGrid)) hep.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); else if (creatingPolygon) hep.setCursor(cursors[PEN_CURSOR]); else if (!bMoving && esSobreFigura(x, y)) hep.setCursor(cursors[CIRCLE_CURSOR]); else if (esInterior(x, y)) hep.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); else hep.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } if (drawingMode == NEW_POINT) { if (esSobreFigura(x, y)) { bSpecialLine = true; // temporally paint it in another color specialLine = nearestLine(x, y); hep.setCursor(cursors[PEN_CURSOR]); hep.repaint(0); } else { boolean willRepaint = bSpecialLine; bSpecialLine = false; hep.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); if (willRepaint) hep.repaint(0); } } if (bMoving) { if (iniX == -1) { deleteSelected(true); iniX = x; iniY = y; } finX = x; finY = y; hep.repaint(0); } if (creatingPolygon) { finX = x; finY = y; hep.repaint(0); } if (canResize) { if (!bResizing) { int resizing = getResizing(mousePoint); if (resizing != NO_RESIZING) setResizingCursor(resizing); } else setResizingCursor(resizingDirection); } } protected int getResizing(Point2D mousePoint) { if (!canResize) return NO_RESIZING; ShapeData sd = hep.getHoles().getEnclosingShapeData(); Rectangle r = hep.getPreviewArea(); double width = r.getWidth(); double height = r.getHeight(); AffineTransform aft = AffineTransform.getTranslateInstance(-hep.previewArea.x, -hep.previewArea.y); aft.transform(mousePoint, mousePoint); if (mousePoint.getX() == (width - 1) && mousePoint.getY() == (height - 1)) return SOUTH_EAST; else if (mousePoint.getX() == (width - 1)) return EAST; else if (mousePoint.getY() == (height - 1)) return SOUTH; else return NO_RESIZING; } protected void setResizingCursor(int resizing) { if (resizing == EAST) hep.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR), false); else if (resizing == SOUTH) hep.setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR), false); else if (resizing == SOUTH_EAST) hep.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR), false); } protected void selectBorder(double x, double y) { for (EditableShape s : vShapes) s.selectBorder(x, y); } protected void deselectBorder() { for (EditableShape s : vShapes) s.deselectBorder(); } protected boolean removeNullLines(List vRedrawingLines) { // Removes from vRedrawingLines all the lines having the two points in // (approximately) the same co-ordinates boolean canRemove = false; for (EditableShape s : vRedrawingLines) { if (canRemove) break; if (s instanceof EditableLine2D) { Point2D[] p = s.getBorders(); if (p.length > 1) { Rectangle r = new Rectangle((int) (p[0].getX()) - (EditableShapeConstants.selectLength / 2), (int) (p[0].getY()) - (EditableShapeConstants.selectLength / 2), EditableShapeConstants.selectLength, EditableShapeConstants.selectLength); if (r.contains(p[1].getX(), p[1].getY())) { // This line is prescindible if (vShapes.size() >= 4) { // Do not delete any element when there are only 3 or les (except if it's a cut) canRemove = true; vShapes.remove(s); joinAdjacentsTo(s, vShapes); } } } } } return canRemove; } public void mouseClicked(java.awt.event.MouseEvent mouseEvent) { Point2D mousePoint = mouseEvent.getPoint(); boolean bSobreFigura = esSobreFigura(mousePoint.getX(), mousePoint.getY()); if (drawingMode != NEW_POINT && drawingMode != DRAWING_POLYGON && !bSobreFigura && selectDrawnShape(mousePoint) && !creatingPolygon) { notifyShapeChanged(); hep.repaint(0); } else if (drawingMode != NEW_POINT && bSobreFigura && !creatingPolygon) { EditableShape line = nearestLine(mousePoint.getX(), mousePoint.getY()); if (line != null) { // The caller wants to select a fragment of the polygon if (esCantonada(mousePoint.getX(), mousePoint.getY())) { Point2D p = line.getNearestBorder(mousePoint.getX(), mousePoint.getY()); deSelectAll(); bSelectedPoint = true; selectBorder(p.getX(), p.getY()); hep.repaint(0); } else { if (bSelectedPoint) deselectBorder(); bSelectedPoint = false; if (line.isSelected()) line.setSelected(false); else { if ((mouseEvent.getModifiers() & java.awt.event.MouseEvent.SHIFT_MASK) == 0) deSelectAll(); line.setSelected(true); } notifyShapeChanged(); hep.repaint(0); } } } if (creatingPolygon) { if (mouseEvent.getClickCount() == 2) joinPolygon(); else { mousePoint = mouseEvent.getPoint(); EditableShape near = aproximationToLine(mousePoint.getX(), mousePoint.getY(), vRedrawingLines); Point2D nearDrawn = null; Point2D nearDrawnOther = aproximationToDrawnBorder(mousePoint.getX(), mousePoint.getY()); if (near != null) { // if the ending point is near the mouse, approximate to it nearDrawn = near.getNearestBorder(mousePoint.getX(), mousePoint.getY()); } if (nearDrawnOther != null && EditableShapeConstants.pointsOnGrid) { finX = nearDrawnOther.getX(); finY = nearDrawnOther.getY(); } else { mousePoint = getTransformedPoint(mouseEvent.getPoint(), true); finX = mousePoint.getX(); finY = mousePoint.getY(); } if (lastPoint != null) { // isn't the first point if (nearDrawn != null && iniPoint.getX() == nearDrawn.getX() && iniPoint.getY() == nearDrawn.getY()) { // Has clicked over the starting point of the polygon if (vShapes.size() >= 2) joinPolygon(); } else { if (nearDrawn == null) { // Points cannot be repeated vShapes.add(new EditableLine2D(lastPoint.getX(), lastPoint.getY(), finX, finY)); lastPoint = new Point2D.Double(finX, finY); } } } else { // it's the first point iniPoint = new Point2D.Double(finX, finY); lastPoint = iniPoint; } } } } public void mouseEntered(java.awt.event.MouseEvent mouseEvent) { } public void mouseExited(java.awt.event.MouseEvent mouseEvent) { } public void mousePressed(java.awt.event.MouseEvent mouseEvent) { Point2D mousePoint = getTransformedPoint(mouseEvent.getPoint(), drawingMode != SELECTING); // when selecting, the point doesn't must be in the grid int x = (int) mousePoint.getX(); int y = (int) mousePoint.getY(); if (canResize) { int resizing = getResizing(mousePoint); if (resizing != NO_RESIZING) { if (drawingMode != SELECTING) hep.setDrawingMode(SELECTING); bResizing = true; resizingDirection = resizing; } } if (x < hep.previewArea.x || y < hep.previewArea.y || x > hep.previewArea.x + hep.previewArea.getWidth() || y > hep.previewArea.y + hep.previewArea.getHeight()) return; if (bMoving) { // CTRL+X has been pressed while moving a shape paste(finX - iniX, finY - iniY); bMoving = false; } iniX = x; iniY = y; if (drawingMode == SELECTING && !bMoving) { clicatISeleccionada(x, y, false); // false: drag is possible despite of having the shape selected or unselected if (vRedrawingLines.size() > 0) bRedrawingLines = true; // Redraw lines when clicking on a corner } else if ((drawingMode == DRAWING_RECT || drawingMode == DRAWING_ELLIPSE || drawingMode == DRAWING_POLYGON) && !hasSelectedDrawnShape(mouseEvent.getPoint())) { if (drawingMode == DRAWING_RECT) creatingRect = true; else if (drawingMode == DRAWING_ELLIPSE) creatingEllipse = true; else creatingPolygon = true; EditableShape near = aproximationToLine(x, y); Point2D pNear = aproximationToDrawnBorder(x, y); if (near != null) { pNear = near.getNearestBorder(x, y); } if (pNear != null) { iniX = pNear.getX(); iniY = pNear.getY(); } else { iniX = x; iniY = y; } finX = iniX; finY = iniY; hep.repaint(0); } else if (drawingMode == NEW_POINT) { EditableShape lineToDivide = specialLine; EditableShape near = aproximationToLine(x, y, null); Point2D nearDrawn = null; boolean isSelect = false; if (near != null) nearDrawn = near.getNearestBorder(x, y); if (drawingMode == NEW_POINT && (lineToDivide != null && bSpecialLine && (nearDrawn == null || lineToDivide instanceof EditableEllipse2D || lineToDivide instanceof EditableCubicCurve2D || lineToDivide instanceof EditableQuadCurve2D))) { // A point is added only when the current point is not over another one divideShape(lineToDivide, x, y); } else { isSelect = selectDrawnShape(mouseEvent.getPoint()); } if (!isSelect) { // A point has been added, or a click has been done out of any shape hep.setDrawingMode(SELECTING); } } } public void mouseReleased(java.awt.event.MouseEvent mouseEvent) { if ((mouseEvent.getModifiers() & java.awt.event.MouseEvent.BUTTON1_MASK) == 0) { // The button 1 was not pressed return; } if (bMoving) { paste(finX - iniX, finY - iniY); bMoving = false; deSelectAll(); } Point2D mousePoint = mouseEvent.getPoint(); EditableShape near = aproximationToLine(mousePoint.getX(), mousePoint.getY(), vRedrawingLines); Point2D nearDrawnPropi = null; Point2D nearDrawn = aproximationToDrawnBorder(mousePoint.getX(), mousePoint.getY()); // Corner of a non-active polygon if (near != null || nearDrawn != null) hep.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); else hep.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); if (near != null) { // if there is any nearest point, approximate the ending point to it nearDrawnPropi = near.getNearestBorder(mousePoint.getX(), mousePoint.getY()); // Corner of the active polygon } mousePoint = getTransformedPoint(mouseEvent.getPoint(), true); if (!(mousePoint.getX() < hep.previewArea.x || mousePoint.getY() < hep.previewArea.y || mousePoint.getX() > hep.previewArea.x + hep.previewArea.getWidth() || mousePoint.getY() > hep.previewArea.y + hep.previewArea.getHeight())) { if (nearDrawn != null && EditableShapeConstants.pointsOnGrid) { // Only when approaching finX = nearDrawn.getX(); finY = nearDrawn.getY(); } else { finX = mousePoint.getX(); // This point is maintained as long as the pointer remains into the drawing area finY = mousePoint.getY(); } } if ((drawingMode == SELECTING && !bMoving && nearDrawnPropi != null) || (!creatingPolygon && vShapes.size() > 1 && !validateShape())) { boolean canRemove = removeNullLines(vRedrawingLines); if (!canRemove) { undoLastMove(vRedrawingLines, vRedrawingLinesBeforeModify); finX = iniX; finY = iniY; } } else if (bRedrawingLines) { setEndToVector(finX, finY, vRedrawingLines); bRedrawingLines = false; vRedrawingLines.clear(); vRedrawingLinesBeforeModify.clear(); } if (creatingRect) { creatingRect = false; vShapes.add(new EditableRectangle((int) iniX, (int) iniY, (int) (finX - iniX), (int) (finY - iniY))); if (hep.currentShape >= hep.getHoles().getNumCells()) { // Reserve space for the new rectangle when confirmed(in order to give it a // name) ShapeData sd = new ShapeData(); sd.comment = "" + hep.currentShape; hep.getHoles().addShape(sd); hep.updateList(); } } if (creatingEllipse) { creatingEllipse = false; vShapes.add(new EditableEllipse2D((int) iniX, (int) iniY, (int) (finX - iniX), (int) (finY - iniY))); if (hep.currentShape >= hep.getHoles().getNumCells()) { // Reserve space for the new rectangle when confirmed(in order to give it a // name) ShapeData sd = new ShapeData(); sd.comment = "" + hep.currentShape; hep.getHoles().addShape(sd); hep.updateList(); } } if (bResizing) { if (resizingDirection != NO_RESIZING) { double x = mousePoint.getX(); double y = mousePoint.getY(); double xInc = x - iniX; double yInc = y - iniY; if (resizingDirection == EAST) yInc = 0; else if (resizingDirection == SOUTH) xInc = 0; hep.incDrawingArea(xInc, yInc); } bResizing = false; } ShapeData sd = getShapeData(); current = (sd != null) ? sd.getShape(hep.previewArea) : null; // Update the modifications to the shape bSelectingArea = false; hep.repaint(0); if (!creatingPolygon) notifyShapeChanged(); } public class KeyHandler extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_DELETE) { deleteSelected(false); hep.shapeChanged(); } } } private double viewIniX = -1; private double viewIniY = -1; } src/author/edu/xtec/resources/000077500000000000000000000000001335566474600167245ustar00rootroot00000000000000src/author/edu/xtec/resources/about/000077500000000000000000000000001335566474600200365ustar00rootroot00000000000000src/author/edu/xtec/resources/about/logo_author_small.png000066400000000000000000000041201335566474600242530ustar00rootroot00000000000000PNG  IHDRUV=sBITObPLTE{Y3ff{Y3ffNvY3ffhY3ff{Y3ff{3ff{Y3ff{Y3ff{Y3ff{Y3ff{Y3ff{Y3ff{Y3ff{phY3ffߘ̙ӕ—ބ؂{{ux}r~lipb`\`Y3ffUSTvtRNS"""""3333DDDDUUUUfffwwww=& pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$IDATx_F؞m6ڥK]4 \ORؼ0Z]7fֲu/n#}|~@L|y.q7񿋱[i:F>;316#ƩiNMSsU5(l9vd-0V׷8;~֍bkd$|Qʵ?e7(ظɹdQ3cra%O¿k},j lQZ95{DMrʆ 韋d3u<,FƦ.Ixf(S3g_' *S$5U_'("QgyN.)iYchlY7O蒪3$O)aX9zQSf]R{9ה0jƬDގoJXcxf~3%\cZ}SkFπ)YT5f[,jٵG)n}ըm.|ӴPܣ'd{z[WPL6O`g;̨4LEcb4Uk)l*[Yc|w P!5ώv+͗끢q}c6jr?zFOŋQd?6]FMӷASk"mt{Z Fuivڨ  Iz$ !$8" aUC13jSOT* { 5 EN0]Fz%[4{҆7E)&Jr0<A԰"?"MPh"h$IҴr X%91-OP,Q:pR"J$PΨ$~QBgMTc8(6z>mn5\t_.A۹0Jrf=#bByzf‘ kUi`P@dBy@J.Gny&/6 -T!1ԽLwK(OՃὠgM,toѵ%h "?4j@USLy/FugP[T{Vh+*tݯ:BB䡐WBndf"(G~jpbg?@Re!hAYNO Dv/E#3y({5ݽ1v2rRev@Y٧[)+lxB(!x:zq [/zo]4\h ޖF7G8 k-38HuS#+!^aCQP]-(Oݧ;r~7d6= 5}͕Og^(CR$LAd!%,@zoF"O,YBFgHFW8xz]RM hA:e'# .tKBqa} P~xb#)ٻ1MjFk]SPlP(ퟰ RJmJ(D:$봦D}N;M)}@2EQx5*mg7q7q=? IENDB`src/author/edu/xtec/resources/cursors/000077500000000000000000000000001335566474600204245ustar00rootroot00000000000000src/author/edu/xtec/resources/cursors/cercle.gif000066400000000000000000000015671335566474600223610ustar00rootroot00000000000000GIF89a  𠠤! , TH*\ȰÇ#JHŋ3jFAZTpȒ'`ˈ/ 2e0WƟ@ Jѣ ;src/author/edu/xtec/resources/cursors/llapis.gif000066400000000000000000000015771335566474600224110ustar00rootroot00000000000000GIF89a 𠠤! , \H*\ȰÇ#JHŋ ؘq  td1dǍ&O.(2cɕ#Krt ʕ-1̩L,GyIH*]ʴӋ;src/author/edu/xtec/resources/icons/000077500000000000000000000000001335566474600200375ustar00rootroot00000000000000src/author/edu/xtec/resources/icons/ab_icon.gif000066400000000000000000000002011335566474600221110ustar00rootroot00000000000000GIF89a!,.I8-g}<'T؆3< /Ob+8Ȥ;src/author/edu/xtec/resources/icons/add_point.gif000066400000000000000000000001571335566474600224720ustar00rootroot00000000000000GIF89afff!,4H 9@ Ʒ1US( ,+!1.s}+y`-S]$$;src/author/edu/xtec/resources/icons/adjust_cols.gif000066400000000000000000000002031335566474600230330ustar00rootroot00000000000000GIF89a!,0I8[T㑮'Ūg4lKClQBȤQD;src/author/edu/xtec/resources/icons/adjust_height.gif000066400000000000000000000002151335566474600233460ustar00rootroot00000000000000GIF89a!,:IAO"H6^13+5 Z:PMDaK;src/author/edu/xtec/resources/icons/adjust_rows.gif000066400000000000000000000002021335566474600230640ustar00rootroot00000000000000GIF89a!,/I8[O(SJy:Jkmw1?) z#ry;src/author/edu/xtec/resources/icons/adjust_width.gif000066400000000000000000000002071335566474600232160ustar00rootroot00000000000000GIF89a!,4IAO( U^Tzݳ `N2,b|7NN2j0%;src/author/edu/xtec/resources/icons/al_bottom.gif000066400000000000000000000001611335566474600225040ustar00rootroot00000000000000GIF89a!,PI8ͻ] `רJf/ R;src/author/edu/xtec/resources/icons/al_center.gif000066400000000000000000000002431335566474600224610ustar00rootroot00000000000000GIF89a!,!.5d]JI!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/author/edu/xtec/resources/icons/al_left.gif000066400000000000000000000002451335566474600221350ustar00rootroot00000000000000GIF89a!,#SS=W5$X(&ҋ6R!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/author/edu/xtec/resources/icons/al_medium.gif000066400000000000000000000001611335566474600224600ustar00rootroot00000000000000GIF89a!,PI8oE[vtmX;src/author/edu/xtec/resources/icons/al_right.gif000066400000000000000000000002451335566474600223200ustar00rootroot00000000000000GIF89a!,#CZ~lY88&嵰;նP!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/author/edu/xtec/resources/icons/al_top.gif000066400000000000000000000001621335566474600220030ustar00rootroot00000000000000GIF89a!,PIX xq$i(j]^,tmx;src/author/edu/xtec/resources/icons/aub_icon.gif000066400000000000000000000002021335566474600222770ustar00rootroot00000000000000GIF89a!,/yw3Ozeȡ$(z&?.ߙ~4;src/author/edu/xtec/resources/icons/ba_icon.gif000066400000000000000000000002031335566474600221130ustar00rootroot00000000000000GIF89a!,0I8}< tV+HlYOnU!j@rD;src/author/edu/xtec/resources/icons/bezier.gif000066400000000000000000000015321335566474600220070ustar00rootroot00000000000000GIF89a 𠠤! ,7HDP`…BHѠ!f$`G?.)bɉ'QVr%ŀ;src/author/edu/xtec/resources/icons/bg.gif000066400000000000000000000002161335566474600211150ustar00rootroot00000000000000GIF89a!,;I8g{Y^Uij@ci7ߏ ,cvH Y @@$;src/author/edu/xtec/resources/icons/bt_minus.gif000066400000000000000000000001571335566474600223510ustar00rootroot00000000000000GIF89a !, 0I8g+_(Vh^IN*j\mE;src/author/edu/xtec/resources/icons/bt_plus.gif000066400000000000000000000001621335566474600221750ustar00rootroot00000000000000GIF89a !, 0I8g+c5Ijj؉)fi>E;src/author/edu/xtec/resources/icons/bua_icon.gif000066400000000000000000000002031335566474600223000ustar00rootroot00000000000000GIF89a!,0 @Λ|W卤u)5y-G^y,BO7#;src/author/edu/xtec/resources/icons/c.gif000066400000000000000000000001411335566474600207440ustar00rootroot00000000000000GIF89a !, PI2hX(J;src/author/edu/xtec/resources/icons/cdaudio.gif000066400000000000000000000005571335566474600221450ustar00rootroot00000000000000GIF89aYY==n33f===߮333ssHHtnn򜜳ͥ{{??mءcc픔LLy!%,pH,%dc. xFa eHjH RB  ]xm|~   z s kak BJ BMCŒE A;src/author/edu/xtec/resources/icons/check.gif000066400000000000000000000015341335566474600216060ustar00rootroot00000000000000GIF89a@ ` @ @@@`@@@@@` `@``````` @` @` @` @`@ @@@`@@@@@ @ @@ @` @ @ @ @ @@@ @@@@@`@@@@@@@@@@`@ `@@`@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` @`ࠀ @` @` @` @ ` @ @@@`@@@@@` `@``````` @` @` @`𠠤!,9H  >bĉ-(QCAzPB&#ŗ ;src/author/edu/xtec/resources/icons/content.gif000066400000000000000000000001611335566474600221760ustar00rootroot00000000000000GIF89a!,6H)C8qxM5IF๤j)+BmІ1"@;src/author/edu/xtec/resources/icons/contract.gif000066400000000000000000000001731335566474600223440ustar00rootroot00000000000000GIF89affff!,@H:0J؎11tPc 籭HF8m@0[ D#Xݘ @n9C;src/author/edu/xtec/resources/icons/controls.gif000066400000000000000000000003641335566474600223740ustar00rootroot00000000000000GIF89a k\޷ά{{fcRcV򵽙q錵|ZGJ)֭sssZZZJJJ!,@q$d)fB:d1dcP'@E&3Xe@ !)2<0I*"Q4d.S7]z bW%BE+jVXdk' oCABl&!;src/author/edu/xtec/resources/icons/copy_properties.gif000066400000000000000000000002331335566474600237520ustar00rootroot00000000000000GIF89a!,@HpI+& AAc9+Q vyMZU-8NhH?JF7q]49Ě%TZ;src/author/edu/xtec/resources/icons/cover-base.jpg000066400000000000000000000713611335566474600225770ustar00rootroot00000000000000JFIFExifMM*  z(1 2iOLYMPUS DIGITAL CAMERA OLYMPUS OPTICAL CO.,LTDX-2,C-50Z GIMP 2.8.102015:11:26 16:49:03ƂΈ"'P0220֐   0100,22006:08:13 11:39:002006:08:13 11:39:00'http://ns.adobe.com/xap/1.0/ OLYMPUS DIGITAL CAMERA OLYMPUS OPTICAL CO.,LTD X-2,C-50Z 144 144 Inch 28-1011 2006:08:13 11:39:00 1/50 sec. f/5,6 Creative program (biased toward depth of field) 80 Exif Version 2.2 2006:08:13 11:39:00 2006:08:13 11:39:00 0,00 EV 3,00 EV (f/2,8) Pattern Unknown 7,8 mm FlashPix Version 1.0 sRGB 600 800 C     C  ,  *I$ݫIb1kL }- h, e( n4E"ðW`mlX2yŵ!݉- #v<$ITpGĵ.4n4'&e+tm#lFQ#lȟI;&زH\~ԷEMIG$Z;Pk6,:P P0VXYCX61&ry 1\VHj,6'#t0p.a<^A$J)ڱG{*aW-9h,rN%1_)Fۜ;WK_ͰXM vIS52j0_xwnI$B̟PFΘ,&H[fc>1d쾒{O7jTN4㑭c% -4-ZݺbwʿTt4$I%B}WxǠ֫X2V` ل+ō`ΌZ#MI/EDRvݶzy2JEǯY5Rp_-NOL[9I$Ki=gaּwI$BkӭtT9?Vlٓ&g$āRnLp<$:V0SKԻͻ$Ij揤_I$U?7ɂɛBII;#$xdz%m$޹p~VVT2Mk|tIV$k\~ujʖс!?RI$Kw\O݋.ekP#9MKuKO?GC8 $.c L1 zgz@puPO I$K%=+%tnre6إ9ܑ76"U\lqPЪ9__IF8f~ J-0iXTj6e;'N&jnل3Vӊ-A ݈ v0{I$I$I%MiNI$ٙI$GMyȝo}Iz~X":: 1'+UOn$I$I$z4~e$I>8I%_?!ܬ srF2e^_-fo 䀆<6|I$I$I%^ܽϻyf<% eq_y?>5G8<ѓrm]l-V]hEBЯ ;Nv7bUr$I$I$R5uq/oOᾓ+=NmCΐonƠ1a={ 2)^ô'JYQk(Dl2Q^y6y?wfG&l|tG*7qwH7N5~+f}Kh]Y a=f<kQ؋/D<ïꈰ^X~9xJptz9(3Ƚ=_m5՜GgXv,jO.v3mY'C aс=[A4(Nzl+p\4 LL-b*W~/'>=[욗] `v3Eۈ~`金xf飩2G R2dy-罬IO&))eqDKL]Ke Njr^=a!y9aWZQ9#قZ{.نGZ3t9??o SЈQik$1&fCR>1!8-:NTn!A2vGi>H+&2݈s6y9 /ջn*·d_Ns n)1x|>,Ŋ*"Q:ZCb,J-K#Z6ņ$a>ή'({X3åmK=5FiVE`N7l92^FW[061*)hA'3ŷdU3 XG+]%Äo[qxRfjM,gFOfv]ê>a~nP jO ܰ!G\(GRka00E:R))$#_;;|ypeFRe'S/kItwP>NNQNv+s°p)!.jR 99v+P(Wn9!ZclUGme[EmSZkODYNNLQ(룼z#rBp6o %T@5EXֵOQ뢎EЊE;(B>zccѲ){\ʞ48xhJ9|">[;RZ9c&>*DW(oQTA8Mɱ}Vv-_yK;(ML|fxd=c/k7ߟhxOsF2V>%K@k fI#YRwéuM975n ,DԾzlc'{ʵ3lk Y֯WuW%8[~1娝; );]1'ycA9 mdõoOv ?~bGkf򎳞\[oU*;E :هeйM~7}ǂe50ޱ)KWDb@W/Lr`4Swڵ5}➦;ϟl5Msw4rok{QP묙h²S& NRhN;(_˽vWkòS+wi;Jѽ"// ůOSv8渓Tӂ(kF"l;TTmz_GIRBȞp8-ƮS{}g}92nr*Ml̪93MCSQLmBvŽGT훕MT%T;ʓh!+3rΫ-~O/dɣq{g)O;=ȣ֣qS8& ISeSfq IVY{<קyRw Р=Ӹzvx#̭HDe!E*M Mn5 ̝4XxB `V&&9dvɮ&;! VNx'& 1Pޫj@"=uMWNgFB 0+ 2PtlA✉@,&+ta`;ǣe'(CtЂ0+ 2;ed!Vs<@ jNڽOC:GeNZkѹedA4 d>)L essf 3Er.ch)0{%M#LML k K쏸S;F!\zt3sCOwuf Z]el!ySԛ&@}!X@+*YF l~Va>".>|QN>+ ⿊0\>*>Rpke>7X~G;JNniellE{%PbMs@qⁿIlHay[3< =x7uS~;e39grݍXJGG*aQVI*gG{\dj"A?wwf.7Lv=wwe3&xđp<8AԘwoˊh 07pzzXLcmhޙ_6'-z#R^P *pF6D+_LPU4g,N=trŧ"X.6_̧m-j.#7r=XLXAA1h!V(ا!X-.Y $LΪh Aаwj97qAE\Nf6UX]ON_Gu$1b3[,Ni*VǧRå6,@_sG6#nODeI r,[K)ѐ@(GT MM,ףU4pT JhUf˰T}F pG|T|i1\ sx/Olo L9&s"qTG4 $)o8SPE.'KWU;<Q+A,B&ڸcc~VZq6U ]dNFP!6׺VUc+;t6)Ͷq0=uZIZj`M܂hLLM :ʟu7\UH:n.1nS*#z7nXpR BһcinilRS UFRo)˻(0&dM pF6Z <+-oBu ܤ6Ny PbZ0P0T8oX+*ːTPTɵ(]fk!3SB ` UKu s-*u쾭x.Tɴ أwT~/⟇q**jv ;eQ(&%O#:]X kQttb '쩿Q~ȣbETv*?]a;d͗@ !1A2aq "3QRBS#0b$4C?)Bb7Euq(.I4.H0d[ǧJjnq8C X >#BB&ot\(} j yWGqEMjbye7& -S4WWE4x0&rv~4ݽ%Smn6QTE+oN)͡( Psf"."%]7ħjO~`6[gWacծ~"4闹Sm&!~Qm˘n[ߴnBcvՏTAC6~H8p j٫y;ԥ PGp%055НR3ߞ@v?3McP&0(crS.i\*u}MUH]YG:N6Mq+gLtTGHn%TR!bpfj4&G+ Q!j;G䪊"<ηmOC"Gn:Iꏊ-OE _~UB%MoiT{m{7ڎ!w6ʟ[@6y+&+ ң]5JC$.M3RG#!mA89Ū|"I;|møe[i]O|H{ l ߽aR#[A>jZrdjlylQ۬C|4l.ZW ftުp:F߯ʢzsvUl/ED120 jɡFB}8M1/GG!XU?EL[U2* x;Uӎ 5X3ߧ׵Tl}K;TQTAB)zǣ?rO7;/c6PFfiF3Df553WXnd1#*]7sH=nKK~}|ׇav v;n(X6}|Hh&{ML `Q.+"ojj*ow3m*x}gb>CJuE-gls $ҋ_vUz}UK:f%t) ?8&o>L/na_6>ֽ AJܕn&jJn[쮶o;4)6]3WL5t@`tt7ZS^殣*=utV@ga?ٷ5œ|V >5LSl 02AWv5kzx<^OPP{rX}AXKzJâ㪉>+f%:jȵknlbuҴQ〉`+lht7r V3w-a!M& /}5Q难iGYpଢ&~-7F]eHޔɭ|7ULʈ]+j9C uݳnQzQIVpUgX-(jGSjA8''7m־ Ppϊ>һW'=ڸX,wgחA:in֭oo_G)*.=5M3E"sVSu bn _6el'3 WpՏ+_Jmn@~kyd>ӹ@{WDyE!<'Df(+++*hCu|u.}9sa n;ݼ$њp.tSe3&4%[HU^gTcjwd'Uasp0u'F'4(qgu^šk9* h]QVI 8]UW]3pX[?WG=n = *Da"ܽuJ % SK1ቄ:dOR8ai6Tk*\.3'SѱὕDrJ͵ 7NsM\X8qqenb[q];MD*6ΰWOitd6YSUSKIOV";`;s*m)~#oi*JX[C@ ,: o&ԌUs ׅ 4*Pn'Y7u2J{6.-mwJsAGL['Y(h%2C@y4#]`h#a7nj*9_. a"^&"#@Ll'PiWMO UCb%K$^"#pBnB+nC= &hhUzOZ+\8W+WFLS%$*yzNkMRnQb`BCBF\']ޕHCgb}۔*{7"SMjMBnUWM*3t073OjL*Mœ% rgab"Y,Nkxq4+ѽ q5be#5m|pŪ,~xł: 9Q#vU" &j|Ea?횣E5rMzw'7beʛH!1q "AQa02r#34b$BRSs%5Cct?̖Sj0YmgGUFL5ƽR;,{C zLeGd@^6A; v95ÚƇGq \?$P.(p̔XPu}Ҝkm4u~Ú~6#.J wy0y֌_ .1@-Пn+iN1 )(u@l[!ٝ#-t1Xz(nxGЇobӱ]<;||P2y7/7h7[c^Kҵ{D ^v4"-䛷Z$L4BAtP_tn_#zM1o~3S(9媃󕟚NڡD#swرr<GmwJ豵'1;c4|x-j{mAdo{bTp:VFpGފ*Èõŭ_#=̡ "nZ|8ժ_|0e;E/ gt+tL]f܂װ4R 1ȡXt4|ղXw%1Xƭ.MLUF!08 Q"+t!F"cIVfm3r b#]mFp3>xCxCjS b~xDVł}IJ)7lroPe&L!8.7iMKP\gRb o TTO*'`| ?u'~vҸp"/:M9aqxS{K|iO":~pyn̟y7]zŭ[g#^w[X#K{?70jtf `3,K U1q8u=o4[_#)'޹Ѹ$K*ֳ5D#U|M9ii p>yt6tx`&IDQ3W%pyq؎[usE3иcJZΦTsz^.Zqn">%(=F`[b M;9ojٻgZLT7٢:aҝN񛣬n_zTR(;K2ю%PT.5=@+@n'7їUN;:ϯܛ eﰶNwycGC9|fifMbt׸<.!_[.ejg vo!20[( c SИ7^0$޿ǁɈ&d|MXANp\kZ48폙8{+tb-~q8X%P͗Ss?$ߠrW8^4O4-,<7l̬G]vэr: \6MC+^)$ coN VePE9ARk { ˒hSv " nOhMߏM[Y2Ϭr36=~䡢@(8R?V-Q{qW w~B\?ȭ:9s.qgX/m&:?'> äm/SH ]OĔ@\fr)X=OYxܯ pbcyКYb4e[j4zD0i@x6"5&5xt> z. WF]Z(Tr(rt1.C*?0 &coef[H4aHyI Įicɀg_t, ނZ/{2| ;s ]_U7q+GY m.D-¢G]jQ P3t|{^@W!u-ΰ cĵx{\& u TspxH՟{G)5uaClL,NWS/BQuͼ3X(d)foDw |K-U~қƊ9/z^VJ.eMUwG\rKbPU\݃YF.6Y~S [#Yp<Ȃwyw!ÓUҴ3,^TqM..|aޒQV9QD,߿>|@K+st61K/*cMUlܵ*ksLe(z/iVžzq;pg5#NP32[^t ?a3c,r9 .8!CgSZ  {VS! kJ**c{P5Ahy_ k!=`U3Z9sL#7_^7nƺF٫>hTZ4=.'ٲ~5{} G͑Ӗ-CAuN+HmJ5-<,j q|`AZI"s+6"Lpi^;@m ?oe8&P 5|)E@ GkF, v UۦZgP !:d$?̬ 6^ d;r-80CnEd 1l"cGB:$L {dx7I0@yFUaN!A9Q/G V3=ݔܤ:xm*ϤV8߱{j%LZoTʙ\$c)s贞0ի8.t s3nq$XqcF(!1AQaq 0?7Q`"YdBAfd53 Q2Cj``Ը%D,!o0dbԦQl86 AF$!f( 2B2J4fX#֏R/0!",l0n2fa0pf&$(F^R];m=Kp*#q$Lbfk)H<(fEET(3Y!p C,Ts_L͊ ~P0 xOYǙD-S4,YjeiT [8P @ P$ $ETE&\Q: .176V$#kh;GpRCh\2Iȓ:L쮇SITr Dewp "$L~.Xjj*]JkƵ8\PT "l(lIX!%f`͂`t*~ lF:Rtsc˧W B(*CE5TSQĢ!-l`A]u!N/zm`pVJdr#qV5@}CC^&]uCH@{Dem. aeK7$6VW,tL?[Hfs3;r.]+3XuuJoI[C_dOW+:MHWs&Qw]!pj7FĠA_O?:yV@˜J26FC%C|k 12 <%pb"J#ِ#aL5C՘ +}lc;@>}JT>}S8wz/rA|JiKzHU2ͻU T\R V1g#<=Q;9JSpϩB{>>>4Tz-MA{ҘN#$N0$b'V-`CKt + lwn0*cA]Gz׸M*P`|0' g#zUA(>c6Z3AT+l:_$$qch=X_ !w˙&f5EDG#`NxDyK,Y5"loX5ZYQľ3\ѳNt!+H.VLM18M0U8%SxhGХ%0*X(#S13gL%vS%z%G($U 8hjgZlNfݐߧ߉R#,qj4Cqa+/0U`p11M= Dȁ*mo2䅹S{󲛎Cagk{$Xa>(gCAA4X]|(V+1ק,$/ČoXFtkfu#qd4 ̬Z,+Yxi[É Rs \Zy,۩AKmDr=DT"\ގx(s'IMyq|(`2kRRwXC i㶑Ǵ{gX1zΪW-jt@X_7H26+K3+[1xc_HL0 6C9D<iqu.>59 Ľ\HUQTb60WFun2;PBd9J0j05X[tuxO(!1AQaq 0?+6qT5 9 FbbEU_ `\/*{qfeP׋;Mrzz_gB~_o~+V>i*/ ͘+lfb +JLtc 4xNr0Yo%9{q{[C7J&jC*"S!ẊTTR 0SƢVr"٠'Zb̾0x86>VlCѳrW_l;;.#[+_HX&k(#hABƇg$P-]1bdB_ KKhښgW k=ʡ=@ ]z5Bnr8x//LTRy du2-x CaT$³wGd56d%& yu`z~kcF{VÛ[% Rt^ kW*VCӮW7n9/K75My]uZAc `jRN(ZGUi4J#j\˪x#BVQF{"* VUӌoIr5" /|b<ˡf52auw-[S&j@;-&/x^`E5뀪}¡߃BznFuu7h&Zh󉡯Iy|C %rBX@ ;.^JAt> ү7:Ad)x2,d"S߂kՙo+ I|!L^}SSJ Jw4- 7FNp$c2%㨖Kp>lF}Fo0WxUr"BbB,%,!YL~ 5]f"ـ4Z_iyh@=~r+{̙ZYRPwWg Xw"Ge4Eꯘ\S!x:ac41aJ!]Jԗ%@&}3.uvbD+#+Xa(ӎmًY5n1D餦b׋l/4&O3t4MmFݛNhO?nOiFOmvM[/%8E#†ݖ8[)jڠsЍvwk ;@%7L[oA#Z.e, NiЧd\笫*IJx-:Eܥ:iuٿm6zFjP;*Q; ߾IXt*& CHAih~|gY@>Wq `v Q6ppj.`_Х"[\T\zoMaa4P.SA(RWpTjLgMWySV?n-hvh;{Jon)%N֛3\@YG%A<*U@; LktyRdWIkem+ly[~-[gh7j,USazY\r(?zt){;FDEf[Elq֭K4ĵq8ֳAh1%KB@X0F ;,FR耥ΊUfg >jXb/&oV ?q]/fZ>ppS+:X^y}chwhbg-hf&Od;ܳ|;J _BfX(9`؎PX ul,]ѓH%g 4dqN{τq=p=@0;}J ١O#Gz]讯Ԭ"(xT,H9l^RDYXmj Ѧ+I.0]lKgU2˻*7!]~(CyR)>bX+TUBw`񤆪sN+TS? jjK)R֠qZcJ߬t)n1Zɋ8L4e N)akU} mýf0+84,E] K||=3ZPv5sX ht+y_ih\\Kn>Fv r9(Fa*Yn1TVպ 98Ź@ּ?1QK`,F}ⅇh֥! <X?b 4}Z4)ٳj@A3f:&kucY3ctc1L=k1Y0 K]Vo)ƥ=㢰/q&/x0W-a p0J)Օenʚ\^%(/e.J-Ө6v-W[4ԋx5PQ7 T*TvAV~\,+x.hr-]boXb56m+|0 *|YgD9A{@VpGZriV𒾜)zeXڄ_-m+v(lɥCa̍gsxO`8OD%?1_NYtz7׭%l9Ae"PS\ 2MSku+3¶E4pov;!#ǰ_TVm$Z}x|EɁQPiX0$Ȱ^Ai R >72TQ{rCJ.W x=w|<\`k+?po\/3^%Zo,\@MO_N0&؋MSMwpۡ5 q'&ntB ^bBKlo)HM %'K.NDR,D<-+P"ZC ͆'2d)㛔aVLXCQ,&PFt}J WF݂28-˴+aK%m®ó*} bSp&{w"f%SțX=l&+X FVv;#Dh{cl${grc| ]Fb,,7MUyqy @F68MwЖYo%b ,V/J}* ;j_.~$v,Au .BU`A0aK~%V-&֧w=,f0}B=E͏dȖ Z6wa{+rhZ(ڶfd ,KN˄)Z.GZ4j2yB4ϗ'iC]]Y=J ʀZor7o`+[ ns*NvUoE8,Ŗ98<&#EF 0@jC&g xX9[0}-4y:Ԯ@P_pr(gQЂIrbՙJ Zu`Щc2 )"Ի:끁 ¸84 &(rǨox1S,4٥{A8©x<6kԼ7 ZnX34DXP ̺5َ;s-3jq;h- rZhJ:`ղ䖉ka!q8:hRfUg*lHFAW#M ήn[ #fn1/ʳ㐼./ЅCojP|A蔖8-i3tn~(qq U4W}xT .,ԗU@|k8(#M<+avcJ@) x9Y!ʬ(w TuxҚkACsfł0QaR8!TQ&c @al*s:bmD: cX(JZ ؚuqb{m**~#<0AbS,:—t sc0ȏ |S kL%ƭJ-tfuPq |ΒyKJ6wtnɊ#[aޒQ{3ZŹȠNWF9ZEP 0ӄ+q] Wy^ADב)2ƝJhq@)4;Kl)eʕ‹. B(dRZ[˔9* W@Ҋ,Hp^r6(L4KPkq+z ﻇW ,h .m'x,gT,U,k#`n/l}mP ^%[0F!lb|`g4,+|Yk+b Sv6ڦ`ZE+ʒ+0.u(՞hB,8*B-;Hj:q%s}$˃j1nl΃(dUP Q[0쵞q\Y95Fk.[AƓ\S|3_K}iu&j=~OS<G>/ Oqgsrc/author/edu/xtec/resources/icons/doc_styles.gif000066400000000000000000000016731335566474600227050ustar00rootroot00000000000000GIF89a !,  H*\hÇ0\ŋ'*Xc5&C"rhIB45)`1͛UIÏ9 R(W)&,:Z(ҟ7qTT^@Fs ,T^+6ڽ)Z`@;src/author/edu/xtec/resources/icons/doc_styles_clear.gif000066400000000000000000000012361335566474600240460ustar00rootroot00000000000000GIF89a mƶZƶ1scR])kJYξJ9}Z˵߽B1Z8Ʈ9QquӥZR{JZUiJ!cӜm1kZB댄U1ckϜI)ƶREc)a!c!ֲce!Ʈ{m!R))R)k{I!E!ƶ9imξBӽRyߵkDŽJ1Ʋ1!m, m J_m"]- )mF\#,mcQb 2Th($90 fWM^KIN3>.%k8Ve=@:1kklO*G6 BZCY΂jD E  h[8zl B L7HP|&pm& 8`p/6ĊTB&Fpe3/Ll dAg1J0P"XhfƎ`㢰m:;src/author/edu/xtec/resources/icons/e.gif000066400000000000000000000001461335566474600207530ustar00rootroot00000000000000GIF89a !, PIgfwXXiX;src/author/edu/xtec/resources/icons/expand.gif000066400000000000000000000001711335566474600220040ustar00rootroot00000000000000GIF89af!,>H 0J؂\ Adbjv tMÄ0케뼝/3 K.eM`jE;src/author/edu/xtec/resources/icons/favicon.ico000066400000000000000000000004761335566474600221670ustar00rootroot00000000000000(( frL%քMߠf3wwwwwwwwzz%jz""+z""""z""""z""""ڧz""&zj̲"+z8b"%z33m"/z33NVz33z8Fzwwwwwwwwsrc/author/edu/xtec/resources/icons/fg.gif000066400000000000000000000002201335566474600211140ustar00rootroot00000000000000GIF89a!,=I8g{@`<~cyde0T y6G T@HMW;ٹc0W|`-fffqxxx 3oq>WW.x .5A &5~=FQN]t (08tdx ^yMKO5+cbx ^0^K]/Lڈ],λ؎6Yu\‚֤Lns_sFN$"2biE:Ex y)=.,h&ٹKۧƹ#;<.;̻Y]rYp\CH+߻nج:an֣v^> ZF ;KSobFdbȼĶnmÓ>op] GC0;7Ӆd%xulP%̟"p9+n>-mwx#wCotH JZA&#)U57RA1n)=i/@x){Sij`vn}d,!j(5N|6': ɴpBI S3i@B=uc\7&'X:YX9Hgk^9 dE#I?򛹍X+o#yMۑeGpe8 ss )GQprH;)PK&2M]#c=M+>opH7ה Oq 2Y u [5}'G hm `vnf J%Z%o>JN05,) 1'۩IWG QrCM@cS?Q]Cm$vd9:-b]3$S[JG_ed$EAb5}Јo~x$;3' $:؝a{㓛V6;Xެ9%|pr>HORN:7zMتC̣%uFp^<)S2 鬅u' Qᘓ~! 0R8\.̟"d-ϑGaKʔk"]t5+2#.]Zy&'@#Ƿx?DD֝daF9yKnH7Po:"NB>ojᇀG~]M<6ԓf'MS`!*.n:v#񟀘?zgt6;7@^p gr̴jsh O]?y_#Gn\ء8&O\ xz.p="u-$R]9Gx&.)&S2SӻxQ#{ z @LXoeKGWYIufa" .-m8V?LβM6 ?*GQu `vnK'&-]]OM-, P54S5QC#YphWԜE8h(k'@XRN(X dVVUZd;CI?Ru@K><*XZtVC^ Z98Fg/;I?f3fBYzt>҆LՋ=\(o ph2Tm4mϕqd3ih+GO68gC#)&AJm NdAN*PĈu %bDWDW95ՖgtwsY K .\쎜<:L&ܦouM? `% ]R"x>o˳s3 zm-IJ01j`7S%0ܛe_ ?H7$ٹcȎǐ մ[g+Ņ}\PA84M۬RAҲap.kyJYOx) ^@S֕::8{ju0\CϤ0d-,o.$>o0%`vvn9IjAEK.N&㇋R#sV)}kid@v~5yb ( n#<0;73QZDjH_a?t*\|NшGRM$0џ̤BC %&ٹ 0Zu]\8Džs0fbr{g ao/hMPG5.R|y7ff,&RA안ى9΂Ș~Їzn o*_U8 nx\N6S]^]4લ9rg0k,Q+ B' < <op't<Εt6}`nϞrYYz c?H/ y4>op xX9D-޲q>.+Ci&RS`!YF =c>Uރf_9HoO O%pC[_yP) #,:Uzzι0bbj#EX۵ < s3U ɠ=?[!Nq8Z#yV2Fvt-҆ }V9xGJ|:=`vndʿe15p"ٜȺji~0Oe nwgXs?6D֝D6Z6R 9Vs3]]qg#~7HڞČ.]-k ͗Gx@.yܱ?z6g!`!ղ,?LPD!I>>opk=> o>-ӪkǏޜ`oFЦW VT6۬y&;2;UCbNQͪ!0 |^9xSȹf~\,͝R+^@2cU{N9P -T nT~>7]A,ĜZ HOSTvLv[6*~WFRqwѧϕ+ñCqcG uNf<?B4HͳфWՂV|/!sj p5X,l^8:q9z-nCbtuuיii4ýiM29 sG{X5߀ů[^e#@e35`j8JG+ۿC<0H@i{_ ?Ǒ-"l:Gaysot ZYQ/~Z3F3@2gAKq YCdiZH {W)m<Tn3=`zDwLAJZn iϛqզ%'^}ttmb4rPf#@Q?&!Eu̻SfTX-y!a)PKj1揠Yٟ@?`(E?OKtC&H5Reٛ5J : Hq䌼UhD-|" 1д bT!lmDTY?hLPkAL0:f,`pj r)\1iTU[ZA ȧZF}-Uُ)j U:) H\E.Gu!d-n*bjXytJۅ ԙhcf?J1#-3I[=-ٟ< -l&(Il&mj-ݟݘ.@'Ѭ/jT؂6HGm/WThBCdAL=-ΘݟR Jkmˮ^f]/f%Ht!ځMWÞS6;Ua<_5UkiZ7/in袙}mTI^^uiL ZȺC+OS5 ŀo}ZRLW/j}gn誉9X.h 3 }lq[9 ]@e1$Sbh5R6^׶ٟҨ`YTDߋh4)/7u90 zx=ʅHP W=ٟZhd8UV AXynO4Ln5>{#zqzM_ܝit@E@Z Bw#MIW#3M!//J*0Ri&vGWFJ/#LC6gęҢ,m8x-/66ǃTOzg.N3hI`kq;O&EeUei*@cBgGD mwXhҨ5?4Rʪ k Le~.FS mS]Xll<c;(9eiJN'Ѩ8v.$A J!l ,&7c X\]s~<ֵ M/G4ze=Vᛆw}rq)nhż^CK ~f[+W.n, / qfA3-ȅ?jF2x/ ӎ[ermLTH÷_sCeyډ@#ݍ\a|\ [e7m^ǚTUwP=%HGg$sMɐNNBɴC;m3PK&M2B'MB;h%Ÿ<,d`=Woj1`+[ 篝s^{.|dup; .coS@OnOyCGA: BSZeausȀ|AG '5Bg-=eVP8o CDLyQeYWi0Tί$v]񂠿1.]s)?~1י m4|=v!9nbf:"6#6grBq4ʾ7:%_G8tYy߿oV c"^ zq>Ҋ0a{=tbzp*%kb\u "įQfǎ#74$opCmc$\i>o t̟)*r2kLfeY.^CRE2ʥ)’ 1~Ʀ6(y:%Df:A|^]r8#UVnDc$9-(e2_%5 Nz18%,Gh{ke>>.&Uzxf #m~P`vu9\T\%-&lSUЭm ;*Ϟ+JB|N[++gr}6}qVQ /S>'=HVT 8moWg?wƊsHBC”7Ug*ُ-xYG08Ѹ۠l@Ke HMALEei:mby.2AMП/e*E}U VpCA@7Ϭ|i,{ P]ECeic_q 3#3$5 Q?td.sHh@=|gK( HT;Z֭.6K Au)vmqWIor:"ryͻvuEUکXM:k&Opp.I#OJPCJ17+{qɻ\L Ikw;vܵ?SEIw2@eYj5$iL^D+?j7vgV>v8S৻woR;le a:2=rz.GD\1E]}V* KxƲcc)K+2% S²?Ќ7/ŕ,@-ˡ.M]}U՟l c#w@,ze~ oXM]jֶKgw6u9 1كw<9FmG}D}:x}6S5$[$P8CM4,){ 쟛`V TնhomlS}MOKlƊz<׈lQSIszZ1IMC^uğq_>՟]-ڷ5ݦ* Tswy"m wxհc4mϱC|w} #[Tu3pnjq5&A~|.'?~GL}Y@WW&W_sDALzF;XXK/ B{KSdiWfUR޹;7Ԉd69Fr{iutYg\ylp51bIYfŒ W]4E"c08oK"m zS*랯|,{5'G>YU+a,f`Ki\]wyT[K/T9Бqlg-u*( F= h*xm)<Ͳ4]3"I`vl'4Kg<&@Hxi΀\jʽׄ>N)Ȣ>ҶfŽDy׹-Y Bh"S^ǽ.=BZ FUt*IcU* ㏱LGq\.KmxCP/o e9=Cm#|lXAX-6fc?;oLnधTG[ۋߘun Rr"nGᙙ\wn@;S עc;Bߘ0yds \s|+lA ZL'@qrS X7riһ$31wYݘÁA޺sOׁue?xҽ sgGQ޻ }PP\y2N(PGEpl|Q:Bg_y!l]%F=t]^^?K3t^DC|/H,uM?^b| 0J_k3VyN{tⱥT/g81ſ7>gt_b zeuϭǜt|=U9ICt–Or+:53L`aDxDZڻg-w O x2R vǫ+OZzs\t3"?| ׯcIՑ⽱>^KmkiڈȏzKkalJB0+"lsJ"-=vWs ʼ6WF:>oTzydĥ;u,<\ioiچwzfm4&gzTN9 0p:T[-o%JRĴP@]?KM0Ų4~/vVg,  7CSF#n8}-{ZDP*ɭ{bͪ" k=vdbtzMi7FDUa J 9p8A3w9O\^.jFƓ)ynϮg^IENDB`src/author/edu/xtec/resources/icons/imant.gif000066400000000000000000000002331335566474600216340ustar00rootroot00000000000000GIF89afffff33fff! ,HPIIEPc@XlI 9: P2B VMb8.S_7,QPI;src/author/edu/xtec/resources/icons/import_act.png000066400000000000000000000011601335566474600227040ustar00rootroot00000000000000PNG  IHDR(-SsBITOPLTElYlYlYYlYlYYr\ys{uz~kl_\{h_ub\{xulfb_rlb|xtrlh\#?@tRNS""33DUUffw. pHYs  ~tEXtCreation Time09/05/04%tEXtSoftwareMacromedia Fireworks MX 2004vIDATxU @+SE,S,6y`.b4m_ ݄Ƨ]ΑRzٝt)+KRҷ Aq^9m#&r1%$B` DŽY*V΅8 聼ș#J[gF&IENDB`src/author/edu/xtec/resources/icons/insert_box.gif000066400000000000000000000002271335566474600227030ustar00rootroot00000000000000GIF89a3f3333333v3! ,DpI8Ntgd}*[&~?sr @ $՘Q oƦϝ>9Ʀ.\:wB&.-,z!+=7W.Lӳ~:عy{JGٽ.H)hj~zg|(E!o]qcqڽlfCwvo --^!!Tkq RIdoޠ` 0*0y N+kw!$ w,TCB[b]Rx [r~VT;*ȯ8hX?]>Raд~Ot]/o0{ly./CVEDbo{]yqv~%+CY҆k ;;Xf%ݼyI [_bsn=jscސDyonݎkHyܶZWl{6pTA˅ybv/`fJkyB_"Tqh $:jb3Sq`.C,h_mZZ'+a'l_mJw; GU:֏+:SPqQY~]mBn W,ɺ_*mE{Z]\qD&+'}/byX(Bf?9>ȷ~._e12Vlȶ~e҆SDb(6޷D}/m{@:Rw<ïmK-*6GsK-ov/b38q?'cWG}/}##fX8:H06~Nm/wVu}[y]BG78t^~7ff0!PO^šyw&N>wif>|Tq :9} T^|*͝OUC8PF(?lR8t^>Q~)߇ ć"PƈT@@ nnbWU$!a*X֯Pq]*x+]y=_GnT+81"pS-CGRT*^q+ ]J~t\6:ٵ~5(M{~/_ !jf?_?8::zɧ@CNECȧ?㧟#$P?BsC gO)[;Ͽz&Ypu~ GOg*t蕄}Z[?{~sҥt\" GrtD}Lߔ'l69'ҿ>wN1?u"~yoHYS9oHsf< )8R_Fmb}__ǧ,ݬ;O0>SUSQ;%q2(yBf$T[ r [kq!:~-ݓ8&<{J*ɡ~<JYh;Eb}J U ß+wUo9J *}Pa駄_~~J#yMY?XV*Zն?PSoq+N?+κH)7Xb_뙢ʀ{JMmq2nHÓe$Su1+bȺH(е]E+<~K̻Pf,~J=%\E 6bqjǶoT+rɥٷTO"n2s{\er`Lj8}%CS i ]KbFRA?qD4Ȣ.O:~!|O 2K?qTu3TU"y c8 7+i '$1?LT ??)EjY)atM*ᏥkccP 㧮4 ~'PMiTT59Yeh㧊N3 R}"JLGTKETknS5a/?O?fU4wE]_!oD7Q4wE]6^b*t~|qO *jdhfVm9w%כ2r]V.O(Oi^>&tHp=݊¿ʃ?d4U0tR!] /Uq?:L,egrlOWO<~\ShaxpxzTD~vB[4> M=x91^5_KNG%; yEs? zmߴLW< ?ZMo?cfEF_y2_y u Јgm?m͂vY~ѦQ}9~˲Jwe+V mU˨-Q} ~rb-Zf18&mQ Xofg^>nJy_0s55z侯o3RV.;i:BLWޞ5}tU"ƧܵjAȂGqн* PoO=1ܘC%{j2M_r\˩+ :I3djOJMkЗt<)PSoB4g̟]N=զl?RI/;ltPEv iW:PezUs|K'D-ڿ ~ ܉5mbQC\{21Qqgc EnDku6(ώSs{x9zEGϝuɉsʫSm2rK @ ]6hWdjk./?uyMJeh)''OdOj[@ -\ ШQ**Tvѩ#HSbՔo񵇂c VB' ʗjݟq_G-eo5l?9x@I?*Ud<\_Xp&(w#/#'³nƜЁ+DZ;φ_.m>b։L h=7o+jm-]"PD76M|Mi|PXw!  E3W--CuL:Q[8H t㯼]&j{p=jZ/D)㷘W=zW#H Ω/2{H xȹN̩߳g_1 VB/_[ղOO~? U96憋`N~9=jL_- 𳝜zL? ˷bu+{f-[#bw0'_ ނ-]qB#.odG׽{~XVAl  㠉Š:_"OџͲzߌO"^,SwWWsEbҲU^IH zAa|.oګK{Z(Bmbbh+,G)l 5fXIENDB`src/author/edu/xtec/resources/icons/media_bag.gif000066400000000000000000000016351335566474600224230ustar00rootroot00000000000000GIF89a3$$FW U3mzẓRRzz~}zff̏Vlz̙؞𠠤!,z=H=XAB2tp!-T4ؐ 6p42@I pa%Oʜa0j@‚",heS VT)SPv8hѱӦ ;src/author/edu/xtec/resources/icons/media_icon.gif000066400000000000000000000002551335566474600226170ustar00rootroot00000000000000GIF89aBABff):f! ,ZpIT8kUU $yX&)N)BK+B$N% h\&Da[@ $ML qC<$6Ri#;src/author/edu/xtec/resources/icons/media_new.gif000066400000000000000000000016601335566474600224610ustar00rootroot00000000000000GIF89a3$$FU3mzẓRRzz~}zDD__ffttll||̏Vlzʏ̙؞ܥ뫫𠠤!,?H`A<0H ',d!&T(c;xBƄ $4h(K #@92n`aH )"  60HѤWKd uO , LkJ)RKQܷu?%;src/author/edu/xtec/resources/icons/media_view.gif000066400000000000000000000016301335566474600226370ustar00rootroot00000000000000GIF89acAa̙fͰ𠠤!,u'HA4 :ċ 6p,@$A*X*"LY0%883% 9OBwSD hQ%FzB@@;src/author/edu/xtec/resources/icons/messages.gif000066400000000000000000000002551335566474600223370ustar00rootroot00000000000000GIF89aBABff):f! ,ZpIT8kUU $yX&)N)BK+B$N% h\&Da[@ $ML qC<$6Ri#;src/author/edu/xtec/resources/icons/miniauthor.png000066400000000000000000000010421335566474600227210ustar00rootroot00000000000000PNG  IHDR(-SsBITOPLTE~~Y~~Y~~\~\\\cz|plgc\xuslؽ5tRNS""DUUfww pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$IDATx]0QEKPZ&PF>9dj9.o{'Lbந[Ǘxzg ] % õʒG+=c~`"ߗ}<?A,D2O]}IENDB`src/author/edu/xtec/resources/icons/minus16.gif000066400000000000000000000000731335566474600220300ustar00rootroot00000000000000GIF89a!,|>;src/author/edu/xtec/resources/icons/movie.gif000066400000000000000000000003111335566474600216400ustar00rootroot00000000000000GIF89a333!,@;H+9!|Кd%y*a]+`߸hӄmAe$!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/author/edu/xtec/resources/icons/music.gif000066400000000000000000000016171335566474600216530ustar00rootroot00000000000000GIF89agikmoqsuwyÞơȧ𠠤!,lH&_It-C4"XV%";src/author/edu/xtec/resources/icons/new_element.gif000066400000000000000000000002451335566474600230310ustar00rootroot00000000000000GIF89aü! ,R0Ik'g`%PG靘 (ܠjG BߑH%=KL@:xȂ%t2 B eĢ˨,a9`a{P2 nz| P   B { P  C"DCNEF"F""A;src/author/edu/xtec/resources/icons/plus16.gif000066400000000000000000000001021335566474600216510ustar00rootroot00000000000000GIF89a!,BFR`ܛqdN׉L;src/author/edu/xtec/resources/icons/prev_act.gif000066400000000000000000000015731335566474600223370ustar00rootroot00000000000000GIF89a!,XHXȐ >ŋ&|0‏3nEAȎ*cʬh̛+YRS#9[L3@F%&]:0 ;src/author/edu/xtec/resources/icons/prev_screen.gif000066400000000000000000000016111335566474600230400ustar00rootroot00000000000000GIF89a222ImKKKƳ𠠤!,f5H <؀‚48|(0"EȱB ࣅ (`ACɂ *Dp@ / .0!J -s\0af͛BCOH*5ū;src/author/edu/xtec/resources/icons/project_new.gif000066400000000000000000000016541335566474600230530ustar00rootroot00000000000000GIF89aǮǫɬɮɹͺ˺̺λϺҺл𠠤!, H8X#A" 4Ҡ" ha h‹ DZx M .D@A3XPQ9CpP3i`"F>aTpc=5W^w ݁;src/author/edu/xtec/resources/icons/project_settings.gif000066400000000000000000000002271335566474600241150ustar00rootroot00000000000000GIF89afff3!,DI83D dQHRA!1 wҁp5.a3e4CFH:3W3;src/author/edu/xtec/resources/icons/quad.gif000066400000000000000000000015321335566474600214610ustar00rootroot00000000000000GIF89a 𠠤! ,7\LȰÇ((pbdbF+6 r`ǒ#)T鑥ʀ;src/author/edu/xtec/resources/icons/rect.gif000066400000000000000000000015361335566474600214700ustar00rootroot00000000000000GIF89a 𠠤! ,;H@*TxРA Ĉ/R(qŁ?V1dIQvTp—E ;src/author/edu/xtec/resources/icons/relationship.gif000066400000000000000000000001731335566474600232300ustar00rootroot00000000000000GIF89a!,(I؂|w`(zc&`rt֫27JpH;src/author/edu/xtec/resources/icons/reset_all.gif000066400000000000000000000002521335566474600224770ustar00rootroot00000000000000GIF89a ! ,W09H`1 C18lʸXJ 1E B hā8P "J!2T~1nm S94zTG>>;;;888666111...!!,apH,#jL,$C1HX?#!=tI!n`xgBWF D FjD FxkA;src/author/edu/xtec/resources/icons/rotate_right.gif000066400000000000000000000005061335566474600232220ustar00rootroot00000000000000GIF89a֪~~~>>>:::888777111000///!&,c@pH,FcD%Ņd4xCQJ>H%c&1.6B- PM$0s${ B{i&!m DRF P! m##{tA;src/author/edu/xtec/resources/icons/run_external.gif000066400000000000000000000016651335566474600232440ustar00rootroot00000000000000GIF89a k\޷ά{{fcRcV򵽙q錵|ZGJ)֭sssZZZJJJ!,@%H PB 00C2fLAŊd0`aa-G0 80 KB`P@ LZϕ3 SK&Xb"1XBl$`A(0K@S #/.S;src/author/edu/xtec/resources/icons/s.gif000066400000000000000000000001441335566474600207670ustar00rootroot00000000000000GIF89a !, PIeUܐQe;src/author/edu/xtec/resources/icons/se.gif000066400000000000000000000001501335566474600211310ustar00rootroot00000000000000GIF89a fff!, pIV\w؃U8faT;src/author/edu/xtec/resources/icons/select_shaper.gif000066400000000000000000000002111335566474600233410ustar00rootroot00000000000000GIF89a!,6I65IسgOl.n!2ZVٹ.CRwѱ`p;src/author/edu/xtec/resources/icons/selectionMode.gif000066400000000000000000000015551335566474600233260ustar00rootroot00000000000000GIF89ad!,JA!<(! &|@ć+^Ę1D-N쨱!ȊE$B%\ѤA-eƼsM;src/author/edu/xtec/resources/icons/seq_exit.gif000066400000000000000000000002031335566474600223420ustar00rootroot00000000000000GIF89a !, 0pI+ ŠY@Y&γ:u-ǞP$qZBdn";src/author/edu/xtec/resources/icons/seq_next.gif000066400000000000000000000001651335566474600223560ustar00rootroot00000000000000GIF89a !, "p9J[a7NYY5nB̙<ՍWE;src/author/edu/xtec/resources/icons/seq_next_jump.gif000066400000000000000000000001741335566474600234110ustar00rootroot00000000000000GIF89a !, )p9J[aaqgrhh tLZ:|No"D;src/author/edu/xtec/resources/icons/seq_next_return.gif000066400000000000000000000002031335566474600237460ustar00rootroot00000000000000GIF89a !, 0pI+;mvBJ&W؉R1<;ϭk o OLYMPUS DIGITAL CAMERA OLYMPUS OPTICAL CO.,LTD X-2,C-50Z 144 144 Inch 28-1011 2006:08:13 11:39:00 1/50 sec. f/5,6 Creative program (biased toward depth of field) 80 Exif Version 2.2 2006:08:13 11:39:00 2006:08:13 11:39:00 0,00 EV 3,00 EV (f/2,8) Pattern Unknown 7,8 mm FlashPix Version 1.0 sRGB 600 800 C     C  Kd  QIL8R  NZEXgd]yEl-l4+Al@q#ˀyFOQ+deY(ݕMx%3$_VW ;I 5i(j>I ˄qnUP$p`_$.bsꍝⅿ"iÓ~u:ƀ>xM߿(hn_Co'TnM|Uh`(f1q/腧XwSVSK1oTs-] W+]n-?'V *-e@J"s:%nbCɹޯ6XRnq/ qɽ m $ާ M˙ fGHsf3镽r ^tPq"ʒV16\c^S=lcwQZ䡀Ւ%—FޙZowث%Nc|W?~mZ V:pꜟ)R˭Rq$Oa>;!X* E3 Öi> b$+bk@LH7VAidslUvQD7\*ߒ(uuҖ;Ȫ9H^s뚸#-⩅o>1QrsTqPO@*Fl Q(z7޴_E]/SsN&y) nqSL 4bcFGE ! 9;):IS=v9 !"#12AQaq3BTb?K$8zPy[H˨Buɂwl*!_96k;$)f3S?/^BV?P|2FYstH%:Qsb)2|)Q(y}m-DE!nDΓma-Mj 0h)鑽_DL̜.FbFjIW%ep &RσeTAO[^H݈ `\Rj3g#ΐdzY-.:ZvLS?pX^Іu)$2zQq0٠!D[fEdU4V@vu;K'giniwg7 mrzއMZ)[|n w:G {FtQ>j/Ș[8c^G :)pSw]vEj}ԘskgPsHx ?ME[ ayp)6/yQ(##wHD) hi܅-[tPmAӠ9cIJ6hHxidcdrqD!7&.Ral>q4O؏E{li| Nʂ@S(#q&[ SQg#ӲkKrS]p^p aRkdaM1DoU*AHlV5;";x^S%@1ޯ:w~]47WtwezE NP /2GYp [:{WU{MBUς8B j?QIx/Z}QrνR&$*WBDݯ ;,;Aʻ5/)}@QP wZ` ~wK)T4c7^FEu!vv 47M%0oXsEQli3ⴣ/lTh6ÀR#ʃ&4pVB_S7LJ-WCOcPoTC1 R& 晍e6vY@b55vA?)Z;ǟx+Y*Uj\g%!1QAaq? 1&if+\aP&}^zs/(T3 +*ЕS4фu+| z P5~%o޷1DTYY(g6SAҁ*>&(71, =-i{CC/`T/?n9o7&À[[7c'OߗW=%Leh \i6h{LH,^iLy}$E f9#0mwы*vX+,Q/g]A( Zc K۾eu#(nϒLbܬ]#b!;Y_jj|WQ15í& je*B:XDN@^-Ŏ,m1zi.{gyJP^Y؋BB:^@L~IXeh cOEEi%!1AQaq?=8&Vu&B_4׬c^Pǖ,%KKN%7p ﲫJ-f#hYejYxtͼGb5WD֥fQ[^E.U.6J7iӍ6ԥisS)\unh$VpxiE0|;@HHZPSD =4sʻe9hl-F?H*"^ɂ 53E/Blu#^ֽ#AJU(ɓp`8mV;\y@/4z?=%y._~gTlS~*^ 3v-kln%q1ؠD׳cb=[~& CVOiMe6Do {g2˘4&Rji(U bOª*Dwn߈R=QE {Q5/Yg9zK ]Ry&!1AQaq?Pp {}GW:pOhpZx[{./ ?Qs=a']7/A^Q5o aP~⏛!F V)*I ƲT^t?6VZօdhʭw!*Gg1J2:;N𞌴1B ?("LY4A3o-AV P XU++T=D):a5ȈP QkYL6QR&|q6L ݌WG.K)&&^P:>iOH;Ԡd;XQ)liU& )7w8%=QƅyQ1WXL {dr}&Z.{F?yBJZ-OX;] ᴔF6P(r2 !2FͫĐQNa*\J/.ka,_i-7GQh/ 84 A4e w x! BrgZэv "K=\PAVz%4, mH`*4癡}Y M5 ?azHR"BC"hQMe?1ƞ xFӜsrc/author/edu/xtec/resources/icons/tree.gif000066400000000000000000000001741335566474600214670ustar00rootroot00000000000000GIF89a!,)IOxg(rხQ9nHF;src/author/edu/xtec/resources/icons/type.gif000066400000000000000000000016241335566474600215120ustar00rootroot00000000000000GIF89a$$Z9c!,q@\P"J!t`ƏPD@䃃" <,Iʖ#Y"pqJr|9灜9i漩rG4)Rti)T%8T`& ;src/author/edu/xtec/resources/icons/unknown_small.gif000066400000000000000000000002211335566474600234100ustar00rootroot00000000000000GIF89aRBcJkRތ県祔筥ﵭ!,>PI Oj(>`lc 1L8ܕ @TCQcq=ftBN8Xg˕D;src/author/edu/xtec/resources/icons/vertex_off.gif000066400000000000000000000001171335566474600226740ustar00rootroot00000000000000GIF89afff!, ˝3FVVY!0R8vHB;rR;src/author/edu/xtec/resources/icons/vertex_on.gif000066400000000000000000000001421335566474600225340ustar00rootroot00000000000000GIF89afff!,39 Bp%']"& +0"c.h(uz;src/author/edu/xtec/resources/icons/w.gif000066400000000000000000000001461335566474600207750ustar00rootroot00000000000000GIF89a !, PIg2ܪΝbE;src/author/edu/xtec/resources/icons/zoom.gif000066400000000000000000000001671335566474600215160ustar00rootroot00000000000000GIF89af!,paYC~g:v@s5HdJ('tZ) ;src/author/edu/xtec/resources/messages/000077500000000000000000000000001335566474600205335ustar00rootroot00000000000000src/author/edu/xtec/resources/messages/AuthorMessages.properties000066400000000000000000001243371335566474600256150ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Description edit_act_name_tooltip=Name of the activity edit_act_name=Name: edit_act_description_tooltip=Description of the activity edit_act_reports_block=Reports edit_act_includeInReports=Include this activity in reports edit_act_includeInReports_tooltip=Include the results of this activity in users' reports edit_act_code=Code: edit_act_code_tooltip=Optional code used to group and search in the reports database. edit_act_reportActions=Report user actions edit_act_reportActions_tooltip=Register the details of all the actions performed by users edit_act_counters_block=Counters edit_act_timeCounter=Time counter edit_act_timeCounter_tooltip=Show/hide the time conter edit_act_actionsCounter=Tries counter edit_act_actionsCounter_tooltip=Show/hide the tries counter edit_act_scoreCounter=Score counter edit_act_scoreCounter_tooltip=Show/hide the score counter. edit_act_maxTime=Max time: edit_act_maxTime_tooltip=Maximum time to to solve the activity, in seconds, or 0 for unlimited time. edit_act_countdown=Countdown edit_act_countdown_tooltip=The counter starts at m\u00e1ximum value, decreasing to 0. edit_act_maxActions=Max tries: edit_act_maxActions_tooltip=Maximum number of tries allowed, or 0 for unlimited tries. edit_act_buttons_block=Buttons edit_act_helpBtn=Help edit_act_helpBtn_tooltip=Show/hide help button edit_act_helpBtn_solution=Show solution edit_act_helpBtn_msg=Show this message: edit_act_infoBtn=Information edit_act_infoBtn_tooltip=Show/Hide the button of information edit_act_infoBtn_url=Show this URL: edit_act_infoBtn_cmd=Execute this command: edit_act_infoBtn_url_tooltip=Web site address to show when click on the info button edit_act_infoBtn_cmd_tooltip=Command line to be executed on click to the info button. edit_act_mainWindow=Main window: edit_act_gameWindow=Game window: edit_act_margin=Margin: edit_act_margin_tooltip=Horizontal and vertical spacing between visual objects. edit_act_bgColor=Background color: edit_act_bgColor_tooltip=Change the background color. edit_gradient_startColor=Start color: edit_gradient_endColor=End color: edit_gradient_startColor_tooltip=Selection of the start color edit_gradient_endColor_tooltip=Selection of the end color edit_gradient_cycles=Cycles: edit_gradient_cycles_tooltip=Number of repetitions of the gradient over the paint surface edit_gradient_orientation=Orientation: edit_gradient_orientation_tooltip=Gradient's orientation, measured in degrees over the horizontal edit_act_gradient=Gradient: edit_act_gradient_tooltip=Use gradient of colours edit_color_opacity=Opacity edit_color_opacity_tooltip=Set the color's alpha channel (opacity) value. edit_gradient_title=Gradient edit_gradient_default=Use default values (null gradient) edit_act_image=Image: edit_act_descriptionTab=Description edit_act_descriptionTab_tooltip=Name and description edit_act_tiledBgImg=Tiled edit_act_tiledBgImg_tooltip=Paint all the surface with the image, repeating it along the X and Y axis as needed. edit_act_preview=Preview: edit_act_border=Border edit_act_border_tooltip=Draw a line border arround the window edit_act_transparent=Transparent edit_act_transparent_tooltip=Window has transparent background edit_act_width=Width: edit_act_height=Height: edit_act_width_tooltip=Width of the object, measured in pixels edit_act_height_tooltip=Height of the object, measured in pixels edit_act_centered=Centered edit_act_centered_tooltip=The object will be centered over the main window edit_act_x=X: edit_act_x_tooltip=Absolute horizontal location edit_act_y=Y: edit_act_y_tooltip=Absolute vertical location edit_act_ui_block=User interface edit_act_image_tooltip=Select an image edit_act_text=Text: edit_act_text_tooltip=Text to be shown inside this object edit_font_face=Typeface: edit_font_size=Size: edit_font_bold=Bold edit_font_italic=Italic edit_font_underline=Underline edit_font_style=Style: edit_cell_title=Cell contents edit_act_messages=Messages edit_act_msg_initial=Initial message: edit_act_msg_final=Final message: edit_act_msg_prev=Previous message: edit_act_msg_error=Error message: edit_act_msg_initial_tooltip=Message to be shown when the activity starts edit_act_msg_final_tooltip=Message to be shown when the activity is finished edit_act_msg_error_tooltip=Message to be shown when the activity ends with errors edit_act_msg_prev_tooltip=Message to be shown prior to the start of the activity (only in certain types of activities) edit_align=Align: edit_act_textColor=Text color: edit_act_textColor_tooltip=Color used to draw text edit_act_shadowColor=Shadow color: edit_act_shadowColor_tooltip=Color used for drawing the text's shadow, when appliable edit_act_shadow=Shadow edit_act_shadow_tooltip=Draw text with shadow edit_act_borderColor=Border color: edit_act_borderColor_tooltip=Color used to draw the cell's border edit_act_inactiveColor=Inactive state color: edit_act_inactiveColor_tooltip=Color used when the cell is disabled edit_act_altColor=Alternative color: edit_act_altColor_tooltip=Color used to draw the alternative content in solved cells. edit_cell_marked=Marked edit_cell_disabled=Disabled edit_cell_alt=Alternative edit_cell_textMargin=Internal margin: edit_cell_textMargin_tooltip=Amount of space between cell's border and text. edit_cell_borderWidth=Border width: edit_cell_borderWidth_tooltip=Width of the stroke used to draw the standard border edit_cell_markerWidth=Marker width: edit_cell_markerWidth_tooltip=Width of the stroke used to draw the border when the cell is marked or selected edit_cell_alt_tooltip=Preview in "alternative" state edit_cell_disabled_tooltip=Preview in "disabled" state edit_cell_marked_tooltip=Preview in "marked" state edit_act_testAction=Preview activity edit_act_testAction_tooltip=Preview and test the activity edit_act_panels_description=Description edit_act_panels_description_tooltip=Title and description of the activity edit_act_panels_options=Options edit_act_panels_options_tooltip=Options of the activity edit_act_panels_frame=Window edit_act_panels_frame_tooltip=Aspect, size and position of the activity window edit_act_panels_messages=Messages edit_act_panels_messages_tooltip=Content of the activity messages edit_act_panels_panel=Panel edit_act_panels_panel_tooltip=Contents of the panel edit_style_title=Style edit_style_tooltip=Set the cells color, font and size edit_act_style=Style: edit_act_overlap=Avoid text overlap image edit_act_overlap_tooltip=Try to avoid text overlapping over image edit_media_exists_1=The file edit_media_exists_2=already exists in the media library! edit_act_shaper=Shaper: edit_act_shaper_err=Shaper error: edit_act_num_cols=Columns: edit_act_num_rows=Rows: edit_act_toothHeightFactor=Tooth height: edit_act_toothWidthFactor=Tooth width: edit_act_toothRandom=Random distribution edit_act_shaper_properties=Shaper properties edit_act_panels_text=Text edit_act_panels_text_tooltip=Text of the activity action_saveFile_caption=Save... action_saveFile_keys=SS action_saveFile_tooltip=Save the current project action_docTree_caption=Document tree... action_docTree_keys=T* action_docTree_tooltip=Show the project's document as a tree edit_docTree_title=Document tree edit_media_referencedBy=Referenced by: msg_prompt_loadReferences=Warning:

This project connects with other projects.
Do you want to explore the links and to load all the related files?

(It's advisable to answer YES when importing Clic 3.0 activities) edit_mc_type=Type: edit_mc_type_unknown=Unknown edit_mc_type_sound=Play sound edit_mc_type_video=Play video edit_mc_type_midi=Play MIDI edit_mc_type_cdaudio=Play CD audio edit_mc_type_record=Record sound edit_mc_type_play_recorded=Play recorded sound edit_mc_type_run_activity=Go to activity edit_mc_type_run_sequence=Go to sequence edit_mc_type_run_external=Run program edit_mc_type_url=Show URL edit_mc_type_exit=End edit_mc_type_return=Return edit_mc_level=Priority level: edit_mc_file=File: edit_mc_externalParam=Parameters: edit_mc_from=From: edit_mc_to=To: edit_mc_length=Max. length: edit_mc_recBuffer=Record tape: edit_mc_stretch=Stretch size edit_mc_location=Location: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=From: edit_mc_location_from_box=Cell edit_mc_location_from_window=Window edit_mc_location_from_frame=Frame edit_mc_loop=Loop playback edit_mc_autostart=Auto start edit_mc_catchmouse=Catch mouse edit_mc_title=Multimedia and active content edit_mc_label=Active content: edit_media_dlg_title=Multimedia object selection edit_media_title=Media library edit_mc_pos_cell=Centered over cell edit_mc_pos_window=Centered over window edit_mc_pos_absolute=Specify position: edit_tree_badFormat=Incorrect tree structure or data! edit_act_panels_controls=Controls edit_act_panels_controls_tooltip=Options for buttons and counters edit_act_class=Type: edit_act_gridLayout=Grid layout: edit_act_gridLayout_tooltip=Relative postion of the panels A and B. edit_act_inverseResolution=Inverse resolution edit_act_inverseResolution_tooltip=The activity is solved when all assigned elements of "B" are matched. edit_act_showAllArrows=Show all arrows edit_act_alt=Alternative content: edit_act_alt_tooltip=Content shown in solved cells and non-assigned cells. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Edit the alternative content edit_act_grid=Grid edit_act_grid_A=Grid A edit_act_grid_B=Grid B edit_act_grid_layout=Layout edit_act_grid_relationship=Relationship edit_seq_activity_header=activity edit_seq_tag_header=tag edit_seq_jump_header=jump to edit_seq_activity=Activity: edit_seq_tag=Label: edit_seq_description=Description: edit_seq_auto=Move on automatically edit_seq_delay=Delay: edit_seq_action_fwd=Go forward edit_seq_action_back=Go bak edit_seq_action_jump=Jump to... edit_seq_action_stop=Stop edit_seq_action_return=Return edit_seq_action_exit=Exit JClic edit_seq_arrow_fwd=Forward arrow: edit_seq_arrow_back=Back arrow: edit_seq_action=Action: edit_seq_button_enabled=Show button edit_seq_project=JClic Project: edit_act_absolute=Absolute position edit_act_absolute_tooltip=The object will be placed at the specified X and Y co-ordinates edit_act_location=Location: edit_seq_newElement=New sequence element... edit_seq_newElement_tooltip=Insert a new element into the activity sequence edit_seq_newElement_msg=Please select an activity for the new sequence element. edit_seq_newElement_error_noAct=Cannot create a new sequence element without activity! edit_seq_newElement_error_emptyList=This project has no activities! Unable to create sequence elements in an empty project. edit_seq_jump_msg=Jump target: edit_seq_jump_title=Jump target edit_act_newActivity_tooltip=Add a new activity to project edit_act_prompt_class=Type of activity: edit_act_prompt_name=Name: edit_act_newActivity_msg=Please select the type of activity to create and give it a name: edit_act_newActivity_error_noAct=You must select an activity type! edit_act_newActivity_error_noName=You must especify a name for the activity! edit_act_newActivity_error_creating=Unable to create activity! edit_act_newActivity_class=Java class name: edit_text_act_format=Format edit_text_act_answer=Answer edit_text_act_popup=Pop up edit_text_act_answer_label=Valid answers: edit_list_newElement_tooltip=Add a new list element edit_list_editElement_tooltip=Edit the selected list element edit_list_deleteElement_tooltip=Delete the selected list element edit_list_upBtn_tooltip=Move up edit_list_downBtn_tooltip=Move down edit_list_newValue=New text: edit_list_addElement=Add new list element edit_list_modifyValue=Modify selected text edit_text_act_target=Target edit_text_act_maxLen=Max. length: edit_text_act_maxLen_tooltip=Maximum amount of characters in the answer. edit_text_act_fillingChar=Filling character edit_text_act_fillingChar_tooltip=Character used to indicate the blank edit_text_act_iniLen=Initial length: edit_text_act_iniLen_tooltip=Number of filling chars that will be displayed at the beginning of the activity. edit_text_act_iniText=Initial text: edit_text_act_iniText_tooltip=Text displayed in the blank at the beggining of the activity. edit_text_act_list=Show a list of options: edit_text_act_list_tooltip=Display a list of options from which the user must select one. edit_text_act_check_title=Correction options edit_text_act_popup_no=No pop up edit_text_act_popup_always=Pop up automatically edit_text_act_popup_onError=Pop up in errors edit_text_act_popup_onDemand=Pop up with F1 edit_text_act_popup_type=Type: edit_text_act_popup_delay=Pop up delay: edit_text_act_popup_maxTime=Max. time: edit_text_act_popup_onlyPlay=Sound only edit_text_act_err_noSelection=You must select a fragment of text in order to create a new text target! edit_text_act_err_badCharInSelection=Target text cannot include paragraph returns nor tabs. edit_text_act_err_nestedTargets=Targets cannot nest! edit_text_act_err_cellInTarget=Targets cannot contain cells! edit_text_act_pageBgColor=Paper colour: edit_text_act_editStylesBtn=Edit document styles... edit_text_act_mainStyle=Main style: edit_text_act_tabSpc=Tab space: edit_text_act_tabSize=Spaces between tab marks: edit_text_act_colors=Colors: edit_text_act_targetStyle=Target colors: edit_text_act_errorStyle=Error colors: edit_text_act_preview=Preview: edit_text_act_styleSample_default_start=Standard text edit_text_act_styleSample_target=target edit_text_act_styleSample_error=error edit_text_act_styleSample_default_fill=standard text edit_text_act_styleSample_default_end=standard text. edit_text_act_warnDeleteTarget=Warning: This action will supress the currently selected target. Do you want to proceed? edit_text_act_prevScreen_title=Previous screen... edit_text_act_prevScreen_no=Don't display any text before starting the activity edit_text_act_prevScreen_original=Display the complete text of the exercise edit_text_act_prevScreen_special=Display this text: edit_text_act_prevScreen_time=Max. time: edit_text_act_edit_target=Target... edit_text_act_checkButton_show=Show correction button edit_text_act_checkButtonText=Button text: edit_text_act_checkCase=Match case edit_text_act_checkAccents=Consider accents and special characters edit_text_act_checkPunct=Consider punctuation marks edit_text_act_checkDoubleSpc=Allow repeated spaces edit_text_act_checkOptions=Criteria edit_text_act_checkAutoJump=Move on to next target when filled in edit_text_act_checkForceOk=Move only after correct guess edit_text_act_checkDetail=Indicate mistakes letter by letter edit_text_act_checkDetail_params=Analysis algorithm parameters: edit_text_act_checkDetail_steps=Steps: edit_text_act_checkDetail_field=Exploration field: edit_text_act_defaultCheckButtonText=Check edit_text_act_advancedCorrectionOptions=Answer analysis edit_text_act_check_bt=Correction... edit_text_act_checkButton=Correction button edit_text_act_checkProgress=Progress edit_text_act_typeBtn=Type... edit_text_act_orderParagraphs=Order paragraphs edit_text_act_orderWords=Order words edit_text_act_order_amongstPar=Shuffle words amongst paragraphs edit_text_act_type_title=Activity type edit_text_act_warnChangeType=This action will clear all the existing targets. Do you want to proceed? edit_text_act_identWords=Identify words edit_text_act_identChars=Identify characters edit_media_change_name=Change name... edit_media_change_file=Change file... edit_media_includeInZip=Save into ZIP file edit_media_type=Media type: edit_media_size=File size: edit_media_show_type=Files of type: edit_media_preview=Preview media edit_media_preview_tooltip=Preview media resource edit_media_rename=Change resource name edit_media_rename_title=Rename edit_media_rename_prompt=New name: edit_media_rename_invalid=Invalid resource name! edit_media_rename_exists=There is another resource with this name! Each resource must have a unique name. edit_media_chfile_invalid=Invalid file! err_media_chfile_different=File must be of same type edit_media_font_error=Unable to load font! edit_media_save_file=Save file (extract from ZIP) edit_media_refresh_file=Update media content from file edit_media_warn_zipFileNotExternal=This is not a "real" file, but a object located into a ZIP container. In order to use this feature, a file with the same name must be present in the folder where the ZIP file is located. edit_activities=Activities edit_sequences=Sequences edit_media=Media library edit_media_tooltip=Manage images and other media files used in the project edit_activities_tooltip=Create and edit project activities edit_sequences_tooltip=Edit and create sequences of activities edit_project_title=Title: edit_project_title_tooltip=Project's title edit_project=Project edit_project_tooltip=Edit project properties edit_project_description=Description: edit_project_description_tooltip=General description of the project edit_project_images_block=Images edit_project_cover=Cover (about 300x200): edit_project_cover_tooltip=Image to be used as a project cover in JClic libraries edit_project_thumb=Thumbnail (about 100x70): edit_project_thumb_tooltip=Image to be used as a thumbnail in buttons and lists edit_project_icon16=Small icon (16x16): edit_project_icon72=Medium icon (72x72): edit_project_icon192=Big icon (192x192): edit_project_icons_tooltip=Icons declared when exporting to HTML5 edit_project_area=Areas: edit_project_area_tooltip=Curricular areas of the project edit_project_level=Levels: edit_project_level_tooltip=Educational levels of the project edit_project_descriptors=Descriptors: edit_project_descriptors_tooltip=Descriptors of the project (separed with comma) edit_project_languages=Languages: edit_project_languages_tooltip=Languages used in the project edit_project_languages_modify=Change the selected language edit_project_languages_add=Add language edit_project_languages_select=ISO-639 language codes: edit_project_languages_already_selected=This language was already selected! edit_project_languages_confirm_delete=Do you really want to delete this language? (cannot undo) edit_project_authors=Authors: edit_project_authors_tooltip=People involved in the creation of the project edit_project_author_name=Name: edit_project_author_mail=e-mail: edit_project_author_rol=Rol: edit_project_author_organization=Organization: edit_project_author_comments=Comments: edit_project_author_url=URL: edit_project_author_name_tooltip=Author's name (required) edit_project_author_mail_tooltip=Author's e-mail (optional) edit_project_author_rol_tooltip=Person's rol in the project: author, collaborator, drawings, sounds... (optional) edit_project_author_organization_tooltip=School, university, association... (optional) edit_project_author_url_tooltip=Personal web page (optional) edit_project_author_comments_tooltip=Field for other information (optional) edit_project_author_info=Author info: edit_project_author_add=Add author to list edit_project_author_edit=Edit author info edit_project_org_name=Name: edit_project_org_name_tooltip=School name edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=e-mail address of the school edit_project_org_url=URL: edit_project_org_url_tooltip=School website edit_project_org_address=Address: edit_project_org_address_tooltip=Snail-mail address edit_project_org_pc=PC: edit_project_org_pc_tooltip=Postal code edit_project_org_city=City: edit_project_org_city_tooltip=School city edit_project_org_country=Country: edit_project_org_state=State: edit_project_org_comments=Comments: edit_project_org=School/s: edit_project_org_tooltip=School or other institution involved in the project edit_project_org_info=Organization info: edit_project_org_add=Add organization edit_project_org_edit=Edit organization data edit_project_org_country_tooltip=Country, federation, union... edit_project_org_state_tooltip=Federal state, community, region... edit_project_org_comments_tooltip=Other info... edit_project_rev_date=Date: edit_project_rev_date_tooltip=Date of the revision edit_project_rev_authors=Authors: edit_project_rev_authors_tooltip=Authors of the revision edit_project_rev_description=Description: edit_project_rev_description_tooltip=Brief description of the changes made edit_project_rev_comments=Comments: edit_project_rev_comments_tooltip=Other relevant info edit_project_rev=Revisions: edit_project_rev_tooltip=History of main modifications made to the project edit_project_rev_add=Add revision record edit_project_rev_edit=Edit revision record edit_project_rev_info=Revision data edit_media_objects=objects edit_media_object=object edit_evsounds_start=Start of activity: edit_evsounds_click=Click on object: edit_evsounds_actionError=Erroneous action: edit_evsounds_actionOk=Correct action: edit_evsounds_finishedError=Activity finished with errors: edit_evsounds_finishedOk=Activity finished OK: edit_project_rev_err_nodesc=Error: The description field cannot be leaved blank! edit_evsounds_dlg_title=Edit event sounds edit_project_evsounds=Event sounds: edit_project_evsounds_tooltip=Set specific sounds for each JClic event edit_act_evsounds=Event sounds: edit_act_evsounds_tooltip=Set specific sounds for each JClic event edit_evsounds_default=default sound edit_evsounds_disabled=disabled edit_evsounds_chk_tooltip=Enable or disable the sound for this event edit_evsounds_select_tooltip=Click to select a sound for this event, or uncheck to use the default sound action_newProject_caption=New project... action_newProject_keys=NN action_newProject_tooltip=Create a new JClic project edit_arith_op_from=From: edit_arith_op_from_tooltip=Minimum value of the operator edit_arith_op_to=To: edit_arith_op_to_tooltip=Maximum value of the operator edit_arith_op_with=With: edit_arith_op_with_tooltip=If checked, the operator can also have this value edit_arith_op_fromList=One from the list: edit_arith_op_fromList_tooltip=List of possible values for the operator edit_arith_op_decimals=Decimals: edit_arith_op_decimals_tooltip=Number of decimals of the operand edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=First operand edit_arith_secondOp=Second operand edit_arith_title=Arith2 for JClic edit_arith_operations=Operations: edit_arith_operations_tooltip=Select the kind of operations to be performed edit_arith_operations_plus=Plus edit_arith_operations_minus=Minus edit_arith_operations_multiply=Multiply edit_arith_operations_divide=Divide edit_arith_unknown=Unknown: edit_arith_unknown_tooltip=Select the item that will act as a unknown edit_arith_unknown_aobx=The result is the unknown edit_arith_unknown_aoxr=The second operator is the unknown edit_arith_unknown_xobr=The first operator is the unknown edit_arith_unknown_axbr=The operation is the unknown edit_arith_unknown_invert=Write the result at the beggining of the expression edit_arith_result=Result: edit_arith_result_notCarry=Do not carry edit_arith_result_random=Random edit_arith_result_asc=Ascending edit_arith_result_order=Order by result: edit_arith_result_desc=Descending edit_arith_result_avoidDup=Avoid duplicates edit_arith_cond=Conditions: edit_arith_cond_ind=Indifferent edit_arith_cond_agb=The first operator must be greather than the second one edit_arith_cond_alb=The first operator must be lesser than the second one edit_arith_cond_tooltip=Other conditions edit_autocp=Automatic content generator: edit_autocp_tooltip=Select the type of automatic content generator for this activity. edit_autocp_block=Content generator edit_autocp_btn=Settings... edit_autocp_btn_tooltip=Configure the content provider settings edit_data=Edit data edit_act=Activity edit edit_acp=Content provider edit edit_acp_err_creating=Error creating the content provider! edit_project_author_group=Creation edit_project_description_block=Description edit_project_ui_block=User interface edit_act_description=Description: m_Edit=Edit m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=New activity... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Insert m_Insert_Mnemonic=I m_View=View m_View_Mnemonic=V action_editProject_caption=Project action_editProject_keys=PP action_editProject_tooltip=Edit project settings action_editMedia_caption=Media action_editMedia_keys=MM action_editMedia_tooltip=Edit the project's multimedia library action_editActivities_caption=Activities action_editActivities_keys=AA action_editActivities_tooltip=Edit the activities action_editSeq_caption=Sequences action_editSeq_keys=SS action_editSeq_tooltip=Edit the sequences of activities warn_project_modified=Current project has been modified. Do you want to save the changes? edit_project_descriptors_block=Descriptors edit_media_new=New media object... edit_media_new_tooltip=Add a new image or multimedia object to the library edit_media_new_keys=M* edit_seq_threshold=Score threshold: edit_seq_threshold_tooltip_up=Take this way when the global score is equal to or higher than... edit_seq_time=Time threshold: edit_seq_time_tooltip_up=In order to take this way, the time spent on the activities must be less than... edit_seq_threshold_tooltip_down=Take this way when the global score is lower than... edit_seq_time_tooltip_down=Take this way when the time spent on the activities is more than... edit_seq_condJump=Conditional jumps edit_seq_condJump_tooltip=Set special jumps to be executed only under specific condicions edit_seq_condJump_upper_tooltip=Set conditions to jump to an upper level edit_seq_condJump_lower=Lower jump: edit_seq_condJump_upper=Upper jump: edit_seq_condJump_lower_tooltip=Set conditions to jump to an lower level edit_seq_action_tooltip_fw=Action assigned to the "next" button edit_seq_action_tooltip_bk=Action assigned to the "previous" button edit_seq_jump_tooltip=Set the jump target edit_seq_action_tooltip=Action to be done edit_seq_activity_tooltip=Activity assigned to this sequence element edit_seq_tag_tooltip=Tag used to reference this sequence element (optional field) edit_seq_description_tooltip=Description of the sequence element (optional field) edit_seq_button_enabled_tooltip=Enable or disable the arrow button edit_seq_auto_tooltip=Move on automatically when the activity finishes edit_seq_delay_tooltip=Seconds to wait before to do the automatic move edit_color_dlgTitle=Select color edit_media_renaming=Please wait while the resource is being renamed... edit_act_cell_width=Width: edit_act_cell_width_tooltip=Cell width (in pixels) edit_act_cell_height=Height: edit_act_cell_height_tooltip=Cell height (in pixels) edit_act_hiddenWords=Hidden words: edit_act_hiddenWords_tooltip=List of the hidden words placed in the panel edit_act_wordSearch_panelB=Use panel B edit_act_wordSearch_panelB_tooltip=The contents of a second panel will be displayed as words are found edit_act_shaper_tooltip=Select the shaper type to be used in the panel edit_act_num_cols_tooltip=Number of columns of the panel edit_act_num_rows_tooltip=Number of rows of the panel edit_act_wildTransparent=Transparent delimiters edit_act_wildTransparent_tooltip=Treat the delimiters (black boxes) as transparent holes edit_act_behavior_scramble_times=Mixes\: edit_act_behavior_scramble_times_tooltip=Number of times to shuffle edit_act_copy_title=Copy attributtes to... edit_act_copy_attributes=Attributes edit_act_copy_dest=Apply to: edit_act_copy_style_main=Main window edit_act_copy_style_play=Play window edit_act_copy_activities=Activities to be modified: edit_act_copyAttributes=Copy attributes edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copy current activity attributes to other activities edit_new_project_name=Project name: edit_new_project_name_tooltip=Short, descriptive name of the project edit_new_project_filename=File name: edit_new_project_filename_tooltip=Name of the project file, without extension edit_new_project_folder=Folder: edit_new_project_folder_tooltip=Name of the folder where the project will be stored edit_new_project_folder_browse=Browse... edit_new_project_title=Create new JClic project edit_new_project_err_empty=Error: Project, file and folder must have valid, non-empty names. edit_new_project_warning_noEmptyFolder=This folder already contains another Clic 3.0 or JClic project. In order to avoid confusions, is preferable to maintain each project in a separate folder, but that isn't a strict rule. Do you really want to create the new project in this folder? edit_new_project_err_folderCreation=Error: Unable to create the specified folder! edit_act_copy_err_noSelection=Error: No activity selected! In order to use this function you must select in the list the activity or activities to wich the indicated attributes will be applied. edit_act_copy_action_prefix=Copying attributes to: edit_act_copy_margin=Margin edit_act_copy_bgColor=Background color edit_act_copy_gradient=Gradient edit_act_copy_bgImage=Background image edit_act_copy_border=Border edit_act_copy_transparentBg=Transparent background edit_act_copy_position=Position edit_act_copy_messages=Messages edit_act_copy_messages_ini=Style of initial message edit_act_copy_messages_end=Style of end message edit_act_copy_messages_err=Style of error message edit_act_copy_reports=Reports edit_act_copy_rep_include=Include activity in reports edit_act_copy_rep_actions=Record actions edit_act_copy_interface=User interface edit_act_copy_skin=Skin edit_act_copy_evSounds=Event sounds edit_act_copy_counters=Counters edit_act_copy_cTime=Time counter edit_act_copy_maxTime=Max. time edit_act_copy_cTries=Tries counter edit_act_copy_maxTries=Max. tries edit_act_copy_cScore=Score counter edit_act_copy_scramble=Times to scramble edit_act_copy_buttons=Buttons edit_act_copy_btnHelp=Help button edit_act_copy_btnInfo=Information button edit_act_copy_grids=Grids edit_act_copy_gridA=Style of grid A edit_act_copy_gridB=Style of grid B edit_act_copy_textGrid=Style of text grids edit_act_copy_text=Text activities edit_act_copy_fontFace=Font face edit_act_copy_fontSize=Font size edit_act_copy_fontStyle=Font style edit_act_copy_textColour=Main text colour edit_act_copy_textTargetColour=Select the JClic project of which the activities will be imported edit_act_copy_textErrorColour=Errors colour edit_act_copy_tabSpace=Tab space edit_act_copy_messages_prev=Style of previous message edit_act_changeType=Change activity type edit_act_newActivity_class_tooltip=Full name of the class to be used to build the activity (advanced users only!) edit_act_newActivity_other=Other... edit_act_newActivity_info=Advanced users can also create unregistered types of JClic activities. Just write below the full class name, prefixed by the package (like "com.acme.activities.FooActivity"). Activity classes must extend edu.xtec.jclic.Activity, and must be accessibles to the JVM classloader. edit_act_newActivity_name=Name of the activity: edit_act_newActivity_name_tooltip=Each activity must have a name unique in the project edit_act_changeType_warning=

Warning: Changing the type of activity can cause lost of some of the current activity attributes and objects. Use it with care!

 

applet_codebase=Location of JClic code: applet_codebase_tooltip=URL pointing to a folder with the JClic program files and scripts applet_prev_text=HTML code before: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Text or HTML code to be placed before the applet applet_post_text=HTML code after: applet_post_text_tooltip=Text or HTML code to be placed after the applet applet_size=Applet size: applet_size_tooltip=Width and height of the applet, in absolute or percentage values. applet_page_title=Page title: applet_page_title_tooltip=Text to be shown at the top of the browser window applet_created_info=The web page "%s" has been created successfully. applet_created_prompt=Do you want to open it now with the browser? action_createHTML_caption=Create a web page with a Java applet... applet_create_title=Creation of an HTML page with a JClic applet action_createHTML_tooltip=Create a HTML page with an applet containing the current project applet_filename=File name: applet_filename_tooltip=Name of the HTML file to be created action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Default values used in web page creation applet_bgcolor=Background color: applet_bgcolor_tooltip=HTML page background color applet_centered=Centered applet_centered_tooltip=Place the applet horizontally centered applet_width_tooltip=Applet width (absolute or percentage) applet_height_tooltip=Applet height (absolute or percentage) applet_exitUrl=On exit, go to: applet_exitUrl_tooltip=URL where to redirect the navigation on JClic exit applet_infoFrame=Info frame name: applet_infoFrame_tooltip=Name of the frame used to show the content related to the "info" button action_createInstaller_caption=Create project installer... action_createInstaller_keys=I* action_createInstaller_tooltip=Create a project installer script for JClic player installer_caption=Edit project installer script installer_title=Title: installer_title_tooltip=Project title, to be shown on the installer wizard installer_authors=Autors: installer_authors_tooltip=Author/s of the project (short text) installer_folder=Folder: installer_folder_tooltip=Folder name to be suggested by the installer wizard installer_files=Files to be copied: installer_files_tooltip=Files to be copied by the installer installer_files_available=Available files installer_files_selected=Selected files installer_files_add=>> add >> installer_files_add_tooltip=Add selected file to the list installer_files_remove=<< remove << installer_files_remove_tooltip=Remove selected file from the list installer_button=Launch button installer_button_tooltip=Properties of the button to be shown in the project library installer_button_project=Main project: installer_button_project_tooltip=JClic project to be launched by the button installer_button_text=Label: installer_button_text_tooltip=Short text label, to be shown inside the button installer_button_icon=Icon: installer_button_icon_tooltip=Picture to be used as button icon. Leave blank to use the default JClic icon. installer_button_description=Description installer_button_description_tooltip=Tooltip to be shown by the button installer_error_noTitle=Error: Missing project title installer_error_noBaseFolder=Error: Missing folder name installer_error_noFilesSelected=Error: No files selected installer_error_noButtonText=Error: Missing launch button text label installer_error_projectNotInFiles=Error: The project assigned to the launch button is not in the list of files to be copied applet_page_full=Full-page applet applet_page_mixed=Applet with specific dimensions edit_text_align_left=Align text left edit_text_align_center=Center text edit_text_align_right=Align text right edit_text_act_target_toggle=Create or remove target edit_text_act_insertCell=Insert a cell edit_text_act_content=Content edit_text_act_style=Style edit_cell_size=Cell size: edit_project_orphanActivities=The following activities never appear in any of the project's activity sequences, so they never will be displayed: edit_project_orphanMedia=The following media objects are not used directly in any activity: edit_project_orphanActivities_prompt=Do you want to add them at the end of the last activity sequence? edit_project_orphanMedia_prompt=Do you want to remove them? edit_project_orphanMedia_title=Removal of unused media objects edit_project_orphanActivities_title=Orphan activities edit_media_refreshAll=Update all media content edit_media_refreshAll_tooltip=Update all media objects reloading its files edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Updating media... edit_media_exportAll=Export all media edit_media_exportAll_tooltip=Save to files the content of all media elements edit_media_exportAll_keys=X* edit_shape_select=Select edit_shape_addPoint=Add point edit_shape_deletePoint=Delete edit_shape_drawRect=Draw rectangle edit_shape_drawEllipse=Draw ellipse edit_shape_drawPoly=Draw polygon edit_shape_toLine=Convert to line edit_shape_toBezier=Convert to B\u00e9zier curve edit_shape_toQuad=Convert to quadratic curve edit_shape_rLeft=Rotate left edit_shape_rRight=Rotate right edit_shape_expand=Expand edit_shape_contract=Contract edit_shape_zoomIn=Zoom in edit_shape_zoomOut=Zoom out edit_shape_aproxPoints=Join nearest points edit_shape_showPoints=Show points edit_shape_showPoints_tooltip=Show/Hide the points edit_shape_gridSize=Grid size: edit_shape_hideGrid=Show / Hide grid edit_shape_magnetRadius=Magnet radius: edit_shape_elements=Defined elements edit_shape_elemName=Name of the selected element edit_shape_magnetRadius_tooltip=Action radius of the magnet, when enabled edit_shape_gridSize_tooltip=Size of the grid edit_mc_activity=Activity: edit_mc_sequence=Sequence: edit_mc_url=URL: edit_mc_project=Project: edit_mc_activity_selection=Choose activity edit_mc_sequence_selection=Choose sequence edit_mc_err_nullContent=Insufficient data! edit_act_arrowColor=Arrow color: edit_act_arrowColor_tooltip=Color used by the editor to draw the arrows (not exactly, because an XOR bit mask is used) edit_act_editActivity=Edit... edit_act_editActivity_tooltip=Edit the selected activity action_saveFileAs_caption=Save as... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Save the current project with a different name edit_act_behavior_block=Behavior edit_act_behavior=Behavior edit_act_behavior_drag=Drag objects edit_act_behavior_drag_tooltip=Drag objects instead of use a connection line edit_act_behavior_order=Check solving order edit_act_behavior_order_tooltip=Cells must be solved in order edit_act_scramble=Scramble action_importActivities_caption=Import activities... action_importActivities_keys=I* action_importActivities_tooltip=Import activities from another project import_warn_samefile=The selected file corresponds to the current project. Activities can be imported only between different projects. Please select another project file. import_selectActivities=Select one or more activities to import into the current project\: import_importing=Importing... import_checkdep=Checking dependencies... import_impmedia=Importing media\: import_impact=Importing activity\: import_selectProject=Select the JClic project of which the activities will be imported edit_tagRep_tags=Tag marks edit_tagRep_tagStart=Start mark\: edit_tagRep_tagStart_tooltip=Mark used at the beginning of tags edit_tagRep_tagEnd=End mark\: edit_tagRep_tagEnd_tooltip=Mark used at the end of tags edit_tagRep_file=File edit_tagRep_fileName=File or URL\: edit_tagRep_fileName_tooltip=Name or URL of the file containing the values that will replace tags edit_tagRep_charset=Charset\: edit_tagRep_charset_tooltip=Character encoding used in the file edit_tagRep_browseFile=Browse... edit_tagRep_browseFile_tooltip=Browse the filesystem edit_tagRep_title=Tag replacing edit_text_act_clearStylesBtn=Clear text styles... edit_text_act_clearStylesPrompt=Warning\: This action will clear the specific character attributes applied to the document, setting it back to its main style. This action cannot be undone. Do you want to do it? img_max_size=Maximum size of images: img_max_width_tooltip=Maximum width of images imported into the media library. img_max_height_tooltip=Maximum height of images imported into the media library. img_resize_prompt=The image "%s" has a size of %s pixels. This exceeds the maximum allowed by JClic Author (%s). Do you want to resize it? export_project_desc=Please specify the folder where the project will be exported. export_project_output_folder=Export folder: export_project_title=Export current project to HTML5 export_project_includeAll=Export all JClic projects located in the current folder export_project_exportSCORM=Create also a ZIP file in SCORM format with all the files needed to play the activities export_project_scorm_file=SCORM file: export_project_scorm_file_tooltip=Please specify the path of the SCORM file export_project_scorm_file_browse=Select file... export_project_scorm_file_exists=WARNING: The specified SCORM file already exists. Do you want to overwrite it? export_project_err_empty=An output folder must be specified! export_project_warning_noEmptyFolder=WARNING: The selected folder is not empty! Its current content will be overwritten during the exporting process. Do you really want to export the current project into this folder? export_project_err_sameFolder=The export folder cannot be the same as the current project. Please specify another location. export_project_err_nestedFolders=The output folder cannot be a subdirectory of the current project folder. Please specify another location. export_project_selectFolder=Select folder... export_project_exporting=Exporting project to HTML5... export_project_notice=To publish the HTML5 activities, just upload this folder to a web server and open \"index.html\".\n\nTo preview the activities directly from your computer, click on \"Open in browser\".\n export_project_scorm_notice=You can also load "%s" into a LMS as a SCORM object (basic reporting with just one score per user's session) or use it with the JClic module for Moodle, that provides more options and detailed results. export_project_finished=Project successfully exported to HTML5 into: export_project_copyLog=Copy log to clipboard export_project_launchBrowser=Open in web browser export_project_numActivities=Activities exported: export_project_mediaFiles=Media files exported: export_project_totalSize=Total size (bytes): action_exportProject_caption=Export to HTML5... action_exportProject_tooltip=Export the activities to HTML5 so that they can be used in any web browser action_exportProject_keys = HH js_codebase=HTML5 JavaScript file: js_codebase_tooltip=URL pointing to a valid 'jclic.min.js' file settings_html=Applet & HTML5 settings_license=License: settings_license_tooltip=Choose between Creative Commons licenses or 'other' settings_license_other=Other (indicate it in 'Description') warn_save_scorm_file=Current file is of type "scorm.zip".\nFiles of this type must be converted to the standard format "jclic.zip" prior to be saved. Once converted, the activities can be exported back to HTML5 and packaged in SCORM format.\n\nDo you want to save the current project in ".jclic.zip" format? src/author/edu/xtec/resources/messages/AuthorMessages_ar.properties000066400000000000000000001154141335566474600262730ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Description edit_act_name_tooltip=Name of the activity edit_act_name=Name: edit_act_description_tooltip=Description of the activity edit_act_reports_block=Reports edit_act_includeInReports=Include this activity in reports edit_act_includeInReports_tooltip=Include the results of this activity in users' reports edit_act_code=Code: edit_act_code_tooltip=Optional code used to group and search in the reports database. edit_act_reportActions=Report user actions edit_act_reportActions_tooltip=Register the details of all the actions performed by users edit_act_counters_block=Counters edit_act_timeCounter=Time counter edit_act_timeCounter_tooltip=Show/hide the time conter edit_act_actionsCounter=Tries counter edit_act_actionsCounter_tooltip=Show/hide the tries counter edit_act_scoreCounter=Score counter edit_act_scoreCounter_tooltip=Show/hide the score counter. edit_act_maxTime=Max time: edit_act_maxTime_tooltip=Maximum time to to solve the activity, in seconds, or 0 for unlimited time. edit_act_countdown=Countdown edit_act_countdown_tooltip=The counter starts at m\u00E1ximum value, decreasing to 0. edit_act_maxActions=Max tries: edit_act_maxActions_tooltip=Maximum number of tries allowed, or 0 for unlimited tries. edit_act_buttons_block=Buttons edit_act_helpBtn=Help edit_act_helpBtn_tooltip=Show/hide help button edit_act_helpBtn_solution=Show solution edit_act_helpBtn_msg=Show this message: edit_act_infoBtn=Information edit_act_infoBtn_tooltip=Show/Hide the button of information edit_act_infoBtn_url=Show this URL: edit_act_infoBtn_cmd=Execute this command: edit_act_infoBtn_url_tooltip=Web site address to show when click on the info button edit_act_infoBtn_cmd_tooltip=Command line to be executed on click to the info button. edit_act_mainWindow=Main window: edit_act_gameWindow=Game window: edit_act_margin=Margin: edit_act_margin_tooltip=Horizontal and vertical spacing between visual objects. edit_act_bgColor=Background color: edit_act_bgColor_tooltip=Change the background color. edit_gradient_startColor=Start color: edit_gradient_endColor=End color: edit_gradient_startColor_tooltip=Selection of the start color edit_gradient_endColor_tooltip=Selection of the end color edit_gradient_cycles=Cycles: edit_gradient_cycles_tooltip=Number of repetitions of the gradient over the paint surface edit_gradient_orientation=Orientation: edit_gradient_orientation_tooltip=Gradient's orientation, measured in degrees over the horizontal edit_act_gradient=Gradient: edit_act_gradient_tooltip=Use gradient of colours edit_color_opacity=Opacity edit_color_opacity_tooltip=Set the color's alpha channel (opacity) value. edit_gradient_title=Gradient edit_gradient_default=Use default values (null gradient) edit_act_image=Image: edit_act_descriptionTab=Description edit_act_descriptionTab_tooltip=Name and description edit_act_tiledBgImg=Tiled edit_act_tiledBgImg_tooltip=Paint all the surface with the image, repeating it along the X and Y axis as needed. edit_act_preview=Preview: edit_act_border=Border edit_act_border_tooltip=Draw a line border arround the window edit_act_transparent=Transparent edit_act_transparent_tooltip=Window has transparent background edit_act_width=Width: edit_act_height=Height: edit_act_width_tooltip=Width of the object, measured in pixels edit_act_height_tooltip=Height of the object, measured in pixels edit_act_centered=Centered edit_act_centered_tooltip=The object will be centered over the main window edit_act_x=X: edit_act_x_tooltip=Absolute horizontal location edit_act_y=Y: edit_act_y_tooltip=Absolute vertical location edit_act_ui_block=User interface edit_act_image_tooltip=Select an image edit_act_text=Text: edit_act_text_tooltip=Text to be shown inside this object edit_font_face=Typeface: edit_font_size=Size: edit_font_bold=Bold edit_font_italic=Italic edit_font_underline=Underline edit_font_style=Style: edit_cell_title=Cell contents edit_act_messages=Messages edit_act_msg_initial=Initial message: edit_act_msg_final=Final message: edit_act_msg_prev=Previous message: edit_act_msg_error=Error message: edit_act_msg_initial_tooltip=Message to be shown when the activity starts edit_act_msg_final_tooltip=Message to be shown when the activity is finished edit_act_msg_error_tooltip=Message to be shown when the activity ends with errors edit_act_msg_prev_tooltip=Message to be shown prior to the start of the activity (only in certain types of activities) edit_align=Align: edit_act_textColor=Text color: edit_act_textColor_tooltip=Color used to draw text edit_act_shadowColor=Shadow color: edit_act_shadowColor_tooltip=Color used for drawing the text's shadow, when appliable edit_act_shadow=Shadow edit_act_shadow_tooltip=Draw text with shadow edit_act_borderColor=Border color: edit_act_borderColor_tooltip=Color used to draw the cell's border edit_act_inactiveColor=Inactive state color: edit_act_inactiveColor_tooltip=Color used when the cell is disabled edit_act_altColor=Alternative color: edit_act_altColor_tooltip=Color used to draw the alternative content in solved cells. edit_cell_marked=Marked edit_cell_disabled=Disabled edit_cell_alt=Alternative edit_cell_textMargin=Internal margin: edit_cell_textMargin_tooltip=Amount of space between cell's border and text. edit_cell_borderWidth=Border width: edit_cell_borderWidth_tooltip=Width of the stroke used to draw the standard border edit_cell_markerWidth=Marker width: edit_cell_markerWidth_tooltip=Width of the stroke used to draw the border when the cell is marked or selected edit_cell_alt_tooltip=Preview in "alternative" state edit_cell_disabled_tooltip=Preview in "disabled" state edit_cell_marked_tooltip=Preview in "marked" state edit_act_testAction=Preview activity edit_act_testAction_tooltip=Preview and test the activity edit_act_panels_description=Description edit_act_panels_description_tooltip=Title and description of the activity edit_act_panels_options=Options edit_act_panels_options_tooltip=Options of the activity edit_act_panels_frame=Window edit_act_panels_frame_tooltip=Aspect, size and position of the activity window edit_act_panels_messages=Messages edit_act_panels_messages_tooltip=Content of the activity messages edit_act_panels_panel=Panel edit_act_panels_panel_tooltip=Contents of the panel edit_style_title=Style edit_style_tooltip=Set the cells color, font and size edit_act_style=Style: edit_act_overlap=Avoid text overlap image edit_act_overlap_tooltip=Try to avoid text overlapping over image edit_media_exists_1=The file edit_media_exists_2=already exists in the media library! edit_act_shaper=Shaper: edit_act_shaper_err=Shaper error: edit_act_num_cols=Columns: edit_act_num_rows=Rows: edit_act_toothHeightFactor=Tooth height: edit_act_toothWidthFactor=Tooth width: edit_act_toothRandom=Random distribution edit_act_shaper_properties=Shaper properties edit_act_panels_text=Text edit_act_panels_text_tooltip=Text of the activity action_saveFile_caption=Save... action_saveFile_keys=SS action_saveFile_tooltip=Save the current project action_docTree_caption=Document tree... action_docTree_keys=T* action_docTree_tooltip=Show the project's document as a tree edit_docTree_title=Document tree edit_media_referencedBy=Referenced by: msg_prompt_loadReferences=Warning:

This project connects with other projects.
Do you want to explore the links and to load all the related files?

(It's advisable to answer YES when importing Clic 3.0 activities) edit_mc_type=Type: edit_mc_type_unknown=Unknown edit_mc_type_sound=Play sound edit_mc_type_video=Play video edit_mc_type_midi=Play MIDI edit_mc_type_cdaudio=Play CD audio edit_mc_type_record=Record sound edit_mc_type_play_recorded=Play recorded sound edit_mc_type_run_activity=Go to activity edit_mc_type_run_sequence=Go to sequence edit_mc_type_run_external=Run program edit_mc_type_url=Show URL edit_mc_type_exit=End edit_mc_type_return=Return edit_mc_level=Priority level: edit_mc_file=File: edit_mc_externalParam=Parameters: edit_mc_from=From: edit_mc_to=To: edit_mc_length=Max. length: edit_mc_recBuffer=Record tape: edit_mc_stretch=Stretch size edit_mc_location=Location: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=From: edit_mc_location_from_box=Cell edit_mc_location_from_window=Window edit_mc_location_from_frame=Frame edit_mc_loop=Loop playback edit_mc_autostart=Auto start edit_mc_catchmouse=Catch mouse edit_mc_title=Multimedia and active content edit_mc_label=Active content: edit_media_dlg_title=Multimedia object selection edit_media_title=Media library edit_mc_pos_cell=Centered over cell edit_mc_pos_window=Centered over window edit_mc_pos_absolute=Specify position: edit_tree_badFormat=Incorrect tree structure or data! edit_act_panels_controls=Controls edit_act_panels_controls_tooltip=Options for buttons and counters edit_act_class=Type: edit_act_gridLayout=Grid layout: edit_act_gridLayout_tooltip=Relative postion of the panels A and B. edit_act_inverseResolution=Inverse resolution edit_act_inverseResolution_tooltip=The activity is solved when all assigned elements of "B" are matched. edit_act_showAllArrows=Show all arrows edit_act_alt=Alternative content: edit_act_alt_tooltip=Content shown in solved cells and non-assigned cells. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Edit the alternative content edit_act_grid=Grid edit_act_grid_A=Grid A edit_act_grid_B=Grid B edit_act_grid_layout=Layout edit_act_grid_relationship=Relationship edit_seq_activity_header=activity edit_seq_tag_header=tag edit_seq_jump_header=jump to edit_seq_activity=Activity: edit_seq_tag=Label: edit_seq_description=Description: edit_seq_auto=Move on automatically edit_seq_delay=Delay: edit_seq_action_fwd=Go forward edit_seq_action_back=Go bak edit_seq_action_jump=Jump to... edit_seq_action_stop=Stop edit_seq_action_return=Return edit_seq_action_exit=Exit JClic edit_seq_arrow_fwd=Forward arrow: edit_seq_arrow_back=Back arrow: edit_seq_action=Action: edit_seq_button_enabled=Show button edit_seq_project=JClic Project: edit_act_absolute=Absolute position edit_act_absolute_tooltip=The object will be placed at the specified X and Y co-ordinates edit_act_location=Location: edit_seq_newElement=New sequence element... edit_seq_newElement_tooltip=Insert a new element into the activity sequence edit_seq_newElement_msg=Please select an activity for the new sequence element. edit_seq_newElement_error_noAct=Cannot create a new sequence element without activity! edit_seq_newElement_error_emptyList=This project has no activities! Unable to create sequence elements in an empty project. edit_seq_jump_msg=Jump target: edit_seq_jump_title=Jump target edit_act_newActivity_tooltip=Add a new activity to project edit_act_prompt_class=Type of activity: edit_act_prompt_name=Name: edit_act_newActivity_msg=Please select the type of activity to create and give it a name: edit_act_newActivity_error_noAct=You must select an activity type! edit_act_newActivity_error_noName=You must especify a name for the activity! edit_act_newActivity_error_creating=Unable to create activity! edit_act_newActivity_class=Java class name: edit_text_act_format=Format edit_text_act_answer=Answer edit_text_act_popup=Pop up edit_text_act_answer_label=Valid answers: edit_list_newElement_tooltip=Add a new list element edit_list_editElement_tooltip=Edit the selected list element edit_list_deleteElement_tooltip=Delete the selected list element edit_list_upBtn_tooltip=Move up edit_list_downBtn_tooltip=Move down edit_list_newValue=New text: edit_list_addElement=Add new list element edit_list_modifyValue=Modify selected text edit_text_act_target=Target edit_text_act_maxLen=Max. length: edit_text_act_maxLen_tooltip=Maximum amount of characters in the answer. edit_text_act_fillingChar=Filling character edit_text_act_fillingChar_tooltip=Character used to indicate the blank edit_text_act_iniLen=Initial length: edit_text_act_iniLen_tooltip=Number of filling chars that will be displayed at the beginning of the activity. edit_text_act_iniText=Initial text: edit_text_act_iniText_tooltip=Text displayed in the blank at the beggining of the activity. edit_text_act_list=Show a list of options: edit_text_act_list_tooltip=Display a list of options from which the user must select one. edit_text_act_check_title=Correction options edit_text_act_popup_no=No pop up edit_text_act_popup_always=Pop up automatically edit_text_act_popup_onError=Pop up in errors edit_text_act_popup_onDemand=Pop up with F1 edit_text_act_popup_type=Type: edit_text_act_popup_delay=Pop up delay: edit_text_act_popup_maxTime=Max. time: edit_text_act_popup_onlyPlay=Sound only edit_text_act_err_noSelection=You must select a fragment of text in order to create a new text target! edit_text_act_err_badCharInSelection=Target text cannot include paragraph returns nor tabs. edit_text_act_err_nestedTargets=Targets cannot nest! edit_text_act_err_cellInTarget=Targets cannot contain cells! edit_text_act_pageBgColor=Paper colour: edit_text_act_editStylesBtn=Edit document styles... edit_text_act_mainStyle=Main style: edit_text_act_tabSpc=Tab space: edit_text_act_tabSize=Spaces between tab marks: edit_text_act_colors=Colors: edit_text_act_targetStyle=Target colors: edit_text_act_errorStyle=Error colors: edit_text_act_preview=Preview: edit_text_act_styleSample_default_start=Standard text edit_text_act_styleSample_target=target edit_text_act_styleSample_error=error edit_text_act_styleSample_default_fill=standard text edit_text_act_styleSample_default_end=standard text. edit_text_act_warnDeleteTarget=Warning: This action will supress the currently selected target. Do you want to proceed? edit_text_act_prevScreen_title=Previous screen... edit_text_act_prevScreen_no=Don't display any text before starting the activity edit_text_act_prevScreen_original=Display the complete text of the exercise edit_text_act_prevScreen_special=Display this text: edit_text_act_prevScreen_time=Max. time: edit_text_act_edit_target=Target... edit_text_act_checkButton_show=Show correction button edit_text_act_checkButtonText=Button text: edit_text_act_checkCase=Match case edit_text_act_checkAccents=Consider accents and special characters edit_text_act_checkPunct=Consider punctuation marks edit_text_act_checkDoubleSpc=Allow repeated spaces edit_text_act_checkOptions=Criteria edit_text_act_checkAutoJump=Move on to next target when filled in edit_text_act_checkForceOk=Move only after correct guess edit_text_act_checkDetail=Indicate mistakes letter by letter edit_text_act_checkDetail_params=Analysis algorithm parameters: edit_text_act_checkDetail_steps=Steps: edit_text_act_checkDetail_field=Exploration field: edit_text_act_defaultCheckButtonText=Check edit_text_act_advancedCorrectionOptions=Answer analysis edit_text_act_check_bt=Correction... edit_text_act_checkButton=Correction button edit_text_act_checkProgress=Progress edit_text_act_typeBtn=Type... edit_text_act_orderParagraphs=Order paragraphs edit_text_act_orderWords=Order words edit_text_act_order_amongstPar=Shuffle words amongst paragraphs edit_text_act_type_title=Activity type edit_text_act_warnChangeType=This action will clear all the existing targets. Do you want to proceed? edit_text_act_identWords=Identify words edit_text_act_identChars=Identify characters edit_media_change_name=Change name... edit_media_change_file=Change file... edit_media_includeInZip=Save into ZIP file edit_media_type=Media type: edit_media_size=File size: edit_media_show_type=Files of type: edit_media_preview=Preview media edit_media_preview_tooltip=Preview media resource edit_media_rename=Change resource name edit_media_rename_title=Rename edit_media_rename_prompt=New name: edit_media_rename_invalid=Invalid resource name! edit_media_rename_exists=There is another resource with this name! Each resource must have a unique name. edit_media_chfile_invalid=Invalid file! err_media_chfile_different=File must be of same type edit_media_font_error=Unable to load font! edit_media_save_file=Save file (extract from ZIP) edit_media_refresh_file=Update media content from file edit_media_warn_zipFileNotExternal=This is not a "real" file, but a object located into a ZIP container. In order to use this feature, a file with the same name must be present in the folder where the ZIP file is located. edit_activities=Activities edit_sequences=Sequences edit_media=Media library edit_media_tooltip=Manage images and other media files used in the project edit_activities_tooltip=Create and edit project activities edit_sequences_tooltip=Edit and create sequences of activities edit_project_title=Title: edit_project_title_tooltip=Project's title edit_project=Project edit_project_tooltip=Edit project properties edit_project_description=Description: edit_project_description_tooltip=General description of the project edit_project_area=Areas: edit_project_area_tooltip=Curricular areas of the project edit_project_level=Levels: edit_project_level_tooltip=Educational levels of the project edit_project_descriptors=Descriptors: edit_project_descriptors_tooltip=Descriptors of the project (separed with comma) edit_project_languages=Languages: edit_project_languages_tooltip=Languages used in the project edit_project_languages_modify=Change the selected language edit_project_languages_add=Add language edit_project_languages_select=ISO-639 language codes: edit_project_authors=Authors: edit_project_authors_tooltip=People involved in the creation of the project edit_project_author_name=Name: edit_project_author_mail=e-mail: edit_project_author_rol=Rol: edit_project_author_organization=Organization: edit_project_author_comments=Comments: edit_project_author_url=URL: edit_project_author_name_tooltip=Author's name (required) edit_project_author_mail_tooltip=Author's e-mail (optional) edit_project_author_rol_tooltip=Person's rol in the project: author, collaborator, drawings, sounds... (optional) edit_project_author_organization_tooltip=School, university, association... (optional) edit_project_author_url_tooltip=Personal web page (optional) edit_project_author_comments_tooltip=Field for other information (optional) edit_project_author_info=Author info: edit_project_author_add=Add author to list edit_project_author_edit=Edit author info edit_project_org_name=Name: edit_project_org_name_tooltip=School name edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=e-mail address of the school edit_project_org_url=URL: edit_project_org_url_tooltip=School website edit_project_org_address=Address: edit_project_org_address_tooltip=Snail-mail address edit_project_org_pc=PC: edit_project_org_pc_tooltip=Postal code edit_project_org_city=City: edit_project_org_city_tooltip=School city edit_project_org_country=Country: edit_project_org_state=State: edit_project_org_comments=Comments: edit_project_org=School/s: edit_project_org_tooltip=School or other institution involved in the project edit_project_org_info=Organization info: edit_project_org_add=Add organization edit_project_org_edit=Edit organization data edit_project_org_country_tooltip=Country, federation, union... edit_project_org_state_tooltip=Federal state, community, region... edit_project_org_comments_tooltip=Other info... edit_project_rev_date=Date: edit_project_rev_date_tooltip=Date of the revision edit_project_rev_authors=Authors: edit_project_rev_authors_tooltip=Authors of the revision edit_project_rev_description=Description: edit_project_rev_description_tooltip=Brief description of the changes made edit_project_rev_comments=Comments: edit_project_rev_comments_tooltip=Other relevant info edit_project_rev=Revisions: edit_project_rev_tooltip=History of main modifications made to the project edit_project_rev_add=Add revision record edit_project_rev_edit=Edit revision record edit_project_rev_info=Revision data edit_media_objects=objects edit_media_object=object edit_evsounds_start=Start of activity: edit_evsounds_click=Click on object: edit_evsounds_actionError=Erroneous action: edit_evsounds_actionOk=Correct action: edit_evsounds_finishedError=Activity finished with errors: edit_evsounds_finishedOk=Activity finished OK: edit_project_rev_err_nodesc=Error: The description field cannot be leaved blank! edit_evsounds_dlg_title=Edit event sounds edit_project_evsounds=Event sounds: edit_project_evsounds_tooltip=Set specific sounds for each JClic event edit_act_evsounds=Event sounds: edit_act_evsounds_tooltip=Set specific sounds for each JClic event edit_evsounds_default=default sound edit_evsounds_disabled=disabled edit_evsounds_chk_tooltip=Enable or disable the sound for this event edit_evsounds_select_tooltip=Click to select a sound for this event, or uncheck to use the default sound action_newProject_caption=New project... action_newProject_keys=NN action_newProject_tooltip=Create a new JClic project edit_arith_op_from=From: edit_arith_op_from_tooltip=Minimum value of the operator edit_arith_op_to=To: edit_arith_op_to_tooltip=Maximum value of the operator edit_arith_op_with=With: edit_arith_op_with_tooltip=If checked, the operator can also have this value edit_arith_op_fromList=One from the list: edit_arith_op_fromList_tooltip=List of possible values for the operator edit_arith_op_decimals=Decimals: edit_arith_op_decimals_tooltip=Number of decimals of the operand edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=First operand edit_arith_secondOp=Second operand edit_arith_title=Arith2 for JClic edit_arith_operations=Operations: edit_arith_operations_tooltip=Select the kind of operations to be performed edit_arith_operations_plus=Plus edit_arith_operations_minus=Minus edit_arith_operations_multiply=Multiply edit_arith_operations_divide=Divide edit_arith_unknown=Unknown: edit_arith_unknown_tooltip=Select the item that will act as a unknown edit_arith_unknown_aobx=The result is the unknown edit_arith_unknown_aoxr=The second operator is the unknown edit_arith_unknown_xobr=The first operator is the unknown edit_arith_unknown_axbr=The operation is the unknown edit_arith_unknown_invert=Write the result at the beggining of the expression edit_arith_result=Result: edit_arith_result_notCarry=Do not carry edit_arith_result_random=Random edit_arith_result_asc=Ascending edit_arith_result_order=Order by result: edit_arith_result_desc=Descending edit_arith_result_avoidDup=Avoid duplicates edit_arith_cond=Conditions: edit_arith_cond_ind=Indifferent edit_arith_cond_agb=The first operator must be greather than the second one edit_arith_cond_alb=The first operator must be lesser than the second one edit_arith_cond_tooltip=Other conditions edit_autocp=Automatic content generator: edit_autocp_tooltip=Select the type of automatic content generator for this activity. edit_autocp_block=Content generator edit_autocp_btn=Settings... edit_autocp_btn_tooltip=Configure the content provider settings edit_data=Edit data edit_act=Activity edit edit_acp=Content provider edit edit_acp_err_creating=Error creating the content provider! edit_project_author_group=Creation edit_project_description_block=Description edit_project_ui_block=User interface edit_act_description=Description: m_Edit=Edit m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=New activity... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Insert m_Insert_Mnemonic=I m_View=View m_View_Mnemonic=V action_editProject_caption=Project action_editProject_keys=PP action_editProject_tooltip=Edit project settings action_editMedia_caption=Media action_editMedia_keys=MM action_editMedia_tooltip=Edit the project's multimedia library action_editActivities_caption=Activities action_editActivities_keys=AA action_editActivities_tooltip=Edit the activities action_editSeq_caption=Sequences action_editSeq_keys=SS action_editSeq_tooltip=Edit the sequences of activities warn_project_modified=Current project has been modified. Do you want to save the changes? edit_project_descriptors_block=Descriptors edit_media_new=New media object... edit_media_new_tooltip=Add a new image or multimedia object to the library edit_media_new_keys=M* edit_seq_threshold=Score threshold: edit_seq_threshold_tooltip_up=Take this way when the global score is equal to or higher than... edit_seq_time=Time threshold: edit_seq_time_tooltip_up=In order to take this way, the time spent on the activities must be less than... edit_seq_threshold_tooltip_down=Take this way when the global score is lower than... edit_seq_time_tooltip_down=Take this way when the time spent on the activities is more than... edit_seq_condJump=Conditional jumps edit_seq_condJump_tooltip=Set special jumps to be executed only under specific condicions edit_seq_condJump_upper_tooltip=Set conditions to jump to an upper level edit_seq_condJump_lower=Lower jump: edit_seq_condJump_upper=Upper jump: edit_seq_condJump_lower_tooltip=Set conditions to jump to an lower level edit_seq_action_tooltip_fw=Action assigned to the "next" button edit_seq_action_tooltip_bk=Action assigned to the "previous" button edit_seq_jump_tooltip=Set the jump target edit_seq_action_tooltip=Action to be done edit_seq_activity_tooltip=Activity assigned to this sequence element edit_seq_tag_tooltip=Tag used to reference this sequence element (optional field) edit_seq_description_tooltip=Description of the sequence element (optional field) edit_seq_button_enabled_tooltip=Enable or disable the arrow button edit_seq_auto_tooltip=Move on automatically when the activity finishes edit_seq_delay_tooltip=Seconds to wait before to do the automatic move edit_color_dlgTitle=Select color edit_media_renaming=Please wait while the resource is being renamed... edit_act_cell_width=Width: edit_act_cell_width_tooltip=Cell width (in pixels) edit_act_cell_height=Height: edit_act_cell_height_tooltip=Cell height (in pixels) edit_act_hiddenWords=Hidden words: edit_act_hiddenWords_tooltip=List of the hidden words placed in the panel edit_act_wordSearch_panelB=Use panel B edit_act_wordSearch_panelB_tooltip=The contents of a second panel will be displayed as words are found edit_act_shaper_tooltip=Select the shaper type to be used in the panel edit_act_num_cols_tooltip=Number of columns of the panel edit_act_num_rows_tooltip=Number of rows of the panel edit_act_wildTransparent=Transparent delimiters edit_act_wildTransparent_tooltip=Treat the delimiters (black boxes) as transparent holes edit_act_behavior_scramble_times=Mixes: edit_act_behavior_scramble_times_tooltip=Number of times to shuffle edit_act_copy_title=Copy attributtes to... edit_act_copy_attributes=Attributes edit_act_copy_dest=Apply to: edit_act_copy_style_main=Main window edit_act_copy_style_play=Play window edit_act_copy_activities=Activities to be modified: edit_act_copyAttributes=Copy attributes edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copy current activity attributes to other activities edit_new_project_name=Project name: edit_new_project_name_tooltip=Short, descriptive name of the project edit_new_project_filename=File name: edit_new_project_filename_tooltip=Name of the project file, without extension edit_new_project_folder=Folder: edit_new_project_folder_tooltip=Name of the folder where the project will be stored edit_new_project_folder_browse=Browse... edit_new_project_title=Create new JClic project edit_new_project_err_empty=Error: Project, file and folder must have valid, non-empty names. edit_new_project_warning_noEmptyFolder=This folder already contains another Clic 3.0 or JClic project. In order to avoid confusions, is preferable to maintain each project in a separate folder, but that isn't a strict rule. Do you really want to create the new project in this folder? edit_new_project_err_folderCreation=Error: Unable to create the specified folder! edit_act_copy_err_noSelection=Error: No activity selected! In order to use this function you must select in the list the activity or activities to wich the indicated attributes will be applied. edit_act_copy_action_prefix=Copying attributes to: edit_act_copy_margin=Margin edit_act_copy_bgColor=Background color edit_act_copy_gradient=Gradient edit_act_copy_bgImage=Background image edit_act_copy_border=Border edit_act_copy_transparentBg=Transparent background edit_act_copy_position=Position edit_act_copy_messages=Messages edit_act_copy_messages_ini=Style of initial message edit_act_copy_messages_end=Style of end message edit_act_copy_messages_err=Style of error message edit_act_copy_reports=Reports edit_act_copy_rep_include=Include activity in reports edit_act_copy_rep_actions=Record actions edit_act_copy_interface=User interface edit_act_copy_skin=Skin edit_act_copy_evSounds=Event sounds edit_act_copy_counters=Counters edit_act_copy_cTime=Time counter edit_act_copy_maxTime=Max. time edit_act_copy_cTries=Tries counter edit_act_copy_maxTries=Max. tries edit_act_copy_cScore=Score counter edit_act_copy_scramble=Times to scramble edit_act_copy_buttons=Buttons edit_act_copy_btnHelp=Help button edit_act_copy_btnInfo=Information button edit_act_copy_grids=Grids edit_act_copy_gridA=Style of grid A edit_act_copy_gridB=Style of grid B edit_act_copy_textGrid=Style of text grids edit_act_copy_text=Text activities edit_act_copy_fontFace=Font face edit_act_copy_fontSize=Font size edit_act_copy_fontStyle=Font style edit_act_copy_textColour=Main text colour edit_act_copy_textTargetColour=Select the JClic project of which the activities will be imported edit_act_copy_textErrorColour=Errors colour edit_act_copy_tabSpace=Tab space edit_act_copy_messages_prev=Style of previous message edit_act_changeType=Change activity type edit_act_newActivity_class_tooltip=Full name of the class to be used to build the activity (advanced users only!) edit_act_newActivity_other=Other... edit_act_newActivity_info=Advanced users can also create unregistered types of JClic activities. Just write below the full class name, prefixed by the package (like "com.acme.activities.FooActivity"). Activity classes must extend edu.xtec.jclic.Activity, and must be accessibles to the JVM classloader. edit_act_newActivity_name=Name of the activity: edit_act_newActivity_name_tooltip=Each activity must have a name unique in the project edit_act_changeType_warning=

Warning: Changing the type of activity can cause lost of some of the current activity attributes and objects. Use it with care!

 

applet_codebase=Location of JClic code: applet_codebase_tooltip=URL pointing to a folder with the JClic program files and scripts applet_prev_text=HTML code before: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Text or HTML code to be placed before the applet applet_post_text=HTML code after: applet_post_text_tooltip=Text or HTML code to be placed after the applet applet_size=Applet size: applet_size_tooltip=Width and height of the applet, in absolute or percentage values. applet_page_title=Page title: applet_page_title_tooltip=Text to be shown at the top of the browser window applet_created_info=The web page "%s" has been created successfully. applet_created_prompt=Do you want to open it now with the browser? action_createHTML_caption=Create web page... applet_create_title=Creation of an HTML page with a JClic applet action_createHTML_tooltip=Create a HTML page with an applet containing the current project applet_filename=File name: applet_filename_tooltip=Name of the HTML file to be created action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Default values used in web page creation applet_bgcolor=Background color: applet_bgcolor_tooltip=HTML page background color applet_centered=Centered applet_centered_tooltip=Place the applet horizontally centered applet_width_tooltip=Applet width (absolute or percentage) applet_height_tooltip=Applet height (absolute or percentage) applet_exitUrl=On exit, go to: applet_exitUrl_tooltip=URL where to redirect the navigation on JClic exit applet_infoFrame=Info frame name: applet_infoFrame_tooltip=Name of the frame used to show the content related to the "info" button action_createInstaller_caption=Create project installer... action_createInstaller_keys=I* action_createInstaller_tooltip=Create a project installer script for JClic player installer_caption=Edit project installer script installer_title=Title: installer_title_tooltip=Project title, to be shown on the installer wizard installer_authors=Autors: installer_authors_tooltip=Author/s of the project (short text) installer_folder=Folder: installer_folder_tooltip=Folder name to be suggested by the installer wizard installer_files=Files to be copied: installer_files_tooltip=Files to be copied by the installer installer_files_available=Available files installer_files_selected=Selected files installer_files_add=>> add >> installer_files_add_tooltip=Add selected file to the list installer_files_remove=<< remove << installer_files_remove_tooltip=Remove selected file from the list installer_button=Launch button installer_button_tooltip=Properties of the button to be shown in the project library installer_button_project=Main project: installer_button_project_tooltip=JClic project to be launched by the button installer_button_text=Label: installer_button_text_tooltip=Short text label, to be shown inside the button installer_button_icon=Icon: installer_button_icon_tooltip=Picture to be used as button icon. Leave blank to use the default JClic icon. installer_button_description=Description installer_button_description_tooltip=Tooltip to be shown by the button installer_error_noTitle=Error: Missing project title installer_error_noBaseFolder=Error: Missing folder name installer_error_noFilesSelected=Error: No files selected installer_error_noButtonText=Error: Missing launch button text label installer_error_projectNotInFiles=Error: The project assigned to the launch button is not in the list of files to be copied applet_page_full=Full-page applet applet_page_mixed=Applet with specific dimensions edit_text_align_left=Align text left edit_text_align_center=Center text edit_text_align_right=Align text right edit_text_act_target_toggle=Create or remove target edit_text_act_insertCell=Insert a cell edit_text_act_content=Content edit_text_act_style=Style edit_cell_size=Cell size: edit_project_orphanActivities=The following activities never appear in any of the project's activity sequences, so they never will be displayed: edit_project_orphanMedia=The following media objects are not used directly in any activity: edit_project_orphanActivities_prompt=Do you want to add them at the end of the last activity sequence? edit_project_orphanMedia_prompt=Do you want to remove them? edit_project_orphanMedia_title=Removal of unused media objects edit_project_orphanActivities_title=Orphan activities edit_media_refreshAll=Update all media content edit_media_refreshAll_tooltip=Update all media objects reloading its files edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Updating media... edit_media_exportAll=Export all media edit_media_exportAll_tooltip=Save to files the content of all media elements edit_media_exportAll_keys=X* edit_shape_select=Select edit_shape_addPoint=Add point edit_shape_deletePoint=Delete edit_shape_drawRect=Draw rectangle edit_shape_drawEllipse=Draw ellipse edit_shape_drawPoly=Draw polygon edit_shape_toLine=Convert to line edit_shape_toBezier=Convert to B\u00E9zier curve edit_shape_toQuad=Convert to quadratic curve edit_shape_rLeft=Rotate left edit_shape_rRight=Rotate right edit_shape_expand=Expand edit_shape_contract=Contract edit_shape_zoomIn=Zoom in edit_shape_zoomOut=Zoom out edit_shape_aproxPoints=Join nearest points edit_shape_showPoints=Show points edit_shape_showPoints_tooltip=Show/Hide the points edit_shape_gridSize=Grid size: edit_shape_hideGrid=Show / Hide grid edit_shape_magnetRadius=Magnet radius: edit_shape_elements=Defined elements edit_shape_elemName=Name of the selected element edit_shape_magnetRadius_tooltip=Action radius of the magnet, when enabled edit_shape_gridSize_tooltip=Size of the grid edit_mc_activity=Activity: edit_mc_sequence=Sequence: edit_mc_url=URL: edit_mc_project=Project: edit_mc_activity_selection=Choose activity edit_mc_sequence_selection=Choose sequence edit_mc_err_nullContent=Insufficient data! edit_act_arrowColor=Arrow color: edit_act_arrowColor_tooltip=Color used by the editor to draw the arrows (not exactly, because an XOR bit mask is used) edit_act_editActivity=Edit... edit_act_editActivity_tooltip=Edit the selected activity action_saveFileAs_caption=Save as... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Save the current project with a different name edit_act_behavior_block=Behavior edit_act_behavior=Behavior edit_act_behavior_drag=Drag objects edit_act_behavior_drag_tooltip=Drag objects instead of use a connection line edit_act_behavior_order=Check solving order edit_act_behavior_order_tooltip=Cells must be solved in order edit_act_scramble=Scramble action_importActivities_caption=Import activities... action_importActivities_keys=I* action_importActivities_tooltip=Import activities from another project import_warn_samefile=The selected file corresponds to the current project. Activities can be imported only between different projects. Please select another project file. import_selectActivities=Select one or more activities to import into the current project: import_importing=Importing... import_checkdep=Checking dependencies... import_impmedia=Importing media: import_impact=Importing activity: import_selectProject=Select the JClic project of which the activities will be imported edit_tagRep_tags=Tag marks edit_tagRep_tagStart=Start mark: edit_tagRep_tagStart_tooltip=Mark used at the beginning of tags edit_tagRep_tagEnd=End mark: edit_tagRep_tagEnd_tooltip=Mark used at the end of tags edit_tagRep_file=File edit_tagRep_fileName=File or URL: edit_tagRep_fileName_tooltip=Name or URL of the file containing the values that will replace tags edit_tagRep_charset=Charset: edit_tagRep_charset_tooltip=Character encoding used in the file edit_tagRep_browseFile=Browse... edit_tagRep_browseFile_tooltip=Browse the filesystem edit_tagRep_title=Tag replacing edit_text_act_clearStylesBtn=Clear text styles... edit_text_act_clearStylesPrompt=Warning: This action will clear the specific character attributes applied to the document, setting it back to its main style. This action cannot be undone. Do you want to do it? img_max_size=Maximum size of images: img_max_width_tooltip=Maximum width of images imported into the media library. img_max_height_tooltip=Maximum height of images imported into the media library. img_resize_prompt=The image "%s" has a size of %s pixels. This exceeds the maximum allowed by JClic Author (%s). Do you want to resize it? src/author/edu/xtec/resources/messages/AuthorMessages_ast.properties000066400000000000000000001301551335566474600264570ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Descripci\u00F3n edit_act_name_tooltip=Nome de la xera edit_act_name=Nome: edit_act_description_tooltip=Descripci\u00F3n de la xera edit_act_reports_block=Informes edit_act_includeInReports=Incluyir esta xera nos informes edit_act_includeInReports_tooltip=Incluyir los resultaos d'esta xera nos informes d'usuariu edit_act_code=C\u00F3digu: edit_act_code_tooltip=C\u00F3digu opcional utiliz\u00E1u p'agrupar y pe\u00F1erar na base de datos d'informes. edit_act_reportActions=Rexistrar tami\u00E9n les aiciones edit_act_reportActions_tooltip=Rexistrar los detalles de toles aiciones feches polos usuarios. edit_act_counters_block=Cuntadores edit_act_timeCounter=Cuntador de tiempu edit_act_timeCounter_tooltip=Amosar/anubrir el contador de tiempu. edit_act_actionsCounter=Cuntador de intentos edit_act_actionsCounter_tooltip=Amosar/anubrir el contador de intentos. edit_act_scoreCounter=Cuntador d'aciertos edit_act_scoreCounter_tooltip=Amosar/anubrir el contador d'aciertos. edit_act_maxTime=Tiempu m\u00E1ximu: edit_act_maxTime_tooltip=Tiempu m\u00E1ximu pa resolver la xera, en segundos. El 0 significa tiempu ilimit\u00E1u. edit_act_countdown=Cuenta atr\u00E1s edit_act_countdown_tooltip=El cuntador entama col valor m\u00E1ximu, decreciendo fasta 0. edit_act_maxActions=Intentos m\u00E1x.: edit_act_maxActions_tooltip=N\u00FAmberu m\u00E1ximu d'intentos permit\u00EDos, o 0 pa ilimit\u00E1u. edit_act_buttons_block=Botones edit_act_helpBtn=Aida edit_act_helpBtn_tooltip=Amosar/anubrir el bot\u00F3n d'aida edit_act_helpBtn_solution=Amosar la soluci\u00F3n edit_act_helpBtn_msg=Amosar esti mensaxe: edit_act_infoBtn=Informaci\u00F3n edit_act_infoBtn_tooltip=Amosar/anubrir el bot\u00F3n d'informaci\u00F3n edit_act_infoBtn_url=Amosar esta URL: edit_act_infoBtn_cmd=Executar el comandu: edit_act_infoBtn_url_tooltip=Direici\u00F3n de la p\u00E1xina web que se va amosar al calcar nel bot\u00F3n d'informaci\u00F3n. edit_act_infoBtn_cmd_tooltip=Ll\u00EDnia de comandos que va executar al calcar nel bot\u00F3n d'informaci\u00F3n. edit_act_mainWindow=Ventana principal: edit_act_gameWindow=Ventana de xuegu: edit_act_margin=Marxe: edit_act_margin_tooltip=Espaciu vertical y horizontal ente oxetos visuales. edit_act_bgColor=Color de fondu: edit_act_bgColor_tooltip=Camudar el color de fondu. edit_gradient_startColor=Color d'aniciu: edit_gradient_endColor=Color final: edit_gradient_startColor_tooltip=Escoyeta del color d'aniciu edit_gradient_endColor_tooltip=Escoyeta del color final edit_gradient_cycles=Ciclos: edit_gradient_cycles_tooltip=N\u00FAmberu de repeticiones del gradiente sobro la superficie a pintar. edit_gradient_orientation=Orientaci\u00F3n: edit_gradient_orientation_tooltip=Orientaci\u00F3n del gradiente, midida en graos sobro la horizontal. edit_act_gradient=Gradiente: edit_act_gradient_tooltip=Usar un gradiente de colores edit_color_opacity=Opacid\u00E1 edit_color_opacity_tooltip=Axusta'l valor de la canal alfa (opacid\u00E1) de color. edit_gradient_title=Gradiente edit_gradient_default=Usar los valores por defeutu (gradiente nulu) edit_act_image=Imaxe: edit_act_descriptionTab=Descripci\u00F3n edit_act_descriptionTab_tooltip=Nome y descripci\u00F3n edit_act_tiledBgImg=En mosaicu edit_act_tiledBgImg_tooltip=Pinta tola superficie cola imaxe, repiti\u00E9ndola a lo llargo de les exes X ya Y tantes vegaes como faiga falta. edit_act_preview=Vista previa: edit_act_border=Borde edit_act_border_tooltip=Dibuxar una llinia de berbesu al rodiu de la ventana edit_act_transparent=Tresparente edit_act_transparent_tooltip=La ventana tien el fondu tresparente edit_act_width=Anchor: edit_act_height=Altor: edit_act_width_tooltip=Anchu del oxetu, en p\u00EDxeles edit_act_height_tooltip=Altor del oxetu, en p\u00EDxeles edit_act_centered=Centrada edit_act_centered_tooltip=El oxetu as\u00EDtiase centr\u00E1u respeutu de la ventana principal edit_act_x=X: edit_act_x_tooltip=Posici\u00F3n horizontal absoluta edit_act_y=Y: edit_act_y_tooltip=Posici\u00F3n vertical absoluta edit_act_ui_block=Interface d'usuariu edit_act_image_tooltip=Esbillar una imaxe edit_act_text=Testu: edit_act_text_tooltip=Testu que se va amosar nesti oxetu edit_font_face=Triba: edit_font_size=Tama\u00F1u: edit_font_bold=Negrina edit_font_italic=Cursiva edit_font_underline=Sorray\u00E1u edit_font_style=Estilu: edit_cell_title=Conten\u00EDos de la caxella edit_act_messages=Mensaxes edit_act_msg_initial=Mensax d'aniciu: edit_act_msg_final=Mensax final: edit_act_msg_prev=Mensax previu: edit_act_msg_error=Mensax de fallu: edit_act_msg_initial_tooltip=Mensax que s'amuesa al entamjar la xera edit_act_msg_final_tooltip=Mensax que s'amuesa al finar la xera edit_act_msg_error_tooltip=Mensax que s'amuesa al finar la xera con fallos edit_act_msg_prev_tooltip=Mensax que s'amuesa enantes d'entamar (nam\u00E1s en delles tribes de xeres) edit_align=Orientaci\u00F3n: edit_act_textColor=Color del testu: edit_act_textColor_tooltip=Color utiliz\u00E1u pa dibuxar el testu edit_act_shadowColor=Color de la solombra: edit_act_shadowColor_tooltip=Color utiliz\u00E1u na solombra del testu, si esiste. edit_act_shadow=Solombra edit_act_shadow_tooltip=Dibuxar el testu con solombra edit_act_borderColor=Color del berbesu: edit_act_borderColor_tooltip=Color utiliz\u00E1u pa dibuxar el berbesu de la caxella edit_act_inactiveColor=Color de est\u00E1u inactivu: edit_act_inactiveColor_tooltip=Color utiliz\u00E1u cuando la caxella ta desactivada edit_act_altColor=Color alternativu: edit_act_altColor_tooltip=Color col que s'amuesa el conten\u00EDu alternativu de les caxelles una vegada solucionadas. edit_cell_marked=Marcada edit_cell_disabled=Desactivada edit_cell_alt=Alternativa edit_cell_textMargin=Marxe internu: edit_cell_textMargin_tooltip=Espaciu ente los berbesos de la celda y el testu. edit_cell_borderWidth=Anchor del berbesu: edit_cell_borderWidth_tooltip=Anchor del trazu utiliz\u00E1u pa dibuxar el berbesu. edit_cell_markerWidth=Anchor del marcador: edit_cell_markerWidth_tooltip=Anchor del trazu utiliz\u00E1u pa dibuxar el berbesu cuando la caxella s'alcuentra marcada o escoyida. edit_cell_alt_tooltip=Vista previa n'est\u00E1u "alternativa" edit_cell_disabled_tooltip=Vista previa n'est\u00E1u "desactivada" edit_cell_marked_tooltip=Vista previa n'est\u00E1u "marcada" edit_act_testAction=Vista previa de la xera edit_act_testAction_tooltip=Prebar c\u00F3mo furrula la xera edit_act_panels_description=Descripci\u00F3n edit_act_panels_description_tooltip=T\u00EDtulu y descripci\u00F3n de la xera edit_act_panels_options=Opciones edit_act_panels_options_tooltip=Opciones de la xera edit_act_panels_frame=Ventana edit_act_panels_frame_tooltip=Aspeutu, tama\u00F1u y posici\u00F3n de la ventana na que corre la xera edit_act_panels_messages=Mensaxes edit_act_panels_messages_tooltip=Conten\u00EDu de los mensaxes de la xera edit_act_panels_panel=Panel edit_act_panels_panel_tooltip=Conten\u00EDu del panel edit_style_title=Estilu edit_style_tooltip=Axustar el color, triba y tama\u00F1u de lletra de les caxelles edit_act_style=Estilu: edit_act_overlap=Evitar sobreposici\u00F3n imaxe/testu edit_act_overlap_tooltip=Intentar evitar que testu ya imaxe se solapen edit_media_exists_1=El ficheru edit_media_exists_2=y\u00E1 s'alcuentra na mediateca! edit_act_shaper=Xenerador de formes: edit_act_shaper_err=Error nel xenerador de formes: edit_act_num_cols=Columnes: edit_act_num_rows=Fileres: edit_act_toothHeightFactor=Altor de los dientes: edit_act_toothWidthFactor=Anchor de los dientes: edit_act_toothRandom=Distribuci\u00F3n aleatoria edit_act_shaper_properties=Propiedaes del xenerador de formes edit_act_panels_text=Testu edit_act_panels_text_tooltip=Testu de la xera action_saveFile_caption=Guardar... action_saveFile_keys=SS action_saveFile_tooltip=Guardar el proyeutu actual action_docTree_caption=\u00C1rbol del documentu... action_docTree_keys=T* action_docTree_tooltip=Amosar el documentu del proyeutu en forma d'\u00E1rbol edit_docTree_title=\u00C1rbol del documentu edit_media_referencedBy=Referenci\u00E1u por: msg_prompt_loadReferences=Atenci\u00F3n:

Esti proyeutu enllaza con otros proyeutos.
\u00BFQuies esplorar los enllaces y cargar tolos ficheros rellacionaos?

(Recomi\u00E9ndase responder S\u00CD cuando se ta importando un paquete de xeres de Clic 3.0) edit_mc_type=Triba: edit_mc_type_unknown=Desconoc\u00EDu edit_mc_type_sound=Interpretar son\u00EDu edit_mc_type_video=Interpretar video edit_mc_type_midi=Interpretar MIDI edit_mc_type_cdaudio=Interpretar CD audio edit_mc_type_record=Grabar son\u00EDu edit_mc_type_play_recorded=Interpretar grabaci\u00F3n edit_mc_type_run_activity=Dir a la xera edit_mc_type_run_sequence=Dir a la secuencia edit_mc_type_run_external=Arrancar un programa edit_mc_type_url=Amosar la URL edit_mc_type_exit=Finar edit_mc_type_return=Volver edit_mc_level=Nivel de priorid\u00E1: edit_mc_file=Ficheru: edit_mc_externalParam=Par\u00E1metros: edit_mc_from=Dende: edit_mc_to=Fasta: edit_mc_length=Duraci\u00F3n m\u00E1x.: edit_mc_recBuffer=Cinta de grabaci\u00F3n: edit_mc_stretch=Axustar tama\u00F1u edit_mc_location=Allugamientu: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Dende: edit_mc_location_from_box=Celda edit_mc_location_from_window=Ventana edit_mc_location_from_frame=Marcu edit_mc_loop=Repetir indefinidamente edit_mc_autostart=Arranque autom\u00E1ticu edit_mc_catchmouse=Capturar mur edit_mc_title=Conten\u00EDu activu y multimedia edit_mc_label=Conten\u00EDu activu: edit_media_dlg_title=Escoyeta del oxetu multimedia edit_media_title=Mediateca de recursos edit_mc_pos_cell=Centr\u00E1u na celda edit_mc_pos_window=Centr\u00E1u na ventana edit_mc_pos_absolute=Especificar posici\u00F3n: edit_tree_badFormat=\u00A1Los datos o la d'\u00E1rbol son incorrectos.! edit_act_panels_controls=Controles edit_act_panels_controls_tooltip=Opciones de botones y cuntadores edit_act_class=Triba: edit_act_gridLayout=Configuraci\u00F3n de la rexella: edit_act_gridLayout_tooltip=Posici\u00F3n relativa de los paneles A y B. edit_act_inverseResolution=Resoluci\u00F3n inversa edit_act_inverseResolution_tooltip=La xera considerar\u00E1se resuelta cuando tolos elementos de "B" tean empareyaos. edit_act_showAllArrows=Amosar toles fleches edit_act_alt=Conten\u00EDu alternativu: edit_act_alt_tooltip=Conten\u00EDu que s'amuesa nes caxelles y\u00E1 resueltes y nes non asignaes. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Editar el conten\u00EDu alternativu edit_act_grid=Panel edit_act_grid_A=Panel A edit_act_grid_B=Panel B edit_act_grid_layout=Distribuci\u00F3n edit_act_grid_relationship=Rellaciones edit_seq_activity_header=xera edit_seq_tag_header=etiqueta edit_seq_jump_header=blincu a edit_seq_activity=Xera: edit_seq_tag=Etiqueta: edit_seq_description=Descripci\u00F3n: edit_seq_auto=Avance autom\u00E1ticu edit_seq_delay=Retardu: edit_seq_action_fwd=Dir p'alantre edit_seq_action_back=Dir p'atr\u00E1s edit_seq_action_jump=Blincar a... edit_seq_action_stop=Parar edit_seq_action_return=Tornar edit_seq_action_exit=Colar de JClic edit_seq_arrow_fwd=Flecha p'alantre: edit_seq_arrow_back=Flecha p'atr\u00E1s: edit_seq_action=Aici\u00F3n: edit_seq_button_enabled=Amosar bot\u00F3n edit_seq_project=Proyeutu JClic: edit_act_absolute=Posici\u00F3n absoluta edit_act_absolute_tooltip=L'oxetu va asitiase nes coordenaes X ya Y que se conse\u00F1en edit_act_location=Allugamientu: edit_seq_newElement=Nuevu elementu de secuencia... edit_seq_newElement_tooltip=Inxertar un nuevu elementu na secuencia de xera edit_seq_newElement_msg=Escueyi una xera pal nuevu elementu de secuencia. edit_seq_newElement_error_noAct=\u00A1No se pue criar un elementu nuevu de secuencia ensin conse\u00F1ar la xera! edit_seq_newElement_error_emptyList=\u00A1Nesti proyeutu nun hai xera denguna! Nun se puen criar elementos de secuencia nun proyeutu baleru. edit_seq_jump_msg=Dest\u00EDn del blincu: edit_seq_jump_title=Dest\u00EDn del blincu edit_act_newActivity_tooltip=Amestar una xera nueva al proyeutu edit_act_prompt_class=Triba de xera: edit_act_prompt_name=Nome: edit_act_newActivity_msg=Escueyi la triba de xera que quies criar y pon-y un nome: edit_act_newActivity_error_noAct=\u00A1Hai qu'escoyer una triba de xera! edit_act_newActivity_error_noName=\u00A1Hai qu'indicar un nome pa la xera! edit_act_newActivity_error_creating=\u00A1Nun se pudo criar la xera! edit_act_newActivity_class=Nome de la clas Java: edit_text_act_format=Formatu edit_text_act_answer=Rempuesta edit_text_act_popup=Ventana emerxente edit_text_act_answer_label=Rempuestes correutes: edit_list_newElement_tooltip=Amestar un elementu nuevu a la llista edit_list_editElement_tooltip=Editar l'elementu escoy\u00EDu edit_list_deleteElement_tooltip=Esborrar l'elementu escoy\u00EDu de la llista edit_list_upBtn_tooltip=Mover p'arriba edit_list_downBtn_tooltip=Mover p'abaxo edit_list_newValue=Testu nuevu: edit_list_addElement=Amestar un elementu nuevu a la llista edit_list_modifyValue=Camudar el testu escoy\u00EDu edit_text_act_target=Dest\u00EDn edit_text_act_maxLen=Llargor m\u00E1ximu: edit_text_act_maxLen_tooltip=N\u00FAmberu m\u00E1ximu de carauteres permit\u00EDos na rempuesta. edit_text_act_fillingChar=Car\u00E1uter de rellenu edit_text_act_fillingChar_tooltip=Car\u00E1uter utiliz\u00E1u pa indicar la inc\u00F3gnita edit_text_act_iniLen=Llargor d'ainiciu: edit_text_act_iniLen_tooltip=N\u00FAmberu de carauteres de rellenu que se van amosar nel aniciu la xera. edit_text_act_iniText=Testu d'aniciu: edit_text_act_iniText_tooltip=Testu que se va amosar na inc\u00F3gnita al entamar la xera. edit_text_act_list=Amosar una llista de opciones: edit_text_act_list_tooltip=Amosar la llista d'opciones que l'usuariu tien d'escoyer. edit_text_act_check_title=Opciones d'evaluaci\u00F3n edit_text_act_popup_no=Ensin ventana emerxente edit_text_act_popup_always=Ventana emerxente autom\u00E1tica edit_text_act_popup_onError=Ventana emerxente cuando hai fallos edit_text_act_popup_onDemand=Ventana emerxente calcando F1 edit_text_act_popup_type=Triba: edit_text_act_popup_delay=Retardu d'apaici\u00F3n: edit_text_act_popup_maxTime=Tiempu m\u00E1ximu: edit_text_act_popup_onlyPlay=Nam\u00E1s interpretar son\u00EDu edit_text_act_err_noSelection=Pa criar una inc\u00F3gnita nueva fai falta escoyer un fragmentu de testu. edit_text_act_err_badCharInSelection=El testu de les inc\u00F3gnites nun puede incluyir retornos de p\u00E1rrafu nin tabulaciones. edit_text_act_err_nestedTargets=\u00A1Les inc\u00F3gnites nun se puen solapar edit_text_act_err_cellInTarget=\u00A1Les inc\u00F3gnites nun pueden tener caxelles! edit_text_act_pageBgColor=Color del papel: edit_text_act_editStylesBtn=Editar los estilos del documentu... edit_text_act_mainStyle=Estilu principal: edit_text_act_tabSpc=Espaciu de tabulador: edit_text_act_tabSize=Espacios ente marques de tabulaci\u00F3n: edit_text_act_colors=Colores: edit_text_act_targetStyle=Colores de les inc\u00F3gnitas: edit_text_act_errorStyle=Colores d'errores: edit_text_act_preview=Vista preliminar: edit_text_act_styleSample_default_start=Testu normal edit_text_act_styleSample_target=inc\u00F3gnita edit_text_act_styleSample_error=error edit_text_act_styleSample_default_fill=testu normal edit_text_act_styleSample_default_end=testu normal. edit_text_act_warnDeleteTarget=Atenci\u00F3n: esta aici\u00F3n va suprimir la inc\u00F3gnita escoyida. \u00BFDe xuru que lo quies facer? edit_text_act_prevScreen_title=Pantalla previa... edit_text_act_prevScreen_no=Nun amosar testu deng\u00FAn enantes d'entamar la xera edit_text_act_prevScreen_original=Amosar el testu completu del exerciciu edit_text_act_prevScreen_special=Amosar esti testu: edit_text_act_prevScreen_time=Tiempu m\u00E1ximu: edit_text_act_edit_target=Inc\u00F3gnita... edit_text_act_checkButton_show=Amosar bot\u00F3n d'evaluaci\u00F3n edit_text_act_checkButtonText=Testu del bot\u00F3n: edit_text_act_checkCase=Comprobar may\u00FAscules / min\u00FAscules edit_text_act_checkAccents=Considerar acentos y carauteres especiales edit_text_act_checkPunct=Considerar les marques de puntuaci\u00F3n edit_text_act_checkDoubleSpc=Permitir espacios repet\u00EDos edit_text_act_checkOptions=Criterios edit_text_act_checkAutoJump=Pasar autom\u00E1ticamente a la inc\u00F3gnita siguiente edit_text_act_checkForceOk=Pasar nam\u00E1s si se respuende correcho edit_text_act_checkDetail=Conse\u00F1ar los fallos lletra a lletra edit_text_act_checkDetail_params=Par\u00E1metros del algoritmu d'anal\u00EDs: edit_text_act_checkDetail_steps=Pasos: edit_text_act_checkDetail_field=Campu d'esploraci\u00F3n: edit_text_act_defaultCheckButtonText=Comprobar edit_text_act_advancedCorrectionOptions=Anal\u00EDs de les rempuestes edit_text_act_check_bt=Correici\u00F3n... edit_text_act_checkButton=Bot\u00F3n de correici\u00F3n edit_text_act_checkProgress=Progresu edit_text_act_typeBtn=Triba... edit_text_act_orderParagraphs=Ordenar p\u00E1rrafos edit_text_act_orderWords=Ordenar palabres edit_text_act_order_amongstPar=Baraxar palabres ente p\u00E1rrafos edit_text_act_type_title=Triba de xera edit_text_act_warnChangeType=Esta aici\u00F3n va esborrar toles inc\u00F3gnites defin\u00EDes. \u00BFDe xuru que lo quies facer? edit_text_act_identWords=Identificar palabres edit_text_act_identChars=Identificar carauteres edit_media_change_name=Camudar nome... edit_media_change_file=Camudar el ficheru... edit_media_includeInZip=Guardar nel ficheru ZIP edit_media_type=Triba de recursu: edit_media_size=Tama\u00F1u del ficheru: edit_media_show_type=Triba de ficheros: edit_media_preview=Previsualizar oxetu edit_media_preview_tooltip=Previsualizaci\u00F3n del recursu multimedia edit_media_rename=Camudar el nome del recursu edit_media_rename_title=Renomar edit_media_rename_prompt=Nome nuevu: edit_media_rename_invalid=\u00A1Nome de recursu non v\u00E1lidu! edit_media_rename_exists=Y\u00E1 hai otru recursu con esti nome. Los recursos tienen de tener un nome \u00FAnicu nel proyeutu. edit_media_chfile_invalid=\u00A1Ficheru incorreutu! err_media_chfile_different=El ficheru tien de ser de la mesma triba edit_media_font_error=\u00A1Nun se pudo cargar la fonte de lletra! edit_media_save_file=Guardar el ficheru (extrayelu del ZIP) edit_media_refresh_file=Anovar el conten\u00EDu del recursu dende'l ficheru edit_media_warn_zipFileNotExternal=Esti nun ye un ficheru "real", sin\u00F3n un oxetu allug\u00E1u nel interior de un contenedor ZIP. Pa usar esta funci\u00F3n fai falta qu'esista un ficheru col mesmu nome na carpeta onde s'atopa'l ficheru ZIP. edit_activities=Xeres edit_sequences=Secuencies edit_media=Mediateca edit_media_tooltip=Xesti\u00F3n de les im\u00E1xenes y otros recursos usaos nel proyeutu. edit_activities_tooltip=Creaci\u00F3n y edici\u00F3n de les xeres del proyeutu edit_sequences_tooltip=Creaci\u00F3n y edici\u00F3n de secuencies de xeres edit_project_title=T\u00EDtulu: edit_project_title_tooltip=T\u00EDtulu del proyeutu edit_project=Proyeutu edit_project_tooltip=Edici\u00F3n de les propiedaes del proyeutu edit_project_description=Descripci\u00F3n: edit_project_description_tooltip=Descripci\u00F3n xeneral del proyeutu edit_project_area=\u00C1ries: edit_project_area_tooltip=\u00C1ries curriculares pa les que s'empobina'l proyeutu edit_project_level=Niveles: edit_project_level_tooltip=Niveles y ciclos educativos pa los que s'empobina'l proyeutu edit_project_descriptors=Descriptores: edit_project_descriptors_tooltip=Descriptores del proyeutu (separtaos por comes) edit_project_languages=Lling\u00FCes: edit_project_languages_tooltip=Lling\u00FCes usaes nel proyeutu edit_project_languages_modify=Camudar la llingua escoyida edit_project_languages_add=Amestar llingua edit_project_languages_select=C\u00F3digos de llingua ISO-639: edit_project_authors=Autores: edit_project_authors_tooltip=Persones que participaren na creaci\u00F3n del proyeutu edit_project_author_name=Nome: edit_project_author_mail=Corr\u00E9u electr\u00F3nicu: edit_project_author_rol=Papel: edit_project_author_organization=Organizaci\u00F3n: edit_project_author_comments=Comentarios: edit_project_author_url=URL: edit_project_author_name_tooltip=Nome del autor/a (campu obligatorio) edit_project_author_mail_tooltip=Direici\u00F3n de corr\u00E9u electr\u00F3nicu del autor/a (opcional) edit_project_author_rol_tooltip=Papel de la persona nel proyeutu: autor, collaborador, illustrador, son\u00EDos... (opcional) edit_project_author_organization_tooltip=Escuela, universid\u00E1, asociaci\u00F3n... (campu opcional) edit_project_author_url_tooltip=P\u00E1xina web personal (campu opcional) edit_project_author_comments_tooltip=Otres carauter\u00EDstiques (campu opcional) edit_project_author_info=Datos del autor/a: edit_project_author_add=Amestar un autor a la llista edit_project_author_edit=Camudar los datos del autor/a edit_project_org_name=Nome: edit_project_org_name_tooltip=Nome de la escuela edit_project_org_mail=Corr\u00E9u electr\u00F3nicu: edit_project_org_mail_tooltip=Direici\u00F3n de corr\u00E9u electr\u00F3nicu de la escuela edit_project_org_url=URL: edit_project_org_url_tooltip=Direici\u00F3n web de la escuela edit_project_org_address=Direici\u00F3n: edit_project_org_address_tooltip=Direici\u00F3n postal de la escuela edit_project_org_pc=CP: edit_project_org_pc_tooltip=C\u00F3digu postal edit_project_org_city=Ciud\u00E1: edit_project_org_city_tooltip=Ciud\u00E1 de la escuela edit_project_org_country=Pa\u00EDs: edit_project_org_state=Est\u00E1u: edit_project_org_comments=Comentarios: edit_project_org=Escuela/es: edit_project_org_tooltip=Escuela u otra instituci\u00F3n que participare nel proyeutu edit_project_org_info=Datos de la organizaci\u00F3n: edit_project_org_add=Amestar organizaci\u00F3n edit_project_org_edit=Camudar los datos de la organizaci\u00F3n edit_project_org_country_tooltip=Pa\u00EDs, federaci\u00F3n, xuni\u00F3n... edit_project_org_state_tooltip=Est\u00E1u federal, comunid\u00E1, rex\u00F3n... edit_project_org_comments_tooltip=Otros datos... edit_project_rev_date=Data: edit_project_rev_date_tooltip=Data de la revisi\u00F3n edit_project_rev_authors=Autores/as: edit_project_rev_authors_tooltip=Autores/as de la revisi\u00F3n edit_project_rev_description=Descripci\u00F3n: edit_project_rev_description_tooltip=Breve descripci\u00F3n de los cambeos realizados edit_project_rev_comments=Comentarios: edit_project_rev_comments_tooltip=Informaci\u00F3n adicional edit_project_rev=Revisiones: edit_project_rev_tooltip=Historial de los cambeos principales fechos nel proyeutu edit_project_rev_add=Amestar un rexistru de revisi\u00F3n edit_project_rev_edit=Camudar el rexistru de la revisi\u00F3n edit_project_rev_info=Datos de la revisi\u00F3n edit_media_objects=oxetos edit_media_object=oxetu edit_evsounds_start=Aniciu de xera: edit_evsounds_click=Calcar nun oxetu: edit_evsounds_actionError=Aici\u00F3n err\u00F3nea: edit_evsounds_actionOk=Aici\u00F3n correuta: edit_evsounds_finishedError=Xera finada con fallos: edit_evsounds_finishedOk=Xera finada correutamente: edit_project_rev_err_nodesc=Error: La descripci\u00F3n nun quedar erma edit_evsounds_dlg_title=Edici\u00F3n de los son\u00EDos d'eventos edit_project_evsounds=Son\u00EDos d'eventos: edit_project_evsounds_tooltip=Cose\u00F1ar son\u00EDos espec\u00EDficos pa cada eventu de JClic edit_act_evsounds=Son\u00EDos d'eventos: edit_act_evsounds_tooltip=Cose\u00F1ar son\u00EDos espec\u00EDficos pa cada eventu de JClic edit_evsounds_default=son\u00EDu por defeutu edit_evsounds_disabled=desactiv\u00E1u edit_evsounds_chk_tooltip=Activa o desactiva'l son\u00EDu pa esti eventu edit_evsounds_select_tooltip=Calcar pa escoyer el son\u00EDu arrey\u00E1u a esti eventu, o desmarcar pa usar el son\u00EDu por defeutu action_newProject_caption=Proyeutu nuevu... action_newProject_keys=NN action_newProject_tooltip=Criar un proyeutu JClic nuevu edit_arith_op_from=Dende: edit_arith_op_from_tooltip=Valor m\u00EDnimu del operador edit_arith_op_to=Fasta: edit_arith_op_to_tooltip=Valor m\u00E1ximu del operador edit_arith_op_with=Con: edit_arith_op_with_tooltip=Si se marca, l'operador pue tener tami\u00E9n esti valor edit_arith_op_fromList=\u00DAn de la llista: edit_arith_op_fromList_tooltip=Llista de posibles valores del operador edit_arith_op_decimals=Decimales: edit_arith_op_decimals_tooltip=N\u00FAmberu de decimales del operando edit_arith_op_dec0=# (enteru) edit_arith_op_dec1=#,# edit_arith_op_dec2=#,## edit_arith_firstOp=Primer operando edit_arith_secondOp=Segundu operando edit_arith_title=Arith2 pa JClic edit_arith_operations=Operaciones: edit_arith_operations_tooltip=Selecciona la triba d'operaciones a efectuar edit_arith_operations_plus=Sumes edit_arith_operations_minus=Restes edit_arith_operations_multiply=Multiplicaciones edit_arith_operations_divide=Divisiones edit_arith_unknown=Inc\u00F3gnita: edit_arith_unknown_tooltip=Escueyi l'elementu que va facer d'inc\u00F3gnita edit_arith_unknown_aobx=El result\u00E1u ye la inc\u00F3gnita edit_arith_unknown_aoxr=El segundu operador ye la inc\u00F3gnita edit_arith_unknown_xobr=El primer operador ye la inc\u00F3gnita edit_arith_unknown_axbr=La operaci\u00F3n ye la inc\u00F3gnita edit_arith_unknown_invert=Escribir la expressi\u00F3n entamando pel result\u00E1u edit_arith_result=Result\u00E1u: edit_arith_result_notCarry=Ensin llevar edit_arith_result_random=Aleatoriu edit_arith_result_asc=Ascendente edit_arith_result_order=Ordenar per result\u00E1u: edit_arith_result_desc=Descendente edit_arith_result_avoidDup=Evitar duplicaos edit_arith_cond=Condiciones: edit_arith_cond_ind=Indiferente edit_arith_cond_agb=El primer operador tien de ser mayor que'l segundu edit_arith_cond_alb=El primer operador tien de ser menor que'l segundu edit_arith_cond_tooltip=Otres condiciones edit_autocp=xenerador autom\u00E1ticu de conten\u00EDu: edit_autocp_tooltip=Escoyeta de la triba de xenerador autom\u00E1ticu de conten\u00EDu pa esta xera. edit_autocp_block=Xenerador de conten\u00EDu edit_autocp_btn=Preferencies... edit_autocp_btn_tooltip=Configuraci\u00F3n de los par\u00E1metros del xenerador de conten\u00EDu edit_data=Edici\u00F3n de datos edit_act=Edici\u00F3n de la xera edit_acp=Edici\u00F3n del xenerador de conten\u00EDu edit_acp_err_creating=\u00A1Error de creaci\u00F3n del xenerador autom\u00E1ticu de conten\u00EDu! edit_project_author_group=Creaci\u00F3n edit_project_description_block=Descripci\u00F3n edit_project_ui_block=Interfaz d'usuariu edit_act_description=Descripci\u00F3n: m_Edit=Edici\u00F3n m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=Xera nueva... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Inxertar m_Insert_Mnemonic=I m_View=Ver m_View_Mnemonic=V action_editProject_caption=Proyeutu action_editProject_keys=PP action_editProject_tooltip=Editar les propiedaes del proyeutu action_editMedia_caption=Mediateca action_editMedia_keys=MM action_editMedia_tooltip=Edici\u00F3n de la mediateca del proyeutu action_editActivities_caption=Xeres action_editActivities_keys=AA action_editActivities_tooltip=Edici\u00F3n de les xeres action_editSeq_caption=Secuencies action_editSeq_keys=SS action_editSeq_tooltip=Edici\u00F3n de les secuencies de xeres warn_project_modified=Esti proyeutu camud\u00F3. \u00BFQuies guardar los cambeos? edit_project_descriptors_block=Descriptores edit_media_new=Oxetu multimedia nuevu... edit_media_new_tooltip=Amestar una imaxe o un oxetu multimedia a la mediateca edit_media_new_keys=M* edit_seq_threshold=Umbral de puntuaci\u00F3n: edit_seq_threshold_tooltip_up=Siguir esti cam\u00EDn cuando la puntuaci\u00F3n global seya mayor o igual que... edit_seq_time=Umbral de tiempu: edit_seq_time_tooltip_up=Pa siguir esti cam\u00EDn hai que tener feches les xeres nun tiempu inferior a... edit_seq_threshold_tooltip_down=Sigui esti cam\u00EDn siempres que la puntuaci\u00F3n global seya inferior a... edit_seq_time_tooltip_down=Sigui esti cam\u00EDn siempres que'l tiempu empleg\u00E1u nes xeres seya superior a... edit_seq_condJump=Blincos condicionales edit_seq_condJump_tooltip=Conse\u00F1ar blincos que s'executen nam\u00E1s si se dan unes condiciones determinaes edit_seq_condJump_upper_tooltip=Conse\u00F1ar les condiciones pa blincar a un nivel superior edit_seq_condJump_lower=Blincu inferior: edit_seq_condJump_upper=Blincu superior: edit_seq_condJump_lower_tooltip=Conse\u00F1ar les condiciones pa blincar a un nivel inferior edit_seq_action_tooltip_fw=Aici\u00F3n asociada al bot\u00F3n "siguiente" edit_seq_action_tooltip_bk=Aici\u00F3n asociada al bot\u00F3n "anterior" edit_seq_jump_tooltip=Conse\u00F1ar el dest\u00EDn del blincu edit_seq_action_tooltip=Aici\u00F3n a facer edit_seq_activity_tooltip=Xera asociada a esti elementu de la secuencia edit_seq_tag_tooltip=Etiqueta emplegada pa referise a esti elementu de la secuencia (campu opcional) edit_seq_description_tooltip=Descripci\u00F3n del elementu de secuencia (campu opcional) edit_seq_button_enabled_tooltip=Activar o desactivar el bot\u00F3n de pasu de xera edit_seq_auto_tooltip=Avanzar autom\u00E1ticamente al acabar la xera edit_seq_delay_tooltip=N\u00FAmberu de segundos a esperar enantes de facer el pasu autom\u00E1ticu edit_color_dlgTitle=Escoyeta del color edit_media_renaming=Por favor, espere mientres se camuda'l nome del recursu... edit_act_cell_width=Anchor: edit_act_cell_width_tooltip=Anchor de les caxelles (en p\u00EDxeles) edit_act_cell_height=Altor: edit_act_cell_height_tooltip=Altor de les caxelles (en p\u00EDxeles) edit_act_hiddenWords=Pallabres tapec\u00EDes: edit_act_hiddenWords_tooltip=Llista de les palabres tapec\u00EDes nel panel edit_act_wordSearch_panelB=Usar el panel B edit_act_wordSearch_panelB_tooltip=El conten\u00EDu del segundu panel va ser amos\u00E1u seg\u00FAn se vayan atopando les palabres edit_act_shaper_tooltip=Escoyeta de la triba de xenerador de formes del panel edit_act_num_cols_tooltip=N\u00FAmberu de columnes del panel edit_act_num_rows_tooltip=N\u00FAmberu de fileres del panel edit_act_wildTransparent=Separtadores tresparentes edit_act_wildTransparent_tooltip=Amosar los separtadores (caxelles prietes) como furacos tresparentes edit_act_behavior_scramble_times=Mestures: edit_act_behavior_scramble_times_tooltip=N\u00FAmberu de vegaes que se mecer\u00E1n les pieces edit_act_copy_title=Copiar atributos a... edit_act_copy_attributes=Atributos: edit_act_copy_dest=Aplicar a: edit_act_copy_style_main=Ventana principal edit_act_copy_style_play=Ventana de xuegu edit_act_copy_activities=Xeres a camudar: edit_act_copyAttributes=Copiar atributos edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copiar a otres xeres dellos de los atributos d'esta xera edit_new_project_name=Nome del proyeutu: edit_new_project_name_tooltip=Nome curtiu y descriptivu del proyeutu edit_new_project_filename=Nome del ficheru: edit_new_project_filename_tooltip=Nome del ficheru del proyeutu, ensin estensi\u00F3n edit_new_project_folder=Carpeta: edit_new_project_folder_tooltip=Nome de la carpeta na que se va guardar el proyeutu edit_new_project_folder_browse=Restolar... edit_new_project_title=Creaci\u00F3n d'un proyeutu JClic nuevu edit_new_project_err_empty=Error: Tanto'l proyeutu como'l ficheru y la carpeta tienen de tener nomes v\u00E1lidos. edit_new_project_warning_noEmptyFolder=Nesta carpeta y\u00E1 hai otru proyeutu Clic3.0 o JClic. Pa evitar tracamundios recomi\u00E9ndase caltener cada proyeutu nuna carpeta independiente, anque nun ye imprescindible. \u00BFDe xuru que quies criar el proyeutu nuevu nesta carpeta? edit_new_project_err_folderCreation=Error: \u00A1Nun fue ha criase la carpeta conse\u00F1ada! edit_act_copy_err_noSelection=Error: \u00A1Nun s'escoy\u00F3 xera nenguna. Pa usar esta funci\u00F3n hai qu' escoyer na llista la xera o xeres a les que se van aplicara los atributos conse\u00F1aos. edit_act_copy_action_prefix=Copiando atributos a: edit_act_copy_margin=Marxe edit_act_copy_bgColor=Color de fondu edit_act_copy_gradient=Gradiente edit_act_copy_bgImage=Imaxe de fondu edit_act_copy_border=Berbesu edit_act_copy_transparentBg=Fondu tresparente edit_act_copy_position=Posici\u00F3n edit_act_copy_messages=Mensaxes edit_act_copy_messages_ini=Estilu del mensaxe d'aniciu edit_act_copy_messages_end=Estilu del mensaxe final edit_act_copy_messages_err=Estilu del mensaxe de fallu edit_act_copy_reports=Informes edit_act_copy_rep_include=Incluyir la xera nos informes edit_act_copy_rep_actions=Rexistrar aiciones edit_act_copy_interface=Interfaz d'usuariu edit_act_copy_skin=Entornu visual edit_act_copy_evSounds=Son\u00EDos d'eventu edit_act_copy_counters=Cuntadores edit_act_copy_cTime=Cuntador de tiempu edit_act_copy_maxTime=Tiempu m\u00E1ximu edit_act_copy_cTries=Cuntador d'intentos edit_act_copy_maxTries=N\u00FAmberu m\u00E1ximu d'intentos edit_act_copy_cScore=Cuntador d'aciertos edit_act_copy_scramble=N\u00FAmberu de vegaes qu'hai que baraxar edit_act_copy_buttons=Botones edit_act_copy_btnHelp=Bot\u00F3n d'aida edit_act_copy_btnInfo=Bot\u00F3n d'informaci\u00F3n edit_act_copy_grids=Paneles edit_act_copy_gridA=Estilu del panel A edit_act_copy_gridB=Estilu del panel B edit_act_copy_textGrid=Estilu de los paneles de testu edit_act_copy_text=Xeres de testu edit_act_copy_fontFace=Triba de lletra edit_act_copy_fontSize=Tama\u00F1u de lletra edit_act_copy_fontStyle=Estilu de lletra edit_act_copy_textColour=Color del testu principal edit_act_copy_textTargetColour=Escueyi les xeres del proyeutu JClic que van ser importaes edit_act_copy_textErrorColour=Color de los fallos edit_act_copy_tabSpace=Espaciu de tabulador edit_act_copy_messages_prev=Estilu del mensax previu edit_act_changeType=Camudar la triba de xera edit_act_newActivity_class_tooltip=Nome completu de la clas que se va emplegar pa construir la xera (\u00A1nam\u00E1s pa usuarios avanzaos!) edit_act_newActivity_other=Otres... edit_act_newActivity_info=Los usuarios/es avanzaos/es pueden criar tami\u00E9n otres tribes de xeres JClic nun rexistraes. Escribi debaxo'l nome completu de la clas, precedida pol del paquete (por exemplu: "com.acme.activities.FooActivity"). Les xeres nueves tienen d'estender edu.xtec.jclic.Activity, y tienen de ser accesibles al cargador de clases de la m\u00E1quina virtual de Java. edit_act_newActivity_name=Nome de la xera edit_act_newActivity_name_tooltip=Cada xera tien de tener un nome \u00FAnico nel proyeutu edit_act_changeType_warning=

Atenci\u00F3n: El camb\u00E9u de la triba pue causar la perda de dellos de los atributos y oxetos de la xera que se ta editando. \u00A1Utilice la funci\u00F3n con munchu cuid\u00E1u!

 

applet_codebase=Allugamientu del c\u00F3digu JClic: applet_codebase_tooltip=URL qu'apunta a una carpeta na que tean allugaos los ficheros del programa de JClic applet_prev_text=C\u00F3digu HTML previu: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Testu o c\u00F3digu HTML que va aparecer enantes del applet applet_post_text=C\u00F3digu HTML posterior: applet_post_text_tooltip=Testu o c\u00F3digu HTML que va aparecer dempu\u00E9s del applet applet_size=Tama\u00F1u del applet: applet_size_tooltip=Anchor y altor del applet, en valores absolutos o porcentuales. applet_page_title=T\u00EDtulu de la p\u00E1xina: applet_page_title_tooltip=Testu que se va amosar na parte superior de la ventana del restolador applet_created_info=La p\u00E1xina web "%s" cri\u00F3se con \u00E9situ. applet_created_prompt=\u00BFQuies abrirla agora col restolador? action_createHTML_caption=Criar p\u00E1xina web... applet_create_title=Creaci\u00F3n d'una p\u00E1xina HTML con un applet JClic action_createHTML_tooltip=Creaci\u00F3n d'una p\u00E1xina HTML con un applet que tenga esti proyeutu. applet_filename=Nome del ficheru: applet_filename_tooltip=Nome del ficheru HTML a criar action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Valores por defeutu usados na creaci\u00F3n de p\u00E1xines web applet_bgcolor=Color de fondu: applet_bgcolor_tooltip=Color de fondu de la p\u00E1xina web applet_centered=Centr\u00E1u applet_centered_tooltip=Allugar el applet centr\u00E1u horizontalmente applet_width_tooltip=Anchor del applet (en valor absolutu o porcentual) applet_height_tooltip=Altor del applet (en valor absolutu o porcentual) applet_exitUrl=Al colar, dir pa: applet_exitUrl_tooltip=URL pa onde se va empobinar la navegaci\u00F3n al colar de JClic applet_infoFrame=Marcu d'informaci\u00F3n: applet_infoFrame_tooltip=Nome del marcu empleg\u00E1u p'amosar el conten\u00EDu incluy\u00EDu nel bot\u00F3n "info" action_createInstaller_caption=Criar instalador del proyeutu... action_createInstaller_keys=I* action_createInstaller_tooltip=Creaci\u00F3n d'un ficheru d'instalaci\u00F3n del proyeutu pa JClic player installer_caption=Edici\u00F3n del ficheru d'instalaci\u00F3n del proyeutu installer_title=T\u00EDtulu: installer_title_tooltip=T\u00EDtulu del proyeutu que se va amosar nel asistente d'instalaci\u00F3n installer_authors=Autores/as: installer_authors_tooltip=Autores/as del proyeutu (testu curtiu) installer_folder=Carpeta: installer_folder_tooltip=Nome de carpeta que va suxerir l'asistente d'instalaci\u00F3n installer_files=Ficheros a copiar: installer_files_tooltip=Ficheros que se van copiar na instalaci\u00F3n installer_files_available=Ficheros disponibles installer_files_selected=Ficheros seleicionaos installer_files_add=>> amestar >> installer_files_add_tooltip=Amestar el ficheru escoy\u00EDu a la llista installer_files_remove=<< quitar << installer_files_remove_tooltip=Quitar el ficheru escoy\u00EDu de la llista installer_button=Bot\u00F3n d'activaci\u00F3n installer_button_tooltip=Propiedaes del bot\u00F3n que se va amosar na biblioteca de proyeutos installer_button_project=Proyeutu principal: installer_button_project_tooltip=Proyeutu JClic asoci\u00E1u al bot\u00F3n installer_button_text=Etiqueta: installer_button_text_tooltip=Etiqueta de testu curtia, que va apaecer dientro del bot\u00F3n installer_button_icon=Iconu: installer_button_icon_tooltip=Imaxe que va amosar el bot\u00F3n. Dexar ermo pa usar l'iconu por defeutu de JClic. installer_button_description=Descripci\u00F3n installer_button_description_tooltip=Testu d'aida emerxente que va amosar el bot\u00F3n installer_error_noTitle=Error: Hai que conse\u00F1ar el t\u00EDtulu del proyeutu installer_error_noBaseFolder=Error: Hai que conse\u00F1ar el nome de la carpeta installer_error_noFilesSelected=Error: Nun tien escoy\u00EDu ficheru deng\u00FAn installer_error_noButtonText=Error: Hai que conse\u00F1ar el testu de la etiqueta del bot\u00F3n d'activaci\u00F3n installer_error_projectNotInFiles=Error: El proyeutu asoci\u00E1u al bot\u00F3n d'activaci\u00F3n nun s'alcuentra ente los ficheros a copiar applet_page_full=L'applet ocupa tola p\u00E1xina applet_page_mixed=L'applet tien dimensiones espec\u00EDfiques edit_text_align_left=Alliniar el testu a la esquierda edit_text_align_center=Testu centr\u00E1u edit_text_align_right=Alliniar el testu a la drecha edit_text_act_target_toggle=Criar una inc\u00F3gnita o suprimila edit_text_act_insertCell=Inxertar una celda edit_text_act_content=Conten\u00EDu edit_text_act_style=Estilu edit_cell_size=Dimensiones de la celda: edit_project_orphanActivities=Les xeres siguientes enxam\u00E1s van llegar a executase, darr\u00E9u que nun apaecen en secuencia d'actividades del proyeutu denguna: edit_project_orphanMedia=Los oxetos siguientes de la mediateca nun s'empleguen direutamente en xera denguna: edit_project_orphanActivities_prompt=\u00BFQuies amestales al final de la secuencia cabera de xeres? edit_project_orphanMedia_prompt=\u00BFQuies esborralos? edit_project_orphanMedia_title=Esborrar de oxetos multimedia nun emplegaos edit_project_orphanActivities_title=Xeres g\u00FC\u00E9rfanes edit_media_refreshAll=Anovar el conten\u00EDu de tolos recursos edit_media_refreshAll_tooltip=Anovar tolos recursos volviendo a cargar los ficheros edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Anovando recursos... edit_media_exportAll=Esportar tolos recursos edit_media_exportAll_tooltip=Grabar en ficheros el conten\u00EDu de tolos recursos edit_media_exportAll_keys=X* edit_shape_select=Esbillar edit_shape_addPoint=Amestar un puntu edit_shape_deletePoint=Esborrar edit_shape_drawRect=Dibuxar un rect\u00E1ngulo edit_shape_drawEllipse=Dibuxar una elipse edit_shape_drawPoly=Dibuxar un pol\u00EDgonu edit_shape_toLine=Convertir nuna llinia edit_shape_toBezier=Convertir nuna curva B\u00E9zier edit_shape_toQuad=Convertir nuna curva cu\u00E1drica edit_shape_rLeft=Xirar a la esquierda edit_shape_rRight=Xirar a la drecha edit_shape_expand=Espander edit_shape_contract=Contrayer edit_shape_zoomIn=Averar edit_shape_zoomOut=Allo\u00F1ar edit_shape_aproxPoints=Xunta puntos averaos edit_shape_showPoints=Amosar puntos edit_shape_showPoints_tooltip=Amosar/Anubrir los puntos edit_shape_gridSize=Tama\u00F1u de la rexella: edit_shape_hideGrid=Amosar / Anubrir la rexella edit_shape_magnetRadius=Radiu del im\u00E1n: edit_shape_elements=Elementos defin\u00EDos edit_shape_elemName=Nome del elementu escoy\u00EDu edit_shape_magnetRadius_tooltip=Radiu d'aici\u00F3n del im\u00E1n, cuando ta activ\u00E1u edit_shape_gridSize_tooltip=Tama\u00F1u de la rexella edit_mc_activity=Xera: edit_mc_sequence=Secuencia: edit_mc_url=URL: edit_mc_project=Proyeutu: edit_mc_activity_selection=Escoyeta de la xera edit_mc_sequence_selection=Escoyeta de la secuencia edit_mc_err_nullContent=\u00A1Datos insuficientes! edit_act_arrowColor=Color de les fleches: edit_act_arrowColor_tooltip=Color utiliz\u00E1u pol editor pa dibuxar les fleches (nun ye esauto, darr\u00E9u que s'emplega una m\u00E1scara XOR de bits) edit_act_editActivity=Editar... edit_act_editActivity_tooltip=Editar la xera escoyida action_saveFileAs_caption=Guardar como... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Guardar el proyeutu con un nome distinto edit_act_behavior_block=Comportamientu edit_act_behavior=Comportamientu edit_act_behavior_drag=Arrastrar edit_act_behavior_drag_tooltip=Arrastrar los oxetos en llugar de xunilos con una llinia edit_act_behavior_order=Comprobar orde de resoluci\u00F3n edit_act_behavior_order_tooltip=Les celdes tienen de resolvese n'orde edit_act_scramble=Baraxar action_importActivities_caption=Importar xeres... action_importActivities_keys=I* action_importActivities_tooltip=Importar xeres d'otru proyeutu import_warn_samefile=El ficheru escoy\u00EDu correspuende a esti proyeutu. La importaci\u00F3n de xeres nam\u00E1s se pue facer ente proyeutos estremaos. Por favor, escueyi otru proyeutu. import_selectActivities=Escueyi una o m\u00E1s xeres pa importales a esti proyeutu: import_importing=Importando... import_checkdep=Comprobando dependencies... import_impmedia=Importando medios: import_impact=Importando la xera: import_selectProject=Escueyi'l proyeutu JClic del que quies importar xeres edit_tagRep_tags=Marques d'etiquetes edit_tagRep_tagStart=Marca d'aniciu: edit_tagRep_tagStart_tooltip=Marca qu'indica aniciu d'etiqueta edit_tagRep_tagEnd=Marca final: edit_tagRep_tagEnd_tooltip=Marca qu'indica final d'etiqueta edit_tagRep_file=Ficheru edit_tagRep_fileName=Ficheru o URL: edit_tagRep_fileName_tooltip=Nome o URL del ficheru que conti\u00E9n los valores que van sostituyir les etiquetes edit_tagRep_charset=Codificaci\u00F3n: edit_tagRep_charset_tooltip=Triba de codificaci\u00F3n emplegada nel ficheru edit_tagRep_browseFile=Guetar... edit_tagRep_browseFile_tooltip=Guetar nel sistema de ficheros edit_tagRep_title=Sostituci\u00F3n d'etiquetes edit_text_act_clearStylesBtn=Llimpiar estilos de testu... edit_text_act_clearStylesPrompt=Atenci\u00F3n: Esta aici\u00F3n va llimpiar los atributos especiales de car\u00E1uter qu'esisten nel documentu, torn\u00E1ndolu al estilu principal. Esta operaci\u00F3n nun se pue desfacer. \u00BFQuies realizala? img_max_size=Tama\u00F1u m\u00E1ximu de les im\u00E1xenes: img_max_width_tooltip=Anchor m\u00E1ximu de les im\u00E1xenes al importales a la mediteca. img_max_height_tooltip=Altor m\u00E1ximu de les im\u00E1xenes al importales a la mediteca. img_resize_prompt=La imaxe "%s" tien un tama\u00F1u de %s pixels. Esto supera la llende permitida por JClic Author (%s). \u00BFQuies redimensionala? src/author/edu/xtec/resources/messages/AuthorMessages_ca.properties000066400000000000000000001376431335566474600262640ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Descripci\u00f3 edit_act_name_tooltip=Nom de l'activitat edit_act_name=Nom: edit_act_description_tooltip=Descripci\u00f3 de l'activitat edit_act_reports_block=Informes edit_act_includeInReports=Inclou aquesta activitat als informes edit_act_includeInReports_tooltip=Inclou els resultats d'aquesta activitat en els informes d'usuari edit_act_code=Codi: edit_act_code_tooltip=Codi opcional utilitzat per agrupar i filtrar en la base de dades d'informes. edit_act_reportActions=Enregistra tamb\u00e9 les accions edit_act_reportActions_tooltip=Enregistra els detalls de totes les accions efectuades pels usuaris. edit_act_counters_block=Comptadors edit_act_timeCounter=Comptador de temps edit_act_timeCounter_tooltip=Mostra o amaga el comptador de temps edit_act_actionsCounter=Comptador d'intents edit_act_actionsCounter_tooltip=Mostra o amaga el comptador d'intents. edit_act_scoreCounter=Comptador d'encerts edit_act_scoreCounter_tooltip=Mostra o amaga el comptador d'encerts. edit_act_maxTime=Temps m\u00e0xim: edit_act_maxTime_tooltip=Temps m\u00e0xim per a resoldre l'activitat, en segons. El zero significa temps il\u00b7limitat. edit_act_countdown=Compte enrere edit_act_countdown_tooltip=El comptador comen\u00e7a al valor m\u00e0xim, decreixent fins a zero. edit_act_maxActions=Intents m\u00e0x.: edit_act_maxActions_tooltip=Nombre m\u00e0xim d'intents permesos, o zero per a il\u00b7limitat. edit_act_buttons_block=Botons edit_act_helpBtn=Ajuda edit_act_helpBtn_tooltip=Mostra o amaga el bot\u00f3 d'ajuda edit_act_helpBtn_solution=Mostra la soluci\u00f3 edit_act_helpBtn_msg=Mostra aquest missatge: edit_act_infoBtn=Informaci\u00f3 edit_act_infoBtn_tooltip=Mostrar o amagar el bot\u00f3 d'informaci\u00f3 edit_act_infoBtn_url=Mostrar aquest URL: edit_act_infoBtn_cmd=Executa l'ordre: edit_act_infoBtn_url_tooltip=Adre\u00e7a de la p\u00e0gina web que es mostrar\u00e0 en fer clic al bot\u00f3 d'informaci\u00f3. edit_act_infoBtn_cmd_tooltip=L\u00ednia d'ordres que s'executar\u00e0 en fer clic al bot\u00f3 d'informaci\u00f3. edit_act_mainWindow=Finestra principal: edit_act_gameWindow=Finestra de joc: edit_act_margin=Marge: edit_act_margin_tooltip=Espai horitzontal i vertical entre objectes visuals. edit_act_bgColor=Color de fons: edit_act_bgColor_tooltip=Canvia el color de fons. edit_gradient_startColor=Color inicial: edit_gradient_endColor=Color final: edit_gradient_startColor_tooltip=Selecci\u00f3 del color inicial edit_gradient_endColor_tooltip=Selecci\u00f3 del color final edit_gradient_cycles=Cicles: edit_gradient_cycles_tooltip=Nombre de repeticions del degradat sobre la superf\u00edcie a pintar edit_gradient_orientation=Orientaci\u00f3: edit_gradient_orientation_tooltip=Orientaci\u00f3 del degradat, mesurada en graus sobre l'horitzontal edit_act_gradient=Degradat: edit_act_gradient_tooltip=Utilitza un degradat de colors edit_color_opacity=Opacitat edit_color_opacity_tooltip=Ajusta el valor del canal alfa (opacitat) del color. edit_gradient_title=Degradat edit_gradient_default=Utilitza els valors per defecte (degradat nul) edit_act_image=Imatge: edit_act_descriptionTab=Descripci\u00f3 edit_act_descriptionTab_tooltip=Nom i descripci\u00f3 edit_act_tiledBgImg=En mosaic edit_act_tiledBgImg_tooltip=Pinta tota la superf\u00edcie amb la imatge, repetint-la al llarg dels eixos X i Y tantes vegades com calgui. edit_act_preview=Vista preliminar: edit_act_border=Vora edit_act_border_tooltip=Dibuixar una l\u00ednia de vora al voltant de la finestra edit_act_transparent=Transparent edit_act_transparent_tooltip=La finestra t\u00e9 el fons transparent edit_act_width=Amplada: edit_act_height=Al\u00e7ada: edit_act_width_tooltip=Amplada de l'objecte, mesurada en p\u00edcsels edit_act_height_tooltip=Al\u00e7ada de l'objecte, mesurada en p\u00edcsels edit_act_centered=Centrada edit_act_centered_tooltip=L'objecte se situa centrat respecte a la finestra principal edit_act_x=X: edit_act_x_tooltip=Posici\u00f3 horitzontal absoluta edit_act_y=Y: edit_act_y_tooltip=Posici\u00f3 vertical absoluta edit_act_ui_block=Interf\u00edcie d'usuari edit_act_image_tooltip=Selecciona una imatge edit_act_text=Text: edit_act_text_tooltip=Text que es mostrar\u00e0 en aquest objecte edit_font_face=Tipus: edit_font_size=Mida: edit_font_bold=Negreta edit_font_italic=Cursiva edit_font_underline=Subratllat edit_font_style=Estil: edit_cell_title=Contingut de la casella edit_act_messages=Missatges edit_act_msg_initial=Missatge inicial: edit_act_msg_final=Missatge final: edit_act_msg_prev=Missatge previ: edit_act_msg_error=Missatge d'error: edit_act_msg_initial_tooltip=Missatge que es mostra en iniciar-se l'activitat edit_act_msg_final_tooltip=Missatge que es mostra en acabar l'activitat edit_act_msg_error_tooltip=Missatge que es mostra quan l'activitat acaba amb errors edit_act_msg_prev_tooltip=Missatge que es mostra abans de comen\u00e7ar (nom\u00e9s en alguns tipus d'activitats) edit_align=Orientaci\u00f3: edit_act_textColor=Color del text: edit_act_textColor_tooltip=Color emprat per dibuixar el text edit_act_shadowColor=Color de l'ombra: edit_act_shadowColor_tooltip=Color emprat en l'ombra del text, si n'hi ha. edit_act_shadow=Ombra edit_act_shadow_tooltip=Dibuixa el text amb ombra edit_act_borderColor=Color de la vora: edit_act_borderColor_tooltip=Color utilitzat per a dibuixar la vora de la casella edit_act_inactiveColor=Color d'estat inactiu: edit_act_inactiveColor_tooltip=Color emprat quan la casella es troba desactivada edit_act_altColor=Color alternatiu: edit_act_altColor_tooltip=Color amb qu\u00e8 es mostra el contingut alternatiu de les caselles un cop solucionades. edit_cell_marked=Marcada edit_cell_disabled=Desactivada edit_cell_alt=Alternativa edit_cell_textMargin=Marge intern: edit_cell_textMargin_tooltip=Espai entre les vores de la cel\u00b7la i el text. edit_cell_borderWidth=Gruix de la vora: edit_cell_borderWidth_tooltip=Gruix del tra\u00e7 utilitzat per a dibuixar la vora. edit_cell_markerWidth=Gruix del marcador: edit_cell_markerWidth_tooltip=Gruix del tra\u00e7 utilitzat per dibuixar la vora quan la casella es troba marcada o seleccionada edit_cell_alt_tooltip=Vista preliminar de la casella en estat "alternatiu" edit_cell_disabled_tooltip=Vista preliminar en estat "desactivat" edit_cell_marked_tooltip=Vista preliminar en estat "marcat" edit_act_testAction=Mostra l'activitat edit_act_testAction_tooltip=Prova el funcionament de l'activitat edit_act_panels_description=Descripci\u00f3 edit_act_panels_description_tooltip=T\u00edtol i descripci\u00f3 de l'activitat edit_act_panels_options=Opcions edit_act_panels_options_tooltip=Opcions de l'activitat edit_act_panels_frame=Finestra edit_act_panels_frame_tooltip=Aspecte, mida i posici\u00f3 de la finestra on corre l'activitat. edit_act_panels_messages=Missatges edit_act_panels_messages_tooltip=Contingut dels missatges de l'activitat edit_act_panels_panel=Plaf\u00f3 edit_act_panels_panel_tooltip=Contingut del plaf\u00f3 edit_style_title=Estil edit_style_tooltip=Ajusta els colors, tipus i mida de lletra de les caselles edit_act_style=Estil: edit_act_overlap=Evita la sobreposici\u00f3 imatge/text edit_act_overlap_tooltip=Intenta evitar que el text trepitgi la imatge. edit_media_exists_1=El fitxer edit_media_exists_2=ja es troba a la mediateca! edit_act_shaper=Retallador: edit_act_shaper_err=Error del retallador: edit_act_num_cols=Columnes: edit_act_num_rows=Files: edit_act_toothHeightFactor=Al\u00e7ada de les dents: edit_act_toothWidthFactor=Amplada de les dents: edit_act_toothRandom=Distribuci\u00f3 aleat\u00f2ria edit_act_shaper_properties=Propietats del generador de formes edit_act_panels_text=Text edit_act_panels_text_tooltip=Text de l'activitat action_saveFile_caption=Desa... action_saveFile_keys=DD action_saveFile_tooltip=Desa el projecte action_docTree_caption=Arbre del document... action_docTree_keys=A* action_docTree_tooltip=Mostra el document del projecte en forma d'arbre edit_docTree_title=Arbre del document edit_media_referencedBy=Referenciat per: msg_prompt_loadReferences=Atenci\u00f3:

Aquest projecte enlla\u00e7a amb altres projectes.
Voleu que el JClic explori els enlla\u00e7os i carregui tots els materials relacionats?

(Es recomana respondre SI si esteu important un paquet d'activitats Clic 3.0) edit_mc_type=Tipus: edit_mc_type_unknown=Desconegut edit_mc_type_sound=Interpreta so edit_mc_type_video=Interpreta v\u00eddeo edit_mc_type_midi=Interpreta MIDI edit_mc_type_cdaudio=Interpreta CD \u00e0udio edit_mc_type_record=Enregistra so edit_mc_type_play_recorded=Interpreta un enregistrament edit_mc_type_run_activity=V\u00e9s a l'activitat edit_mc_type_run_sequence=V\u00e9s a la seq\u00fc\u00e8ncia edit_mc_type_run_external=Executa un programa edit_mc_type_url=Mostra l'URL edit_mc_type_exit=Acaba edit_mc_type_return=Torna edit_mc_level=Nivell de prioritat: edit_mc_file=Fitxer: edit_mc_externalParam=Par\u00e0metres: edit_mc_from=Des de: edit_mc_to=Fins a: edit_mc_length=Durada m\u00e0x.: edit_mc_recBuffer=Cinta d'enregistrament: edit_mc_stretch=Comprimeix-lo si no hi cap edit_mc_location=Posici\u00f3: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Des de: edit_mc_location_from_box=Cel\u00b7la edit_mc_location_from_window=Finestra edit_mc_location_from_frame=Marc edit_mc_loop=Repeteix indefinidament edit_mc_autostart=Engega autom\u00e0ticament edit_mc_catchmouse=Captura ratol\u00ed edit_mc_title=Contingut actiu i multim\u00e8dia edit_mc_label=Contingut actiu: edit_media_dlg_title=Selecci\u00f3 de l'objecte multim\u00e8dia edit_media_title=Biblioteca de recursos edit_mc_pos_cell=Centrat a la cel\u00b7la edit_mc_pos_window=Centrat a la finestra edit_mc_pos_absolute=Posici\u00f3 absoluta: edit_tree_badFormat=L'estructura o les dades de l'arbre s\u00f3n incorrectes! edit_act_panels_controls=Controls edit_act_panels_controls_tooltip=Opcions de botons i comptadors edit_act_class=Tipus: edit_act_gridLayout=Distribuci\u00f3 dels plafons: edit_act_gridLayout_tooltip=Posici\u00f3 relativa dels plafons A i B. edit_act_inverseResolution=Resoluci\u00f3 inversa edit_act_inverseResolution_tooltip=L'activitat es considerar\u00e0 resolta quan tots els elements de "B" hagin estat aparellats. edit_act_showAllArrows=Mostra totes les fletxes edit_act_alt=Contingut alternatiu: edit_act_alt_tooltip=Contingut que es mostra en les caselles ja resoltes o no assignades. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Edita el contingut alternatiu edit_act_grid=Plaf\u00f3 edit_act_grid_A=Plaf\u00f3 A edit_act_grid_B=Plaf\u00f3 B edit_act_grid_layout=Distribuci\u00f3 edit_act_grid_relationship=Relacions edit_seq_activity_header=activitat edit_seq_tag_header=etiqueta edit_seq_jump_header=saltar a edit_seq_activity=Activitat: edit_seq_tag=Etiqueta: edit_seq_description=Descripci\u00f3: edit_seq_auto=Avan\u00e7 autom\u00e0tic edit_seq_delay=Retard: edit_seq_action_fwd=Avan\u00e7ar edit_seq_action_back=Retrocedir edit_seq_action_jump=Saltar a... edit_seq_action_stop=Aturar-se edit_seq_action_return=Tornar edit_seq_action_exit=Sortir del JClic edit_seq_arrow_fwd=Fletxa endavant: edit_seq_arrow_back=Fletxa enrere: edit_seq_action=Acci\u00f3: edit_seq_button_enabled=Mostra bot\u00f3 edit_seq_project=Projecte JClic: edit_act_absolute=Posici\u00f3 absoluta edit_act_absolute_tooltip=L'objecte se situar\u00e0 a les coordenades X i Y que especifiqueu edit_act_location=Posici\u00f3: edit_seq_newElement=Nou element de seq\u00fc\u00e8ncia... edit_seq_newElement_tooltip=Insereix un nou element a la seq\u00fcencia d'activitats edit_seq_newElement_msg=Selecciona una activitat per al nou element de seq\u00fc\u00e8ncia. edit_seq_newElement_error_noAct=No es pot crear un nou element de seq\u00fc\u00e8ncia sense indicar l'activitat. edit_seq_newElement_error_emptyList=En aquest projecte no hi ha cap activitat! No es poden crear elements de seq\u00fc\u00e8ncia en un projecte buit. edit_seq_jump_msg=Dest\u00ed del salt: edit_seq_jump_title=Dest\u00ed del salt edit_act_newActivity_tooltip=Afegeix una nova activitat al projecte edit_act_prompt_class=Tipus d'activitat: edit_act_prompt_name=Nom: edit_act_newActivity_msg=Seleccioneu el tipus d'activitat que voleu crear i doneu-li un nom: edit_act_newActivity_error_noAct=Cal seleccionar un tipus d'activitat! edit_act_newActivity_error_noName=Heu d'indicar un nom per l'activitat! edit_act_newActivity_error_creating=No s'ha pogut crear l'activitat! edit_act_newActivity_class=Classe Java: edit_text_act_format=Format edit_text_act_answer=Resposta edit_text_act_popup=Finestra emergent edit_text_act_answer_label=Respostes v\u00e0lides: edit_list_newElement_tooltip=Afegeix un nou element a la llista edit_list_editElement_tooltip=Modifica l'element seleccionat edit_list_deleteElement_tooltip=Elimina l'element seleccionat de la llista edit_list_upBtn_tooltip=Mou amunt edit_list_downBtn_tooltip=Mou avall edit_list_newValue=Nou text: edit_list_addElement=Afegeix un nou element de text edit_list_modifyValue=Modifica el text seleccionat edit_text_act_target=Inc\u00f2gnita edit_text_act_maxLen=Longitud m\u00e0xima: edit_text_act_maxLen_tooltip=Nombre m\u00e0xim de car\u00e0cters de la resposta. edit_text_act_fillingChar=Car\u00e0cter de farciment edit_text_act_fillingChar_tooltip=Car\u00e0cter emprat per a indicar la inc\u00f2gnita edit_text_act_iniLen=Longitud inicial: edit_text_act_iniLen_tooltip=Nombre de car\u00e0cters de farciment que es mostraran en iniciar-se l'activitat. edit_text_act_iniText=Text inicial: edit_text_act_iniText_tooltip=Text que es mostrar\u00e0 a la inc\u00f2gnita en iniciar l'activitat. edit_text_act_list=Mostra una llista d'opcions: edit_text_act_list_tooltip=L'usuari haur\u00e0 de seleccionar una opci\u00f3 en una llista. edit_text_act_check_title=Opcions d'avaluaci\u00f3 edit_text_act_popup_no=Sense finestra emergent edit_text_act_popup_always=Aparici\u00f3 autom\u00e0tica edit_text_act_popup_onError=Aparici\u00f3 en errors edit_text_act_popup_onDemand=Aparici\u00f3 amb F1 edit_text_act_popup_type=Tipus: edit_text_act_popup_delay=Retard d'aparici\u00f3: edit_text_act_popup_maxTime=Temps m\u00e0xim: edit_text_act_popup_onlyPlay=Nom\u00e9s interpreta so edit_text_act_err_noSelection=Per crear una nova inc\u00f2gnita cal que seleccioneu un fragment de text! edit_text_act_err_badCharInSelection=El text de les inc\u00f2gnites no pot incloure retorns de par\u00e0graf ni tabuladors. edit_text_act_err_nestedTargets=Les inc\u00f2gnites no es poden superposar! edit_text_act_err_cellInTarget=Les inc\u00f2gnites no poden contenir cel\u00b7les! edit_text_act_pageBgColor=Color del paper: edit_text_act_editStylesBtn=Edita els estils del document... edit_text_act_mainStyle=Estil principal: edit_text_act_tabSpc=Amplada del tabulador: edit_text_act_tabSize=Espais entre marques de tabulador: edit_text_act_colors=Colors: edit_text_act_targetStyle=Colors de les inc\u00f2gnites: edit_text_act_errorStyle=Colors d'error: edit_text_act_preview=Visualitzaci\u00f3 pr\u00e8via: edit_text_act_styleSample_default_start=Text normal edit_text_act_styleSample_target=inc\u00f2gnita edit_text_act_styleSample_error=error edit_text_act_styleSample_default_fill=text normal edit_text_act_styleSample_default_end=text normal. edit_text_act_warnDeleteTarget=Atenci\u00f3: aquesta acci\u00f3 suprimir\u00e0 la inc\u00f2gnita actualment seleccionada. Segur que vols fer-ho? edit_text_act_prevScreen_title=Finestra pr\u00e8via... edit_text_act_prevScreen_no=No mostris cap text abans d'iniciar l'activitat edit_text_act_prevScreen_original=Mostra el text complet de l'exercici edit_text_act_prevScreen_special=Mostra aquest text: edit_text_act_prevScreen_time=Temps m\u00e0xim: edit_text_act_edit_target=Inc\u00f2gnita... edit_text_act_checkButton_show=Mostra el bot\u00f3 d'avaluaci\u00f3 edit_text_act_checkButtonText=Text del bot\u00f3: edit_text_act_checkCase=Comprova maj\u00fascules / min\u00fascules edit_text_act_checkAccents=Considera accents i car\u00e0cters especials edit_text_act_checkPunct=Considera els s\u00edmbols de puntuaci\u00f3 edit_text_act_checkDoubleSpc=Permet espais repetits edit_text_act_checkOptions=Criteris edit_text_act_checkAutoJump=Salta autom\u00e0ticament a la seg\u00fcent inc\u00f2gnita edit_text_act_checkForceOk=Avan\u00e7a nom\u00e9s si es respon correctament edit_text_act_checkDetail=Indica la posici\u00f3 dels errors edit_text_act_checkDetail_params=Par\u00e0metres de l'algorisme d'an\u00e0lisi: edit_text_act_checkDetail_steps=Passos: edit_text_act_checkDetail_field=Camp d'exploraci\u00f3: edit_text_act_defaultCheckButtonText=Avaluaci\u00f3 edit_text_act_advancedCorrectionOptions=An\u00e0lisi de les respostes edit_text_act_check_bt=Avaluaci\u00f3... edit_text_act_checkButton=Bot\u00f3 d'avaluaci\u00f3 edit_text_act_checkProgress=Progr\u00e9s edit_text_act_typeBtn=Tipus... edit_text_act_orderParagraphs=Ordenar par\u00e0grafs edit_text_act_orderWords=Ordenar paraules edit_text_act_order_amongstPar=Barreja paraules entre par\u00e0grafs edit_text_act_type_title=Tipus d'activitat edit_text_act_warnChangeType=Aquesta acci\u00f3 suprimir\u00e0 totes les inc\u00f2gnites actualment definides. Segur que vols fer-ho? edit_text_act_identWords=Identificar paraules edit_text_act_identChars=Identificar car\u00e0cters edit_media_change_name=Canvia el nom... edit_media_change_file=Canvia el fitxer... edit_media_includeInZip=Desar-lo en el fitxer ZIP edit_media_type=Tipus de recurs: edit_media_size=Mida del fitxer: edit_media_show_type=Tipus de fitxers: edit_media_preview=Mostra l'objecte edit_media_preview_tooltip=Visualitzaci\u00f3 del recurs edit_media_rename=Canvi del nom del recurs edit_media_rename_title=Canvi de nom edit_media_rename_prompt=Nou nom: edit_media_rename_invalid=Nom de recurs no v\u00e0lid! edit_media_rename_exists=Ja hi ha un altre recurs amb aquest nom! Cada recurs ha de tenir un nom \u00fanic en el projecte. edit_media_chfile_invalid=Fitxer incorrecte! err_media_chfile_different=El fitxer ha de ser del mateix tipus edit_media_font_error=No ha estat possible carregar el tipus de lletra! edit_media_save_file=Desa el fitxer (extreu-lo del ZIP) edit_media_refresh_file=Actualitza el contingut del recurs des del fitxer edit_media_warn_zipFileNotExternal=Aquest no \u00e9s un fitxer "real", sin\u00f3 un objecte situat dins d'un contenidor ZIP. Per fer servir aquesta funci\u00f3 cal que hi hagi un fitxer amb el mateix nom a la carpeta on es troba el fitxer ZIP. edit_activities=Activitats edit_sequences=Seq\u00fc\u00e8ncies edit_media=Mediateca edit_media_tooltip=Gesti\u00f3 de les Imatges i altres recursos emprats en el projecte. edit_activities_tooltip=Creaci\u00f3 i modificaci\u00f3 de les activitats del projecte edit_sequences_tooltip=Creaci\u00f3 i modificaci\u00f3 de seq\u00fc\u00e8ncies d'activitats edit_project_title=T\u00edtol: edit_project_title_tooltip=T\u00edtol del projecte edit_project=Projecte edit_project_tooltip=Edici\u00f3 de les propietats del projecte edit_project_description=Descripci\u00f3: edit_project_description_tooltip=Descripci\u00f3 general del projecte edit_project_images_block=Imatges edit_project_cover=Car\u00e0tula (300x200 aprox.): edit_project_cover_tooltip=Imatge a utilitzar com a car\u00e0tula del projecte en biblioteques de recursos edit_project_thumb=Miniatura (100x70 aprox.): edit_project_thumb_tooltip=Image a utilitzar com a miniatura del projecte en botons i llistats edit_project_icon16=Icona petita (16x16): edit_project_icon72=Icona mitjana (72x72): edit_project_icon192=Icona gran (192x192): edit_project_icons_tooltip=Icones que es declaren en exportar a HTML5 edit_project_area=\u00c0rees: edit_project_area_tooltip=\u00c0rees curriculars a les quals s'orienta el projecte edit_project_level=Nivells: edit_project_level_tooltip=Nivells i cicles educatius als quals s'adre\u00e7a el projecte edit_project_descriptors=Descriptors: edit_project_descriptors_tooltip=Descriptors del projecte (separats per comes) edit_project_languages=Idiomes: edit_project_languages_tooltip=Idiomes emprats en el projecte edit_project_languages_modify=Canvia l'idioma seleccionat edit_project_languages_add=Afegeix un idioma edit_project_languages_select=Codis d'idioma ISO-639: edit_project_languages_already_selected=Aquest idioma ja estava seleccionat! edit_project_languages_confirm_delete=Realment voleu eliminar aquest idioma? (no es pot desfer) edit_project_authors=Autors/es: edit_project_authors_tooltip=Persones que han contribu\u00eft a la creaci\u00f3 del projecte edit_project_author_name=Nom: edit_project_author_mail=Correu electr\u00f2nic: edit_project_author_rol=Rol: edit_project_author_organization=Organitzaci\u00f3: edit_project_author_comments=Comentaris: edit_project_author_url=URL: edit_project_author_name_tooltip=Nom de l'autor/a (camp obligatori) edit_project_author_mail_tooltip=Adre\u00e7a de correu electr\u00f2nic de l'autor/a (opcional) edit_project_author_rol_tooltip=Rol de la persona en el projecte: autor/a, col\u00b7laborador/a, dibuixos, sons... (camp opcional) edit_project_author_organization_tooltip=Escola, universitat, associaci\u00f3... (camp opcional) edit_project_author_url_tooltip=P\u00e0gina web personal (camp opcional) edit_project_author_comments_tooltip=Altres caracter\u00edstiques (camp opcional) edit_project_author_info=Dades de l'autor/a: edit_project_author_add=Afegeix un autor a la llista edit_project_author_edit=Modifica les dades de l'autor/a edit_project_org_name=Nom: edit_project_org_name_tooltip=Nom de l'escola edit_project_org_mail=Correu electr\u00f2nic: edit_project_org_mail_tooltip=Adre\u00e7a de correu electr\u00f2nic de l'escola edit_project_org_url=URL: edit_project_org_url_tooltip=Adre\u00e7a web de l'escola edit_project_org_address=Adre\u00e7a: edit_project_org_address_tooltip=Adre\u00e7a postal de l'escola edit_project_org_pc=CP: edit_project_org_pc_tooltip=Codi postal edit_project_org_city=Localitat: edit_project_org_city_tooltip=Localitat de l'escola edit_project_org_country=Pa\u00eds: edit_project_org_state=Estat: edit_project_org_comments=Comentaris: edit_project_org=Centre/s: edit_project_org_tooltip=Escoles i altres institucions que han participat en el projecte edit_project_org_info=Dades de l'organitzaci\u00f3: edit_project_org_add=Afegir una nova organitzaci\u00f3 edit_project_org_edit=Modificar les dades de l'organitzaci\u00f3 edit_project_org_country_tooltip=Estat, pa\u00eds, federaci\u00f3... edit_project_org_state_tooltip=Estat federal, nacionalitat, comunitat, regi\u00f3... edit_project_org_comments_tooltip=Altres dades... edit_project_rev_date=Data: edit_project_rev_date_tooltip=Data de la revisi\u00f3 edit_project_rev_authors=Autors/es: edit_project_rev_authors_tooltip=Autors/es de la revisi\u00f3 edit_project_rev_description=Descripci\u00f3: edit_project_rev_description_tooltip=Breu descripci\u00f3 dels canvis realitzats edit_project_rev_comments=Comentaris: edit_project_rev_comments_tooltip=Informaci\u00f3 addicional edit_project_rev=Revisions: edit_project_rev_tooltip=Historial de les principals modificacions realitzades al projecte edit_project_rev_add=Afegir un registre de revisi\u00f3 edit_project_rev_edit=Modificaci\u00f3 de les dades de la revisi\u00f3 edit_project_rev_info=Dades de la revisi\u00f3 edit_media_objects=objectes edit_media_object=objecte edit_evsounds_start=Inici d'activitat: edit_evsounds_click=Fer clic a un objecte: edit_evsounds_actionError=Acci\u00f3 err\u00f2nia: edit_evsounds_actionOk=Acci\u00f3 correcta: edit_evsounds_finishedError=Activitat acabada amb errors: edit_evsounds_finishedOk=Activitat acabada correctament: edit_project_rev_err_nodesc=Error: La descripci\u00f3 no es pot deixar en blanc edit_evsounds_dlg_title=Edita els sons d'events edit_project_evsounds=Sons d'esdeveniment: edit_project_evsounds_tooltip=Assigna sons espec\u00edfics per a cada esdeveniment del JClic edit_act_evsounds=Sons d'esdeveniment: edit_act_evsounds_tooltip=Assigna sons espec\u00edfics per a cada esdeveniment del JClic edit_evsounds_default=so per defecte edit_evsounds_disabled=desactivat edit_evsounds_chk_tooltip=Activa o desactiva el so per aquest esdeveniment edit_evsounds_select_tooltip=Cliqueu per a seleccionar un so per aquest esdeveniment, o desmarqueu per emprar el so per defecte action_newProject_caption=Nou projecte... action_newProject_keys=NN action_newProject_tooltip=Crea un nou projecte JClic edit_arith_op_from=Des de: edit_arith_op_from_tooltip=Valor m\u00ednim de l'operand edit_arith_op_to=Fins a: edit_arith_op_to_tooltip=Valor m\u00e0xim de l'operand edit_arith_op_with=Amb: edit_arith_op_with_tooltip=Si es marca, l'operand pot tenir tamb\u00e9 aquest valor edit_arith_op_fromList=Un de la llista: edit_arith_op_fromList_tooltip=Llista de possibles valors de l'operand edit_arith_op_decimals=Decimals: edit_arith_op_decimals_tooltip=Nombre de decimals de l'operand edit_arith_op_dec0=# (enter) edit_arith_op_dec1=#,# edit_arith_op_dec2=#,## edit_arith_firstOp=Primer operand edit_arith_secondOp=Segon operand edit_arith_title=Arith2 pel JClic edit_arith_operations=Operacions: edit_arith_operations_tooltip=Seleccioneu el tipus d'operacions a efectuar edit_arith_operations_plus=Sumes edit_arith_operations_minus=Restes edit_arith_operations_multiply=Multiplicacions edit_arith_operations_divide=Divisions edit_arith_unknown=Inc\u00f2gnita: edit_arith_unknown_tooltip=Seleccioneu l'element que far\u00e0 d'inc\u00f2gnita edit_arith_unknown_aobx=La inc\u00f2gnita \u00e9s el resultat edit_arith_unknown_aoxr=La inc\u00f2gnita \u00e9s el segon operand edit_arith_unknown_xobr=El primer operand \u00e9s la inc\u00f2gnita edit_arith_unknown_axbr=L'operaci\u00f3 \u00e9s la inc\u00f2gnita edit_arith_unknown_invert=Escriu l'expressi\u00f3 comen\u00e7ant pel resultat edit_arith_result=Resultat: edit_arith_result_notCarry=Sense "portar-ne" edit_arith_result_random=Aleatori edit_arith_result_asc=Ascendent edit_arith_result_order=Ordena per resultat: edit_arith_result_desc=Descendent edit_arith_result_avoidDup=Evitar duplicats edit_arith_cond=Condicions: edit_arith_cond_ind=Indiferent edit_arith_cond_agb=El primer operand ha de ser m\u00e9s gran que el segon edit_arith_cond_alb=El primer operand ha de ser menor que el segon edit_arith_cond_tooltip=Altres condicions edit_autocp=Generador autom\u00e0tic de contingut: edit_autocp_tooltip=Selecci\u00f3 del tipus de generador autom\u00e0tic de contingut per aquesta activitat. edit_autocp_block=Generador de contingut edit_autocp_btn=Configuraci\u00f3... edit_autocp_btn_tooltip=Configura els par\u00e0metres del generador de contingut edit_data=Edici\u00f3 de dades edit_act=Edici\u00f3 de l'activitat edit_acp=Edici\u00f3 del generador de contingut edit_acp_err_creating=Error en crear el generador autom\u00e0tic de contingut! edit_project_author_group=Creaci\u00f3 edit_project_description_block=Descripci\u00f3 edit_project_ui_block=Interf\u00edcie d'usuari edit_act_description=Descripci\u00f3: m_Edit=Edita m_Edit_Mnemonic=E edit_media_preview_keys=V* edit_act_newActivity=Nova activitat... edit_act_newActivity_keys=A* edit_act_testAction_keys=M#10 edit_seq_newElement_keys=S* m_Insert=Insereix m_Insert_Mnemonic=I m_View=Visualitza m_View_Mnemonic=V action_editProject_caption=Projecte action_editProject_keys=PP action_editProject_tooltip=Edita les propietats del projecte action_editMedia_caption=Mediateca action_editMedia_keys=MM action_editMedia_tooltip=Edita la biblioteca de recursos multim\u00e8dia del projecte action_editActivities_caption=Activitats action_editActivities_keys=AA action_editActivities_tooltip=Edita les activitats action_editSeq_caption=Seq\u00fc\u00e8ncies action_editSeq_keys=SS action_editSeq_tooltip=Edita les seq\u00fc\u00e8ncies d'activitats warn_project_modified=El projecte actual ha estat modificat. Voleu desar els canvis? edit_project_descriptors_block=Descriptors edit_media_new=Nou objecte multim\u00e8dia... edit_media_new_tooltip=Afegeix una imatge o un objecte multim\u00e8dia a la mediateca edit_media_new_keys=M* edit_seq_threshold=Llindar de puntuaci\u00f3: edit_seq_threshold_tooltip_up=V\u00e9s per aquest cam\u00ed quan la puntuaci\u00f3 global sigui igual o superior a... edit_seq_time=Llindar de temps: edit_seq_time_tooltip_up=Per seguir aquest cam\u00ed cal haver realitzat les activitats en un temps inferior a... edit_seq_threshold_tooltip_down=Segueix aquest cam\u00ed sempre que la puntuaci\u00f3 global sigui inferior a... edit_seq_time_tooltip_down=Segueix aquest cam\u00ed sempre que el temps emprat en les activitats sigui superior a... edit_seq_condJump=Salts condicionals edit_seq_condJump_tooltip=Especifica salts que seran executats nom\u00e9s si es donen determinades condicions edit_seq_condJump_upper_tooltip=Indica les condicions per saltar a un nivell superior edit_seq_condJump_lower=Salt inferior: edit_seq_condJump_upper=Salt superior: edit_seq_condJump_lower_tooltip=Indica les condicions per saltar a un nivell inferior edit_seq_action_tooltip_fw=Acci\u00f3 assignada al bot\u00f3 d'avan\u00e7ar edit_seq_action_tooltip_bk=Acci\u00f3 assignada al bot\u00f3 de retrocedir edit_seq_jump_tooltip=Indica el dest\u00ed del salt edit_seq_action_tooltip=Acci\u00f3 a realitzar edit_seq_activity_tooltip=Activitat associada a aquest element de seq\u00fc\u00e8ncia edit_seq_tag_tooltip=Etiqueta emprada per referir-se a aquest element de seq\u00fc\u00e8ncia (camp opcional) edit_seq_description_tooltip=Descripci\u00f3 de l'element de seq\u00fc\u00e8ncia (camp opcional) edit_seq_button_enabled_tooltip=Activa o desactiva el bot\u00f3 de pas d'activitat edit_seq_auto_tooltip=Avan\u00e7ar autom\u00e0ticament en acabar l'activitat edit_seq_delay_tooltip=Nombre de segons a esperar abans de realitzar el pas autom\u00e0tic edit_color_dlgTitle=Selecci\u00f3 del color edit_media_renaming=Si us plau, espereu mentre es canvia el nom del recurs... edit_act_cell_width=Amplada: edit_act_cell_width_tooltip=Amplada de les cel\u00b7les (en p\u00edxels) edit_act_cell_height=Al\u00e7ada: edit_act_cell_height_tooltip=Al\u00e7ada de les cel\u00b7les (en p\u00edxels) edit_act_hiddenWords=Paraules amagades: edit_act_hiddenWords_tooltip=Llista de les paraules que s'han amagat al plaf\u00f3 edit_act_wordSearch_panelB=Emprar el plaf\u00f3 B edit_act_wordSearch_panelB_tooltip=Fes servir un segon plaf\u00f3, que es mostrar\u00e0 a mesura que es trobin les paraules edit_act_shaper_tooltip=Selecci\u00f3 del tipus de generador de formes del plaf\u00f3 edit_act_num_cols_tooltip=Nombre de columnes del plaf\u00f3 edit_act_num_rows_tooltip=Nombre de files del plaf\u00f3 edit_act_wildTransparent=Separadors transparents edit_act_wildTransparent_tooltip=Mostra els separadors (cel\u00b7les negres) com a forats transparents edit_act_behavior_scramble_times=Barreges: edit_act_behavior_scramble_times_tooltip=Nombre de vegades que es barrejaran les peces edit_act_copy_title=Copia atributs a... edit_act_copy_attributes=Atributs edit_act_copy_dest=Aplica a: edit_act_copy_style_main=Finestra principal edit_act_copy_style_play=Finestra de joc edit_act_copy_activities=Activitats a modificar: edit_act_copyAttributes=Copia atributs edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copia a altres activitats alguns dels atributs de l'activitat actual edit_new_project_name=Nom del projecte: edit_new_project_name_tooltip=Nom curt i descriptiu del projecte edit_new_project_filename=Nom del fitxer: edit_new_project_filename_tooltip=Nom del fitxer del projecte, sense extensi\u00f3 edit_new_project_folder=Carpeta: edit_new_project_folder_tooltip=Nom de la carpeta on es guardar\u00e0 el projecte edit_new_project_folder_browse=Navega... edit_new_project_title=Creaci\u00f3 d'un nou projecte JClic edit_new_project_err_empty=Error: Tant el projecte com el fitxer i la carpeta han de tenir noms v\u00e0lids. edit_new_project_warning_noEmptyFolder=En aquesta carpeta ja hi ha un altre projecte Clic3.0 o JClic. Per evitar confusions es recomana mantenir cada projecte en una carpeta independent, tot i que aix\u00f2 no \u00e9s un requisit imprescindible. Realment voleu crear el nou projecte en aquesta carpeta? edit_new_project_err_folderCreation=Error: Ha estat impossible crear la carpeta que heu indicat! edit_act_copy_err_noSelection=No heu seleccionat cap activitat! Per fer servir aquesta funci\u00f3 cal seleccionar a la llista l'activitat o activitats a les quals s'aplicaran els atributs indicats. edit_act_copy_action_prefix=Copiant atributs a: edit_act_copy_margin=Marge edit_act_copy_bgColor=Color de fons edit_act_copy_gradient=Degradat edit_act_copy_bgImage=Imatge de fons edit_act_copy_border=Vora edit_act_copy_transparentBg=Fons transparent edit_act_copy_position=Posici\u00f3 edit_act_copy_messages=Missatges edit_act_copy_messages_ini=Estil del missatge inicial edit_act_copy_messages_end=Estil del missatge final edit_act_copy_messages_err=Estil del missatge d'error edit_act_copy_reports=Informes edit_act_copy_rep_include=Incloure l'activitat als informes edit_act_copy_rep_actions=Enregistrar accions edit_act_copy_interface=Interf\u00edcie d'usuari edit_act_copy_skin=Entorn visual edit_act_copy_evSounds=Sons d'esdeveniment edit_act_copy_counters=Comptadors edit_act_copy_cTime=Comptador de temps edit_act_copy_maxTime=Temps m\u00e0xim edit_act_copy_cTries=Comptador d'intents edit_act_copy_maxTries=Nombre m\u00e0xim d'intents edit_act_copy_cScore=Comptador d'encerts edit_act_copy_scramble=Nombre de vegades que cal barrejar edit_act_copy_buttons=Botons edit_act_copy_btnHelp=Bot\u00f3 d'ajuda edit_act_copy_btnInfo=Bot\u00f3 d'informaci\u00f3 edit_act_copy_grids=Plafons edit_act_copy_gridA=Estil del plaf\u00f3 A edit_act_copy_gridB=Estil del plaf\u00f3 B edit_act_copy_textGrid=Estil dels plafons de text edit_act_copy_text=Activitats de text edit_act_copy_fontFace=Tipus de lletra edit_act_copy_fontSize=Mida de lletra edit_act_copy_fontStyle=Estil de lletra edit_act_copy_textColour=Color del text principal edit_act_copy_textTargetColour=Color de les inc\u00f2gnites edit_act_copy_textErrorColour=Color dels errors edit_act_copy_tabSpace=Espai entre tabuladors edit_act_copy_messages_prev=Estil del missatge previ edit_act_changeType=Canvia el tipus d'activitat edit_act_newActivity_class_tooltip=Nom complet de la classe que es far\u00e0 servir per construir l'activitat (usuaris avan\u00e7ats!) edit_act_newActivity_other=Altres... edit_act_newActivity_info=Els usuaris/es avan\u00e7ats/es poden crear tamb\u00e9 altres tipus d'activitats JClic no registrades. Escriviu a sota el nom complet de la classe, precedida pel del paquet (per exemple: "com.acme.activities.FooActivity"). Les noves activitats han d'estendre edu.xtec.jclic.Activity, i han de ser accessibles al carregador de classes de la m\u00e0quina virtual de Java. edit_act_newActivity_name=Nom de l'activitat: edit_act_newActivity_name_tooltip=Cada activitat ha de tenir un nom \u00fanic en el projecte edit_act_changeType_warning=

Atenci\u00f3: El canvi de tipus pot comportar la p\u00e8rdua d'alguns objectes i atributs de l'activitat que s'est\u00e0 editant. Feu servir aquesta funci\u00f3 amb cura!

 

applet_codebase=Ubicaci\u00f3 del codi JClic: applet_codebase_tooltip=URL que apunta a una carpeta on estiguin ubicats els fitxers de programa i els scripts del JClic applet_prev_text=Codi HTML previ: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Text o codi HTML que apareixer\u00e0 abans de l'applet applet_post_text=Codi HTML posterior: applet_post_text_tooltip=Text o codi HTML que apareixer\u00e0 despr\u00e9s de l'applet applet_size=Mida de l'applet: applet_size_tooltip=Amplada i al\u00e7ada de l'applet, en valor absolut o percentual. applet_page_title=T\u00edtol de la p\u00e0gina: applet_page_title_tooltip=Text que es mostrar\u00e0 a dalt de la finestra del navegador applet_created_info=La p\u00e0gina web "%s" ha estat creada amb \u00e8xit. applet_created_prompt=Voleu obrir-la ara amb el navegador? action_createHTML_caption=Crea una p\u00e0gina web amb un applet Java... applet_create_title=Creaci\u00f3 d'una p\u00e0gina HTML amb un applet JClic action_createHTML_tooltip=Crea una p\u00e0gina HTML amb un applet que contingui el projecte actual applet_filename=Nom del fitxer: applet_filename_tooltip=Nom del fitxer HTML que es crear\u00e0 action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Valors per defecte emprats en la creaci\u00f3 de p\u00e0gines web applet_bgcolor=Color de fons: applet_bgcolor_tooltip=Color de fons de la p\u00e0gina web applet_centered=Centrat applet_centered_tooltip=Situa l'applet centrat horitzontalment applet_width_tooltip=Amplada de l'applet (en valor absolut o percentual) applet_height_tooltip=Al\u00e7ada de l'applet (en valor absolut o percentual) applet_exitUrl=En sortir, anar a: applet_exitUrl_tooltip=URL cap on es redirigir\u00e0 la navegaci\u00f3 en sortir del JClic applet_infoFrame=Marc d'informaci\u00f3: applet_infoFrame_tooltip=Nom del marc emprat per mostrar el contingut lligat al bot\u00f3 "informaci\u00f3" action_createInstaller_caption=Crea un instal\u00b7lador del projecte... action_createInstaller_keys=I* action_createInstaller_tooltip=Crea un fitxer d'instal\u00b7laci\u00f3 del projecte per al JClic player installer_caption=Edici\u00f3 del fitxer d'instal\u00b7laci\u00f3 del projecte installer_title=T\u00edtol: installer_title_tooltip=T\u00edtol del projecte que es mostrar\u00e0 a l'assistent d'instal\u00b7laci\u00f3 installer_authors=Autors/es: installer_authors_tooltip=Autors/es del projecte (text curt) installer_folder=Carpeta: installer_folder_tooltip=Nom de carpeta que suggerir\u00e0 l'assistent d'instal\u00b7laci\u00f3 installer_files=Fitxers a copiar: installer_files_tooltip=Fitxers que es copiaran durant la instal\u00b7laci\u00f3 installer_files_available=Fitxers disponibles installer_files_selected=Fitxers seleccionats installer_files_add=>> afegeix >> installer_files_add_tooltip=Afegeix el fitxer seleccionat a la llista installer_files_remove=<< treu << installer_files_remove_tooltip=Treu el fitxer seleccionat de la llista installer_button=Bot\u00f3 d'activaci\u00f3 installer_button_tooltip=Propietats del bot\u00f3 que es mostrar\u00e0 a la biblioteca de projectes installer_button_project=Projecte principal: installer_button_project_tooltip=Projecte JClic associat al bot\u00f3 installer_button_text=Etiqueta: installer_button_text_tooltip=Breu etiqueta de text, que apareixer\u00e0 dins del bot\u00f3 installer_button_icon=Icona: installer_button_icon_tooltip=Imatge que mostrar\u00e0 el bot\u00f3. Deixeu-ho en blanc per mostrar la icona per defecte del JClic. installer_button_description=Descripci\u00f3 installer_button_description_tooltip=Text d'ajuda emergent que mostrar\u00e0 el bot\u00f3 installer_error_noTitle=Error: Cal indicar el t\u00edtol del projecte installer_error_noBaseFolder=Error: Cal indicar el nom de la carpeta on s'instal\u00b7lar\u00e0 el projecte installer_error_noFilesSelected=Error: No heu seleccionat cap fitxer installer_error_noButtonText=Error: Cal indicar el text del bot\u00f3 d'activaci\u00f3 installer_error_projectNotInFiles=Error: El projecte assignat al bot\u00f3 d'activaci\u00f3 no es troba a la llista de fitxers a copiar applet_page_full=L'applet ocupa tota la p\u00e0gina applet_page_mixed=L'applet t\u00e9 unes dimensions espec\u00edfiques edit_text_align_left=Alinear el text a l'esquerra edit_text_align_center=Text centrat edit_text_align_right=Alinear el text a la dreta edit_text_act_target_toggle=Crea una inc\u00f2gnita o suprimeix-la edit_text_act_insertCell=Insereix una cel\u00b7la edit_text_act_content=Contingut edit_text_act_style=Estil edit_cell_size=Dimensions: edit_project_orphanActivities=Les seg\u00fcents activitats mai no arribaran a executar-se, ja que no apareixen a cap seq\u00fc\u00e8ncia d'activitats del projecte: edit_project_orphanMedia=Els seg\u00fcents objectes de la mediateca no es fan servir directament en cap activitat: edit_project_orphanActivities_prompt=Voleu afegir-les al final de la darrera sequ\u00e8ncia d'activitats? edit_project_orphanMedia_prompt=Voleu eliminar-los? edit_project_orphanMedia_title=Retirada d'objectes multim\u00e8dia no utilitzats edit_project_orphanActivities_title=Activitats \u00f2rfenes edit_media_refreshAll=Actualitza el contingut de tots els recursos edit_media_refreshAll_tooltip=Actualitza tots els recursos tornant a carregar els seus fitxers edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Actualitzant recursos... edit_media_exportAll=Exporta tots els recursos edit_media_exportAll_tooltip=Enregistra en fitxers el contingut de tots els recursos edit_media_exportAll_keys=X* edit_shape_select=Selecciona edit_shape_addPoint=Afegeix un punt edit_shape_deletePoint=Elimina edit_shape_drawRect=Dibuixa un rectangle edit_shape_drawEllipse=Dibuixa una el\u00b7lipse edit_shape_drawPoly=Dibuixa un pol\u00edgon edit_shape_toLine=Converteix en l\u00ednia edit_shape_toBezier=Converteix en corba de B\u00e9zier edit_shape_toQuad=Converteix en qu\u00e0drica edit_shape_rLeft=Gira a l'esquerra edit_shape_rRight=Gira a la dreta edit_shape_expand=Expandeix edit_shape_contract=Contreu edit_shape_zoomIn=Apropa edit_shape_zoomOut=Allunya edit_shape_aproxPoints=Ajunta punts propers edit_shape_showPoints=Mostra punts edit_shape_showPoints_tooltip=Mostra/Amaga els punts edit_shape_gridSize=Reixeta: edit_shape_hideGrid=Mostra o amaga la reixeta edit_shape_magnetRadius=Radi de l'imant: edit_shape_elements=Elements definits edit_shape_elemName=Nom de l'element seleccionat edit_shape_magnetRadius_tooltip=Radi d'acci\u00f3 de l'imant quan es troba activat edit_shape_gridSize_tooltip=Mida de la reixeta edit_mc_activity=Activitat: edit_mc_sequence=Seq\u00fc\u00e8ncia: edit_mc_url=URL: edit_mc_project=Projecte: edit_mc_activity_selection=Selecci\u00f3 de l'activitat edit_mc_sequence_selection=Selecci\u00f3 de la seq\u00fc\u00e8ncia edit_mc_err_nullContent=Dades insuficients! edit_act_arrowColor=Color de les fletxes: edit_act_arrowColor_tooltip=Color emprat per l'editor per dibuixar les fletxes (no \u00e9s exacte, ja que es fa servir una m\u00e0scara XOR de bits) edit_act_editActivity=Edita... edit_act_editActivity_tooltip=Edita l'activitat seleccionada action_saveFileAs_caption=Anomena i desa... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Desa el projecte amb un nom diferent edit_act_behavior_block=Comportament edit_act_behavior=Comportament edit_act_behavior_drag=Arrossega edit_act_behavior_drag_tooltip=Arrossega els objectes en comptes d'unir-los amb una l\u00ednia edit_act_behavior_order=Comprova l'ordre de resoluci\u00f3 edit_act_behavior_order_tooltip=Les caselles s'han de resoldre ordenadament edit_act_scramble=Barreja action_importActivities_caption=Importa activitats... action_importActivities_keys=I* action_importActivities_tooltip=Importa activitats d'un altre projecte import_warn_samefile=El fitxer que heu seleccionat correspon al projecte actual. La importaci\u00f3 d'activitats nom\u00e9s es pot fer entre projectes diferents. Si us plau, seleccioneu un altre fitxer de projecte. import_selectActivities=Seleccioneu una o m\u00e9s activitats per a importar-les al projecte actual: import_importing=S'est\u00e0 important... import_checkdep=S'estan comprovant les depend\u00e8ncies... import_impmedia=S'estan important recursos: import_impact=S'est\u00e0 important l'activitat: import_selectProject=Seleccioneu el projecte JClic del qual desitgeu importar activitats edit_tagRep_tags=Marques d'etiqueta edit_tagRep_tagStart=Marca d'inici: edit_tagRep_tagStart_tooltip=Marca que indica inici d'etiqueta edit_tagRep_tagEnd=Marca d'acabament: edit_tagRep_tagEnd_tooltip=Marca que indica acabament d'etiqueta edit_tagRep_file=Fitxer edit_tagRep_fileName=Fitxer o URL: edit_tagRep_fileName_tooltip=Nom o URL del fitxer que cont\u00e9 els valors que substituiran les etiquetes edit_tagRep_charset=Codificaci\u00f3: edit_tagRep_charset_tooltip=Tipus de codificaci\u00f3 emprada en el fitxer edit_tagRep_browseFile=Navega... edit_tagRep_browseFile_tooltip=Navega pel sistema de fitxers edit_tagRep_title=Substituci\u00f3 d'etiquetes edit_text_act_clearStylesBtn=Neteja estils de text... edit_text_act_clearStylesPrompt=Atenci\u00f3: Aquesta acci\u00f3 netejar\u00e0 els atributs especials de car\u00e0cter aplicats al document, retornant-lo al seu estil principal. L'operaci\u00f3 no es pot desfer. Voleu fer-ho? img_max_size=Mida m\u00e0xima de les imatges: img_max_width_tooltip=Amplada m\u00e0xima de les imatges que s'importen a la mediateca. img_max_height_tooltip=Al\u00e7ada m\u00e0xima de les imatges que s'importen a la mediateca. img_resize_prompt=La imatge "%s" t\u00e9 unes dimensions de %s p\u00edxels, que excedeixen el m\u00e0xim perm\u00e8s pel JClic Author (%s). Voleu redimensionar-la? export_project_desc=Indiqueu la carpeta on s'han d'escriure els fitxers resultants de l'exportaci\u00f3. export_project_output_folder=Carpeta d'exportaci\u00f3: export_project_title=Exporta el projecte actual a HTML5 export_project_includeAll=Exporta tamb\u00e9 altres projectes JClic existents a la carpeta actual export_project_exportSCORM=Crea tamb\u00e9 un fitxer ZIP en format SCORM amb tots els fitxers necessaris export_project_scorm_file=Fitxer SCORM: export_project_scorm_file_tooltip=Especifiqueu la ubicaci\u00f3 del fitxer SCORM export_project_scorm_file_browse=Fitxer... export_project_scorm_file_exists=ATENCI\u00d3: El fitxer SCORM que heu especificat ja existeix. Voleu sobreescriure'l? export_project_err_empty=Heu d'indicar una carpeta on fer l'exportaci\u00f3! export_project_warning_noEmptyFolder=ATENCI\u00d3: La carpeta que heu seleccionat no est\u00e0 buida!\nEl seu contingut actual es sobreescriur\u00e0 durant el proc\u00e9s d'exportaci\u00f3.\n\u00bfSegur que voleu exportar el projecte actual dins d'aquesta carpeta? export_project_err_sameFolder=La carpeta d'exportaci\u00f3 no pot ser la mateixa que la del projecte actual.\Si us plau, indiqueu una altra ubicaci\u00f3. export_project_err_nestedFolders=La carpeta d'exportaci\u00f3 no pot ser un subdirectori de la carpeta del projecte actual.\nSi us plau, indiqueu una altra ubicaci\u00f3. export_project_selectFolder=Selecciona la carpeta export_project_exporting=Exporta el projecte a HTML5... export_project_notice=Per publicar les activitats en HTML5 pugeu aquesta carpeta a un servidor web i obriu el fitxer \"index.html\".\n\nPer previsualitzar les activitats directament des del vostre ordinador feu clic a \"Obre al navegador web\".\n export_project_scorm_notice=Tambe podeu pujar el fitxer "%s" a un EVA com a objecte SCORM (sistema b\u00e0sic d'informes amb una \u00fanica puntuaci\u00f3 per sessi\u00f3) o utilitzar-lo amb el m\u00f2dul de JClic per a Moodle, que us ofereix m\u00e9s opcions i informes detallats. export_project_finished=El projecte s'ha exportat amb \u00e8xit a: export_project_copyLog=Copia els missatges export_project_launchBrowser=Obre al navegador web export_project_numActivities=Activitats exportades: export_project_mediaFiles=Fitxers d'imatge, v\u00eddeo i so: export_project_totalSize=Mida total (bytes): action_exportProject_caption=Exporta a HTML5... action_exportProject_tooltip=Exporta les activitats a HTML5 per poder utilizar-les en qualsevol navegador web action_exportProject_keys = HH js_codebase=Fitxer JavaScript HTML5: js_codebase_tooltip=URL que apunti a un fitxer 'jclic.min.js' v\u00e0lid settings_html = Applet i HTML5 settings_license=Llic\u00e8ncia d'\u00fas: settings_license_tooltip=Escolliu entre les llic\u00e8ncies Creative Commons o 'altres' settings_license_other=Una altra (indiqueu-la a 'Descripci\u00f3') warn_save_scorm_file =El fitxer que esteu editant \u00e9s del tipus "scorm.zip".\nPer desar aquests fitxers cal convertir-los al format est\u00e0ndard "jclic.zip".\nUn cop convertits, les activitats es poden tornar a exportar a HTML5 i ser empaquetades en format SCORM.\n\nVoleu desar el projecte en format "jclic.zip"?src/author/edu/xtec/resources/messages/AuthorMessages_cs.properties000066400000000000000000001410321335566474600262710ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Popis edit_act_name_tooltip=N\u00E1zev aktivity edit_act_name=N\u00E1zev: edit_act_description_tooltip=Popis aktivity edit_act_reports_block=Sestavy edit_act_includeInReports=Zahr\u0148 aktivity v Sestav\u00E1ch edit_act_includeInReports_tooltip=Zahr\u0148 v\u00FDsledky aktivity v u\u017Eivatelsk\u00FDch sestav\u00E1ch edit_act_code=K\u00F3d edit_act_code_tooltip=Voliteln\u00FD k\u00F3d se pou\u017E\u00EDv\u00E1 pro skupiny a vyhled\u00E1v\u00E1n\u00ED v datab\u00E1zi zpr\u00E1v. edit_act_reportActions=Report u\u017Eivatelsk\u00FDch akc\u00ED edit_act_reportActions_tooltip=Zaznamenat detaily o v\u0161ech akc\u00EDch proveden\u00FDch u\u017Eivateli edit_act_counters_block=Po\u010D\u00EDtadla edit_act_timeCounter=Po\u010D\u00EDtadlo \u010Dasu edit_act_timeCounter_tooltip=Skr\u00FDt/zobrazit \u010Dasov\u00E9 po\u010D\u00EDtadlo edit_act_actionsCounter=Po\u010D\u00EDtadlo pokus\u016F edit_act_actionsCounter_tooltip=Skr\u00FDt/zobrazit po\u010D\u00EDtadlo pokus\u016F edit_act_scoreCounter=Po\u010D\u00EDtadlo sk\u00F3re edit_act_scoreCounter_tooltip=Skr\u00FDt/zobrazit po\u010D\u00EDtadlo sk\u00F3re. edit_act_maxTime=Maxim\u00E1ln\u00ED \u010Das: edit_act_maxTime_tooltip=Maxim\u00E1ln\u00ED \u010Das k vy\u0159e\u0161en\u00ED \u010Dinnosti, v sekund\u00E1ch, nebo 0 pro neomezenou dobu. edit_act_countdown=Odpo\u010Det edit_act_countdown_tooltip=\u010C\u00EDta\u010D za\u010D\u00EDn\u00E1 na maxim\u00E1ln\u00ED hodnot\u011B, klesaj\u00EDc\u00ED na 0. edit_act_maxActions=Max pokus\u016F: edit_act_maxActions_tooltip=Povolen maxim\u00E1ln\u00ED po\u010Det pokus\u016F, nebo 0 pro neomezen\u00E9 pokusy. edit_act_buttons_block=Tla\u010D\u00EDtka edit_act_helpBtn=N\u00E1pov\u011Bda edit_act_helpBtn_tooltip=Skr\u00FDt/zobrazit tla\u010D\u00EDtko pomoci edit_act_helpBtn_solution=Zobrazit \u0159e\u0161en\u00ED edit_act_helpBtn_msg=Uk\u00E1zat tuto zpr\u00E1vu: edit_act_infoBtn=Informace edit_act_infoBtn_tooltip=Uka\u017E/Skryj informa\u010Dn\u00ED tla\u010D\u00EDtko edit_act_infoBtn_url=Zobratiz tuto internetovou adresu: edit_act_infoBtn_cmd=Vykonat tento p\u0159\u00EDkaz: edit_act_infoBtn_url_tooltip=Adresu internetov\u00E9 str\u00E1nky zobraz\u00EDte, kdy\u017E kliknete na info tla\u010D\u00EDtko edit_act_infoBtn_cmd_tooltip=P\u0159\u00EDkazov\u00E1 \u0159\u00E1dka bude spu\u0161t\u011Bnana p\u0159i kliknut\u00ED na info tla\u010D\u00EDtko. edit_act_mainWindow=Vlastn\u00ED okno: edit_act_gameWindow=Hern\u00ED okno: edit_act_margin=Okraj: edit_act_margin_tooltip=Horizont\u00E1ln\u00ED a vertik\u00E1ln\u00ED rozestup mezi vizu\u00E1ln\u00EDmi objekty. edit_act_bgColor=Barva pozad\u00ED: edit_act_bgColor_tooltip=Zm\u011Bnit barvu pozad\u00ED. edit_gradient_startColor=Spustit barvu: edit_gradient_endColor=Konec barvy: edit_gradient_startColor_tooltip=V\u00FDb\u011Br po\u010D\u00E1te\u010Dn\u00ED barvy edit_gradient_endColor_tooltip=V\u00FDb\u011Br kone\u010Dn\u00E9 barvy edit_gradient_cycles=Cykly: edit_gradient_cycles_tooltip=Po\u010Det opakov\u00E1n\u00ED p\u0159echodu na barevn\u00E9m povrchu edit_gradient_orientation=Orientace: edit_gradient_orientation_tooltip=Sp\u00E1dov\u00E1 orientace, m\u011B\u0159en\u00E1 ve stupn\u00EDch nad horizont\u00E1lou edit_act_gradient=P\u0159echod: edit_act_gradient_tooltip=Pou\u017Eijte sp\u00E1d barev edit_color_opacity=Pr\u016Fhlednost edit_color_opacity_tooltip=Nastavit hodnotu odst\u00EDnu (kryc\u00ED) barvy. edit_gradient_title=P\u0159echod edit_gradient_default=Pou\u017E\u00EDt v\u00FDchoz\u00ED hodnoty (nulov\u00FD sp\u00E1d) edit_act_image=Obr\u00E1zek: edit_act_descriptionTab=Popiska edit_act_descriptionTab_tooltip=N\u00E1zev a popisek edit_act_tiledBgImg=Dla\u017Edice edit_act_tiledBgImg_tooltip=Vymalovat v\u0161echny plochy obr\u00E1zkem, podle pot\u0159eby opakovat pod\u00E9l osy X a Y. edit_act_preview=N\u00E1hled: edit_act_border=Okraj edit_act_border_tooltip=Nakreslit okrajovou \u010D\u00E1ru kolem okna edit_act_transparent=Pr\u016Fhledn\u00FD edit_act_transparent_tooltip=Okno m\u00E1 pr\u016Fhledn\u00E9 pozad\u00ED edit_act_width=\u0160\u00ED\u0159ka: edit_act_height=V\u00FD\u0161ka: edit_act_width_tooltip=\u0160\u00ED\u0159ka objektu, m\u011B\u0159en\u00E1 v pixelech edit_act_height_tooltip=V\u00FD\u0161ka objektu, m\u011B\u0159en\u00E1 v pixelech edit_act_centered=Ve st\u0159edu edit_act_centered_tooltip=Objekt bude soust\u0159ed\u011Bn v hlavn\u00EDm okn\u011B edit_act_x=X: edit_act_x_tooltip=\u00DApln\u00E1 horizont\u00E1ln\u00ED poloha edit_act_y=Y: edit_act_y_tooltip=\u00DApln\u011B svisl\u00E9 um\u00EDst\u011Bn\u00ED edit_act_ui_block=U\u017Eivatelsk\u00E9 rozhran\u00ED edit_act_image_tooltip=Zvolit obr\u00E1zek edit_act_text=Text: edit_act_text_tooltip=Text mus\u00ED b\u00FDt uveden v tomto objektu edit_font_face=P\u00EDsmo: edit_font_size=Velikost: edit_font_bold=Tu\u010Dn\u011B edit_font_italic=Kurziva edit_font_underline=Podtr\u017Een\u00E9 edit_font_style=Styl: edit_cell_title=Obsah pol\u00ED\u010Dka edit_act_messages=Zpr\u00E1vy edit_act_msg_initial=Po\u010D\u00E1te\u010Dn\u00ED zpr\u00E1va: edit_act_msg_final=Kone\u010Dn\u00E1 zpr\u00E1va: edit_act_msg_prev=P\u0159edchoz\u00ED zpr\u00E1va: edit_act_msg_error=Chybov\u00E1 zpr\u00E1va: edit_act_msg_initial_tooltip=Zpr\u00E1va se zobraz\u00ED p\u0159i za\u010D\u00E1tku aktivity edit_act_msg_final_tooltip=Zpr\u00E1va se zobraz\u00ED p\u0159i dokon\u010Den\u00ED aktivity edit_act_msg_error_tooltip=Zpr\u00E1va se zobraz\u00ED kdy\u017E \u010Dinnost skon\u010D\u00ED s chybami edit_act_msg_prev_tooltip=Zpr\u00E1va zobrazen\u00E1 p\u0159ed spu\u0161t\u011Bn\u00EDm \u010Dinnosti (pouze v ur\u010Dit\u00FDch typech \u010Dinnost\u00ED) edit_align=Zarovnat: edit_act_textColor=Barva textu: edit_act_textColor_tooltip=Barva pou\u017Eit\u00E1 pro vykreslen\u00ED textu edit_act_shadowColor=Barva st\u00EDnu: edit_act_shadowColor_tooltip=Barva pou\u017Eit\u00E1 pro vykreslen\u00ED st\u00EDnu textu, pokud je pou\u017Eit edit_act_shadow=St\u00EDn edit_act_shadow_tooltip=Vykreslen\u00FD text se st\u00EDnem edit_act_borderColor=Barva ohrani\u010Den\u00ED: edit_act_borderColor_tooltip=Barva pou\u017Eit\u00E1 pro vykreslen\u00ED ohrani\u010Den\u00ED bu\u0148ky edit_act_inactiveColor=Barva neaktivn\u00EDho stavu: edit_act_inactiveColor_tooltip=Barva pou\u017Eit\u00E1, kdy\u017E je bu\u0148ka vypnut\u00E1 edit_act_altColor=Alternativn\u00ED barva: edit_act_altColor_tooltip=Barva pou\u017Eit\u00E1 pro vykreslen\u00ED alternativn\u00EDho obsahu v \u0159e\u0161en\u00FDch bu\u0148k\u00E1ch. edit_cell_marked=Ozna\u010Den\u00E1 edit_cell_disabled=Vypnuto edit_cell_alt=Alternativn\u00ED edit_cell_textMargin=Vnit\u0159n\u00ED okraj: edit_cell_textMargin_tooltip=Mno\u017Estv\u00ED prostoru mezi okrajem bu\u0148ky a textem. edit_cell_borderWidth=\u0160\u00ED\u0159ka okraje: edit_cell_borderWidth_tooltip=\u0160\u00ED\u0159ka tahu pou\u017Eit\u00E1 k vykreslen\u00ED standardn\u00EDho okraje edit_cell_markerWidth=\u0160\u00ED\u0159ka zv\u00FDrazn\u011Bn\u00ED: edit_cell_markerWidth_tooltip=\u0160\u00ED\u0159ka tahu pou\u017Eit\u00E1 k vykreslen\u00ED okraje kdy\u017E je bu\u0148ka ozna\u010Dena nebo vybr\u00E1na edit_cell_alt_tooltip=N\u00E1hled v "alternativn\u00EDm" stavu edit_cell_disabled_tooltip=N\u00E1hled ve "vypnut\u00E9m" stavu edit_cell_marked_tooltip=N\u00E1hled v "ozna\u010Den\u00E9m" stavu edit_act_testAction=N\u00E1hled \u010Dinnosti edit_act_testAction_tooltip=N\u00E1hled a test \u010Dinnosti edit_act_panels_description=Popisek edit_act_panels_description_tooltip=N\u00E1zev a popis \u010Dinnosti edit_act_panels_options=Volby edit_act_panels_options_tooltip=Nastaven\u00ED \u010Dinnosti edit_act_panels_frame=Okno edit_act_panels_frame_tooltip=Vzhled, velikost a um\u00EDst\u011Bn\u00ED okna \u010Dinnosti edit_act_panels_messages=Zpr\u00E1vy edit_act_panels_messages_tooltip=Obsah zpr\u00E1v o \u010Dinnosti edit_act_panels_panel=Panel edit_act_panels_panel_tooltip=Obsah panelu edit_style_title=Styl edit_style_tooltip=Nastavit barvu, p\u00EDsmo a velikost bu\u0148ky edit_act_style=Styl: edit_act_overlap=Vyvarovat se textu p\u0159ekr\u00FDvaj\u00EDc\u00ED obr\u00E1zek edit_act_overlap_tooltip=Pokusit se vyvarovat textu p\u0159ekr\u00FDvaj\u00EDc\u00ED obr\u00E1zek edit_media_exists_1=Soubor edit_media_exists_2=ji\u017E existuje v m\u00E9di\u00E1ln\u00ED knihovn\u011B! edit_act_shaper=Formova\u010D: edit_act_shaper_err=Chyba formova\u010De: edit_act_num_cols=Sloupce: edit_act_num_rows=\u0158\u00E1dky: edit_act_toothHeightFactor=V\u00FD\u0161ka zubu: edit_act_toothWidthFactor=\u0160\u00ED\u0159ka zubu: edit_act_toothRandom=N\u00E1hodn\u00E9 rozd\u011Blen\u00ED edit_act_shaper_properties=Vlastnosti formova\u010De edit_act_panels_text=Text edit_act_panels_text_tooltip=Text \u010Dinnosti action_saveFile_caption=Ulo\u017Eit... action_saveFile_keys=SS action_saveFile_tooltip=Ulo\u017Eit aktu\u00E1ln\u00ED projekt action_docTree_caption=Strom dokumentu... action_docTree_keys=T* action_docTree_tooltip=Zobrazit dokument projektu jako strom edit_docTree_title=Strom dokumentu edit_media_referencedBy=Odkazov\u00E1no od: msg_prompt_loadReferences=Varov\u00E1n\u00ED:

Tentorojekt je propojen s jin\u00FDmi projekty.
Chcete si odkazy prohl\u00E9dnout a na\u010D\u00EDst v\u0161echny souvisej\u00EDc\u00ED soubory?

(P\u0159i importu \u010Dinnost\u00ED Clic 3.0 je doporu\u010Deno odpov\u011Bd\u011Bt ANO) edit_mc_type=Typ: edit_mc_type_unknown=Nezn\u00E1m\u00FD edit_mc_type_sound=P\u0159ehr\u00E1t zvuk edit_mc_type_video=P\u0159ehr\u00E1t video edit_mc_type_midi=P\u0159ehr\u00E1t MIDI edit_mc_type_cdaudio=P\u0159ehr\u00E1t zvukov\u00E9 CD edit_mc_type_record=Zaznamenat zvuk edit_mc_type_play_recorded=P\u0159ehr\u00E1t nahran\u00FD zvuk edit_mc_type_run_activity=J\u00EDt na aktivitu edit_mc_type_run_sequence=J\u00EDt na sekvenci edit_mc_type_run_external=Spustit program edit_mc_type_url=Zobrazit URL edit_mc_type_exit=Konec edit_mc_type_return=Zp\u011Bt edit_mc_level=\u00DArove\u0148 priority: edit_mc_file=Soubor: edit_mc_externalParam=Parametry: edit_mc_from=Z: edit_mc_to=Do: edit_mc_length=Max. d\u00E9lka: edit_mc_recBuffer=Nahr\u00E1vac\u00ED p\u00E1ska: edit_mc_stretch=Velikost rozta\u017Een\u00ED edit_mc_location=Um\u00EDst\u011Bn\u00ED: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Z: edit_mc_location_from_box=Bu\u0148ka edit_mc_location_from_window=Okno edit_mc_location_from_frame=Okno edit_mc_loop=P\u0159ehr\u00E1v\u00E1n\u00ED smy\u010Dky edit_mc_autostart=Automatick\u00FD start edit_mc_catchmouse=Chytit my\u0161 edit_mc_title=Multim\u00E9dia a aktivn\u00ED obsah edit_mc_label=Aktivn\u00ED obsah: edit_media_dlg_title=V\u00FDb\u011Br multimedi\u00E1ln\u00EDho objektu edit_media_title=Knihovna m\u00E9di\u00ED edit_mc_pos_cell=Vyst\u0159ed\u011Bno nad bu\u0148kou edit_mc_pos_window=Vyst\u0159ed\u011Bno nad oknem edit_mc_pos_absolute=Ur\u010Dete pozici: edit_tree_badFormat=Nespr\u00E1vn\u00E1 struktura stromu nebo data! edit_act_panels_controls=Ovl\u00E1d\u00E1n\u00ED edit_act_panels_controls_tooltip=Mo\u017Enosti pro tla\u010D\u00EDtka a po\u010D\u00EDtadla edit_act_class=Typ: edit_act_gridLayout=Rozvr\u017Een\u00ED m\u0159\u00ED\u017Eky: edit_act_gridLayout_tooltip=Vz\u00E1jemn\u00E1 poloha panel\u016F A a B edit_act_inverseResolution=Obr\u00E1cen\u00E9 rozli\u0161en\u00ED edit_act_inverseResolution_tooltip=\u010Cinnost je vy\u0159e\u0161ena, kdy\u017E v\u0161echny p\u0159id\u011Blen\u00E9 prvky z "B" se shoduj\u00ED. edit_act_showAllArrows=Zobrazit v\u0161echny \u0161ipky edit_act_alt=Alternativn\u00ED obsah: edit_act_alt_tooltip=Obsah zobrazen\u00FD ve vy\u0159e\u0161en\u00FDch bu\u0148k\u00E1ch a nep\u0159id\u011Blen\u00FDch bu\u0148k\u00E1ch. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Upravit alternativn\u00ED obsah edit_act_grid=M\u0159\u00ED\u017Eka edit_act_grid_A=M\u0159\u00ED\u017Eka A edit_act_grid_B=M\u0159\u00ED\u017Eka B edit_act_grid_layout=Rozvr\u017Een\u00ED edit_act_grid_relationship=Vztah edit_seq_activity_header=aktivita edit_seq_tag_header=zna\u010Dka edit_seq_jump_header=p\u0159esko\u010Dit na edit_seq_activity=Aktivita: edit_seq_tag=Popisek: edit_seq_description=Popis: edit_seq_auto=Posunout automaticky edit_seq_delay=Prodleva: edit_seq_action_fwd=Dal\u0161\u00ED edit_seq_action_back=J\u00EDt zp\u011Bt edit_seq_action_jump=P\u0159esko\u010Dit na... edit_seq_action_stop=Zastavit edit_seq_action_return=Vr\u00E1tit edit_seq_action_exit=Ukon\u010Dit JClic edit_seq_arrow_fwd=\u0160ipka dop\u0159edu: edit_seq_arrow_back=\u0160ipka dozadu: edit_seq_action=Akce: edit_seq_button_enabled=Zobrazit tla\u010D\u00EDtko edit_seq_project=JClic projekt: edit_act_absolute=Absolutn\u00ED pozice edit_act_absolute_tooltip=Objekt bude um\u00EDst\u011Bn v zadan\u00FDch sou\u0159adnic\u00EDch X a Y edit_act_location=Um\u00EDst\u011Bn\u00ED: edit_seq_newElement=Nov\u00FD prvek sekvence... edit_seq_newElement_tooltip=Vlo\u017Eit nov\u00FD prvek do sekvence \u010Dinnosti edit_seq_newElement_msg=Vyberte, pros\u00EDm, aktivitu pro nov\u00FD prvek sekvence. edit_seq_newElement_error_noAct=Nelze vytvo\u0159it nov\u00FD prvek sekvence bez \u010Dinnosti! edit_seq_newElement_error_emptyList=Tento projekt nem\u00E1 \u017E\u00E1dn\u00E9 \u010Dinnosti! Nelze vytvo\u0159it prvky sekvence bez pr\u00E1zdn\u00E9ho objektu. edit_seq_jump_msg=C\u00EDl skoku: edit_seq_jump_title=C\u00EDl skoku edit_act_newActivity_tooltip=P\u0159idat novou \u010Dinnost do projektu edit_act_prompt_class=Typ \u010Dinnosti: edit_act_prompt_name=N\u00E1zev: edit_act_newActivity_msg=Vyberte, pros\u00EDm, typ \u010Dinnosti pro vytvo\u0159en\u00ED a zadejte jej\u00ED n\u00E1zev: edit_act_newActivity_error_noAct=Mus\u00EDte zvolit typ \u010Dinnosti! edit_act_newActivity_error_noName=Mus\u00EDte zadat n\u00E1zev pro \u010Dinnosti! edit_act_newActivity_error_creating=Nelze vytvo\u0159it akivitu! edit_act_newActivity_class=Jm\u00E9no t\u0159\u00EDdy Java: edit_text_act_format=Form\u00E1t edit_text_act_answer=Odpov\u011B\u010F edit_text_act_popup=Vysko\u010Dit edit_text_act_answer_label=Platn\u00E9 odpov\u011Bdi edit_list_newElement_tooltip=P\u0159idat nov\u00FD prvek seznamu edit_list_editElement_tooltip=Upravit vybran\u00FD prvek seznamu edit_list_deleteElement_tooltip=Smazat vybran\u00FD prvek seznamu edit_list_upBtn_tooltip=P\u0159esunout nahoru edit_list_downBtn_tooltip=P\u0159esunout dol\u016F edit_list_newValue=Nov\u00FD text: edit_list_addElement=P\u0159idat nov\u00FD prvek seznamu edit_list_modifyValue=Zm\u011Bnit vybran\u00FD text edit_text_act_target=C\u00EDl edit_text_act_maxLen=Max. d\u00E9lka: edit_text_act_maxLen_tooltip=Maxim\u00E1ln\u00ED po\u010Det znak\u016F v odpov\u011Bdi edit_text_act_fillingChar=Vypl\u0148uj\u00EDc\u00ED znak edit_text_act_fillingChar_tooltip=Znak pou\u017Eit\u00FD k ur\u010Den\u00ED mezery edit_text_act_iniLen=Po\u010D\u00E1te\u010Dn\u00ED d\u00E9lka: edit_text_act_iniLen_tooltip=Po\u010Det vypl\u0148uj\u00EDc\u00EDch znak\u016F, kter\u00E9 budou zobrazeny na za\u010D\u00E1tku \u010Dinnosti. edit_text_act_iniText=Po\u010D\u00E1te\u010Dn\u00ED text: edit_text_act_iniText_tooltip=Text zobrazen\u00FD v meze\u0159e na za\u010D\u00E1tku \u010Dinnosti. edit_text_act_list=Zobrazit seznam mo\u017Enost\u00ED: edit_text_act_list_tooltip=Zobrazit seznam mo\u017Enost\u00ED, z nich\u017E u\u017Eivatel mus\u00ED jednu vybrat. edit_text_act_check_title=Mo\u017Enosti opravy edit_text_act_popup_no=\u017D\u00E1dn\u00E9 vyskakov\u00E1n\u00ED edit_text_act_popup_always=Vysko\u010Dit automaticky edit_text_act_popup_onError=Vysko\u010Dit p\u0159i chyb\u00E1ch edit_text_act_popup_onDemand=Vysko\u010Dit pomoc\u00ED F1 edit_text_act_popup_type=Typ: edit_text_act_popup_delay=Zpo\u017Ed\u011Bn\u00ED vysko\u010Den\u00ED: edit_text_act_popup_maxTime=Max. \u010Das: edit_text_act_popup_onlyPlay=Pouze zvuk edit_text_act_err_noSelection=Mus\u00EDte zvolit \u010D\u00E1st textu, abyste vytvo\u0159ili nov\u00FD c\u00EDlov\u00FD text! edit_text_act_err_badCharInSelection=C\u00EDlov\u00FD text nem\u016F\u017Ee obsahovat odstavec ani z\u00E1lo\u017Eky edit_text_act_err_nestedTargets=C\u00EDle nemohou b\u00FDt vno\u0159en\u00E9! edit_text_act_err_cellInTarget=C\u00EDle nemohou obsahovat bu\u0148ky edit_text_act_pageBgColor=Barva pap\u00EDru: edit_text_act_editStylesBtn=Upravit styly dokumentu... edit_text_act_mainStyle=Hlavn\u00ED styl: edit_text_act_tabSpc=Mezera z\u00E1lo\u017Eky: edit_text_act_tabSize=Mezery mezi zna\u010Dkami z\u00E1lo\u017Eek: edit_text_act_colors=Barvy: edit_text_act_targetStyle=C\u00EDlov\u00E9 barvy: edit_text_act_errorStyle=Chybov\u00E9 barvy: edit_text_act_preview=N\u00E1hled: edit_text_act_styleSample_default_start=Standardn\u00ED text edit_text_act_styleSample_target=c\u00EDl edit_text_act_styleSample_error=chyba edit_text_act_styleSample_default_fill=standardn\u00ED text edit_text_act_styleSample_default_end=standardn\u00ED text. edit_text_act_warnDeleteTarget=Varov\u00E1n\u00ED: Tato \u010Dinnost potla\u010D\u00ED sou\u010Dasn\u00FD zvolen\u00FD c\u00EDl. Chcete pokra\u010Dovat? edit_text_act_prevScreen_title=P\u0159edchoz\u00ED obrazovka... edit_text_act_prevScreen_no=Nezobrazovat \u017E\u00E1dn\u00FD text p\u0159ed za\u010D\u00E1tkem \u010Dinnosti edit_text_act_prevScreen_original=Zobrazit dokon\u010Den\u00FD text cvi\u010Den\u00ED edit_text_act_prevScreen_special=Zobrazit tento text: edit_text_act_prevScreen_time=Max. \u010Das: edit_text_act_edit_target=C\u00EDl... edit_text_act_checkButton_show=Zobrazit tla\u010D\u00EDtko opravy edit_text_act_checkButtonText=Text tla\u010D\u00EDtka: edit_text_act_checkCase=Shoda s velikost\u00ED p\u00EDsmen edit_text_act_checkAccents=Zva\u017Eovat znam\u00E9nka a zvl\u00E1\u0161tn\u00ED znaky edit_text_act_checkPunct=Zva\u017Eovat interpunk\u010Dn\u00ED znam\u00E9nka edit_text_act_checkDoubleSpc=Povolit opakovan\u00E9 mezery edit_text_act_checkOptions=Krit\u00E9ria edit_text_act_checkAutoJump=P\u0159esunout na dak\u0161\u00ED c\u00EDl p\u0159i vypln\u011Bn\u00ED edit_text_act_checkForceOk=P\u0159esunout se pouze po spr\u00E1vn\u00E9m odhadu edit_text_act_checkDetail=Uk\u00E1zat chyby p\u00EDsmeno po p\u00EDsmen\u011B edit_text_act_checkDetail_params=Parametry algoritmu anal\u00FDzy: edit_text_act_checkDetail_steps=Kroky: edit_text_act_checkDetail_field=Pole pr\u016Fzkumu: edit_text_act_defaultCheckButtonText=Zkontrolovat edit_text_act_advancedCorrectionOptions=Anal\u00FDza odpov\u011Bdi edit_text_act_check_bt=Oprava... edit_text_act_checkButton=Tla\u010D\u00EDtko opravy edit_text_act_checkProgress=Postup edit_text_act_typeBtn=Typ... edit_text_act_orderParagraphs=Se\u0159adit odstavce edit_text_act_orderWords=Se\u0159adit slova edit_text_act_order_amongstPar=Zam\u00EDchat slova mezi paragrafy edit_text_act_type_title=Typ \u010Dinnosti edit_text_act_warnChangeType=Tato \u010Dinnost sma\u017Ee v\u0161echny existuj\u00EDc\u00ED c\u00EDle. Chcete pokra\u010Dovat? edit_text_act_identWords=Rozpoznat slova edit_text_act_identChars=Rozpoznat znaky edit_media_change_name=Zm\u011Bnit n\u00E1zev... edit_media_change_file=Um\u011Bnit soubor... edit_media_includeInZip=Ulo\u017Eit do souboru ZIP edit_media_type=Typ m\u00E9dia: edit_media_size=Velikost souboru: edit_media_show_type=Soubory typu: edit_media_preview=N\u00E1hled m\u00E9dia edit_media_preview_tooltip=N\u00E1hled zdroje m\u00E9dia edit_media_rename=Zm\u011Bnit n\u00E1zev zdroje edit_media_rename_title=P\u0159ejmenovat edit_media_rename_prompt=Nov\u00E9 jm\u00E9no: edit_media_rename_invalid=Neplatn\u00FD n\u00E1zev zdroje! edit_media_rename_exists=Zdroj s t\u00EDmto jm\u00E9nem ji\u017E existuje! Ka\u017Ed\u00FD zdroj mus\u00ED m\u00EDt jedine\u010Dn\u00E9 jm\u00E9no. edit_media_chfile_invalid=Neplatn\u00FD soubor! err_media_chfile_different=Soubor mus\u00ED b\u00FDt stejn\u00E9ho typu edit_media_font_error=Nelze na\u010D\u00EDst p\u00EDsmo! edit_media_save_file=Ulo\u017Eit soubor (extrahovat ze ZIP) edit_media_refresh_file=Aktualizovat obsah m\u00E9dia ze souboru edit_media_warn_zipFileNotExternal=Toto nen\u00ED "skute\u010Dn\u00FD" soubor, ale objekt um\u00EDst\u011Bn\u00FD v kontejneru ZIP. Abyste tuto funkci mohli pou\u017E\u00EDt, mus\u00ED b\u00FDt ve slo\u017Ece, kde se nach\u00E1z\u00ED soubor ZIP, um\u00EDst\u011Bn soubor se stejn\u00FDm n\u00E1zvem. edit_activities=\u010Cinnosti edit_sequences=Sledy edit_media=Knihovna m\u00E9di\u00ED edit_media_tooltip=Spravovat obr\u00E1zky a soubory jin\u00FDch m\u00E9di\u00ED pou\u017Eit\u00FDch v projektu edit_activities_tooltip=Vytvo\u0159it a upravit \u010Dinnosti projektu edit_sequences_tooltip=Upravit a vytvo\u0159it sled \u010Dinnost\u00ED edit_project_title=N\u00E1zev: edit_project_title_tooltip=N\u00E1zev projektu edit_project=Projekt edit_project_tooltip=Upravit vlastnosti projektu edit_project_description=Popis: edit_project_description_tooltip=Celkov\u00FD popis projektu edit_project_area=Oblasti: edit_project_area_tooltip=Oblasti u\u010Diva projektu edit_project_level=\u00DArovn\u011B: edit_project_level_tooltip=Vzd\u011Bl\u00E1vac\u00ED \u00FArovn\u011B projektu edit_project_descriptors=Popisova\u010De: edit_project_descriptors_tooltip=Popisova\u010De projektu (odd\u011Blen\u00E9 \u010D\u00E1rkou) edit_project_languages=Jazyky: edit_project_languages_tooltip=Jazyky pou\u017Eit\u00E9 v projektu edit_project_languages_modify=Zm\u011Bnit vybran\u00FD jazyk edit_project_languages_add=P\u0159idat jazyk edit_project_languages_select=K\u00F3dy jazyk\u016F ISO-639: edit_project_authors=Auto\u0159i: edit_project_authors_tooltip=Lid\u00E9 zapojen\u00ED do vytv\u00E1\u0159en\u00ED tohoto projektu edit_project_author_name=Jm\u00E9no: edit_project_author_mail=e-mail: edit_project_author_rol=Role: edit_project_author_organization=Organizace: edit_project_author_comments=Koment\u00E1\u0159e: edit_project_author_url=URL: edit_project_author_name_tooltip=Jm\u00E9no autora (povinn\u00E9) edit_project_author_mail_tooltip=E-mail autora (nepovinn\u00E9) edit_project_author_rol_tooltip=Role osoby v projektu: autor, spolupracovn\u00EDk, kresby, zvuky... (nepovinn\u00E9) edit_project_author_organization_tooltip=\u0160kola, univerzita, asociace... (nepovinn\u00E9) edit_project_author_url_tooltip=Osobn\u00ED internetov\u00E1 str\u00E1nka (nepovinn\u00E9) edit_project_author_comments_tooltip=Pole pro dal\u0161\u00ED informace (nepovinn\u00E9) edit_project_author_info=Informace o autorovi: edit_project_author_add=P\u0159idat autora do seznamu edit_project_author_edit=Upravit informace o autorovi edit_project_org_name=Jm\u00E9no: edit_project_org_name_tooltip=Jm\u00E9no \u0161koly edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=e-mailov\u00E1 adresa \u0161koly edit_project_org_url=URL: edit_project_org_url_tooltip=Internetov\u00E1 str\u00E1nka \u0161koly edit_project_org_address=Adresa: edit_project_org_address_tooltip=Po\u0161tovn\u00ED adresa edit_project_org_pc=PC: edit_project_org_pc_tooltip=PS\u010C edit_project_org_city=M\u011Bsto: edit_project_org_city_tooltip=M\u011Bsto \u0161koly edit_project_org_country=Zem\u011B: edit_project_org_state=St\u00E1t: edit_project_org_comments=Koment\u00E1\u0159e: edit_project_org=\u0160kola/y: edit_project_org_tooltip=\u0160kola nebo jin\u00E1 instituce zapojen\u00E1 do tohoto projektu edit_project_org_info=Informao organizaci: edit_project_org_add=P\u0159idat organizaci edit_project_org_edit=Upravit data organizace edit_project_org_country_tooltip=Zem\u011B, federace, sdru\u017Een\u00ED... edit_project_org_state_tooltip=Feder\u00E1ln\u00ED st\u00E1t, komunita, kraj... edit_project_org_comments_tooltip=Jin\u00E9 informace... edit_project_rev_date=Datum: edit_project_rev_date_tooltip=Datum revize edit_project_rev_authors=Auto\u0159i: edit_project_rev_authors_tooltip=Auto\u0159i revize edit_project_rev_description=Popis: edit_project_rev_description_tooltip=Kr\u00E1tk\u00FD popis proveden\u00FDch zm\u011Bn edit_project_rev_comments=Koment\u00E1\u0159e: edit_project_rev_comments_tooltip=Jin\u00E9 d\u016Fle\u017Eit\u00E9 informace edit_project_rev=Revize: edit_project_rev_tooltip=Historie hlavn\u00EDch zm\u011Bn proveden\u00FDch v projektu edit_project_rev_add=P\u0159idat z\u00E1znam revize edit_project_rev_edit=Upravit z\u00E1znam revize edit_project_rev_info=Data revize edit_media_objects=objekty edit_media_object=objekt edit_evsounds_start=Za\u010D\u00E1tek \u010Dinnosti: edit_evsounds_click=Kliknut\u00ED na objekt: edit_evsounds_actionError=Chybn\u00E1 \u010Dinnost: edit_evsounds_actionOk=Spr\u00E1vna \u010Dinnost: edit_evsounds_finishedError=\u010Cinnost dokon\u010Dena s chybami: edit_evsounds_finishedOk=\u010Cinnost dokon\u010Dena v po\u0159\u00E1dku: edit_project_rev_err_nodesc=Chyba: Popisn\u00E9 pole nemohou b\u00FDt zanech\u00E1na pr\u00E1zdn\u00E1! edit_evsounds_dlg_title=Upravit zvuky ud\u00E1lost\u00ED edit_project_evsounds=Zvuky ud\u00E1lost\u00ED: edit_project_evsounds_tooltip=Nastavit ur\u010Dit\u00E9 zvuky pro ka\u017Edou ud\u00E1lost JClic edit_act_evsounds=Zvuky ud\u00E1lost\u00ED: edit_act_evsounds_tooltip=Nastavit ur\u010Dit\u00E9 zvuky pro ka\u017Edou ud\u00E1lost JClic edit_evsounds_default=v\u00FDchoz\u00ED zvuk edit_evsounds_disabled=zak\u00E1z\u00E1no edit_evsounds_chk_tooltip=Povolit nebo zak\u00E1zat zvuk pro tuto ud\u00E1lost edit_evsounds_select_tooltip=Klikn\u011Bte pro vybr\u00E1n\u00ED zvuku pro tuto ud\u00E1lost, nebo od\u0161krtn\u011Bte pro pou\u017Eit\u00ED v\u00FDchoz\u00EDho zvuku action_newProject_caption=Nov\u00FD projekt... action_newProject_keys=NN action_newProject_tooltip=Vytvo\u0159it nov\u00FD projekt JClic edit_arith_op_from=Od: edit_arith_op_from_tooltip=Minim\u00E1ln\u00ED hodnota oper\u00E1toru edit_arith_op_to=Do: edit_arith_op_to_tooltip=Maxim\u00E1ln\u00ED hodnota oper\u00E1toru edit_arith_op_with=S: edit_arith_op_with_tooltip=Pokud je za\u0161krtnuto, oper\u00E1tor m\u016F\u017Ee tak\u00E9 m\u00ED tuto hodnotu edit_arith_op_fromList=Jeden ze seznamu: edit_arith_op_fromList_tooltip=Seznam mo\u017En\u00FDch hodnot pro oper\u00E1tora edit_arith_op_decimals=Desetinn\u00E1 \u010D\u00EDsla: edit_arith_op_decimals_tooltip=Po\u010Det desetinn\u00FDch \u010D\u00EDsel operandu edit_arith_op_dec0=# (cel\u00E9 \u010D\u00EDslo) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=Prvn\u00ED operand edit_arith_secondOp=Druh\u00FD operand edit_arith_title=Arith2 pro JClic edit_arith_operations=Operace: edit_arith_operations_tooltip=Vyberte druh operac\u00ED k proveden\u00ED edit_arith_operations_plus=Plus edit_arith_operations_minus=M\u00EDnus edit_arith_operations_multiply=N\u00E1sobit edit_arith_operations_divide=D\u011Blit edit_arith_unknown=Nezn\u00E1m\u00E1: edit_arith_unknown_tooltip=Vyberte polo\u017Eku, kter\u00E1 se bude chovat jako nezn\u00E1m\u00E1 edit_arith_unknown_aobx=V\u00FDsledek je nezn\u00E1m\u00FD edit_arith_unknown_aoxr=Druh\u00FD oper\u00E1tor je nezn\u00E1m\u00E1 edit_arith_unknown_xobr=Prvn\u00ED oper\u00E1tor je nezn\u00E1m\u00E1 edit_arith_unknown_axbr=Oper\u00E1tor je nezn\u00E1m\u00E1 edit_arith_unknown_invert=Napsat v\u00FDsledek na za\u010D\u00E1tku v\u00FDrazu edit_arith_result=V\u00FDsledek: edit_arith_result_notCarry=Nep\u0159en\u00E1\u0161et edit_arith_result_random=N\u00E1hodn\u00E9 edit_arith_result_asc=Vzestupn\u011B edit_arith_result_order=Se\u0159adit podle v\u00FDsledku: edit_arith_result_desc=Sestupn\u011B edit_arith_result_avoidDup=Zamezit duplik\u00E1t\u016Fm edit_arith_cond=Podm\u00EDnky: edit_arith_cond_ind=Neutr\u00E1ln\u00ED edit_arith_cond_agb=Prvn\u00ED oper\u00E1tor mus\u00ED b\u00FDt v\u011Bt\u0161\u00ED ne\u017E druh\u00FD edit_arith_cond_alb=Prvn\u00ED oper\u00E1tor mus\u00ED b\u00FDt men\u0161\u00ED ne\u017E druh\u00FD edit_arith_cond_tooltip=Jin\u00E9 podm\u00EDnky edit_autocp=Automatick\u00FD gener\u00E1tor obsahu: edit_autocp_tooltip=Vyberte typ automatick\u00E9ho gener\u00E1toru obsahu pro tuto \u010Dinnost. edit_autocp_block=Gener\u00E1tor obsahu edit_autocp_btn=Nastaven\u00ED... edit_autocp_btn_tooltip=Nastaven\u00ED poskytovatele obsahu edit_data=Upravit data edit_act=\u00DAprava \u010Dinnosti edit_acp=\u00DAprava poskytovatele obsahu edit_acp_err_creating=Chyba p\u0159i vytv\u00E1\u0159en\u00ED poskytovatele obsahu! edit_project_author_group=Tvorba edit_project_description_block=Popis edit_project_ui_block=U\u017Eivatelsk\u00E9 rozhran\u00ED edit_act_description=Popis: m_Edit=Upravit m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=Nov\u00E1 \u010Dinnost... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Vlo\u017Eit m_Insert_Mnemonic=I m_View=Zobrazit m_View_Mnemonic=V action_editProject_caption=Projekt action_editProject_keys=PP action_editProject_tooltip=Upravit nastaven\u00ED projektu action_editMedia_caption=M\u00E9dia action_editMedia_keys=MM action_editMedia_tooltip=Upravit knihovnu multim\u00E9di\u00ED projektu action_editActivities_caption=\u010Cinnosti action_editActivities_keys=AA action_editActivities_tooltip=Upravit \u010Dinnosti action_editSeq_caption=Sledy action_editSeq_keys=SS action_editSeq_tooltip=Upravit sledy \u010Dinnost\u00ED warn_project_modified=Sou\u010Dasn\u00FD projekt byl zm\u011Bn\u011Bn. Chcete zm\u011Bny ulo\u017Eit? edit_project_descriptors_block=Popisova\u010De edit_media_new=Nov\u00FD medi\u00E1ln\u00ED objekt... edit_media_new_tooltip=P\u0159idat nov\u00FD obr\u00E1zek nebo multimedi\u00E1ln\u00ED objekt do knihovny edit_media_new_keys=M* edit_seq_threshold=Hranice sk\u00F3re: edit_seq_threshold_tooltip_up=J\u00EDt touto cestou, pokud je glob\u00E1ln\u00ED sk\u00F3re rovno nebo v\u011Bt\u0161\u00ED ne\u017E... edit_seq_time=\u010Casov\u00E1 hranice: edit_seq_time_tooltip_up=Aby se \u0161lo touto cestou, str\u00E1ven\u00FD \u010Das na \u010Dinnostech mus\u00ED b\u00FDt men\u0161\u00ED ne\u017E... edit_seq_threshold_tooltip_down=J\u00EDt touto cestou, pokud je glob\u00E1ln\u00ED sk\u00F3re men\u0161\u00ED ne\u017E... edit_seq_time_tooltip_down=J\u00EDt touto cestou, kdy\u017E je \u010Das str\u00E1ven\u00FD na \u010Dinnostech v\u011Bt\u0161\u00ED ne\u017E... edit_seq_condJump=Podm\u00EDn\u011Bn\u00E9 skoky edit_seq_condJump_tooltip=Nastavit zvl\u00E1\u0161tn\u00ED skoky, kter\u00E9 budou provedeny pouze za ur\u010Dit\u00FDch podm\u00EDnek edit_seq_condJump_upper_tooltip=Nastavit podm\u00EDnky pro skok na vy\u0161\u0161\u00ED \u00FArove\u0148 edit_seq_condJump_lower=Skok n\u00ED\u017Ee: edit_seq_condJump_upper=Skok v\u00FD\u0161e: edit_seq_condJump_lower_tooltip=Nastavit podm\u00EDnky pro skok na ni\u017E\u0161\u00ED \u00FArove\u0148 edit_seq_action_tooltip_fw=P\u0159id\u011Blen\u00E1 \u010Dinnost pro tla\u010D\u00EDtko "dal\u0161\u00ED" edit_seq_action_tooltip_bk=P\u0159id\u011Blen\u00E1 \u010Dinnost pro tla\u010D\u00EDtko "p\u0159edchoz\u00ED" edit_seq_jump_tooltip=Nastavit c\u00EDl skoku edit_seq_action_tooltip=\u010Cinnosti, kter\u00E9 budou provedeny edit_seq_activity_tooltip=P\u0159id\u011Blen\u00E1 \u010Dinnost pro tento prvek sekvence edit_seq_tag_tooltip=Zna\u010Dka pou\u017Eit\u00E1 pro odkaz na tento prvek sekvence (nepovinn\u00E9 pole) edit_seq_description_tooltip=Popis prvku sekvence (nepovinn\u00E9 pole) edit_seq_button_enabled_tooltip=Povolit nebo zak\u00E1zat tla\u010D\u00EDtko \u0161ipky edit_seq_auto_tooltip=P\u0159i dokon\u010Den\u00ED \u010Dinnosti automaticky pokra\u010Dovat edit_seq_delay_tooltip=Koli kvte\u0159in po\u010Dkat, p\u0159ed automatick\u00FDm pokra\u010Dov\u00E1n\u00EDm edit_color_dlgTitle=Vyberte barvu edit_media_renaming=Po\u010Dkejte pros\u00EDm, ne\u017E bude zdroj p\u0159ejmenov\u00E1n... edit_act_cell_width=\u0160\u00ED\u0159ka: edit_act_cell_width_tooltip=\u0160\u00ED\u0159ka bu\u0148ky (v pixelech) edit_act_cell_height=V\u00FD\u0161ka: edit_act_cell_height_tooltip=V\u00FD\u0161ka bu\u0148ky (v pixelech) edit_act_hiddenWords=Skryt\u00E1 slova: edit_act_hiddenWords_tooltip=Seznam skryt\u00FDch slov um\u00EDst\u011Bn\u00FDch v panelu edit_act_wordSearch_panelB=Pou\u017E\u00EDt panel B edit_act_wordSearch_panelB_tooltip=Obsah druh\u00E9ho panelu bude zobrazov\u00E1n jak budou slova nach\u00E1zena edit_act_shaper_tooltip=Vyberte typ tvarova\u010De, kter\u00FD bude v panelu pou\u017Eit edit_act_num_cols_tooltip=Po\u010Det sloupc\u016F v panelu edit_act_num_rows_tooltip=Po\u010Det \u0159\u00E1dk\u016F v panelu edit_act_wildTransparent=Pr\u016Fhledn\u00E9 odd\u011Blova\u010De edit_act_wildTransparent_tooltip=Chovat se k odd\u011Blova\u010D\u016Fm (\u010Dern\u00FDm r\u00E1me\u010Dk\u016Fm) jako k pr\u016Fhledn\u00FDm d\u00EDr\u00E1m edit_act_behavior_scramble_times=M\u00EDch\u00E1: edit_act_behavior_scramble_times_tooltip=Kolikr\u00E1t zam\u00EDchat edit_act_copy_title=Kop\u00EDrovat vlastnosti do... edit_act_copy_attributes=Vlastnosti edit_act_copy_dest=Pou\u017E\u00EDt na: edit_act_copy_style_main=Hlavn\u00ED okno edit_act_copy_style_play=Okno hry edit_act_copy_activities=\u010Cinnosti ke zm\u011Bn\u011B: edit_act_copyAttributes=Kop\u00EDrovat vlastnosti edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Kop\u00EDrovat vlastnosti sou\u010Dasn\u00E9 \u010Dinnosti do jin\u00FDch \u010Dinnost\u00ED edit_new_project_name=N\u00E1zev projektu: edit_new_project_name_tooltip=Kr\u00E1tk\u00FD, popisn\u00FD n\u00E1zev projektu edit_new_project_filename=N\u00E1zev souboru: edit_new_project_filename_tooltip=N\u00E1zev souboru projektu, bez p\u0159\u00EDpony edit_new_project_folder=Slo\u017Eka: edit_new_project_folder_tooltip=N\u00E1zev slo\u017Eky, kde bude projekt ulo\u017Een edit_new_project_folder_browse=Proch\u00E1zet\u2026 edit_new_project_title=Vytvo\u0159it nov\u00FD projekt JClic edit_new_project_err_empty=Chyba: Projekt, soubor a slo\u017Eka mus\u00ED m\u00EDt platn\u00E9, nepr\u00E1zdn\u00E9 n\u00E1zvy. edit_new_project_warning_noEmptyFolder=Tato slo\u017Eka ji\u017E obsahuje jin\u00FD projekt Clic 3.0 nebo JClic. Aby se zabr\u00E1nilo zmatk\u016Fm, je doporu\u010Deno, aby byl ka\u017Ed\u00FD projekt udr\u017Eov\u00E1n v samostatn\u00E9 slo\u017Ece, ale nen\u00ED to pevn\u00E9 pravidlo. Opravdu chcete nov\u00FD projekt vytvo\u0159it v t\u00E9to slo\u017Ece? edit_new_project_err_folderCreation=Chyba: Nelze vytvo\u0159it ur\u010Denou slo\u017Eku! edit_act_copy_err_noSelection=Chyba: Nebyla vybr\u00E1na \u017E\u00E1dn\u00E1 \u010Dinnost! Abyste mohli tuto funkci pou\u017E\u00EDt, mus\u00EDte vybrat ze seznamu \u010Dinnosti \u010Di \u010Dinnost\u00ED v kter\u00FDch budou ur\u010Den\u00E9 vlastnosti pou\u017Eity. edit_act_copy_action_prefix=Kop\u00EDruji vlastnosti do: edit_act_copy_margin=Okraj edit_act_copy_bgColor=Barva pozad\u00ED edit_act_copy_gradient=P\u0159echod edit_act_copy_bgImage=Obr\u00E1zek pozad\u00ED edit_act_copy_border=Ohrani\u010Den\u00ED edit_act_copy_transparentBg=Pr\u016Fhledn\u00E9 pozad\u00ED edit_act_copy_position=Pozice edit_act_copy_messages=Zpr\u00E1vy edit_act_copy_messages_ini=Styl \u00FAvodn\u00ED zpr\u00E1vy edit_act_copy_messages_end=Styl kone\u010Dn\u00E9 zpr\u00E1vy edit_act_copy_messages_err=Styl chybov\u00E9 zpr\u00E1vy edit_act_copy_reports=Hl\u00E1\u0161en\u00ED edit_act_copy_rep_include=Zahrnout \u010Dinnost v z\u00E1znamech edit_act_copy_rep_actions=Zaznamenat \u010Dinnosti edit_act_copy_interface=U\u017Eivatelsk\u00E9 rozhran\u00ED edit_act_copy_skin=Vzhled edit_act_copy_evSounds=Zvuky ud\u00E1lost\u00ED edit_act_copy_counters=Po\u010D\u00EDtadla edit_act_copy_cTime=Po\u010D\u00EDtadlo \u010Dasu edit_act_copy_maxTime=Max. \u010Das edit_act_copy_cTries=Po\u010D\u00EDtadlo pokus\u016F edit_act_copy_maxTries=Max. pokus\u016F edit_act_copy_cScore=Po\u010D\u00EDtadlo sk\u00F3re edit_act_copy_scramble=Kolikr\u00E1t zam\u00EDchat edit_act_copy_buttons=Tla\u010D\u00EDtka edit_act_copy_btnHelp=Tla\u010D\u00EDtko n\u00E1pov\u011Bdy edit_act_copy_btnInfo=Tla\u010D\u00EDtko informac\u00ED edit_act_copy_grids=M\u0159\u00ED\u017Eky edit_act_copy_gridA=Styl m\u0159\u00ED\u017Eky A edit_act_copy_gridB=Styl m\u0159\u00ED\u017Eky B edit_act_copy_textGrid=Styl textov\u00FDch m\u0159\u00ED\u017Eek edit_act_copy_text=Textov\u00E9 \u010Dinnosti edit_act_copy_fontFace=\u0158ez p\u00EDsma edit_act_copy_fontSize=Velikost p\u00EDsma edit_act_copy_fontStyle=Styl p\u00EDsma edit_act_copy_textColour=Hlavn\u00ED barva textu edit_act_copy_textTargetColour=Vyberte projekt JClic z kter\u00E9 budou \u010Dinnosti importov\u00E1ny edit_act_copy_textErrorColour=Chybov\u00E9 barvy edit_act_copy_tabSpace=Mezera karty edit_act_copy_messages_prev=Styl p\u0159edchoz\u00ED zpr\u00E1vy edit_act_changeType=Zm\u011Bnit typ \u010Dinnosti edit_act_newActivity_class_tooltip=\u00DApln\u00FD n\u00E1zev t\u0159\u00EDdy, kter\u00E1 bude pou\u017Eita k sestaven\u00ED \u010Dinnosti (pouze pro pokro\u010Dil\u00E9 u\u017Eivatele!) edit_act_newActivity_other=Dal\u0161\u00ED\u2026 edit_act_newActivity_info=Pokro\u010Dil\u00ED u\u017Eivatel\u00E9 mohou tak\u00E9 vytvo\u0159it neregistrovan\u00E9 typy \u010Dinnost\u00ED JClic. Sta\u010D\u00ED n\u00ED\u017Ee napsat \u00FApln\u00FD n\u00E1zev t\u0159\u00EDdy a bal\u00EDk jako p\u0159edponu (nap\u0159. "com.acme.\u010Dinnosti.\u010Dinnost"). T\u0159\u00EDdy \u010Dinnosti mus\u00ED roz\u0161i\u0159ovat edu.xtec.jclic.Activity, a mus\u00ED b\u00FDt p\u0159\u00EDstupn\u00E9 zavad\u011B\u010Di t\u0159\u00EDd JVM. edit_act_newActivity_name=N\u00E1zev \u010Dinnosti: edit_act_newActivity_name_tooltip=Ka\u017Ed\u00E1 t\u0159\u00EDda mus\u00ED m\u00EDt v projektu jedine\u010Dn\u00E9 jm\u00E9no edit_act_changeType_warning=

Varov\u00E1n\u00ED: Zm\u011Bna typu \u010Dinnosti m\u016F\u017Ee zp\u016Fsobit ztr\u00E1tu n\u011Bkter\u00FDch vlastnost\u00ED a objekt\u016F sou\u010Dasn\u00E9 \u010Dinnosti. Pou\u017E\u00EDvejte opatrn\u011B!

 

applet_codebase=Um\u00EDst\u011Bn\u00ED k\u00F3du JClic: applet_codebase_tooltip=URL odkazuj\u00EDc\u00ED na slo\u017Eku se soubory a skripty programu JClic applet_prev_text=K\u00F3d HTML vep\u0159edu: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Text nebo k\u00F3d HTML, kter\u00FD bude um\u00EDst\u011Bn p\u0159ed apletem applet_post_text=K\u00F3d HTML vzadu: applet_post_text_tooltip=Text nebo k\u00F3d HTML, kter\u00FD bude um\u00EDst\u011Bn za apletem applet_size=Velikost apletu: applet_size_tooltip=\u0160\u00ED\u0159ka a v\u00FD\u0161ka apletu, v absolutn\u00EDch nebo procentu\u00E1ln\u00EDch hodnot\u00E1ch. applet_page_title=N\u00E1zev str\u00E1nky: applet_page_title_tooltip=Text, kter\u00FD bude zobrazen v horn\u00ED \u010D\u00E1sti okna prohl\u00ED\u017Ee\u010De applet_created_info=Internetov\u00E1 str\u00E1nka "%s" byla \u00FAsp\u011B\u0161n\u011B vytvo\u0159ena. applet_created_prompt=Chcete ji nyn\u00ED v prohl\u00ED\u017Ee\u010Di otev\u0159\u00EDt ? action_createHTML_caption=Vytvo\u0159it internetovou str\u00E1nku... applet_create_title=Vytvoren\u00ED str\u00E1nky HTML pomoc\u00ED apletu JClic action_createHTML_tooltip=Vytvo\u0159it str\u00E1nku HTML pomoc\u00ED apletu obsahuj\u00EDc\u00ED sou\u010Dasn\u00FD projekt applet_filename=N\u00E1zev souboru: applet_filename_tooltip=N\u00E1zev vytv\u00E1\u0159en\u00E9ho HTML souboru action_createHTML_keys=H* settings_applet=Aplet settings_applet_tooltip=V\u00FDchoz\u00ED hodnoty pou\u017Eit\u00E9 pro vytvo\u0159en\u00ED str\u00E1nky applet_bgcolor=Barva pozad\u00ED: applet_bgcolor_tooltip=Barva pozad\u00ED str\u00E1nky HTML applet_centered=Na st\u0159ed applet_centered_tooltip=Um\u00EDstit aplet vodorovn\u011B na st\u0159ed applet_width_tooltip=\u0160\u00ED\u0159ka apletu (absolutn\u00ED nebo procentu\u00E1ln\u00ED) applet_height_tooltip=V\u00FD\u0161ka apletu (absolutn\u00ED nebo procentu\u00E1ln\u00ED) applet_exitUrl=P\u0159i ukon\u010Den\u00ED p\u0159ej\u00EDt na: applet_exitUrl_tooltip=URL, kam bude navigace p\u0159esm\u011Brov\u00E1na po ukon\u010Den\u00ED JClic applet_infoFrame=N\u00E1zev informa\u010Dn\u00EDho r\u00E1me\u010Dku applet_infoFrame_tooltip=N\u00E1zev r\u00E1me\u010Dku, kter\u00FD je pou\u017Eit k zobrazen\u00ED obsahu souvisej\u00EDc\u00EDho s tla\u010D\u00EDtkem "info" action_createInstaller_caption=Vytvo\u0159it instal\u00E1tor projektu... action_createInstaller_keys=I* action_createInstaller_tooltip=Vytvo\u0159it skript instal\u00E1toru projektu pro p\u0159ehr\u00E1va\u010D JClic installer_caption=Upravit skript instal\u00E1toru projektu installer_title=N\u00E1zev: installer_title_tooltip=N\u00E1zev projektu, kter\u00FD bude zobrazen v pr\u016Fvodci instalac\u00ED installer_authors=Auto\u0159\u00ED: installer_authors_tooltip=Autor/\u0159i projektu (kr\u00E1tky text) installer_folder=Slo\u017Eka: installer_folder_tooltip=N\u00E1zev slo\u017Eky, kter\u00FD bude navrhnut pr\u016Fvodcem instalac\u00ED installer_files=Soubory ke zkop\u00EDrov\u00E1n\u00ED: installer_files_tooltip=Soubory ke zkop\u00EDrov\u00E1n\u00ED instal\u00E1torem installer_files_available=Dostupn\u00E9 soubory installer_files_selected=Zvolen\u00E9 soubory installer_files_add=>> p\u0159idat >> installer_files_add_tooltip=P\u0159idat vybran\u00FD soubor do seznamu installer_files_remove=<< odstranit << installer_files_remove_tooltip=Odstranit vybran\u00FD soubor ze seznamu installer_button=Tla\u010D\u00EDtko spu\u0161t\u011Bn\u00ED installer_button_tooltip=Vlastnosti tla\u010D\u00EDtka, kter\u00FD bude zobrazen v kniovn\u011B projekt\u016F installer_button_project=Hlavn\u00ED projekt: installer_button_project_tooltip=Projekt JClic, kter\u00FD bude tla\u010D\u00EDtkem spu\u0161t\u011Bn installer_button_text=\u0160t\u00EDtek: installer_button_text_tooltip=Kr\u00E1tk\u00FD textov\u00FD \u0161t\u00EDtek, kter\u00FD bude zobrazen uvnit\u0159 tla\u010D\u00EDtka installer_button_icon=Ikona: installer_button_icon_tooltip=Obr\u00E1zek, kter\u00FD bude pou\u017Eit jako ikona tla\u010D\u00EDtka. Nechejte pr\u00E1zdn\u00E9 pro pou\u017Eit\u00ED v\u00FDchoz\u00ED ikony JClic. installer_button_description=Popis installer_button_description_tooltip=Popisek, kter\u00FD bude tla\u010D\u00EDtkem zobrazen installer_error_noTitle=Chyba: Chyb\u00ED n\u00E1zev projektu installer_error_noBaseFolder=Chyba: Chyb\u00ED n\u00E1zev slo\u017Eky installer_error_noFilesSelected=Chyba: Nebyly vybr\u00E1ny \u017E\u00E1dn\u00E9 soubory installer_error_noButtonText=Chyba: Chyb\u00ED textov\u00FD \u0161t\u00EDtek tla\u010D\u00EDtka spu\u0161t\u011Bn\u00ED installer_error_projectNotInFiles=Chyba: Projekt p\u0159id\u011Blen\u00FD ke tla\u010D\u00EDtku spu\u0161t\u011Bn\u00ED nen\u00ED v seznamu soubor\u016F ke zkop\u00EDrov\u00E1n\u00ED applet_page_full=Aplet na celou str\u00E1nku applet_page_mixed=Aplet s ur\u010Dit\u00FDmi rozm\u011Bry edit_text_align_left=Zarovnat text doleva edit_text_align_center=Text na st\u0159ed edit_text_align_right=Zarovnat text doprava edit_text_act_target_toggle=Vytvo\u0159it nebo odstranit c\u00EDl edit_text_act_insertCell=Vlo\u017Eit bu\u0148ku edit_text_act_content=Obsah edit_text_act_style=Styl edit_cell_size=Velikost bu\u0148ky: edit_project_orphanActivities=N\u00E1sleduj\u00EDc\u00ED \u010Dinnosti se neobjevili v \u017E\u00E1dn\u00FDch po\u0159ad\u00EDch \u010Dinnost\u00ED , tak\u017Ee nebudou nikdy zobrazeny: edit_project_orphanMedia=N\u00E1sleduj\u00EDc\u00ED objekty m\u00E9di\u00ED nejsou v \u017E\u00E1dn\u00E9 \u010Dinnosti pou\u017Eity p\u0159\u00EDmo: edit_project_orphanActivities_prompt=Chcete je p\u0159idat na konec posledn\u00EDho po\u0159ad\u00ED \u010Dinnost\u00ED? edit_project_orphanMedia_prompt=Chcete je odstranit? edit_project_orphanMedia_title=Odstran\u011Bn\u00ED nepou\u017Eit\u00FDch objekt\u016F m\u00E9di\u00ED edit_project_orphanActivities_title=Osi\u0159el\u00E9 \u010Dinnosti edit_media_refreshAll=Aktualizovat v\u0161echen medi\u00E1ln\u00ED obsah edit_media_refreshAll_tooltip=Aktualizovat v\u0161echny objekty m\u00E9di\u00ED, znovu na\u010Dten\u00EDm jejich soubor\u016F edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Aktualizace m\u00E9di\u00ED... edit_media_exportAll=Exportovat v\u0161echna m\u00E9dia edit_media_exportAll_tooltip=Ve\u0161ker\u00FD obsah prvk\u016F m\u00E9di\u00ED ulo\u017Eit do soubor\u016F edit_media_exportAll_keys=X* edit_shape_select=Vybrat edit_shape_addPoint=P\u0159idat bod edit_shape_deletePoint=Smazat edit_shape_drawRect=Nakreslit obdeln\u00EDk edit_shape_drawEllipse=Nakreslit elipsu edit_shape_drawPoly=Nakreslit mnoho\u00FAheln\u00EDk edit_shape_toLine=P\u0159ev\u00E9st na \u010D\u00E1ru edit_shape_toBezier=P\u0159ev\u00E9st na Bezi\u00E9rovu k\u0159ivku edit_shape_toQuad=P\u0159ev\u00E9st na kvadratickou k\u0159ivku edit_shape_rLeft=Oto\u010Dit doleva edit_shape_rRight=Oto\u010Dit doprava edit_shape_expand=Zv\u011Bt\u0161it edit_shape_contract=Zmen\u0161it edit_shape_zoomIn=P\u0159ibl\u00ED\u017Eit edit_shape_zoomOut=Odd\u00E1lit edit_shape_aproxPoints=Spojit nejbli\u017E\u0161\u00ED body edit_shape_showPoints=Zobrazit body edit_shape_showPoints_tooltip=Zobrazit/Skr\u00FDt body edit_shape_gridSize=Velikost m\u0159\u00ED\u017Eky: edit_shape_hideGrid=Zobrazit / Skr\u00FDt m\u0159\u00ED\u017Eku edit_shape_magnetRadius=Polom\u011Br magnetu: edit_shape_elements=Ur\u010Den\u00E9 prvky edit_shape_elemName=N\u00E1zev tvolen\u00E9ho prvku edit_shape_magnetRadius_tooltip=Dosah magnetu, pokud je povolen edit_shape_gridSize_tooltip=Velikost m\u0159\u00ED\u017Eky edit_mc_activity=\u010Cinnost: edit_mc_sequence=Po\u0159ad\u00ED: edit_mc_url=URL: edit_mc_project=Projekt: edit_mc_activity_selection=Zvolte \u010Dinnost edit_mc_sequence_selection=Zvolte po\u0159ad\u00ED edit_mc_err_nullContent=Nedostate\u010Dn\u00E1 data: edit_act_arrowColor=Barva \u0161ipky: edit_act_arrowColor_tooltip=Barva pou\u017Eit\u00E1 editorem pro vykreslen\u00ED \u0161\u00EDpek (nep\u0159esn\u00E9, proto\u017Ee je pou\u017Eita XOR maska bitu) edit_act_editActivity=Upravit... edit_act_editActivity_tooltip=Upravit vybranou \u010Dinnost action_saveFileAs_caption=Ulo\u017Eit jako... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Ulo\u017Eit sou\u010Dasn\u00FD projekt pod jin\u00FDm n\u00E1zvem edit_act_behavior_block=Chov\u00E1n\u00ED edit_act_behavior=Chov\u00E1n\u00ED edit_act_behavior_drag=T\u00E1hnout objekty edit_act_behavior_drag_tooltip=T\u00E1hnout objekty m\u00EDsto pou\u017Eit\u00ED spojovac\u00ED \u010D\u00E1ry edit_act_behavior_order=Zkontrolovat po\u0159ad\u00ED \u0159e\u0161en\u00ED edit_act_behavior_order_tooltip=Bu\u0148ky mus\u00ED b\u00FDt \u0159e\u0161eny popo\u0159ad\u011B edit_act_scramble=Zam\u00EDchat action_importActivities_caption=Importovat \u010Dinnosti... action_importActivities_keys=I* action_importActivities_tooltip=Importovat \u010Dinnosti z jin\u00E9ho projektu import_warn_samefile=Vybran\u00FD soubor odpov\u00EDd\u00E1 sou\u010Dasn\u00E9mu projektu. \u010Cinnosti mohou b\u00FDt importov\u00E1ny pouze mezi r\u016Fzn\u00FDmi projekty. Pros\u00EDme, vyberte soubor jin\u00E9ho projektu. import_selectActivities=Vyberte jednu nebo v\u00EDce \u010Dinnosti pro import do sou\u010Dasn\u00E9ho projektu: import_importing=Importov\u00E1n\u00ED... import_checkdep=Kontrola z\u00E1vislost\u00ED... import_impmedia=Import m\u00E9di\u00ED: import_impact=Import \u010Dinnost\u00ED: import_selectProject=Vyberte projekt JClic z kter\u00E9 budou \u010Dinnosti importov\u00E1ny edit_tagRep_tags=Ozna\u010Den\u00ED zna\u010Dek edit_tagRep_tagStart=Po\u010D\u00E1te\u010Dn\u00ED ozna\u010Den\u00ED: edit_tagRep_tagStart_tooltip=Ozna\u010Den\u00ED pou\u017Eit\u00E9 na za\u010D\u00E1tku zna\u010Dek edit_tagRep_tagEnd=Kone\u010Dn\u00E9 ozna\u010Den\u00ED: edit_tagRep_tagEnd_tooltip=Ozna\u010Den\u00ED pou\u017Eit\u00E9 na konci zna\u010Dek edit_tagRep_file=Soubor edit_tagRep_fileName=Soubor nebo URL: edit_tagRep_fileName_tooltip=N\u00E1zev nebo URL souboru obsahuj\u00EDc\u00ED hodnoty, kter\u00E9 nahrad\u00ED zna\u010Dky edit_tagRep_charset=Znakov\u00E1 sada: edit_tagRep_charset_tooltip=K\u00F3dov\u00E1n\u00ED znak\u016F pou\u017Eit\u00E9 v souboru edit_tagRep_browseFile=Proch\u00E1zet... edit_tagRep_browseFile_tooltip=Proch\u00E1zet souborov\u00FD syst\u00E9m edit_tagRep_title=Nahrazen\u00ED zna\u010Dek edit_text_act_clearStylesBtn=Vy\u010Distit styly textu... edit_text_act_clearStylesPrompt=Varov\u00E1n\u00ED: Tato \u010Dinnost vy\u010Dist\u00ED ur\u010Den\u00E9 vlastnosti znak\u016F pou\u017Eit\u00E9 v dokumentu, co\u017E ho nastav\u00ED zp\u00E1tky na jeho hlavn\u00ED styl. Tuto \u010Dinnost nelze vr\u00E1tit zp\u011Bt. Chcete toto prov\u00E9st? img_max_size=Maxim\u00E1ln\u00ED velikost obr\u00E1zk\u016F: img_max_width_tooltip=Maxim\u00E1ln\u00ED \u0161\u00EDrka obr\u00E1zk\u016F importovan\u00FDch do knihovny m\u00E9di\u00ED. img_max_height_tooltip=Maxim\u00E1ln\u00ED v\u00FD\u0161ka obr\u00E1zk\u016F importovan\u00FDch do knihovny m\u00E9di\u00ED. img_resize_prompt=Obr\u00E1zek "%s" m\u00E1 velikost %s pixel\u016F. To p\u0159ekra\u010Duje maxim\u00E1ln\u011B povolenou velikost od Autora JClic (%s). Chcete velikost zm\u011Bnit? src/author/edu/xtec/resources/messages/AuthorMessages_de.properties000066400000000000000000001245401335566474600262610ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Beschreibung edit_act_name_tooltip=Name der \u00DCbung edit_act_name=Name: edit_act_description_tooltip=Beschreibung der \u00DCbung edit_act_reports_block=Berichte edit_act_includeInReports=Aktuelle \u00DCbung in Bericht aufnehmen edit_act_includeInReports_tooltip=Ergebnis dieser \u00DCbung in Userbericht aufnehmen edit_act_code=Code: edit_act_code_tooltip=Optionaler Code zum Gruppieren und Suchen in der Berichtdatenbank. edit_act_reportActions=Bericht \u00FCber Aktionen der User edit_act_reportActions_tooltip=Details aller User-Aktionen aufzeichnen edit_act_counters_block=Z\u00E4hler edit_act_timeCounter=Zeituhr: edit_act_timeCounter_tooltip=Zeituhr anzeigen/verbergen edit_act_actionsCounter=Versuche z\u00E4hlen edit_act_actionsCounter_tooltip=Z\u00E4hler anzeigen/verbergen edit_act_scoreCounter=Ergebnisz\u00E4hler edit_act_scoreCounter_tooltip=Ergebnisz\u00E4hler anzeigen/verbergen edit_act_maxTime=Zeitlimit: edit_act_maxTime_tooltip=Zeitlimit zum L\u00F6sen der Aufgabe in Sekunden oder 0 f\u00FCr unbegrenzte \u00DCbungsdauer eingeben. edit_act_countdown=Countdown edit_act_countdown_tooltip=Z\u00E4hler z\u00E4hlt vom Maximalwert auf Null herunter edit_act_maxActions=H\u00F6chstanzahl zul\u00E4ssiger Versuche: edit_act_maxActions_tooltip=H\u00F6chstanzahl von Versuchen oder 0 f\u00FCr unbegrenzte Anzahl von Versuchen eingeben edit_act_buttons_block=Kn\u00F6pfe edit_act_helpBtn=Hilfe edit_act_helpBtn_tooltip=Hilfeknopf anzeigen/verbergen edit_act_helpBtn_solution=L\u00F6sung anzeigen edit_act_helpBtn_msg=Diese Nachricht anzeigen: edit_act_infoBtn=Information edit_act_infoBtn_tooltip=Infoknopf anzeigen/verbergen edit_act_infoBtn_url=Folgenden URL anzeigen: edit_act_infoBtn_cmd=Folgenden Befehl ausf\u00FChren: edit_act_infoBtn_url_tooltip=Beim Klick auf den Infoknopf wird diese Internetseite angezeigt edit_act_infoBtn_cmd_tooltip=Befehl ausf\u00FChren, bei Klick auf den Infoknopf. edit_act_mainWindow=Hauptfenster: edit_act_gameWindow=Spielfenster: edit_act_margin=Rahmen: edit_act_margin_tooltip=Horizontaler und vertikaler Abstand zwischen angezeigten Objekten. edit_act_bgColor=Hintergrundfarbe: edit_act_bgColor_tooltip=Hintergrundfarbe \u00E4ndern. edit_gradient_startColor=Startfarbe: edit_gradient_endColor=Endfarbe : edit_gradient_startColor_tooltip=Auswahl der Startfarbe edit_gradient_endColor_tooltip=Auswahl der Endfarbe edit_gradient_cycles=Zyklen: edit_gradient_cycles_tooltip=Anzahl der Wiederholungen des Farbverlaufs auf der Arbeitsfl\u00E4che edit_gradient_orientation=Ausrichtung: edit_gradient_orientation_tooltip=Winkel des Farbverlaufs \u00FCber der Horizontalen edit_act_gradient=Farbverlauf: edit_act_gradient_tooltip=Farbverlauf anwenden edit_color_opacity=Transparenz edit_color_opacity_tooltip=Wert f\u00FCr transparente alpha-Farbe:. edit_gradient_title=Farbverlauf edit_gradient_default=Standardeinstellungen verwenden (Null Gradient) edit_act_image=Grafik: edit_act_descriptionTab=Beschreibung edit_act_descriptionTab_tooltip=Name und Beschreibung edit_act_tiledBgImg=Kacheln edit_act_tiledBgImg_tooltip=Gesamte Oberfl\u00E4che mit Grafik kacheln, die sich entlang der XY-Achse so oft wie ben\u00F6tigt wiederholt. edit_act_preview=Vorschau: edit_act_border=Rahmen edit_act_border_tooltip=Linie als Fensterrahmen edit_act_transparent=Transparent edit_act_transparent_tooltip=Fenster mit transparentem Hintergrund edit_act_width=Breite: edit_act_height=H\u00F6he: edit_act_width_tooltip=Breite des Objekts in Pixel edit_act_height_tooltip=Objekth\u00F6he in Pixel edit_act_centered=Zentriert edit_act_centered_tooltip=Objekt wird oberhalb des Hauptfensters zentriert edit_act_x=X: edit_act_x_tooltip=Absolute horizontale Position edit_act_y=Y: edit_act_y_tooltip=Absolute vertikale Position edit_act_ui_block=Benutzeroberfl\u00E4che edit_act_image_tooltip=Grafik ausw\u00E4hlen edit_act_text=Text: edit_act_text_tooltip=Angezeigter Text innerhalb des Objekts edit_font_face=Schriftart: edit_font_size=Schritgr\u00F6\u00DFe: edit_font_bold=Fett edit_font_italic=Kursiv edit_font_underline=Unterstrich edit_font_style=Stil: edit_cell_title=Zellinhalt edit_act_messages=Nachrichten edit_act_msg_initial=Nachricht am Beginn: edit_act_msg_final=Nachricht am Ende: edit_act_msg_prev=Vorhergehende Nachricht: edit_act_msg_error=Fehlermeldung: edit_act_msg_initial_tooltip=Angezeigte Nachricht beim Starten der \u00DCbung edit_act_msg_final_tooltip=Angezeigte Nachricht am Ende der \u00DCbung edit_act_msg_error_tooltip=Angezeigter Text, wenn \u00DCbung fehlerhaft beendet wurde edit_act_msg_prev_tooltip=Nachricht, die vor dem Starten der \u00DCbung angezeigt wird (nur bei einigen \u00DCbungsvarianten) edit_align=Ausrichtung: edit_act_textColor=Textfarbe: edit_act_textColor_tooltip=Gew\u00FCnschte Textfarbe edit_act_shadowColor=Farbe des Schattens: edit_act_shadowColor_tooltip=Farbe f\u00FCr Textschatten, wenn verf\u00FCgbar edit_act_shadow=Schatten edit_act_shadow_tooltip=Schrift mit Schatten versehen edit_act_borderColor=Rahmenfarbe: edit_act_borderColor_tooltip=Farbe des Zellrahmens edit_act_inactiveColor=Farbe f\u00FCr Inaktivit\u00E4t: edit_act_inactiveColor_tooltip=Farbe f\u00FCr deaktivierte Zellen edit_act_altColor=Alternative Farbe: edit_act_altColor_tooltip=Farbe der alternativen Inhalte in bearbeiteten Zellen edit_cell_marked=Markiert edit_cell_disabled=Deaktiviert edit_cell_alt=Alternative edit_cell_textMargin=Innerer Rahmen: edit_cell_textMargin_tooltip=Abstand zwischen Zellrand und Text. edit_cell_borderWidth=Rahmenbreite: edit_cell_borderWidth_tooltip=Breite f\u00FCr Standardrand edit_cell_markerWidth=Breite des Textmarkers: edit_cell_markerWidth_tooltip=Strichbreite des Rahmens wenn die Zelle markiert der ausgew\u00E4hlt ist. edit_cell_alt_tooltip=Vorschau: alternative Ansicht edit_cell_disabled_tooltip=Vorschau: deaktiviert edit_cell_marked_tooltip=Vorschau: markiert edit_act_testAction=Vorherige \u00DCbung edit_act_testAction_tooltip=\u00DCbung in der Vorschau testen edit_act_panels_description=Beschreibung edit_act_panels_description_tooltip=Titel und Beschreibung der \u00DCbung edit_act_panels_options=Optionen edit_act_panels_options_tooltip=\u00DCbungsoptionen edit_act_panels_frame=Fenster edit_act_panels_frame_tooltip=Erscheinungsbild, Gr\u00F6\u00DFe und Position des \u00DCbungsfensters edit_act_panels_messages=Nachrichten edit_act_panels_messages_tooltip=Inhalt der Nachrichten edit_act_panels_panel=Leiste edit_act_panels_panel_tooltip=Inhalt der Tafel edit_style_title=Stil edit_style_tooltip=Farbe, Schriftart und Schriftgr\u00F6\u00DFe der Zelle einstellen edit_act_style=Stil: edit_act_overlap=Text darf Bild nicht \u00FCberlagern edit_act_overlap_tooltip=Versuchen Sie zu vermeiden, dass der Text die Grafik \u00FCberlagert edit_media_exists_1=Datei edit_media_exists_2=bereits in der Mediathek vorhanden edit_act_shaper=Formengenerator: edit_act_shaper_err=Fehler bei Formauswahl: edit_act_num_cols=Spalten: edit_act_num_rows=Zeilen: edit_act_toothHeightFactor=Zahnh\u00F6he: edit_act_toothWidthFactor=Zahnbreite: edit_act_toothRandom=Zufallsprinzip edit_act_shaper_properties=Formeigenschaften edit_act_panels_text=Text edit_act_panels_text_tooltip=Text der \u00DCbung action_saveFile_caption=Speichern... action_saveFile_keys=SS action_saveFile_tooltip=Aktuelles Projekt speichern action_docTree_caption=Dokumentstruktur... action_docTree_keys=T* action_docTree_tooltip=Projektdokumente in Baumansicht anzeigen edit_docTree_title=Dokumentenstruktur edit_media_referencedBy=Quellenangabe: msg_prompt_loadReferences=Achtung:

Projekt ist mit anderen Projekten verlinkt.
M\u00F6chten Sie alle verlinkten Dateien importieren?

(Es wird empfohlen mitJA zu antworten, wenn Clic 3.0-\u00DCbungen importiert werden) edit_mc_type=Typ: edit_mc_type_unknown=Unbekannt edit_mc_type_sound=Sound abspielen edit_mc_type_video=Video abspielen edit_mc_type_midi=MIDI abspielen edit_mc_type_cdaudio=Audio CD abspielen edit_mc_type_record=Sound aufnehmen edit_mc_type_play_recorded=Soundaufnahme abspielen edit_mc_type_run_activity=Zu \u00DCbung gehen edit_mc_type_run_sequence=Zu Sequenz gehen edit_mc_type_run_external=Programm starten edit_mc_type_url=URL anzeigen edit_mc_type_exit=Ende edit_mc_type_return=Zur\u00FCck edit_mc_level=Priorit\u00E4tsstufe: edit_mc_file=Datei: edit_mc_externalParam=Parameter: edit_mc_from=Aus: edit_mc_to=Bis: edit_mc_length=Maximale L\u00E4nge: edit_mc_recBuffer=Aufnahme: edit_mc_stretch=Komprimieren wenn zu gro\u00DF edit_mc_location=Position: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Aus: edit_mc_location_from_box=Zelle edit_mc_location_from_window=Fenster edit_mc_location_from_frame=Frame edit_mc_loop=Sound Durchlauf edit_mc_autostart=Autostart edit_mc_catchmouse=Mausefalle edit_mc_title=Multimedia und Active X-Files edit_mc_label=Aktiver Inhalt: edit_media_dlg_title=Multimedia Objekt ausw\u00E4hlen edit_media_title=Mediathek edit_mc_pos_cell=Zentriert \u00FCber Zelle edit_mc_pos_window=Zentriert \u00FCber Fenster edit_mc_pos_absolute=Position angeben: edit_tree_badFormat=Falscher Pfad oder Datei! edit_act_panels_controls=Kontrolle edit_act_panels_controls_tooltip=Optionen f\u00FCr Kn\u00F6pfe und Z\u00E4hler edit_act_class=Typ: edit_act_gridLayout=Erscheinungsbild der Tafel: edit_act_gridLayout_tooltip=Relative Position der Tafeln A und B. edit_act_inverseResolution=Umgekehrte Aufl\u00F6sung edit_act_inverseResolution_tooltip=Die \u00DCbung ist erfolgreich beendet, wenn alle angegebenen Elemente von "B" richtig zugeordnet wurden. edit_act_showAllArrows=Alle Pfeile anzeigen edit_act_alt=Alternativer Text: edit_act_alt_tooltip=Angezeigte Inhalte der zu bearbeitenden und nicht zu bearbeitenden Zellen edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Alternativen Text bearbeiten edit_act_grid=Tafel edit_act_grid_A=Tafel A edit_act_grid_B=Tafel B edit_act_grid_layout=Layout edit_act_grid_relationship=Verh\u00E4ltnis edit_seq_activity_header=\u00DCbung edit_seq_tag_header=Textmarke edit_seq_jump_header=Gehe zu edit_seq_activity=\u00DCbung: edit_seq_tag=Textmarke: edit_seq_description=Beschreibung: edit_seq_auto=Automatisch zur n\u00E4chsten \u00DCbung edit_seq_delay=Verz\u00F6gerung: edit_seq_action_fwd=Weiter edit_seq_action_back=Zur\u00FCck edit_seq_action_jump=Gehe zu... edit_seq_action_stop=Stopp edit_seq_action_return=Zur\u00FCck zu... edit_seq_action_exit=JClic verlassen edit_seq_arrow_fwd=Pfeil vorw\u00E4rts: edit_seq_arrow_back=Pfeil zur\u00FCck: edit_seq_action=Aktion: edit_seq_button_enabled=Knopf anzeigen edit_seq_project=JClic Projekt: edit_act_absolute=Absolute Position edit_act_absolute_tooltip=Position des Objekts durch XY-Koordinaten definiert edit_act_location=Position: edit_seq_newElement=Neues Element der Lernsequenz... edit_seq_newElement_tooltip=Neues Element in Lernsequenz einf\u00FCgen edit_seq_newElement_msg=\u00DCbung f\u00FCr neues Element der Lernsequenz ausw\u00E4hlen. edit_seq_newElement_error_noAct=Es kann keine neue Element der Lernsequenz ohne \u00DCbungen erstellt werden! edit_seq_newElement_error_emptyList=Projekt enth\u00E4lt keine \u00DCbungen. In einem leeren Projekt k\u00F6nnen keine Lernsequenzen erstellt werden. edit_seq_jump_msg=Ziel: edit_seq_jump_title=Ziel edit_act_newActivity_tooltip=Neue \u00DCbung zum Projekt hinzuf\u00FCgen edit_act_prompt_class=\u00DCbungstyp: edit_act_prompt_name=Name: edit_act_newActivity_msg=W\u00E4hlen Sie einen \u00DCbungstyp aus und geben Sie einen Namen f\u00FCr die neue \u00DCbung ein: edit_act_newActivity_error_noAct=Sie m\u00FCssen einen \u00DCbungstyp ausw\u00E4hlen! edit_act_newActivity_error_noName=Sie m\u00FCssen einen \u00DCbungsnamen angeben! edit_act_newActivity_error_creating=\u00DCbung kann nicht erstellt werden! edit_act_newActivity_class=Bezeichnung der Java-Klasse: edit_text_act_format=Format edit_text_act_answer=Antwort edit_text_act_popup=Pop up-Fenster edit_text_act_answer_label=G\u00FCltige Antworten: edit_list_newElement_tooltip=Neues Element aus der Liste hinzuf\u00FCgen edit_list_editElement_tooltip=Ausgew\u00E4hltes Element bearbeiten edit_list_deleteElement_tooltip=Ausgew\u00E4hltes Element aus der Liste l\u00F6schen edit_list_upBtn_tooltip=Hinauf verschieben edit_list_downBtn_tooltip=Hinunter verschieben edit_list_newValue=Neuer Text: edit_list_addElement=Neues Element aus der Liste hinzuf\u00FCgen edit_list_modifyValue=Textauswahl bearbeiten edit_text_act_target=Ziel edit_text_act_maxLen=Maximale L\u00E4nge: edit_text_act_maxLen_tooltip=H\u00F6chstanzahl der Buchstaben in der Antwort edit_text_act_fillingChar=Schriftart f\u00FCr L\u00FCcken edit_text_act_fillingChar_tooltip=Schriftart zum Ausf\u00FCllen der L\u00FCcken ausw\u00E4hlen edit_text_act_iniLen=Ausgangsl\u00E4nge: edit_text_act_iniLen_tooltip=Anzahl der Buchstaben, die zu Beginn der \u00DCbung angezeigt werden. edit_text_act_iniText=Starttext: edit_text_act_iniText_tooltip=Text, der bei Beginn der \u00DCbung in der L\u00FCcke angezeigt wird. edit_text_act_list=Liste mit Optionen anzeigen: edit_text_act_list_tooltip=Liste mit Optionen anzeigen, aus denen der User ausw\u00E4hlen kann. edit_text_act_check_title=Evaluationskriterien edit_text_act_popup_no=Keine Pop-up-Fenster edit_text_act_popup_always=Pop up-Fenster automatisch \u00F6ffnen edit_text_act_popup_onError=Pop up-Fenster bei Fehlern edit_text_act_popup_onDemand=Pop up-Fenster mit F1 \u00F6ffnen edit_text_act_popup_type=Typ: edit_text_act_popup_delay=Verz\u00F6gerung vor \u00D6ffnen des Pop up-Fensters: edit_text_act_popup_maxTime=Max. Dauer: edit_text_act_popup_onlyPlay=Nur Sound edit_text_act_err_noSelection=Textfragment ausw\u00E4hlen um neuen Zieltext zu erstellen! edit_text_act_err_badCharInSelection=Zieltext darf keinen Umbruch oder oder Einzug beinhalten edit_text_act_err_nestedTargets=Verschachtelung nicht erlaubt! edit_text_act_err_cellInTarget=Zieltext darf keine Tabelle beinhalten! edit_text_act_pageBgColor=Hintergrundfarbe: edit_text_act_editStylesBtn=Dokumentlayout bearbeiten edit_text_act_mainStyle=Standardeigenschaften: edit_text_act_tabSpc=Tabulatorabstand: edit_text_act_tabSize=Abstand zwischen Tabstopps: edit_text_act_colors=Farben: edit_text_act_targetStyle=Zielfarben: edit_text_act_errorStyle=Farbe f\u00FCr falsche Eingabe: edit_text_act_preview=Voransicht: edit_text_act_styleSample_default_start=Standardtext edit_text_act_styleSample_target=Ziel edit_text_act_styleSample_error=Fehler edit_text_act_styleSample_default_fill=Standardtext edit_text_act_styleSample_default_end=Standardtext edit_text_act_warnDeleteTarget=Achtung: Dieser Schritt l\u00F6scht das ausgew\u00E4hlte Ziel. M\u00F6chten Sie fortfahren? edit_text_act_prevScreen_title=Vorherige Ansicht... edit_text_act_prevScreen_no=Vor \u00DCbungsstart keinen Text anzeigen edit_text_act_prevScreen_original=Kompletten \u00DCbungstext anzeigen edit_text_act_prevScreen_special=Diesen Text anzeigen: edit_text_act_prevScreen_time=Max. Dauer: edit_text_act_edit_target=Ziel... edit_text_act_checkButton_show=\u00BBKorrigieren\u00AB-Knopf anzeigen edit_text_act_checkButtonText=Knopftext: edit_text_act_checkCase=Gro\u00DF- und Kleinschreibung \u00FCberpr\u00FCfen edit_text_act_checkAccents=Akzente und Sonderzeichen ber\u00FCcksichtigen edit_text_act_checkPunct=Satzzeichen ber\u00FCcksichtigen edit_text_act_checkDoubleSpc=Mehrfach-Leerstellen zulassen edit_text_act_checkOptions=Kriterien edit_text_act_checkAutoJump=Nach Ausf\u00FCllen zur n\u00E4chsten Frage weitergehen edit_text_act_checkForceOk=Nur bei richtiger Antwort weiter edit_text_act_checkDetail=Falsche W\u00F6rter buchstabieren edit_text_act_checkDetail_params=Parameter der Algorhythmen analysieren: edit_text_act_checkDetail_steps=Schritte: edit_text_act_checkDetail_field=Bearbeitungsfeld: edit_text_act_defaultCheckButtonText=Check edit_text_act_advancedCorrectionOptions=Analyse der Antworten edit_text_act_check_bt=Korrektur... edit_text_act_checkButton=\u00BBKorrigieren\u00AB-Knopf edit_text_act_checkProgress=Fortschritt edit_text_act_typeBtn=Typ... edit_text_act_orderParagraphs=Abs\u00E4tze ordnen edit_text_act_orderWords=W\u00F6rter ordnen edit_text_act_order_amongstPar=W\u00F6rter in Abs\u00E4tzen vermischen edit_text_act_type_title=\u00DCbungstyp edit_text_act_warnChangeType=Durch diesen Schritt l\u00F6schen Sie alle aktuellen Zieldefinitionen. Wollen Sie fortfahren? edit_text_act_identWords=W\u00F6rter finden edit_text_act_identChars=Buchstaben finden edit_media_change_name=Umbenennen... edit_media_change_file=Datei \u00E4ndern... edit_media_includeInZip=Gezippt speichern edit_media_type=Medientyp: edit_media_size=Dateigr\u00F6\u00DFe: edit_media_show_type=Dateityp: edit_media_preview=Objekt in der Vorschau ansehen edit_media_preview_tooltip=Mediendatei in der Vorschau ansehen edit_media_rename=Datei umbenennen edit_media_rename_title=Umbenennen edit_media_rename_prompt=Neuer Name: edit_media_rename_invalid=Ung\u00FCltiger Dateiname! edit_media_rename_exists=Datei gleichen Namens bereits vorhanden. Jede Datei muss einen eigenen unverwechselbaren Namen besitzen. edit_media_chfile_invalid=Ung\u00FCltiger Dateiname! err_media_chfile_different=Gleicher Dateityp erforderlich edit_media_font_error=Schrift kann nicht geladen werden! edit_media_save_file=Datei speichern (entzippen) edit_media_refresh_file=Multimediadatei durch Datei aktualisieren edit_media_warn_zipFileNotExternal=Das ist keine "echte" Datei, sondern ein Objekt aus einem ZIP-Ordner. Um diese Anwendung nutzen zu k\u00F6nnen, muss eine gleichnamige Datei im selben Ordner wie die gezippte Datei befinden. edit_activities=\u00DCbungen edit_sequences=Sequenzen edit_media=Mediathek edit_media_tooltip=Grafiken und andere Multimediadateien des Projekts verwalten edit_activities_tooltip=\u00DCbungen zu Projekt erstellen und bearbeiten edit_sequences_tooltip=Lernsequenzen erstellen und bearbeiten edit_project_title=Titel: edit_project_title_tooltip=Projekttitel edit_project=Projekt edit_project_tooltip=Projekteigenschaften bearbeiten edit_project_description=Beschreibung: edit_project_description_tooltip=Kurze Projektbeschreibung edit_project_area=F\u00E4cher: edit_project_area_tooltip=F\u00E4cher: edit_project_level=Levels: edit_project_level_tooltip=Lehrplanbezug des Projekts edit_project_descriptors=Schl\u00FCsselw\u00F6rter: edit_project_descriptors_tooltip=Schl\u00FCsselw\u00F6rter (durch Beistriche getrennt) edit_project_languages=Sprachen: edit_project_languages_tooltip=Projektsprachen edit_project_languages_modify=Spracheinstellung \u00E4ndern edit_project_languages_add=Sprache hinzuf\u00FCgen edit_project_languages_select=ISO-639 Sprachcodes: edit_project_authors=Autor/innen: edit_project_authors_tooltip=Projektteilnehmer/innen edit_project_author_name=Name: edit_project_author_mail=e-Mail: edit_project_author_rol=Funktion: edit_project_author_organization=Organisation: edit_project_author_comments=Kommentar: edit_project_author_url=URL: edit_project_author_name_tooltip=Name des Autors/der Autorin (muss angegeben werden) edit_project_author_mail_tooltip=e-Mail des Autors/der Autorin (kann frei gelassen werden) edit_project_author_rol_tooltip=Projektfunktion: Autor/in, Mitarbeiter/in, Zeichnungen, Sound ... (kann frei bleiben) edit_project_author_organization_tooltip=Schule, Universit\u00E4t, Verein ... (kann frei bleiben) edit_project_author_url_tooltip=Private Homepage (kann frei gelassen werden) edit_project_author_comments_tooltip=Feld f\u00FCr weitere Informationen (kann frei bleiben) edit_project_author_info=Zum Autor/zu Autorin: edit_project_author_add=Autor/in zur Liste hinzuf\u00FCgen edit_project_author_edit=Autor Info bearbeiten edit_project_org_name=Name: edit_project_org_name_tooltip=Name der Schule edit_project_org_mail=e-Mail: edit_project_org_mail_tooltip=e-Mail Adresse der Schule edit_project_org_url=URL: edit_project_org_url_tooltip=Schulhomepage edit_project_org_address=Adresse: edit_project_org_address_tooltip=Postadresse: edit_project_org_pc=PLZ: edit_project_org_pc_tooltip=Postleitzahl edit_project_org_city=Stadt: edit_project_org_city_tooltip=Schulstandort edit_project_org_country=Land: edit_project_org_state=Staat: edit_project_org_comments=Kommentar: edit_project_org=Schule/n: edit_project_org_tooltip=Am Projekt beteiligte Partnerschule/n oder -institution/en edit_project_org_info=Infos zur Organisation: edit_project_org_add=Organisation hinzuf\u00FCgen edit_project_org_edit=Daten der Organisation bearbeiten edit_project_org_country_tooltip=Land, Bundesstaat, Bundesland... edit_project_org_state_tooltip=Bundesland, Gemeinde, Region... edit_project_org_comments_tooltip=Zusatzinformationen... edit_project_rev_date=Datum: edit_project_rev_date_tooltip=\u00DCberarbeitungsdatum edit_project_rev_authors=Autor/innen: edit_project_rev_authors_tooltip=Autor/innen der \u00DCberarbeitung edit_project_rev_description=Beschreibung: edit_project_rev_description_tooltip=Kurze Beschreibung der \u00C4nderungen edit_project_rev_comments=Kommentar: edit_project_rev_comments_tooltip=Zus\u00E4tzliche Informationen edit_project_rev=\u00DCberarbeitungen: edit_project_rev_tooltip=Protokoll der wichtigsten am Projekt vorgenommenen \u00C4nderungen edit_project_rev_add=\u00DCberarbeitungsstatistik hinzuf\u00FCgen edit_project_rev_edit=\u00DCberarbeitungsstatistik bearbeiten edit_project_rev_info=\u00DCberarbeitungsdatum edit_media_objects=Objekte edit_media_object=Objekt edit_evsounds_start=Start der \u00DCbung: edit_evsounds_click=Objekt anklicken: edit_evsounds_actionError=Falsche Aktion: edit_evsounds_actionOk=Korrekte Aktion: edit_evsounds_finishedError=\u00DCbung fehlerhaft beendet: edit_evsounds_finishedOk=\u00DCbung korrekt absolviert edit_project_rev_err_nodesc=Fehler: Formularfeld muss ausgef\u00FCllt werden! edit_evsounds_dlg_title=Ereignissounds bearbeiten edit_project_evsounds=Ereignissounds: edit_project_evsounds_tooltip=Spezielle Sounds f\u00FCr verschiedene Ereignisse einsetzen edit_act_evsounds=Ereignissounds: edit_act_evsounds_tooltip=Spezielle Sounds f\u00FCr jede JClic-Aktion edit_evsounds_default=Standardsound edit_evsounds_disabled=deaktiviert edit_evsounds_chk_tooltip=Sound f\u00FCr dieses Ereignis aktivieren oder deaktivieren. edit_evsounds_select_tooltip=Ausgew\u00E4hlten Sound f\u00FCr dieses Ereignis ausw\u00E4hlen oder Standardsound verwenden action_newProject_caption=Neues Projekt... action_newProject_keys=NN action_newProject_tooltip=Neues JClic-Projekt erstellen edit_arith_op_from=Von: edit_arith_op_from_tooltip=Mindestwert des Operators edit_arith_op_to=Bis: edit_arith_op_to_tooltip=H\u00F6chstwert des Operators edit_arith_op_with=Mit: edit_arith_op_with_tooltip=Wenn aktiv, kann der Operator auch diesen Wert haben edit_arith_op_fromList=Auswahl aus der Liste edit_arith_op_fromList_tooltip=Anzeigen m\u00F6glicher Werte des Operators edit_arith_op_decimals=Dezimalen: edit_arith_op_decimals_tooltip=Anzahl der Dezimalstellen des Operanden edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=Erster Operand edit_arith_secondOp=Zweiter Operand edit_arith_title=Arith2 f\u00FCr JClic edit_arith_operations=Rechnungsarten: edit_arith_operations_tooltip=Rechnungsart ausw\u00E4hlen edit_arith_operations_plus=Addieren edit_arith_operations_minus=Subtrahieren edit_arith_operations_multiply=Multiplizieren edit_arith_operations_divide=Dividieren edit_arith_unknown=Unbekannte: edit_arith_unknown_tooltip=Element ausw\u00E4hlen, das eine Unbekannte sein soll edit_arith_unknown_aobx=Resultat ist eine Unbekannte edit_arith_unknown_aoxr=Zweiter Operator ist eine Unbekannte edit_arith_unknown_xobr=Erster Operator ist eine Unbekannte edit_arith_unknown_axbr=Operation ist eine Unbekannte edit_arith_unknown_invert=Ergebnis an den Anfang des Ausdrucks schreiben edit_arith_result=Ergebnis edit_arith_result_notCarry=Nicht \u00FCbersteigen edit_arith_result_random=Zufallsprinzip edit_arith_result_asc=Aufsteigend edit_arith_result_order=Nach Ergebnis sortieren: edit_arith_result_desc=Absteigend edit_arith_result_avoidDup=Duplikate vermeiden edit_arith_cond=Bedingungen: edit_arith_cond_ind=Egal edit_arith_cond_agb=Der erste Operator muss gr\u00F6\u00DFer sein als der zweite edit_arith_cond_alb=Der erste Operator muss kleiner sein als der zweite edit_arith_cond_tooltip=Andere Bedingungen edit_autocp=Automatischer Content-Generator: edit_autocp_tooltip=Content-Generator Typ f\u00FCr diese \u00DCbung ausw\u00E4hlen. edit_autocp_block=Content-Generator edit_autocp_btn=Einstellungen... edit_autocp_btn_tooltip=Einstellungen des Content-Providers konfigurieren edit_data=Daten bearbeiten edit_act=\u00DCbung bearbeiten edit_acp=Content-Provider bearbeiten edit_acp_err_creating=Fehler beim Eintragen des Content-Providers! edit_project_author_group=Urheber edit_project_description_block=Beschreibung edit_project_ui_block=Benutzeroberfl\u00E4che edit_act_description=Beschreibung: m_Edit=Bearbeiten m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=Neue \u00DCbung... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Einf\u00FCgen m_Insert_Mnemonic=I m_View=Anzeigen m_View_Mnemonic=V action_editProject_caption=Projekt action_editProject_keys=PP action_editProject_tooltip=Projekteinstellungen bearbeiten action_editMedia_caption=Multimedia action_editMedia_keys=MM action_editMedia_tooltip=Multimediadateien der Projektbibliothek bearbeiten action_editActivities_caption=\u00DCbungen action_editActivities_keys=AA action_editActivities_tooltip=\u00DCbungen bearbeiten action_editSeq_caption=Sequenzen action_editSeq_keys=SS action_editSeq_tooltip=\u00DCbungssequenzen bearbeiten warn_project_modified=Am aktuellen Projekt wurden \u00C4nderungen vorgenommen. \u00C4nderungen speichern? edit_project_descriptors_block=Schl\u00FCsselw\u00F6rter edit_media_new=Neues Multimedia Objekt edit_media_new_tooltip=Neue Grafik oder Multimediadatei zur Mediathek hinzuf\u00FCgen edit_media_new_keys=M* edit_seq_threshold=Punktelimit: edit_seq_threshold_tooltip_up=Hier weiter, wenn Gesamtpunktezahl gleich oder h\u00F6her als... edit_seq_time=Zeitlimit: edit_seq_time_tooltip_up=Hier weiter nur wenn \u00DCbungsdauer nicht l\u00E4nger als... edit_seq_threshold_tooltip_down=Hier weiter, wenn Gesamtpunktezahl geringer als... edit_seq_time_tooltip_down=Hier weiter, wenn Bearbeitungsdauer l\u00E4nger als... edit_seq_condJump=If-Anweisung edit_seq_condJump_tooltip=Spezielle Erfordernisse f\u00FCr Wechsel der Schwierigkeitsstufe angeben edit_seq_condJump_upper_tooltip=Voraussetzungen f\u00FCr Vorr\u00FCcken auf h\u00F6here Stufe angeben edit_seq_condJump_lower=Stufe tiefer: edit_seq_condJump_upper=Stufe h\u00F6her: edit_seq_condJump_lower_tooltip=Voraussetzungen f\u00FCr Wechsel auf tiefere Stufe angeben edit_seq_action_tooltip_fw=Dem \u00BBWeiter\u00AB-Knopf zugewiesene Aktion edit_seq_action_tooltip_bk=Dem \u00BBZur\u00FCck\u00AB-Knopf zugewiesene Aktion edit_seq_jump_tooltip=Ziel angeben edit_seq_action_tooltip=Vorgeschriebene Aktion edit_seq_activity_tooltip=Diesem Teil der Sequenz zugewiesene \u00DCbung edit_seq_tag_tooltip=Textmarke dient zur Identifikation des Elements der Lernsequenz (kann frei bleiben) edit_seq_description_tooltip=Beschreibung des Elements der Lernsequenz (kann frei bleiben) edit_seq_button_enabled_tooltip=Pfeiltaste aktivieren/deaktivieren edit_seq_auto_tooltip=Automatisch zur n\u00E4chsten \u00DCbung, wenn eine \u00DCbung beendet ist edit_seq_delay_tooltip=Wartezeit in Sekunden vor automatischem Wechsel edit_color_dlgTitle=Farbe ausw\u00E4hlen edit_media_renaming=Datei wird umbenannt. Bitte warten... edit_act_cell_width=Breite: edit_act_cell_width_tooltip=Zellbreite (in Pixel) edit_act_cell_height=H\u00F6he: edit_act_cell_height_tooltip=Zellh\u00F6he (in Pixel) edit_act_hiddenWords=Versteckte W\u00F6rter: edit_act_hiddenWords_tooltip=Liste der versteckten W\u00F6rter auf der Tafel anzeigen edit_act_wordSearch_panelB=Tafel B verwenden edit_act_wordSearch_panelB_tooltip=Der Inhalt einer zweiten Tafel wird angezeigt, sobald W\u00F6rter gefunden sind edit_act_shaper_tooltip=Form ausw\u00E4hlen, die f\u00FCr die Anzeigetafel verwendet werden soll. edit_act_num_cols_tooltip=Spaltenanzahl der Tabelle edit_act_num_rows_tooltip=Zeilenanzahl der Tabelle edit_act_wildTransparent=Transparente Begrenzungen edit_act_wildTransparent_tooltip=Begrenzungen (Blackboxes) als transparente L\u00FCcken anzeigen edit_act_behavior_scramble_times=Versuche: edit_act_behavior_scramble_times_tooltip=Erlaubte Mischversuche edit_act_copy_title=Eigenschaften in folgenden Ordner kopieren.... edit_act_copy_attributes=Eigenschaften edit_act_copy_dest=Anwenden auf: edit_act_copy_style_main=Hauptfenster edit_act_copy_style_play=Spielfenster edit_act_copy_activities=\u00DCbungen, die bearbeitet werden sollen: edit_act_copyAttributes=Eigenschaften der Kopie edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Eigenschaften der aktuellen \u00DCbung auf andere \u00DCbungen \u00FCbertragen edit_new_project_name=Name des Projekts: edit_new_project_name_tooltip=Kurzer, aussagekr\u00E4ftiger Name des Projekts edit_new_project_filename=Dateiname: edit_new_project_filename_tooltip=Name der Projektdatei ohne Dateierweiterung edit_new_project_folder=Ordner: edit_new_project_folder_tooltip=Name des Ordners, in dem das Projekt gespeichert werden soll edit_new_project_folder_browse=Durchsuchen... edit_new_project_title=Neues JClic Projekt erstellen edit_new_project_err_empty=Fehler: Projekt, Datei und Ordner m\u00FCssen g\u00FCltige Bezeichnungen haben. Namenfelder d\u00FCrfen nicht frei bleiben. edit_new_project_warning_noEmptyFolder=Dieser Ordner enth\u00E4lt bereits ein anderes Clic 3.0 oder JClic Projekt. Um Verwechslungen zu vermeiden, wird empfohlen, jedes einzelne Projekt in einem separaten Ordner zu speichern. Dies ist allerdings nicht verpflichtend. M\u00F6chten Sie das neue Projekt wirklich in diesem Ordner erstellen? edit_new_project_err_folderCreation=Fehler: Gew\u00FCnschter Ordner kann nicht erstellt werden! edit_act_copy_err_noSelection=Fehler: Keine \u00DCbung ausgew\u00E4hlt! Um diese Funktion n\u00FCtzen zu k\u00F6nnen, m\u00FCssen Sie aus der Liste die Aktivit\u00E4t(en) ausw\u00E4hlen, auf die die gew\u00FCnschten Eigenschaften angewendet werden sollen. edit_act_copy_action_prefix=Eigenschaften in folgenden Ordner kopieren: edit_act_copy_margin=Rand edit_act_copy_bgColor=Hintergrundfarbe edit_act_copy_gradient=Farbverlauf edit_act_copy_bgImage=Hintergrundbild edit_act_copy_border=Rahmen edit_act_copy_transparentBg=Transparenter Hintergrund edit_act_copy_position=Position edit_act_copy_messages=Nachrichten edit_act_copy_messages_ini=Erscheinungsbild der Nachricht am Beginn edit_act_copy_messages_end=Erscheinungsbild der Nachricht am Ende edit_act_copy_messages_err=Erscheinungsbild der Fehlermeldungen edit_act_copy_reports=Berichte edit_act_copy_rep_include=Alle Aktionen in Berichte aufnehmen edit_act_copy_rep_actions=Aktionen aufzeichnen edit_act_copy_interface=Benutzeroberfl\u00E4che edit_act_copy_skin=Skin edit_act_copy_evSounds=Sounds: edit_act_copy_counters=Z\u00E4hler edit_act_copy_cTime=Zeituhr edit_act_copy_maxTime=Maximale Dauer edit_act_copy_cTries=Versuche z\u00E4hlen edit_act_copy_maxTries=H\u00F6chstanzahl zul\u00E4ssiger Versuche edit_act_copy_cScore=Z\u00E4hler edit_act_copy_scramble=Mischversuche edit_act_copy_buttons=Kn\u00F6pfe edit_act_copy_btnHelp=Hilfeknopf edit_act_copy_btnInfo=Infoknopf edit_act_copy_grids=Tafeln edit_act_copy_gridA=Stil von Tafel A edit_act_copy_gridB=Stil von Tafel B edit_act_copy_textGrid=Erscheinungsbild der Textfelder edit_act_copy_text=Textbasierte \u00DCbungen edit_act_copy_fontFace=Schriftart edit_act_copy_fontSize=Schriftgr\u00F6\u00DFe edit_act_copy_fontStyle=Schriftstil edit_act_copy_textColour=Standard Textfarbe edit_act_copy_textTargetColour=Farbe der Zielelemente edit_act_copy_textErrorColour=Anzeigefarbe der Fehler edit_act_copy_tabSpace=Tabstoppposition edit_act_copy_messages_prev=Erscheinungsbild der vorhergehenden Nachricht edit_act_changeType=\u00DCbungstyp \u00E4ndern edit_act_newActivity_class_tooltip=Voller Name der Java-Klasse, die zum Erstellen der \u00DCbung verwendet wurde (nur f\u00FCr fortgeschrittene User!) edit_act_newActivity_other=Andere... edit_act_newActivity_info=Fortgeschrittene User k\u00F6nnen auch eigene, unregistrierte Typen von JClic-\u00DCbungen erstellen. Schreiben Sie nur das Java Paket und den vollen Namen der Java-Klasse darunter (z.B. "com.acme.activities.FooActivity"). \u00DCbungs-Klassen m\u00FCssen die Endung edu.xtec.jclic.Activity aufweisen und mit dem JVM classloader zu \u00F6ffnen sein. edit_act_newActivity_name=Name der \u00DCbung: edit_act_newActivity_name_tooltip=Jede \u00DCbung muss einen eigenen, unverwechselbaren Namen innerhalb des Projekts besitzen edit_act_changeType_warning=

Warning:Warnung: Durch das \u00C4ndern des \u00DCbungstyps k\u00F6nnen aktuelle \u00DCbungseigenschaften und Objekte verloren gehen.

 

applet_codebase=JClic-Quellcode: applet_codebase_tooltip=URL verweist auf Folder mit JClic-Dateien und Skripts applet_prev_text=HTML-Code davor: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Text oder HTML-Code vor Erscheinen des Applets applet_post_text=HTML-Code danach: applet_post_text_tooltip=Text oder HTML-Code nach Erscheinen des Applets applet_size=Applet-Format: applet_size_tooltip=Breite und H\u00F6he des Applets (absolut oder in Prozenten). applet_page_title=Seitentitel: applet_page_title_tooltip=Textanzeige in der Kopfzeile des Browserfensters applet_created_info=Webseite "%s" erfolgreich erstellt applet_created_prompt=Im Browser ansehen? action_createHTML_caption=HTML-Seite erstellen... applet_create_title=HTML-Seite mit JClic-Applet erstellen action_createHTML_tooltip=HTML-Seite mit Applet erstellen, das das aktuelle Projekt enth\u00E4lt applet_filename=Dateiname: applet_filename_tooltip=Bezeichnung der HTML-Seite, die erstellt werden soll action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Standardeinstellungen bei der Erstellung von Webseiten verwenden applet_bgcolor=Hintergrundfarbe: applet_bgcolor_tooltip=Hintergrundfarbe der HTML-Seite applet_centered=Zentriert applet_centered_tooltip=Java-Applet horizontal zentrieren applet_width_tooltip=Applet-Breite (absolut oder in Prozenten) applet_height_tooltip=Applet-H\u00F6he (absolut oder in Prozenten) applet_exitUrl=Nach dem Schlie\u00DFen folgende Datei aufrufen: applet_exitUrl_tooltip=URL, der nach dem Schlie\u00DFen von JClic ge\u00F6ffnet werden soll applet_infoFrame=Name des Info-Frames: applet_infoFrame_tooltip=Name des Rahmens, der ge\u00F6ffnet werden soll, um die Infos anzuzeigen. action_createInstaller_caption=Project-Installer erstellen... action_createInstaller_keys=I* action_createInstaller_tooltip=Projekt-Installer Script f\u00FCr JClic-Player erstellen installer_caption=Projekt Installer Skript bearbeiten installer_title=Titel: installer_title_tooltip=Projekttitels, der von Installer angezeigt wird installer_authors=Autor/innen: installer_authors_tooltip=Autor/innen des Projekts (Kurztext) installer_folder=Ordner: installer_folder_tooltip=Automatisch vorgeschlagener Ordnername installer_files=Dateien, die kopiert werden sollen: installer_files_tooltip=Dateien, die vom Installer kopiert werden sollen installer_files_available=Verf\u00FCgbare Dateien installer_files_selected=Ausgew\u00E4hlte Dateien installer_files_add=>> add >> installer_files_add_tooltip=Ausgew\u00E4hlte Datei zu der Liste hinzuf\u00FCgen installer_files_remove=<< remove << installer_files_remove_tooltip=Ausgew\u00E4hlte Datei aus der Liste entfernen installer_button=Startknopf installer_button_tooltip=Eigenschaften des Knopfes, der in der Projektbibliothek angezeigt wird installer_button_project=Hauptprojekt: installer_button_project_tooltip=JClic-Projekt durch Anklicken des Knopfes starten installer_button_text=Label: installer_button_text_tooltip=Kurzer Text, der auf dem Knopf angezeigt werden soll installer_button_icon=Symbol: installer_button_icon_tooltip=Grafik als Knopfsymbol. Frei lassen, wenn JClic-Standardknopf verwendet werden soll. installer_button_description=Beschreibung installer_button_description_tooltip=Bei Klick auf Knopf angezeigte Kurzinfo installer_error_noTitle=Fehler: Projekttitel fehlt installer_error_noBaseFolder=Fehler: Ordnerbezeichnung fehlt installer_error_noFilesSelected=Fehler: Keine Dateien ausgew\u00E4hlt installer_error_noButtonText=Fehler: Text f\u00FCr Startknopf fehlt installer_error_projectNotInFiles=Fehler: Das dem Startknopf zugewiesene Projekt erscheint nicht in der Liste der Dateien, die kopiert werden sollen applet_page_full=Ganzseitiges Applet applet_page_mixed=Benutzerdefiniertes Applet edit_text_align_left=Text linksb\u00FCndig ausrichten edit_text_align_center=Text zentrieren edit_text_align_right=Text rechtsb\u00FCndig ausrichten edit_text_act_target_toggle=Ziel definieren oder l\u00F6schen edit_text_act_insertCell=Zelle einf\u00FCgen edit_text_act_content=Inhalt edit_text_act_style=Stil edit_cell_size=Zellgr\u00F6\u00DFe: edit_project_orphanActivities=Folgende \u00DCbungen scheinen in keiner \u00DCbungssequenz des Projekts auf und werden daher auch nicht angezeigt: edit_project_orphanMedia=Folgende Multimediadateien werden in keiner \u00DCbung verwendet: edit_project_orphanActivities_prompt=M\u00F6chten Sie diese Dateien im Anschluss an die letzte \u00DCbungssequenz hinzuf\u00FCgen? edit_project_orphanMedia_prompt=M\u00F6chten Sie diese Dateien entfernen? edit_project_orphanMedia_title=Nicht ben\u00F6tigte Multimediadateien werden entfernt edit_project_orphanActivities_title=Verwaiste \u00DCbuingen edit_media_refreshAll=Multimediadateien aktualisieren edit_media_refreshAll_tooltip=Alle Multimediadateien aktualisieren edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Multimediadateien werden aktualisiert... edit_media_exportAll=Alle Multimediadateien exportieren edit_media_exportAll_tooltip=Inhalt aller Multimediadateien als Datei abspeichern edit_media_exportAll_keys=*X`* edit_shape_select=Ausw\u00E4hlen edit_shape_addPoint=Punkt hinzuf\u00FCgen edit_shape_deletePoint=L\u00F6schen edit_shape_drawRect=Rechteck zeichnen edit_shape_drawEllipse=Ellipse zeichnen edit_shape_drawPoly=Polygon zeichnen edit_shape_toLine=In Linie umwandeln edit_shape_toBezier=In Bezier-Kurve konvertieren edit_shape_toQuad=In quadratische Bezier-Kurve konvertieren edit_shape_rLeft=Links drehen edit_shape_rRight=Rechts drehen edit_shape_expand=Vergr\u00F6\u00DFern edit_shape_contract=Verbinden edit_shape_zoomIn=Vergr\u00F6\u00DFern edit_shape_zoomOut=Verkleinern edit_shape_aproxPoints=N\u00E4hesten Punkt aufsuchen edit_shape_showPoints=Punkte anzeigen edit_shape_showPoints_tooltip=Punkte anzeigen/verbergen edit_shape_gridSize=Rastergr\u00F6\u00DFe: edit_shape_hideGrid=Raster anzeigen/verbergen edit_shape_magnetRadius=Magnetradius: edit_shape_elements=Ausgew\u00E4hlte Objekte edit_shape_elemName=Name des ausgew\u00E4hlten Objekts edit_shape_magnetRadius_tooltip=Aktionsradius des Magnet-Tools, wenn aktiviert edit_shape_gridSize_tooltip=Rastergr\u00F6\u00DFe edit_mc_activity=\u00DCbung: edit_mc_sequence=Sequenz: edit_mc_url=URL: edit_mc_project=Projekt: edit_mc_activity_selection=\u00DCbung ausw\u00E4hlen edit_mc_sequence_selection=Sequenz ausw\u00E4hlen edit_mc_err_nullContent=Unzureichende Eingabe! edit_act_arrowColor=Pfeilfarbe: edit_act_arrowColor_tooltip=Vom Editor zum Zeichnen der Pfeile verwendete Farbe (Abweichungen m\u00F6glich, da eine XOR-Bitmaskierung verwendet wird) edit_act_editActivity=Bearbeiten... edit_act_editActivity_tooltip=Ausgew\u00E4hlte \u00DCbung bearbeiten action_saveFileAs_caption=Speichern unter... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Aktuelles Projekt unter anderem Namen abspeichern edit_act_behavior_block=Verhalten edit_act_behavior=Verhalten edit_act_behavior_drag=schleppen edit_act_behavior_drag_tooltip=Drag objects instead of use a connection line edit_act_behavior_order=Check solving order edit_act_behavior_order_tooltip=Cells must be solved in order edit_act_scramble=Mischversuche action_importActivities_caption=Importieren von \u00DCbungen action_importActivities_keys=I* action_importActivities_tooltip=bring Aktivit\u00E4t aus einem anderen Projekt ein import_warn_samefile=die Aktivit\u00E4ten k\u00F6nnen nur zwischen verschiedene Projekte importiert werden. Bitte w\u00E4hlen ein anderes Projekt aus. import_selectActivities=Bitte w\u00E4hlen Sie die \u00DCbungen aus, die Sie in das aktuelle Projekt einf\u00FCgen m\u00F6chten: import_importing=Wird eingebracht... import_checkdep=Abh\u00E4ngigkeiten werden \u00FCberpr\u00FCft... import_impmedia=Medien werden eingebracht: import_impact=Aktivit\u00E4t wird eingebracht: import_selectProject=bitte w\u00E4hlen das Jclic Projekt aus, von welchem Aktivit\u00E4ten eingebracht werden edit_tagRep_tags=Etikettenmarkierung edit_tagRep_tagStart=Startmarkierung edit_tagRep_tagStart_tooltip=verwendete Markierung zu Beginn des Etiketts edit_tagRep_tagEnd=Endmarkierung edit_tagRep_tagEnd_tooltip=Markierung am Ende des Etiketts edit_tagRep_file=Datei edit_tagRep_fileName=Datei oder URL: edit_tagRep_fileName_tooltip=Name oder URL der Datei, die die Werte enthalten, die die Etiketten ersetzen. edit_tagRep_charset=Zeichensatz: edit_tagRep_charset_tooltip=Zeichenkodierung in dieser Datei edit_tagRep_browseFile=Durchsuchen... edit_tagRep_browseFile_tooltip=Dateisystem durchsuchen edit_tagRep_title=Tag ersetzen edit_text_act_clearStylesBtn=L\u00F6sche Textstile edit_text_act_clearStylesPrompt=Warnung:\\diese Aktion wird die spezifischen Zeichensatzattribute l\u00F6schen, die zu diesem Dokument geh\u00F6ren und zur\u00FCck zum Hauptstil zur\u00FCcksetzen. Diese Aktion kann nicht r\u00FCckg\u00E4ngig gemacht werden. Wollen Sie fortfahren? img_max_size=Maximale Bildgr\u00F6\u00DFe: img_max_width_tooltip=Maximale Breite der Bilder, die in die Medienbibliothek importiert werden sollen. img_max_height_tooltip=Maximale H\u00F6he der Bilder, die in die Medienbibliothek importiert werden sollen. img_resize_prompt=Das Bild "%s" hat eine Gr\u00F6\u00DFe von %s Pixeln. Dies \u00FCbersteigt das vom JClic-Autor erlaubte Maximum (%s). M\u00F6chten Sie das Bild verkleinern? src/author/edu/xtec/resources/messages/AuthorMessages_el.properties000066400000000000000000004316131335566474600262730ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE edit_act_name_tooltip=\u039F\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_name=\u038C\u03BD\u03BF\u03BC\u03B1 : edit_act_description_tooltip=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_reports_block=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 edit_act_includeInReports=\u03A3\u03C5\u03BC\u03C0\u03B5\u03C1\u03AF\u03BB\u03B7\u03C8\u03B7 \u03B1\u03C5\u03C4\u03AE\u03C2 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03C3\u03C4\u03B9\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 edit_act_includeInReports_tooltip=\u03A3\u03C5\u03BC\u03C0\u03B5\u03C1\u03AF\u03BB\u03B7\u03C8\u03B7 \u03C4\u03C9\u03BD \u03B1\u03C0\u03BF\u03C4\u03B5\u03BB\u03B5\u03C3\u03BC\u03AC\u03C4\u03C9\u03BD \u03B1\u03C5\u03C4\u03AE\u03C2 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03C3\u03C4\u03B9\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03C4\u03C9\u03BD \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD edit_act_code=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2: edit_act_code_tooltip=\u03A0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03AE \u03C7\u03C1\u03AE\u03C3\u03B7 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03B3\u03B9\u03B1 \u03C4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B1\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03C3\u03C4\u03B9\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03C4\u03B7\u03C2 \u03B2\u03AC\u03C3\u03B7\u03C2 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD. edit_act_reportActions=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC \u03B5\u03BD\u03B5\u03C1\u03B3\u03B5\u03B9\u03CE\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 edit_act_reportActions_tooltip=\u0395\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE \u03C4\u03C9\u03BD \u03BB\u03B5\u03C0\u03C4\u03BF\u03BC\u03B5\u03C1\u03B5\u03B9\u03CE\u03BD \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B5\u03BD\u03B5\u03C1\u03B3\u03B5\u03B9\u03CE\u03BD \u03C0\u03BF\u03C5 \u03AD\u03B3\u03B9\u03BD\u03B1\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF\u03C5\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 edit_act_counters_block=\u039C\u03B5\u03C4\u03C1\u03B7\u03C4\u03AD\u03C2 edit_act_timeCounter=\u03A7\u03C1\u03BF\u03BD\u03CC\u03BC\u03B5\u03C4\u03C1\u03BF edit_act_timeCounter_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7/\u03B1\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03C7\u03C1\u03BF\u03BD\u03CC\u03BC\u03B5\u03C4\u03C1\u03BF\u03C5 edit_act_actionsCounter=\u039C\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE\u03C2 \u03C0\u03C1\u03BF\u03C3\u03C0\u03B1\u03B8\u03B5\u03B9\u03CE\u03BD edit_act_actionsCounter_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7/\u03B1\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE \u03C0\u03C1\u03BF\u03C3\u03C0\u03B1\u03B8\u03B5\u03B9\u03CE\u03BD edit_act_scoreCounter=\u039C\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE\u03C2 \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1\u03C2 edit_act_scoreCounter_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7/\u03B1\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1\u03C2 edit_act_maxTime=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2: edit_act_maxTime_tooltip=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B4\u03B9\u03B5\u03BA\u03C0\u03B5\u03C1\u03B1\u03AF\u03C9\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03C3\u03B5 \u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1, \u03AE 0 \u03B3\u03B9\u03B1 \u03B1\u03C0\u03B5\u03C1\u03B9\u03CC\u03C1\u03B9\u03C3\u03C4\u03BF \u03C7\u03C1\u03CC\u03BD\u03BF. edit_act_countdown=\u0391\u03BD\u03C4\u03AF\u03C3\u03C4\u03C1\u03BF\u03C6\u03B7 \u03BC\u03AD\u03C4\u03C1\u03B7\u03C3\u03B7 edit_act_countdown_tooltip=\u039F \u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE\u03C2 \u03BE\u03B5\u03BA\u03B9\u03BD\u03AC \u03B1\u03C0\u03CC \u03C4\u03B7 \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03B7 \u03C4\u03B9\u03BC\u03AE \u03BA\u03B1\u03B9 \u03BC\u03B5\u03B9\u03CE\u03BD\u03B5\u03C4\u03B1\u03B9 \u03C9\u03C2 \u03C4\u03BF 0. edit_act_maxActions=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C2 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C0\u03C1\u03BF\u03C3\u03C0\u03B1\u03B8\u03B5\u03B9\u03CE\u03BD: edit_act_maxActions_tooltip=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C2 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03B5\u03C0\u03B9\u03C4\u03C1\u03B5\u03C0\u03CC\u03BC\u03B5\u03BD\u03C9\u03BD \u03C0\u03C1\u03BF\u03C3\u03C0\u03B1\u03B8\u03B5\u03B9\u03CE\u03BD, \u03AE 0 \u03B3\u03B9\u03B1 \u03B1\u03C0\u03B5\u03C1\u03B9\u03CC\u03C1\u03B9\u03C3\u03C4\u03B5\u03C2 \u03C0\u03C1\u03BF\u03C3\u03C0\u03AC\u03B8\u03B5\u03B9\u03B5\u03C2. edit_act_buttons_block=\u03A0\u03BB\u03AE\u03BA\u03C4\u03C1\u03B1 edit_act_helpBtn=\u0392\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1 edit_act_helpBtn_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7/\u03B1\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 \u03B2\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1\u03C2 edit_act_helpBtn_solution=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03BB\u03CD\u03C3\u03B7\u03C2 edit_act_helpBtn_msg=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03B1\u03C5\u03C4\u03BF\u03CD \u03C4\u03BF\u03C5 \u03BC\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03BF\u03C2: edit_act_infoBtn=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 edit_act_infoBtn_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7/\u0391\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD edit_act_infoBtn_url=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03B1\u03C5\u03C4\u03BF\u03CD \u03C4\u03BF\u03C5 URL: edit_act_infoBtn_cmd=\u0395\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7 \u03B1\u03C5\u03C4\u03AE\u03C2 \u03C4\u03B7\u03C2 \u03B5\u03BD\u03C4\u03BF\u03BB\u03AE\u03C2: edit_act_infoBtn_url_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7\u03C2 \u03C4\u03B7\u03C2 \u03B9\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03BC\u03B5 \u03C0\u03AC\u03C4\u03B7\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD edit_act_infoBtn_cmd_tooltip=\u0397 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE \u03B5\u03BD\u03C4\u03BF\u03BB\u03CE\u03BD \u03B5\u03BA\u03C4\u03B5\u03BB\u03B5\u03AF\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03C0\u03AC\u03C4\u03B7\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD edit_act_mainWindow=\u039A\u03CD\u03C1\u03B9\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF: edit_act_gameWindow=\u03A0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF \u03C0\u03B1\u03B9\u03C7\u03BD\u03B9\u03B4\u03B9\u03BF\u03CD; edit_act_margin=\u03A0\u03B5\u03C1\u03B9\u03B8\u03CE\u03C1\u03B9\u03BF: edit_act_margin_tooltip=\u039F\u03C1\u03B9\u03B6\u03CC\u03BD\u03C4\u03B9\u03B1 \u03BA\u03B1\u03B9 \u03BA\u03AC\u03B8\u03B5\u03C4\u03B7 \u03C7\u03C9\u03C1\u03B9\u03BA\u03AE \u03B1\u03BD\u03AC\u03C0\u03C4\u03C5\u03BE\u03B7 \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03C4\u03C9\u03BD \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03C9\u03BD. edit_act_bgColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5: edit_act_bgColor_tooltip=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5: edit_gradient_startColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03B1\u03C1\u03C7\u03AE\u03C2: edit_gradient_endColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C4\u03AD\u03BB\u03BF\u03C5\u03C2: edit_gradient_startColor_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C4\u03BF\u03C5 \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B1\u03C1\u03C7\u03AE\u03C2 edit_gradient_endColor_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C4\u03BF\u03C5 \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C4\u03AD\u03BB\u03BF\u03C5\u03C2 edit_gradient_cycles=\u039A\u03CD\u03BA\u03BB\u03BF\u03B9: edit_gradient_cycles_tooltip=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03B5\u03C0\u03B1\u03BD\u03B1\u03BB\u03AE\u03C8\u03B5\u03C9\u03BD \u03B4\u03B9\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7\u03C2 \u03C3\u03C4\u03B7\u03BD \u03B5\u03C0\u03B9\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1 edit_gradient_orientation=\u03A0\u03C1\u03BF\u03C3\u03B1\u03BD\u03B1\u03C4\u03BF\u03BB\u03B9\u03C3\u03BC\u03CC\u03C2: edit_gradient_orientation_tooltip=\u03A0\u03C1\u03BF\u03C3\u03B1\u03BD\u03B1\u03C4\u03BF\u03BB\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B4\u03B9\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7\u03C2 \u03C5\u03C0\u03BF\u03BB\u03BF\u03B3\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2 \u03C3\u03B5 \u03BC\u03BF\u03AF\u03C1\u03B5\u03C2 \u03BF\u03C1\u03B9\u03B6\u03BF\u03BD\u03C4\u03AF\u03C9\u03C2 edit_act_gradient=\u0394\u03B9\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7: edit_act_gradient_tooltip=\u03A7\u03C1\u03AE\u03C3\u03B7 \u03B4\u03B9\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7\u03C2 \u03C7\u03C1\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD edit_color_opacity=\u0391\u03B4\u03B9\u03B1\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1 edit_color_opacity_tooltip=\u039A\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C4\u03B7\u03C2 \u03C4\u03B9\u03BC\u03AE\u03C2 \u03C4\u03BF\u03C5 \u03BA\u03B1\u03BD\u03B1\u03BB\u03B9\u03BF\u03CD alpha (\u03B1\u03B4\u03B9\u03B1\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1) \u03C4\u03BF\u03C5 \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2. edit_gradient_title=\u0394\u03B9\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7 edit_gradient_default=\u03A7\u03C1\u03AE\u03C3\u03B7 \u03C0\u03C1\u03BF\u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03B9\u03BC\u03CE\u03BD (\u03BC\u03B7\u03B4\u03B5\u03BD\u03B9\u03BA\u03AE \u03B4\u03B9\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7) edit_act_image=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1: edit_act_descriptionTab=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE edit_act_descriptionTab_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03BA\u03B1\u03B9 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE edit_act_tiledBgImg=\u03A3\u03B5 \u03C0\u03B1\u03C1\u03AC\u03B8\u03B5\u03C3\u03B7 edit_act_tiledBgImg_tooltip=\u03A7\u03C1\u03C9\u03BC\u03B1\u03C4\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C4\u03B7\u03C2 \u03B5\u03C0\u03B9\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1\u03C2 \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03BC\u03B5 \u03B5\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7 \u03BA\u03B1\u03C4\u03AC \u03BC\u03AE\u03BA\u03BF\u03C2 \u03C4\u03C9\u03BD \u03B1\u03BE\u03CC\u03BD\u03C9\u03BD \u03A7 \u03BA\u03B1\u03B9 Y \u03CC\u03C0\u03BF\u03C5 \u03C7\u03C1\u03B5\u03B9\u03AC\u03B6\u03B5\u03C4\u03B1\u03B9. edit_act_preview=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7: edit_act_border=\u03A0\u03B5\u03C1\u03AF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 edit_act_border_tooltip=\u03A3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03BC\u03CC\u03C2 \u03BC\u03B9\u03B1\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B3\u03CD\u03C1\u03C9 \u03B1\u03C0\u03CC \u03C4\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF edit_act_transparent=\u0394\u03B9\u03B1\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1 edit_act_transparent_tooltip=\u03A4\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF \u03AD\u03C7\u03B5\u03B9 \u03B4\u03B9\u03B1\u03C6\u03B1\u03BD\u03AD\u03C2 \u03C6\u03CC\u03BD\u03C4\u03BF edit_act_width=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2: edit_act_height=\u038E\u03C8\u03BF\u03C2: edit_act_width_tooltip=\u03A4\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C5\u03C0\u03BF\u03BB\u03BF\u03B3\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03C3\u03B5 \u03B5\u03B9\u03BA\u03BF\u03BD\u03BF\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 edit_act_height_tooltip=\u03A4\u03BF \u03CD\u03C8\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C5\u03C0\u03BF\u03BB\u03BF\u03B3\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03C3\u03B5 \u03B5\u03B9\u03BA\u03BF\u03BD\u03BF\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 edit_act_centered=\u039A\u03B5\u03BD\u03C4\u03C1\u03B1\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF edit_act_centered_tooltip=\u03A4\u03BF \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B8\u03B1 \u03BA\u03B5\u03BD\u03C4\u03C1\u03B1\u03C1\u03B9\u03C3\u03C4\u03B5\u03AF \u03C0\u03AC\u03BD\u03C9 \u03B1\u03C0\u03CC \u03C4\u03BF \u03BA\u03CD\u03C1\u03B9\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF edit_act_x=X: edit_act_x_tooltip=\u0391\u03C0\u03CC\u03BB\u03C5\u03C4\u03B7 \u03BF\u03C1\u03B9\u03B6\u03CC\u03BD\u03C4\u03B9\u03B1 \u03B8\u03AD\u03C3\u03B7 edit_act_y=Y: edit_act_y_tooltip=\u0391\u03C0\u03CC\u03BB\u03C5\u03C4\u03B7 \u03BA\u03AC\u03B8\u03B5\u03C4\u03B7 \u03B8\u03AD\u03C3\u03B7 edit_act_ui_block=\u0394\u03B9\u03B5\u03C0\u03B1\u03C6\u03AE \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 edit_act_image_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03BC\u03B9\u03B1\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 edit_act_text=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: edit_act_text_tooltip=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03AD\u03C3\u03B1 \u03C3\u03C4\u03BF \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF edit_font_face=\u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC edit_font_size=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2: edit_font_bold=\u0388\u03BD\u03C4\u03BF\u03BD\u03B1 edit_font_italic=\u03A0\u03BB\u03AC\u03B3\u03B9\u03B1 edit_font_underline=\u03A5\u03C0\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B9\u03C3\u03B7 edit_font_style=\u03A3\u03C4\u03C5\u03BB: edit_cell_title=\u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03B1 \u03BA\u03B5\u03BB\u03B9\u03BF\u03CD edit_act_messages=\u039C\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03B1 edit_act_msg_initial=\u0391\u03C1\u03C7\u03B9\u03BA\u03CC \u03BC\u03AE\u03BD\u03C5\u03BC\u03B1: edit_act_msg_final=\u03A4\u03B5\u03BB\u03B9\u03BA\u03CC \u03BC\u03AE\u03BD\u03C5\u03BC\u03B1: edit_act_msg_prev=\u03A0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF \u03BC\u03AE\u03BD\u03C5\u03BC\u03B1: edit_act_msg_error=\u039C\u03AE\u03BD\u03C5\u03BC\u03B1 \u03C3\u03C6\u03AC\u03BB\u03BC\u03B1\u03C4\u03BF\u03C2: edit_act_msg_initial_tooltip=\u039C\u03AE\u03BD\u03C5\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03C4\u03B7\u03BD \u03AD\u03BD\u03B1\u03C1\u03BE\u03B7 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_msg_final_tooltip=\u039C\u03AE\u03BD\u03C5\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03CC\u03C4\u03B1\u03BD \u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03C9\u03B8\u03B5\u03AF edit_act_msg_error_tooltip=\u039C\u03AE\u03BD\u03C5\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03CC\u03C4\u03B1\u03BD \u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03BD\u03B5\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03C3\u03C6\u03AC\u03BB\u03BC\u03B1\u03C4\u03B1. edit_act_msg_prev_tooltip=\u039C\u03AE\u03BD\u03C5\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03C0\u03C1\u03B9\u03BD \u03C4\u03B7\u03BD \u03AD\u03BD\u03B1\u03C1\u03BE\u03B7 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 (\u03BC\u03CC\u03BD\u03BF \u03C3\u03B5 \u03C3\u03C5\u03B3\u03BA\u03B5\u03BA\u03C1\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD) edit_align=\u03A3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7: edit_act_textColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5: edit_act_textColor_tooltip=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 edit_act_shadowColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C3\u03BA\u03AF\u03B1\u03C3\u03B7\u03C2: edit_act_shadowColor_tooltip=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03C3\u03BA\u03AF\u03B1\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5, \u03CC\u03C4\u03B1\u03BD \u03C4\u03AF\u03B8\u03B5\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE edit_act_shadow=\u03A3\u03BA\u03B9\u03AC edit_act_shadow_tooltip=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03BC\u03B5 \u03C3\u03BA\u03B9\u03AC edit_act_borderColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2: edit_act_borderColor_tooltip=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BA\u03B5\u03BB\u03B9\u03BF\u03CD edit_act_inactiveColor=\u039A\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B1\u03BD\u03B5\u03BD\u03B5\u03C1\u03B3\u03AE edit_act_inactiveColor_tooltip=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03CC\u03C4\u03B1\u03BD \u03C4\u03BF \u03BA\u03B5\u03BB\u03AF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF edit_act_altColor=\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03CC \u03C7\u03C1\u03CE\u03BC\u03B1: edit_act_altColor_tooltip=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03BF\u03CD \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03B5 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03C9\u03BC\u03AD\u03BD\u03B1 \u03BA\u03B5\u03BB\u03B9\u03AC edit_cell_marked=\u03A3\u03B7\u03BC\u03B5\u03B9\u03C9\u03BC\u03AD\u03BD\u03BF edit_cell_disabled=\u0391\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF edit_cell_alt=\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03CC edit_cell_textMargin=\u0395\u03C3\u03C9\u03C4\u03B5\u03C1\u03B9\u03BA\u03CC \u03C0\u03B5\u03C1\u03B9\u03B8\u03CE\u03C1\u03B9\u03BF edit_cell_textMargin_tooltip=\u0394\u03B9\u03AC\u03C3\u03C4\u03B7\u03BC\u03B1 \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BA\u03B1\u03B9 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B5\u03BD\u03CC\u03C2 \u03BA\u03B5\u03BB\u03B9\u03BF\u03CD. edit_cell_borderWidth=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2: edit_cell_borderWidth_tooltip=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03BF \u03C3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03BC\u03CC \u03C0\u03C1\u03CC\u03C4\u03C5\u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 edit_cell_markerWidth=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03B3\u03C1\u03B1\u03C6\u03AF\u03B4\u03B1\u03C2; edit_cell_markerWidth_tooltip=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03CC\u03C4\u03B1\u03BD \u03C4\u03BF \u03BA\u03B5\u03BB\u03AF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C3\u03B7\u03BC\u03B1\u03B4\u03B5\u03BC\u03AD\u03BD\u03BF \u03AE \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF edit_cell_alt_tooltip=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7 \u03C3\u03B5 "\u03B5\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03AE" \u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 edit_cell_disabled_tooltip=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7 \u03C3\u03B5 "\u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03B7" \u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 edit_cell_marked_tooltip=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7 \u03C3\u03B5 "\u03C3\u03B7\u03BC\u03B5\u03B9\u03C9\u03BC\u03AD\u03BD\u03B7" \u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 edit_act_testAction=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_testAction_tooltip=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B4\u03BF\u03BA\u03B9\u03BC\u03AE \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_panels_description=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE edit_act_panels_description_tooltip=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2 \u03BA\u03B1\u03B9 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_panels_options=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2 edit_act_panels_options_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_panels_frame=\u03A0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF edit_act_panels_frame_tooltip=\u0391\u03BD\u03B1\u03BB\u03BF\u03B3\u03AF\u03B1, \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03BA\u03B1\u03B9 \u03B8\u03AD\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_panels_messages=\u039C\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03B1 edit_act_panels_messages_tooltip=\u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF \u03BC\u03B7\u03BD\u03C5\u03BC\u03AC\u03C4\u03C9\u03BD \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_panels_panel=\u03A0\u03AF\u03BD\u03B1\u03BA\u03B1\u03C2 edit_act_panels_panel_tooltip=\u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03B1 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 edit_style_title=\u03A3\u03C4\u03C5\u03BB edit_style_tooltip=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C4\u03BF \u03C7\u03C1\u03CE\u03BC\u03B1, \u03C4\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC \u03BA\u03B1\u03B9 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C4\u03C9\u03BD \u03BA\u03B5\u03BB\u03B9\u03CE\u03BD edit_act_style=\u03A3\u03C4\u03C5\u03BB: edit_act_overlap=\u03A4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03BD\u03B1 \u03BC\u03B7\u03BD \u03B5\u03C0\u03B9\u03BA\u03B1\u03BB\u03CD\u03C0\u03C4\u03B5\u03B9 \u03C4\u03B7\u03BD \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 edit_act_overlap_tooltip=\u0391\u03C0\u03BF\u03C6\u03C5\u03B3\u03AE \u03B5\u03C0\u03B9\u03BA\u03AC\u03BB\u03C5\u03C8\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B1\u03C0\u03CC \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF edit_media_exists_1=\u03A4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF edit_media_exists_2=\u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03AE\u03B4\u03B7 \u03C3\u03C4\u03B7 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD! edit_act_shaper=\u03A3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03C4\u03AE\u03C2: edit_act_shaper_err=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03C4\u03AE: edit_act_num_cols=\u03A3\u03C4\u03AE\u03BB\u03B5\u03C2: edit_act_num_rows=\u0393\u03C1\u03B1\u03BC\u03BC\u03AD\u03C2: edit_act_toothHeightFactor=\u038E\u03C8\u03BF\u03C2 \u03B4\u03BF\u03BD\u03C4\u03B9\u03BF\u03CD: edit_act_toothWidthFactor=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03B4\u03BF\u03BD\u03C4\u03B9\u03BF\u03CD: edit_act_toothRandom=\u03A4\u03C5\u03C7\u03B1\u03AF\u03B1 \u03B4\u03B9\u03B1\u03BD\u03BF\u03BC\u03AE edit_act_shaper_properties=\u0399\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03C4\u03AE edit_act_panels_text=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF edit_act_panels_text_tooltip=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 action_saveFile_caption=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7... action_saveFile_keys=SS action_saveFile_tooltip=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C4\u03C1\u03AD\u03C7\u03BF\u03BD\u03C4\u03BF\u03C2 \u03AD\u03C1\u03B3\u03BF\u03C5 action_docTree_caption=\u0394\u03B5\u03BD\u03B4\u03C1\u03BF\u03B5\u03B9\u03B4\u03AE\u03C2 \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03AD\u03C1\u03B3\u03BF\u03C5... action_docTree_keys=T* action_docTree_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03B4\u03B5\u03BD\u03B4\u03C1\u03BF\u03B5\u03B9\u03B4\u03BF\u03CD\u03C2 \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_docTree_title=\u0394\u03B5\u03BD\u03B4\u03C1\u03BF\u03B5\u03B9\u03B4\u03AE\u03C2 \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_media_referencedBy=\u0391\u03BD\u03B1\u03C6\u03AD\u03C1\u03B5\u03C4\u03B1\u03B9: msg_prompt_loadReferences=\u03A0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE:

\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03AD\u03C1\u03B3\u03BF \u03C3\u03C5\u03BD\u03B4\u03AD\u03B5\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03AC\u03BB\u03BB\u03B1 \u03AD\u03C1\u03B3\u03B1.
\u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03BE\u03B5\u03C1\u03B5\u03C5\u03BD\u03AE\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03B5\u03B9\u03C2 \u03BA\u03B1\u03B9 \u03BD\u03B1 \u03C6\u03BF\u03C1\u03C4\u03CE\u03C3\u03B5\u03C4\u03B5 \u03AC\u03BB\u03BB\u03B1 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1;

(\u03A0\u03C1\u03BF\u03C4\u03B5\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03B1\u03C0\u03B1\u03BD\u03C4\u03AE\u03C3\u03B5\u03C4\u03B5 \u039D\u0391\u0399 \u03CC\u03C4\u03B1\u03BD \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B1\u03B9 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C4\u03BF\u03C5 Clic 3.0) edit_mc_type=\u03A4\u03CD\u03C0\u03BF\u03C2: edit_mc_type_unknown=\u0386\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF edit_mc_type_sound=\u0391\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AE \u03AE\u03C7\u03BF\u03C5 edit_mc_type_video=\u0391\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AE \u03B2\u03AF\u03BD\u03C4\u03B5\u03BF edit_mc_type_midi=\u0391\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AE MIDI edit_mc_type_cdaudio=\u0391\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AE CD \u03AE\u03C7\u03BF\u03C5 edit_mc_type_record=\u0397\u03C7\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 \u03AE\u03C7\u03BF\u03C5 edit_mc_type_play_recorded=\u0391\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AE \u03B7\u03C7\u03BF\u03B3\u03C1\u03B1\u03C6\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5 \u03AE\u03C7\u03BF\u03C5 edit_mc_type_run_activity=\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 edit_mc_type_run_sequence=\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03B7\u03BD \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1 edit_mc_type_run_external=\u0395\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7 \u03C0\u03C1\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 edit_mc_type_url=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 URL edit_mc_type_exit=\u03A4\u03AD\u03BB\u03BF\u03C2 edit_mc_type_return=\u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE edit_mc_level=\u0395\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03C0\u03C1\u03BF\u03C4\u03B5\u03C1\u03B1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2: edit_mc_file=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF: edit_mc_externalParam=\u03A0\u03B1\u03C1\u03AC\u03BC\u03B5\u03C4\u03C1\u03BF\u03B9: edit_mc_from=\u0391\u03C0\u03CC: edit_mc_to=\u03A0\u03C1\u03BF\u03C2: edit_mc_length=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03BC\u03AE\u03BA\u03BF\u03C2: edit_mc_recBuffer=\u0395\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE \u03BA\u03B1\u03C3\u03AD\u03C4\u03B1\u03C2: edit_mc_stretch=\u03A4\u03AD\u03BD\u03C4\u03C9\u03BC\u03B1 \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2 edit_mc_location=\u03A4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C3\u03AF\u03B1: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=\u0391\u03C0\u03CC: edit_mc_location_from_box=\u039A\u03B5\u03BB\u03AF edit_mc_location_from_window=\u03A0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF edit_mc_location_from_frame=\u03A0\u03BB\u03B1\u03AF\u03C3\u03B9\u03BF edit_mc_loop=\u0395\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7 edit_mc_autostart=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B5\u03BA\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 edit_mc_catchmouse=\u03A0\u03BF\u03BD\u03C4\u03AF\u03BA\u03B9 \u03C3\u03CD\u03BB\u03BB\u03B7\u03C8\u03B7\u03C2 edit_mc_title=\u03A0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03B1 \u03BA\u03B1\u03B9 \u03B5\u03BD\u03B5\u03C1\u03B3\u03CC \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF edit_mc_label=\u0395\u03BD\u03B5\u03C1\u03B3\u03CC \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF edit_media_dlg_title=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD edit_media_title=\u0392\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD edit_mc_pos_cell=\u03A3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7 \u03C3\u03C4\u03BF \u03BA\u03AD\u03BD\u03C4\u03C1\u03BF \u03C4\u03BF\u03C5 \u03BA\u03B5\u03BB\u03B9\u03BF\u03CD edit_mc_pos_window=\u039A\u03B5\u03BD\u03C4\u03C1\u03AC\u03C1\u03B9\u03C3\u03BC\u03B1 \u03C3\u03C4\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF edit_mc_pos_absolute=\u039A\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B8\u03AD\u03C3\u03B7\u03C2: edit_tree_badFormat=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03B7 \u03B4\u03B5\u03BD\u03B4\u03C1\u03BF\u03B5\u03B9\u03B4\u03AE\u03C2 \u03B4\u03BF\u03BC\u03AE \u03AE \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 edit_act_panels_controls=\u03A3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03B5\u03BB\u03AD\u03B3\u03C7\u03BF\u03C5 edit_act_panels_controls_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2 \u03B3\u03B9\u03B1 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03B1 \u03BA\u03B1\u03B9 \u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AD\u03C2 edit_act_class=\u03A4\u03CD\u03C0\u03BF\u03C2: edit_act_gridLayout=\u0394\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2: edit_act_gridLayout_tooltip=\u03A3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AE \u03B8\u03AD\u03C3\u03B7 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 \u0391 \u03BA\u03B1\u03B9 \u0392 edit_act_inverseResolution=\u0391\u03BD\u03C4\u03AF\u03C3\u03C4\u03C1\u03BF\u03C6\u03B7 \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 edit_act_inverseResolution_tooltip=\u0397 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03BD\u03B5\u03C4\u03B1\u03B9 \u03CC\u03C4\u03B1\u03BD \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B1 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03B1\u03C0\u03CC \u03C4\u03BF "\u0392" \u03AD\u03C7\u03BF\u03C5\u03BD \u03C3\u03C5\u03C3\u03C7\u03B5\u03C4\u03B9\u03C3\u03C4\u03B5\u03AF edit_act_showAllArrows=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B2\u03B5\u03BB\u03CE\u03BD edit_act_alt=\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03CC \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF: edit_act_alt_tooltip=\u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF \u03C0\u03BF\u03C5 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03C9\u03BC\u03AD\u03BD\u03B1 \u03BA\u03B1\u03B9 \u03C3\u03B5 \u03BC\u03B7 \u03C0\u03C1\u03BF\u03C3\u03B4\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B1 \u03BA\u03B5\u03BB\u03B9\u03AC. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B5\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03BF\u03CD \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 edit_act_grid=\u03A0\u03BB\u03AD\u03B3\u03BC\u03B1 edit_act_grid_A=\u03A0\u03BB\u03AD\u03B3\u03BC\u03B1 \u0391 edit_act_grid_B=\u03A0\u03BB\u03AD\u03B3\u03BC\u03B1 \u0392 edit_act_grid_layout=\u0394\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 edit_act_grid_relationship=\u03A3\u03C7\u03AD\u03C3\u03B7 edit_seq_activity_header=\u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 edit_seq_tag_header=\u03B5\u03C4\u03B9\u03BA\u03AD\u03C4\u03B1 edit_seq_jump_header=\u03BC\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03B5 edit_seq_activity=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1: edit_seq_tag=\u0395\u03C4\u03B9\u03BA\u03AD\u03C4\u03B1: edit_seq_description=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE: edit_seq_auto=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 edit_seq_delay=\u039A\u03B1\u03B8\u03C5\u03C3\u03C4\u03AD\u03C1\u03B7\u03C3\u03B7: edit_seq_action_fwd=\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03BC\u03C0\u03C1\u03BF\u03C3\u03C4\u03AC edit_seq_action_back=\u03A0\u03AF\u03C3\u03C9 edit_seq_action_jump=\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03B5 edit_seq_action_stop=\u0394\u03B9\u03B1\u03BA\u03BF\u03C0\u03AE edit_seq_action_return=\u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE edit_seq_action_exit=\u0388\u03BE\u03BF\u03B4\u03BF\u03C2 \u03B1\u03C0\u03CC JClic edit_seq_arrow_fwd=\u039C\u03C0\u03C1\u03BF\u03C3\u03C4\u03AC: edit_seq_arrow_back=\u03A0\u03AF\u03C3\u03C9: edit_seq_action=\u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1: edit_seq_button_enabled=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03BA\u03BF\u03C5\u03BC\u03C0\u03B9\u03BF\u03CD edit_seq_project=\u0388\u03C1\u03B3\u03BF Jclic: edit_act_absolute=\u0398\u03AD\u03C3\u03B7 \u03C4\u03B9\u03BC\u03AE\u03C2 edit_act_absolute_tooltip=\u03A4\u03BF \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B8\u03B1 \u03C4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C4\u03B7\u03B8\u03B5\u03AF \u03C3\u03C4\u03B7\u03BD \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03B8\u03AD\u03C3\u03B7 \u03C4\u03C9\u03BD \u03C3\u03C5\u03BD\u03C4\u03B5\u03C4\u03B1\u03B3\u03BC\u03AD\u03BD\u03C9\u03BD \u03A7 \u03BA\u03B1\u03B9 \u03A5 edit_act_location=\u03A4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C3\u03AF\u03B1: edit_seq_newElement=\u039D\u03AD\u03B1 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 edit_seq_newElement_tooltip=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03BD\u03AD\u03BF\u03C5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C3\u03C4\u03B7\u03BD \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_seq_newElement_msg=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BD\u03AD\u03B1 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 edit_seq_newElement_error_noAct=\u0394\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03B7\u03B8\u03B5\u03AF \u03BC\u03B9\u03B1 \u03BA\u03B1\u03B9\u03BD\u03BF\u03CD\u03C1\u03B3\u03B9\u03B1 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1 \u03C7\u03C9\u03C1\u03AF\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1! edit_seq_newElement_error_emptyList=\u03A4\u03BF \u03AD\u03C1\u03B3\u03BF \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2! \u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD \u03C3\u03B5 \u03BA\u03B5\u03BD\u03CC \u03AD\u03C1\u03B3\u03BF. edit_seq_jump_msg=\u03A3\u03C4\u03CC\u03C7\u03BF\u03C2 \u03BC\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7\u03C2: edit_seq_jump_title=\u03A3\u03C4\u03CC\u03C7\u03BF\u03C2 \u03BC\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7\u03C2 edit_act_newActivity_tooltip=\u03A0\u03C1\u03CC\u03C3\u03B8\u03B7\u03BA\u03B7 \u03BD\u03AD\u03B1\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03C3\u03C4\u03BF \u03AD\u03C1\u03B3\u03BF edit_act_prompt_class=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_prompt_name=\u038C\u03BD\u03BF\u03BC\u03B1 edit_act_newActivity_msg=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF\u03BD \u03C4\u03CD\u03C0\u03BF \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03B5\u03C4\u03B5 \u03BA\u03B1\u03B9 \u03B4\u03CE\u03C3\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03CC\u03BD\u03BF\u03BC\u03B1: edit_act_newActivity_error_noAct=\u03A0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03C4\u03B5 \u03C4\u03CD\u03C0\u03BF \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2! edit_act_newActivity_error_noName=\u03A0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1! edit_act_newActivity_error_creating=\u0391\u03B4\u03CD\u03BD\u03B1\u03C4\u03B7 \u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_newActivity_class=\u038C\u03BD\u03BF\u03BC\u03B1 \u03BA\u03B1\u03C4\u03B7\u03B3\u03BF\u03C1\u03AF\u03B1\u03C2 Java: edit_text_act_format=\u039C\u03BF\u03C1\u03C6\u03AE edit_text_act_answer=\u0391\u03C0\u03AC\u03BD\u03C4\u03B7\u03C3\u03B7 edit_text_act_popup=\u0391\u03BD\u03B1\u03B4\u03C5\u03CC\u03BC\u03B5\u03BD\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF edit_text_act_answer_label=\u0388\u03B3\u03BA\u03C5\u03C1\u03B5\u03C2 \u03B1\u03C0\u03B1\u03BD\u03C4\u03AE\u03C3\u03B5\u03B9\u03C2 edit_list_newElement_tooltip=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BD\u03AD\u03B1\u03C2 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD edit_list_editElement_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7\u03C2 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD edit_list_deleteElement_tooltip=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7\u03C2 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD edit_list_upBtn_tooltip=\u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03C0\u03AC\u03BD\u03C9 edit_list_downBtn_tooltip=\u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03BA\u03AC\u03C4\u03C9 edit_list_newValue=\u039D\u03AD\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: edit_list_addElement=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BD\u03AD\u03B1\u03C2 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD edit_list_modifyValue=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 edit_text_act_target=\u03A0\u03C1\u03BF\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 edit_text_act_maxLen=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03BC\u03AE\u03BA\u03BF\u03C2: edit_text_act_maxLen_tooltip=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C2 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD \u03C4\u03B7\u03C2 \u03B1\u03C0\u03AC\u03BD\u03C4\u03B7\u03C3\u03B7\u03C2: edit_text_act_fillingChar=\u0393\u03AD\u03BC\u03B9\u03C3\u03BC\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B1 edit_text_act_fillingChar_tooltip=\u039F\u03B9 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B5\u03C2 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B4\u03B7\u03BB\u03CE\u03BD\u03BF\u03C5\u03BD \u03C4\u03BF \u03BA\u03B5\u03BD\u03CC edit_text_act_iniLen=\u0391\u03C1\u03C7\u03B9\u03BA\u03CC \u03BC\u03AE\u03BA\u03BF\u03C2: edit_text_act_iniLen_tooltip=\u039F \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C4\u03C9\u03BD \u03C3\u03C5\u03BC\u03C0\u03BB\u03B7\u03C1\u03C9\u03BC\u03AD\u03BD\u03C9\u03BD \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD \u03B8\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03B9\u03C3\u03C4\u03B5\u03AF \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03AD\u03BD\u03B1\u03C1\u03BE\u03B7 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2. edit_text_act_iniText=\u0391\u03C1\u03C7\u03B9\u03BA\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: edit_text_act_iniText_tooltip=\u03A4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03AD\u03BD\u03B1\u03C1\u03BE\u03B7 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2. edit_text_act_list=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03CE\u03BD: edit_text_act_list_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1\u03C2 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03B7\u03BD \u03BF\u03C0\u03BF\u03AF\u03B1 \u03BF \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03B9 \u03BC\u03AF\u03B1: edit_text_act_check_title=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2 \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7\u03C2 edit_text_act_popup_no=\u03A6\u03C1\u03B1\u03B3\u03AE \u03B1\u03BD\u03B1\u03B4\u03C5\u03CC\u03BC\u03B5\u03BD\u03C9\u03BD \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03C9\u03BD edit_text_act_popup_always=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B1\u03BD\u03AC\u03B4\u03C5\u03C3\u03B7 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5 edit_text_act_popup_onError=\u0391\u03BD\u03AC\u03B4\u03C5\u03C3\u03B7 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5 \u03C3\u03B5 \u03C0\u03B5\u03C1\u03AF\u03C0\u03C4\u03C9\u03C3\u03B7 \u03BB\u03AC\u03B8\u03BF\u03C5\u03C2 edit_text_act_popup_onDemand=\u0391\u03BD\u03AC\u03B4\u03C5\u03C3\u03B7 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5 \u03BC\u03B5 F1 edit_text_act_popup_type=\u03A4\u03CD\u03C0\u03BF\u03C2: edit_text_act_popup_delay=\u039A\u03B1\u03B8\u03C5\u03C3\u03C4\u03AD\u03C1\u03B7\u03C3\u03B7 \u03B1\u03BD\u03AC\u03B4\u03C5\u03C3\u03B7\u03C2 \u03C0\u03B1\u03C1\u03B1\u03B8\u03CD\u03C1\u03BF\u03C5: edit_text_act_popup_maxTime=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2: edit_text_act_popup_onlyPlay=\u039C\u03CC\u03BD\u03BF \u03AE\u03C7\u03BF\u03C2 edit_text_act_err_noSelection=\u03A0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03B1\u03C0\u03CC\u03C3\u03C0\u03B1\u03C3\u03BC\u03B1 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B1\u03BD \u03C3\u03C4\u03BF\u03C7\u03B5\u03CD\u03B5\u03C4\u03B5 \u03C3\u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B5\u03BD\u03CC\u03C2 \u03BD\u03AD\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5! edit_text_act_err_badCharInSelection=\u03A4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03BB\u03B1\u03BC\u03B2\u03AC\u03BD\u03B5\u03B9 \u03C0\u03B1\u03C1\u03AC\u03B3\u03C1\u03B1\u03C6\u03BF \u03C0\u03BF\u03C5 \u03B4\u03B5\u03BD \u03B4\u03B9\u03B1\u03B8\u03AD\u03C4\u03B5\u03B9 \u03C3\u03C4\u03B7\u03BB\u03BF\u03B8\u03AD\u03C4\u03B5\u03C2. edit_text_act_err_nestedTargets=\u039F\u03B9 \u03C3\u03C4\u03CC\u03C7\u03BF\u03B9 \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03BF\u03CD\u03BD \u03BD\u03B1 \u03C4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C4\u03B7\u03B8\u03BF\u03CD\u03BD edit_text_act_err_cellInTarget=\u039F \u03C0\u03C1\u03BF\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BA\u03B5\u03BB\u03B9\u03AC edit_text_act_pageBgColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C7\u03B1\u03C1\u03C4\u03B9\u03BF\u03CD: edit_text_act_editStylesBtn=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C3\u03C4\u03C5\u03BB \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5... edit_text_act_mainStyle=\u039A\u03CD\u03C1\u03B9\u03BF \u03C3\u03C4\u03C5\u03BB: edit_text_act_tabSpc=\u0394\u03B9\u03AC\u03C3\u03C4\u03B7\u03BC\u03B1 \u03C3\u03C4\u03B7\u03BB\u03BF\u03B8\u03AD\u03C4\u03B7: edit_text_act_tabSize=\u0394\u03B9\u03B1\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03B1 \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03C3\u03C4\u03B7\u03BB\u03BF\u03B8\u03B5\u03C4\u03CE\u03BD: edit_text_act_colors=\u03A7\u03C1\u03CE\u03BC\u03B1\u03C4\u03B1: edit_text_act_targetStyle=\u03A0\u03C1\u03BF\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C7\u03C1\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD: edit_text_act_errorStyle=\u03A7\u03C1\u03CE\u03BC\u03B1\u03C4\u03B1 \u03C3\u03C6\u03B1\u03BB\u03BC\u03AC\u03C4\u03C9\u03BD: edit_text_act_preview=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7: edit_text_act_styleSample_default_start=\u03A4\u03C5\u03C0\u03B9\u03BA\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF edit_text_act_styleSample_target=\u03C3\u03C4\u03CC\u03C7\u03BF\u03C2 edit_text_act_styleSample_error=\u03C3\u03C6\u03AC\u03BB\u03BC\u03B1 edit_text_act_styleSample_default_fill=\u03C4\u03C5\u03C0\u03B9\u03BA\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF edit_text_act_styleSample_default_end=\u03C4\u03C5\u03C0\u03B9\u03BA\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF. edit_text_act_warnDeleteTarget=\u03A0\u03C1\u03BF\u03B5\u03B9\u03B4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7: \u0391\u03C5\u03C4\u03AE \u03B7 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u03B8\u03B1 \u03C5\u03C0\u03B5\u03C1\u03B9\u03C3\u03C7\u03CD\u03C3\u03B5\u03B9 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03C4\u03C1\u03AD\u03C7\u03BF\u03BD\u03C4\u03B1 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03C3\u03C4\u03CC\u03C7\u03BF. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03C3\u03C5\u03BD\u03B5\u03C7\u03AF\u03C3\u03B5\u03C4\u03B5; edit_text_act_prevScreen_title=\u03A0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03B7 \u03BF\u03B8\u03CC\u03BD\u03B7... edit_text_act_prevScreen_no=\u039A\u03B1\u03BC\u03AF\u03B1 \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03C1\u03B9\u03BD \u03C4\u03B7\u03BD \u03AD\u03BD\u03B1\u03C1\u03BE\u03B7 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_text_act_prevScreen_original=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C0\u03BB\u03AE\u03C1\u03BF\u03C5\u03C2 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C4\u03B7\u03C2 \u03AC\u03C3\u03BA\u03B7\u03C3\u03B7\u03C2. edit_text_act_prevScreen_special=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03B1\u03C5\u03C4\u03BF\u03CD \u03C4\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5: edit_text_act_prevScreen_time=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2: edit_text_act_edit_target=\u03A3\u03C4\u03CC\u03C7\u03BF\u03C2... edit_text_act_checkButton_show=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7\u03C2 edit_text_act_checkButtonText=\u03A0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5; edit_text_act_checkCase=\u03A4\u03B1\u03AF\u03C1\u03B9\u03B1\u03C3\u03BC\u03B1 \u03C0\u03B5\u03B6\u03CE\u03BD/\u03BA\u03B5\u03C6\u03B1\u03BB\u03B1\u03AF\u03C9\u03BD edit_text_act_checkAccents=\u0395\u03BE\u03AD\u03C4\u03B1\u03C3\u03B7 \u03C4\u03BF\u03BD\u03B9\u03C3\u03BC\u03BF\u03CD \u03BA\u03B1\u03B9 \u03B5\u03B9\u03B4\u03B9\u03BA\u03CE\u03BD \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD edit_text_act_checkPunct=\u0395\u03BE\u03AD\u03C4\u03B1\u03C3\u03B7 \u03C3\u03B7\u03BC\u03B5\u03AF\u03C9\u03BD \u03C3\u03C4\u03AF\u03BE\u03B7\u03C2 edit_text_act_checkDoubleSpc=\u0395\u03C0\u03B9\u03C4\u03C1\u03AD\u03C0\u03BF\u03BD\u03C4\u03B1\u03B9 \u03B5\u03C0\u03B1\u03BD\u03B1\u03BB\u03B1\u03BC\u03B2\u03B1\u03BD\u03CC\u03BC\u03B5\u03BD\u03B1 \u03B4\u03B9\u03B1\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03B1 edit_text_act_checkOptions=\u039A\u03C1\u03B9\u03C4\u03AE\u03C1\u03B9\u03B1 edit_text_act_checkAutoJump=\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03BF\u03BD \u03B5\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF \u03C3\u03C4\u03CC\u03C7\u03BF \u03CC\u03C4\u03B1\u03BD \u03C3\u03C5\u03BC\u03C0\u03BB\u03B7\u03C1\u03C9\u03B8\u03B5\u03AF edit_text_act_checkForceOk=\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03BC\u03CC\u03BD\u03BF \u03BC\u03B5\u03C4\u03AC \u03C3\u03C9\u03C3\u03C4\u03AE \u03C0\u03C1\u03CC\u03B2\u03BB\u03B5\u03C8\u03B7 edit_text_act_checkDetail=\u0395\u03C0\u03B9\u03C3\u03AE\u03BC\u03B1\u03BD\u03C3\u03B7 \u03BB\u03B1\u03B8\u03CE\u03BD, \u03B3\u03C1\u03AC\u03BC\u03BC\u03B1 \u03C0\u03C1\u03BF\u03C2 \u03B3\u03C1\u03AC\u03BC\u03BC\u03B1 edit_text_act_checkDetail_params=\u03A0\u03B1\u03C1\u03AC\u03BC\u03B5\u03C4\u03C1\u03BF\u03B9 \u03B1\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7\u03C2 \u03B1\u03BB\u03B3\u03BF\u03C1\u03AF\u03B8\u03BC\u03C9\u03BD: edit_text_act_checkDetail_steps=\u0392\u03AE\u03BC\u03B1\u03C4\u03B1: edit_text_act_checkDetail_field=\u03A0\u03B5\u03B4\u03AF\u03BF \u03B5\u03BE\u03B5\u03C1\u03B5\u03CD\u03BD\u03B7\u03C3\u03B7\u03C2: edit_text_act_defaultCheckButtonText=\u0388\u03BB\u03B5\u03B3\u03C7\u03BF\u03C2 edit_text_act_advancedCorrectionOptions=\u0391\u03BD\u03AC\u03BB\u03C5\u03C3\u03B7 \u03B1\u03C0\u03AC\u03BD\u03C4\u03B7\u03C3\u03B7\u03C2 edit_text_act_check_bt=\u0394\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7... edit_text_act_checkButton=\u03A0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7\u03C2 edit_text_act_checkProgress=\u03A0\u03C1\u03CC\u03BF\u03B4\u03BF\u03C2 edit_text_act_typeBtn=\u03A4\u03CD\u03C0\u03BF\u03C2... edit_text_act_orderParagraphs=\u03A4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03C0\u03B1\u03C1\u03B1\u03B3\u03C1\u03AC\u03C6\u03C9\u03BD edit_text_act_orderWords=\u03A4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03BB\u03AD\u03BE\u03B5\u03C9\u03BD edit_text_act_order_amongstPar=\u0391\u03BD\u03B1\u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03BB\u03AD\u03BE\u03B5\u03C9\u03BD \u03BC\u03AD\u03C3\u03B1 \u03C3\u03C4\u03B9\u03C2 \u03C0\u03B1\u03C1\u03B1\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5\u03C2 edit_text_act_type_title=\u0395\u03AF\u03B4\u03BF\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_text_act_warnChangeType=\u0391\u03C5\u03C4\u03AE \u03B7 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u03B8\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03AD\u03C3\u03B5\u03B9 \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03C5\u03C0\u03AC\u03C1\u03C7\u03BF\u03BD\u03C4\u03B5\u03C2 \u03C3\u03C4\u03CC\u03C7\u03BF\u03C5\u03C2. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03C3\u03C5\u03BD\u03B5\u03C7\u03AF\u03C3\u03B5\u03C4\u03B5; edit_text_act_identWords=\u0391\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03BB\u03AD\u03BE\u03B5\u03C9\u03BD edit_text_act_identChars=\u0391\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD edit_media_change_name=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03BF\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2... edit_media_change_file=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5... edit_media_includeInZip=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C3\u03B5 \u03C3\u03C5\u03BC\u03C0\u03B9\u03B5\u03C3\u03BC\u03AD\u03BD\u03BF (.zip) \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF edit_media_type=\u0395\u03AF\u03B4\u03BF\u03C2 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03BF\u03C5: edit_media_size=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5: edit_media_show_type=\u03A4\u03CD\u03C0\u03BF\u03B9 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD: edit_media_preview=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD edit_media_preview_tooltip=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B7\u03C3\u03B7 \u03C0\u03B7\u03B3\u03CE\u03BD \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD edit_media_rename=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03BF\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C0\u03B7\u03B3\u03AE\u03C2: edit_media_rename_title=\u039C\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 edit_media_rename_prompt=\u039D\u03AD\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1: edit_media_rename_invalid=\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C0\u03B7\u03B3\u03AE\u03C2! edit_media_rename_exists=\u03A5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03BC\u03B9\u03B1 \u03B1\u03BA\u03CC\u03BC\u03B7 \u03C0\u03B7\u03B3\u03AE \u03BC\u03B5 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1! \u039A\u03AC\u03B8\u03B5 \u03C0\u03B7\u03B3\u03AE \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9 \u03AD\u03BD\u03B1 \u03BC\u03BF\u03BD\u03B1\u03B4\u03B9\u03BA\u03CC \u03CC\u03BD\u03BF\u03BC\u03B1. edit_media_chfile_invalid=\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF! err_media_chfile_different=\u03A4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C4\u03BF\u03C5 \u03AF\u03B4\u03B9\u03BF\u03C5 \u03B5\u03AF\u03B4\u03BF\u03C5\u03C2 edit_media_font_error=\u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2! edit_media_save_file=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 (\u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03B1\u03C0\u03CC ZIP) edit_media_refresh_file=\u0395\u03BD\u03B7\u03BC\u03AD\u03C1\u03C9\u03C3\u03B7 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD \u03B1\u03C0\u03CC \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF edit_media_warn_zipFileNotExternal=\u0391\u03C5\u03C4\u03CC \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03BD\u03B1 "\u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03CC" \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF, \u03B1\u03BB\u03BB\u03AC \u03AD\u03BD\u03B1 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C0\u03BF\u03C5 \u03B2\u03C1\u03AF\u03C3\u03BA\u03B5\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03AD\u03BD\u03B1 \u03C3\u03C5\u03BC\u03C0\u03B9\u03B5\u03C3\u03BC\u03AD\u03BD\u03BF \u03C0\u03B1\u03BA\u03AD\u03C4\u03BF. \u0393\u03B9\u03B1 \u03BD\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03C4\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B4\u03C5\u03BD\u03B1\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1, \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03B9\u03C3\u03C4\u03B5\u03AF \u03AD\u03BD\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03BC\u03B5 \u03C4\u03BF \u03AF\u03B4\u03B9\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C3\u03C4\u03BF\u03BD \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF \u03CC\u03C0\u03BF\u03C5 \u03B2\u03C1\u03AF\u03C3\u03BA\u03B5\u03C4\u03B1\u03B9 \u03C4\u03BF \u03C3\u03C5\u03BC\u03C0\u03B9\u03B5\u03C3\u03BC\u03AD\u03BD\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF. edit_activities=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 edit_sequences=\u0391\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B5\u03C2 edit_media=\u0392\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD edit_media_tooltip=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD \u03BA\u03B1\u03B9 \u03AC\u03BB\u03BB\u03C9\u03BD \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03AD\u03C1\u03B3\u03BF edit_activities_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BA\u03B1\u03B9 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD \u03AD\u03C1\u03B3\u03BF\u03C5 edit_sequences_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BA\u03B1\u03B9 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03B9\u03CE\u03BD \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD edit_project_title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2: edit_project_title_tooltip=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_project=\u0388\u03C1\u03B3\u03BF edit_project_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B9\u03B4\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_project_description=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE: edit_project_description_tooltip=\u0393\u03B5\u03BD\u03B9\u03BA\u03AE \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_project_area=\u0393\u03BD\u03C9\u03C3\u03C4\u03B9\u03BA\u03AD\u03C2 \u03C0\u03B5\u03C1\u03B9\u03BF\u03C7\u03AD\u03C2: edit_project_area_tooltip=\u0394\u03B9\u03B4\u03B1\u03BA\u03C4\u03B9\u03BA\u03AC \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03B1 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_project_level=\u0393\u03BD\u03C9\u03C3\u03C4\u03B9\u03BA\u03AC \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03B1: edit_project_level_tooltip=\u0395\u03BA\u03C0\u03B1\u03B9\u03B4\u03B5\u03C5\u03C4\u03B9\u03BA\u03AC \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03B1 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_project_descriptors=\u039B\u03AD\u03BE\u03B5\u03B9\u03C2 \u03BA\u03BB\u03B5\u03B9\u03B4\u03B9\u03AC: edit_project_descriptors_tooltip=\u039B\u03AD\u03BE\u03B5\u03B9\u03C2 \u03BA\u03BB\u03B5\u03B9\u03B4\u03B9\u03AC \u03B3\u03B9\u03B1 \u03C4\u03BF \u03AD\u03C1\u03B3\u03BF (\u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03BC\u03B5 \u03BA\u03CC\u03BC\u03BC\u03B1) edit_project_languages=\u0393\u03BB\u03CE\u03C3\u03C3\u03B5\u03C2: edit_project_languages_tooltip=\u0393\u03BB\u03CE\u03C3\u03C3\u03B5\u03C2 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03AD\u03C1\u03B3\u03BF edit_project_languages_modify=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7\u03C2 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1\u03C2 edit_project_languages_add=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1\u03C2 edit_project_languages_select=ISO-639 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1\u03C2: edit_project_authors=\u03A3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF\u03C2: edit_project_authors_tooltip=\u0386\u03C4\u03BF\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03C3\u03C5\u03BD\u03B5\u03B9\u03C3\u03AD\u03C6\u03B5\u03C1\u03B1\u03BD \u03C3\u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B1\u03C5\u03C4\u03BF\u03CD \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_project_author_name=\u038C\u03BD\u03BF\u03BC\u03B1 edit_project_author_mail=\u0397\u03BB\u03B5\u03BA\u03C4\u03C1\u03BF\u03BD\u03B9\u03BA\u03AE \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7: edit_project_author_rol=\u03A1\u03CC\u03BB\u03BF\u03C2: edit_project_author_organization=\u039F\u03C1\u03B3\u03B1\u03BD\u03B9\u03C3\u03BC\u03CC\u03C2: edit_project_author_comments=\u03A3\u03C7\u03CC\u03BB\u03B9\u03B1: edit_project_author_url=URL: edit_project_author_name_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1 (\u03B1\u03C0\u03B1\u03B9\u03C4\u03B5\u03AF\u03C4\u03B1\u03B9) edit_project_author_mail_tooltip=\u0397\u03BB\u03B5\u03BA\u03C4\u03C1\u03BF\u03BD\u03B9\u03BA\u03AE \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03C9\u03BD (\u03C0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC) edit_project_author_rol_tooltip=\u03A1\u03CC\u03BB\u03BF\u03C2 \u03B1\u03C4\u03CC\u03BC\u03BF\u03C5 \u03C3\u03C4\u03BF \u03AD\u03C1\u03B3\u03BF: \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03CC\u03C2, \u03C3\u03C5\u03BD\u03B5\u03C1\u03B3\u03AC\u03C4\u03B7\u03C2, \u03C0\u03C1\u03BF\u03BC\u03B7\u03B8\u03B5\u03C5\u03C4\u03AE\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD, \u03AE\u03C7\u03C9\u03BD... (\u03C0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC) edit_project_author_organization_tooltip=\u03A3\u03C7\u03BF\u03BB\u03B5\u03AF\u03BF, \u03C0\u03B1\u03BD\u03B5\u03C0\u03B9\u03C3\u03C4\u03AE\u03BC\u03B9\u03BF, \u03C3\u03CD\u03BB\u03BB\u03BF\u03B3\u03BF\u03C2....(\u03C0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC) edit_project_author_url_tooltip=\u03A0\u03C1\u03BF\u03C3\u03C9\u03C0\u03B9\u03BA\u03AE \u03B9\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 (\u03C0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC) edit_project_author_comments_tooltip=\u03A0\u03B5\u03B4\u03AF\u03BF \u03B3\u03B9\u03B1 \u03AC\u03BB\u03BB\u03B5\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 (\u03C0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC) edit_project_author_info=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1: edit_project_author_add=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1 \u03C3\u03C4\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 edit_project_author_edit=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1 edit_project_org_name=\u038C\u03BD\u03BF\u03BC\u03B1: edit_project_org_name_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C3\u03C7\u03BF\u03BB\u03B5\u03AF\u03BF\u03C5 edit_project_org_mail=\u0397\u03BB\u03B5\u03BA\u03C4\u03C1\u03BF\u03BD\u03B9\u03BA\u03AE \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7: edit_project_org_mail_tooltip=\u0397\u03BB\u03B5\u03BA\u03C4\u03C1\u03BF\u03BD\u03B9\u03B8\u03BA\u03AE \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 \u03C3\u03C7\u03BF\u03BB\u03B5\u03AF\u03BF\u03C5 edit_project_org_url=URL: edit_project_org_url_tooltip=\u0399\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 \u03C3\u03C7\u03BF\u03BB\u03B5\u03AF\u03BF\u03C5 edit_project_org_address=\u0394\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7: edit_project_org_address_tooltip=\u03A4\u03B1\u03C7\u03C5\u03B4\u03C1\u03BF\u03BC\u03B9\u03BA\u03AE \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 edit_project_org_pc=\u0397/\u03A5: edit_project_org_pc_tooltip=\u03A4\u03B1\u03C7\u03C5\u03B4\u03C1\u03BF\u03BC\u03B9\u03BA\u03CC\u03C2 \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1\u03C2 edit_project_org_city=\u03A0\u03CC\u03BB\u03B7: edit_project_org_city_tooltip=\u03A0\u03CC\u03BB\u03B7 edit_project_org_country=\u03A7\u03CE\u03C1\u03B1: edit_project_org_state=\u03A0\u03BF\u03BB\u03B9\u03C4\u03B5\u03AF\u03B1: edit_project_org_comments=\u03A3\u03C7\u03CC\u03BB\u03B9\u03B1: edit_project_org=\u03A3\u03C7\u03BF\u03BB\u03B5\u03AF\u03B1: edit_project_org_tooltip=\u03A3\u03C7\u03BF\u03BB\u03B5\u03AF\u03BF \u03AE \u03AC\u03BB\u03BB\u03BF \u03AF\u03B4\u03C1\u03C5\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03AD\u03C7\u03B5\u03B9 \u03C3\u03C4\u03BF \u03AD\u03C1\u03B3\u03BF! edit_project_org_info=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 \u03BF\u03C1\u03B3\u03B1\u03BD\u03B9\u03C3\u03BC\u03BF\u03CD: edit_project_org_add=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BF\u03C1\u03B3\u03B1\u03BD\u03B9\u03C3\u03BC\u03BF\u03CD edit_project_org_edit=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03BF\u03C1\u03B3\u03B1\u03BD\u03B9\u03C3\u03BC\u03BF\u03CD edit_project_org_country_tooltip=\u03A7\u03CE\u03C1\u03B1, \u03BF\u03BC\u03BF\u03C3\u03C0\u03BF\u03BD\u03B4\u03AF\u03B1, \u03AD\u03BD\u03C9\u03C3\u03B7 ... edit_project_org_state_tooltip=\u039F\u03BC\u03BF\u03C3\u03C0\u03BF\u03BD\u03B4\u03B9\u03B1\u03BA\u03AE \u03C0\u03BF\u03BB\u03B9\u03C4\u03B5\u03AF\u03B1, \u03BA\u03BF\u03B9\u03BD\u03CC\u03C4\u03B7\u03C4\u03B1, \u03C0\u03B5\u03C1\u03B9\u03BF\u03C7\u03AE ... edit_project_org_comments_tooltip=\u0386\u03BB\u03BB\u03B5\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2... edit_project_rev_date=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 edit_project_rev_date_tooltip=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03B1\u03BD\u03B1\u03B8\u03B5\u03CE\u03C1\u03B7\u03C3\u03B7\u03C2 edit_project_rev_authors=\u03A3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF\u03C2: edit_project_rev_authors_tooltip=\u03A3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF\u03C2 \u03B1\u03BD\u03B1\u03B8\u03B5\u03CE\u03C1\u03B7\u03C3\u03B7\u03C2 edit_project_rev_description=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE: edit_project_rev_description_tooltip=\u03A3\u03CD\u03BD\u03C4\u03BF\u03BC\u03B7 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C4\u03C9\u03BD \u03B1\u03BB\u03BB\u03B1\u03B3\u03CE\u03BD \u03C0\u03BF\u03C5 \u03AD\u03B3\u03B9\u03BD\u03B1\u03BD edit_project_rev_comments=\u03A3\u03C7\u03CC\u03BB\u03B9\u03B1: edit_project_rev_comments_tooltip=\u0386\u03BB\u03BB\u03B5\u03C2 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AD\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 edit_project_rev=\u0391\u03BD\u03B1\u03B8\u03B5\u03C9\u03C1\u03AE\u03C3\u03B5\u03B9\u03C2: edit_project_rev_tooltip=\u0399\u03C3\u03C4\u03BF\u03C1\u03B9\u03BA\u03CC \u03C4\u03C9\u03BD \u03BA\u03C5\u03C1\u03B9\u03CC\u03C4\u03B5\u03C1\u03C9\u03BD \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03C9\u03BD \u03C0\u03BF\u03C5 \u03AD\u03B3\u03B9\u03BD\u03B1\u03BD \u03C3\u03C4\u03BF \u03AD\u03C1\u03B3\u03BF edit_project_rev_add=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BA\u03B1\u03C4\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03B1\u03BD\u03B1\u03B8\u03B5\u03C9\u03C1\u03AE\u03C3\u03B5\u03C9\u03BD edit_project_rev_edit=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03BA\u03B1\u03C4\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03B1\u03BD\u03B1\u03B8\u03B5\u03C9\u03C1\u03AE\u03C3\u03B5\u03C9\u03BD edit_project_rev_info=\u0394\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 \u03B1\u03BD\u03B1\u03B8\u03B5\u03CE\u03C1\u03B7\u03C3\u03B7\u03C2 edit_media_objects=\u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03B1 edit_media_object=\u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF edit_evsounds_start=\u0388\u03BD\u03B1\u03C1\u03BE\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2: edit_evsounds_click=\u039A\u03AC\u03BD\u03C4\u03B5 \u03BA\u03BB\u03B9\u03BA \u03C3\u03C4\u03BF \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: edit_evsounds_actionError=\u0395\u03C3\u03C6\u03B1\u03BB\u03BC\u03AD\u03BD\u03B7 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1: edit_evsounds_actionOk=\u03A3\u03C9\u03C3\u03C4\u03AE \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1: edit_evsounds_finishedError=\u0397 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5 \u03BC\u03B5 \u03BB\u03AC\u03B8\u03B7: edit_evsounds_finishedOk=\u0397 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5 \u03C3\u03C9\u03C3\u03C4\u03AC: edit_project_rev_err_nodesc=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u03A4\u03BF \u03C0\u03B5\u03B4\u03AF\u03BF \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03BC\u03B5\u03AF\u03BD\u03B5\u03B9 \u03BA\u03B5\u03BD\u03CC: edit_evsounds_dlg_title=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03AE\u03C7\u03BF\u03C5 \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD\u03C4\u03C9\u03BD edit_project_evsounds=\u0389\u03C7\u03BF\u03B9 \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD\u03C4\u03C9\u03BD: edit_project_evsounds_tooltip=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C3\u03C5\u03B3\u03BA\u03B5\u03BA\u03C1\u03B9\u03BC\u03AD\u03BD\u03BF \u03AE\u03C7\u03BF \u03B3\u03B9\u03B1 \u03BA\u03AC\u03B8\u03B5 \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD \u03C4\u03BF\u03C5 JClic edit_act_evsounds=\u0389\u03C7\u03BF\u03B9 \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD\u03C4\u03C9\u03BD: edit_act_evsounds_tooltip=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C3\u03C5\u03B3\u03BA\u03B5\u03BA\u03C1\u03B9\u03BC\u03AD\u03BD\u03BF \u03AE\u03C7\u03BF \u03B3\u03B9\u03B1 \u03BA\u03AC\u03B8\u03B5 \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD \u03C4\u03BF\u03C5 JClic edit_evsounds_default=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C2 \u03AE\u03C7\u03BF\u03C2 edit_evsounds_disabled=\u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF edit_evsounds_chk_tooltip=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03AE \u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03AE\u03C7\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD edit_evsounds_select_tooltip=\u039A\u03AC\u03BD\u03B5 \u03BA\u03BB\u03B9\u03BA \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03B9\u03C2 \u03AE\u03C7\u03BF \u03B3\u03B9\u03B1 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD \u03AE \u03B1\u03C0\u03BF\u03B5\u03C0\u03AD\u03BB\u03B5\u03BE\u03B5 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03B9\u03C2 \u03C4\u03BF\u03BD \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03AE\u03C7\u03BF action_newProject_caption=\u039D\u03AD\u03BF \u03AD\u03C1\u03B3\u03BF action_newProject_keys=NN action_newProject_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 Jclic edit_arith_op_from=\u0391\u03C0\u03CC: edit_arith_op_from_tooltip=\u0395\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03C4\u03B9\u03BC\u03AE \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE edit_arith_op_to=\u03A0\u03C1\u03BF\u03C2: edit_arith_op_to_tooltip=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03B7 \u03C4\u03B9\u03BC\u03AE \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE edit_arith_op_with=\u039C\u03B5: edit_arith_op_with_tooltip=\u0395\u03AC\u03BD \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03B5\u03AF, \u03BF \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE\u03C2 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03B5\u03C0\u03AF\u03C3\u03B7\u03C2 \u03BD\u03B1 \u03C0\u03AC\u03C1\u03B5\u03B9 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7\u03BD \u03C4\u03B9\u03BC\u03AE edit_arith_op_fromList=\u0388\u03BD\u03B1 \u03B1\u03C0\u03CC \u03C4\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1: edit_arith_op_fromList_tooltip=\u039B\u03AF\u03C3\u03C4\u03B1 \u03C0\u03B9\u03B8\u03B1\u03BD\u03CE\u03BD \u03C4\u03B9\u03BC\u03CE\u03BD \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03CE\u03BD edit_arith_op_decimals=\u0394\u03B5\u03BA\u03B1\u03B4\u03B9\u03BA\u03AC: edit_arith_op_decimals_tooltip=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03B4\u03B5\u03BA\u03B1\u03B4\u03B9\u03BA\u03CE\u03BD \u03C8\u03B7\u03C6\u03AF\u03C9\u03BD \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE edit_arith_op_dec0=# (\u03B1\u03BA\u03AD\u03C1\u03B1\u03B9\u03BF\u03C2) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=\u0391\u03C1\u03C7\u03B9\u03BA\u03CC\u03C2 \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE\u03C2 edit_arith_secondOp=\u0394\u03B5\u03CD\u03C4\u03B5\u03C1\u03BF\u03C2 \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE\u03C2 edit_arith_title=Arith2 for JClic edit_arith_operations=\u03A0\u03C1\u03AC\u03BE\u03B5\u03B9\u03C2: edit_arith_operations_tooltip=\u0395\u03C0\u03AD\u03BB\u03B5\u03BE\u03B5 \u03C4\u03BF \u03B5\u03AF\u03B4\u03BF\u03C2 \u03C4\u03C9\u03BD \u03B5\u03BD\u03B5\u03C1\u03B3\u03B5\u03B9\u03CE\u03BD \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B5\u03BA\u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03BF\u03CD\u03BD edit_arith_operations_plus=\u03A0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C3\u03B7 edit_arith_operations_minus=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 edit_arith_operations_multiply=\u03A0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03B1\u03C3\u03B9\u03B1\u03C3\u03BC\u03CC\u03C2 edit_arith_operations_divide=\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 edit_arith_unknown=\u0386\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF: edit_arith_unknown_tooltip=\u0395\u03C0\u03AD\u03BB\u03B5\u03BE\u03B5 \u03C4\u03BF \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03B5\u03AF \u03C9\u03C2 \u03BF \u03AC\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF\u03C2 edit_arith_unknown_aobx=\u03A4\u03BF \u03B1\u03C0\u03BF\u03C4\u03AD\u03BB\u03B5\u03C3\u03BC\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BF \u03AC\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF\u03C2 edit_arith_unknown_aoxr=\u039F \u03B4\u03B5\u03CD\u03C4\u03B5\u03C1\u03BF\u03C2 \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BF \u03AC\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF\u03C2 edit_arith_unknown_xobr=\u039F \u03C0\u03C1\u03CE\u03C4\u03BF\u03C2 \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BF \u03AC\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF\u03C2 edit_arith_unknown_axbr=\u0386\u03B3\u03BD\u03C9\u03C3\u03C4\u03B7 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 edit_arith_unknown_invert=\u0393\u03C1\u03AC\u03C8\u03B5 \u03C4\u03BF \u03B1\u03C0\u03BF\u03C4\u03AD\u03BB\u03B5\u03C3\u03BC\u03B1 \u03C3\u03C4\u03B7 \u03B1\u03C1\u03C7\u03AE \u03C4\u03B7\u03C2 \u03AD\u03BA\u03C6\u03C1\u03B1\u03C3\u03B7\u03C2 edit_arith_result=\u0391\u03C0\u03BF\u03C4\u03AD\u03BB\u03B5\u03C3\u03BC\u03B1: edit_arith_result_notCarry=\u039C\u03B7\u03BD \u03BC\u03B5\u03C4\u03B1\u03C6\u03AD\u03C1\u03B5\u03B9\u03C2 edit_arith_result_random=\u03A4\u03C5\u03C7\u03B1\u03AF\u03BF edit_arith_result_asc=\u0391\u03CD\u03BE\u03BF\u03C5\u03C3\u03B1 edit_arith_result_order=\u03A4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03BA\u03B1\u03C4\u03AC \u03B1\u03C0\u03BF\u03C4\u03AD\u03BB\u03B5\u03C3\u03BC\u03B1 edit_arith_result_desc=\u03A6\u03B8\u03AF\u03BD\u03BF\u03C5\u03C3\u03B1 edit_arith_result_avoidDup=\u0391\u03C0\u03BF\u03C6\u03C5\u03B3\u03AE \u03B4\u03B9\u03C0\u03BB\u03CC\u03C4\u03C5\u03C0\u03C9\u03BD edit_arith_cond=\u03A3\u03C5\u03BD\u03B8\u03AE\u03BA\u03B5\u03C2: edit_arith_cond_ind=\u03CC\u03BC\u03BF\u03B9\u03B1 edit_arith_cond_agb=\u039F \u03C0\u03C1\u03CE\u03C4\u03BF\u03C2 \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B5\u03B3\u03B1\u03BB\u03CD\u03C4\u03B5\u03C1\u03BF\u03C2 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03B4\u03B5\u03CD\u03C4\u03B5\u03C1\u03BF edit_arith_cond_alb=\u039F \u03C0\u03C1\u03CE\u03C4\u03BF\u03C2 \u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B9\u03BA\u03C1\u03CC\u03C4\u03B5\u03C1\u03BF\u03C2 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03B4\u03B5\u03CD\u03C4\u03B5\u03C1\u03BF edit_arith_cond_tooltip=\u0386\u03BB\u03BB\u03B5\u03C2 \u03C3\u03C5\u03BD\u03B8\u03AE\u03BA\u03B5\u03C2 edit_autocp=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03CC\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD: edit_autocp_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C4\u03CD\u03C0\u03BF\u03C5 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03BF\u03CD \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1. edit_autocp_block=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03CC\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD edit_autocp_btn=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2... edit_autocp_btn_tooltip=\u0394\u03B9\u03B1\u03BC\u03CC\u03C1\u03C6\u03C9\u03C3\u03B7 \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03C0\u03AC\u03C1\u03BF\u03C7\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 edit_data=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD edit_act=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_acp=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C0\u03B1\u03C1\u03BF\u03C7\u03AD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD edit_acp_err_creating=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C3\u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03C0\u03AC\u03C1\u03BF\u03C7\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5! edit_project_author_group=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 edit_project_description_block=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE edit_project_ui_block=\u0394\u03B9\u03B5\u03C0\u03B1\u03C6\u03AE \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 edit_act_description=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE: m_Edit=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=\u039D\u03AD\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE m_Insert_Mnemonic=\u0399 m_View=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE m_View_Mnemonic=V action_editProject_caption=\u0388\u03C1\u03B3\u03BF action_editProject_keys=PP action_editProject_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03AD\u03C1\u03B3\u03BF\u03C5 action_editMedia_caption=\u039C\u03AD\u03C3\u03B1 action_editMedia_keys=MM action_editMedia_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C4\u03B7\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 action_editActivities_caption=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 action_editActivities_keys=AA action_editActivities_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD action_editSeq_caption=\u0391\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B5\u03C2 action_editSeq_keys=SS action_editSeq_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03B9\u03CE\u03BD \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD warn_project_modified=\u03A4\u03BF \u03C0\u03B1\u03C1\u03CC\u03BD \u03AD\u03C1\u03B3\u03BF \u03AD\u03C7\u03B5\u03B9 \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03CD\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2; edit_project_descriptors_block=\u03A0\u03B1\u03B9\u03B4\u03B1\u03B3\u03C9\u03B3\u03B9\u03BA\u03AC \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC edit_media_new=\u039D\u03AD\u03BF \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD... edit_media_new_tooltip=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BD\u03AD\u03B1\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03AE \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD \u03C3\u03C4\u03B7\u03BD \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 edit_media_new_keys=M* edit_seq_threshold=\u039A\u03B1\u03C4\u03CE\u03C4\u03B1\u03C4\u03BF \u03CC\u03C1\u03B9\u03BF \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1\u03C2: edit_seq_threshold_tooltip_up=\u0391\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AE\u03C3\u03C4\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B4\u03B9\u03B1\u03B4\u03C1\u03BF\u03BC\u03AE, \u03CC\u03C4\u03B1\u03BD \u03B7 \u03C3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03AE \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AF\u03C3\u03B7 \u03AE \u03BC\u03B5\u03B3\u03B1\u03BB\u03CD\u03C4\u03B5\u03C1\u03B7 \u03B1\u03C0\u03CC... edit_seq_time=\u0391\u03C6\u03B5\u03C4\u03B7\u03C1\u03AF\u03B1 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C5: edit_seq_time_tooltip_up=\u0393\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AE\u03C3\u03B5\u03C4\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B4\u03B9\u03B1\u03B4\u03C1\u03BF\u03BC\u03AE, \u03BF \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B1\u03BB\u03CE\u03B8\u03B7\u03BA\u03B5 \u03B3\u03B9\u03B1 \u03C4\u03B9\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B9\u03BA\u03C1\u03CC\u03C4\u03B5\u03C1\u03BF\u03C2 \u03B1\u03C0\u03CC... edit_seq_threshold_tooltip_down=\u0391\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AE\u03C3\u03C4\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B4\u03B9\u03B1\u03B4\u03C1\u03BF\u03BC\u03AE \u03CC\u03C4\u03B1\u03BD \u03B7 \u03C3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03AE \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C7\u03B1\u03BC\u03B7\u03BB\u03CC\u03C4\u03B5\u03C1\u03B7 \u03B1\u03C0\u03CC... edit_seq_time_tooltip_down=\u0391\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AE\u03C3\u03C4\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B4\u03B9\u03B1\u03B4\u03C1\u03BF\u03BC\u03AE, \u03CC\u03C4\u03B1\u03BD \u03BF \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B1\u03BB\u03CE\u03B8\u03B7\u03BA\u03B5 \u03B3\u03B9\u03B1 \u03C4\u03B9\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B5\u03B3\u03B1\u03BB\u03CD\u03C4\u03B5\u03C1\u03BF\u03C2 \u03B1\u03C0\u03CC... edit_seq_condJump=\u0395\u03BE\u03B1\u03C1\u03C4\u03B7\u03BC\u03AD\u03BD\u03B1 \u03B2\u03AE\u03BC\u03B1\u03C4\u03B1 edit_seq_condJump_tooltip=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03C4\u03B5 \u03B5\u03B9\u03B4\u03B9\u03BA\u03AC \u03B2\u03AE\u03BC\u03B1\u03C4\u03B1 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03BA\u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03BF\u03CD\u03BD \u03BC\u03CC\u03BD\u03BF \u03BA\u03AC\u03C4\u03C9 \u03B1\u03C0\u03CC \u03C3\u03C5\u03B3\u03BA\u03B5\u03BA\u03C1\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2 \u03CC\u03C1\u03BF\u03C5\u03C2 edit_seq_condJump_upper_tooltip=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C4\u03BF\u03C5\u03C2 \u03CC\u03C1\u03BF\u03C5\u03C2 \u03B3\u03B9\u03B1 \u03BC\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03B5 \u03B1\u03BD\u03CE\u03C4\u03B5\u03C1\u03BF \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF edit_seq_condJump_lower=\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03BA\u03AC\u03C4\u03C9: edit_seq_condJump_upper=\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03AC\u03BD\u03C9: edit_seq_condJump_lower_tooltip=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C4\u03BF\u03C5\u03C2 \u03CC\u03C1\u03BF\u03C5\u03C2 \u03B3\u03B9\u03B1 \u03BC\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03B5 \u03BA\u03B1\u03C4\u03CE\u03C4\u03B5\u03C1\u03BF \u03B5\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF edit_seq_action_tooltip_fw=\u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B1\u03C4\u03AD\u03B8\u03B7\u03BA\u03B5 \u03C3\u03C4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF "\u03B5\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF" edit_seq_action_tooltip_bk=\u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B1\u03C4\u03AD\u03B8\u03B7\u03BA\u03B5 \u03C3\u03C4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF "\u03C0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF" edit_seq_jump_tooltip=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C4\u03BF \u03C3\u03C4\u03CC\u03C7\u03BF \u03C4\u03B7\u03C2 \u03BC\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7\u03C2 edit_seq_action_tooltip=\u0388\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 edit_seq_activity_tooltip=\u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B1\u03C4\u03AD\u03B8\u03B7\u03BA\u03B5 \u03C3\u03B5 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03C4\u03B7\u03C2 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1\u03C2 edit_seq_tag_tooltip=\u0395\u03C4\u03B9\u03BA\u03AD\u03C4\u03B1 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03C9\u03C2 \u03C0\u03B1\u03C1\u03B1\u03C0\u03BF\u03BC\u03C0\u03AE \u03B3\u03B9\u03B1 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03C4\u03B7\u03C2 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1\u03C2 (\u03C0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC \u03C0\u03B5\u03B4\u03AF\u03BF) edit_seq_description_tooltip=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1\u03C2 (\u03C0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC \u03C0\u03B5\u03B4\u03AF\u03BF) edit_seq_button_enabled_tooltip=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03AE \u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 \u03B2\u03AD\u03BB\u03BF\u03C5\u03C2 edit_seq_auto_tooltip=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03CC\u03C4\u03B1\u03BD \u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03BD\u03B5\u03C4\u03B1\u03B9 edit_seq_delay_tooltip=\u0394\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1 \u03B1\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE\u03C2 \u03C0\u03C1\u03B9\u03BD \u03C4\u03B7\u03BD \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 edit_color_dlgTitle=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2 edit_media_renaming=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03C0\u03B5\u03C1\u03B9\u03BC\u03AD\u03BD\u03B5\u03C4\u03B5 \u03B5\u03BD\u03CC\u03C3\u03C9 \u03B7 \u03C0\u03B7\u03B3\u03AE \u03BC\u03B5\u03C4\u03B1\u03BD\u03BF\u03BC\u03AC\u03B6\u03B5\u03C4\u03B1\u03B9... edit_act_cell_width=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2: edit_act_cell_width_tooltip=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03BA\u03B5\u03BB\u03B9\u03BF\u03CD (\u03C3\u03B5 \u03B5\u03B9\u03BA\u03BF\u03BD\u03BF\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1) edit_act_cell_height=\u038E\u03C8\u03BF\u03C2: edit_act_cell_height_tooltip=\u038E\u03C8\u03BF\u03C2 \u03BA\u03B5\u03BB\u03B9\u03BF\u03CD (\u03C3\u03B5 pixels) edit_act_hiddenWords=\u039A\u03C1\u03C5\u03BC\u03BC\u03AD\u03BD\u03B5\u03C2 \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2: edit_act_hiddenWords_tooltip=\u039B\u03AF\u03C3\u03C4\u03B1 \u03BA\u03C1\u03C5\u03BC\u03BC\u03AD\u03BD\u03C9\u03BD \u03BB\u03AD\u03BE\u03B5\u03C9\u03BD \u03C4\u03BF\u03C5 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 edit_act_wordSearch_panelB=\u03A7\u03C1\u03AE\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 \u0392 edit_act_wordSearch_panelB_tooltip=\u03A4\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03B1 \u03C4\u03BF\u03C5 \u03B4\u03B5\u03CD\u03C4\u03B5\u03C1\u03BF\u03C5 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 \u03B8\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C9\u03C2 \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2 \u03C0\u03BF\u03C5 \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B1\u03BD edit_act_shaper_tooltip=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03B7 \u03BC\u03BF\u03C1\u03C6\u03AE \u03C4\u03BF\u03C5 \u03C3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03C4\u03AE \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF \u03C3\u03C4\u03BF\u03BD \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 edit_act_num_cols_tooltip=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C3\u03C4\u03B7\u03BB\u03CE\u03BD \u03C4\u03BF\u03C5 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 edit_act_num_rows_tooltip=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03CE\u03BD \u03C4\u03BF\u03C5 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 edit_act_wildTransparent=\u038C\u03C1\u03B9\u03B1 \u03B4\u03B9\u03B1\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1\u03C2 edit_act_wildTransparent_tooltip=\u0391\u03BD\u03C4\u03B9\u03BC\u03B5\u03C4\u03CE\u03C0\u03B9\u03C3\u03B7 \u03C4\u03C9\u03BD \u03BF\u03C1\u03AF\u03C9\u03BD (\u03BC\u03B1\u03CD\u03C1\u03B1 \u03C0\u03BB\u03B1\u03AF\u03C3\u03B9\u03B1) \u03C9\u03C2 \u03B1\u03B4\u03CD\u03BD\u03B1\u03C4\u03B1 \u03C3\u03B7\u03BC\u03B5\u03AF\u03B1 \u03C4\u03B7\u03C2 \u03B4\u03B9\u03B1\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1\u03C2 edit_act_behavior_scramble_times=\u039C\u03B5\u03AF\u03B3\u03BC\u03B1\u03C4\u03B1: edit_act_behavior_scramble_times_tooltip=\u03A0\u03CC\u03C3\u03B5\u03C2 \u03C6\u03BF\u03C1\u03AD\u03C2 \u03B8\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 \u03B1\u03BD\u03B1\u03BA\u03AC\u03C4\u03C9\u03BC\u03B1 edit_act_copy_title=\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD \u03C3\u03C4\u03BF... edit_act_copy_attributes=\u03A7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC edit_act_copy_dest=\u0395\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C3\u03B5: edit_act_copy_style_main=\u039A\u03CD\u03C1\u03B9\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF edit_act_copy_style_play=\u03A0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF \u03B1\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 edit_act_copy_activities=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03BF\u03CD\u03BD: edit_act_copyAttributes=\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03B9\u03B4\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD \u03C4\u03B7\u03C2 \u03C4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03C3\u03B5 \u03AC\u03BB\u03BB\u03B5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 edit_new_project_name=\u038C\u03BD\u03BF\u03BC\u03B1 \u03AD\u03C1\u03B3\u03BF\u03C5: edit_new_project_name_tooltip=\u03A3\u03CD\u03BD\u03C4\u03BF\u03BC\u03BF \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03B9\u03BA\u03CC \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 edit_new_project_filename=\u038C\u03BD\u03BF\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5: edit_new_project_filename_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5, \u03C7\u03C9\u03C1\u03AF\u03C2 \u03B5\u03C0\u03AD\u03BA\u03C4\u03B1\u03C3\u03B7 edit_new_project_folder=\u03A6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2: edit_new_project_folder_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 \u03CC\u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03C5\u03C4\u03B5\u03AF \u03C4\u03BF \u03AD\u03C1\u03B3\u03BF edit_new_project_folder_browse=\u03A0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7... edit_new_project_title=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 JClic edit_new_project_err_empty=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u03A4\u03BF \u03AD\u03C1\u03B3\u03BF, \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03BA\u03B1\u03B9 \u03BF \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03AD\u03C7\u03BF\u03C5\u03BD \u03AD\u03B3\u03BA\u03C5\u03C1\u03B1 \u03BF\u03BD\u03CC\u03BC\u03B1\u03C4\u03B1. edit_new_project_warning_noEmptyFolder=\u0391\u03C5\u03C4\u03CC\u03C2 \u03BF \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03AE\u03B4\u03B7 \u03AD\u03BD\u03B1 \u03AC\u03BB\u03BB\u03BF \u03AD\u03C1\u03B3\u03BF \u03C4\u03BF\u03C5 Clic 3.0 \u03AE \u03C4\u03BF\u03C5 JClic. \u0393\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03C6\u03CD\u03B3\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B1\u03BD\u03B1\u03C3\u03C4\u03AC\u03C4\u03C9\u03C3\u03B7, \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03C1\u03BF\u03C4\u03B9\u03BC\u03CC\u03C4\u03B5\u03C1\u03BF \u03BD\u03B1 \u03B4\u03B9\u03B1\u03C4\u03B7\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BA\u03AC\u03B8\u03B5 \u03AD\u03C1\u03B3\u03BF \u03C3\u03B5 \u03BE\u03B5\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03CC \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF, \u03B1\u03BD \u03BA\u03B1\u03B9 \u03B1\u03C5\u03C4\u03CC \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03C5\u03C3\u03C4\u03B7\u03C1\u03CC\u03C2 \u03BA\u03B1\u03BD\u03CC\u03BD\u03B1\u03C2. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03AC \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03B5\u03C4\u03B5 \u03C4\u03BF \u03BD\u03AD\u03BF \u03AD\u03C1\u03B3\u03BF \u03C3\u03B5 \u03B1\u03C5\u03C4\u03CC\u03BD \u03C4\u03BF\u03BD \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF; edit_new_project_err_folderCreation=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u0391\u03B4\u03CD\u03BD\u03B1\u03C4\u03B7 \u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03C4\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5! edit_act_copy_err_noSelection=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u0394\u03B5\u03BD \u03B5\u03C0\u03B9\u03BB\u03AD\u03C7\u03B8\u03B7\u03BA\u03B5 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1! \u0393\u03B9\u03B1 \u03BD\u03B1 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03C3\u03C4\u03BF\u03CD\u03BD \u03C4\u03B1 \u03C5\u03C0\u03BF\u03B4\u03B5\u03B9\u03BA\u03BD\u03C5\u03CC\u03BC\u03B5\u03BD\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC, \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03C4\u03B5 \u03B1\u03C0\u03CC \u03C4\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03C4\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03AE \u03C4\u03B9\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C3\u03C4\u03B9\u03C2 \u03BF\u03C0\u03BF\u03AF\u03B5\u03C2 \u03B8\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 \u03B7 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE. edit_act_copy_action_prefix=\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03B9\u03B4\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD \u03C3\u03C4\u03BF: edit_act_copy_margin=\u03A0\u03B5\u03C1\u03B9\u03B8\u03CE\u03C1\u03B9\u03BF edit_act_copy_bgColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C5\u03C0\u03BF\u03B2\u03AC\u03B8\u03C1\u03BF\u03C5 edit_act_copy_gradient=\u0394\u03B9\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7 edit_act_copy_bgImage=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5 edit_act_copy_border=\u03A0\u03B5\u03C1\u03AF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 edit_act_copy_transparentBg=\u03A6\u03CC\u03BD\u03C4\u03BF \u03B4\u03B9\u03B1\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1\u03C2 edit_act_copy_position=\u0398\u03AD\u03C3\u03B7 edit_act_copy_messages=\u039C\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03B1 edit_act_copy_messages_ini=\u03A3\u03C4\u03C5\u03BB \u03B1\u03C1\u03C7\u03B9\u03BA\u03BF\u03CD \u03BC\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03BF\u03C2 edit_act_copy_messages_end=\u03A3\u03C4\u03C5\u03BB \u03C4\u03B5\u03BB\u03B9\u03BA\u03BF\u03CD \u03BC\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03BF\u03C2 edit_act_copy_messages_err=\u03A3\u03C4\u03C5\u03BB \u03BC\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C3\u03C6\u03AC\u03BB\u03BC\u03B1\u03C4\u03BF\u03C2 edit_act_copy_reports=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 edit_act_copy_rep_include=\u03A3\u03C5\u03BC\u03C0\u03B5\u03C1\u03B9\u03AD\u03BB\u03B1\u03B2\u03B5 \u03C4\u03B7\u03BD \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03C3\u03C4\u03B9\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 edit_act_copy_rep_actions=\u039A\u03B1\u03C4\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03BD\u03B5\u03C1\u03B3\u03B5\u03B9\u03CE\u03BD edit_act_copy_interface=\u0394\u03B9\u03B5\u03C0\u03B1\u03C6\u03AE \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 edit_act_copy_skin=\u0398\u03AD\u03BC\u03B1 edit_act_copy_evSounds=\u0389\u03C7\u03BF\u03B9 \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD\u03C4\u03C9\u03BD edit_act_copy_counters=\u039C\u03B5\u03C4\u03C1\u03B7\u03C4\u03AD\u03C2 edit_act_copy_cTime=\u03A7\u03C1\u03BF\u03BD\u03CC\u03BC\u03B5\u03C4\u03C1\u03BF edit_act_copy_maxTime=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2 edit_act_copy_cTries=\u039C\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE\u03C2 \u03C0\u03C1\u03BF\u03C3\u03C0\u03B1\u03B8\u03B5\u03B9\u03CE\u03BD edit_act_copy_maxTries=\u039C\u03AD\u03C3\u03B9\u03C3\u03C4\u03B5\u03C2 \u03C0\u03C1\u03BF\u03C3\u03C0\u03AC\u03B8\u03B5\u03B9\u03B5\u03C2 edit_act_copy_cScore=\u039C\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE\u03C2 \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1\u03C2 edit_act_copy_scramble=\u03A0\u03CC\u03C3\u03B5\u03C2 \u03C6\u03BF\u03C1\u03AD\u03C2 \u03B8\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 \u03C4\u03BF \u03B1\u03BD\u03B1\u03BA\u03AC\u03C4\u03C9\u03BC\u03B1 edit_act_copy_buttons=\u03A0\u03BB\u03AE\u03BA\u03C4\u03C1\u03B1 edit_act_copy_btnHelp=\u03A0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03B2\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1\u03C2 edit_act_copy_btnInfo=\u03A0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B1\u03C2 edit_act_copy_grids=\u03A0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03B1 edit_act_copy_gridA=\u03A3\u03C4\u03C5\u03BB \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2 \u0391 edit_act_copy_gridB=\u03A3\u03C4\u03C5\u03BB \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2 \u0392 edit_act_copy_textGrid=\u03A3\u03C4\u03C5\u03BB \u03C0\u03BB\u03B5\u03B3\u03BC\u03AC\u03C4\u03C9\u03BD \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03C9\u03BD edit_act_copy_text=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 edit_act_copy_fontFace=\u03A3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2 edit_act_copy_fontSize=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2 edit_act_copy_fontStyle=\u03A3\u03C4\u03C5\u03BB \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2 edit_act_copy_textColour=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03BA\u03CD\u03C1\u03B9\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 edit_act_copy_textTargetColour=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03C3\u03C7\u03AD\u03B4\u03B9\u03BF \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03C4\u03BF\u03C5 JClic \u03B1\u03C0\u03CC \u03CC\u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B5\u03B9\u03C3\u03B1\u03C7\u03B8\u03BF\u03CD\u03BD \u03BF\u03B9 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 edit_act_copy_textErrorColour=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C3\u03C6\u03B1\u03BB\u03BC\u03AC\u03C4\u03C9\u03BD edit_act_copy_tabSpace=\u0394\u03B9\u03AC\u03C3\u03C4\u03B7\u03BC\u03B1 \u03C3\u03C4\u03B7\u03BB\u03BF\u03B8\u03AD\u03C4\u03B7 edit_act_copy_messages_prev=\u03A3\u03C4\u03C5\u03BB \u03C0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF\u03C5 \u03BC\u03B7\u03BD\u03CD\u03BC\u03B1\u03C4\u03BF\u03C2 edit_act_changeType=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03C4\u03CD\u03C0\u03BF\u03C5 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_newActivity_class_tooltip=\u03A0\u03BB\u03AE\u03C1\u03B5\u03C2 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03B5\u03AF\u03B4\u03BF\u03C5\u03C2 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 (\u03BC\u03CC\u03BD\u03BF \u03B3\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C7\u03C9\u03C1\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2!) edit_act_newActivity_other=\u0386\u03BB\u03BB\u03BF... edit_act_newActivity_info=\u039F\u03B9 \u03C0\u03C1\u03BF\u03C7\u03C9\u03C1\u03B7\u03BC\u03AD\u03BD\u03BF\u03B9 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 \u03BC\u03C0\u03BF\u03C1\u03BF\u03CD\u03BD \u03B5\u03C0\u03AF\u03C3\u03B7\u03C2 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03BF\u03C5\u03BD \u03B4\u03B9\u03BA\u03AD\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03BF JClic. \u0393\u03C1\u03AC\u03C8\u03C4\u03B5 \u03C4\u03BF \u03C0\u03BB\u03AE\u03C1\u03B5\u03C2 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03B5\u03AF\u03B4\u03BF\u03C5\u03C2 \u03BC\u03B5 \u03C4\u03BF \u03C0\u03C1\u03CC\u03B8\u03B7\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03C0\u03B1\u03BA\u03AD\u03C4\u03BF\u03C5 (\u03C0.\u03C7. "com.acme.activities.FooActivity"). \u03A4\u03B1 \u03B5\u03AF\u03B4\u03B7 \u03C4\u03C9\u03BD \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03AD\u03C7\u03BF\u03C5\u03BD \u03B5\u03C0\u03AD\u03BA\u03C4\u03B1\u03C3\u03B7 edu.xtec.jclic.Activity \u03BA\u03B1\u03B9 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03C1\u03BF\u03C3\u03C0\u03B5\u03BB\u03AC\u03C3\u03B9\u03BC\u03B1 \u03B1\u03C0\u03CC \u03C4\u03B7 JVM. edit_act_newActivity_name=\u039F\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_act_newActivity_name_tooltip=\u039A\u03AC\u03B8\u03B5 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9 \u03AD\u03BD\u03B1 \u03BC\u03BF\u03BD\u03B1\u03B4\u03B9\u03BA\u03CC \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C3\u03C4\u03BF \u03AD\u03C1\u03B3\u03BF edit_act_changeType_warning=

\u03A0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE: \u0397 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03C4\u03BF\u03C5 \u03C4\u03CD\u03C0\u03BF\u03C5 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03C0\u03C1\u03BF\u03BA\u03B1\u03BB\u03AD\u03C3\u03B5\u03B9 \u03B1\u03C0\u03CE\u03BB\u03B5\u03B9\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD \u03BA\u03B1\u03B9 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03B7\u03C2 \u03C4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2. \u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03C4\u03B5 \u03C4\u03BF \u03BC\u03B5 \u03C0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE!

 

applet_codebase=\u03A4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C3\u03AF\u03B1 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C4\u03BF\u03C5 JClic: applet_codebase_tooltip=URL \u03C0\u03BF\u03C5 \u03C3\u03C4\u03BF\u03C7\u03B5\u03CD\u03B5\u03B9 \u03C3\u03B5 \u03AD\u03BD\u03B1\u03BD \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF \u03BC\u03B5 \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03BA\u03B1\u03B9 \u03C4\u03B1 \u03C3\u03B5\u03BD\u03AC\u03C1\u03B9\u03B1 \u03C4\u03BF\u03C5 JClic applet_prev_text=\u039A\u03CE\u03B4\u03B9\u03BA\u03B1\u03C2 HTML \u03C0\u03C1\u03B9\u03BD: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03AE \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1\u03C2 HTML \u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C4\u03B7\u03B8\u03B5\u03AF \u03C0\u03C1\u03B9\u03BD \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE applet_post_text=\u039A\u03CE\u03B4\u03B9\u03BA\u03B1\u03C2 HTML \u03BC\u03B5\u03C4\u03AC: applet_post_text_tooltip=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03AE \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1\u03C2 HTML \u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C4\u03B7\u03B8\u03B5\u03AF \u03BC\u03B5\u03C4\u03AC \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE applet_size=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE\u03C2: applet_size_tooltip=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03BA\u03B1\u03B9 \u03CD\u03C8\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE\u03C2, \u03C3\u03B5 \u03B1\u03C0\u03CC\u03BB\u03C5\u03C4\u03B5\u03C2 \u03AE \u03C0\u03BF\u03C3\u03BF\u03C3\u03C4\u03B9\u03B1\u03AF\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2. applet_page_title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2: applet_page_title_tooltip=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03B5\u03C0\u03AC\u03BD\u03C9 \u03BC\u03AD\u03C1\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE applet_created_info=\u0397 \u03B9\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 "%s" \u03AD\u03C7\u03B5\u03B9 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03B7\u03B8\u03B5\u03AF \u03BC\u03B5 \u03B5\u03C0\u03B9\u03C4\u03C5\u03C7\u03AF\u03B1. applet_created_prompt=\u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03C4\u03BF \u03B1\u03BD\u03BF\u03AF\u03BE\u03B5\u03C4\u03B5 \u03BC\u03B5 \u03C4\u03BF\u03BD \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE \u03C4\u03CE\u03C1\u03B1; action_createHTML_caption=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B9\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2.. applet_create_title=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BC\u03B9\u03B1\u03C2 HTML \u03B9\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03BC\u03B5 \u03BC\u03B9\u03BA\u03C1\u03BF\u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03BF\u03C5 Jclic action_createHTML_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BC\u03B9\u03B1\u03C2 HTML \u03B9\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03BC\u03B5 \u03BC\u03B9\u03BA\u03C1\u03BF\u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C0\u03BF\u03C5 \u03B5\u03BC\u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03C4\u03C1\u03AD\u03C7\u03BF\u03BD \u03AD\u03C1\u03B3\u03BF applet_filename=\u038C\u03BD\u03BF\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5: applet_filename_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C4\u03BF\u03C5 HTML \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03B7\u03B8\u03B5\u03AF action_createHTML_keys=H* settings_applet=\u039C\u03B9\u03BA\u03C1\u03BF\u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE settings_applet_tooltip=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B9\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD applet_bgcolor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5: applet_bgcolor_tooltip=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5 HTML \u03B9\u03C3\u03C4\u03BF\u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 applet_centered=\u039A\u03B5\u03BD\u03C4\u03C1\u03B1\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF applet_centered_tooltip=\u03A4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C4\u03AE\u03C3\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03B5\u03BD\u03C4\u03C1\u03B1\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03BF\u03C1\u03B9\u03B6\u03CC\u03BD\u03C4\u03B9\u03B1 applet_width_tooltip=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE\u03C2 (\u03B1\u03C0\u03CC\u03BB\u03C5\u03C4\u03B7 \u03AE \u03C0\u03BF\u03C3\u03BF\u03C3\u03C4\u03B9\u03B1\u03AF\u03B1 \u03C4\u03B9\u03BC\u03AE) applet_height_tooltip=\u038E\u03C8\u03BF\u03C2 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE\u03C2 (\u03B1\u03C0\u03CC\u03BB\u03C5\u03C4\u03B7 \u03AE \u03C0\u03BF\u03C3\u03BF\u03C3\u03C4\u03B9\u03B1\u03AF\u03B1 \u03C4\u03B9\u03BC\u03AE) applet_exitUrl=\u039A\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03AD\u03BE\u03BF\u03B4\u03BF, \u03BC\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03B5: applet_exitUrl_tooltip=URL \u03C3\u03C4\u03B7\u03BD \u03BF\u03C0\u03BF\u03AF\u03B1 \u03B8\u03B1 \u03B1\u03BD\u03B1\u03BA\u03B1\u03C4\u03B5\u03C5\u03B8\u03CD\u03BD\u03B5\u03C4\u03B1\u03B9 \u03B7 \u03C0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7\u03BD \u03AD\u03BE\u03BF\u03B4\u03BF \u03C4\u03BF\u03C5 JClic. applet_infoFrame=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C0\u03BB\u03B1\u03B9\u03C3\u03AF\u03BF\u03C5 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD: applet_infoFrame_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C0\u03BB\u03B1\u03B9\u03C3\u03AF\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03BF\u03CD \u03BC\u03B5 \u03C4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF "\u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 action_createInstaller_caption=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B5\u03B3\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AC\u03C4\u03B7 \u03AD\u03C1\u03B3\u03BF\u03C5... action_createInstaller_keys=I* action_createInstaller_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03C3\u03B5\u03BD\u03B1\u03C1\u03AF\u03BF\u03C5 \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2 \u03AD\u03C1\u03B3\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03C4\u03BF\u03BD \u03B1\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AD\u03B1 \u03C4\u03BF\u03C5 JClic installer_caption=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C3\u03B5\u03BD\u03B1\u03C1\u03AF\u03BF\u03C5 \u03B5\u03B3\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AC\u03C4\u03B7 \u03AD\u03C1\u03B3\u03BF\u03C5 installer_title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2: installer_title_tooltip=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2 \u03AD\u03C1\u03B3\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03B9\u03C3\u03C4\u03B5\u03AF \u03C3\u03C4\u03BF\u03BD \u03BF\u03B4\u03B7\u03B3\u03CC \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2 installer_authors=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03BF\u03AF: installer_authors_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03CC\u03C2/\u03BF\u03AF \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 (\u03C3\u03CD\u03BD\u03C4\u03BF\u03BC\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) installer_folder=\u03A6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2: installer_folder_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03BF\u03C4\u03B5\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03BF\u03B4\u03B7\u03B3\u03CC \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2 installer_files=\u0386\u03C1\u03C7\u03B5\u03B9\u03B1 \u03B3\u03B9\u03B1 \u03B1\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE: installer_files_tooltip=\u0391\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B1\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03BF\u03CD\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03B5\u03B3\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AC\u03C4\u03B7 installer_files_available=\u0394\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 installer_files_selected=\u0395\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 installer_files_add=>> \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 >> installer_files_add_tooltip=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C3\u03C4\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 installer_files_remove=<<\u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE<< installer_files_remove_tooltip=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03B1\u03C0\u03CC \u03C4\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 installer_button=\u039A\u03BF\u03C5\u03BC\u03C0\u03AF \u03AD\u03BD\u03B1\u03C1\u03BE\u03B7\u03C2 installer_button_tooltip=\u039F\u03B9 \u03B9\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C4\u03BF \u03BA\u03BF\u03C5\u03BC\u03C0\u03B9\u03BF\u03CD \u03C0\u03B1\u03C1\u03BF\u03C5\u03C3\u03B9\u03AC\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03B7 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C4\u03BF\u03C5 \u03C0\u03C1\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 installer_button_project=\u039A\u03CD\u03C1\u03B9\u03BF \u03AD\u03C1\u03B3\u03BF installer_button_project_tooltip=\u0388\u03C1\u03B3\u03BF \u03C4\u03BF\u03C5 JClic \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03C6\u03BF\u03C1\u03C4\u03C9\u03B8\u03B5\u03AF \u03BC\u03B5 \u03C4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF installer_button_text=\u0395\u03C4\u03B9\u03BA\u03AD\u03C4\u03B1: installer_button_text_tooltip=\u0395\u03C4\u03B9\u03BA\u03AD\u03C4\u03B1 \u03C3\u03CD\u03BD\u03C4\u03BF\u03BC\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03B5\u03C3\u03C9\u03C4\u03B5\u03C1\u03B9\u03BA\u03CC \u03C4\u03BF\u03C5 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 installer_button_icon=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF: installer_button_icon_tooltip=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C0\u03BF\u03C5 \u03B8\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF \u03C9\u03C2 \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5. \u0391\u03BD \u03BC\u03B5\u03AF\u03BD\u03B5\u03B9 \u03BA\u03B5\u03BD\u03CC \u03B8\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF \u03C4\u03BF \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03C4\u03BF\u03C5 JClic. installer_button_description=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE installer_button_description_tooltip=\u03A3\u03C5\u03BC\u03B2\u03BF\u03C5\u03BB\u03AE \u03BF\u03B8\u03CC\u03BD\u03B7\u03C2 \u03C0\u03BF\u03C5 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03C4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF installer_error_noTitle=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u039B\u03B5\u03AF\u03C0\u03B5\u03B9 \u03BF \u03C4\u03AF\u03C4\u03BB\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 installer_error_noBaseFolder=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u039B\u03B5\u03AF\u03C0\u03B5\u03B9 \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 installer_error_noFilesSelected=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u039C\u03B7 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 installer_error_noButtonText=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u039B\u03B5\u03AF\u03C0\u03B5\u03B9 \u03B7 \u03B5\u03C4\u03B9\u03BA\u03AD\u03C4\u03B1 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C4\u03BF\u03C5 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7\u03C2 installer_error_projectNotInFiles=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1: \u03A4\u03BF \u03AD\u03C1\u03B3\u03BF \u03C0\u03BF\u03C5 \u03AD\u03C7\u03B5\u03B9 \u03B1\u03BD\u03B1\u03C4\u03B5\u03B8\u03B5\u03AF \u03C3\u03C4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7\u03C2, \u03B4\u03B5\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03C3\u03C4\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03C4\u03C9\u03BD \u03C0\u03C1\u03BF\u03C2 \u03B1\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD applet_page_full=\u039C\u03B9\u03BA\u03C1\u03BF\u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C0\u03BB\u03AE\u03C1\u03BF\u03C5\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 applet_page_mixed=\u039C\u03B9\u03BA\u03C1\u03BF\u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BC\u03B5 \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B4\u03B9\u03B1\u03C3\u03C4\u03AC\u03C3\u03B5\u03B9\u03C2 edit_text_align_left=\u03A3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B1\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AC edit_text_align_center=\u03A3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03C4\u03BF \u03BA\u03AD\u03BD\u03C4\u03C1\u03BF edit_text_align_right=\u03A3\u03C4\u03BF\u03AF\u03C7\u03B9\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B4\u03B5\u03BE\u03B9\u03AC edit_text_act_target_toggle=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03AE \u03B1\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C3\u03C4\u03CC\u03C7\u03BF\u03C5 edit_text_act_insertCell=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03B5\u03BD\u03CC\u03C2 \u03BA\u03B5\u03BB\u03B9\u03BF\u03CD edit_text_act_content=\u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF edit_text_act_style=\u03A3\u03C4\u03C5\u03BB edit_cell_size=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03BA\u03B5\u03BB\u03B9\u03BF\u03CD: edit_project_orphanActivities=\u039F\u03B9 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C0\u03BF\u03C5 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03BF\u03CD\u03BD \u03B4\u03B5\u03BD \u03C0\u03B5\u03C1\u03B9\u03BB\u03B1\u03BC\u03B2\u03AC\u03BD\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03B5 \u03BA\u03B1\u03BC\u03AF\u03B1 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5. \u0391\u03C5\u03C4\u03CC \u03C3\u03B7\u03BC\u03B1\u03AF\u03BD\u03B5\u03B9 \u03C0\u03C9\u03C2 \u03B4\u03B5\u03BD \u03B8\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9: edit_project_orphanMedia=\u03A4\u03B1 \u03C0\u03B1\u03C1\u03B1\u03BA\u03AC\u03C4\u03C9 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03B1 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD \u03B4\u03B5\u03BD \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 \u03B1\u03C0\u03B5\u03C5\u03B8\u03B5\u03AF\u03B1\u03C2 \u03C3\u03B5 \u03BA\u03B1\u03BC\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1: edit_project_orphanActivities_prompt=\u0398\u03AD\u03BB\u03B5\u03B9\u03C2 \u03BD\u03B1 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B5\u03B8\u03BF\u03CD\u03BD \u03C3\u03C4\u03BF \u03C4\u03AD\u03BB\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1\u03C2 \u03C4\u03B7\u03C2 \u03C4\u03B5\u03BB\u03B5\u03C5\u03C4\u03B1\u03AF\u03B1\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2; edit_project_orphanMedia_prompt=\u0398\u03AD\u03BB\u03B5\u03B9\u03C2 \u03BD\u03B1 \u03C4\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03AD\u03C3\u03B5\u03B9\u03C2; edit_project_orphanMedia_title=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03BC\u03B7 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03C9\u03BD \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD edit_project_orphanActivities_title=\u039F\u03C1\u03C6\u03B1\u03BD\u03AD\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 edit_media_refreshAll=\u0391\u03BD\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03BC\u03AD\u03C3\u03C9\u03BD edit_media_refreshAll_tooltip=\u0395\u03BD\u03B7\u03BC\u03AD\u03C1\u03C9\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C0\u03BF\u03BB\u03C5\u03BC\u03B5\u03C3\u03B9\u03BA\u03CE\u03BD \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5 \u03B5\u03C0\u03B1\u03BD\u03B1\u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03C4\u03BF\u03C5\u03C2 edit_media_refreshAll_keys=R* edit_media_refreshAll_working=\u0391\u03BD\u03B1\u03B2\u03AC\u03B8\u03BC\u03B9\u03C3\u03B7 \u03BC\u03AD\u03C3\u03C9\u03BD... edit_media_exportAll=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03BC\u03AD\u03C3\u03C9\u03BD edit_media_exportAll_tooltip=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C3\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03C0\u03BF\u03BB\u03C5\u03BC\u03B5\u03C3\u03B9\u03BA\u03CE\u03BD \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD edit_media_exportAll_keys=\u03A7* edit_shape_select=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE edit_shape_addPoint=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03B7\u03BC\u03B5\u03AF\u03BF\u03C5 edit_shape_deletePoint=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE edit_shape_drawRect=\u03A3\u03C7\u03B5\u03B4\u03AF\u03B1\u03C3\u03B7 \u03C4\u03B5\u03C4\u03C1\u03B1\u03C0\u03BB\u03B5\u03CD\u03C1\u03BF\u03C5 edit_shape_drawEllipse=\u03A3\u03C7\u03B5\u03B4\u03AF\u03B1\u03C3\u03B7 \u03AD\u03BB\u03BB\u03B5\u03B9\u03C8\u03B7\u03C2 edit_shape_drawPoly=\u03A3\u03C7\u03B5\u03B4\u03AF\u03B1\u03C3\u03B7 \u03C0\u03BF\u03BB\u03C5\u03B3\u03CE\u03BD\u03BF\u03C5 edit_shape_toLine=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE edit_shape_toBezier=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 \u03BA\u03B1\u03BC\u03C0\u03CD\u03BB\u03B7 Bezier edit_shape_toQuad=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 \u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03BF\u03B2\u03AC\u03B8\u03BC\u03B9\u03B1 \u03BA\u03B1\u03BC\u03C0\u03CD\u03BB\u03B7 edit_shape_rLeft=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03B1\u03C1\u03B9\u03C3\u03C4\u03B5\u03C1\u03AC edit_shape_rRight=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03B4\u03B5\u03BE\u03B9\u03AC edit_shape_expand=\u0391\u03BD\u03AC\u03C0\u03C4\u03C5\u03BE\u03B7 edit_shape_contract=\u0391\u03C0\u03BF\u03BC\u03AC\u03BA\u03C1\u03C5\u03BD\u03C3\u03B7 edit_shape_zoomIn=\u039C\u03B5\u03B3\u03AD\u03B8\u03C5\u03BD\u03C3\u03B7 edit_shape_zoomOut=\u03A3\u03BC\u03AF\u03BA\u03C1\u03C5\u03BD\u03C3\u03B7 edit_shape_aproxPoints=\u03A3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03BA\u03BF\u03BD\u03C4\u03B9\u03BD\u03CE\u03BD \u03C3\u03B7\u03BC\u03B5\u03AF\u03C9\u03BD edit_shape_showPoints=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C3\u03B7\u03BC\u03B5\u03AF\u03C9\u03BD edit_shape_showPoints_tooltip=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7/\u0391\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03C3\u03B7\u03BC\u03B5\u03AF\u03C9\u03BD edit_shape_gridSize=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2: edit_shape_hideGrid=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7/\u0391\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2 edit_shape_magnetRadius=\u0391\u03BA\u03C4\u03AF\u03BD\u03B1 \u03BC\u03B1\u03B3\u03BD\u03AE\u03C4\u03B7: edit_shape_elements=\u039A\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B1 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 edit_shape_elemName=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 edit_shape_magnetRadius_tooltip=\u0391\u03BA\u03C4\u03AF\u03BD\u03B1 \u03B4\u03C1\u03AC\u03C3\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03BC\u03B1\u03B3\u03BD\u03AE\u03C4\u03B7, \u03CC\u03C4\u03B1\u03BD \u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 edit_shape_gridSize_tooltip=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2 edit_mc_activity=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1: edit_mc_sequence=\u0391\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1: edit_mc_url=URL: edit_mc_project=\u0388\u03C1\u03B3\u03BF: edit_mc_activity_selection=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 edit_mc_sequence_selection=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B1\u03BA\u03BF\u03BB\u03BF\u03C5\u03B8\u03AF\u03B1\u03C2 edit_mc_err_nullContent=\u0391\u03BD\u03B5\u03C0\u03B1\u03C1\u03BA\u03AE \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1! edit_act_arrowColor=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03B2\u03AD\u03BB\u03BF\u03C5\u03C2: edit_act_arrowColor_tooltip=\u03A7\u03C1\u03CE\u03BC\u03B1 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B1\u03C0\u03CC \u03C4\u03BF\u03BD \u03C3\u03C5\u03BD\u03C4\u03AC\u03BA\u03C4\u03B7 \u03B3\u03B9\u03B1 \u03C4\u03BF\u03BD \u03C3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03BC\u03CC \u03C4\u03C9\u03BD \u03B2\u03B5\u03BB\u03CE\u03BD (\u03CC\u03C7\u03B9 \u03B1\u03BA\u03C1\u03B9\u03B2\u03CE\u03C2, \u03B5\u03C0\u03B5\u03B9\u03B4\u03AE \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03BC\u03B9\u03B1 XOR \u03BC\u03AC\u03C3\u03BA\u03B1) edit_act_editActivity=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1... edit_act_editActivity_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C4\u03B7\u03C2 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 action_saveFileAs_caption=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C9\u03C2... action_saveFileAs_keys=AA action_saveFileAs_tooltip=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03C4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1\u03C2 \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03BC\u03B5 \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC \u03CC\u03BD\u03BF\u03BC\u03B1 edit_act_behavior_block=\u03A3\u03C5\u03BC\u03C0\u03B5\u03C1\u03B9\u03C6\u03BF\u03C1\u03AC edit_act_behavior=\u03A3\u03C5\u03BC\u03C0\u03B5\u03C1\u03B9\u03C6\u03BF\u03C1\u03AC edit_act_behavior_drag=\u03A3\u03CD\u03C1\u03C3\u03B9\u03BC\u03BF \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03C9\u03BD edit_act_behavior_drag_tooltip=\u03A3\u03CD\u03C1\u03B5 \u03C4\u03B1 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03B1 \u03B1\u03BD\u03C4\u03AF \u03BD\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03B9\u03C2 \u03C4\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE \u03AD\u03BD\u03C9\u03C3\u03B7\u03C2 edit_act_behavior_order=\u0388\u03BB\u03B5\u03B3\u03C7\u03BF\u03C2 \u03C3\u03B5\u03B9\u03C1\u03AC\u03C2 \u03BB\u03CD\u03C3\u03B5\u03C9\u03BD edit_act_behavior_order_tooltip=\u03A4\u03B1 \u03BA\u03B5\u03BB\u03B9\u03AC \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03BB\u03C5\u03B8\u03BF\u03CD\u03BD \u03BC\u03B5 \u03C3\u03B5\u03B9\u03C1\u03AC edit_act_scramble=\u0391\u03BD\u03B1\u03BA\u03AC\u03C4\u03C9\u03BC\u03B1 \u03CC\u03BB\u03C9\u03BD action_importActivities_caption=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD... action_importActivities_keys=I* action_importActivities_tooltip=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD \u03B1\u03C0\u03CC \u03AC\u03BB\u03BB\u03BF \u03C3\u03C7\u03AD\u03B4\u03B9\u03BF \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 import_warn_samefile=\u03A4\u03BF \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B1\u03BD\u03C4\u03B9\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF \u03C3\u03C4\u03BF \u03C4\u03C1\u03AD\u03C7\u03BF\u03BD \u03AD\u03C1\u03B3\u03BF. \u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03BC\u03C0\u03BF\u03C1\u03BF\u03CD\u03BD \u03BD\u03B1 \u03B5\u03B9\u03C3\u03B1\u03C7\u03B8\u03BF\u03CD\u03BD \u03BC\u03CC\u03BD\u03BF \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03CE\u03BD \u03AD\u03C1\u03B3\u03C9\u03BD. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03AC\u03BB\u03BB\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03AD\u03C1\u03B3\u03BF\u03C5. import_selectActivities=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03AE \u03C0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03B3\u03B9\u03B1 \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03C3\u03C4\u03BF \u03B5\u03BD\u03B5\u03C1\u03B3\u03CC \u03C3\u03C7\u03AD\u03B4\u03B9\u03BF \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 import_importing=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE... import_checkdep=\u0388\u03BB\u03B5\u03B3\u03C7\u03BF\u03C2 \u03B5\u03BE\u03B1\u03C1\u03C4\u03AE\u03C3\u03B5\u03C9\u03BD import_impmedia=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03BC\u03AD\u03C3\u03C9\u03BD import_impact=\u0395\u03B9\u03C3\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 import_selectProject=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03C3\u03C7\u03AD\u03B4\u03B9\u03BF \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03C4\u03BF\u03C5 JClic \u03B1\u03C0\u03CC \u03CC\u03C0\u03BF\u03C5 \u03B8\u03B1 \u03B5\u03B9\u03C3\u03B1\u03C7\u03B8\u03BF\u03CD\u03BD \u03BF\u03B9 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 edit_tagRep_tags=\u03A3\u03B7\u03BC\u03AC\u03BD\u03C3\u03B5\u03B9\u03C2 \u03B5\u03C4\u03B9\u03BA\u03AD\u03C4\u03B1\u03C2 edit_tagRep_tagStart=\u0391\u03C1\u03C7\u03AE \u03C3\u03AE\u03BC\u03B1\u03BD\u03C3\u03B7\u03C2 edit_tagRep_tagStart_tooltip=\u03A3\u03AE\u03BC\u03B1\u03BD\u03C3\u03B7 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03C3\u03C4\u03B7\u03BD \u03B1\u03C1\u03C7\u03AE \u03C4\u03B7\u03C2 \u03C3\u03AE\u03BC\u03B1\u03BD\u03C3\u03B7\u03C2 edit_tagRep_tagEnd=\u03A4\u03AD\u03BB\u03BF\u03C2 \u03C3\u03AE\u03BC\u03B1\u03BD\u03C3\u03B7\u03C2 edit_tagRep_tagEnd_tooltip=\u03A3\u03AE\u03BC\u03B1\u03BD\u03C3\u03B7 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03C4\u03AD\u03BB\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03C3\u03AE\u03BC\u03B1\u03BD\u03C3\u03B7\u03C2 edit_tagRep_file=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF edit_tagRep_fileName=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF \u03AE \u03B9\u03C3\u03C4\u03BF\u03C4\u03CC\u03C0\u03BF\u03C2 edit_tagRep_fileName_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03AE URL \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03C4\u03B9\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2, \u03BF\u03B9 \u03BF\u03C0\u03BF\u03AF\u03B5\u03C2 \u03B8\u03B1 \u03B1\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AE\u03C3\u03BF\u03C5\u03BD \u03C4\u03B9\u03C2 \u03B5\u03C4\u03B9\u03BA\u03AD\u03C4\u03B5\u03C2 edit_tagRep_charset=\u03A3\u03B5\u03C4 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD edit_tagRep_charset_tooltip=\u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF\u03B9 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B5\u03C2 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF edit_tagRep_browseFile=\u03A0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7... edit_tagRep_browseFile_tooltip=\u03A0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7 \u03C3\u03C4\u03BF \u03C3\u03CD\u03C3\u03C4\u03B7\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD edit_tagRep_title=\u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03B5\u03C4\u03B9\u03BA\u03AD\u03C4\u03B1\u03C2 edit_text_act_clearStylesBtn=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C3\u03C4\u03C5\u03BB \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5... edit_text_act_clearStylesPrompt=\u03A0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE: \u0391\u03C5\u03C4\u03AE \u03B7 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u03B8\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03AD\u03C3\u03B5\u03B9 \u03C4\u03B1 \u03B9\u03B4\u03B9\u03B1\u03AF\u03C4\u03B5\u03C1\u03B1 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC \u03C4\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03B5\u03C6\u03B1\u03C1\u03BC\u03CC\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF \u03BA\u03B1\u03B9 \u03B8\u03B1 \u03B5\u03C6\u03B1\u03C1\u03BC\u03CC\u03C3\u03B5\u03B9 \u03C4\u03BF \u03BA\u03CD\u03C1\u03B9\u03BF \u03C3\u03C4\u03C5\u03BB. \u0391\u03C5\u03C4\u03AE \u03B7 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1 \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B1\u03BD\u03B1\u03B9\u03C1\u03B5\u03B8\u03B5\u03AF. \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BF\u03C0\u03C9\u03C3\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03BD\u03B1 \u03C4\u03BF \u03BA\u03AC\u03BD\u03B5\u03C4\u03B5; img_max_size=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD: img_max_width_tooltip=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03C0\u03BB\u03AC\u03C4\u03BF\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B5\u03B9\u03C3\u03AC\u03B3\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03B7 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD. img_max_height_tooltip=\u039C\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03CD\u03C8\u03BF\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD \u03C0\u03BF\u03C5 \u03B5\u03B9\u03C3\u03AC\u03B3\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03B7 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD. img_resize_prompt=\u0397 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 "%s" \u03AD\u03C7\u03B5\u03B9 \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 %s \u03B5\u03B9\u03BA\u03BF\u03BD\u03BF\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD. \u0391\u03C5\u03C4\u03CC \u03BE\u03B5\u03C0\u03B5\u03C1\u03BD\u03AC\u03B5\u03B9 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B9\u03C3\u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C0\u03BF\u03C5 \u03B5\u03C0\u03B9\u03C4\u03C1\u03AD\u03C0\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C0\u03CC \u03C4\u03BF JClic Author (%s). \u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03C4\u03B5 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2; src/author/edu/xtec/resources/messages/AuthorMessages_es.properties000066400000000000000000001412661335566474600263040ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Descripci\u00f3n edit_act_name_tooltip=Nombre de la actividad edit_act_name=Nombre: edit_act_description_tooltip=Descripci\u00f3n de la actividad edit_act_reports_block=Informes edit_act_includeInReports=Incluir esta actividad en los informes edit_act_includeInReports_tooltip=Incluir los resultados de esta actividad en los informes de usuario edit_act_code=Codigo: edit_act_code_tooltip=C\u00f3digo opcional utilizado para agrupar y filtrar en la base de datos de informes. edit_act_reportActions=Registrar tambi\u00e9n las acciones edit_act_reportActions_tooltip=Registrar los detalles de todas las acciones efectuadas por los usuarios. edit_act_counters_block=Contadores edit_act_timeCounter=Contador de tiempo edit_act_timeCounter_tooltip=Mostrar u ocultar el contador de tiempo. edit_act_actionsCounter=Contador de intentos edit_act_actionsCounter_tooltip=Mostrar u ocultar el contador de intentos. edit_act_scoreCounter=Contador de aciertos edit_act_scoreCounter_tooltip=Mostrar u ocultar el contador de aciertos. edit_act_maxTime=Tiempo m\u00e1ximo: edit_act_maxTime_tooltip=Tiempo m\u00e1ximo permitido para resolver la actividad, en segundos. El cero significa tiempo ilimitado. edit_act_countdown=Cuenta atr\u00e1s edit_act_countdown_tooltip=El contador empieza al valor m\u00e1ximo, decreciendo hasta cero. edit_act_maxActions=Intentos m\u00e1x.: edit_act_maxActions_tooltip=N\u00famero m\u00e1ximo de intentos permitidos, o cero para ilimitado. edit_act_buttons_block=Botones edit_act_helpBtn=Ayuda edit_act_helpBtn_tooltip=Mostrar o esconder el bot\u00f3n de ayuda edit_act_helpBtn_solution=Mostrar la soluci\u00f3n edit_act_helpBtn_msg=Mostrar este mensaje: edit_act_infoBtn=Informaci\u00f3n edit_act_infoBtn_tooltip=Mostrar u ocultar el bot\u00f3n de informaci\u00f3n edit_act_infoBtn_url=Mostrar esta URL: edit_act_infoBtn_cmd=Ejecutar el comando: edit_act_infoBtn_url_tooltip=Direcci\u00f3n de la p\u00e1gina web que se mostrar\u00e1 al hacer clic en el bot\u00f3n de informaci\u00f3n. edit_act_infoBtn_cmd_tooltip=Linea de \u00f3rdenes que se ejecutar\u00e1 al hacer clic en el bot\u00f3n de informaci\u00f3n. edit_act_mainWindow=Ventana principal: edit_act_gameWindow=Ventana de juego: edit_act_margin=Margen: edit_act_margin_tooltip=Espacio vertical y horizontal entre objetos visuales. edit_act_bgColor=Color de fondo: edit_act_bgColor_tooltip=Cambiar el color de fondo. edit_gradient_startColor=Color inicial: edit_gradient_endColor=Color final: edit_gradient_startColor_tooltip=Selecci\u00f3n del color inicial edit_gradient_endColor_tooltip=Selecci\u00f3n del color final edit_gradient_cycles=Ciclos: edit_gradient_cycles_tooltip=N\u00famero de repeticiones del gradiente sobre la superficie a pintar. edit_gradient_orientation=Orientaci\u00f3n: edit_gradient_orientation_tooltip=Orientaci\u00f3n del gradiente, medida en grados sobre la horizontal. edit_act_gradient=Gradiente: edit_act_gradient_tooltip=Utilizar un gradiente de colores edit_color_opacity=Opacidad edit_color_opacity_tooltip=Ajusta el valor del canal alfa (opacidad) de color. edit_gradient_title=Gradiente edit_gradient_default=Utilizar los valores por defecto (gradiente nulo) edit_act_image=Imagen: edit_act_descriptionTab=Descripci\u00f3n edit_act_descriptionTab_tooltip=Nombre y descripci\u00f3n edit_act_tiledBgImg=En mosaico edit_act_tiledBgImg_tooltip=Pinta toda la superficie con la imagen, repiti\u00e9ndola a lo largo de los ejes X e Y tantas veces como sea necesario. edit_act_preview=Vista previa: edit_act_border=Borde edit_act_border_tooltip=Dibujar una linea de borde alrededor de la ventana edit_act_transparent=Transparente edit_act_transparent_tooltip=La ventana tiene el fondo transparente edit_act_width=Anchura: edit_act_height=Altura: edit_act_width_tooltip=Anchura del objeto, indicada en pixels edit_act_height_tooltip=Altura del objeto, en pixels edit_act_centered=Centrada edit_act_centered_tooltip=El objeto se situa centrado respecto a la ventana principal edit_act_x=X: edit_act_x_tooltip=Posici\u00f3n horizontal absoluta edit_act_y=Y: edit_act_y_tooltip=Posici\u00f3n vertical absoluta edit_act_ui_block=Interfaz de usuario edit_act_image_tooltip=Seleccionar una imagen edit_act_text=Texto: edit_act_text_tooltip=Texto que se mostrar\u00e1 en este objeto edit_font_face=Tipo: edit_font_size=Tama\u00f1o: edit_font_bold=Negrita edit_font_italic=Cursiva edit_font_underline=Subrayado edit_font_style=Estilo: edit_cell_title=Contenido de la casilla edit_act_messages=Mensajes edit_act_msg_initial=Mensaje inicial: edit_act_msg_final=Mensaje final: edit_act_msg_prev=Mensaje previo: edit_act_msg_error=Mensaje de error: edit_act_msg_initial_tooltip=Mensaje que se muestra al inicar la actividad edit_act_msg_final_tooltip=Mensaje que se muestra al acabar la actividad edit_act_msg_error_tooltip=Mensaje que se muestra al acabar la actividad con errores edit_act_msg_prev_tooltip=Mensaje que se muestra antes de empezar (solo en ciertos tipos de actividades) edit_align=Orientaci\u00f3n: edit_act_textColor=Color del texto: edit_act_textColor_tooltip=Color utilizado para dibujar el texto edit_act_shadowColor=Color de la sombra: edit_act_shadowColor_tooltip=Color utilizado en la sombra del texto, si existe. edit_act_shadow=Sombra edit_act_shadow_tooltip=Dibujar el texto con sombra edit_act_borderColor=Color del borde: edit_act_borderColor_tooltip=Color utilizado para dibujar el borde de la casilla edit_act_inactiveColor=Color de estado inactivo: edit_act_inactiveColor_tooltip=Color utilizado cuando la casilla est\u00e1 desactivada edit_act_altColor=Color alternativo: edit_act_altColor_tooltip=Color con el que se muestra el contenido alternativo de las casillas una vez solucionadas. edit_cell_marked=Marcada edit_cell_disabled=Desactivada edit_cell_alt=Alternativa edit_cell_textMargin=Margen interno: edit_cell_textMargin_tooltip=Espacio entre los bordes de la celda y el texto. edit_cell_borderWidth=Grosor del borde: edit_cell_borderWidth_tooltip=Grosor del trazo utilizado para dibujar el borde. edit_cell_markerWidth=Grosor del marcador: edit_cell_markerWidth_tooltip=Grosor del trazo utilizado para dibujar el borde cuando la casilla se encuentra marcada o seleccionada. edit_cell_alt_tooltip=Vista previa de la casilla en estado "alternativo" edit_cell_disabled_tooltip=Vista previa en estado "desactivado" edit_cell_marked_tooltip=Vista previa en estado "marcado" edit_act_testAction=Mostrar actividad edit_act_testAction_tooltip=Probar el funcionamiento de la actividad edit_act_panels_description=Descripci\u00f3n edit_act_panels_description_tooltip=T\u00edtulo y descripci\u00f3n de la actividad edit_act_panels_options=Opciones edit_act_panels_options_tooltip=Opciones de la actividad edit_act_panels_frame=Ventana edit_act_panels_frame_tooltip=Aspecto, tama\u00f1o y posici\u00f3n de la ventana en la que corre la actividad edit_act_panels_messages=Mensajes edit_act_panels_messages_tooltip=Contenido de los mensajes de la actividad edit_act_panels_panel=Panel edit_act_panels_panel_tooltip=Contenido del panel edit_style_title=Estilo edit_style_tooltip=Ajustar el color, tipo y tama\u00f1o de letra de las celdas edit_act_style=Estilo: edit_act_overlap=Evitar sobreposici\u00f3n imagen/texto edit_act_overlap_tooltip=Intentar evitar que texto e imagen se solapen edit_media_exists_1=El archivo edit_media_exists_2=ya se encuentra en la mediateca! edit_act_shaper=Recortador: edit_act_shaper_err=Error en el generador de formas: edit_act_num_cols=Columnas: edit_act_num_rows=Filas: edit_act_toothHeightFactor=Altura de los dientes: edit_act_toothWidthFactor=Anchura de los dientes: edit_act_toothRandom=Distribuci\u00f3n aleatoria edit_act_shaper_properties=Propiedades del generador de formas edit_act_panels_text=Texto edit_act_panels_text_tooltip=Texto de la actividad action_saveFile_caption=Guardar... action_saveFile_keys=GG action_saveFile_tooltip=Guardar el proyecto action_docTree_caption=\u00c1rbol del documento... action_docTree_keys=A* action_docTree_tooltip=Mostrar el documento del proyecto en forma de \u00e1rbol edit_docTree_title=\u00c1rbol del documento edit_media_referencedBy=Referenciado por: msg_prompt_loadReferences=Atenci\u00f3n:

Este proyecto enlaza con otros proyectos.
\u00bfDesea explorar los enlaces y cargar todos los archivos relacionados?

(Se recomienda responder SI cuando se est\u00e1 importando un paquete de actividades Clic 3.0) edit_mc_type=Tipo: edit_mc_type_unknown=Desconocido edit_mc_type_sound=Interpretar sonido edit_mc_type_video=Interpretar video edit_mc_type_midi=Interpretar MIDI edit_mc_type_cdaudio=Interpretar CD audio edit_mc_type_record=Grabar sonido edit_mc_type_play_recorded=Interpretar grabaci\u00f3n edit_mc_type_run_activity=Ir a la actividad edit_mc_type_run_sequence=Ir a la secuencia edit_mc_type_run_external=Ejecutar un programa edit_mc_type_url=Mostrar la URL edit_mc_type_exit=Acabar edit_mc_type_return=Volver edit_mc_level=Nivel de prioridad: edit_mc_file=Archivo: edit_mc_externalParam=Par\u00e1metros: edit_mc_from=Desde: edit_mc_to=Hasta: edit_mc_length=Duraci\u00f3n m\u00e1x.: edit_mc_recBuffer=Cinta de grabaci\u00f3n: edit_mc_stretch=Comprimir si no cabe edit_mc_location=Posici\u00f3n: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Desde: edit_mc_location_from_box=Celda edit_mc_location_from_window=Ventana edit_mc_location_from_frame=Marco edit_mc_loop=Repetir indefinidamente edit_mc_autostart=Arranque autom\u00e1tico edit_mc_catchmouse=Capturar rat\u00f3n edit_mc_title=Contenido activo y multimedia edit_mc_label=Contenido activo: edit_media_dlg_title=Selecci\u00f3n del objeto multimedia edit_media_title=Biblioteca de recursos edit_mc_pos_cell=Centrado en la celda edit_mc_pos_window=Centrado en la ventana edit_mc_pos_absolute=Especificar posici\u00f3n: edit_tree_badFormat=La estructura o los datos del \u00e1rbol son incorrectos. edit_act_panels_controls=Controles edit_act_panels_controls_tooltip=Opciones de botones y contadores edit_act_class=Tipo: edit_act_gridLayout=Distribuci\u00f3n de los paneles: edit_act_gridLayout_tooltip=Posici\u00f3n relativa de los paneles A y B. edit_act_inverseResolution=Resoluci\u00f3n inversa edit_act_inverseResolution_tooltip=La actividad se considerar\u00e1 resuelta cuando todos los elementos de "B" est\u00e9n emparejados. edit_act_showAllArrows=Mostrar todas las flechas edit_act_alt=Contenido alternativo: edit_act_alt_tooltip=Contenido que se muestra en las casillas ya resueltas o no asignadas. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Editar el contenido alternativo edit_act_grid=Panel edit_act_grid_A=Panel A edit_act_grid_B=Panel B edit_act_grid_layout=Distribuci\u00f3n edit_act_grid_relationship=Relaciones edit_seq_activity_header=actividad edit_seq_tag_header=etiqueta edit_seq_jump_header=salto a edit_seq_activity=Actividad: edit_seq_tag=Etiqueta: edit_seq_description=Descripci\u00f3n: edit_seq_auto=Avance autom\u00e1tico edit_seq_delay=Retardo: edit_seq_action_fwd=Avanzar edit_seq_action_back=Retroceder edit_seq_action_jump=Saltar a... edit_seq_action_stop=Detenerse edit_seq_action_return=Volver edit_seq_action_exit=Salir de JClic edit_seq_arrow_fwd=Flecha adelante: edit_seq_arrow_back=Flecha atr\u00e1s: edit_seq_action=Acci\u00f3n: edit_seq_button_enabled=Mostrar bot\u00f3n edit_seq_project=Proyecto JClic: edit_act_absolute=Posici\u00f3n absoluta edit_act_absolute_tooltip=El objeto se situar\u00e1 en las coordenadas X e Y que se especifiquen edit_act_location=Posici\u00f3n: edit_seq_newElement=Nuevo elemento de secuencia... edit_seq_newElement_tooltip=Insertar un nuevo elemento en la secuencia de actividades edit_seq_newElement_msg=Seleccione una actividad para el nuevo elemento de secuencia. edit_seq_newElement_error_noAct=\u00a1No se puede crear un nuevo elemento de secuencia sin indicar la actividad! edit_seq_newElement_error_emptyList=En este proyecto no hay ninguna actividad. No se pueden crear elementos de secuencia en un proyecto vac\u00edo. edit_seq_jump_msg=Destino del salto: edit_seq_jump_title=Destino del salto edit_act_newActivity_tooltip=A\u00f1adir una nueva actividad al projecto edit_act_prompt_class=Tipo de actividad: edit_act_prompt_name=Nombre: edit_act_newActivity_msg=Seleccione el tipo de actividad que desea crear y as\u00edgnele un nombre: edit_act_newActivity_error_noAct=\u00a1Hay que seleccionar un tipo de actividad! edit_act_newActivity_error_noName=\u00a1Hay que indicar un nombre para la actividad! edit_act_newActivity_error_creating=\u00a1No se ha podido crear la actividad! edit_act_newActivity_class=Clase Java: edit_text_act_format=Formato edit_text_act_answer=Respuesta edit_text_act_popup=Ventana emergente edit_text_act_answer_label=Respuestas v\u00e1lidas: edit_list_newElement_tooltip=A\u00f1adir un nuevo elemento a la lista edit_list_editElement_tooltip=Modificar el elemento seleccionado edit_list_deleteElement_tooltip=Eliminar el elemento seleccionado de la lista edit_list_upBtn_tooltip=Mover arriba edit_list_downBtn_tooltip=Mover abajo edit_list_newValue=Nuevo texto: edit_list_addElement=A\u00f1adir un nuevo elemento de texto edit_list_modifyValue=Modificaci\u00f3n del texto seleccionado edit_text_act_target=Inc\u00f3gnita edit_text_act_maxLen=Longitud m\u00e1xima: edit_text_act_maxLen_tooltip=N\u00famero m\u00e1ximo de caracteres permitidos en la respuesta. edit_text_act_fillingChar=Car\u00e1cter de relleno edit_text_act_fillingChar_tooltip=Car\u00e1cter utilizado para indicar la inc\u00f3gnita edit_text_act_iniLen=Longitud inicial: edit_text_act_iniLen_tooltip=N\u00famero de caracteres de relleno que se mostraran al inicio de la actividad. edit_text_act_iniText=Texto inicial: edit_text_act_iniText_tooltip=Texto que se mostrar\u00e1 en la inc\u00f3gnita al iniciar la actividad. edit_text_act_list=Mostrar una lista de opciones: edit_text_act_list_tooltip=El usuario/a deber\u00e1 elegir una opci\u00f3n en una lista. edit_text_act_check_title=Opciones de evaluaci\u00f3n edit_text_act_popup_no=Sin ventana emergente edit_text_act_popup_always=Aparici\u00f3n autom\u00e1tica edit_text_act_popup_onError=Aparici\u00f3n en errores edit_text_act_popup_onDemand=Aparici\u00f3n con F1 edit_text_act_popup_type=Tipo: edit_text_act_popup_delay=Retardo de aparicion: edit_text_act_popup_maxTime=Tiempo m\u00e1ximo: edit_text_act_popup_onlyPlay=Solamente interpretar sonido edit_text_act_err_noSelection=Para crear una nueva inc\u00f3gnita es necesario seleccionar un fragmento de texto. edit_text_act_err_badCharInSelection=El texto de las inc\u00f3gnitas no puede incluir retornos de p\u00e1rrafo ni tabuladores. edit_text_act_err_nestedTargets=Las inc\u00f3gnitas no se pueden solapar edit_text_act_err_cellInTarget=\u00a1Las inc\u00f3gnitas no pueden contener celdas! edit_text_act_pageBgColor=Color del papel: edit_text_act_editStylesBtn=Editar los estilos del documento... edit_text_act_mainStyle=Estilo principal: edit_text_act_tabSpc=Tab space: edit_text_act_tabSize=Espacios entre marcas de tabulador: edit_text_act_colors=Colores: edit_text_act_targetStyle=Colores de las inc\u00f3gnitas: edit_text_act_errorStyle=Colores de error: edit_text_act_preview=Vista preliminar: edit_text_act_styleSample_default_start=Texto normal edit_text_act_styleSample_target=inc\u00f3gnita edit_text_act_styleSample_error=error edit_text_act_styleSample_default_fill=texto normal edit_text_act_styleSample_default_end=texto normal. edit_text_act_warnDeleteTarget=Atenci\u00f3n: esta acci\u00f3n suprimir\u00e1 la inc\u00f3gnita actualmente seleccionada. \u00bfSeguro que desea hacerlo? edit_text_act_prevScreen_title=Ventana previa... edit_text_act_prevScreen_no=No mostrar ning\u00fan texto antes de empezar la actividad edit_text_act_prevScreen_original=Mostrar el texto completo del ejercicio edit_text_act_prevScreen_special=Mostrar este texto: edit_text_act_prevScreen_time=Tiempo m\u00e0ximo: edit_text_act_edit_target=Inc\u00f3gnita... edit_text_act_checkButton_show=Mostrar bot\u00f3n de evaluaci\u00f3n edit_text_act_checkButtonText=Texto del bot\u00f3n: edit_text_act_checkCase=Comprobar may\u00fasculas / min\u00fasculas edit_text_act_checkAccents=Considerar acentos y caracteres especiales edit_text_act_checkPunct=Considerar los s\u00edmbolos de puntuaci\u00f3n edit_text_act_checkDoubleSpc=Permitir espacios repetidos edit_text_act_checkOptions=Criterios edit_text_act_checkAutoJump=Saltar autom\u00e1ticamente a la siguiente inc\u00f3gnita edit_text_act_checkForceOk=Avanzar solo si se responde correctamente edit_text_act_checkDetail=Indicar la posici\u00f3n de los errores edit_text_act_checkDetail_params=Par\u00e1metros del algoritmo de an\u00e1lisis: edit_text_act_checkDetail_steps=Pasos: edit_text_act_checkDetail_field=Campo de exploraci\u00f3n: edit_text_act_defaultCheckButtonText=Evaluaci\u00f3n edit_text_act_advancedCorrectionOptions=An\u00e1lisis de las respuestas edit_text_act_check_bt=Evaluaci\u00f3n... edit_text_act_checkButton=Bot\u00f3n de evaluaci\u00f3n edit_text_act_checkProgress=Progreso edit_text_act_typeBtn=Tipo... edit_text_act_orderParagraphs=Ordenar p\u00e1rrafos edit_text_act_orderWords=Ordenar palabras edit_text_act_order_amongstPar=Barajar palabras entre p\u00e1rrafos edit_text_act_type_title=Tipo de actividad edit_text_act_warnChangeType=Esta acci\u00f3n suprimir\u00e1 todas las inc\u00f3gnitas actualmente definidas. \u00bfSeguro que desea hacerlo? edit_text_act_identWords=Identificar palabras edit_text_act_identChars=Identificar caracteres edit_media_change_name=Cambiar nombre... edit_media_change_file=Cambiar el archivo... edit_media_includeInZip=Guardarlo en el archivo ZIP edit_media_type=Tipo de recurso: edit_media_size=Tama\u00f1o del archivo: edit_media_show_type=Tipo de archivos: edit_media_preview=Visualizar objeto edit_media_preview_tooltip=Previsualizaci\u00f3n del recurso multimedia edit_media_rename=Cambiar el nombre del recurso edit_media_rename_title=Renombrar edit_media_rename_prompt=Nuevo nombre: edit_media_rename_invalid=\u00a1Nombre de recurso no v\u00e1lido! edit_media_rename_exists=Ya existe otro recurso con este nombre. Los recursos deben tener un nombre \u00fanico en el proyecto. edit_media_chfile_invalid=Archivo incorrecto err_media_chfile_different=File must be of same type edit_media_font_error=No se pudo cargar el tipo de letra. edit_media_save_file=Guardar el archivo (extraerlo del ZIP) edit_media_refresh_file=Actualizar el contenido del recurso desde el archivo edit_media_warn_zipFileNotExternal=Este no es un archivo real, sino un objeto situado en el interior de un contenedor ZIP. Para utilizar esta funci\u00f3n es necesario que exista un archivo con el mismo nombre en la carpeta donde se halla el archivo ZIP. edit_activities=Actividades edit_sequences=Secuencias edit_media=Mediateca edit_media_tooltip=Gesti\u00f3n de las im\u00e1genes y otros recursos utilizados en el proyecto. edit_activities_tooltip=Creaci\u00f3n y edici\u00f3n de las actividades del proyecto edit_sequences_tooltip=Creaci\u00f3n y edici\u00f3n de secuencias de actividades edit_project_title=T\u00edtulo: edit_project_title_tooltip=T\u00edtulo del proyecto edit_project=Proyecto edit_project_tooltip=Edici\u00f3n de las propiedades del proyecto edit_project_description=Descripci\u00f3n: edit_project_description_tooltip=Descripci\u00f3n general del proyecto edit_project_images_block=Im\u00e1genes edit_project_cover=Car\u00e1tula (300x200 aprox.): edit_project_cover_tooltip=Imagen a utilizar como car\u00e1tula del proyecto en bibliotecas de recursos edit_project_thumb=Miniatura (100x70 aprox.): edit_project_thumb_tooltip=Imagen a utilizar como miniatura del proyecto en botones y listados edit_project_icon16=Icono peque\u00f1o (16x16): edit_project_icon72=Icono mediano (72x72): edit_project_icon192=Icono grande (192x192): edit_project_icons_tooltip=Iconos que se declaran al exportar a HTML5 edit_project_area=Areas: edit_project_area_tooltip=\u00c1reas curriculares a las que se orienta el proyecto edit_project_level=Niveles: edit_project_level_tooltip=Niveles y ciclos educativos a los que se orienta el proyecto edit_project_descriptors=Descriptores: edit_project_descriptors_tooltip=Descriptores del proyecto (separados por comas) edit_project_languages=Idiomas: edit_project_languages_tooltip=Idiomas utilizados en el proyecto edit_project_languages_modify=Cambio del idioma seleccionado edit_project_languages_add=A\u00f1adir idioma edit_project_languages_select=C\u00f3digos de idioma ISO-639: edit_project_languages_already_selected=\u00a1Este idioma estaba ya seleccionado! edit_project_languages_confirm_delete=\u00bfRealmente desea eliminar este idioma? (no se puede deshacer) edit_project_authors=Autores/as: edit_project_authors_tooltip=Personas que han participado en la creaci\u00f3n del proyecto edit_project_author_name=Nombre: edit_project_author_mail=Correo electr\u00f3nico: edit_project_author_rol=Rol: edit_project_author_organization=Organizaci\u00f3n: edit_project_author_comments=Comentarios: edit_project_author_url=URL: edit_project_author_name_tooltip=Nombre del autor/a (campo obligatorio) edit_project_author_mail_tooltip=Direcci\u00f3n de correo electr\u00f3nico del autor/a (opcional) edit_project_author_rol_tooltip=Rol de la persona en el proyecto: autor, colaborador, dibujos, sonidos... (opcional) edit_project_author_organization_tooltip=Escuela, universidad, asociaci\u00f3n... (campo opcional) edit_project_author_url_tooltip=P\u00e1gina web personal (campo opcional) edit_project_author_comments_tooltip=Otras caracter\u00edsticas (campo opcional) edit_project_author_info=Datos del autor/a: edit_project_author_add=A\u00f1adir un autor a la lista edit_project_author_edit=Modificaci\u00f3n de los datos del autor/a edit_project_org_name=Nombre: edit_project_org_name_tooltip=Nombre de la escuela edit_project_org_mail=Correo electr\u00f3nico: edit_project_org_mail_tooltip=Direcci\u00f3n de correo electr\u00f3nico de la escuela edit_project_org_url=URL: edit_project_org_url_tooltip=Direcci\u00f3n web de la escuela edit_project_org_address=Direcci\u00f3n: edit_project_org_address_tooltip=Direcci\u00f3n postal de la escuela edit_project_org_pc=CP: edit_project_org_pc_tooltip=C\u00f3digo postal edit_project_org_city=Localidad: edit_project_org_city_tooltip=Localidad de la escuela edit_project_org_country=Pais: edit_project_org_state=Estado: edit_project_org_comments=Comentarios: edit_project_org=Centro/s: edit_project_org_tooltip=Escuelas y otras instituciones que han participado en el proyecto edit_project_org_info=Datos de la organizaci\u00f3n: edit_project_org_add=A\u00f1adir una nueva organizaci\u00f3n edit_project_org_edit=Modificar los datos de la organizaci\u00f3n edit_project_org_country_tooltip=Estado, pais, federaci\u00f3n... edit_project_org_state_tooltip=Estado federal, nacionalidad, comunidad, regi\u00f3n... edit_project_org_comments_tooltip=Otros datos... edit_project_rev_date=Fecha: edit_project_rev_date_tooltip=Fecha de la revisi\u00f3n edit_project_rev_authors=Autores/as: edit_project_rev_authors_tooltip=Autores/as de la revisi\u00f3n edit_project_rev_description=Descripci\u00f3n: edit_project_rev_description_tooltip=Breve descripci\u00f3n de los cambios realizados edit_project_rev_comments=Comentarios: edit_project_rev_comments_tooltip=Informaci\u00f3n adicional edit_project_rev=Revisiones: edit_project_rev_tooltip=Historial de las principales modificaciones efectuadas al proyecto edit_project_rev_add=A\u00f1adir un registro de revisi\u00f3n edit_project_rev_edit=Edici\u00f3n de los datos de la revisi\u00f3n edit_project_rev_info=Caracter\u00edsticas de la revisi\u00f3n edit_media_objects=objetos edit_media_object=objeto edit_evsounds_start=Inicio de actividad: edit_evsounds_click=Hacer clic en un objeto: edit_evsounds_actionError=Acci\u00f3n err\u00f3nea: edit_evsounds_actionOk=Acci\u00f3n correcta: edit_evsounds_finishedError=Actividad finalizada con errores: edit_evsounds_finishedOk=Actividad correctamente finalizada: edit_project_rev_err_nodesc=Error: La descripci\u00f3n no se puede dejar en blanco edit_evsounds_dlg_title=Edici\u00f3n de los sonidos de evento edit_project_evsounds=Sonidos de evento: edit_project_evsounds_tooltip=Asignar sonidos espec\u00edficos a cada evento de JClic edit_act_evsounds=Sonidos de evento: edit_act_evsounds_tooltip=Asignar sonidos espec\u00edficos a cada evento de JClic edit_evsounds_default=sonido por defecto edit_evsounds_disabled=desactivado edit_evsounds_chk_tooltip=Activa o desactiva el sonido para este evento edit_evsounds_select_tooltip=Haga clic para seleccionar el sonido ligado a este evento, o desmarque para utilizar el sonido por defecto action_newProject_caption=Nuevo proyecto... action_newProject_keys=NN action_newProject_tooltip=Crear un nuevo proyecto JClic edit_arith_op_from=Desde: edit_arith_op_from_tooltip=Valor m\u00ednimo del operando edit_arith_op_to=Hasta: edit_arith_op_to_tooltip=Valor m\u00e1ximo del operando edit_arith_op_with=Con: edit_arith_op_with_tooltip=Si se marca, el operando puede tener tambi\u00e9n este valor edit_arith_op_fromList=Uno de la lista: edit_arith_op_fromList_tooltip=Lista de posibles valores del operando edit_arith_op_decimals=Decimales: edit_arith_op_decimals_tooltip=N\u00famero de decimales del operando edit_arith_op_dec0=# (entero) edit_arith_op_dec1=#,# edit_arith_op_dec2=#,## edit_arith_firstOp=Primer operando edit_arith_secondOp=Segundo operando edit_arith_title=Arith2 para JClic edit_arith_operations=Operaciones: edit_arith_operations_tooltip=Selecciona el tipo de operaciones a efectuar edit_arith_operations_plus=Sumas edit_arith_operations_minus=Restas edit_arith_operations_multiply=Multiplicaciones edit_arith_operations_divide=Divisiones edit_arith_unknown=Inc\u00f3gnita: edit_arith_unknown_tooltip=Selecciona el elemento que har\u00e1 de inc\u00f3gnita edit_arith_unknown_aobx=La inc\u00f3gnita es el resultado edit_arith_unknown_aoxr=La inc\u00f3gnita es el segundo operando edit_arith_unknown_xobr=El primer operando es la inc\u00f3gnita edit_arith_unknown_axbr=La operaci\u00f3n es la inc\u00f3gnita edit_arith_unknown_invert=Escribir la expressi\u00f3n empezando por el resultado edit_arith_result=Resultado: edit_arith_result_notCarry=Sin "llevar" edit_arith_result_random=Aleatorio edit_arith_result_asc=Ascendente edit_arith_result_order=Ordenar por resultado: edit_arith_result_desc=Descendente edit_arith_result_avoidDup=Evitar duplicados edit_arith_cond=Condiciones: edit_arith_cond_ind=Indiferente edit_arith_cond_agb=El primer operando debe ser mayor que el segundo edit_arith_cond_alb=El primer operando debe ser menor que el segundo edit_arith_cond_tooltip=Otras condiciones edit_autocp=Generador autom\u00e1tico de contenido: edit_autocp_tooltip=Selecci\u00f3n del tipo de generador autom\u00e1tico de contenido para esta actividad. edit_autocp_block=Generador de contenido edit_autocp_btn=Configuraci\u00f3n... edit_autocp_btn_tooltip=Configuraci\u00f3n de los par\u00e1metros del generador de contenido edit_data=Edici\u00f3n de datos edit_act=Edici\u00f3n de la actividad edit_acp=Edici\u00f3n del generador de contenido edit_acp_err_creating=\u00a1Error de creaci\u00f3n del generador autom\u00e1tico de contenido! edit_project_author_group=Creaci\u00f3n edit_project_description_block=Descripci\u00f3n edit_project_ui_block=Interfaz de usuario edit_act_description=Descripci\u00f3n: m_Edit=Edici\u00f3n m_Edit_Mnemonic=E edit_media_preview_keys=V* edit_act_newActivity=Nueva actividad... edit_act_newActivity_keys=A* edit_act_testAction_keys=M#10 edit_seq_newElement_keys=S* m_Insert=Insertar m_Insert_Mnemonic=I m_View=Ver m_View_Mnemonic=V action_editProject_caption=Proyecto action_editProject_keys=PP action_editProject_tooltip=Editar las propiedades del proyecto action_editMedia_caption=Mediateca action_editMedia_keys=MM action_editMedia_tooltip=Edici\u00f3n de la biblioteca multimedia del proyecto action_editActivities_caption=Actividades action_editActivities_keys=AA action_editActivities_tooltip=Edici\u00f3n de las actividades action_editSeq_caption=Secuencias action_editSeq_keys=SS action_editSeq_tooltip=Edici\u00f3n de las secuencias de actividades warn_project_modified=El proyecto actual ha sido modificado. \u00bfDesea guardar los cambios? edit_project_descriptors_block=Descriptores edit_media_new=Nuevo objeto multimedia... edit_media_new_tooltip=A\u00f1adir una imagen o un objeto multimedia a la mediateca edit_media_new_keys=M* edit_seq_threshold=Umbral de puntuaci\u00f3n: edit_seq_threshold_tooltip_up=Seguir este camino cuando la puntuaci\u00f3n global sea mayor o igual que... edit_seq_time=Umbral de tiempo: edit_seq_time_tooltip_up=Para seguir este camino hay que haber realizado las actividades en un tiempo inferior a... edit_seq_threshold_tooltip_down=Sigue este camino siempre que la puntuaci\u00f3n global sea inferior a... edit_seq_time_tooltip_down=Seguir este camino siempre que el tiempo empleado en las actividades sea superior a... edit_seq_condJump=Saltos condicionales edit_seq_condJump_tooltip=Especificar saltos que se ejecutaran \u00fanicamente si se dan determinadas condiciones edit_seq_condJump_upper_tooltip=Indicar las condiciones para saltar a un nivel superior edit_seq_condJump_lower=Salto inferior: edit_seq_condJump_upper=Salto superior: edit_seq_condJump_lower_tooltip=Indicar las condiciones para saltar a un nivel inferior edit_seq_action_tooltip_fw=Acci\u00f3n asignada al bot\u00f3n de avanzar edit_seq_action_tooltip_bk=Acci\u00f3n asignada al bot\u00f3n de retroceder edit_seq_jump_tooltip=Indicar el destino del salto edit_seq_action_tooltip=Acci\u00f3n a realizar edit_seq_activity_tooltip=Actividad asociada a este elemento de secuencia edit_seq_tag_tooltip=Etiqueta utilizada para referirse a este elemento de secuencia (campo opcional) edit_seq_description_tooltip=Descripci\u00f3n del elemento de secuencia (campo opcional) edit_seq_button_enabled_tooltip=Activar o desactivar el bot\u00f3n de paso de actividad edit_seq_auto_tooltip=Avanzar autom\u00e1ticamente al acabar la actividad edit_seq_delay_tooltip=N\u00famero de segundos a esperar antes de realizar el paso autom\u00e1tico edit_color_dlgTitle=Selecci\u00f3n del color edit_media_renaming=Por favor, espere mientras se cambia el nombre del recurso... edit_act_cell_width=Ancho: edit_act_cell_width_tooltip=Anchura de las celdas (en pixels) edit_act_cell_height=Alto: edit_act_cell_height_tooltip=Altura de las celdas (en pixels) edit_act_hiddenWords=Palabras escondidas: edit_act_hiddenWords_tooltip=Lista de las palabras escondidas en el panel edit_act_wordSearch_panelB=Utilizar el panel B edit_act_wordSearch_panelB_tooltip=Usar un segundo panel, que se mostrar\u00e1 a medida que se vayan encontrando las palabras edit_act_shaper_tooltip=Selecci\u00f3n del tipo de generador de formas del panel edit_act_num_cols_tooltip=N\u00famero de columnas del panel edit_act_num_rows_tooltip=N\u00famero de filas del panel edit_act_wildTransparent=Separadores transparentes edit_act_wildTransparent_tooltip=Mostrar los separadores (casillas negras) como agujeros transparentes edit_act_behavior_scramble_times=Mezclas: edit_act_behavior_scramble_times_tooltip=N\u00famero de veces que se mezclaran las piezas edit_act_copy_title=Copiar atributos a... edit_act_copy_attributes=Atributos: edit_act_copy_dest=Aplicar a: edit_act_copy_style_main=Ventana principal edit_act_copy_style_play=Ventana de juego edit_act_copy_activities=Actividades a modificar: edit_act_copyAttributes=Copiar atributos edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copiar a otras actividades algunos de los atributos de la actividad actual edit_new_project_name=Nombre del proyecto: edit_new_project_name_tooltip=Nombre corto y descriptivo del proyecto edit_new_project_filename=Nombre del archivo: edit_new_project_filename_tooltip=Nombre del archivo del proyecto, sin extensi\u00f3n edit_new_project_folder=Carpeta: edit_new_project_folder_tooltip=Nombre de la carpeta en la que se guardar\u00e1 el proyecto edit_new_project_folder_browse=Navegar... edit_new_project_title=Creaci\u00f3n de un nuevo proyecto JClic edit_new_project_err_empty=Error: Tanto el proyecto como el archivo y la carpeta deben tener nombres v\u00e1lido. edit_new_project_warning_noEmptyFolder=En esta carpeta existe ya otro proyecto Clic3.0 o JClic. Para evitar confusiones se recomienda mantener cada proyecto en una carpeta independiente, aunque no es un requisito imprescindible. \u00bfRealmente desea crear el nuevo proyecto en esta carpeta? edit_new_project_err_folderCreation=Error: \u00a1No fue posible crear la carpeta indicada! edit_act_copy_err_noSelection=Error: No se ha seleccionado ninguna actividad. Para utilizar esta funci\u00f3n es necesario seleccionar en la lista la actividad o actividades a las que se aplicaran los atributos indicados. edit_act_copy_action_prefix=Copiando atributos a: edit_act_copy_margin=Margen edit_act_copy_bgColor=Color de fondo edit_act_copy_gradient=Gradiente edit_act_copy_bgImage=Imagen de fondo edit_act_copy_border=Borde edit_act_copy_transparentBg=Fondo transparente edit_act_copy_position=Posici\u00f3 edit_act_copy_messages=Mensajes edit_act_copy_messages_ini=Estilo del mensaje inicial edit_act_copy_messages_end=Estilo del mensaje final edit_act_copy_messages_err=Estilo del mensaje de error edit_act_copy_reports=Informes edit_act_copy_rep_include=Incluir la actividad en los informes edit_act_copy_rep_actions=Registrar acciones edit_act_copy_interface=Interfaz de usuario edit_act_copy_skin=Entorno visual edit_act_copy_evSounds=Sonidos de evento edit_act_copy_counters=Contadores edit_act_copy_cTime=Contador de tiempo edit_act_copy_maxTime=Tiempo m\u00e1ximo edit_act_copy_cTries=Contador de intentos edit_act_copy_maxTries=N\u00famero m\u00e1ximo de intentos edit_act_copy_cScore=Contador de aciertos edit_act_copy_scramble=N\u00famero de veces que hay que barajar edit_act_copy_buttons=Botones edit_act_copy_btnHelp=Bot\u00f3n de ayuda edit_act_copy_btnInfo=Bot\u00f3n de informaci\u00f3n edit_act_copy_grids=Paneles edit_act_copy_gridA=Estilo del panel A edit_act_copy_gridB=Estilo del panel B edit_act_copy_textGrid=Estilo de los paneles de texto edit_act_copy_text=Actividades de texto edit_act_copy_fontFace=Tipo de letra edit_act_copy_fontSize=Tama\u00f1o de letra edit_act_copy_fontStyle=Estilo de letra edit_act_copy_textColour=Color del texto principal edit_act_copy_textTargetColour=Color de las inc\u00f3gnitas edit_act_copy_textErrorColour=Color de los errores edit_act_copy_tabSpace=Espacio entre tabuladores edit_act_copy_messages_prev=Estilo del mensaje previo edit_act_changeType=Cambiar el tipo de actividad edit_act_newActivity_class_tooltip=Nombre completo de la clase que se utilizar\u00e1 para construir la actividad (usuarios avanzados!) edit_act_newActivity_other=Otras... edit_act_newActivity_info=Los usuarios/as avanzados/as pueden crear tambi\u00e9n otros tipos de actividades JClic no registradas. Escriba debajo el nombre completo de la clase, precedida por el del paquete (por ejemplo: "com.acme.activities.FooActivity"). Las nuevas actividades deben extender edu.xtec.jclic.Activity, y han de ser accesibles al cargador de clases de la m\u00e1quina virtual de Java. edit_act_newActivity_name=Nombre de la actividad edit_act_newActivity_name_tooltip=Cada actividad debe tener un nombre \u00fanico en el proyecto edit_act_changeType_warning=

Atenci\u00f3n: El cambio del tipo puede causar la p\u00e9rdida de algunos de los atributos y objetos de la actividad que se est\u00e1 editando. \u00a1Utilice est\u00e1 funci\u00f3n con cuidado!

 

applet_codebase=Ubicaci\u00f3n del c\u00f3digo JClic: applet_codebase_tooltip=URL que apunta a una carpeta en la que est\u00e9n ubicados los archivos de programa de JClic applet_prev_text=C\u00f3digo HTML previo: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Texto o c\u00f3digo HTMl que aparecer\u00e1 antes del applet applet_post_text=C\u00f3digo HTML posterior: applet_post_text_tooltip=Texto o c\u00f3digo HTMl que aparecer\u00e1 despu\u00e9s del applet applet_size=Tama\u00f1o del applet: applet_size_tooltip=Anchura y altura del applet, en valores absolutos o porcentuales. applet_page_title=T\u00edtulo de la p\u00e1gina: applet_page_title_tooltip=Texto que se mostrar\u00e1 en la parte superior de la ventana del navegador applet_created_info=La p\u00e1gina web "%s" ha sido creada con \u00e9xito. applet_created_prompt=\u00bfDesea abrirla ahora con el navegador? action_createHTML_caption=Crear una p\u00e1gina web con un applet Java... applet_create_title=Creaci\u00f3n de una p\u00e1gina HTML con un applet JClic action_createHTML_tooltip=Creaci\u00f3n de una p\u00e1gina HTML con un applet que contenga el proyecto actual. applet_filename=Nombre del archivo: applet_filename_tooltip=Nombre del archivo HTML a crear action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Valores por defecto usados en la creaci\u00f3n de p\u00e1ginas web applet_bgcolor=Color de fondo: applet_bgcolor_tooltip=Color de fondo de la p\u00e1gina web applet_centered=Centrado applet_centered_tooltip=Situar el applet centrado horizontalmente applet_width_tooltip=Anchura del applet (en valor absoluto o porcentual) applet_height_tooltip=Altura del applet (en valor absoluto o porcentual) applet_exitUrl=Al salir, ir a: applet_exitUrl_tooltip=URL hacia el que se redirigir\u00e1 la navegaci\u00f3n al salir de JClic applet_infoFrame=Marco de informaci\u00f3n: applet_infoFrame_tooltip=Name of the frame used to show the content related to the "info" button action_createInstaller_caption=Crear instalador del proyecto... action_createInstaller_keys=I* action_createInstaller_tooltip=Creaci\u00f3n de un archivo de instalaci\u00f3n del proyecto para JClic player installer_caption=Edici\u00f3n del archivo de instalaci\u00f3n del proyecto installer_title=T\u00edtulo: installer_title_tooltip=T\u00edtulo del proyecto que se mostrar\u00e1 en el asistente de instalaci\u00f3n installer_authors=Autores/as: installer_authors_tooltip=Autores/as del proyecto (texto corto) installer_folder=Carpeta: installer_folder_tooltip=Nombre de carpeta que sugerir\u00e1 el asistente de instalaci\u00f3n installer_files=Archivos a copiar: installer_files_tooltip=Archivos que se copiaran durante la instalaci\u00f3n installer_files_available=Archivos disponibles installer_files_selected=Archivos seleccionados installer_files_add=>> a\u00f1adir >> installer_files_add_tooltip=A\u00f1adir el archivo seleccionado a la lista installer_files_remove=<< quitar << installer_files_remove_tooltip=Quitar el archivo seleccionado de la lista installer_button=Bot\u00f3n de activaci\u00f3n installer_button_tooltip=Propiedades del bot\u00f3n que se mostrar\u00e1 en la biblioteca de proyectos installer_button_project=Proyecto principal: installer_button_project_tooltip=Proyecto JClic asociado bot\u00f3n installer_button_text=Etiqueta: installer_button_text_tooltip=Breve etiqueta de texto, que aparecer\u00e1 dentro del bot\u00f3n installer_button_icon=Icono: installer_button_icon_tooltip=Imagen que mostrar\u00e1 el bot\u00f3n. Dejar en blanco para usar el icono por defecto de JClic. installer_button_description=Descripci\u00f3n installer_button_description_tooltip=Texto de ayuda emergente que mostrar\u00e1 el bot\u00f3n installer_error_noTitle=Error: Hay que indicar el t\u00edtulo del proyecto installer_error_noBaseFolder=Error: Hay que indicar el nombre de la carpeta en la que se instalar\u00e1 el proyecto installer_error_noFilesSelected=Error: No ha seleccionado ning\u00fan archivo installer_error_noButtonText=Error: Hay que indicar el texto del bot\u00f3n de activaci\u00f3n installer_error_projectNotInFiles=Error: El proyecto asignado al bot\u00f3n de activaci\u00f3n no se encuentra entre los archivos a copiar applet_page_full=El applet ocupa toda la p\u00e1gina applet_page_mixed=El applet tiene unas dimensiones espec\u00edficas edit_text_align_left=Alinear el texto a la izquierda edit_text_align_center=Texto centrado edit_text_align_right=Alinear el texto a la derecha edit_text_act_target_toggle=Crear una inc\u00f3gnita o suprimirla edit_text_act_insertCell=Insertar una celda edit_text_act_content=Contenido edit_text_act_style=Estilo edit_cell_size=Dimensiones: edit_project_orphanActivities=Las siguientes actividades nunca llegaran a ejecutarse, debido a que no aparecen en ninguna secuencia de actividades del proyecto: edit_project_orphanMedia=Los siguientes objetos de la mediateca no se utilizan directamente en ninguna actividad: edit_project_orphanActivities_prompt=\u00bfDesea a\u00f1adirlas al final de la \u00faltima secuencia de actividades? edit_project_orphanMedia_prompt=\u00bfDesea eliminarlos? edit_project_orphanMedia_title=Retirada de objetos multimedia no utilizados edit_project_orphanActivities_title=Actividades hu\u00e9rfanas edit_media_refreshAll=Actualizar el contenido de todos los recursos edit_media_refreshAll_tooltip=Actualiza todos los recursos volviendo a cargar sus archivos edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Actualizando recursos... edit_media_exportAll=Exportar todos los recursos edit_media_exportAll_tooltip=Grabar en archivos el contenido de todos los recursos edit_media_exportAll_keys=X* edit_shape_select=Seleccionar edit_shape_addPoint=A\u00f1adir un punto edit_shape_deletePoint=Eliminar edit_shape_drawRect=Dibujar un rect\u00e1ngulo edit_shape_drawEllipse=Dibujar una elipse edit_shape_drawPoly=Dibujar un pol\u00edgono edit_shape_toLine=Convertir en l\u00ednea edit_shape_toBezier=Convertir en curva de B\u00e9zier edit_shape_toQuad=Convertir en cu\u00e1drica edit_shape_rLeft=Girar a la izquierda edit_shape_rRight=Girar a la derecha edit_shape_expand=Expandir edit_shape_contract=Contraer edit_shape_zoomIn=Acercar edit_shape_zoomOut=Alejar edit_shape_aproxPoints=Junta puntos cercanos edit_shape_showPoints=Mostrar puntos edit_shape_showPoints_tooltip=Mostrar/Ocultar los puntos edit_shape_gridSize=Rejilla: edit_shape_hideGrid=Mostrar / Ocultar la rejilla edit_shape_magnetRadius=Radio del im\u00e1n: edit_shape_elements=Elementos definidos edit_shape_elemName=Nombre del elemento seleccionado edit_shape_magnetRadius_tooltip=Radio de acci\u00f3n del im\u00e1n, cuando est\u00e1 activado edit_shape_gridSize_tooltip=Tama\u00f1o de la rejilla edit_mc_activity=Actividad: edit_mc_sequence=Secuencia: edit_mc_url=URL: edit_mc_project=Proyecto: edit_mc_activity_selection=Selecci\u00f3n de la actividad edit_mc_sequence_selection=Selecci\u00f3n de la secuencia edit_mc_err_nullContent=\u00a1Datos insuficientes! edit_act_arrowColor=Color de las flechas: edit_act_arrowColor_tooltip=Color utilizado por el editor para dibujar las flechas (no es exacto, ya que se utiliza una m\u00e1scara XOR de bits) edit_act_editActivity=Editar... edit_act_editActivity_tooltip=Editar la actividad seleccionada action_saveFileAs_caption=Guardar como... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Guardar el proyecto con un nombre distinto edit_act_behavior_block=Comportamiento edit_act_behavior=Comportamiento edit_act_behavior_drag=Arrastrar edit_act_behavior_drag_tooltip=Arrastrar los objetos en lugar de unirlos con una linea edit_act_behavior_order=Comprobar orden de resoluci\u00f3n edit_act_behavior_order_tooltip=Las casillas deben resolverse ordenadamente edit_act_scramble=Barajar action_importActivities_caption=Importar actividades... action_importActivities_keys=I* action_importActivities_tooltip=Importar actividades de otro proyecto import_warn_samefile=El archivo que ha seleccionado corresponde al proyecto actual. La importaci\u00f3n de actividades solo puede realizarse entre proyectos distintos. Por favor, seleccione otro archivo de proyecto. import_selectActivities=Seleccione una o m\u00e1s actividades para importarlas al proyecto actual: import_importing=Importando... import_checkdep=Comprobando dependencias... import_impmedia=Importando medios: import_impact=Importando la actividad: import_selectProject=Seleccione el proyecto JClic del cual desea importar actividades edit_tagRep_tags=Marcas edit_tagRep_tagStart=Marca de inicio: edit_tagRep_tagStart_tooltip=Marca que indica inicio de etiqueta edit_tagRep_tagEnd=Marca final: edit_tagRep_tagEnd_tooltip=Marca que indica final de etiqueta edit_tagRep_file=Archivo edit_tagRep_fileName=Archivo o URL: edit_tagRep_fileName_tooltip=Nombre o URL del archivo que contiene los valores que substituir\u00e1n a las etiquetas edit_tagRep_charset=Codificaci\u00f3n: edit_tagRep_charset_tooltip=Tipo de codificaci\u00f3n utilizada en el archivo edit_tagRep_browseFile=Buscar... edit_tagRep_browseFile_tooltip=Buscar en el sistema de archivos edit_tagRep_title=Substituci\u00f3n de etiquetas edit_text_act_clearStylesBtn=Limpiar estilos de texto... edit_text_act_clearStylesPrompt=Atenci\u00f3n: Esta acci\u00f3n limpiar\u00e1 los atributos especiales de car\u00e1cter existentes en el documento, devolvi\u00e9ndolo a su estilo principal. La operaci\u00f3n no se puede deshacer. \u00bfDeseas realizarla? img_max_size=Tama\u00f1o m\u00e1ximo de las im\u00e1genes: img_max_width_tooltip=Anchura m\u00e1xima de las im\u00e1genes al importarlas en la mediateca. img_max_height_tooltip=Altura m\u00e1xima de las im\u00e1genes al importarlas en la mediateca. img_resize_prompt=La imagen "%s" tiene unas dimensiones de %s pixels, que exceden el m\u00e1ximo permitido por JClic Author (%s). \u00bfDeseas redimensionarla? export_project_desc=Indica la carpeta donde se realizar\u00e1 la exportaci\u00f3n. export_project_output_folder=Carpeta de exportaci\u00f3n: export_project_title=Exportar el proyecto actual a HTML5 export_project_includeAll=Exportar tambi\u00e9n otros proyectos JClic existentes en la carpeta actual export_project_exportSCORM=Crear tambi\u00e9n un archivo ZIP en formato SCORM con todos los archivos necesarios export_project_scorm_file=Archivo SCORM: export_project_scorm_file_tooltip=Especifica la ubicaci\u00f3n del archivo SCORM export_project_scorm_file_browse=Archivo... export_project_scorm_file_exists=ATENCI\u00d3N: El archivo SCORM especificado ya existe. \u00bfQuieres sobreescribirlo? export_project_err_empty=\u00a1Hay que indicar una carpeta donde realizar la exportaci\u00f3n! export_project_warning_noEmptyFolder=ATENCI\u00d3N: \u00a1La carpeta seleccionada no est\u00e1 vac\u00eda!\nSu contenido actual ser\u00e1 sobreescrito durante el proceso de exportaci\u00f3n.\n\u00bfSeguro que quiere exportar el proyecto actual en esta carpeta? export_project_err_sameFolder=La carpeta de exportaci\u00f3n no puede ser la misma que la del proyecto actual.\nPor favor, indique otra ubicaci\u00f3n. export_project_err_nestedFolders=La carpeta de exportaci\u00f3n no puede ser un subdirectorio del proyecto actual.\Por favor, indique otra ubicaci\u00f3n. export_project_selectFolder=Seleccionar carpeta export_project_exporting=Exportar el proyecto a HTML5... export_project_notice=Para publicar las actividades en HTML5 sube el contenido de esta carpeta a un servidor web y abre el archivo \"index.html\".\n\nPara previsualizar las actividades directamente desde tu ordenador haz clic en \"Abrir en el navegador\".\n export_project_scorm_notice=Tambi\u00e9n puedes subir el archivo "%s" a un LMS como objeto SCORM (sistema b\u00e1sico de informes con una \u00fanica puntuaci\u00f3n por sesi\u00f3n) o utilizarlo en el m\u00f3dulo de JClic para Moodle, que ofrece m\u00e1s opciones e informes detallados sobre las actividades realizadas. export_project_finished=El proyecto se ha exportado con \u00e8xito en: export_project_copyLog=Copiar los mensajes export_project_launchBrowser=Abrir en el navegador web export_project_numActivities=Actividades exportadas: export_project_mediaFiles=Archivos de imagen, video y sonido: export_project_totalSize=Tama\u00f1o total (bytes): action_exportProject_caption=Exportar a HTML5... action_exportProject_tooltip=Exportar las actividades a HTML5 para poder utilizarlas en cualquier navegador web action_exportProject_keys = HH js_codebase=Archivo JavaScript HTML5: js_codebase_tooltip=URL apuntando a un archivo 'jclic.min.js' v\u00e1lido settings_html = Applet y HTML5 settings_license=Licencia de uso: settings_license_tooltip=Elije entre las licencias Creative Commons o 'otras' settings_license_other=Otra (ind\u00edcala en 'Descripci\u00f3n') warn_save_scorm_file =El archivo que se est\u00e1 editando es de tipo "scorm.zip".\nPara guardar este tipo de archivos hay que convertirlos al formato est\u00e1ndar "jclic.zip".\nUna vez convertidas, podr\u00e1s exportar nuevamente las actividades a HTML5 y empaquetarlas en formato SCORM.\n\n\u00bfDesea guardar el proyecto en formato "jclic.zip"? src/author/edu/xtec/resources/messages/AuthorMessages_eu.properties000066400000000000000000001224451335566474600263040ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Deskribapena edit_act_name_tooltip=Jardueraren izena edit_act_name=Izena: edit_act_description_tooltip=Jardueraren deskribapena edit_act_reports_block=Txostenak edit_act_includeInReports=Jarduera hau txostenetan sartu edit_act_includeInReports_tooltip=Jarduera honen emaitzak erabiltzaileen txostenetan sartu edit_act_code=Kodea: edit_act_code_tooltip=Aukerazko kodea txostenen datu-basean saikapenak eta bilaketak egiteko. edit_act_reportActions=Erabiltzaileen ekintzak jaso edit_act_reportActions_tooltip=Erregistratu erabiltzaileek egindako ekintza guztien xehetasunak edit_act_counters_block=Kontagailuak edit_act_timeCounter=Denbora-kontagailua edit_act_timeCounter_tooltip=Erakutsi/ezkutatu denbora-kontagailua edit_act_actionsCounter=Saiakera-kontagailua edit_act_actionsCounter_tooltip=Erakutsi/ezkutatu saiakera-kontagailua edit_act_scoreCounter=Puntuazio-kontagailua edit_act_scoreCounter_tooltip=Erakutsi/ezkutatu puntuazio-kontagailua edit_act_maxTime=Gehienezko denbora: edit_act_maxTime_tooltip=Jarduera egiteko gehienezko denbora, segundutan, edo 0 denbora-mugarik ez ezartzeko. edit_act_countdown=Atzerako kontaketa edit_act_countdown_tooltip=Kontagailua balore handienetik hasten da, 0raino jaitsiz. edit_act_maxActions=Gehieneko saiakerak: edit_act_maxActions_tooltip=Baimendutako saiakeren gehieneko kopurua, edo 0 mugagabeak izateko edit_act_buttons_block=Botoiak edit_act_helpBtn=Laguntza edit_act_helpBtn_tooltip=Erakutsi/ezkutatu laguntza-botoia edit_act_helpBtn_solution=Erakutsi erantzuna edit_act_helpBtn_msg=Erakutsi mezu hau: edit_act_infoBtn=Informazioa edit_act_infoBtn_tooltip=Erakutsi/ezkutatu informazio-botoia edit_act_infoBtn_url=Erakutsi URL hau: edit_act_infoBtn_cmd=Exekutatu komandoa edit_act_infoBtn_url_tooltip=Informazio-botoiari sakatuta erakutsi beharreko web-gunearen helbidea edit_act_infoBtn_cmd_tooltip=Informazio-botoiari sakatuta exekutatuko den komando-lerroa edit_act_mainWindow=Leiho nagusia: edit_act_gameWindow=Jolas-leihoa: edit_act_margin=Marjina: edit_act_margin_tooltip=Ikusteko objektuen arteko espazio horizontala eta bertikala edit_act_bgColor=Atzealdeko kolorea: edit_act_bgColor_tooltip=Aldatu atzealdeko kolorea edit_gradient_startColor=Hasierako kolorea: edit_gradient_endColor=Amaierako kolorea: edit_gradient_startColor_tooltip=Hasierako kolorearen aukeraketa edit_gradient_endColor_tooltip=Amaierako kolorearen aukeraketa edit_gradient_cycles=Zikloak: edit_gradient_cycles_tooltip=Gradientearen errepikapenak margotzeko azalearen gainean edit_gradient_orientation=Orientazioa: edit_gradient_orientation_tooltip=Gradientearen orientazioa, gradutan neurtua horizontalarekiko edit_act_gradient=Gradientea: edit_act_gradient_tooltip=Erabili kolore-gradientea edit_color_opacity=Opakutasuna edit_color_opacity_tooltip=Kolorearen alfa kanalaren balorea (opakutasuna) zehazten du edit_gradient_title=Gradientea edit_gradient_default=Berezko baloreak erabili edit_act_image=Irudia: edit_act_descriptionTab=Deskribapena edit_act_descriptionTab_tooltip=Izena eta deskribapena edit_act_tiledBgImg=Mosaikoan edit_act_tiledBgImg_tooltip=Irudiaren azalera osoa margotzen du, X eta Y ardatzen inguruan behar beste aldiz errepikatuz edit_act_preview=Aurrebista: edit_act_border=Ertza edit_act_border_tooltip=Marraztu lerro bat ertzean leiho inguruan edit_act_transparent=Gardena edit_act_transparent_tooltip=Leihoak atzeko aldea gardena du edit_act_width=Zabalera edit_act_height=Altuera: edit_act_width_tooltip=Objektuaren zabalera, pixeletan neurtua edit_act_height_tooltip=Objektuaren altuera, pixeletan neurtua edit_act_centered=Zentratuta edit_act_centered_tooltip=Objetktuak zentratuta egon behar du leiho nagusian edit_act_x=X: edit_act_x_tooltip=Kokapen erabat horizontala edit_act_y=Y: edit_act_y_tooltip=Kokapen erabat bertikala edit_act_ui_block=Erabiltzailearen interfazea edit_act_image_tooltip=Aukeratu irudi bat edit_act_text=Testua: edit_act_text_tooltip=Objektu honen barruan erakutsi beharreko testua edit_font_face=Mota: edit_font_size=Tamaina: edit_font_bold=Lodia edit_font_italic=Etzana edit_font_underline=Azpimarratu edit_font_style=Estiloa: edit_cell_title=Gelaxkaren edukia edit_act_messages=Mezuak edit_act_msg_initial=Hasierako mezua edit_act_msg_final=Amaierako mezua edit_act_msg_prev=Aurreko mezua: edit_act_msg_error=Errore-mezua: edit_act_msg_initial_tooltip=Jarduera hasten denean erakutsi beharreko mezua edit_act_msg_final_tooltip=Jarduera bukatutakoan erakutsi beharreko mezua edit_act_msg_error_tooltip=Jarduera hainbat errorerekin bukatzen denean erakutsi beharreko mezua edit_act_msg_prev_tooltip=Jarduera hasi aurretik erakusten den mezua (jarduera-mota jakin batzuetan baino ez) edit_align=Lerrokatu: edit_act_textColor=Testuaren kolorea: edit_act_textColor_tooltip=Testua marrazteko erabilitako kolorea edit_act_shadowColor=Itzalaren kolorea: edit_act_shadowColor_tooltip=Testuaren itzala marrazteko erabilitako kolorea, baldin bada edit_act_shadow=Itzala edit_act_shadow_tooltip=Testua itzalarekin marraztu edit_act_borderColor=Ertzaren kolorea: edit_act_borderColor_tooltip=Gelaxkaren ertza marrazteko erabilitako kolorea edit_act_inactiveColor=Inaktibo-egoeraren kolorea edit_act_inactiveColor_tooltip=Gelaxka desgaituta dagoenean erabilitako kolorea edit_act_altColor=Ordezko kolorea: edit_act_altColor_tooltip=Gelaxken ordezko edukia erakusteko kolorea, behin erantzuna emandakoan edit_cell_marked=Markatua edit_cell_disabled=Desgaituta edit_cell_alt=Ordezkoa edit_cell_textMargin=Barneko ertza: edit_cell_textMargin_tooltip=Gelaxkaren eta testuaren ertzen arteko espazioa edit_cell_borderWidth=Ertzaren zabalera: edit_cell_borderWidth_tooltip=Ertza margotzeko erabilitako marraren lodiera edit_cell_markerWidth=Markatzailearen lodiera: edit_cell_markerWidth_tooltip=Ertza margotzeko erabilitako marraren lodiera, gelaxka markatuta edo aukeratuta dagoenean edit_cell_alt_tooltip=Aurreikusi "ordezkoa" egoeran edit_cell_disabled_tooltip=Aurreikusi "desgaituta" egoeran edit_cell_marked_tooltip=Aurreikusi "markatuta" egoeran edit_act_testAction=Jarduera aurreikusi edit_act_testAction_tooltip=Jarduera aurreikusi eta probatu edit_act_panels_description=Deskribapena edit_act_panels_description_tooltip=Jardueraren izenburua eta deskribapena edit_act_panels_options=Aukerak edit_act_panels_options_tooltip=Jardueraren aukerak edit_act_panels_frame=Leihoa edit_act_panels_frame_tooltip=Jarduera-leihoaren itxura, tamaina eta kokapena edit_act_panels_messages=Mezuak edit_act_panels_messages_tooltip=Jarduera-mezuen edukia edit_act_panels_panel=Panela edit_act_panels_panel_tooltip=Panelaren edukia edit_style_title=Estiloa edit_style_tooltip=Aukeratu gelaxken kolorea, mota eta tamaina edit_act_style=Estiloa: edit_act_overlap=Ekidin irudia eta testua gainjartzea edit_act_overlap_tooltip=Saiatu ekiditen irudia eta testua gainjartzea edit_media_exists_1=Fitxategia edit_media_exists_2=dagoeneko badago media-biltegian! edit_act_shaper=Piezak: edit_act_shaper_err=Errorea piezan: edit_act_num_cols=Zutabeak: edit_act_num_rows=Lerroak: edit_act_toothHeightFactor=Hortzen altuera: edit_act_toothWidthFactor=Hortzen zabalera: edit_act_toothRandom=Ausazko banaketa edit_act_shaper_properties=Piezen ezaugarriak edit_act_panels_text=Testua edit_act_panels_text_tooltip=Jardueraren testua action_saveFile_caption=Gorde... action_saveFile_keys=HH action_saveFile_tooltip=Gorde oraingo proiektua action_docTree_caption=Dokumentuaren zuhaitza... action_docTree_keys=I* action_docTree_tooltip=Erakutsi proiektuaren dokumentua zuhaitz moduan edit_docTree_title=Dokumentuaren zuhaitza edit_media_referencedBy=Noren erreferentzia: msg_prompt_loadReferences=Kontuz:

Proiektu hau beste batzuekin lotuta dago.
Estekak arakatu eta lotutako fitxategi guztiak bilatu nahi al dituzu?

(Ez da gomendagarria BAI erantzutea Clic 3.0 jarduerak inportatzean) edit_mc_type=Mota: edit_mc_type_unknown=Ezezaguna edit_mc_type_sound=Soinua erreproduzitu edit_mc_type_video=Bideoa erreproduzitu edit_mc_type_midi=MIDI erreproduzitu edit_mc_type_cdaudio=Audio CD-a erreproduzitu edit_mc_type_record=Grabatu soinua edit_mc_type_play_recorded=Grabatutako soinua erreproduzitu edit_mc_type_run_activity=Joan jarduerara edit_mc_type_run_sequence=Joan sekuentziara edit_mc_type_run_external=Programa abiarazi edit_mc_type_url=Erakutsi URLa edit_mc_type_exit=Amaitu edit_mc_type_return=Itzuli edit_mc_level=Lehentasun-maila: edit_mc_file=Fitxategia: edit_mc_externalParam=Parametroak: edit_mc_from=Hemendik: edit_mc_to=Hona: edit_mc_length=Geh. iraupena: edit_mc_recBuffer=Grabazio-zinta: edit_mc_stretch=Sartzen ez bada, konprimitu edit_mc_location=Kokapena: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Hemendik: edit_mc_location_from_box=Gelaxka edit_mc_location_from_window=Leihoa edit_mc_location_from_frame=Markoa edit_mc_loop=Errepikatu etengabe edit_mc_autostart=Hasiera automatikoa edit_mc_catchmouse=Sagua harrapatu edit_mc_title=Eduki aktiboa eta multimedia edit_mc_label=Eduki aktiboa: edit_media_dlg_title=Aukeratu objektu multimedia edit_media_title=Media-biltegia edit_mc_pos_cell=Gelaxkan zentratuta edit_mc_pos_window=Leihoan zentratuta edit_mc_pos_absolute=Zehaztu kokapena: edit_tree_badFormat=Zuhaitzaren egitura edo datuak ez dira zuzenak! edit_act_panels_controls=Kontrolak edit_act_panels_controls_tooltip=Botoi eta kontagailuen ezarpenak edit_act_class=Mota: edit_act_gridLayout=Panelen banaketa: edit_act_gridLayout_tooltip=A eta B panelen kokapen erlatiboa edit_act_inverseResolution=Alderantzizko erresoluzioa edit_act_inverseResolution_tooltip=Jarduera bukatutzat emango da "B"ri ezarritako elementu guztiak egindakoan. edit_act_showAllArrows=Erakutsi gezi guztiak edit_act_alt=Ordezko edukia: edit_act_alt_tooltip=Burututako edo ezarri gabeko gelaxketan erakutsitako edukia edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Editatu ordezko edukia edit_act_grid=Taula edit_act_grid_A=A taula edit_act_grid_B=B taula edit_act_grid_layout=Diseinua edit_act_grid_relationship=Erlazioa edit_seq_activity_header=jarduera edit_seq_tag_header=etiketa edit_seq_jump_header=jauzi hona: edit_seq_activity=Jarduera: edit_seq_tag=Etiketa: edit_seq_description=Deskribapena: edit_seq_auto=Aurrera joan automatikoki edit_seq_delay=Denbora-tartea: edit_seq_action_fwd=Joan aurrera edit_seq_action_back=Joan atzera edit_seq_action_jump=Jauzi hona... edit_seq_action_stop=Gelditu edit_seq_action_return=Itzuli edit_seq_action_exit=Itxi JClic edit_seq_arrow_fwd=Aurrera gezia: edit_seq_arrow_back=Atzera gezia: edit_seq_action=Ekintza: edit_seq_button_enabled=Erakutsi botoia edit_seq_project=JClic Proiektua: edit_act_absolute=Kokapen absolutua edit_act_absolute_tooltip=Objektua adierazitako X eta Y koordenadetan ezarriko da edit_act_location=Kokapena: edit_seq_newElement=Sekuentzia-elementu berria... edit_seq_newElement_tooltip=Sartu elementu berria jarduera-sekuentzian edit_seq_newElement_msg=Mesedez, aukeratu jarduera bat sekuentzia-elementu berrirako. edit_seq_newElement_error_noAct=Jarduerarik gabe ezin da sekuentzia-elementu berririk sortu! edit_seq_newElement_error_emptyList=Proiketu honek ez du jarduerarik! Ezin, beraz, elementu-sekuentziarik sortu hutsik dagoen proiektuan. edit_seq_jump_msg=Jauziaren helmuga: edit_seq_jump_title=Jauziaren helmuga edit_act_newActivity_tooltip=Gaineratu jarduera proiektuari edit_act_prompt_class=Jarduera-mota: edit_act_prompt_name=Izena: edit_act_newActivity_msg=Mesedez, aukeratu sortu beharreko jarduera-mota eta eman izena: edit_act_newActivity_error_noAct=Jarduera-mota bat aukeratu behar duzu! edit_act_newActivity_error_noName=Jarduerari izena eman behar diozu! edit_act_newActivity_error_creating=Ezin da jarduerarik sortu! edit_act_newActivity_class=Java mota: edit_text_act_format=Formatua edit_text_act_answer=Erantzuna edit_text_act_popup=Pop up edit_text_act_answer_label=Balio duten erantzunak: edit_list_newElement_tooltip=Zerrrendako elementu berria gaineratu edit_list_editElement_tooltip=Editatu aukeratutako zerrendako elementua edit_list_deleteElement_tooltip=Ezabatu aukeratutako zerrendako elementua edit_list_upBtn_tooltip=Eraman gora edit_list_downBtn_tooltip=Eraman behera edit_list_newValue=Testu berria: edit_list_addElement=Gaineratu zerrendako elementu berria edit_list_modifyValue=Aldatu aukeratutako testua edit_text_act_target=Helburua edit_text_act_maxLen=Geh. iraupena: edit_text_act_maxLen_tooltip=Erantzunaren gehienezko karaktere-kopurua. edit_text_act_fillingChar=Bete-lanetarako karakterea edit_text_act_fillingChar_tooltip=Zuriunea adierazteko erabilitako karaktera edit_text_act_iniLen=Hasierako iraupena: edit_text_act_iniLen_tooltip=Jardueraren hasieran erakutsiko diren bete-lanetarako karaktere-kopurua. edit_text_act_iniText=Hasierako testua: edit_text_act_iniText_tooltip=Jarduera hasieran zuriunean erakutsitako testua. edit_text_act_list=Erakutsi aukera-zerrenda: edit_text_act_list_tooltip=Erakutsi aukera-zerrenda. Hortik aukeratu beharko du bat erabiltzaileak. edit_text_act_check_title=Zuzenketarako aukerak edit_text_act_popup_no=Pop up-ik ez edit_text_act_popup_always=Pop up-ak automatikoki edit_text_act_popup_onError=Errorerako pop up-a edit_text_act_popup_onDemand=Pop up-a F1ekin edit_text_act_popup_type=Mota: edit_text_act_popup_delay=Itxaroteko pop up-a: edit_text_act_popup_maxTime=Geh. denbora: edit_text_act_popup_onlyPlay=Soinua bakarrik edit_text_act_err_noSelection=Testu zati bat aukeratu behar duzu helburu testu berria sortzeko! edit_text_act_err_badCharInSelection=Helburu testuak ezin du paragrafo-jauzirik eta tabuladorerik izan. edit_text_act_err_nestedTargets=Ezezagunak ezin dira pilatu edit_text_act_err_cellInTarget=Ezezagunek ezin dute gelaxkarik izan! edit_text_act_pageBgColor=Paperaren kolorea: edit_text_act_editStylesBtn=Editatu dokumentuaren estiloak... edit_text_act_mainStyle=Hasierako estiloa: edit_text_act_tabSpc=Tabuladorea: edit_text_act_tabSize=Tabuladore-marken arteko espazioak: edit_text_act_colors=Koloreak: edit_text_act_targetStyle=Ezezagunen koloreak: edit_text_act_errorStyle=Errorea koloreetan: edit_text_act_preview=Aurrebista: edit_text_act_styleSample_default_start=Testu estandarra edit_text_act_styleSample_target=helburua edit_text_act_styleSample_error=errorea edit_text_act_styleSample_default_fill=testu estandarra edit_text_act_styleSample_default_end=testu estandarra. edit_text_act_warnDeleteTarget=Kontuz: Ekintza honek une honetan aukeratutako helburua kenduko du. Aurrera egin nahi al duzu? edit_text_act_prevScreen_title=Aurreko pantaila... edit_text_act_prevScreen_no=Ez erakutsi testurik jarduera hasi arte edit_text_act_prevScreen_original=Erakutsi ariketaren testu osoa edit_text_act_prevScreen_special=Erakutsi testu hau: edit_text_act_prevScreen_time=Geh. denbora: edit_text_act_edit_target=Helburua... edit_text_act_checkButton_show=Erakutsi zuzenketarako botoia edit_text_act_checkButtonText=Botoiaren testua: edit_text_act_checkCase=Larria/xeheak edit_text_act_checkAccents=Azentuak eta karaktere bereziak kontuan izan edit_text_act_checkPunct=Kontuan hartu puntuazio-markak edit_text_act_checkDoubleSpc=Baimendu errepikatutako espazioak edit_text_act_checkOptions=Irizpideak edit_text_act_checkAutoJump=Hurrengo ezezagunera jauzi egin automatikoki edit_text_act_checkForceOk=Erantzun zuzenarren ondoren bakarrik mugitu edit_text_act_checkDetail=Adierazi erroreak letraz letra edit_text_act_checkDetail_params=Analisi-algoritmoaren parametroak: edit_text_act_checkDetail_steps=Pausoak: edit_text_act_checkDetail_field=Arakatu eremua: edit_text_act_defaultCheckButtonText=Egiaztatu edit_text_act_advancedCorrectionOptions=Erantzunen azterketa edit_text_act_check_bt=Zuzenketa... edit_text_act_checkButton=Zuzenketa-botoia edit_text_act_checkProgress=Progresioa edit_text_act_typeBtn=Mota... edit_text_act_orderParagraphs=Paragrafoen ordena edit_text_act_orderWords=Hitzen ordena edit_text_act_order_amongstPar=Hitzak nahastu paragrafo artean edit_text_act_type_title=Jarduera-mota edit_text_act_warnChangeType=Une honetan definitutako ezezagun guztiak ezabatuko ditu ekintza honek. Hori egin nahi al duzu? edit_text_act_identWords=Identifikatu hitzak edit_text_act_identChars=Identifikatu karaktereak edit_media_change_name=Aldatu izena... edit_media_change_file=Aldatu fitxategia... edit_media_includeInZip=Gorde ZIP fitxategian edit_media_type=Media-mota: edit_media_size=Fitxategiaren tamaina: edit_media_show_type=Mota honetako fitxategiak: edit_media_preview=Aurreikusi media edit_media_preview_tooltip=Aurreikusi media-baliabidea edit_media_rename=Aldatu baliabidearen izena edit_media_rename_title=Izena aldatu edit_media_rename_prompt=Izen berria: edit_media_rename_invalid=Baliabide-izen okerra! edit_media_rename_exists=Bada izen hori duen beste baliabide bat! Baliabide bakoitzak izen ezberdin bat behar du. edit_media_chfile_invalid=Fitxategi okerra! err_media_chfile_different=Fitxategiak mota berekoa izan behar du edit_media_font_error=Ezin izan da letra-mota kargatu! edit_media_save_file=Fitxategia gorde (ZIPetik atera) edit_media_refresh_file=Baliabidearen edukia fitxategitik eguneratu edit_media_warn_zipFileNotExternal=Hau ez da "benetako" fitxategi bat, ZIP edukiontzi batean kokatutako objektu bat baizik. Funtzio hau erabiltzeko, izen bereko fitxategiak ZIP fitxategia dagoen direktorio berean egon behar du. edit_activities=Jarduerak edit_sequences=Sekuentziak edit_media=Media-biltegia edit_media_tooltip=Proiektuan erabilitako irudiak eta bestelako media fitxategiak kudeatu edit_activities_tooltip=Proiektu-jarduerak sortu eta editatu edit_sequences_tooltip=Jarduera-sekuentziak sortu eta editatu edit_project_title=Izenburua: edit_project_title_tooltip=Proiektuaren izenburua edit_project=Proiektua edit_project_tooltip=Editatu proiektuaren ezaugarriak edit_project_description=Deskribapena: edit_project_description_tooltip=Proiektuaren deskribapen orokorra edit_project_area=Atalak: edit_project_area_tooltip=Proiektuaren kurrikulu-atalak edit_project_level=Mailak: edit_project_level_tooltip=Proiektuaren hezkuntza-mailak edit_project_descriptors=Deskribatzaileak: edit_project_descriptors_tooltip=Proiektuaren deskribatzaileak (komaz banatuta) edit_project_languages=Hizkuntzak: edit_project_languages_tooltip=Proiektuan erabilitako hizkuntzak edit_project_languages_modify=Aldatu aukeratutako hizkuntza edit_project_languages_add=Gaineratu hizkuntza edit_project_languages_select=ISO-639 hizkuntza-kodeak: edit_project_authors=Egileak: edit_project_authors_tooltip=Proiektua sortzen ari direnak edit_project_author_name=Izena: edit_project_author_mail=e-posta: edit_project_author_rol=Rola: edit_project_author_organization=Erakundea: edit_project_author_comments=Iruzkinak: edit_project_author_url=URL-a: edit_project_author_name_tooltip=Egilearen izena (derrigorrezkoa) edit_project_author_mail_tooltip=Egilearen e-posta (aukerakoa) edit_project_author_rol_tooltip=Pertsonen rolak proiektuan: egilea, laguntzailea, marrazkilaria, soinuak... (aukerakoa) edit_project_author_organization_tooltip=Eskola, unibertsitatea, elkartea... (aukerakoa) edit_project_author_url_tooltip=Web-orri pertsonala (aukerakoa) edit_project_author_comments_tooltip=Bestelako informaziorako eremua (aukerakoa) edit_project_author_info=Egilearen informazioa: edit_project_author_add=Gaineratu egilea zerrendara edit_project_author_edit=Editatu egilearen informazioa edit_project_org_name=Izena: edit_project_org_name_tooltip=Eskolaren izena edit_project_org_mail=e-posta: edit_project_org_mail_tooltip=Eskolaren e-posta helbidea edit_project_org_url=URL-a: edit_project_org_url_tooltip=Eskolaren web-gunea edit_project_org_address=Helbidea edit_project_org_address_tooltip=Eskolaren posta-helbidea edit_project_org_pc=PC: edit_project_org_pc_tooltip=Posta-kodea edit_project_org_city=Herria: edit_project_org_city_tooltip=Eskola dagoen hiria edit_project_org_country=Herrialdea/Estatua: edit_project_org_state=Herrialdea: edit_project_org_comments=Iruzkinak: edit_project_org=Eskola/k: edit_project_org_tooltip=Proiektuan ari den eskola edota beste erakundea edit_project_org_info=Erakundearen informazioa: edit_project_org_add=Gaineratu erakundea edit_project_org_edit=Editatu erakundearen datuak edit_project_org_country_tooltip=Estatua edit_project_org_state_tooltip=Herrialdea edit_project_org_comments_tooltip=Bestelako informazioa... edit_project_rev_date=Data: edit_project_rev_date_tooltip=Berrikusketaren data edit_project_rev_authors=Egileak: edit_project_rev_authors_tooltip=Berrikusketaren egileak edit_project_rev_description=Deskribapena: edit_project_rev_description_tooltip=Egindako aldaketen deskribapen laburra edit_project_rev_comments=Iruzkinak: edit_project_rev_comments_tooltip=Bestelako informazio garrantzitsua edit_project_rev=Berrikusketak: edit_project_rev_tooltip=Proiektuari egindako aldaketa nagusien historiala edit_project_rev_add=Berrikusketa-erregistroa gaineratu edit_project_rev_edit=Berrikusketa-erregistroa editatu edit_project_rev_info=Berrikusketa-data edit_media_objects=objektuak edit_media_object=objektua edit_evsounds_start=Jardueraren hasiera: edit_evsounds_click=Sakatu objetktuari: edit_evsounds_actionError=Okerreko ekintza: edit_evsounds_actionOk=Ekintza zuzena: edit_evsounds_finishedError=Hainbat okerrekin bukatutako jarduera: edit_evsounds_finishedOk=Egoki bukatutako jarduera: edit_project_rev_err_nodesc=Errorea: deskribapenerako eremua ezin da hutsik utzi! edit_evsounds_dlg_title=Editatu ekintzaren soinuak edit_project_evsounds=Ekintzaren soinuak: edit_project_evsounds_tooltip=Ezarri soinu zehatzak JClic ekintza bakoitzerako edit_act_evsounds=Ekintzaren soinuak: edit_act_evsounds_tooltip=Ezarri soinu zehatzak JClic ekintza bakoitzerako edit_evsounds_default=berezko soinua edit_evsounds_disabled=ezgaituta edit_evsounds_chk_tooltip=Gaitu edo ezgaitu ekintza honetarako soinua edit_evsounds_select_tooltip=Sakatu ekintza honetarako soinua aukeratzeko, edo markatu gabe utzi berezko soinua erabiltzeko action_newProject_caption=Proiektu berria... action_newProject_keys=NN action_newProject_tooltip=Sortu JClic proiektu berria edit_arith_op_from=Hemendik: edit_arith_op_from_tooltip=Operatzailearen gutxieneko balorea edit_arith_op_to=Hona: edit_arith_op_to_tooltip=Operatzailearen gehienezko balorea edit_arith_op_with=Honekin: edit_arith_op_with_tooltip=Markatuta, operatzaileak balore hau ere izan dezake edit_arith_op_fromList=Zerrendako bat: edit_arith_op_fromList_tooltip=Operatzaileak izan ditzakeen baloreen zerrenda edit_arith_op_decimals=Hamarrenak: edit_arith_op_decimals_tooltip=Operatzailearen hamarren-kopurua edit_arith_op_dec0=# (osoa) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=Lehen operatzailea edit_arith_secondOp=Bigarren operatzailea edit_arith_title=JClic-erako Arith2 edit_arith_operations=Eragiketak: edit_arith_operations_tooltip=Aukeratu egin beharreko eragiketa-mota edit_arith_operations_plus=Plus edit_arith_operations_minus=Minus edit_arith_operations_multiply=Biderkatu edit_arith_operations_divide=Zatitu edit_arith_unknown=Ezezaguna: edit_arith_unknown_tooltip=Aukeratu zein elementu izango den ezezaguna edit_arith_unknown_aobx=Emaitza da ezezaguna edit_arith_unknown_aoxr=Bigarren operatzailea da ezezaguna edit_arith_unknown_xobr=Lehen operatzailea da ezezaguna edit_arith_unknown_axbr=Eragiketa da ezezaguna edit_arith_unknown_invert=Emaitza espresioaren hasieran idatzi edit_arith_result=Emaitza: edit_arith_result_notCarry="Eraman" gabe edit_arith_result_random=Ausazkoa edit_arith_result_asc=Gorantz edit_arith_result_order=Ordenatu emaitzaren arabera: edit_arith_result_desc=Beherantz edit_arith_result_avoidDup=Ekidin bikoizpenak edit_arith_cond=Baldintzak: edit_arith_cond_ind=Berdin da edit_arith_cond_agb=Lehenengo operatzaileak bigarrenak baino handiagoa izan behar du edit_arith_cond_alb=Lehenengo operatzaileak bigarrenak baino txikiagoa izan behar du edit_arith_cond_tooltip=Bestelako baldintzak edit_autocp=Eduki-sortzaile automatikoa: edit_autocp_tooltip=Aukeratu jarduera honetarako eduki-sortzaile automatikoa. edit_autocp_block=Eduki-sortzailea edit_autocp_btn=Ezarpenak... edit_autocp_btn_tooltip=Eduki-sortzailearen ezarpenak ezarri edit_data=Editatu datua edit_act=Editatu jarduera edit_acp=Eduki-sortzailearen edizioa edit_acp_err_creating=Errorea eduki-sortzaile automatikoa sortzean! edit_project_author_group=Sorrera edit_project_description_block=Deskribapena edit_project_ui_block=Erabiltzailearen interfazea edit_act_description=Deskribapena: m_Edit=Editatu m_Edit_Mnemonic=E edit_media_preview_keys=A* edit_act_newActivity=Jarduera berria... edit_act_newActivity_keys=J* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Txertatu m_Insert_Mnemonic=T* m_View=Ikusi m_View_Mnemonic=I action_editProject_caption=Proiektua action_editProject_keys=PP action_editProject_tooltip=Editatu proiektuaren ezarpenak action_editMedia_caption=Media action_editMedia_keys=BB action_editMedia_tooltip=Editatu proiektuaren multimedia-biltegia action_editActivities_caption=Jarduerak action_editActivities_keys=JJ action_editActivities_tooltip=Jarduerak editatu action_editSeq_caption=Sekuentziak action_editSeq_keys=SS action_editSeq_tooltip=Jarduera-sekuentziak editatu warn_project_modified=Oraingo proiektua aldatu egin da. Gorde egin nahi al dituzu aldaketak? edit_project_descriptors_block=Deskribatzaileak edit_media_new=Media-objektu berria... edit_media_new_tooltip=Gaineratu irudi edo multimedia-objektu berria biltegian edit_media_new_keys=M* edit_seq_threshold=Atalase-puntuazioa: edit_seq_threshold_tooltip_up=Egin hau puntuazio orokorra honen berdina edo handiagoa denean... edit_seq_time=Atalase-denbora: edit_seq_time_tooltip_up=Bide honi segitzeko, jarduerak ondorengo denbora-tartea baino lehen egin behar izan dira: edit_seq_threshold_tooltip_down=Egin hau puntuazio orokorra hau baino txikiagoa denean... edit_seq_time_tooltip_down=Segitu bide honi, jardueretan emandako denbora hau baino luzeagoa bada: edit_seq_condJump=Baldintzatutako jauziak edit_seq_condJump_tooltip=Baldintza zehatzetan egin behar diren jauzi bereziak ezarri edit_seq_condJump_upper_tooltip=Ezarri goragoko maila baterako jauzia egiteko baldintzak edit_seq_condJump_lower=Beherako jauzia: edit_seq_condJump_upper=Gorako jauzia: edit_seq_condJump_lower_tooltip=Ezarri beherako maila baterako jauzia egiteko baldintzak edit_seq_action_tooltip_fw="Hurrengoa" botoiari ezarritako ekintza edit_seq_action_tooltip_bk="Aurrekoa" botoiari ezarritako ekintza edit_seq_jump_tooltip=Jauziaren helmuga adierazi edit_seq_action_tooltip=Egin beharreko ekintza edit_seq_activity_tooltip=Sekuentzia-elementu honi egokitutako jarduera edit_seq_tag_tooltip=Sekuentziako elementu honi erreferentzia egiteko erabilitako etiketa (aukerako eremua) edit_seq_description_tooltip=Sekuentzia-elementuaren deskribapena (aukerako eremua) edit_seq_button_enabled_tooltip=Jardueretan aurrera egiteko botoia gaitu edo ezgaitu edit_seq_auto_tooltip=Mugitu automatikoki jarduera bukatzean edit_seq_delay_tooltip=Zenbat segundu itxaron behar da automatikoki mugitu aurretik edit_color_dlgTitle=Aukeratu kolorea edit_media_renaming=Mesedez, itxaron baliabidea berrizendatu arte edit_act_cell_width=Zabalera: edit_act_cell_width_tooltip=Gelaxkaren zabalera (pixeletan) edit_act_cell_height=Altuera: edit_act_cell_height_tooltip=Gelaxkaren altuera (pixeletan) edit_act_hiddenWords=Ezkutuko hitzak: edit_act_hiddenWords_tooltip=Panelean ezarritako ezkutuko hitzen zerrenda edit_act_wordSearch_panelB=Erabili B panela edit_act_wordSearch_panelB_tooltip=Bigarren paneleko edukian hitzak dauden daudenean erakutsiko dira edit_act_shaper_tooltip=Aukeratu panelean erabili beharreko pieza-mota edit_act_num_cols_tooltip=Panelaren zutabe-kopurua edit_act_num_rows_tooltip=Panelaren lerro-kopurua edit_act_wildTransparent=Banatzaile gardenak edit_act_wildTransparent_tooltip=Erakutsi banatzaileak (laukitxo beltzak) zulo garden gisa edit_act_behavior_scramble_times=Nahasketak: edit_act_behavior_scramble_times_tooltip=Piezak zenbat aldiz nahastuko diren edit_act_copy_title=Kopiatu ezaugarriak hona... edit_act_copy_attributes=Ezaugarriak edit_act_copy_dest=Aplikatu honi: edit_act_copy_style_main=Leiho nagusia edit_act_copy_style_play=Jolas-leihoa edit_act_copy_activities=Aldatu beharreko jarduerak: edit_act_copyAttributes=Kopiatu ezaugarriak edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Kopiatu oraingo jardueraren ezaugarriak beste jarduera batzuei edit_new_project_name=Proiektuaren izena: edit_new_project_name_tooltip=Proiektua deskribatzeko izen laburra edit_new_project_filename=Fitxategiaren izena: edit_new_project_filename_tooltip=Proiektu- fitxategiaren izena, luzapenik gabe edit_new_project_folder=Karpeta: edit_new_project_folder_tooltip=Proiektua gordetzeko karpetaren izena edit_new_project_folder_browse=Arakatu... edit_new_project_title=Sortu JClic proiektu berria edit_new_project_err_empty=Errorea: Proiektu, fitxategi eta direktorioek izen onargarria izan behar dute. edit_new_project_warning_noEmptyFolder=Karpeta honek badu beste Clic 3.0 edo JClic proiektu bat dagoeneko. Ez nahasteko, hobe da proiektu bakoitza aparteko karpeta batean gordetzea, baina ez da derrigorrezkoa. Benetan gorde nahi al duzu proiektu berria karpeta honetan? edit_new_project_err_folderCreation=Errorea: ezin da sortu adierazitako karpeta! edit_act_copy_err_noSelection=Errorea: Ez da jarduerarik aukeratu! Funtzio hau erabiltzeko zerrendatik jardueraren bat aukeratu behar duzu aipatutako ezaugarriak horri/horiei aplikatzeko. edit_act_copy_action_prefix=Kopiatu ezaugarriak hona: edit_act_copy_margin=Marjina edit_act_copy_bgColor=Atzeko aldearen kolorea edit_act_copy_gradient=Gradientea edit_act_copy_bgImage=Atzeko aldearen irudia edit_act_copy_border=Ertza edit_act_copy_transparentBg=Atzeko alde gardena edit_act_copy_position=Kokapena edit_act_copy_messages=Mezuak edit_act_copy_messages_ini=Hasierako mezuaren estiloa edit_act_copy_messages_end=Bukaerako mezuaren estiloa edit_act_copy_messages_err=Errore-mezuaren estiloa edit_act_copy_reports=Txostenak edit_act_copy_rep_include=Txostenetan jarduera sartu edit_act_copy_rep_actions=Ekintzak erregistratu edit_act_copy_interface=Erabiltzailearen interfazea edit_act_copy_skin=Itxura edit_act_copy_evSounds=Ekintza-soinuak edit_act_copy_counters=Kontagailuak edit_act_copy_cTime=Denbora-kontagailua edit_act_copy_maxTime=Gehinezko denbora edit_act_copy_cTries=Saiakera-kontagailua edit_act_copy_maxTries=Gehi. saiakera-kopurua edit_act_copy_cScore=Puntuazio-kontagailua edit_act_copy_scramble=Zenbat aldiz nahastu behar den edit_act_copy_buttons=Botoiak edit_act_copy_btnHelp=Laguntza-botoia edit_act_copy_btnInfo=Informazio-botoia edit_act_copy_grids=Taulak edit_act_copy_gridA=A taularen estiloa edit_act_copy_gridB=B taularen estiloa edit_act_copy_textGrid=Testu-panelen estiloa edit_act_copy_text=Testu-jarduerak edit_act_copy_fontFace=Letra-tipoaren izena edit_act_copy_fontSize=Letra-tamaina edit_act_copy_fontStyle=Letra-tipoaren estiloa edit_act_copy_textColour=Testu nagusiaren kolorea edit_act_copy_textTargetColour=Aukeratu zein JClic proiektutatik inportatu behar diren jarduerak edit_act_copy_textErrorColour=Errore-kolorea edit_act_copy_tabSpace=Tabuladoreen arteko espazioa edit_act_copy_messages_prev=Aurreko mezuaren estiloa edit_act_changeType=Aldatu jarduera-mota edit_act_newActivity_class_tooltip=Jarduera egiteko erabiliko den motaren izen osoa (erabiltzaile aurreratuak bakarrik!) edit_act_newActivity_other=Bestelakoa... edit_act_newActivity_info=Erabiltzaile aurreratuek erregistratu gabeko beste JClic jarduera-mota batzuk ere sor ditzakete. Idatzi azpian motaren izen osoa, aurretik paketearena duela (adibidez, "com.acme.activities.FooActivity"). Jarduera-motek edu.xtec.jclic.Activity zabaldu behar dute eta JVM bilatzailearekin eskuratzeko moduan egon behar dute. edit_act_newActivity_name=Jardueraren izena: edit_act_newActivity_name_tooltip=Jarduera bakoitzak izen bat izan behar du proiektuan edit_act_changeType_warning=

Adi: Mota aldaketak editatzen ari den jardueraren ezaugarri eta objektuak galtzea ekar dezake. Kontu handiz erabili funtzio hau!

 

applet_codebase=JClic kodearen kokapena: applet_codebase_tooltip=JClic programaren fitxategiak dauden karpetara zuzenduko duen URL-a applet_prev_text=Aurreko HTML kodea: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Aplikazioaren aurretik ipini beharreko testua edo HTML kodea applet_post_text=Ondorengo HTML kodea: applet_post_text_tooltip=Aplikazioaren ondoren ipini beharreko testua edo HTML kodea applet_size=Aplikazioaren tamaina: applet_size_tooltip=Applet-aren zabalera eta altuera, balore absolutuetan edo ehunekoetan. applet_page_title=Orriaren izenburua: applet_page_title_tooltip=Nabigatzailearen leihoaren goiko aldean erakutsi beharreko testua applet_created_info="%s" web-orria egoki sortu da. applet_created_prompt=Orain nabigatzailearekin irekitzea nahi al duzu? action_createHTML_caption=Sortu web-orria... applet_create_title=Sortu HTML orri bat JClic aplikazioarekin action_createHTML_tooltip=Sortu HTML orri bat oraingo proiektua duen aplikazioarekin applet_filename=Fitxategi-izena: applet_filename_tooltip=Sortu beharreko HTML fitxategiaren izena action_createHTML_keys=H* settings_applet=Aplikazioa settings_applet_tooltip=Web-orria sortzeko erabilitako berezko baloreak applet_bgcolor=Atzealdeko kolorea: applet_bgcolor_tooltip=HTML orriaren atzealdeko kolorea applet_centered=Erdian applet_centered_tooltip=Applet-a erdian ipini horizontalean applet_width_tooltip=Applet-aren zabalera (balore absolutuan edo ehunekoetan) applet_height_tooltip=Applet-aren altuera (balore absolutuan edo ehunekoetan) applet_exitUrl=Irtetean, joan hona: applet_exitUrl_tooltip=JClic-etik irtetean zein URL-tara zuzendu behar den nabigazioa applet_infoFrame=Informazio-markoaren izena: applet_infoFrame_tooltip="Informazioa" botoiko edukia erakusteko markoaren izena action_createInstaller_caption=Proiektuaren instalatzailea sortu... action_createInstaller_keys=I* action_createInstaller_tooltip=Proiektuaren instalaziorako fitxategia sortu JClic player-erako installer_caption=Editatu proiektuaren instalazio-script-a installer_title=Izenburua: installer_title_tooltip=Instalazio-laguntzailean erakutsiko den proiektuaren izenburua installer_authors=Egileak: installer_authors_tooltip=Proiektuaren egilea/k (izen laburra) installer_folder=Karpeta: installer_folder_tooltip=Instalaziorako laguntzaileak aholkatuko duen karpetaren izena installer_files=Kopiatu behareko fitxategiak: installer_files_tooltip=Instalatzaileak kopiatu beharreko fitxategiak installer_files_available=Eskura dauden fitxategiak installer_files_selected=Aukeratutako fitxategiak installer_files_add=>>gaineratu>> installer_files_add_tooltip=Gaineratu aukeratutako fitxategia zerrendara installer_files_remove=<Attention:

Ce projet se connecte avec d'autres projets.
Voulez-vous explorer les liens et charger tous les fichiers li\u00E9s ?

(Il est conseill\u00E9 de r\u00E9pondre OUI quand vous importez des activit\u00E9s Clic 3.0) edit_mc_type=Type: edit_mc_type_unknown=Inconnu edit_mc_type_sound=Jouer son edit_mc_type_video=Jouer vid\u00E9o edit_mc_type_midi=Jouer MIDI edit_mc_type_cdaudio=Jouer un CD audio edit_mc_type_record=Enregistrer son edit_mc_type_play_recorded=Jouer un son enregistrer edit_mc_type_run_activity=Aller \u00E0 l'activit\u00E9 edit_mc_type_run_sequence=Aller \u00E0 la s\u00E9quence edit_mc_type_run_external=Lancer le programme edit_mc_type_url=Montrer URL edit_mc_type_exit=Fin edit_mc_type_return=Retour edit_mc_level=Niveau de priorit\u00E9: edit_mc_file=Fichier: edit_mc_externalParam=Param\u00E8tres: edit_mc_from=De: edit_mc_to=A: edit_mc_length=Max. longueur: edit_mc_recBuffer=Magn\u00E9tophone: edit_mc_stretch=Stretch taille edit_mc_location=Localisation: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=De: edit_mc_location_from_box=Cellule edit_mc_location_from_window=Fen\u00EAtre edit_mc_location_from_frame=CAdre edit_mc_loop=Jouer en boucle edit_mc_autostart=D\u00E9marrage automatique edit_mc_catchmouse=Capturer souris edit_mc_title=Multimedia et contenu actif edit_mc_label=Contenu actif: edit_media_dlg_title=S\u00E9lection d'objet multimedia edit_media_title=Librairie m\u00E9dia edit_mc_pos_cell=Centr\u00E9 sur la cellule edit_mc_pos_window=Centr\u00E9 sur la fen\u00EAtre edit_mc_pos_absolute=Sp\u00E9cifier la position: edit_tree_badFormat=Structure d'arborescence ou donn\u00E9e incorrect Incorrect\\! edit_act_panels_controls=Contr\u00F4les edit_act_panels_controls_tooltip=Options pour les boutons et compteurs edit_act_class=Type: edit_act_gridLayout=Echelle de la grille: edit_act_gridLayout_tooltip=Position relative des panneaux A et B. edit_act_inverseResolution=R\u00E9solution inverse edit_act_inverseResolution_tooltip=L'activit\u00E9 est r\u00E9solue quand tous les \u00E9l\u00E9ments assign\u00E9s \u00E0 "B" sont affich\u00E9s. edit_act_showAllArrows=Montrer toutes les fl\u00E8ches edit_act_alt=Contenu alternatif: edit_act_alt_tooltip=Contenu montr\u00E9 dans les cellules r\u00E9solues et cellules non-assign\u00E9es. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Editer le contenu alternatif edit_act_grid=Grille edit_act_grid_A=Grille A edit_act_grid_B=Grille B edit_act_grid_layout=Calque edit_act_grid_relationship=Relation edit_seq_activity_header=activit\u00E9 edit_seq_tag_header=Drapeau edit_seq_jump_header=Sauter \u00E0 edit_seq_activity=Activit\u00E9: edit_seq_tag=Etiquette: edit_seq_description=Description: edit_seq_auto=D\u00E9placer automatiquement edit_seq_delay=Delai: edit_seq_action_fwd=Aller devant edit_seq_action_back=Aller derri\u00E8re edit_seq_action_jump=Sauter \u00E0... edit_seq_action_stop=Stop edit_seq_action_return=Retourner edit_seq_action_exit=Quitter JClic edit_seq_arrow_fwd=Fl\u00EAche avant: edit_seq_arrow_back=Fl^che arri\u00E8re: edit_seq_action=Action: edit_seq_button_enabled=Montrer bouton edit_seq_project=Projet JClic: edit_act_absolute=Position absolue edit_act_absolute_tooltip=L'objet sera plac\u00E9 aux coordonn\u00E9es X et Y sp\u00E9cifi\u00E9es edit_act_location=Localisation: edit_seq_newElement=nouvelle s\u00E9quence d'activit\u00E9... edit_seq_newElement_tooltip=Ins\u00E9rer un nouvel \u00E9l\u00E9ment dans la s\u00E9quence d'activit\u00E9 edit_seq_newElement_msg=S\u00E9lectionnez une activit\u00E9 pour la nouvelle s\u00E9quence. edit_seq_newElement_error_noAct=Impossible de cr\u00E9er une nouvelle s\u00E9quence d'\u00E9l\u00E9ments sans activit\u00E9\\! edit_seq_newElement_error_emptyList=Ce projet n'a pas d'activit\u00E9s\\! Impossible de cr\u00E9er une s\u00E9quence d'\u00E9l\u00E9ments dans un projet vide. edit_seq_jump_msg=Cible de saut: edit_seq_jump_title=Cible de saut edit_act_newActivity_tooltip=Ajouter une nouvelle activit\u00E9 au projet edit_act_prompt_class=Type d'activit\u00E9: edit_act_prompt_name=Nom: edit_act_newActivity_msg=S\u00E9lectionnez le type d'activit\u00E9 \u00E0 cr\u00E9er et donnez-lui un nom: edit_act_newActivity_error_noAct=Vous devez s\u00E9lectionner un type d'activit\u00E9\\! edit_act_newActivity_error_noName=Vous devez sp\u00E9cifier un nom pour l'activit\u00E9\\! edit_act_newActivity_error_creating=Impossible de cr\u00E9er l'activit\u00E9\\! edit_act_newActivity_class=Nom de classe Java class: edit_text_act_format=Format edit_text_act_answer=R\u00E9ponse edit_text_act_popup=Pop up edit_text_act_answer_label=R\u00E9ponses valides: edit_list_newElement_tooltip=Ajouter une nouvelle liste d'\u00E9l\u00E9ment edit_list_editElement_tooltip=Editer la liste d'\u00E9l\u00E9ments s\u00E9lectionn\u00E9e edit_list_deleteElement_tooltip=Supprimer la liste d'\u00E9l\u00E9ments s\u00E9lectionn\u00E9e edit_list_upBtn_tooltip=D\u00E9placer vers le haut edit_list_downBtn_tooltip=D\u00E9placer vers le bas edit_list_newValue=Nouveau texte: edit_list_addElement=Ajouter une nouvelle liste d'\u00E9l\u00E9ment edit_list_modifyValue=Modifier le texte s\u00E9lectionn\u00E9 edit_text_act_target=Cible edit_text_act_maxLen=Max. longueur: edit_text_act_maxLen_tooltip=Nombre maximum de caract\u00E8res dans la r\u00E9ponse. edit_text_act_fillingChar=Caract\u00E8re de remplissage edit_text_act_fillingChar_tooltip=Caract\u00E8re utilis\u00E9 pour indiquer les blancs edit_text_act_iniLen=Longueur initiale: edit_text_act_iniLen_tooltip=Nombre de carct\u00E8res de remplissage qui seront affich\u00E9s au d\u00E9marrage de l'activit\u00E9. edit_text_act_iniText=Texte initiale: edit_text_act_iniText_tooltip=Texte affich\u00E9 dans le blanc au d\u00E9marrage de l'activit\u00E9. edit_text_act_list=Montrer une liste des options: edit_text_act_list_tooltip=Afficher une liste d'options dans laquelle l'utilisateur doit en choisir une. edit_text_act_check_title=Options de correction edit_text_act_popup_no=Pas de pop up edit_text_act_popup_always=Pop up automatique edit_text_act_popup_onError=Pop up si erreurs edit_text_act_popup_onDemand=Pop up avec F1 edit_text_act_popup_type=Type: edit_text_act_popup_delay=Pop up delai: edit_text_act_popup_maxTime=Max. temps: edit_text_act_popup_onlyPlay=Son seulement edit_text_act_err_noSelection=Vous devez s\u00E9lectionner un fragment de texte pour cr\u00E9er un nouveau texte cible\\! edit_text_act_err_badCharInSelection=Le texte cible ne peut pas inclure de retour chariot ni de tabulation. edit_text_act_err_nestedTargets=Cibles ne peuvent \u00EAtre atteintes\\! edit_text_act_err_cellInTarget=Les cibles ne peuvent contenir de cellules\\! edit_text_act_pageBgColor=Couleur de papier: edit_text_act_editStylesBtn=Editer les styles de document... edit_text_act_mainStyle=Style principal: edit_text_act_tabSpc=Tabulation: edit_text_act_tabSize=Espaces entre deux tabulation: edit_text_act_colors=Coleurs: edit_text_act_targetStyle=Couleur des cibles: edit_text_act_errorStyle=Couleur des erreurs: edit_text_act_preview=Pr\u00E9visualisation: edit_text_act_styleSample_default_start=Texte standard edit_text_act_styleSample_target=cible edit_text_act_styleSample_error=erreur edit_text_act_styleSample_default_fill=texte standard edit_text_act_styleSample_default_end=texte standard. edit_text_act_warnDeleteTarget=Warning: Cette action supprimera la cible courante s\u00E9lectionn\u00E9e. Voulez-vous continuer ? edit_text_act_prevScreen_title=Ecran pr\u00E9c\u00E9dent... edit_text_act_prevScreen_no=Ne pas afficher de texte avant de d\u00E9marrer l'activit\u00E9 edit_text_act_prevScreen_original=Afficher le texte complet de l'exercice edit_text_act_prevScreen_special=Afficher ce texte: edit_text_act_prevScreen_time=Max. temps: edit_text_act_edit_target=Cible... edit_text_act_checkButton_show=Montrer le bouton de correction edit_text_act_checkButtonText=Bouton texte: edit_text_act_checkCase=Case r\u00E9pondue edit_text_act_checkAccents=Prendre en compte les accents et caract\u00E8res sp\u00E9ciaux edit_text_act_checkPunct=Prendre en compte les marques de ponctuation edit_text_act_checkDoubleSpc=Autoriser les espaces r\u00E9p\u00E9t\u00E9s edit_text_act_checkOptions=Crit\u00E8re edit_text_act_checkAutoJump=D\u00E9placer vers nouvelle cible quand c'est rempli edit_text_act_checkForceOk=D\u00E9placer seulement apr\u00E8s correcte autorisation edit_text_act_checkDetail=Indiquer les erreurs lettre par lettre edit_text_act_checkDetail_params=Param\u00E8tres de l'algorithme d'analyse: edit_text_act_checkDetail_steps=Etapes: edit_text_act_checkDetail_field=Champ d'exploration: edit_text_act_defaultCheckButtonText=V\u00E9rifier edit_text_act_advancedCorrectionOptions=Analyse de la r\u00E9ponse edit_text_act_check_bt=Correction... edit_text_act_checkButton=Bouton de correction edit_text_act_checkProgress=Progression edit_text_act_typeBtn=Type... edit_text_act_orderParagraphs=Paragraphes ordonn\u00E9s edit_text_act_orderWords=Ranger les mots edit_text_act_order_amongstPar=Shuffle words amongst paragraphs edit_text_act_type_title=Type d'activit\u00E9 edit_text_act_warnChangeType=Cette action effacera toutes les cibles existantes. Voulez-vous continuer ? edit_text_act_identWords=Identifier les mots edit_text_act_identChars=Identifier les caract\u00E8res edit_media_change_name=Changer nom... edit_media_change_file=Changee fichier... edit_media_includeInZip=Enregistrer dans un fichier ZIP edit_media_type=Type de support\u00A0: edit_media_size=Taille de fichier: edit_media_show_type=Fichiers de type: edit_media_preview=Pr\u00E9visualiser m\u00E9dia edit_media_preview_tooltip=Ressource m\u00E9dia pr\u00E9c\u00E9dente edit_media_rename=Changer nom de ressource edit_media_rename_title=Renommer edit_media_rename_prompt=Nouveau nom: edit_media_rename_invalid=Mauvais nom de ressource\\! edit_media_rename_exists=Il y a une autre ressource avec ce nom\\! Chaque ressource doit avoir un nom unique. edit_media_chfile_invalid=Mauvais fichier\\! err_media_chfile_different=Le fichier doit \u00EAtre de m\u00EAme type edit_media_font_error=Impossible de charger la police\\! edit_media_save_file=Enregistrer fichier (extraire depuis ZIP) edit_media_refresh_file=Mettre \u00E0 jour le contenu media depuis un fichier edit_media_warn_zipFileNotExternal=Ce n'est pas un fichier "real", mais un objet localis\u00E9 dans un container ZIP. Pour utiliser ce produit, un fichier avec le m\u00EAme nom doit \u00EAtre pr\u00E9sent dans le dossier o\u00F9 le fichier ZIP est localis\u00E9. edit_activities=Activit\u00E9s edit_sequences=S\u00E9quences edit_media=Librairie m\u00E9dia edit_media_tooltip=G\u00E8re les images et autres fichiers m\u00E9dia utilis\u00E9s dans le projet. edit_activities_tooltip=Cr\u00E9er et \u00E9diter les activit\u00E9s du projet. edit_sequences_tooltip=Cr\u00E9er et \u00E9diter les s\u00E9quences d'activit\u00E9s edit_project_title=Titre: edit_project_title_tooltip=Titre du projet edit_project=Projet edit_project_tooltip=Editer les propri\u00E9t\u00E9s du projet edit_project_description=Description: edit_project_description_tooltip=Description g\u00E9n\u00E9rale du projet edit_project_area=Domaines: edit_project_area_tooltip=Domaine d'application du projet edit_project_level=Niveaux: edit_project_level_tooltip=Niveaux p\u00E9dagogique du projet edit_project_descriptors=Descripteurs: edit_project_descriptors_tooltip=Descripteurs du projet (S\u00E9par\u00E9 pau une virgule) edit_project_languages=Langages: edit_project_languages_tooltip=Langages utilis\u00E9s dans le projet projet edit_project_languages_modify=Changer le langage s\u00E9lectionn\u00E9 edit_project_languages_add=Ajouter langage edit_project_languages_select=ISO-639 langage codes: edit_project_authors=Auteurs: edit_project_authors_tooltip=Personnes intervenant dans la cr\u00E9ation du projet edit_project_author_name=Nom: edit_project_author_mail=e-mail: edit_project_author_rol=R\u00F4le: edit_project_author_organization=Organization: edit_project_author_comments=Commentaires: edit_project_author_url=URL: edit_project_author_name_tooltip=Nom de l'auteur (requis) edit_project_author_mail_tooltip=E-mail auteur (optionnel) edit_project_author_rol_tooltip=R\u00F4le de la personne dans le projet: auteur, collaborateur, dessinateurs, sons... (optionnel) edit_project_author_organization_tooltip=Ecole, universit\u00E9, association... (optionnel) edit_project_author_url_tooltip=Page web personnelle (optionnel) edit_project_author_comments_tooltip=Champ pour d'autres informations(optionnel) edit_project_author_info=Info auteur: edit_project_author_add=Ajouter auteur \u00E0 la liste edit_project_author_edit=Editer info auteur edit_project_org_name=Nom: edit_project_org_name_tooltip=Nom de l'\u00E9cole edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=Adresse e-mail de l'\u00E9cole edit_project_org_url=URL: edit_project_org_url_tooltip=Site Web de l'\u00E9cole edit_project_org_address=Addresse: edit_project_org_address_tooltip=Snail-mail addresse edit_project_org_pc=PC: edit_project_org_pc_tooltip=Code postal edit_project_org_city=Ville: edit_project_org_city_tooltip=Ville de l'\u00E9cole edit_project_org_country=D\u00E9partement: edit_project_org_state=Etat: edit_project_org_comments=Commentaires: edit_project_org=Ecole/s: edit_project_org_tooltip=Ecole ou autre institution intervenant dans le projet edit_project_org_info=Organisation info: edit_project_org_add=Ajouter organisation edit_project_org_edit=Editer donn\u00E9e organisation edit_project_org_country_tooltip=R\u00E9gion, f\u00E9d\u00E9ration, union... edit_project_org_state_tooltip=Etat, communaut\u00E9, r\u00E9gion... edit_project_org_comments_tooltip=Autre info... edit_project_rev_date=Date: edit_project_rev_date_tooltip=Date de r\u00E9vision edit_project_rev_authors=Auteurs: edit_project_rev_authors_tooltip=Auteurs de la r\u00E9vision edit_project_rev_description=Description: edit_project_rev_description_tooltip=Br\u00E8ve description des changements effectu\u00E9s edit_project_rev_comments=Commentaires: edit_project_rev_comments_tooltip=Autres infos edit_project_rev=R\u00E9visions: edit_project_rev_tooltip=Historique des principales modifications du projet edit_project_rev_add=Ajouter un enregistrement r\u00E9vision edit_project_rev_edit=Editer un enregistrement r\u00E9vision edit_project_rev_info=Donn\u00E9e de r\u00E9vision edit_media_objects=objets edit_media_object=objet edit_evsounds_start=D\u00E9marrer l'activit\u00E9: edit_evsounds_click=Cliquer sur l'objet: edit_evsounds_actionError=Action erron\u00E9e: edit_evsounds_actionOk=Action correcte: edit_evsounds_finishedError=Activit\u00E9 termin\u00E9e avec erreurs: edit_evsounds_finishedOk=Activit\u00E9 termin\u00E9e OK: edit_project_rev_err_nodesc=Erreur: Le champ descriptif ne peut \u00EAtre laiss\u00E9 blanc\\! edit_evsounds_dlg_title=Editer l'\u00E9v\u00E8nement son edit_project_evsounds=Ev\u00E8nement sons: edit_project_evsounds_tooltip=D\u00E9finir dessons sp\u00E9cifiques pour chaque \u00E9v\u00E8nement JClic edit_act_evsounds=Ev\u00E8nement sons: edit_act_evsounds_tooltip=D\u00E9finir des sons sp\u00E9cifiques pour chaque \u00E9v\u00E8nement JClic edit_evsounds_default=Son par d\u00E9faut edit_evsounds_disabled=d\u00E9sactiv\u00E9 edit_evsounds_chk_tooltip=Activer ou d\u00E9sactiver le son pour cet \u00E9v\u00E8nement edit_evsounds_select_tooltip=Cliquez pour s\u00E9lectionner un son pour cet \u00E9v\u00E8nement, ou d\u00E9s\u00E9lectionnez pour utiliser le son pare d\u00E9faut action_newProject_caption=Nouveau projet... action_newProject_keys=NN action_newProject_tooltip=Cr\u00E9er un nouveau projet JClic edit_arith_op_from=De: edit_arith_op_from_tooltip=Valeur minimale de l'op\u00E9rateur edit_arith_op_to=To: edit_arith_op_to_tooltip=Valeur maximale de l'op\u00E9rateur edit_arith_op_with=Avec: edit_arith_op_with_tooltip=Si s\u00E9lectionn\u00E9, l'op\u00E9rateur peut aussi avoir cette valeur edit_arith_op_fromList=Un de cette liste: edit_arith_op_fromList_tooltip=Liste de valeurs possibles pour l'op\u00E9rateur edit_arith_op_decimals=D\u00E9cimales: edit_arith_op_decimals_tooltip=Nombre de d\u00E9cimales de l'op\u00E9rande edit_arith_op_dec0=\\# (integer) edit_arith_op_dec1=\\#.\\# edit_arith_op_dec2=\\#.\\#\\# edit_arith_firstOp=Premier op\u00E9rande edit_arith_secondOp=Second op\u00E9rande edit_arith_title=Arith2 pour JClic edit_arith_operations=Op\u00E9rations: edit_arith_operations_tooltip=S\u00E9lectionner le type d'op\u00E9rations \u00E0 r\u00E9aliser edit_arith_operations_plus=Addition edit_arith_operations_minus=Soustraction edit_arith_operations_multiply=Multiplication edit_arith_operations_divide=Division edit_arith_unknown=Inconnu: edit_arith_unknown_tooltip=S\u00E9lectionner l'item qui sera consid\u00E9r\u00E9 comme l'inconnue edit_arith_unknown_aobx=Le r\u00E9sultat est l'inconnue edit_arith_unknown_aoxr=Le second op\u00E9rateur est l'inconnue edit_arith_unknown_xobr=Le premier op\u00E9rateur est l'inconnue edit_arith_unknown_axbr=L'op\u00E9ration est l'inconnue edit_arith_unknown_invert=Ecrire le r\u00E9sultat au d\u00E9but de l'expression edit_arith_result=R\u00E9sultat: edit_arith_result_notCarry=Pas de retenue edit_arith_result_random=Al\u00E9atoire edit_arith_result_asc=Croissant edit_arith_result_order=Ranger par r\u00E9sultat: edit_arith_result_desc=D\u00E9croissant edit_arith_result_avoidDup=Autoriser les doublons edit_arith_cond=Conditions: edit_arith_cond_ind=Indiff\u00E9rent edit_arith_cond_agb=Le premier op\u00E9rateur doit \u00EAtre plus grand que le second edit_arith_cond_alb=Le premier op\u00E9rateur doit \u00EAtre plus petit que le second edit_arith_cond_tooltip=Autres conditions edit_autocp=G\u00E9n\u00E9rateur de contenu automatique: edit_autocp_tooltip=S\u00E9lectionner le type de contenu automatique pour cette activit\u00E9. edit_autocp_block=G\u00E9n\u00E9rateur de contenu edit_autocp_btn=Param\u00E8tres... edit_autocp_btn_tooltip=Configurer les param\u00E8tres du fournisseur de contenu edit_data=Editer donn\u00E9e edit_act=Editer activit\u00E9 edit_acp=Editer le fournisseur de contenu edit_acp_err_creating=Erreur \u00E0 la cr\u00E9ation du fournisseur de contenu\\! edit_project_author_group=Cr\u00E9ation edit_project_description_block=Description edit_project_ui_block=Interface utilisateur edit_act_description=Description\u202F: m_Edit=\u00C9diter m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=Nouvelle activit\u00E9... edit_act_newActivity_keys=A* edit_act_testAction_keys=P\\#10 edit_seq_newElement_keys=S* m_Insert=Ins\u00E9rer m_Insert_Mnemonic=I m_View=Vue m_View_Mnemonic=V action_editProject_caption=Projet action_editProject_keys=PP action_editProject_tooltip=Editer les param\u00E8tres de projet action_editMedia_caption=M\u00E9dia action_editMedia_keys=MM action_editMedia_tooltip=Editer la librairie M\u00E9dia du projet action_editActivities_caption=Activit\u00E9s action_editActivities_keys=AA action_editActivities_tooltip=Editer les activit\u00E9s action_editSeq_caption=S\u00E9quences action_editSeq_keys=SS action_editSeq_tooltip=Editer les s\u00E9quences d'activit\u00E9s warn_project_modified=Le projet courant a \u00E9t\u00E9 modifi\u00E9. Voulez-vous enregistrer les changements ? edit_project_descriptors_block=Descripteurs edit_media_new=Nouvel objet m\u00E9dia... edit_media_new_tooltip=Ajouter une nouvelle image ou objet multim\u00E9dia \u00E0 la librairie edit_media_new_keys=M* edit_seq_threshold=Score: edit_seq_threshold_tooltip_up=Prendre ce chemin quand le score global est \u00E9gal ou sup\u00E9rieur \u00E0... edit_seq_time=Temps impos\u00E9: edit_seq_time_tooltip_up=Pour emprunter ce chemin, le temps pass\u00E9 sur les activit\u00E9s doit \u00EAtre inf\u00E9rieur \u00E0... edit_seq_threshold_tooltip_down=Prendre ce chemin quand le score global est inf\u00E9rieur \u00E0... edit_seq_time_tooltip_down=Prendre ce chemin quand le temps pass\u00E9 sur les activit\u00E9s est sup\u00E9rieur \u00E0... edit_seq_condJump=Sauts conditionnels edit_seq_condJump_tooltip=D\u00E9finir des sauts sp\u00E9cifiques \u00E0 n'ex\u00E9cuter que sous certaines conditions edit_seq_condJump_upper_tooltip=D\u00E9finir les conditions de saut vers le niveau sup\u00E9rieur edit_seq_condJump_lower=Saut inf\u00E9rieur: edit_seq_condJump_upper=Saut sup\u00E9rieur: edit_seq_condJump_lower_tooltip=D\u00E9finir les conditions de saut vers un niveau inf\u00E9rieur edit_seq_action_tooltip_fw=Action assign\u00E9e au bouton "suivant" edit_seq_action_tooltip_bk=Action assign\u00E9e au bouton "pr\u00E9c\u00E9dent" edit_seq_jump_tooltip=D\u00E9finir la cible de saut edit_seq_action_tooltip=Action \u00E0 r\u00E9aliser edit_seq_activity_tooltip=Activit\u00E9 assign\u00E9e \u00E0 cet \u00E9l\u00E9ment de s\u00E9quence edit_seq_tag_tooltip=Drapeau utilis\u00E9 pour r\u00E9f\u00E9rencer cet \u00E9l\u00E9ment de s\u00E9quence (champ optionnel) edit_seq_description_tooltip=Description de l'\u00E9l\u00E9ment de s\u00E9quence (champ optionnel) edit_seq_button_enabled_tooltip=Activer ou d\u00E9sactiver le bouton fl\u00EAche edit_seq_auto_tooltip=Se d\u00E9placer automatiquement quand l'activit\u00E9 est termin\u00E9e edit_seq_delay_tooltip=Secondes \u00E0 attendre avant le d\u00E9placement automatique edit_color_dlgTitle=S\u00E9lectionner couleur edit_media_renaming=Attendez la ressource va \u00EAtre renomm\u00E9e... edit_act_cell_width=Largeur: edit_act_cell_width_tooltip=Largeur de cellule (en pixels) edit_act_cell_height=Hauteur: edit_act_cell_height_tooltip=Hauteur de cellules (en pixels) edit_act_hiddenWords=Mots cach\u00E9s: edit_act_hiddenWords_tooltip=Liste de mots cach\u00E9s plac\u00E9s dans le cadre edit_act_wordSearch_panelB=Utiliser le cadre B edit_act_wordSearch_panelB_tooltip=Les contenus du second cadre seront affich\u00E9s au fur et \u00E0 mesure que les mots seront trouv\u00E9s edit_act_shaper_tooltip=S\u00E9lectionner le type de forme utiliser dans le cadre edit_act_num_cols_tooltip=Nombre de colonnes du cadre edit_act_num_rows_tooltip=Nombre de lignes du cadre edit_act_wildTransparent=D\u00E9limiteurs transparents edit_act_wildTransparent_tooltip=Traiter les d\u00E9limiteurs comme des trous transparents (boites noires) edit_act_behavior_scramble_times=Battages: edit_act_behavior_scramble_times_tooltip=Nombre de temps de battage edit_act_copy_title=Copier les attributs vers... edit_act_copy_attributes=Attributs edit_act_copy_dest=Appliquer \u00E0: edit_act_copy_style_main=Fen\u00EAtre principale edit_act_copy_style_play=Fen\u00EAtre de travail edit_act_copy_activities=Activit\u00E9s \u00E0 modifier: edit_act_copyAttributes=Copier les attributs edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copier les attributs de l'activit\u00E9 courante vers d'autres activit\u00E9s edit_new_project_name=Nom du projet: edit_new_project_name_tooltip=Nom court, descriptif du projet edit_new_project_filename=Nom du fichier: edit_new_project_filename_tooltip=Nom du fichier projet, sans extension edit_new_project_folder=Dossier: edit_new_project_folder_tooltip=Nom du dossier o\u00F9 le dossier est stock\u00E9 edit_new_project_folder_browse=Explorer... edit_new_project_title=Cr\u00E9er un nouveau projet JClic edit_new_project_err_empty=Erreur: Projet, fichier et dossier doivent avoir des noms valides. edit_new_project_warning_noEmptyFolder=Ce dossier contient d\u00E9j\u00E0 un autre projet Clic 3.0 ou JClic. Pour \u00E9viter toute confusion, il est pr\u00E9f\u00E9rable de maintenir chaque projet dans un dossier diff\u00E9rent, c'est une r\u00E8gle stricte. Voulez-vous r\u00E9ellement cr\u00E9er un nouveau projet dans ce dossier ? edit_new_project_err_folderCreation=Error: Impossible de cr\u00E9er le dossier sp\u00E9cifi\u00E9\\! edit_act_copy_err_noSelection=Error: Pas d'activit\u00E9 s\u00E9lectionn\u00E9e\\! Pour utiliser cette fonction vous devez s\u00E9lectionner dans la liste l'activit\u00E9 oules activit\u00E9s pour lesquels les attributs sp\u00E9cifi\u00E9s seront appliqu\u00E9s. edit_act_copy_action_prefix=Copier les attributs vers: edit_act_copy_margin=Marges edit_act_copy_bgColor=Couleur d'arri\u00E8re-plan edit_act_copy_gradient=D\u00E9grad\u00E9 edit_act_copy_bgImage=Image d'arri\u00E8re-plan edit_act_copy_border=Bordure edit_act_copy_transparentBg=Arri\u00E8re-plan transparent edit_act_copy_position=Position edit_act_copy_messages=Messages edit_act_copy_messages_ini=Style du message initial edit_act_copy_messages_end=Style de message terminal edit_act_copy_messages_err=Style de message d'erreur edit_act_copy_reports=Rapports edit_act_copy_rep_include=Inclure l'activit\u00E9 dans les rapports edit_act_copy_rep_actions=Enregistrer les actions edit_act_copy_interface=Interface utilisateur edit_act_copy_skin=Habillage edit_act_copy_evSounds=Sons \u00E9v\u00E8nement edit_act_copy_counters=Compteurs edit_act_copy_cTime=Chronom\u00E8tre edit_act_copy_maxTime=Max. temps edit_act_copy_cTries=Compteur d'essais edit_act_copy_maxTries=Max. essais edit_act_copy_cScore=Score edit_act_copy_scramble=Temps de m\u00E9lange edit_act_copy_buttons=Boutons edit_act_copy_btnHelp=Bouton d'aide edit_act_copy_btnInfo=Bouton d'information edit_act_copy_grids=Grilles edit_act_copy_gridA=Style de grille A edit_act_copy_gridB=Style de grille B edit_act_copy_textGrid=Style de grille de textes edit_act_copy_text=Activit\u00E9s texte edit_act_copy_fontFace=Type de police edit_act_copy_fontSize=Police edit_act_copy_fontStyle=Style de police edit_act_copy_textColour=Couleur de texte principal edit_act_copy_textTargetColour=Couleur des cibles edit_act_copy_textErrorColour=Couleur d'erreurs edit_act_copy_tabSpace=Tabulation edit_act_copy_messages_prev=Style de message pr\u00E9c\u00E9dent edit_act_changeType=Changer type d'activit\u00E9 edit_act_newActivity_class_tooltip=Le nom complet de la classe doit \u00EAtre utilis\u00E9 pour b\u00E2tir l'activit\u00E9 (utiliateurs avanc\u00E9s seulement\\!) edit_act_newActivity_other=Autre... edit_act_newActivity_info=Les utilisateurs avanc\u00E9s peuvent aussi cr\u00E9er des types non-enregistr\u00E9s d'activit\u00E9s JClic. Ecrivez juste le nom complet de la classe derri\u00E8re, pr\u00E9fix\u00E9 par le package (comme "com.acme.activities.FooActivity"). Les classes d'activit\u00E9s doivent \u00EAtre \u00E9tendues edu.xtec.jclic.Activity, et doivent \u00EAtre accessibles par le JVM chargeur de classe. edit_act_newActivity_name=Nom de l'activit\u00E9: edit_act_newActivity_name_tooltip=Chaque activit\u00E9 doit avoir un nom unique dans le projet edit_act_changeType_warning=

Attention: Changer le type de l'activit\u00E9 peut causer la perte de quelques objets et attributs. A utiliser avec pr\u00E9caution\\!

 

applet_codebase=Localisation du code Jclic: applet_codebase_tooltip=L'URL pointe vers un dossier contenant les fichiers JClic et les scripts applet_prev_text=HTML code avant: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Texte ou code HTML \u00E0 placer avant l'applet applet_post_text=Code HTML apr\u00E8s: applet_post_text_tooltip=Texte ou code HTML \u00E0 placer apr\u00E8s l'applet applet_size=Taille de l'applet: applet_size_tooltip=Largeur et hauteur de l'applet, en absolu ou en pourcentage. applet_page_title=Titre de page: applet_page_title_tooltip=Texte \u00E0 montrer en haut de la fen\u00EAtre de l'explorer applet_created_info=La page Web "%s" a \u00E9t\u00E9 cr\u00E9\u00E9e avec succ\u00E8s. applet_created_prompt=Voulez-vous l'ouvrir maintenant avec l'explorer ? action_createHTML_caption=Cr\u00E9er une page Web... applet_create_title=Cr\u00E9er une page HTML avec l'applet JClic action_createHTML_tooltip=Cr\u00E9er une page HTML page avec un applet contenant le projet courant applet_filename=Nom du fichier: applet_filename_tooltip=Nom du fichier HTML \u00E0 cr\u00E9er action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Valeurs par d\u00E9faut utilis\u00E9es par d\u00E9faut pour la cr\u00E9ation de pages Web applet_bgcolor=Couleur d'arri\u00E8re-plan: applet_bgcolor_tooltip=Couleur d'arri\u00E8re-plan de la page HTML applet_centered=Centr\u00E9 applet_centered_tooltip=Placer l'applet centr\u00E9 horizontalement applet_width_tooltip=Largeur de l'applet (absolu ou pourcentage) applet_height_tooltip=Hauteur de l'applet (absolu ou pourcentage) applet_exitUrl=En quittant, allez \u00E0: applet_exitUrl_tooltip=URL o\u00F9 rediriger la navigation en quittant JClic applet_infoFrame=Nom du cadre info: applet_infoFrame_tooltip=Nom du cadre utilis\u00E9 pour montrer le contenu relatif au bouton "info" action_createInstaller_caption=Cr\u00E9er un installateur de projet... action_createInstaller_keys=I* action_createInstaller_tooltip=Cr\u00E9er un script d'installation de projet pour le player JClic installer_caption=Editer le script d'installation du projet installer_title=Titre: installer_title_tooltip=Titre du projet, \u00E0 montrer dans l'installateur installer_authors=Auteurs: installer_authors_tooltip=Auteurs/s du projet (petit texte) installer_folder=Dossier: installer_folder_tooltip=Nom du dossier \u00E0 sugg\u00E9rer par l'installateur installer_files=Fichiers \u00E0 copier: installer_files_tooltip=Fichiers \u00E0 copier par l'installateur installer_files_available=Fichiers valables installer_files_selected=Fichiers s\u00E9lectionn\u00E9s installer_files_add=>> ajouter >> installer_files_add_tooltip=Ajouter le fichier s\u00E9lectionn\u00E9 \u00E0 la liste installer_files_remove=<< retirer << installer_files_remove_tooltip=Retirer le fichier s\u00E9lectionn\u00E9 de la liste installer_button=Bouton de lancement installer_button_tooltip=Propri\u00E9t\u00E9s du bouton \u00E0 montrer dans la librairie du projet installer_button_project=Projet principal: installer_button_project_tooltip=Projet JClic \u00E0 lancer avec le bouton installer_button_text=Etiquette: installer_button_text_tooltip=Petite \u00E9tiquette \u00E0 afficher dans le bouton installer_button_icon=Ic\u00F4ne: installer_button_icon_tooltip=Image \u00E0 utiliser comme ic\u00F4ne de bouton. Laissez blanc pour utiliser l'ic\u00F4ne JClic par d\u00E9faut. installer_button_description=Description installer_button_description_tooltip=Tooltip \u00E0 montrer avec le bouton installer_error_noTitle=Error: Titre du projet absent installer_error_noBaseFolder=Error: Nom du dossier absent installer_error_noFilesSelected=Error: Pas de fichiers s\u00E9lectionn\u00E9s installer_error_noButtonText=Error: Texte du bouton de lancement absent installer_error_projectNotInFiles=Error: le projet assign\u00E9 au bouton de lancement n'est pas dans la liste de fichiers \u00E0 copier applet_page_full=Applet plein-page applet_page_mixed=Applet avec des dimensions sp\u00E9cifiques edit_text_align_left=Aligner le texte \u00E0 gauche edit_text_align_center=Centrer le texte edit_text_align_right=Aligner le texte \u00E0 droite edit_text_act_target_toggle=Cr\u00E9er ou retirer une cible edit_text_act_insertCell=Ins\u00E9rer une cellule edit_text_act_content=Contenu edit_text_act_style=Style edit_cell_size=Taille de cellule: edit_project_orphanActivities=Les activit\u00E9s suivantes n'apparaissent dans aucune s\u00E9quence d'activit\u00E9s du projet, aussi elles ne sont jamais affich\u00E9es: edit_project_orphanMedia=Les objets m\u00E9dia suivants ne sont directement utilis\u00E9s dans aucune activit\u00E9: edit_project_orphanActivities_prompt=Voulez-vous les ajouter \u00E0 la fin de la s\u00E9quence d'activit\u00E9s ? edit_project_orphanMedia_prompt=Voulez-vous les retirer ? edit_project_orphanMedia_title=Retrait des objets m\u00E9dia inutilis\u00E9s edit_project_orphanActivities_title=Orphan activit\u00E9s edit_media_refreshAll=Mettre \u00E0 jour tous les contenus m\u00E9dia edit_media_refreshAll_tooltip=Mettre \u00E0 jour tous les objets m\u00E9dia en rechargeant les fichiers edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Mettre \u00E0 jour le m\u00E9dia... edit_media_exportAll=Exporter tous les m\u00E9dias edit_media_exportAll_tooltip=Enregistrer vers fichiers le contenu de tous les \u00E9l\u00E9ments m\u00E9dia edit_media_exportAll_keys=X* edit_shape_select=S\u00E9lectionner edit_shape_addPoint=Ajouter point edit_shape_deletePoint=supprimer edit_shape_drawRect=Dessiner rectangle edit_shape_drawEllipse=Dessiner ellipse edit_shape_drawPoly=Dessiner polygone edit_shape_toLine=Convertir en ligne edit_shape_toBezier=Convertir en courbe de b\u00E9zier edit_shape_toQuad=Convertir en courbe quadratique edit_shape_rLeft=Rotation \u00E0 gauche edit_shape_rRight=Rotation \u00E0 droite edit_shape_expand=Etendre edit_shape_contract=Contracter edit_shape_zoomIn=Zoom in edit_shape_zoomOut=Zoom out edit_shape_aproxPoints=Joindre les points proches edit_shape_showPoints=Montrer les points edit_shape_showPoints_tooltip=Montrer/Cacher les points edit_shape_gridSize=Taille de la grille: edit_shape_hideGrid=Montrer / cacher la grile edit_shape_magnetRadius=Magn\u00E9tisme radiant: edit_shape_elements=El\u00E9ments d\u00E9finis edit_shape_elemName=nom de l'\u00E9l\u00E9ment s\u00E9lectionn\u00E9 edit_shape_magnetRadius_tooltip=Action du magn\u00E9tisme, quand activ\u00E9 edit_shape_gridSize_tooltip=Taille de la grille edit_mc_activity=Activit\u00E9: edit_mc_sequence=S\u00E9quence: edit_mc_url=URL: edit_mc_project=Projet: edit_mc_activity_selection=Choisir activit\u00E9 edit_mc_sequence_selection=Choisir s\u00E9quence edit_mc_err_nullContent=Donn\u00E9e insuffisante\\! edit_act_arrowColor=Couleur de fl\u00E8che: edit_act_arrowColor_tooltip=Couleur utilis\u00E9e par l'\u00E9diteur pour dessiner les fl\u00E8ches (pas exactement, car un masque XOR est utilis\u00E9) edit_act_editActivity=Editer... edit_act_editActivity_tooltip=Editer l'activit\u00E9 s\u00E9lectionn\u00E9e action_saveFileAs_caption=Enregistrer sous... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Enregistrer le projet courant avec un nom diff\u00E9rent edit_act_behavior_block=Comportement edit_act_behavior=Comportement edit_act_behavior_drag=Tra\u00EEner edit_act_behavior_drag_tooltip=Drag cells instead of use a connection line edit_act_behavior_order=Check solving order edit_act_behavior_order_tooltip=Cells must be solved in order edit_act_scramble=M\u00E9langer action_importActivities_caption=Importer des activit\u00E9s... action_importActivities_keys=I* action_importActivities_tooltip=Importer des activit\u00E9s d'un autre projet import_warn_samefile=Le fichier choisi correspond au projet en cours. Des activit\u00E9s peuvent \u00EAtre import\u00E9es seulement entre diff\u00E9rents projets. Veuillez choisir un autre fichier. import_selectActivities=Choisissez une ou plusieurs activit\u00E9s pour importer dans le projet en cours: import_importing=Importation... import_checkdep=V\u00E9rification des d\u00E9pendances... import_impmedia=Importation des m\u00E9dias: import_impact=Importation de l'activit\u00E9: import_selectProject=Choisissez le projet de JClic dont les activit\u00E9s seront import\u00E9es edit_tagRep_tags=Signes utilis\u00E9s pour les balises edit_tagRep_tagStart=Signe de d\u00E9part: edit_tagRep_tagStart_tooltip=Signe utilis\u00E9 pour ouvrir les balises edit_tagRep_tagEnd=Signe de fin: edit_tagRep_tagEnd_tooltip=Signe utilis\u00E9 pour fermer les balises edit_tagRep_file=Fichier edit_tagRep_fileName=Fichier ou URL: edit_tagRep_fileName_tooltip=Nom ou URL du fichier qui contient les valeurs qui remplaceront les balises edit_tagRep_charset=Encodage des caract\u00E8res: edit_tagRep_charset_tooltip=Encodage de caract\u00E8res utilis\u00E9 dans le fichier edit_tagRep_browseFile=Parcourir\u2026 edit_tagRep_browseFile_tooltip=Parcourir le syst\u00E8me de fichier edit_tagRep_title=Remplacement de balises edit_text_act_clearStylesBtn=Effacer les styles du texte... edit_text_act_clearStylesPrompt=Attention: Cette op\u00E9ration effacera les attributs de caract\u00E8res personnalis\u00E9s de tout le document et y restaurera le style principal. Vous ne pourrez pas revenir sur cette action. Souhaitez-vous la confirmer ? img_max_size=Taille maximale des images : img_max_width_tooltip=Largeur maximale des images import\u00E9es dans la biblioth\u00E8que de m\u00E9dias. img_max_height_tooltip=Hauteur maximale des images import\u00E9es dans la biblioth\u00E8que de m\u00E9dias. img_resize_prompt=L'image "%s" a une taille de %s pixels. Cette taille d\u00E9passe ce qui est permis par JClic Author (%s). Voulez-vous la redimensionner ? src/author/edu/xtec/resources/messages/AuthorMessages_gl.properties000066400000000000000000001300121335566474600262620ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Descrici\u00F3n edit_act_name_tooltip=Nome da actividade edit_act_name=Nome: edit_act_description_tooltip=Descrici\u00F3n da actividade edit_act_reports_block=Informes edit_act_includeInReports=Engadir esta actividade nos informes edit_act_includeInReports_tooltip=Engadir os resultados desta actividade nos informes de usuario edit_act_code=C\u00F3digo: edit_act_code_tooltip=C\u00F3digo opcional empregado para agrupar e filtrar na base de datos de informes. edit_act_reportActions=Rexistrar tam\u00E9n as acci\u00F3ns edit_act_reportActions_tooltip=Rexistrar os detalles de todas as acci\u00F3ns feitas polos usuarios edit_act_counters_block=Contadores edit_act_timeCounter=Contador de tempo edit_act_timeCounter_tooltip=Mostrar ou agochar o contador de tempo edit_act_actionsCounter=Contador de intentos edit_act_actionsCounter_tooltip=Mostra ou agocha o contador de intentos edit_act_scoreCounter=Contador de acertos edit_act_scoreCounter_tooltip=Mostrar ou agochar o contador de acertos. edit_act_maxTime=Tempo m\u00E1ximo: edit_act_maxTime_tooltip=Tempo m\u00E1ximo para resolver a actividade, en segundos, ou cero para ilimitado. edit_act_countdown=Conta atr\u00E1s edit_act_countdown_tooltip=O contador comeza no m\u00E1ximo valor, decrecendo ata cero. edit_act_maxActions=Intentos m\u00E1x: edit_act_maxActions_tooltip=N\u00FAmero m\u00E1ximo de intentos permitidos, ou cero para ilimitado. edit_act_buttons_block=Bot\u00F3ns edit_act_helpBtn=Axuda edit_act_helpBtn_tooltip=Mostra ou oculta o bot\u00F3n de axuda edit_act_helpBtn_solution=Mostra a soluci\u00F3n edit_act_helpBtn_msg=Mostra esta mensaxe: edit_act_infoBtn=Informaci\u00F3n edit_act_infoBtn_tooltip=Mostra ou agocha o bot\u00F3n de informaci\u00F3n edit_act_infoBtn_url=Mostra este URL: edit_act_infoBtn_cmd=Executa a orde: edit_act_infoBtn_url_tooltip=Enderezo da p\u00E1xina web que se mostrar\u00E1 ao premer no bot\u00F3n de informaci\u00F3n edit_act_infoBtn_cmd_tooltip=Li\u00F1a de ordes que se executar\u00E1 ao premer no bot\u00F3n de informaci\u00F3n. edit_act_mainWindow=Xanela principal: edit_act_gameWindow=Xanela de xogo: edit_act_margin=Marxe: edit_act_margin_tooltip=Espazo horizontal e vertical entre obxectos visuais. edit_act_bgColor=Cor de fondo: edit_act_bgColor_tooltip=Cambia a cor de fondo. edit_gradient_startColor=Cor inicial: edit_gradient_endColor=Cor final: edit_gradient_startColor_tooltip=Selecci\u00F3n da cor inicial edit_gradient_endColor_tooltip=Selecci\u00F3n da cor final. edit_gradient_cycles=Ciclos: edit_gradient_cycles_tooltip=N\u00FAmero de repetici\u00F3ns do gradiente sobre a superficie a pintar. edit_gradient_orientation=Orientaci\u00F3n: edit_gradient_orientation_tooltip=Orientaci\u00F3n do gradiente, medida en graos sobre a horizontal. edit_act_gradient=Gradiente: edit_act_gradient_tooltip=Emprega un gradiente de cores edit_color_opacity=Opacidade edit_color_opacity_tooltip=Axusta o valor da canle alfa (opacidade) de cor. edit_gradient_title=Gradiente edit_gradient_default=Empregar os valores predeterminados (gradiente nulo). edit_act_image=Imaxe: edit_act_descriptionTab=Descrici\u00F3n edit_act_descriptionTab_tooltip=Nome e descrici\u00F3n edit_act_tiledBgImg=En mosaico edit_act_tiledBgImg_tooltip=Pinta toda a superficie coa imaxe, repet\u00EDndoa ao longo dos eixos X e Y tantas veces como for necesario. edit_act_preview=Vista previa: edit_act_border=Bordo edit_act_border_tooltip=Debuxar unha li\u00F1a de bordo arredor da xanela edit_act_transparent=Transparente edit_act_transparent_tooltip=A xanela ten o fondo transparente edit_act_width=Largura: edit_act_height=Altura: edit_act_width_tooltip=Largura do obxecto, indicada en p\u00EDxeles edit_act_height_tooltip=Altura do obxecto, en p\u00EDxeles edit_act_centered=Centrado edit_act_centered_tooltip=O obxecto sit\u00FAase centrado respecto \u00E1 xanela principal edit_act_x=X: edit_act_x_tooltip=Posici\u00F3n horizontal absoluta edit_act_y=Y: edit_act_y_tooltip=Posici\u00F3n vertical absoluta edit_act_ui_block=Interface de usuario edit_act_image_tooltip=Selecciona unha imaxe edit_act_text=Texto: edit_act_text_tooltip=Texto que se mostrar\u00E1 neste obxecto edit_font_face=Tipo: edit_font_size=Tama\u00F1o: edit_font_bold=Negra edit_font_italic=Cursiva edit_font_underline=Subli\u00F1ado edit_font_style=Estilo: edit_cell_title=Contido da cela edit_act_messages=Mensaxes edit_act_msg_initial=Mensaxe inicial: edit_act_msg_final=Mensaxe final: edit_act_msg_prev=Mensaxe previa: edit_act_msg_error=Mensaxe de erro: edit_act_msg_initial_tooltip=Mensaxe que se mostra cando comezar a actividade edit_act_msg_final_tooltip=Mensaxe que se mostra cando remata a actividade edit_act_msg_error_tooltip=Mensaxe que se mostra cando remata a actividade con erros edit_act_msg_prev_tooltip=Mensaxe que se mostra antes de comezar a actividade (s\u00F3 en certos tipos de actividades) edit_align=Ali\u00F1amento: edit_act_textColor=Cor do texto: edit_act_textColor_tooltip=Cor empregada para debuxar o texto edit_act_shadowColor=Cor da sombra: edit_act_shadowColor_tooltip=Cor empregada na sombra do texto, se existe edit_act_shadow=Sombra edit_act_shadow_tooltip=Debuxar o texto con sombra edit_act_borderColor=Cor do bordo: edit_act_borderColor_tooltip=Cor empregada para debuxar o bordo da cela edit_act_inactiveColor=Cor de estado inactiva: edit_act_inactiveColor_tooltip=Cor empregada cando a cela est\u00E1 desactivada edit_act_altColor=Cor alternativa: edit_act_altColor_tooltip=Cor coa que se mostra o contido alternativo das celas unha vez solucionadas edit_cell_marked=Marcada edit_cell_disabled=Desactivada edit_cell_alt=Alternativa edit_cell_textMargin=Marxe interna: edit_cell_textMargin_tooltip=Espazo entre os bordos da cela e o texto edit_cell_borderWidth=Largo do bordo: edit_cell_borderWidth_tooltip=Largo do trazo empregado para debuxar o bordo edit_cell_markerWidth=Largo do marcador: edit_cell_markerWidth_tooltip=Largo do trazo empregado para debuxar o bordo cando a cela se atopa marcada ou seleccionada edit_cell_alt_tooltip=Vista previa da cela en estado \u00ABalternativo\u00BB edit_cell_disabled_tooltip=Vista previa en estado \u00ABdesactivado\u00BB edit_cell_marked_tooltip=Vista previa en estado \u00ABmarcado\u00BB edit_act_testAction=Mostrar a actividade: edit_act_testAction_tooltip=Probar o funcionamento da actividade edit_act_panels_description=Descrici\u00F3n edit_act_panels_description_tooltip=T\u00EDtulo e descrici\u00F3n da actividade edit_act_panels_options=Opci\u00F3ns edit_act_panels_options_tooltip=Opci\u00F3ns da actividade edit_act_panels_frame=Xanela edit_act_panels_frame_tooltip=Aspecto, tama\u00F1o e posici\u00F3n da xanela na que se executa a actividade edit_act_panels_messages=Mensaxes edit_act_panels_messages_tooltip=Contido das mensaxes da actividade edit_act_panels_panel=Panel edit_act_panels_panel_tooltip=Contidos do panel edit_style_title=Estilo edit_style_tooltip=Axustar a cor, tipo e tama\u00F1o de letra das celas edit_act_style=Estilo: edit_act_overlap=Evitar superposici\u00F3n imaxe/texto edit_act_overlap_tooltip=Tentar evitar que texto e a imaxe se superpo\u00F1an edit_media_exists_1=O ficheiro edit_media_exists_2=xa existe na mediateca! edit_act_shaper=Recortador: edit_act_shaper_err=Produciuse un erro no xerador de formas: edit_act_num_cols=Columnas: edit_act_num_rows=Filas: edit_act_toothHeightFactor=Altura dos dentes: edit_act_toothWidthFactor=Largura dos dentes: edit_act_toothRandom=Distribuci\u00F3n ao chou edit_act_shaper_properties=Propiedades do xerador de formas edit_act_panels_text=Texto edit_act_panels_text_tooltip=Texto da actividade action_saveFile_caption=Gardar... action_saveFile_keys=SS action_saveFile_tooltip=Gardar o proxecto action_docTree_caption=\u00C1rbore do documento... action_docTree_keys=T* action_docTree_tooltip=Mostra o documento do proxecto en forma de \u00E1rbore edit_docTree_title=\u00C1rbore do documento edit_media_referencedBy=Referenciado por: msg_prompt_loadReferences=Atenci\u00F3n:

Este proxecto enlaza con outros proxectos.
Desexa explorar as ligaz\u00F3ns e cargar todos os ficheiros relacionados?

(Recom\u00E9ndase responder SI cando se est\u00E1 importando un paquete de actividades Clic 3.0) edit_mc_type=Tipo: edit_mc_type_unknown=Desco\u00F1ecido edit_mc_type_sound=Reproducir son edit_mc_type_video=Reproducir v\u00EDdeo edit_mc_type_midi=Reproducir MIDI edit_mc_type_cdaudio=Reproducir CD de son edit_mc_type_record=Gravar son edit_mc_type_play_recorded=Reproducir son gravado edit_mc_type_run_activity=Ir \u00E1 actividade edit_mc_type_run_sequence=Ir \u00E1 secuencia edit_mc_type_run_external=Executar un programa edit_mc_type_url=Mostrar URL edit_mc_type_exit=Fin edit_mc_type_return=Volver edit_mc_level=Nivel de prioridade: edit_mc_file=Ficheiro: edit_mc_externalParam=Par\u00E1metros: edit_mc_from=Desde: edit_mc_to=Ata: edit_mc_length=Lonxitude m\u00E1x.: edit_mc_recBuffer=Cinta de gravaci\u00F3n: edit_mc_stretch=Comprimir se non collese edit_mc_location=Localizaci\u00F3n: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Desde: edit_mc_location_from_box=Cela edit_mc_location_from_window=Xanela edit_mc_location_from_frame=Fotograma edit_mc_loop=Repetir indefinidamente edit_mc_autostart=Comezo autom\u00E1tico edit_mc_catchmouse=Capturar o rato edit_mc_title=Contido activo e multimedia edit_mc_label=Contido activo: edit_media_dlg_title=Selecci\u00F3n do obxecto multimedia edit_media_title=Mediateca edit_mc_pos_cell=Centrado na cela edit_mc_pos_window=Centrado na xanela edit_mc_pos_absolute=Especificar posici\u00F3n: edit_tree_badFormat=A estrutura ou os datos da \u00E1rbore son incorrectos! edit_act_panels_controls=Controis edit_act_panels_controls_tooltip=Opci\u00F3ns de bot\u00F3ns e contadores edit_act_class=Tipo: edit_act_gridLayout=Distribuci\u00F3n dos paneis: edit_act_gridLayout_tooltip=Posici\u00F3n relativa dos paneis A e B. edit_act_inverseResolution=Resoluci\u00F3n inversa edit_act_inverseResolution_tooltip=A actividade considerarase resolta cando todos os elementos de \u00ABB\u00BB estean emparellados. edit_act_showAllArrows=Mostrar todas as frechas edit_act_alt=Contido alternativo: edit_act_alt_tooltip=Contido que se mostra nas celas xa resoltas ou non asignadas. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Editar o contido alternativo edit_act_grid=Panel edit_act_grid_A=Grella A edit_act_grid_B=Panel B edit_act_grid_layout=Disposici\u00F3n edit_act_grid_relationship=Relaci\u00F3ns edit_seq_activity_header=actividade edit_seq_tag_header=etiqueta edit_seq_jump_header=saltar a edit_seq_activity=Actividade: edit_seq_tag=Etiqueta: edit_seq_description=Descrici\u00F3n: edit_seq_auto=Avance autom\u00E1tico edit_seq_delay=Retardo: edit_seq_action_fwd=Avanzar edit_seq_action_back=Retroceder edit_seq_action_jump=Saltar a... edit_seq_action_stop=Parar edit_seq_action_return=Volver edit_seq_action_exit=Sa\u00EDr de JClic edit_seq_arrow_fwd=Frecha adiante edit_seq_arrow_back=Frecha atr\u00E1s edit_seq_action=Acci\u00F3n: edit_seq_button_enabled=Mostrar o bot\u00F3n edit_seq_project=Proxecto JClic: edit_act_absolute=Posici\u00F3n absoluta edit_act_absolute_tooltip=O obxecto situarase nas coordenadas X e Y especificadas edit_act_location=Posici\u00F3n: edit_seq_newElement=Novo elemento da secuencia... edit_seq_newElement_tooltip=Inserir un novo elemento na secuencia de actividades edit_seq_newElement_msg=Seleccione unha actividade para o novo elemento de secuencia. edit_seq_newElement_error_noAct=Non se pode crear un novo elemento de secuencia sen indicar a actividade! edit_seq_newElement_error_emptyList=Neste proxecto non hai ningunha actividade! Non se poden empregar elementos de secuencia nun proxecto baleiro. edit_seq_jump_msg=Destino do salto: edit_seq_jump_title=Destino do salto edit_act_newActivity_tooltip=Engadir unha nova actividade ao proxecto edit_act_prompt_class=Tipo de actividade: edit_act_prompt_name=Nome: edit_act_newActivity_msg=Seleccione o tipo de actividade que desexe crear e d\u00E9alle un nome: edit_act_newActivity_error_noAct=\u00A1Hai que seleccionar un tipo de actividade! edit_act_newActivity_error_noName=Ten que indicar un nome para a actividade! edit_act_newActivity_error_creating=Non se puido crear a actividade! edit_act_newActivity_class=Clase Java: edit_text_act_format=Formato edit_text_act_answer=Resposta edit_text_act_popup=Xanela emerxente edit_text_act_answer_label=Respostas v\u00E1lidas: edit_list_newElement_tooltip=Engadir un novo elemento \u00E1 lista edit_list_editElement_tooltip=Modificar o elemento seleccionado edit_list_deleteElement_tooltip=Eliminar da lista o elemento seleccionado edit_list_upBtn_tooltip=Subir edit_list_downBtn_tooltip=Baixar edit_list_newValue=Novo texto: edit_list_addElement=Engadir un novo elemento de texto edit_list_modifyValue=Modificar o texto seleccionado edit_text_act_target=Destino edit_text_act_maxLen=Lonxitude m\u00E1x.: edit_text_act_maxLen_tooltip=N\u00FAmero m\u00E1ximo de caracteres permitidos na resposta. edit_text_act_fillingChar=Car\u00E1cter de recheo edit_text_act_fillingChar_tooltip=Car\u00E1cter empregado para indicar a inc\u00F3gnita edit_text_act_iniLen=Lonxitude inicial edit_text_act_iniLen_tooltip=N\u00FAmero de caracteres de recheo que se mostrar\u00E1n ao comezo da actividade. edit_text_act_iniText=Texto inicial: edit_text_act_iniText_tooltip=Texto que se mostrar\u00E1 na inc\u00F3gnita ao comezo da actividade. edit_text_act_list=Mostrar unha lista de opci\u00F3ns: edit_text_act_list_tooltip=O usuario deber\u00E1 elixir unha opci\u00F3n da lista. edit_text_act_check_title=Opci\u00F3ns de avaliaci\u00F3n edit_text_act_popup_no=Sen xanela emerxente edit_text_act_popup_always=Aparici\u00F3n autom\u00E1tica edit_text_act_popup_onError=Aparici\u00F3n en erros edit_text_act_popup_onDemand=Aparici\u00F3n con F1 edit_text_act_popup_type=Tipo: edit_text_act_popup_delay=Retardo de aparici\u00F3n: edit_text_act_popup_maxTime=Tempo m\u00E1x.: edit_text_act_popup_onlyPlay=Reproducir s\u00F3 son edit_text_act_err_noSelection=\u00C9 necesario seleccionar un fragmento de texto para crear unha nova inc\u00F3gnita! edit_text_act_err_badCharInSelection=O texto das inc\u00F3gnitas non pode inclu\u00EDr retornos de par\u00E1grafo nin tabuladores. edit_text_act_err_nestedTargets=As inc\u00F3gnitas non se poden solapar! edit_text_act_err_cellInTarget=As inc\u00F3gnitas non poden conter celas! edit_text_act_pageBgColor=Cor do papel: edit_text_act_editStylesBtn=Editar os estilos do documento... edit_text_act_mainStyle=Estilo principal: edit_text_act_tabSpc=Tab espazo: edit_text_act_tabSize=Espazos entre marcas de tabulador: edit_text_act_colors=Cores: edit_text_act_targetStyle=Cores das inc\u00F3gnitas: edit_text_act_errorStyle=Cores de erro: edit_text_act_preview=Vista preliminar: edit_text_act_styleSample_default_start=Texto normal edit_text_act_styleSample_target=inc\u00F3gnita edit_text_act_styleSample_error=erro edit_text_act_styleSample_default_fill=texto normal edit_text_act_styleSample_default_end=texto normal. edit_text_act_warnDeleteTarget=Atenci\u00F3n: Esta acci\u00F3n suprimir\u00E1 a inc\u00F3gnita actualmente seleccionada. Desexa facelo? edit_text_act_prevScreen_title=Xanela previa... edit_text_act_prevScreen_no=Non mostrar ning\u00FAn texto antes de comezar a actividade edit_text_act_prevScreen_original=Mostrar o texto completo do exercicio edit_text_act_prevScreen_special=Mostrar este texto: edit_text_act_prevScreen_time=Tempo m\u00E1x.: edit_text_act_edit_target=Inc\u00F3gnita... edit_text_act_checkButton_show=Mostrar o bot\u00F3n de avaliaci\u00F3n edit_text_act_checkButtonText=Texto do bot\u00F3n: edit_text_act_checkCase=Comprobar mai\u00FAsculas/min\u00FAsculas edit_text_act_checkAccents=Ter en conta tiles e caracteres especiais edit_text_act_checkPunct=Ter en conta os signos de puntuaci\u00F3n edit_text_act_checkDoubleSpc=Permitir espazos repetidos edit_text_act_checkOptions=Criterios edit_text_act_checkAutoJump=Saltar automaticamente \u00E1 seguinte inc\u00F3gnita edit_text_act_checkForceOk=Avanzar s\u00F3 se a resposta \u00E9 correcta edit_text_act_checkDetail=Indicar a posici\u00F3n dos erros edit_text_act_checkDetail_params=Par\u00E1metros do algoritmo de an\u00E1lises edit_text_act_checkDetail_steps=Pasos: edit_text_act_checkDetail_field=Campo de exploraci\u00F3n: edit_text_act_defaultCheckButtonText=Avaliaci\u00F3n edit_text_act_advancedCorrectionOptions=An\u00E1lise das respostas edit_text_act_check_bt=Correcci\u00F3n... edit_text_act_checkButton=Bot\u00F3n de avaliaci\u00F3n edit_text_act_checkProgress=Progreso edit_text_act_typeBtn=Tipo... edit_text_act_orderParagraphs=Ordenar par\u00E1grafos edit_text_act_orderWords=Ordenar palabras edit_text_act_order_amongstPar=Barallar palabras entre par\u00E1grafos edit_text_act_type_title=Tipo de actividade edit_text_act_warnChangeType=Esta acci\u00F3n suprimir\u00E1 todas as inc\u00F3gnitas actualmente definidas. Seguro que desexa facelo? edit_text_act_identWords=Identificar palabras edit_text_act_identChars=Identificar caracteres edit_media_change_name=Cambiar o nome... edit_media_change_file=Cambiar o ficheiro... edit_media_includeInZip=Gardar no arquivo ZIP edit_media_type=Tipo de recurso: edit_media_size=Tama\u00F1o do ficheiro: edit_media_show_type=Tipo de ficheiros: edit_media_preview=Visualizar o obxecto edit_media_preview_tooltip=Visualizaci\u00F3n do recurso edit_media_rename=Cambiar o nome do recurso edit_media_rename_title=Renomear edit_media_rename_prompt=Nome novo: edit_media_rename_invalid=Nome de recurso non v\u00E1lido! edit_media_rename_exists=Xa existe outro recurso con este nome! Cada recurso debe ter un \u00FAnico nome no proxecto. edit_media_chfile_invalid=Ficheiro incorrecto! err_media_chfile_different=O ficheiro debe ser do mesmo tipo edit_media_font_error=Non se puido cargar o tipo de letra! edit_media_save_file=Gardar o ficheiro (extraelo desde o ZIP) edit_media_refresh_file=Actualizar o contido do recurso desde o ficheiro edit_media_warn_zipFileNotExternal=Isto non \u00E9 un ficheiro real, sen\u00F3n un obxecto localizado nun contedor ZIP. Para empregar este recurso \u00E9 preciso que exista un ficheiro co mesmo nome no cartafol onde est\u00E1 localizado o ZIP. edit_activities=Actividades edit_sequences=Secuencias edit_media=Mediateca edit_media_tooltip=Xesti\u00F3n de imaxes e outros recursos multimedia empregados no proxecto edit_activities_tooltip=Creaci\u00F3n e edici\u00F3n das actividades do proxecto edit_sequences_tooltip=Creaci\u00F3n e edici\u00F3n de secuencias de actividades edit_project_title=T\u00EDtulo: edit_project_title_tooltip=T\u00EDtulo do proxecto edit_project=Proxecto edit_project_tooltip=Edici\u00F3n das propiedades do proxecto edit_project_description=Descrici\u00F3n: edit_project_description_tooltip=Descrici\u00F3n xeral do proxecto edit_project_area=\u00C1reas: edit_project_area_tooltip=\u00C1reas curriculares do proxecto edit_project_level=Niveis: edit_project_level_tooltip=Niveis educativos do proxecto edit_project_descriptors=Descritores: edit_project_descriptors_tooltip=Descritores do proxecto (separados por comas) edit_project_languages=Idiomas: edit_project_languages_tooltip=Idiomas empregados no proxecto edit_project_languages_modify=Cambiar o idioma seleccionado edit_project_languages_add=Engadir un idioma: edit_project_languages_select=C\u00F3digos de idioma ISO-639: edit_project_authors=Autores: edit_project_authors_tooltip=Persoas que participaron na creaci\u00F3n do proxecto edit_project_author_name=Nome: edit_project_author_mail=Correo electr\u00F3nico: edit_project_author_rol=Rol: edit_project_author_organization=Organizaci\u00F3n: edit_project_author_comments=Comentarios: edit_project_author_url=URL: edit_project_author_name_tooltip=Nome do autor (campo obrigatorio) edit_project_author_mail_tooltip=Enderezo de correo electr\u00F3nico do autor (opcional) edit_project_author_rol_tooltip=Rol da persoa no proxecto: autor, colaborador, debuxos, sons... (campo opcional) edit_project_author_organization_tooltip=Escola, universidade, asociaci\u00F3n... (campo opcional) edit_project_author_url_tooltip=P\u00E1xina web persoal (campo opcional) edit_project_author_comments_tooltip=Outras caracter\u00EDsticas (campo opcional) edit_project_author_info=Datos do autor: edit_project_author_add=Engadir un autor \u00E1 lista edit_project_author_edit=Editar informaci\u00F3n sobre o autor edit_project_org_name=Nome: edit_project_org_name_tooltip=Nome da escola edit_project_org_mail=Correo electr\u00F3nico: edit_project_org_mail_tooltip=Enderezp de correo electr\u00F3nico da escola edit_project_org_url=URL: edit_project_org_url_tooltip=Enderezo web da escola edit_project_org_address=Enderezo: edit_project_org_address_tooltip=Enderezo postal da escola edit_project_org_pc=CP: edit_project_org_pc_tooltip=C\u00F3digo postal edit_project_org_city=Localidade: edit_project_org_city_tooltip=Localidade da escola edit_project_org_country=Pa\u00EDs: edit_project_org_state=Estado: edit_project_org_comments=Comentarios: edit_project_org=Escola/s: edit_project_org_tooltip=Escolas e outras instituci\u00F3ns que participaron no proxecto edit_project_org_info=Datos da organizaci\u00F3n: edit_project_org_add=Engadir unha nova organizaci\u00F3n edit_project_org_edit=Modificar os datos da organizaci\u00F3n edit_project_org_country_tooltip=Estado, pa\u00EDs, federaci\u00F3n... edit_project_org_state_tooltip=Estado federal, nacionalidade, comunidade, rexi\u00F3n... edit_project_org_comments_tooltip=Outros datos... edit_project_rev_date=Data: edit_project_rev_date_tooltip=Data da revisi\u00F3n: edit_project_rev_authors=Autores: edit_project_rev_authors_tooltip=Autor da revisi\u00F3n edit_project_rev_description=Descrici\u00F3n: edit_project_rev_description_tooltip=Breve descrici\u00F3n dos cambios realizados edit_project_rev_comments=Comentarios: edit_project_rev_comments_tooltip=Informaci\u00F3n adicional edit_project_rev=Revisi\u00F3ns: edit_project_rev_tooltip=Historial das principais modificaci\u00F3ns efectuadas no proxecto edit_project_rev_add=Engadir un rexistro de revisi\u00F3n edit_project_rev_edit=Modificaci\u00F3n dos datos da revisi\u00F3n edit_project_rev_info=Caracter\u00EDsticas da revisi\u00F3n edit_media_objects=obxectos edit_media_object=obxecto edit_evsounds_start=Comezo da actividade: edit_evsounds_click=Premer nun obxecto: edit_evsounds_actionError=Acci\u00F3n err\u00F3nea: edit_evsounds_actionOk=Acci\u00F3n correcta: edit_evsounds_finishedError=Actividade rematada con erros: edit_evsounds_finishedOk=Actividade rematada correctamente: edit_project_rev_err_nodesc=Erro: O campo da descrici\u00F3n non pode quedar en branco! edit_evsounds_dlg_title=Edici\u00F3n dos sons de evento edit_project_evsounds=Sons de evento: edit_project_evsounds_tooltip=Asignar sons espec\u00EDficos a cada evento JClic edit_act_evsounds=Sons de evento: edit_act_evsounds_tooltip=Po\u00F1er sons espec\u00EDficos a cada evento de JClic edit_evsounds_default=son predeterminado edit_evsounds_disabled=desactivado edit_evsounds_chk_tooltip=Activa ou desactiva o son para este evento edit_evsounds_select_tooltip=Prema para seleccionar un son para este evento, ou desmarque para empregar o son predeterminado action_newProject_caption=Novo proxecto... action_newProject_keys=NN action_newProject_tooltip=Crea un novo proxecto JClic edit_arith_op_from=Desde: edit_arith_op_from_tooltip=Valor m\u00EDnimo do operando edit_arith_op_to=Ata: edit_arith_op_to_tooltip=Valor m\u00E1ximo do operando edit_arith_op_with=Con: edit_arith_op_with_tooltip=Se se marca, o operando pode ter tam\u00E9n este valor edit_arith_op_fromList=Un da lista: edit_arith_op_fromList_tooltip=Lista de pos\u00EDbeis valores do operando edit_arith_op_decimals=Decimais: edit_arith_op_decimals_tooltip=N\u00FAmero de decimais do operando edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#,# edit_arith_op_dec2=#,## edit_arith_firstOp=Primeiro operando edit_arith_secondOp=Segundo operando edit_arith_title=Arith2 para JClic edit_arith_operations=Operaci\u00F3ns: edit_arith_operations_tooltip=Selecciona o tipo de operaci\u00F3ns a realizar edit_arith_operations_plus=Sumas edit_arith_operations_minus=Restas edit_arith_operations_multiply=Multiplicaci\u00F3ns edit_arith_operations_divide=Divisi\u00F3ns edit_arith_unknown=Inc\u00F3gnita: edit_arith_unknown_tooltip=Selecciona o elemento que far\u00E1 de inc\u00F3gnita edit_arith_unknown_aobx=A inc\u00F3gnita \u00E9 o resultado edit_arith_unknown_aoxr=A inc\u00F3gnita \u00E9 o segundo operando edit_arith_unknown_xobr=O primeiro operando \u00E9 a inc\u00F3gnita edit_arith_unknown_axbr=A operaci\u00F3n \u00E9 a inc\u00F3gnita edit_arith_unknown_invert=Escribe a expresi\u00F3n comezando polo resultado edit_arith_result=Resultado: edit_arith_result_notCarry=Sen \u00ABlevar\u00BB edit_arith_result_random=Ao chou edit_arith_result_asc=Ascendente edit_arith_result_order=Ordenar por resultado: edit_arith_result_desc=Descendente edit_arith_result_avoidDup=Evitar duplicados edit_arith_cond=Condici\u00F3ns: edit_arith_cond_ind=Indiferente edit_arith_cond_agb=O primeiro operando debe ser maior que o segundo edit_arith_cond_alb=O primeiro operando debe ser menor que o segundo edit_arith_cond_tooltip=Outras condici\u00F3ns edit_autocp=Xerador autom\u00E1tico de contido: edit_autocp_tooltip=Selecci\u00F3n do tipo de xerador autom\u00E1tico de contido para esta actividade. edit_autocp_block=Xerador de contido edit_autocp_btn=Configuraci\u00F3n... edit_autocp_btn_tooltip=Configuraci\u00F3n dos par\u00E1metros do xerador de contido edit_data=Edici\u00F3n de datos edit_act=Edici\u00F3n da actividade edit_acp=Edici\u00F3n do xerador de contido edit_acp_err_creating=Produciuse un erro ne creaci\u00F3n do xerador autom\u00E1tico de contido! edit_project_author_group=Creaci\u00F3n edit_project_description_block=Descrici\u00F3n edit_project_ui_block=Interface de usuario edit_act_description=Descrici\u00F3n: m_Edit=Edici\u00F3n m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=Nova actividade... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Inserir m_Insert_Mnemonic=I m_View=Ver m_View_Mnemonic=V action_editProject_caption=Proxecto action_editProject_keys=PP action_editProject_tooltip=Edita as propiedades do proxecto action_editMedia_caption=Mediateca action_editMedia_keys=MM action_editMedia_tooltip=Edita a mediateca do proxecto action_editActivities_caption=Actividades action_editActivities_keys=AA action_editActivities_tooltip=Edita as actividades action_editSeq_caption=Secuencias action_editSeq_keys=SS action_editSeq_tooltip=Edita as secuencias das actividades warn_project_modified=O proxecto actual foi modificado. Desexa gardar os cambios? edit_project_descriptors_block=Descritores edit_media_new=Novo obxecto multimedia... edit_media_new_tooltip=Engadir unha nova imaxe ou obxecto multimedia \u00E1 mediateca edit_media_new_keys=M* edit_seq_threshold=L\u00EDmite de puntuaci\u00F3n: edit_seq_threshold_tooltip_up=Segue este cami\u00F1o cando a puntuaci\u00F3n global for igual ou maior que... edit_seq_time=L\u00EDmite de tempo: edit_seq_time_tooltip_up=Para seguir este cami\u00F1o, o tempo empregado nas actividades debe ser inferior a... edit_seq_threshold_tooltip_down=Segue este cami\u00F1o cando a puntuaci\u00F3n global for inferior a... edit_seq_time_tooltip_down=Segue este cami\u00F1o cando o tempo empregado nas actividades for maior que... edit_seq_condJump=Saltos condicionais edit_seq_condJump_tooltip=Especificar saltos especiais que se executar\u00E1n unicamente se se dan determinadas condici\u00F3ns edit_seq_condJump_upper_tooltip=Indicar as condici\u00F3ns para saltar a un nivel superior edit_seq_condJump_lower=Salto inferior: edit_seq_condJump_upper=Salto superior: edit_seq_condJump_lower_tooltip=Indicar as condici\u00F3ns para saltar a un nivel inferior edit_seq_action_tooltip_fw=Acci\u00F3n asignada ao bot\u00F3n de \u00ABavanzar\u00BB edit_seq_action_tooltip_bk=Acci\u00F3n asignada ao bot\u00F3n de \u00ABretroceder\u00BB edit_seq_jump_tooltip=Indicar o destino do salto edit_seq_action_tooltip=Acci\u00F3n a realizar edit_seq_activity_tooltip=Actividade asignada a este elemento da secuencia edit_seq_tag_tooltip=Etiqueta empregada para referirse a este elemento da secuencia (campo opcional) edit_seq_description_tooltip=Descrici\u00F3n do elemento da secuencia (campo opcional) edit_seq_button_enabled_tooltip=Activar ou desactivar o bot\u00F3n de paso de actividade edit_seq_auto_tooltip=Avanzar automaticamente ao finalizar a actividade edit_seq_delay_tooltip=N\u00FAmero de segundos a esperar antes de realizar o paso autom\u00E1tico edit_color_dlgTitle=Seleccionar cor edit_media_renaming=Por favor, agarda mentres se cambia o nome do recurso... edit_act_cell_width=Largo: edit_act_cell_width_tooltip=Largura das celas (en p\u00EDxeles) edit_act_cell_height=Alto: edit_act_cell_height_tooltip=Altura das celas (en p\u00EDxeles) edit_act_hiddenWords=Palabras agochadas: edit_act_hiddenWords_tooltip=Lista das palabras agochadas no panel edit_act_wordSearch_panelB=Empregar o panel B edit_act_wordSearch_panelB_tooltip=Empregar un segundo panel, que se mostrar\u00E1 segundo se atopen as palabras edit_act_shaper_tooltip=Selecci\u00F3n do tipo de xerador de formas do panel edit_act_num_cols_tooltip=N\u00FAmero de columnas do panel edit_act_num_rows_tooltip=N\u00FAmero de filas do panel edit_act_wildTransparent=Separadores transparentes edit_act_wildTransparent_tooltip=Mostra os separadores (celas negras) como buratos transparentes edit_act_behavior_scramble_times=Mesturas: edit_act_behavior_scramble_times_tooltip=N\u00FAmero de veces que se barallar\u00E1n as pezas edit_act_copy_title=Copiar atributos a... edit_act_copy_attributes=Atributos: edit_act_copy_dest=Aplicar a: edit_act_copy_style_main=Xanela principal edit_act_copy_style_play=Xanela de xogo edit_act_copy_activities=Actividades a modificar: edit_act_copyAttributes=Copiar atributos edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copiar a outras actividades alg\u00FAns dos atributos da actividade actual edit_new_project_name=Nome do proxecto: edit_new_project_name_tooltip=Nome curto e descritivo do proxecto edit_new_project_filename=Nome de ficheiro: edit_new_project_filename_tooltip=Nome do arquivo do proxecto, sen extensi\u00F3n edit_new_project_folder=Cartafol: edit_new_project_folder_tooltip=Nome do cartafol no que se almacenar\u00E1 o proxecto edit_new_project_folder_browse=Explorar... edit_new_project_title=Crear novo proxecto JClic edit_new_project_err_empty=Erro: Tanto o proxecto como o ficheiro e o cartafol deben ter nomes v\u00E1lidos, non pode quedar o campo en branco. edit_new_project_warning_noEmptyFolder=Este cartafol xa cont\u00E9n outro proxecto Clic 3.0 ou JClic. Para evitar confusi\u00F3ns, recom\u00E9ndase manter cada proxecto nun cartafol diferenciado, se ben non \u00E9 un requisito imprescind\u00EDbel. Realmente desexa crear o novo proxecto neste cartafol? edit_new_project_err_folderCreation=Erro: Non \u00E9 pos\u00EDbel crear o cartafol especificado! edit_act_copy_err_noSelection=Erro: Non seleccionou ningunha actividade! Para empregar esta funci\u00F3n \u00E9 necesario seleccionar a lista de actividade ou actividades \u00E1s que se lle aplicar\u00E1n os atributos indicados. edit_act_copy_action_prefix=Copiando atributos a: edit_act_copy_margin=Marxe edit_act_copy_bgColor=Cor de fondo edit_act_copy_gradient=Gradiente edit_act_copy_bgImage=Imaxe de fondo edit_act_copy_border=Bordo edit_act_copy_transparentBg=Fondo transparente edit_act_copy_position=Posici\u00F3n edit_act_copy_messages=Mensaxes edit_act_copy_messages_ini=Estilo da mensaxe inicial edit_act_copy_messages_end=Estilo da mensaxe final edit_act_copy_messages_err=Estilo da mensaxe de erro edit_act_copy_reports=Informes edit_act_copy_rep_include=Engadir a actividade nos informes edit_act_copy_rep_actions=Rexistrar acci\u00F3ns edit_act_copy_interface=Interface de usuario edit_act_copy_skin=Tema visual edit_act_copy_evSounds=Sons de evento edit_act_copy_counters=Contadores edit_act_copy_cTime=Contador de tempo edit_act_copy_maxTime=Tempo m\u00E1ximo edit_act_copy_cTries=Contador de intentos edit_act_copy_maxTries=N\u00FAmero m\u00E1ximo de intentos edit_act_copy_cScore=Contador de acertos edit_act_copy_scramble=N\u00FAmero de veces que hai que barallar edit_act_copy_buttons=Bot\u00F3ns edit_act_copy_btnHelp=Bot\u00F3n de axuda: edit_act_copy_btnInfo=Bot\u00F3n de informaci\u00F3n edit_act_copy_grids=Paneis edit_act_copy_gridA=Estilo do panel A edit_act_copy_gridB=Estilo do panel B edit_act_copy_textGrid=Estilo dos paneis de texto edit_act_copy_text=Actividades de texto edit_act_copy_fontFace=Tipo de letra edit_act_copy_fontSize=Tama\u00F1o de letra edit_act_copy_fontStyle=Estilo de letra edit_act_copy_textColour=Cor do texto principal edit_act_copy_textTargetColour=Escolla o proxecto JClic a partir do cal desexa importar actividades edit_act_copy_textErrorColour=Cor dos erros edit_act_copy_tabSpace=Espazo entre tabuladores edit_act_copy_messages_prev=Estilo da mensaxe previa edit_act_changeType=Cambiar o tipo de actividade edit_act_newActivity_class_tooltip=Nome completo da clase que se empregar\u00E1 para constru\u00EDr a actividade (s\u00F3 usuarios avanzados!) edit_act_newActivity_other=Outras... edit_act_newActivity_info=Os usuarios/as avanzados/as poden crear tam\u00E9n outros tipos de actividades JClic non rexistradas. Escriba debaixo o nome completo da clase, precedida polo do paquete (por exemplo: "com.acme.activities.FooActivity"). As novas actividades estender\u00E1n edu.xtec.jclic.Activity, e ser\u00E1n acces\u00EDbeis ao cargador de clases da M\u00E1quina Virtual de Java. edit_act_newActivity_name=Nome da actividade: edit_act_newActivity_name_tooltip=Cada actividade ter\u00E1 un nome \u00FAnico no proxecto edit_act_changeType_warning=

Atenci\u00F3n: O cambio de tipo pode causar a perda dalg\u00FAns dos atributos e obxectos da actividade que se est\u00E1 a editar. Empregue esta funci\u00F3n con tino!

applet_codebase=Ubicaci\u00F3n do c\u00F3digo JClic: applet_codebase_tooltip=URL que apunta a un cartafol onde est\u00E1n os ficheiros de programa do JClic applet_prev_text=C\u00F3digo HTML previo: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Texto ou c\u00F3digo HTML que aparecer\u00E1 antes do miniaplicativo applet_post_text=C\u00F3digo HTML posterior: applet_post_text_tooltip=Texto ou c\u00F3digo HTML que aparecer\u00E1 despois do miniaplicativo applet_size=Tama\u00F1o do miniaplicativo: applet_size_tooltip=Largura e altura do miniaplicativo, en valores absolutos ou porcentuais. applet_page_title=T\u00EDtulo da p\u00E1xina: applet_page_title_tooltip=Texto que se mostrar\u00E1 na parte superior da xanela do navegador applet_created_info=A p\u00E1xina web \u00AB%s\u00BB creouse correctamente. applet_created_prompt=Desexa abrila agora co navegador? action_createHTML_caption=Crear p\u00E1xina web... applet_create_title=Creaci\u00F3n dunha p\u00E1xina HTML cun miniaplicativo JClic action_createHTML_tooltip=Creaci\u00F3n dunha p\u00E1xina HTML cun miniaplicativo que conte\u00F1a o proxecto actual. applet_filename=Nome do ficheiro: applet_filename_tooltip=Nome do ficheiro HTML que se crear\u00E1 action_createHTML_keys=H* settings_applet=Miniaplicativo settings_applet_tooltip=Valores predeterminados empregados na creaci\u00F3n de p\u00E1xinas web applet_bgcolor=Cor de fondo: applet_bgcolor_tooltip=Cor de fondo da p\u00E1xina web applet_centered=Centrado applet_centered_tooltip=Situar o miniaplicativo centrado horizontalmente applet_width_tooltip=Largura do miniaplicativo (en valor absoluto ou porcentual) applet_height_tooltip=Altura do miniaplicativo (en valor absoluto ou porcentual) applet_exitUrl=Ao sa\u00EDr, ir a: applet_exitUrl_tooltip=URL a onde se redirixir\u00E1 a navegaci\u00F3n ao sa\u00EDr de JClic applet_infoFrame=Marco de informaci\u00F3n: applet_infoFrame_tooltip=Nome do marco empregado para mostrar o contido ligado ao bot\u00F3n \u00ABinfo\u00BB action_createInstaller_caption=Crear instalador do proxecto... action_createInstaller_keys=I* action_createInstaller_tooltip=Creaci\u00F3n dun ficheiro de instalaci\u00F3n do proxecto para JClic player installer_caption=Edici\u00F3n do ficheiro de instalaci\u00F3n do proxecto installer_title=T\u00EDtulo: installer_title_tooltip=T\u00EDtulo do proxecto que se mostrar\u00E1 no asistente da instalaci\u00F3n installer_authors=Autores: installer_authors_tooltip=Autor/es do proxecto (texto curto) installer_folder=Cartafol: installer_folder_tooltip=Nome do cartafol que suxerir\u00E1 o asistente da instalaci\u00F3n installer_files=Ficheiros a copiar: installer_files_tooltip=Ficheiros que se copiar\u00E1n durante a instalaci\u00F3n installer_files_available=Ficheiros dispo\u00F1\u00EDbeis installer_files_selected=Ficheiros seleccionados installer_files_add=>> engadir >> installer_files_add_tooltip=Engadir o ficheiro seleccionado \u00E1 lista installer_files_remove=<< suprimir << installer_files_remove_tooltip=Suprimir o ficheiro seleccionado da lista installer_button=Bot\u00F3n de activaci\u00F3n installer_button_tooltip=Propiedades do bot\u00F3n que se mostrar\u00E1 na biblioteca de proxectos installer_button_project=Proxecto principal installer_button_project_tooltip=Proxecto JClic asociado ao bot\u00F3n installer_button_text=Etiqueta installer_button_text_tooltip=Breve etiqueta de texto, que aparecer\u00E1 dentro do bot\u00F3n installer_button_icon=Icona: installer_button_icon_tooltip=Imaxe que mostrar\u00E1 o bot\u00F3n. Deixar en branco para empregar o bot\u00F3n JClic predeterminado. installer_button_description=Descrici\u00F3n installer_button_description_tooltip=Texto de axuda emerxente que mostrar\u00E1 o bot\u00F3n installer_error_noTitle=Erro: Hai que indicar o t\u00EDtulo do proxecto installer_error_noBaseFolder=Erro: Hai que indicar o nome do cartafol no que se instalar\u00E1 o proxecto installer_error_noFilesSelected=Erro: Non hai ning\u00FAn ficheiro seleccionado installer_error_noButtonText=Erro: Hai que indicar o texto do bot\u00F3n de activaci\u00F3n installer_error_projectNotInFiles=Erro: O proxecto asignado ao bot\u00F3n de activaci\u00F3n non se atopa entre os ficheiros a copiar applet_page_full=O miniaplicativo ocupa toda a p\u00E1xina applet_page_mixed=O miniaplicativo ten unhas dimensi\u00F3ns espec\u00EDficas edit_text_align_left=Ali\u00F1ar o texto \u00E1 esquerda edit_text_align_center=Texto centrado edit_text_align_right=Ali\u00F1ar o texto \u00E1 dereita edit_text_act_target_toggle=Crear unha inc\u00F3gnita ou suprimila edit_text_act_insertCell=Inserir unha cela edit_text_act_content=Contido edit_text_act_style=Estilo edit_cell_size=Tama\u00F1o da cela: edit_project_orphanActivities=As seguintes actividades non chegaron a executarse, posto que non aparecen en ningunha secuencia de actividades do proxecto: edit_project_orphanMedia=Os seguintes obxectos da mediateca non se empregan directamente en ninguha actividade: edit_project_orphanActivities_prompt=Desexa engadilas ao remate da \u00FAltima secuencia de actividades? edit_project_orphanMedia_prompt=Desexa suprimilos? edit_project_orphanMedia_title=Supresi\u00F3n de obxectos multimedia non empregados edit_project_orphanActivities_title=Actividades orfas: edit_media_refreshAll=Actualizar o contido de todos os recursos edit_media_refreshAll_tooltip=Actualizar todos os recursos recargando os seus ficheiros edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Actualizando recursos... edit_media_exportAll=Exportar todos os recursos edit_media_exportAll_tooltip=Gravar en ficheiros o contido de todos os recursos edit_media_exportAll_keys=X* edit_shape_select=Seleccionar edit_shape_addPoint=Engadir un punto edit_shape_deletePoint=Eliminar edit_shape_drawRect=Debuxar un rect\u00E1ngulo edit_shape_drawEllipse=Debuxar unha elipse edit_shape_drawPoly=Debuxar un pol\u00EDgono edit_shape_toLine=Converter en li\u00F1a edit_shape_toBezier=Converter en curva de B\u00E9zier edit_shape_toQuad=Converter en curva cuadr\u00E1tica edit_shape_rLeft=Xirar \u00E1 esquerda edit_shape_rRight=Xirar \u00E1 dereita edit_shape_expand=Expandir edit_shape_contract=Contraer edit_shape_zoomIn=Acercar edit_shape_zoomOut=Alonxar edit_shape_aproxPoints=Axuntar puntos pr\u00F3ximos edit_shape_showPoints=Mostrar os puntos edit_shape_showPoints_tooltip=Mostrar/Agochar os puntos edit_shape_gridSize=Tama\u00F1o da grella: edit_shape_hideGrid=Mostrar / Agochar a grella edit_shape_magnetRadius=Radio do im\u00E1n: edit_shape_elements=Elementos definidos edit_shape_elemName=Nome do elemento seleccionado edit_shape_magnetRadius_tooltip=Radio de acci\u00F3n do im\u00E1n cando est\u00E1 activado edit_shape_gridSize_tooltip=Tama\u00F1o da grella edit_mc_activity=Actividade: edit_mc_sequence=Secuencia: edit_mc_url=URL: edit_mc_project=Proxecto: edit_mc_activity_selection=Escoller actividade edit_mc_sequence_selection=Escoller secuencia edit_mc_err_nullContent=Datos insuficientes! edit_act_arrowColor=Cor das frechas: edit_act_arrowColor_tooltip=Cor empregada polo editor para debuxar as frechas (non \u00E9 exacto, xa que se emprega unha m\u00E1scara XOR de bits) edit_act_editActivity=Editar... edit_act_editActivity_tooltip=Editar a actividade seleccionada action_saveFileAs_caption=Gardar como... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Garda o proxecto cun nome diferente edit_act_behavior_block=Comportamento edit_act_behavior=Comportamento edit_act_behavior_drag=Arrastrar edit_act_behavior_drag_tooltip=Arrastrar obxectos no canto de empregar unha li\u00F1a de conexi\u00F3n edit_act_behavior_order=Comprobar a orde de resoluci\u00F3n edit_act_behavior_order_tooltip=As celas deben ser resoltas en orde edit_act_scramble=Barallar action_importActivities_caption=Importar actividades... action_importActivities_keys=I* action_importActivities_tooltip=Importar actividades dende outro proxecto import_warn_samefile=O ficheiro seleccionado corresp\u00F3ndese co proxecto actual. As actividades poden ser importadas s\u00F3 entre proxectos diferentes. Escolla outro ficheiro de proxecto. import_selectActivities=Escolla unha ou m\u00E1is actividades a importar no proxecto actual: import_importing=Importando... import_checkdep=Comprobaci\u00F3n de dependencias... import_impmedia=Importando multimedia: import_impact=Importando actividade: import_selectProject=Escolla o proxecto JClic a partir do cal desexa importar actividades edit_tagRep_tags=Marcas de etiquetas edit_tagRep_tagStart=Marca inicial: edit_tagRep_tagStart_tooltip=Marca usada ao inicio das etiquetas edit_tagRep_tagEnd=Marca final: edit_tagRep_tagEnd_tooltip=Marca usada ao final das etiquetas edit_tagRep_file=Ficheiro edit_tagRep_fileName=Ficheiro ou URL: edit_tagRep_fileName_tooltip=Nome ou URL do ficheiro que cont\u00E9n os valores que substituiran as etiquetas edit_tagRep_charset=Codificaci\u00F3n de caracteres: edit_tagRep_charset_tooltip=Codificaci\u00F3n de caracteres empregada no ficheiro edit_tagRep_browseFile=Explorar... edit_tagRep_browseFile_tooltip=Explorar o sistema de ficheiros edit_tagRep_title=Substituci\u00F3n de etiqueta edit_text_act_clearStylesBtn=Limpar estilos de texto... edit_text_act_clearStylesPrompt=Atenci\u00F3n: Esta acci\u00F3n limpar\u00E1 os atributos dos caracteres espec\u00EDficos aplicados ao documento, restaur\u00E1ndoos ao seu estilo principal. Esta acci\u00F3n non se pode desfacer. Est\u00E1 seguro de querer continuar? img_max_size=Tama\u00F1o m\u00E1ximo das imaxes: img_max_width_tooltip=Largura m\u00E1xima das imaxes importadas \u00E1 mediateca. img_max_height_tooltip=Altura m\u00E1xima das imaxes importadas \u00E1 mediateca. img_resize_prompt=A imaxe \u00AB%s\u00BB ten un tama\u00F1o de %s p\u00EDxeles. Isto excede o m\u00E1ximo permitido por JClic Author (%s). Quere cambiar o tama\u00F1o? src/author/edu/xtec/resources/messages/AuthorMessages_it.properties000066400000000000000000001256531335566474600263130ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Descrizione edit_act_name_tooltip=Nome dell'attivit\u00E0 edit_act_name=Nome: edit_act_description_tooltip=Descrizione dell'attivit\u00E0 edit_act_reports_block=Rapporti edit_act_includeInReports=Includi questa attivit\u00E0 nei rapporti edit_act_includeInReports_tooltip=Includi i risultati di queste attivit\u00E0 nei rapporti degli utenti edit_act_code=Codice: edit_act_code_tooltip=Codice opzionale usato per raggruppare e fare ricerche nel database dei rapporti. edit_act_reportActions=Resoconto delle attivit\u00E0 dell'utente edit_act_reportActions_tooltip=Registra i dettagli di tutte le attivit\u00E0 eseguite dagli utenti edit_act_counters_block=Contatori edit_act_timeCounter=Cronometro edit_act_timeCounter_tooltip=Mostra/nascondi il cronometro edit_act_actionsCounter=Contatore dei tentativi edit_act_actionsCounter_tooltip=Mostra/nascondi il contatore dei tentativi edit_act_scoreCounter=Punteggio edit_act_scoreCounter_tooltip=Mostra/nascondi il punteggio. edit_act_maxTime=Tempo massimo: edit_act_maxTime_tooltip=Tempo massimo per risolvere l'attivit\u00E0, in secondi, o 0 per un tempo illimitato. edit_act_countdown=Conto alla rovescia edit_act_countdown_tooltip=Il contatore inizia con il valore massimo, decrescendo fino a 0. edit_act_maxActions=Numero massimo dei tentativi: edit_act_maxActions_tooltip=Massimo numero di tentativi premesso, o 0 per tentativi illimitati. edit_act_buttons_block=Pulsanti edit_act_helpBtn=Aiuto edit_act_helpBtn_tooltip=Mostra/nascondi il pulsante di aiuto edit_act_helpBtn_solution=Mostra la soluzione edit_act_helpBtn_msg=Mostra questo messaggio: edit_act_infoBtn=Informazioni edit_act_infoBtn_tooltip=Mostra/Nascondi il pulsante informativo edit_act_infoBtn_url=Mostra questa URL: edit_act_infoBtn_cmd=Esegui questo comando: edit_act_infoBtn_url_tooltip=Indirizzo del sito Web da mostrare quando si clicca sul pulsante informativo edit_act_infoBtn_cmd_tooltip=Linea di comando da eseguire quando si clicca sul pulsante d'informazione. edit_act_mainWindow=Finestra principale: edit_act_gameWindow=Finestra di lavoro: edit_act_margin=Margine: edit_act_margin_tooltip=Spazio orizzontale e verticale tra gli oggetti visuali. edit_act_bgColor=Colore di sfondo: edit_act_bgColor_tooltip=Cambia il colore di sfondo. edit_gradient_startColor=Colore di partenza: edit_gradient_endColor=Colore finale: edit_gradient_startColor_tooltip=Selezione del colore di partenza edit_gradient_endColor_tooltip=Selezione del colore finale edit_gradient_cycles=Ripetizioni: edit_gradient_cycles_tooltip=Numero di ripetizioni della sfumatura sulla superificie colorata edit_gradient_orientation=Orientamento: edit_gradient_orientation_tooltip=Orientamento della sfumatura, misurato in gradi rispetto all'orizzontale edit_act_gradient=Sfumatura: edit_act_gradient_tooltip=Usa sfumature di colore edit_color_opacity=Opacit\u00E0 edit_color_opacity_tooltip=Imposta il valore di canale alpha del colore (opacit\u00E0) edit_gradient_title=Sfumatura edit_gradient_default=Usa i valori di default (sfumatura nulla) edit_act_image=Immagine: edit_act_descriptionTab=Descrizione edit_act_descriptionTab_tooltip=Nome e descrizione edit_act_tiledBgImg=Ripetuto edit_act_tiledBgImg_tooltip=Paint all the surface with the image, repeating it along the X and Y axis as needed. edit_act_preview=Anteprima: edit_act_border=Bordo edit_act_border_tooltip=Disegna una linea attorno alla finestra edit_act_transparent=Trasparente edit_act_transparent_tooltip=La finestra ha lo sfondo trasparente edit_act_width=Larghezza: edit_act_height=Altezza: edit_act_width_tooltip=Larghezza dell'oggetto, misurata in pixels edit_act_height_tooltip=Altezza dell'oggetto, misurata in pixels edit_act_centered=Centrato edit_act_centered_tooltip=L'oggetto sar\u00E0 centrato sulla finestra principale edit_act_x=X: edit_act_x_tooltip=Posizione orizzontale assoluta edit_act_y=Y: edit_act_y_tooltip=Posizione verticale assoluta edit_act_ui_block=Interfaccia utente edit_act_image_tooltip=Seleziona un'immagine edit_act_text=Testo: edit_act_text_tooltip=Testo da mostrare in questo oggetto edit_font_face=Carattere: edit_font_size=Dimensione: edit_font_bold=Grassetto edit_font_italic=Corsivo edit_font_underline=Sottolineato edit_font_style=Stile: edit_cell_title=Contenuto della cella edit_act_messages=Messaggi edit_act_msg_initial=Messaggio iniziale: edit_act_msg_final=Messaggio finale: edit_act_msg_prev=Messaggio precedente: edit_act_msg_error=Messaggio d'errore: edit_act_msg_initial_tooltip=Messaggio da visualizzare all'avvio dell'attivit\u00E0 edit_act_msg_final_tooltip=Messaggio da visualizzare alla conclusione dell'attivit\u00E0 edit_act_msg_error_tooltip=Messaggio da visualizzare quando l'attivit\u00E0 si conclude con degli errori edit_act_msg_prev_tooltip=Messaggio da visualizzare prima dell'avvio dell'attivit\u00E0 (solo in alcuni tipi di attivit\u00E0) edit_align=Allineamento: edit_act_textColor=Colore del testo: edit_act_textColor_tooltip=Colore usato per disegnare il testo edit_act_shadowColor=Colore dell'ombra: edit_act_shadowColor_tooltip=Colore usato per disegnare l'ombreggiatura del testo, quando applicabile edit_act_shadow=Ombreggiatura edit_act_shadow_tooltip=Disegna il testo con l'ombreggiatura edit_act_borderColor=Colore del bordo: edit_act_borderColor_tooltip=Colore usato per disegnare il bordo della cella edit_act_inactiveColor=Colore di stato inattivo: edit_act_inactiveColor_tooltip=Colore usato quando la cella \u00E8 disabilitata edit_act_altColor=Colore alternativo: edit_act_altColor_tooltip=Colore usato per disegnare il contenuto alternativo nelle celle risolte edit_cell_marked=Evidenziato edit_cell_disabled=Disabilitato edit_cell_alt=Alternativa edit_cell_textMargin=Margine interno: edit_cell_textMargin_tooltip=Spazio tra il bordo della cella e il testo. edit_cell_borderWidth=Larghezza del bordo: edit_cell_borderWidth_tooltip=Larghezza della punta usata per disegnare il bordo standard edit_cell_markerWidth=Larghezza del marcatore: edit_cell_markerWidth_tooltip=Larghezza della punta usata per disegnare il bordo quando la cella \u00E8 marcata o selezionata edit_cell_alt_tooltip=Anteprima nello stato "alternativa" edit_cell_disabled_tooltip=Anteprima nello stato "disabilitato" edit_cell_marked_tooltip=Anteprima nello stato "marcato" edit_act_testAction=Anteprima dell'attivit\u00E0 edit_act_testAction_tooltip=Anteprima e prova dell'attivit\u00E0 edit_act_panels_description=Descrizione edit_act_panels_description_tooltip=Titolo e descrizione dell'attivit\u00E0 edit_act_panels_options=Opzioni edit_act_panels_options_tooltip=Opzioni dell'attivit\u00E0 edit_act_panels_frame=Finestra edit_act_panels_frame_tooltip=Aspetto, dimensioni e posizione della finestra dell'attivit\u00E0 edit_act_panels_messages=Messaggi edit_act_panels_messages_tooltip=Contenuto dei messaggi dell'attivit\u00E0 edit_act_panels_panel=Pannello edit_act_panels_panel_tooltip=Contenuti del pannello edit_style_title=Stile edit_style_tooltip=Imposta il colore delle celle, font e dimensioni edit_act_style=Stile: edit_act_overlap=Permetti al testo di sconfinare dall'immagine edit_act_overlap_tooltip=Permette al testo di sconfinare dall'immagine edit_media_exists_1=Il file edit_media_exists_2=gi\u00E0 esiste nella biblioteca multimediale! edit_act_shaper=Pezzi: edit_act_shaper_err=Errore dei pezzi: edit_act_num_cols=Colonne: edit_act_num_rows=Righe: edit_act_toothHeightFactor=Altezza della dentatura edit_act_toothWidthFactor=Larghezza della dentatura edit_act_toothRandom=Distribuzione casuale edit_act_shaper_properties=Propriet\u00E0 dei pezzi edit_act_panels_text=Testo edit_act_panels_text_tooltip=Testo dell'attivit\u00E0 action_saveFile_caption=Salva... action_saveFile_keys=SS action_saveFile_tooltip=Salva il progetto corrente action_docTree_caption=Albero del documento... action_docTree_keys=T* action_docTree_tooltip=Mostra il documento del progetto come un albero edit_docTree_title=Albero del documento edit_media_referencedBy=Referenziato da: msg_prompt_loadReferences=Attenzione:

Questo progetto si connette con altri progetti.
Vuoi esplorare i riferimenti e caricare tutti i files relativi?

(Conviene rispondere SI' quando si vogliono importare attivit\u00E0 di Clic 3.0) edit_mc_type=Tipo: edit_mc_type_unknown=Sconosciuto edit_mc_type_sound=Riproduci un suono edit_mc_type_video=Riproduci un video edit_mc_type_midi=Riproduci un file MIDI edit_mc_type_cdaudio=Riproduci un CD audio edit_mc_type_record=Registra un suono edit_mc_type_play_recorded=Riproduci un suono registrato edit_mc_type_run_activity=Vai all'attivit\u00E0 edit_mc_type_run_sequence=Vai alla sequenza edit_mc_type_run_external=Esegui il programma edit_mc_type_url=Mostra l'URL edit_mc_type_exit=Fine edit_mc_type_return=Torna al programma edit_mc_level=Livello di priorit\u00E0: edit_mc_file=File: edit_mc_externalParam=Parametri: edit_mc_from=Da: edit_mc_to=A: edit_mc_length=Lunghezza max.: edit_mc_recBuffer=Registratore: edit_mc_stretch=Comprimi le dimensioni edit_mc_location=Posizione: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Da: edit_mc_location_from_box=Cella edit_mc_location_from_window=Finestra edit_mc_location_from_frame=Fotogramma edit_mc_loop=Esecuzione continua edit_mc_autostart=Auto start edit_mc_catchmouse=Cattura il mouse edit_mc_title=Contenuti multimediali e attivi edit_mc_label=Contenuto attivo: edit_media_dlg_title=Selezione degli oggetti multimediali edit_media_title=Libreria multimediale edit_mc_pos_cell=Centrato sulla cella edit_mc_pos_window=Centrato sulla finestra edit_mc_pos_absolute=Specifica la posizione: edit_tree_badFormat=Struttura dell'albero incorretta o dati errati! edit_act_panels_controls=Controlli edit_act_panels_controls_tooltip=Opzioni per i pulsanti e i contatori edit_act_class=Tipo: edit_act_gridLayout=Disposizione della griglia: edit_act_gridLayout_tooltip=Posizione relativa dei pannelli A e B. edit_act_inverseResolution=Risoluzione inversa edit_act_inverseResolution_tooltip=L'attivit\u00E0 \u00E8 risolta quando risultano collegati tutti gli elementi assegnati di "B". edit_act_showAllArrows=Mostra tutte le frecce edit_act_alt=Contenuto alternativo: edit_act_alt_tooltip=Contenuto mostrato nelle celle risolte e nelle celle non assegnate. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Modifica il contenuto alternativo edit_act_grid=Griglia edit_act_grid_A=Griglia A edit_act_grid_B=Griglia B edit_act_grid_layout=Disposizione edit_act_grid_relationship=Relazioni edit_seq_activity_header=attivit\u00E0 edit_seq_tag_header=tag edit_seq_jump_header=salta a edit_seq_activity=Attivit\u00E0: edit_seq_tag=Etichetta: edit_seq_description=Descrizione: edit_seq_auto=Vai avanti automaticamente edit_seq_delay=Ritardo: edit_seq_action_fwd=Vai avanti edit_seq_action_back=Vai indietro edit_seq_action_jump=Salta a... edit_seq_action_stop=Arresta edit_seq_action_return=Torna al programma edit_seq_action_exit=Esci da JClic edit_seq_arrow_fwd=Freccia avanti: edit_seq_arrow_back=Freccia indietro: edit_seq_action=Azione: edit_seq_button_enabled=Mostra il pulsante edit_seq_project=Progetto JClic: edit_act_absolute=Posizione assoluta edit_act_absolute_tooltip=L'oggetto sar\u00E0 posizionato alle coordinate X e Y specificate edit_act_location=Posizione: edit_seq_newElement=Nuovo elemento della sequenza... edit_seq_newElement_tooltip=Inserisci un nuovo elemento nella sequenza delle attivit\u00E0 edit_seq_newElement_msg=Per favore seleziona un'attivit\u00E0 per il nuovo elemento della sequenza. edit_seq_newElement_error_noAct=Non posso creare un nuovo elemento senza un'attivit\u00E0! edit_seq_newElement_error_emptyList=Questo progetto non ha attivit\u00E0! Non \u00E8 possibile creare una sequenza di attivit\u00E0 in un progetto vuoto. edit_seq_jump_msg=Obiettivo del salto: edit_seq_jump_title=Obiettivo del salto edit_act_newActivity_tooltip=Aggiungi una nuova attivit\u00E0 al progetto edit_act_prompt_class=Tipo di attivit\u00E0: edit_act_prompt_name=Nome: edit_act_newActivity_msg=Per favore seleziona il tipo di attivit\u00E0 da creare e dai ad essa un nome: edit_act_newActivity_error_noAct=Devi selezionare un tipo di attivit\u00E0! edit_act_newActivity_error_noName=Devi specificare un nome per l'attivit\u00E0! edit_act_newActivity_error_creating=Impossibile creare l'attivit\u00E0! edit_act_newActivity_class=Nome di classe Java: edit_text_act_format=Formato edit_text_act_answer=Risposta edit_text_act_popup=Pop up edit_text_act_answer_label=Risposte valide: edit_list_newElement_tooltip=Aggiungi un nuovo elemento alla lista edit_list_editElement_tooltip=Modifica l'elemento selezionato edit_list_deleteElement_tooltip=Cancella l'elemento selezionato edit_list_upBtn_tooltip=Sposta in alto edit_list_downBtn_tooltip=Sposta in basso edit_list_newValue=Nuovo testo: edit_list_addElement=Aggiungi un nuovo elemento di testo edit_list_modifyValue=Modifica il testo selezionato edit_text_act_target=Testo nascosto edit_text_act_maxLen=Lunghezza max.: edit_text_act_maxLen_tooltip=Massimo numero di caratteri nella risposta. edit_text_act_fillingChar=Carattere di riempimento edit_text_act_fillingChar_tooltip=Carattere utilizzato per indicare il testo nascosto edit_text_act_iniLen=Lunghezza iniziale: edit_text_act_iniLen_tooltip=Numero dei caratteri di riempimento che saranno visualizzati all'inizio dell'attivit\u00E0. edit_text_act_iniText=Testo iniziale: edit_text_act_iniText_tooltip=Testo visualizzato all'inizio dell'attivit\u00E0 al posto del testo nascosto. edit_text_act_list=Mostra una lista di opzioni: edit_text_act_list_tooltip=Mostra una lista di opzioni tra le quali l'utente \u00E8 chiamato a scegliere. edit_text_act_check_title=Opzioni di correzione edit_text_act_popup_no=Niente pop up edit_text_act_popup_always=Pop up automatico edit_text_act_popup_onError=Pop up in caso di errori edit_text_act_popup_onDemand=Pop up con F1 edit_text_act_popup_type=Tipo: edit_text_act_popup_delay=Ritardo del pop up: edit_text_act_popup_maxTime=Tempo max: edit_text_act_popup_onlyPlay=Solo suono edit_text_act_err_noSelection=Per creare un nuovo testo nascosto devi selezionare un frammento di testo! edit_text_act_err_badCharInSelection=Il testo nascosto non pu\u00F2 includere caratteri accapo o tab. edit_text_act_err_nestedTargets=Non possono essere registrati testi nascosti! edit_text_act_err_cellInTarget=I testi nascosti non possono contenere celle! edit_text_act_pageBgColor=Colore del foglio: edit_text_act_editStylesBtn=Modifica gli stili del documento... edit_text_act_mainStyle=Stile principale: edit_text_act_tabSpc=Tabulazione: edit_text_act_tabSize=Spazi tra i tabulatori: edit_text_act_colors=Colori: edit_text_act_targetStyle=Colori del testo nascosto: edit_text_act_errorStyle=Colori degli errori: edit_text_act_preview=Anteprima: edit_text_act_styleSample_default_start=Testo standard edit_text_act_styleSample_target=testo nascosto edit_text_act_styleSample_error=errore edit_text_act_styleSample_default_fill=testo standard edit_text_act_styleSample_default_end=testo standard. edit_text_act_warnDeleteTarget=Attenzione: questa azione toglier\u00E0 il testo nascosto attualmente selezionato. Vuoi procedere? edit_text_act_prevScreen_title=Schermo precedente... edit_text_act_prevScreen_no=Non mostrare alcun testo prima dell'inizio dell'attivit\u00E0 edit_text_act_prevScreen_original=Mostra il testo completo dell'esercizio edit_text_act_prevScreen_special=Mostra questo testo: edit_text_act_prevScreen_time=Tempo max: edit_text_act_edit_target=Testo nascosto... edit_text_act_checkButton_show=Mostra il pulsante di correzione edit_text_act_checkButtonText=Pulsante di testo: edit_text_act_checkCase=Considera maiuscole/minuscole edit_text_act_checkAccents=Considera accenti e caratteri speciali edit_text_act_checkPunct=Considera la punteggiatura edit_text_act_checkDoubleSpc=Permetti spazi ripetuti edit_text_act_checkOptions=Criteri edit_text_act_checkAutoJump=Passa alla nuova parola nascosta una volta completato il riempimento edit_text_act_checkForceOk=Passa alla nuova parola solo dopo risposta corretta edit_text_act_checkDetail=Indica gli errori lettera per lettera edit_text_act_checkDetail_params=Parametri dell'algoritmo d'analisi: edit_text_act_checkDetail_steps=Passi: edit_text_act_checkDetail_field=Campo d'esplorazione: edit_text_act_defaultCheckButtonText=Controllo edit_text_act_advancedCorrectionOptions=Analisi della risposta edit_text_act_check_bt=Correzione... edit_text_act_checkButton=Pulsante di correzione edit_text_act_checkProgress=Avanzamento edit_text_act_typeBtn=Tipo... edit_text_act_orderParagraphs=Ordina i paragrafi edit_text_act_orderWords=Ordina le parole edit_text_act_order_amongstPar=Sparpaglia le parole nel paragrafo edit_text_act_type_title=Tipo di attivit\u00E0 edit_text_act_warnChangeType=Questa azione canceller\u00E0 tutte le parole nascoste esistenti. Vuoi procedere? edit_text_act_identWords=Identifica le parole edit_text_act_identChars=Identifica i caratteri edit_media_change_name=Cambia il nome... edit_media_change_file=Cambia il file... edit_media_includeInZip=Salva in un file ZIP edit_media_type=Tipo di file multimediale: edit_media_size=Grandezza del file: edit_media_show_type=Archivi di tipo: edit_media_preview=Anteprima del file multimediale edit_media_preview_tooltip=Anteprima della risorsa multimediale edit_media_rename=Cambia il nome di risorsa edit_media_rename_title=Rinomina edit_media_rename_prompt=Nuovo nome: edit_media_rename_invalid=Nome di risorsa non valido! edit_media_rename_exists=C'\u00E8 un'altra risorsa con questo nome! Ogni risorsa deve avere un nome unico. edit_media_chfile_invalid=File non valido! err_media_chfile_different=Il file deve essere dello stesso tipo edit_media_font_error=Impossibile caricare il font! edit_media_save_file=Salva il file (estrai da ZIP) edit_media_refresh_file=Aggiorna da file il contenuto multimediale edit_media_warn_zipFileNotExternal=Questo non \u00E8 un file "reale", ma un oggetto collocato in un contenitore ZIP. Per usare questa funzione, un file con lo stesso nome deve essere presente nella cartella dove si trova il file ZIP. edit_activities=Attivit\u00E0 edit_sequences=Sequenze edit_media=Libreria multimediale edit_media_tooltip=Gestisci immagini e altri file multimediali usati nel progetto edit_activities_tooltip=Crea e modifica le attivit\u00E0 del progetto edit_sequences_tooltip=Modifica e crea sequenze di attivit\u00E0 edit_project_title=Titolo: edit_project_title_tooltip=Titolo di progetto edit_project=Progetto edit_project_tooltip=Modifica le propriet\u00E0 del progetto edit_project_description=Descrizione: edit_project_description_tooltip=Descrizione generale del progetto edit_project_area=Aree: edit_project_area_tooltip=Aree curricolari del progetto edit_project_level=Livelli: edit_project_level_tooltip=Livelli educativi del progetto edit_project_descriptors=Descrittori: edit_project_descriptors_tooltip=Descrittori del progetto (separati da virgola) edit_project_languages=Lingue: edit_project_languages_tooltip=Lingue usate nel progetto edit_project_languages_modify=Cambia la lingua selezionata edit_project_languages_add=Aggiungi una lingua edit_project_languages_select=Codici di lingua ISO-639: edit_project_authors=Autori: edit_project_authors_tooltip=Persone coinvolte nel progetto edit_project_author_name=Nome: edit_project_author_mail=e-mail: edit_project_author_rol=Ruolo: edit_project_author_organization=Organizzazione: edit_project_author_comments=Commenti: edit_project_author_url=URL: edit_project_author_name_tooltip=Nome dell'autore (richiesto) edit_project_author_mail_tooltip=E-mail dell'autore (opzionale) edit_project_author_rol_tooltip=Ruolo della persona nel progetto: autore, collaboratore, disegni, suoni... (opzionale) edit_project_author_organization_tooltip=Scuola, universit\u00E0, associazione... (opzionale) edit_project_author_url_tooltip=Pagina web personale (opzionale) edit_project_author_comments_tooltip=Campo per altre informazioni (opzionale) edit_project_author_info=Informazioni sull'autore: edit_project_author_add=Aggiungi un autore alla lista edit_project_author_edit=Modifica le informazioni sull'autore edit_project_org_name=Nome: edit_project_org_name_tooltip=Nome della scuola edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=Indirizzo e-mail della scuola edit_project_org_url=URL: edit_project_org_url_tooltip=Sito web della scuola edit_project_org_address=Indirizzo: edit_project_org_address_tooltip=Indirizzo snail-mail edit_project_org_pc=c.p.: edit_project_org_pc_tooltip=Codice postale edit_project_org_city=Citt\u00E0: edit_project_org_city_tooltip=Citt\u00E0 della scuola edit_project_org_country=Nazione: edit_project_org_state=Stato: edit_project_org_comments=Commenti: edit_project_org=Scuola/e: edit_project_org_tooltip=Scuola o altra istituzione coinvolta nel progetto edit_project_org_info=Info sull'organizzazione: edit_project_org_add=Aggiungi organizzazione edit_project_org_edit=Modifica i dati dell'organizzazione edit_project_org_country_tooltip=Stato, federazione, unione... edit_project_org_state_tooltip=Stato federale, comunit\u00E0, regione... edit_project_org_comments_tooltip=Altre informazioni... edit_project_rev_date=Data: edit_project_rev_date_tooltip=Data della revisione edit_project_rev_authors=Autori: edit_project_rev_authors_tooltip=Autori della revisione edit_project_rev_description=Descrizione: edit_project_rev_description_tooltip=Breve descrizione dei cambiamenti apportati edit_project_rev_comments=Commenti: edit_project_rev_comments_tooltip=Altre informazioni rilevanti edit_project_rev=Revisioni: edit_project_rev_tooltip=Storia della principali modifiche al progetto edit_project_rev_add=Aggiungi una registrazione di revisione edit_project_rev_edit=Modifica una registrazione di revisione edit_project_rev_info=Data di revisione edit_media_objects=oggetti edit_media_object=oggetto edit_evsounds_start=Inizio dell'attivit\u00E0: edit_evsounds_click=Clicca sull'oggetto edit_evsounds_actionError=Azione erronea: edit_evsounds_actionOk=Azione corretta: edit_evsounds_finishedError=Attivit\u00E0 completata con errori: edit_evsounds_finishedOk=Attivit\u00E0 completata in modo esatto: edit_project_rev_err_nodesc=Errore: Il campo di descrizione non pu\u00F2 essere lasciato vuoto! edit_evsounds_dlg_title=Modifica i suoni dell'evento edit_project_evsounds=Suoni dell'evento: edit_project_evsounds_tooltip=Imposta suoni specifici per ciascun evento JClic edit_act_evsounds=Suoni dell'evento: edit_act_evsounds_tooltip=Imposta suoni specifici per ciascun evento JClic edit_evsounds_default=suono predefinito edit_evsounds_disabled=disabilitato edit_evsounds_chk_tooltip=Abilita o disabilita i suoni per questo evento edit_evsounds_select_tooltip=Clicca per selezionare un suono per questo evento, o deseleziona per usare il suono predefinito action_newProject_caption=Nuovo progetto... action_newProject_keys=NN action_newProject_tooltip=Crea un nuovo progetto JClic edit_arith_op_from=Da: edit_arith_op_from_tooltip=Valore minimo dell'operatore edit_arith_op_to=A: edit_arith_op_to_tooltip=Valore massimo dell'operatore edit_arith_op_with=Con: edit_arith_op_with_tooltip=Se selezionato, l'operatore pu\u00F2 anche avere questo valore edit_arith_op_fromList=Uno da questa lista: edit_arith_op_fromList_tooltip=Lista dei possibili valori per l'operatore edit_arith_op_decimals=Decimali: edit_arith_op_decimals_tooltip=Numero di decimali dell'operando edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=Primo operando edit_arith_secondOp=Secondo operando edit_arith_title=Arith2 per JClic edit_arith_operations=Operazioni: edit_arith_operations_tooltip=Seleziona il tipo di operazioni da sviluppare edit_arith_operations_plus=Addizione edit_arith_operations_minus=Sottrazione edit_arith_operations_multiply=Moltiplicazione edit_arith_operations_divide=Divisione edit_arith_unknown=Incognita: edit_arith_unknown_tooltip=Seleziona l'elemento che agir\u00E0 da incognita edit_arith_unknown_aobx=Il risultato \u00E8 l'incognita edit_arith_unknown_aoxr=Il secondo operatore \u00E8 l'incognita edit_arith_unknown_xobr=Il primo operatore \u00E8 l'incognita edit_arith_unknown_axbr=L'operazione \u00E8 l'incognita edit_arith_unknown_invert=Scrivi il risultato all'inizio dell'espressione edit_arith_result=Risultato: edit_arith_result_notCarry=Non riportare edit_arith_result_random=Casuale edit_arith_result_asc=Crescente edit_arith_result_order=Ordina per risultato: edit_arith_result_desc=Decrescente edit_arith_result_avoidDup=Evita duplicati edit_arith_cond=Condizioni: edit_arith_cond_ind=Indifferente edit_arith_cond_agb=Il primo operatore deve essere pi\u00F9 grande del secondo edit_arith_cond_alb=Il primo operatore deve essere minore del secondo edit_arith_cond_tooltip=Altre condizioni edit_autocp=Generatore automatico di contenuti: edit_autocp_tooltip=Seleziona il tipo di generatore automatico di contenuti per questa attivit\u00E0. edit_autocp_block=Generatore di contenuti edit_autocp_btn=Parametri... edit_autocp_btn_tooltip=Configura i parametri del generatore di contenuti edit_data=Modifica i dati edit_act=Modifica l'attivit\u00E0 edit_acp=Modifica il generatore di contenuti edit_acp_err_creating=Errore di creazione del generatore automatico di contenuti! edit_project_author_group=Creazione edit_project_description_block=Descrizione edit_project_ui_block=Interfaccia utente edit_act_description=Descrizione: m_Edit=Modifica m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=Nuova attivit\u00E0... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Inserisci m_Insert_Mnemonic=I m_View=Visualizza m_View_Mnemonic=V action_editProject_caption=Progetto action_editProject_keys=PP action_editProject_tooltip=Modifica i parametri del progetto action_editMedia_caption=Mediateca action_editMedia_keys=MM action_editMedia_tooltip=Modifica la biblioteca multimediale del progetto action_editActivities_caption=Attivit\u00E0 action_editActivities_keys=AA action_editActivities_tooltip=Modifica le attivit\u00E0 action_editSeq_caption=Sequenze action_editSeq_keys=SS action_editSeq_tooltip=Modifica le sequenze delle attivit\u00E0 warn_project_modified=Il progetto corrente \u00E8 stato modificato. Vuoi salvare i cambiamenti? edit_project_descriptors_block=Descrittori edit_media_new=Nuovo oggetto multimediale... edit_media_new_tooltip=Aggiungi una nuova immagine o un nuovo oggetto multimediale alla biblioteca edit_media_new_keys=M* edit_seq_threshold=Limite di punteggio: edit_seq_threshold_tooltip_up=Segui questo percorso quando il punteggio globale \u00E8 uguale o superiore a... edit_seq_time=Limite di tempo: edit_seq_time_tooltip_up=Per seguire questo percorso, devi aver completato l'attivit\u00E0 in un tempo inferiore a... edit_seq_threshold_tooltip_down=Segui questo percorso quando il punteggio globale \u00E8 inferiore a... edit_seq_time_tooltip_down=Segui questo percorso quando il tempo impiegato nell'attivit\u00E0 \u00E8 superiore a... edit_seq_condJump=Salti condizionali edit_seq_condJump_tooltip=Imposta salti speciali da eseguire solo con specifiche condizioni edit_seq_condJump_upper_tooltip=Imposta condizioni per il salto a un livello superiore edit_seq_condJump_lower=Salto a livello inferiore: edit_seq_condJump_upper=Salto a livello superiore: edit_seq_condJump_lower_tooltip=Imposta le condizioni per saltare a un livello inferiore edit_seq_action_tooltip_fw=Azione assegnata al pulsante "successivo" edit_seq_action_tooltip_bk=Azione assegnata al pulsante "precedente" edit_seq_jump_tooltip=Imposta la destinazione del salto edit_seq_action_tooltip=Azione da fare edit_seq_activity_tooltip=Attivit\u00E0 assegnata a questo elemento di sequenza edit_seq_tag_tooltip=Tag usato per riferirsi a questo elemento di sequenza (campo opzionale) edit_seq_description_tooltip=Descrizione dell'elemento di sequenza (campo opzionale) edit_seq_button_enabled_tooltip=Abilita o disabilita il pulsante freccia edit_seq_auto_tooltip=Avanza automaticamente al termine dell'attivit\u00E0 edit_seq_delay_tooltip=Secondi di attesa prima dell'avanzamento automatico edit_color_dlgTitle=Seleziona il colore edit_media_renaming=Per favore aspetta mentre la risorsa viene rinominata... edit_act_cell_width=Larghezza: edit_act_cell_width_tooltip=Larghezza della cella (in pixels) edit_act_cell_height=Altezza: edit_act_cell_height_tooltip=Altezza della cella (in pixels) edit_act_hiddenWords=Parole nascoste: edit_act_hiddenWords_tooltip=Lista delle parole nascoste inserite nel pannello edit_act_wordSearch_panelB=Usa il pannello B edit_act_wordSearch_panelB_tooltip=I contenuti del secondo pannello saranno mostrati una volta trovate le parole edit_act_shaper_tooltip=Seleziona il tipo di generatore di forme da usare nel pannello edit_act_num_cols_tooltip=Numero di colonne del pannello edit_act_num_rows_tooltip=Numero di righe del pannello edit_act_wildTransparent=Separatori trasparenti edit_act_wildTransparent_tooltip=Mostra i separatori (caselle nere) come spazi trasparenti edit_act_behavior_scramble_times=Mescola: edit_act_behavior_scramble_times_tooltip=Numero di mescolamenti edit_act_copy_title=Copia le caratteristiche in... edit_act_copy_attributes=Caratteristiche edit_act_copy_dest=Applica a: edit_act_copy_style_main=Finestra principale edit_act_copy_style_play=Finestra di gioco edit_act_copy_activities=Attivit\u00E0 da modificare: edit_act_copyAttributes=Copia le caratteristiche edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copia le caratteristiche dell'attivit\u00E0 corrente in altre attivit\u00E0 edit_new_project_name=Nome del progetto: edit_new_project_name_tooltip=Breve nome descrittivo del progetto edit_new_project_filename=Nome file: edit_new_project_filename_tooltip=Nome del file del progetto, senza estensione edit_new_project_folder=Cartella: edit_new_project_folder_tooltip=Nome della cartella dove il progetto sar\u00E0 conservato edit_new_project_folder_browse=Sfoglia... edit_new_project_title=Crea un nuovo progetto JClic edit_new_project_err_empty=Errore: Progetto, file e cartella devono avere nomi validi. edit_new_project_warning_noEmptyFolder=Questa cartella gi\u00E0 contiene un altro progetto Clic 3.0 o JClic. Per evitare confusione, \u00E8 preferibile tenere ogni progetto in una cartella separata, ma non \u00E8 strettamente necessario. Vuoi realmente creare il nuovo progetto in questa cartella? edit_new_project_err_folderCreation=Errore: Impossibile creare la cartella specificata! edit_act_copy_err_noSelection=Errore: Nessuna attivit\u00E0 selezionata! Per usare questa funzione devi selezionare nella lista una o pi\u00F9 attivit\u00E0 alle quali vanno applicate le caratteristiche indicate. edit_act_copy_action_prefix=Copia delle caratteristiche in: edit_act_copy_margin=Margine edit_act_copy_bgColor=Colore di sfondo edit_act_copy_gradient=Sfumatura edit_act_copy_bgImage=Immagine di sfondo edit_act_copy_border=Bordo edit_act_copy_transparentBg=Sfondo trasparente edit_act_copy_position=Posizione edit_act_copy_messages=Messaggi edit_act_copy_messages_ini=Stile del messaggio iniziale edit_act_copy_messages_end=Stile del messaggio finale edit_act_copy_messages_err=Stile del messaggio di errore edit_act_copy_reports=Rapporti edit_act_copy_rep_include=Includi l'attivit\u00E0 nei rapporti edit_act_copy_rep_actions=Registra azioni edit_act_copy_interface=Interfaccia utente edit_act_copy_skin=Skin edit_act_copy_evSounds=Suoni dell'evento edit_act_copy_counters=Contatori edit_act_copy_cTime=Cronometro edit_act_copy_maxTime=Tempo max. edit_act_copy_cTries=Contatore dei tentativi edit_act_copy_maxTries=Tentativi max. edit_act_copy_cScore=Punteggio edit_act_copy_scramble=Numero di mescolamenti edit_act_copy_buttons=Pulsanti edit_act_copy_btnHelp=Pulsante di aiuto edit_act_copy_btnInfo=Pulsante informativo edit_act_copy_grids=Griglie edit_act_copy_gridA=Stile della griglia A edit_act_copy_gridB=Stile della griglia B edit_act_copy_textGrid=Stile delle griglie di testo edit_act_copy_text=Attivit\u00E0 testuali edit_act_copy_fontFace=Tipo di carattere edit_act_copy_fontSize=Dimensione del carattere edit_act_copy_fontStyle=Stile del carattere edit_act_copy_textColour=Colore del testo principale edit_act_copy_textTargetColour=Colore del testo nascosto edit_act_copy_textErrorColour=Colore degli errori edit_act_copy_tabSpace=Spazio tra i tabulatori edit_act_copy_messages_prev=Stile del messaggio precedente edit_act_changeType=Cambia il tipo di attivit\u00E0 edit_act_newActivity_class_tooltip=Nome completo della classe da usare per costruire l'attivit\u00E0 (solo per utenti esperti!) edit_act_newActivity_other=Altro... edit_act_newActivity_info=Gli utenti esperti possono anche creare tipi non registrati di attivit\u00E0 JClic. Basta scrivere sotto il nome della classe, con il prefisso indicante il pacchetto (es. "com.acme.activities.FooActivity"). Le classi di attivit\u00E0 devono estendere edu.xtec.jclic.Activity, e devono essere accessibili al caricatore di classi virtuali di Java. edit_act_newActivity_name=Nome dell'attivit\u00E0: edit_act_newActivity_name_tooltip=Ciascuna attivit\u00E0 deve avere un nome unico nel progetto edit_act_changeType_warning=

Attenzione: Il cambiamento del tipo di attivit\u00E0 pu\u00F2 causare la perdita di alcune caratteristiche e di alcuni oggetti dell'attivit\u00E0 corrente. Usa questa funzione con attenzione!

 

applet_codebase=Ubicazione del codice JClic: applet_codebase_tooltip=URL che punta a una cartella con i file di programma e gli scripts di JClic applet_prev_text=Codice HTML precedente: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Il testo o il codice HTML che apparir\u00E0 prima dell'applet applet_post_text=Codice HTML successivo: applet_post_text_tooltip=Il testo o il codice HTML che apparir\u00E0 dopo l'applet applet_size=Dimensioni dell'applet: applet_size_tooltip=Larghezza e altezza dell'applet, in valori assoluti o percentuali. applet_page_title=Titolo della pagina: applet_page_title_tooltip=Testo da mostrare nella parte superiore della finestra di navigazione applet_created_info=La pagina web "%s" \u00E8 stata creata con successo. applet_created_prompt=Vuoi aprirla adesso con il navigatore? action_createHTML_caption=Crea la pagina web... applet_create_title=Creazione di una pagina HTML con l'applet JClic action_createHTML_tooltip=Crea una pagina HTML con l'applet contenente il progetto corrente applet_filename=Nome file: applet_filename_tooltip=Nome del file HTML fa creare action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Valori predefiniti usati nella creazione della pagina web applet_bgcolor=Colore di sfondo: applet_bgcolor_tooltip=Colore di sfondo della pagina HTML applet_centered=Centrato applet_centered_tooltip=Inserisci l'applet centrandolo orizzontalmente applet_width_tooltip=Larghezza dell'applet (assoluta o in percentuale) applet_height_tooltip=Altezza dell'applet (assoluta o in percentuale) applet_exitUrl=In uscita, vai a: applet_exitUrl_tooltip=URL dove ridirigere la navigazione all'uscita da JClic applet_infoFrame=Nome della schermata informativa: applet_infoFrame_tooltip=Nome della schermata usata per mostrare i contenuti relativi al pulsante "informazioni" action_createInstaller_caption=Crea l'installatore del progetto... action_createInstaller_keys=I* action_createInstaller_tooltip=Crea uno script di installazione di progetto per il lettore JClic installer_caption=Modifica lo script di installazione di progetto installer_title=Titolo: installer_title_tooltip=Titolo del progetto, da mostrare nell'assistente dell'installazione installer_authors=Autori: installer_authors_tooltip=Autore/i del progetto (testo breve) installer_folder=Cartella: installer_folder_tooltip=Nome della cartella che sar\u00E0 suggerita dall'assistente di installazione installer_files=I file da copiare: installer_files_tooltip=I file da copiare nell'installazione installer_files_available=File disponibili installer_files_selected=File selezionati installer_files_add=>> aggiungi >> installer_files_add_tooltip=Aggiungi il file selezionato alla lista installer_files_remove=<< rimuovi << installer_files_remove_tooltip=Rimuovi il file selezionato dalla lista installer_button=Pulsante di attivazione installer_button_tooltip=Propriet\u00E0 del pulsante da mostrare nella biblioteca dei progetti installer_button_project=Progetto principale: installer_button_project_tooltip=Progetto JClic associato al pulsante installer_button_text=Etichetta: installer_button_text_tooltip=Breve etichetta di testo, da mostrare all'interno del pulsante installer_button_icon=Icona: installer_button_icon_tooltip=Immagine da usare come icona del pulsante. Lascia vuoto per usare l'icona predefinita di JClic. installer_button_description=Descrizione installer_button_description_tooltip=Testo di aiuto mostrato con il pulsante installer_error_noTitle=Errore: Devi indicare il titolo del progetto installer_error_noBaseFolder=Errore: Devi indicare in quale cartella vuoi installare il progetto installer_error_noFilesSelected=Errore: Devi selezionare un file installer_error_noButtonText=Errore: Devi indicare il testo del pulsante di attivazione installer_error_projectNotInFiles=Errore: Il progetto assegnato al pulsante di attivazione non \u00E8 nella lista dei file da copiare applet_page_full=Applet a tutto schermo applet_page_mixed=Applet con dimensioni specifiche edit_text_align_left=Allinea il testo a sinistra edit_text_align_center=Centra il testo edit_text_align_right=Allinea il testo a destra edit_text_act_target_toggle=Crea o rimuovi un testo nascosto edit_text_act_insertCell=Inserisci una cella edit_text_act_content=Contenuto edit_text_act_style=Stile edit_cell_size=Dimensione della cella: edit_project_orphanActivities=Le seguenti attivit\u00E0 non appariranno in alcuna delle sequenze di attivit\u00E0, quindi non saranno mostrate: edit_project_orphanMedia=I seguenti oggetti multimediali non risultano usati in alcuna attivit\u00E0: edit_project_orphanActivities_prompt=Vuoi aggiungerli alla fine dell'ultima sequenza di attivit\u00E0? edit_project_orphanMedia_prompt=Vuoi rimuoverli? edit_project_orphanMedia_title=Rimozione di oggetti multimediali non usati edit_project_orphanActivities_title=Attivit\u00E0 orfane edit_media_refreshAll=Aggiorna tutti i contenuti multimediali edit_media_refreshAll_tooltip=Aggiorna tutti i contenuti multimediali richiamando i loro archivi edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Aggiornamento dei contenuti multimediali... edit_media_exportAll=Esportazione di tutti i contenuti multimediali edit_media_exportAll_tooltip=Salva i file dei contenuti di tutti gli elementi multimediali edit_media_exportAll_keys=X* edit_shape_select=Seleziona edit_shape_addPoint=Aggiungi un punto edit_shape_deletePoint=Elimina edit_shape_drawRect=Disegna un rettangolo edit_shape_drawEllipse=Disegna un'ellisse edit_shape_drawPoly=Disegna un poligono edit_shape_toLine=Converti in linea edit_shape_toBezier=Converti in curva di B\u00E9zier edit_shape_toQuad=Converti in quadratica edit_shape_rLeft=Ruota a sinistra edit_shape_rRight=Ruota a destra edit_shape_expand=Espandi edit_shape_contract=Contrai edit_shape_zoomIn=Zoom avanti edit_shape_zoomOut=Zoom indietro edit_shape_aproxPoints=Unisci punti vicini edit_shape_showPoints=Mostra punti edit_shape_showPoints_tooltip=Mostra/Nascondi i punti edit_shape_gridSize=Dimensione della griglia: edit_shape_hideGrid=Mostra / Nascondi la griglia edit_shape_magnetRadius=Raggio del magnete: edit_shape_elements=Elementi definiti edit_shape_elemName=Nome dell'elemento selezionato edit_shape_magnetRadius_tooltip=Raggio di azione del magnete (se abilitato) edit_shape_gridSize_tooltip=Dimenzioni della griglia edit_mc_activity=Attivit\u00E0: edit_mc_sequence=Sequenza: edit_mc_url=URL: edit_mc_project=Progetto: edit_mc_activity_selection=Scegli l'attivit\u00E0 edit_mc_sequence_selection=Scegli la sequenza edit_mc_err_nullContent=Dati insufficienti! edit_act_arrowColor=Colore delle frecce: edit_act_arrowColor_tooltip=Colore usato dall'editor per disegnare le frecce (non esattamente, dato che viene utilizzata una maschera di bit XOR) edit_act_editActivity=Modifica... edit_act_editActivity_tooltip=Modifica l'attivit\u00E0 selezionata action_saveFileAs_caption=Salva come... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Salva il progetto corrente con un nome differente edit_act_behavior_block=Comportamento edit_act_behavior=Comportamento edit_act_behavior_drag=Trascina gli oggetti edit_act_behavior_drag_tooltip=Trascina gli oggetti invece di unirli con una linea edit_act_behavior_order=Controlla l'ordine di soluzione edit_act_behavior_order_tooltip=Le celle devono essere risolte in ordine edit_act_scramble=Mescola action_importActivities_caption=Importa attivit\u00E0... action_importActivities_keys=I* action_importActivities_tooltip=Importa attivit\u00E0 da un altro progetto import_warn_samefile=Il file selezionato fa parte del progetto corrente. Possono essere importate attivit\u00E0 solo tra progetti differenti. Per favore seleziona un altro file di progetto. import_selectActivities=Seleziona una o pi\u00F9 attivit\u00E0 da importare nel progetto corrente: import_importing=Importazione... import_checkdep=Verifica delle dipendenze... import_impmedia=Importazione degli oggetti multimediali: import_impact=Importazione delle attivit\u00E0: import_selectProject=Seleziona il progetto JClic dal quale saranno importate le attivit\u00E0 edit_tagRep_tags=Marcatori edit_tagRep_tagStart=Marcatore d'inizio: edit_tagRep_tagStart_tooltip=Marcatore usato all'inizio dei tag edit_tagRep_tagEnd=Marcatore finale: edit_tagRep_tagEnd_tooltip=Marcatore usato alla fine dei tag edit_tagRep_file=File edit_tagRep_fileName=File o URL: edit_tagRep_fileName_tooltip=Nome o URL del file contenente i valori che sostituiranno le etichette edit_tagRep_charset=Set di caratteri: edit_tagRep_charset_tooltip=Set di caratteri usati nel file edit_tagRep_browseFile=Sfoglia... edit_tagRep_browseFile_tooltip=Sfoglia il sistema degli archivi edit_tagRep_title=Sostituzione dei tag edit_text_act_clearStylesBtn=Rimuovi gli stili di testo... edit_text_act_clearStylesPrompt=Attenzione: Questa azione rimuover\u00E0 gli specifici attributi di testo applicati al documento, ritornando allo stile principale. Questa azione non pu\u00F2 essere annullata. Vuoi procedere? img_max_size=Dimensione massima delle immagini: img_max_width_tooltip=Larghezza massima delle immagini importate nella libreria multimediale. img_max_height_tooltip=Altezza massima delle immagini importate nella libreria multimediale. img_resize_prompt=L'immagine "%s" ha una dimensione di %s pixel. Supera perci\u00F2 il massimo consentito da JClic Author (%s). Vuoi ridimensionarla? src/author/edu/xtec/resources/messages/AuthorMessages_nl.properties000066400000000000000000001212431335566474600262770ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Beschrijving edit_act_name_tooltip=Naam van de activiteit edit_act_name=Naam: edit_act_description_tooltip=Beschrijving van de activiteit edit_act_reports_block=Rapporten edit_act_includeInReports=Voeg deze activiteit toe aan de rapporten edit_act_includeInReports_tooltip=Voeg de resultaten van deze activiteit toe aan de gebruikersrapporten edit_act_code=Code: edit_act_code_tooltip=Optionele code om te groeperen en te zoeken in de rapporten database edit_act_reportActions=Rapporteer acties van gebruikers edit_act_reportActions_tooltip=Registreer de details van alle acties van de gebruikers edit_act_counters_block=Tellers edit_act_timeCounter=Tijdsteller edit_act_timeCounter_tooltip=Toon/verberg de tijdsteller edit_act_actionsCounter=Aantal pogingen teller edit_act_actionsCounter_tooltip=Toon/verberg de aantal pogingen teller edit_act_scoreCounter=Puntenteller edit_act_scoreCounter_tooltip=Toon/verberg de puntenteller edit_act_maxTime=Max tijd: edit_act_maxTime_tooltip=Max tijd om de activiteit op te lossen, in seconden, of 0 zonder tijdsbeperking. edit_act_countdown=Aftellen edit_act_countdown_tooltip=De teller start met de maximumwaarde, en vermindert tot 0 edit_act_maxActions=Max pogingen: edit_act_maxActions_tooltip=Maximum aantal pogingen, of 0 voor onbeperkt edit_act_buttons_block=Knoppen edit_act_helpBtn=Help edit_act_helpBtn_tooltip=Toon/verberg help knop edit_act_helpBtn_solution=Toon oplossing edit_act_helpBtn_msg=Toon dit bericht: edit_act_infoBtn=Informatie edit_act_infoBtn_tooltip=Toon/verberg informatie knop edit_act_infoBtn_url=Toon deze URL: edit_act_infoBtn_cmd=Voer dit commando uit: edit_act_infoBtn_url_tooltip=Adres van de website die getoond moet worden als de info knop gedrukt wordt edit_act_infoBtn_cmd_tooltip=Commando dat uitgevoerd wordt als de info knop gedrukt wordt edit_act_mainWindow=Hoofd venster: edit_act_gameWindow=Spel venster: edit_act_margin=Marge: edit_act_margin_tooltip=Horizontale en verticale afstand tussen visuele objecten edit_act_bgColor=Achtergrondkleur: edit_act_bgColor_tooltip=Verander de achtergrondkleur. edit_gradient_startColor=Begin kleur: edit_gradient_endColor=Eind kleur: edit_gradient_startColor_tooltip=Selectie van de start kleur edit_gradient_endColor_tooltip=Selectie van de eind kleur edit_gradient_cycles=Cycles: edit_gradient_cycles_tooltip=Aantal herhalingen van de gradi\u00EBnt over het tekenoppervlak edit_gradient_orientation=Ori\u00EBntatie: edit_gradient_orientation_tooltip=Ori\u00EBntatie van de gradi\u00EBnt , gemeten in graden over de horizon edit_act_gradient=Gradi\u00EBnt: edit_act_gradient_tooltip=Gebruik gradi\u00EBnt van kleuren edit_color_opacity=Doorzichtigheid edit_color_opacity_tooltip=Zet de alpha channel (doorzichtigheid) kleur waarde. edit_gradient_title=Gradi\u00EBnt edit_gradient_default=Gebruik de standaardwaarden (geen gadient) edit_act_image=Afbeelding: edit_act_descriptionTab=Beschrijving edit_act_descriptionTab_tooltip=Naam en beschrijving edit_act_tiledBgImg=Getegeld edit_act_tiledBgImg_tooltip=Teken heel het oppervlak met een afbeelding, herhaal over de X en Y as indien nodig. edit_act_preview=Voorbeeld: edit_act_border=Rand edit_act_border_tooltip=Teken een lijn rond het venster edit_act_transparent=Transparant edit_act_transparent_tooltip=Venster heeft een transparante achtergrond edit_act_width=Breedte: edit_act_height=Hoogte: edit_act_width_tooltip=Breedte van een object, gemeten in pixels edit_act_height_tooltip=Hoogte van een object, gemeten in pixels edit_act_centered=Gecentreerd edit_act_centered_tooltip=Het object zal gecentreerd worden over het hoofdvenster edit_act_x=X: edit_act_x_tooltip=Absolute horizontale positie edit_act_y=Y: edit_act_y_tooltip=Absolute verticale positie edit_act_ui_block=Gebruikers interface edit_act_image_tooltip=Kies een afbeelding edit_act_text=Tekst: edit_act_text_tooltip=Tekst die binnen dit object getoond moet worden edit_font_face=Lettertype edit_font_size=Grootte: edit_font_bold=Vet edit_font_italic=Schuin edit_font_underline=Onderstreept edit_font_style=Stijl: edit_cell_title=Cel inhoud edit_act_messages=Berichten edit_act_msg_initial=Eerste bericht edit_act_msg_final=Laatste bericht edit_act_msg_prev=Vorig bericht edit_act_msg_error=Fout bericht: edit_act_msg_initial_tooltip=Bericht dat getoond wordt als de activiteit begint edit_act_msg_final_tooltip=Bericht dat getoond wordt als de activiteit eindigt edit_act_msg_error_tooltip=Bericht dat getoond wordt als de activiteit eindigt met fouten edit_act_msg_prev_tooltip=Bericht dat getoond wordt als de activiteit voor de start van een activiteit (alleen bij sommige activiteiten) edit_align=Uitlijning: edit_act_textColor=Tekstkleur: edit_act_textColor_tooltip=Kleur van de tekst edit_act_shadowColor=Schaduwkleur: edit_act_shadowColor_tooltip=Kleur van de schaduw van de tekst, indien toepasbaar edit_act_shadow=Schaduw edit_act_shadow_tooltip=Teken tekst met schaduw edit_act_borderColor=Randkleur: edit_act_borderColor_tooltip=Kleur van de rand van de cel edit_act_inactiveColor=Kleur indien inactief: edit_act_inactiveColor_tooltip=Kleur als cel uitgeschakeld is edit_act_altColor=Alternatieve kleur: edit_act_altColor_tooltip=Kleur van alternatieve inhoud in opgeloste cellen. edit_cell_marked=Gemarkeerd edit_cell_disabled=Uitgeschakeld edit_cell_alt=Alternatief edit_cell_textMargin=Interne marge: edit_cell_textMargin_tooltip=Hoeveelheid ruimte tussen rand van de cel en de tekst. edit_cell_borderWidth=Randbreedte: edit_cell_borderWidth_tooltip=Breedte van de standaard rand edit_cell_markerWidth=Breedte gemarkeerd: edit_cell_markerWidth_tooltip=Breedte van de rand als de cel gemarkeerd is of geselecteerd edit_cell_alt_tooltip=Voorbeeld in "alternatieve" toestand edit_cell_disabled_tooltip=Voorbeeld in "niet toegestaan" toestand edit_cell_marked_tooltip=Voorbeeld in "gemarkeerde" toestand edit_act_testAction=Voorbeeld activiteit edit_act_testAction_tooltip=Voorbeeld en test activiteit edit_act_panels_description=Beschrijving edit_act_panels_description_tooltip=Titel en beschrijving van de activiteit edit_act_panels_options=Opties edit_act_panels_options_tooltip=Opties van de activiteit edit_act_panels_frame=Venster edit_act_panels_frame_tooltip=Verhouding, grootte en positie van het activiteit venster edit_act_panels_messages=Berichten edit_act_panels_messages_tooltip=Inhoud van de activiteit berichten edit_act_panels_panel=Paneel edit_act_panels_panel_tooltip=Inhoud van het paneel edit_style_title=Stijl edit_style_tooltip=Kleur, lettertype en grootte van de cel edit_act_style=Stijl: edit_act_overlap=Vermijd tekst afbeelding overlapt edit_act_overlap_tooltip=Probeer te vermijden dat tekst afbeelding overlapt edit_media_exists_1=Het bestand edit_media_exists_2=Bestaat reeds in media bibliotheek! edit_act_shaper=Vormgereedschap edit_act_shaper_err=Fout vormgereedschap: edit_act_num_cols=Kolommen: edit_act_num_rows=Rijen: edit_act_toothHeightFactor=Tand hoogte: edit_act_toothWidthFactor=Tand breedte: edit_act_toothRandom=Willekeurige verdeling edit_act_shaper_properties=Vormgereedschap eigenschappen edit_act_panels_text=Tekst edit_act_panels_text_tooltip=Tekst van de activiteit action_saveFile_caption=Opslaan... action_saveFile_keys=OO action_saveFile_tooltip=Bewaar het huidige project action_docTree_caption=Document boom action_docTree_keys=B* action_docTree_tooltip=Toon het document van het project als een boom edit_docTree_title=Document boom edit_media_referencedBy=Gerefereerd door: msg_prompt_loadReferences=Waarschuwing:

Dit project verbindt met andere projecten.
Wil je de hyperlinks volgen en al de bijbehorende bestanden laden?

(Je klikt best op JA als je Clic 3.0 activititeiten importeert) edit_mc_type=Type: edit_mc_type_unknown=Onbekend edit_mc_type_sound=Geluid afspelen edit_mc_type_video=Video afspelen edit_mc_type_midi=MIDI afspelen edit_mc_type_cdaudio=CD audio afspelen edit_mc_type_record=Geluid opnemen edit_mc_type_play_recorded=Opgenomen geluid afspelen edit_mc_type_run_activity=Ga naar activiteit edit_mc_type_run_sequence=Ga naar volgorde edit_mc_type_run_external=Programma uitvoeren edit_mc_type_url=URL adres tonen edit_mc_type_exit=Einde edit_mc_type_return=Vorige edit_mc_level=Prioriteitsniveau: edit_mc_file=Bestand: edit_mc_externalParam=Parameter: edit_mc_from=Van: edit_mc_to=Tot: edit_mc_length=Max. lengte: edit_mc_recBuffer=Opname band: edit_mc_stretch=Uitrek grootte edit_mc_location=Locatie: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Van: edit_mc_location_from_box=Cel edit_mc_location_from_window=Venster edit_mc_location_from_frame=Kader edit_mc_loop=Doorlopen weergeven edit_mc_autostart=Automatische start edit_mc_catchmouse=Vang muis edit_mc_title=Multimedia en actieve inhoud edit_mc_label=Actieve inhoud edit_media_dlg_title=Multimedia object keuze edit_media_title=Media bibliotheek edit_mc_pos_cell=Gecentreerd over cel edit_mc_pos_window=Gecentreerd over venster edit_mc_pos_absolute=Geef positie: edit_tree_badFormat=Verkeerde boomstructuur of gegevens! edit_act_panels_controls=Besturingselementen edit_act_panels_controls_tooltip=Opties voor knoppen en tellers edit_act_class=Type: edit_act_gridLayout=Raster: edit_act_gridLayout_tooltip=Relatieve positie van de rasters A en B edit_act_inverseResolution=Omgekeerde resolutie edit_act_inverseResolution_tooltip=De activiteit is opgelost als alle elementen van "B" overeenkomen. edit_act_showAllArrows=Toon alle pijlen edit_act_alt=Alternatieve inhoud: edit_act_alt_tooltip=Inhoud die getoond wordt in opgeloste cellen en niet toegewezen cellen edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Bewerk de alternatieve inhoud edit_act_grid=Raster edit_act_grid_A=Raster A edit_act_grid_B=Raster B edit_act_grid_layout=Lay-out edit_act_grid_relationship=Relatie edit_seq_activity_header=activiteit edit_seq_tag_header=trefwoord edit_seq_jump_header=springen naar edit_seq_activity=Activiteit: edit_seq_tag=Label: edit_seq_description=Beschrijving: edit_seq_auto=Ga automatisch verder edit_seq_delay=Vertraging: edit_seq_action_fwd=Ga vooruit edit_seq_action_back=Ga terug edit_seq_action_jump=Spring naar... edit_seq_action_stop=Stoppen edit_seq_action_return=Vorige edit_seq_action_exit=JClic verlaten edit_seq_arrow_fwd=Vooruit pijl: edit_seq_arrow_back=Pijl terug: edit_seq_action=Actie: edit_seq_button_enabled=Toon knop edit_seq_project=JClic Project: edit_act_absolute=Absolute positie edit_act_absolute_tooltip=Het object zal geplaatst worden op de gespecificeerde X en Y co\u00F6rdinaten edit_act_location=Locatie: edit_seq_newElement=Nieuwe volgorde element... edit_seq_newElement_tooltip=Voeg een nieuw element toe aan de activiteiten edit_seq_newElement_msg=Selecteer een activiteit voor de niewe volgorde element edit_seq_newElement_error_noAct=Kan geen nieuwe volgorde element maken zonder activiteit! edit_seq_newElement_error_emptyList=Dit project heeft geen activiteiten! Kan geen volgorde elementen maken in een leeg project. edit_seq_jump_msg=Sprong doel: edit_seq_jump_title=Sprong doel edit_act_newActivity_tooltip=Voeg een nieuwe activiteit toe aan het project edit_act_prompt_class=Type activiteit: edit_act_prompt_name=Naam: edit_act_newActivity_msg=Selecteer het type activiteit en geef het een naam: edit_act_newActivity_error_noAct=Je moet een activiteit type kiezen! edit_act_newActivity_error_noName=Je moet een naam geven voor de activiteit! edit_act_newActivity_error_creating=Kan de activiteit niet maken! edit_act_newActivity_class=Java class name: edit_text_act_format=Formaat edit_text_act_answer=Beantwoorden edit_text_act_popup=Pop up edit_text_act_answer_label=Beschikbare antwoorden: edit_list_newElement_tooltip=Voeg een nieuw lijst element toe edit_list_editElement_tooltip=Bewerk het geselecteerde lijst element edit_list_deleteElement_tooltip=Verwijder het geselecteerde lijst element edit_list_upBtn_tooltip=Omhoog edit_list_downBtn_tooltip=Omlaag edit_list_newValue=Nieuwe tekst: edit_list_addElement=Voeg nieuw lijst element toe edit_list_modifyValue=Verander geselecteerde tekst edit_text_act_target=Doel edit_text_act_maxLen=Max. lengte: edit_text_act_maxLen_tooltip=Maximum hoeveelheid letters in het antwoord. edit_text_act_fillingChar=Opvul letter edit_text_act_fillingChar_tooltip=Letter gebruikt als spatie edit_text_act_iniLen=Eerste lengte: edit_text_act_iniLen_tooltip=Aantal vul letters dat getoond wordt bij het begin van de activiteit. edit_text_act_iniText=Eerste tekst: edit_text_act_iniText_tooltip=Getoonde tekst in het begin van de activiteit. edit_text_act_list=Toon lijst met opties edit_text_act_list_tooltip=Toon lijst met opties waaruit de gebruiker een moet kiezen. edit_text_act_check_title=Correctie opties edit_text_act_popup_no=Geen pop up edit_text_act_popup_always=Pop up automatisch edit_text_act_popup_onError=Pop up met fouten edit_text_act_popup_onDemand=Pop up met F1 edit_text_act_popup_type=Type: edit_text_act_popup_delay=Pop up vertraging: edit_text_act_popup_maxTime=Max. tijd: edit_text_act_popup_onlyPlay=Alleen geluid edit_text_act_err_noSelection=Je moet een deel tekst kiezen om een nieuw tekst doel te maken! edit_text_act_err_badCharInSelection=Tekst doel kan geen paragraaf tekens of tab tekens bevatten. edit_text_act_err_nestedTargets=Doelen kunnen niet genest zijn! edit_text_act_err_cellInTarget=Doelen kunnen geen cellen bevatten! edit_text_act_pageBgColor=Papier kleur: edit_text_act_editStylesBtn=Bewerk dokument stijl... edit_text_act_mainStyle=Hoofd stijl edit_text_act_tabSpc=Tab ruimte: edit_text_act_tabSize=Ruimte tussen tab markeringen: edit_text_act_colors=Kleuren: edit_text_act_targetStyle=Doel kleuren: edit_text_act_errorStyle=Fout kleuren: edit_text_act_preview=Voorbeeld: edit_text_act_styleSample_default_start=Standaardtekst edit_text_act_styleSample_target=doel edit_text_act_styleSample_error=Fout edit_text_act_styleSample_default_fill=standaard tekst edit_text_act_styleSample_default_end=standaard tekst. edit_text_act_warnDeleteTarget=Waarschuwing: Deze bewerking zal alle geselecteerde doelen onderdrukken. Wil je verder gaan? edit_text_act_prevScreen_title=Vorig scherm... edit_text_act_prevScreen_no=Toon geen tekst voor de start van een activiteit edit_text_act_prevScreen_original=Toon de volledige tekst van de oefening edit_text_act_prevScreen_special=Toon deze tekst: edit_text_act_prevScreen_time=Max. tijd: edit_text_act_edit_target=Doel... edit_text_act_checkButton_show=Toon de verbeter knop edit_text_act_checkButtonText=Knop tekst edit_text_act_checkCase=Exact dezelfde tekens edit_text_act_checkAccents=Gebruik accenten en speciale letters edit_text_act_checkPunct=Gebruik leestekens edit_text_act_checkDoubleSpc=Laat meerdere spaties toe edit_text_act_checkOptions=Criteria edit_text_act_checkAutoJump=Ga naar het volgend doel als alles ingevuld is edit_text_act_checkForceOk=Ga alleen verder wanneer het juist is edit_text_act_checkDetail=Geef vergissingen aan met een letter edit_text_act_checkDetail_params=Analyse van algoritme parameters: edit_text_act_checkDetail_steps=Stappen: edit_text_act_checkDetail_field=Exploration veld: edit_text_act_defaultCheckButtonText=Controleren edit_text_act_advancedCorrectionOptions=Antwoord analyse edit_text_act_check_bt=Verbetering... edit_text_act_checkButton=Verbeter knop edit_text_act_checkProgress=Voortgang edit_text_act_typeBtn=Type... edit_text_act_orderParagraphs=Orden paragrafen edit_text_act_orderWords=Orden woorden edit_text_act_order_amongstPar=Haal woorden doorheen over paragrafen edit_text_act_type_title=Activiteit type edit_text_act_warnChangeType=Deze bewerking zal alle bestaande doelen leegmaken. Wil je verder gaan? edit_text_act_identWords=Identificeer woorden edit_text_act_identChars=Identificeer letters edit_media_change_name=Verander naam... edit_media_change_file=Verander bestand... edit_media_includeInZip=Bewaar in ZIP bestand edit_media_type=Mediumtype: edit_media_size=Bestandsgrootte: edit_media_show_type=Bestanden van het type: edit_media_preview=Voorbeeld media edit_media_preview_tooltip=Voorbeeld media bron edit_media_rename=Verander naam van bron edit_media_rename_title=Hernoemen edit_media_rename_prompt=Nieuwe naam: edit_media_rename_invalid=Ongeldige bron naam edit_media_rename_exists=Er is een andere bron met deze naam! Elke bron moet een unieke naam hebben. edit_media_chfile_invalid=Verkeerd bestand! err_media_chfile_different=Bestand moet hetzelfde type hebben edit_media_font_error=Onmogelijk om lettertype te laden! edit_media_save_file=Bewaar bestand (haal op uit ZIP) edit_media_refresh_file=Herlaad media inhoud van bestand edit_media_warn_zipFileNotExternal=Dit is geen "echt" bestand, maar een object geladen in een ZIP container. Om dit element te gebruiken, moet er een bestand met dezelfde naam aanwezig zijn in de map waar de ZIP file is. edit_activities=Activiteiten edit_sequences=Volgorden edit_media=Media bibliotheek edit_media_tooltip=Beheer afbeeldingen en andere media bestanden die in dit project gebruikt worden edit_activities_tooltip=Maak en bewerk project activiteiten edit_sequences_tooltip=Maak en bewerk volgorde van activiteiten edit_project_title=Titel: edit_project_title_tooltip=Titel van project edit_project=Project edit_project_tooltip=Bewerk project eigenschappen edit_project_description=Beschrijving: edit_project_description_tooltip=Algemene beschrijving van het project edit_project_area=Gebieden: edit_project_area_tooltip=Curricular gebieden van het project edit_project_level=Niveau's: edit_project_level_tooltip=Opleidingsniveau van het project edit_project_descriptors=Beschrijving: edit_project_descriptors_tooltip=Beschrijvingen van het programma (gescheiden door komma's) edit_project_languages=Talen: edit_project_languages_tooltip=In het project gebruikte talen edit_project_languages_modify=Verander de gekozen taal edit_project_languages_add=Voeg taal toe edit_project_languages_select=ISO-639 taal codes: edit_project_authors=Auteurs: edit_project_authors_tooltip=Mensen die aan dit project hebben meegewerkt edit_project_author_name=Naam: edit_project_author_mail=e-mail: edit_project_author_rol=Rol: edit_project_author_organization=Organisatie: edit_project_author_comments=Commentaar: edit_project_author_url=URL: edit_project_author_name_tooltip=Auteur (vereist) edit_project_author_mail_tooltip=Auteur e-mail (optioneel) edit_project_author_rol_tooltip=Rol van de persoon in the project: auteur, medewerker, tekeningen, geluiden... (optioneel) edit_project_author_organization_tooltip=School, universiteit, vereniging... (optioneel) edit_project_author_url_tooltip=Persoonlijke web pagina (optioneel) edit_project_author_comments_tooltip=Veld voor andere informatie (optioneel) edit_project_author_info=Auteur info: edit_project_author_add=Auteur toevoegen aan lijst edit_project_author_edit=Auteur info bewerken edit_project_org_name=Naam: edit_project_org_name_tooltip=School naam edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=e-mail addres van de school edit_project_org_url=URL: edit_project_org_url_tooltip=School website edit_project_org_address=Adres: edit_project_org_address_tooltip=Snail-mail address edit_project_org_pc=PC: edit_project_org_pc_tooltip=Post code edit_project_org_city=Stad: edit_project_org_city_tooltip=Stad edit_project_org_country=Land: edit_project_org_state=Provincie edit_project_org_comments=Commentaar: edit_project_org=Scho(o)l/en: edit_project_org_tooltip=School of andere instelling die bij het project betrokken zijn edit_project_org_info=Informatie over de organisatie edit_project_org_add=Voeg organisatie toe edit_project_org_edit=Bewerk organisatie gegevens edit_project_org_country_tooltip=Land, federatie, unie edit_project_org_state_tooltip=Federale staat, gemeenschap, regio edit_project_org_comments_tooltip=Andere informatie... edit_project_rev_date=Datum: edit_project_rev_date_tooltip=Datum van de versie edit_project_rev_authors=Auteurs: edit_project_rev_authors_tooltip=Auteurs van de versie edit_project_rev_description=Omschrijving: edit_project_rev_description_tooltip=Korte omschrijving van de gemaakte veranderingen edit_project_rev_comments=Commentaar: edit_project_rev_comments_tooltip=Andere relevante informatie edit_project_rev=Versies: edit_project_rev_tooltip=Geschiedenis van grote veranderingen aan het project edit_project_rev_add=Voeg een versie beschrijving toe edit_project_rev_edit=Bewerk versie beschrijving edit_project_rev_info=Versie gegevens edit_media_objects=objecten edit_media_object=object edit_evsounds_start=Begin van de activiteit edit_evsounds_click=Click op het object edit_evsounds_actionError=Verkeerde actie: edit_evsounds_actionOk=Juiste actie: edit_evsounds_finishedError=Activiteit be\u00EBindigd met fouten: edit_evsounds_finishedOk=Activiteit be\u00EBindigd zonder fouten: edit_project_rev_err_nodesc=Fout: Het beschrijvingsveld kan niet leeg zijn! edit_evsounds_dlg_title=Bewerk gebeurtenis geluiden edit_project_evsounds=Gebeurtenis geluiden: edit_project_evsounds_tooltip=Kies specifieke geluiden voor elke JClic gebeurtenis edit_act_evsounds=Gebeurtenis geluiden: edit_act_evsounds_tooltip=Kies specifieke geluiden voor elke JClic gebeurtenis edit_evsounds_default=Standaard geluid edit_evsounds_disabled=uitgeschakeld edit_evsounds_chk_tooltip=Inschakelen of uitschakelen van geluid voor deze gebeurtenis edit_evsounds_select_tooltip=Klik om een geluid te kiezen voor deze gebeurtenis, of schakel uit om het standaard geluid te gebruiken action_newProject_caption=Nieuw project... action_newProject_keys=NN action_newProject_tooltip=Maak een nieuw JClic project edit_arith_op_from=Van: edit_arith_op_from_tooltip=Minimum waarde van de term edit_arith_op_to=Tot: edit_arith_op_to_tooltip=Maximum waarde van de term edit_arith_op_with=Door: edit_arith_op_with_tooltip=Indien aangekruist, kan de term ook deze waarde hebben edit_arith_op_fromList=Kies een uit de lijst: edit_arith_op_fromList_tooltip=Lijst van mogelijke waarden van de term edit_arith_op_decimals=Cijfers na de komma: edit_arith_op_decimals_tooltip=Aantal cijfers na de komma van de term edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=Eerste term edit_arith_secondOp=Tweede term edit_arith_title=Arith2 for JClic edit_arith_operations=Operaties: edit_arith_operations_tooltip=Kies de soort operaties die mogelijk zijn edit_arith_operations_plus=Plus edit_arith_operations_minus=Min edit_arith_operations_multiply=Vermenigvuldigen edit_arith_operations_divide=Delen edit_arith_unknown=Onbekend: edit_arith_unknown_tooltip=Kies de term die moet gezocht worden edit_arith_unknown_aobx=Het resultaat is te zoeken edit_arith_unknown_aoxr=De tweede term is te zoeken edit_arith_unknown_xobr=De eerste term is te zoeken edit_arith_unknown_axbr=De bewerking is te zoeken edit_arith_unknown_invert=Schrijf het resultaat bij het begin van de vergelijking edit_arith_result=Resultaat: edit_arith_result_notCarry=Geen overdracht edit_arith_result_random=Willekeurig edit_arith_result_asc=Oplopend edit_arith_result_order=Orden volgens resultaat: edit_arith_result_desc=Aflopend edit_arith_result_avoidDup=Vermijd dubbels edit_arith_cond=Omstandigheden: edit_arith_cond_ind=Om het even edit_arith_cond_agb=De eerste term moet groter zijn dan de tweede edit_arith_cond_alb=De eerste term moet kleiner zijn dan de tweede edit_arith_cond_tooltip=Andere voorwaarden edit_autocp=Automatische inhoud genereren: edit_autocp_tooltip=Kies het type automatische inhoud genereren voor deze activiteit edit_autocp_block=Inhoud genereren edit_autocp_btn=Instellingen... edit_autocp_btn_tooltip=Geef de instellingen van de inhoud verstrekker edit_data=Bewerk gegevens edit_act=Bewerk activiteit edit_acp=Bewerk de inhoud verstrekker edit_acp_err_creating=Fout bij het aanmaken van de inhoud verstrekker edit_project_author_group=Aanmaak edit_project_description_block=Beschrijving edit_project_ui_block=Gebruikers interface edit_act_description=Omschrijving: m_Edit=Bewerk m_Edit_Mnemonic=B edit_media_preview_keys=V edit_act_newActivity=Nieuwe ativiteit... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Invoegen m_Insert_Mnemonic=I m_View=Weergeven m_View_Mnemonic=W action_editProject_caption=Project action_editProject_keys=PP action_editProject_tooltip=Bewerk project instellingen action_editMedia_caption=Media action_editMedia_keys=MM action_editMedia_tooltip=Bewerk de multimedia bibliotheek van het project action_editActivities_caption=Activiteiten action_editActivities_keys=AA action_editActivities_tooltip=Bewerk de activiteiten action_editSeq_caption=Volgorden action_editSeq_keys=SS action_editSeq_tooltip=Bewerk de volgorde van activiteiten warn_project_modified=Huidig project is veranderd. Wil je de veranderingen bewaren? edit_project_descriptors_block=Beschrijvingen edit_media_new=Nieuw media object edit_media_new_tooltip=Voeg een nieuwe afbelding of multimedia object toe aan de bibliotheek edit_media_new_keys=M* edit_seq_threshold=Punten drempel: edit_seq_threshold_tooltip_up=Kies deze weg als het totaal aantal punten gelijk is aan of groter dan... edit_seq_time=Tijdsdrempel: edit_seq_time_tooltip_up=Om deze weg te kiezen, moet de tijd aan deze activiteiten besteed minder zijn dan... edit_seq_threshold_tooltip_down=Neem deze weg als het totaal aantal punten minder is dan... edit_seq_time_tooltip_down=Neem deze weg als de tijd aan deze activiteiten besteed meer is dan... edit_seq_condJump=Voorwaardelijke sprongen edit_seq_condJump_tooltip=Kies speciale sprongen die uitgevoerd moeten worden bij speciale voorwaarden edit_seq_condJump_upper_tooltip=Kies voorwaarden om naar een hoger niveau te gaan edit_seq_condJump_lower=Lager niveau sprong: edit_seq_condJump_upper=Hoger niveau sprong: edit_seq_condJump_lower_tooltip=Kies voorwaarden om naar een lager niveau te springen edit_seq_action_tooltip_fw=Toegewezen actie aan de "Volgende" knop edit_seq_action_tooltip_bk=Toegewezen actie aan de "Voorgaande" knop edit_seq_jump_tooltip=Kies het doel van de sprong edit_seq_action_tooltip=Actie die moet gebeuren edit_seq_activity_tooltip=Toegekende activiteit bij dit volgorde element edit_seq_tag_tooltip=Handvat als referentie bij dit volgorde element(optioneel veld) edit_seq_description_tooltip=Beschrijving van het volgorde element (optioneel veld) edit_seq_button_enabled_tooltip=Toestaan of verhinderen van de pijlknop edit_seq_auto_tooltip=Ga automatisch verder als de activiteit gedaan is edit_seq_delay_tooltip=Aantal seconden wachten voordat het automatisch verder gaat edit_color_dlgTitle=Kleur kiezen edit_media_renaming=Gelieve te wachten terwijl de bron hernoemd wordt... edit_act_cell_width=Breedte: edit_act_cell_width_tooltip=Cel breedte (in pixels) edit_act_cell_height=Hoogte: edit_act_cell_height_tooltip=Cel hoogte (in pixels) edit_act_hiddenWords=Verborgen woorden edit_act_hiddenWords_tooltip=Lijst met verborgen woorden in het paneel edit_act_wordSearch_panelB=Gebruik paneel B edit_act_wordSearch_panelB_tooltip=De inhoud van het tweede paneel zal getoond worden als de woorden gevonden zijn edit_act_shaper_tooltip=Kies het vormgereedschap type dat gebruikt moet worden in het paneel edit_act_num_cols_tooltip=Aantal kolommen van het paneel edit_act_num_rows_tooltip=Aantal rijen van het paneel edit_act_wildTransparent=Doorzichtige randen edit_act_wildTransparent_tooltip=Behandel de randen (zwarte rechthoeken) als doorzichtige gaten edit_act_behavior_scramble_times=Door elkaar: edit_act_behavior_scramble_times_tooltip=Aantal keren schudden edit_act_copy_title=Attributen kopi\u00EBren naar... edit_act_copy_attributes=Attributen edit_act_copy_dest=Gebruik bij: edit_act_copy_style_main=Hoofd venster edit_act_copy_style_play=Speel venster edit_act_copy_activities=Te wijzigen activiteiten: edit_act_copyAttributes=Attributen kopi\u00EBren edit_act_copyAttributes_keys=N edit_act_copyAttributes_tooltip=Huidige activiteit attributen kopi\u00EBren naar andere activiteiten edit_new_project_name=Project naam: edit_new_project_name_tooltip=Korte, beschrijvende naam van het project edit_new_project_filename=Bestandsnaam: edit_new_project_filename_tooltip=Naam van het projectbestand, zonder extensie edit_new_project_folder=Map: edit_new_project_folder_tooltip=Naam van de folder waar het project opgeslagen wordt edit_new_project_folder_browse=Bladeren... edit_new_project_title=Maak een nieuw JClic project edit_new_project_err_empty=Fout: Project, bestand en map moeten een geldige en niet lege naam hebben. edit_new_project_warning_noEmptyFolder=Deze map bevat een ander Clic 3.0 of JClic project. Om verwarring te vermijden, hou je best elk project in een aparte map. Het is echter niet absoluut nodig. Wil je dit nieuwe project echt in deze map bewaren? edit_new_project_err_folderCreation=Fout: Onmogelijk om de gespecificeerde map aan te maken. edit_act_copy_err_noSelection=Fout: Geen activiteit gekozen! Om deze functie te gebruiken, moet je in de activiteitenlijst een of meerdere activiteiten kiezen waarop de attributen zullen worden toegepast. edit_act_copy_action_prefix=Attributen kopi\u00EBren naar: edit_act_copy_margin=Marge edit_act_copy_bgColor=Achtergrondkleur edit_act_copy_gradient=Kleurovergang edit_act_copy_bgImage=Achtergrondafbeelding edit_act_copy_border=Rand edit_act_copy_transparentBg=Transparante achtergrond edit_act_copy_position=Positie edit_act_copy_messages=Berichten edit_act_copy_messages_ini=Stijl van het eerste bericht edit_act_copy_messages_end=Stijl van het laatste bericht edit_act_copy_messages_err=Stijl van de foutboodschap edit_act_copy_reports=Rapporten edit_act_copy_rep_include=Voeg deze activiteit toe aan rapporten edit_act_copy_rep_actions=Acties opnemen edit_act_copy_interface=Gebruikers interface edit_act_copy_skin=Skin edit_act_copy_evSounds=Gebeurtenis geluiden edit_act_copy_counters=Tellers edit_act_copy_cTime=Tijdsteller edit_act_copy_maxTime=Max. tijd edit_act_copy_cTries=Aantal pogingen teller edit_act_copy_maxTries=Max. pogingen edit_act_copy_cScore=Score teller edit_act_copy_scramble=Tijd tot schudden edit_act_copy_buttons=Knoppen edit_act_copy_btnHelp=Help knop edit_act_copy_btnInfo=Informatie knop edit_act_copy_grids=Rasters edit_act_copy_gridA=Stijl van raster A edit_act_copy_gridB=Stijl van raster B edit_act_copy_textGrid=Stijl van tekst rasters edit_act_copy_text=Tekst activiteiten edit_act_copy_fontFace=Lettertype edit_act_copy_fontSize=Grootte Lettertype edit_act_copy_fontStyle=Lettertypestijl edit_act_copy_textColour=Hoofd tekst kleur edit_act_copy_textTargetColour=Kies het JClic project waaruit activiteiten overgenomen worden edit_act_copy_textErrorColour=Fouten kleuren edit_act_copy_tabSpace=Tab space edit_act_copy_messages_prev=Stijl van vorig bericht edit_act_changeType=Verander activiteiten type edit_act_newActivity_class_tooltip=Volledige naam van de class die gebruikt wordt om de activiteit te bouwen(alleen gevorderde gebruikers!) edit_act_newActivity_other=Andere... edit_act_newActivity_info=Gevorderde gebruikers kunnen ook ongeregistreerde types van JClic activiteiten maken. Schrijf hieronder de volledige classnaam, voorafgegaan door de pakketnaam ( zoals "com.acme.activities.FooActivity"). Activiteit classes must extend edu.xtec.jclic.Activity, and must be accessibles to the JVM classloader. edit_act_newActivity_name=Activiteit naam edit_act_newActivity_name_tooltip=Elke activiteit moet een unieke naam hebben in het project edit_act_changeType_warning=

Waarschuwing: Het veranderen van het type van activiteit kan attributen en objecten verloren laten gaan. Voorzichtig gebruiken!

 

applet_codebase=Plaats van JClic code: applet_codebase_tooltip=URL die wijst naar map met JClic programma bestand en scripts applet_prev_text=HTML code vooraf: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Tekst of HTML code die voor het applet getoond wordt applet_post_text=HTML code nadien: applet_post_text_tooltip=Tekst of HTML code die na het applet getoond wordt applet_size=Applet grootte: applet_size_tooltip=Breedte en hoogte van het applet, in absolute of percent waarde. applet_page_title=Paginatitel: applet_page_title_tooltip=Tekst die getoond wordt bovenaan het browser venster applet_created_info=De web pagina "%s" werd met succes gemaakt. applet_created_prompt=Wil je dit nu openen met de browser? action_createHTML_caption=Maak web pagina... applet_create_title=Maak een HTML pagina met een JClic applet action_createHTML_tooltip=Maak een HTML pagina met een JClic applet van het huidige project applet_filename=Bestandsnaam: applet_filename_tooltip=Naam van het HTML bestand dat moet gemaakt worden action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Standaard waarden die gebruikt worden bij het maken van een web pagina applet_bgcolor=Achtergrondkleur: applet_bgcolor_tooltip=HTML pagina achtergrond kleur applet_centered=Gecentreerd applet_centered_tooltip=Plaats het applet horizontaal gecentreerd applet_width_tooltip=Applet breedte (absoluut of percent) applet_height_tooltip=Applet hoogte (absoluut of percent) applet_exitUrl=Bij exit, ga naar: applet_exitUrl_tooltip=URL waarheen de navigatie dient te wijzen als JClic stopt applet_infoFrame=Info frame naam: applet_infoFrame_tooltip=Naam van het frame dat gebruikt wordt om de inhoud die hoort bij de "info" knop action_createInstaller_caption=Maak project installeer bestand... action_createInstaller_keys=I* action_createInstaller_tooltip=Maak project installeer script voor JClic speler installer_caption=Bewerk project installeer script installer_title=Title: installer_title_tooltip=Project titel, die getoond wordt bij de installeer wizard installer_authors=Auteurs: installer_authors_tooltip=Auteur/s van het project (korte tekst) installer_folder=Map: installer_folder_tooltip=Map naam die gessugereeerd wordt door de installeer wizard installer_files=Te kopi\u00EBren bestanden: installer_files_tooltip=Door het installeer bestand te kopi\u00EBren bestanden installer_files_available=Beschikbare bestanden installer_files_selected=Gekozen bestanden installer_files_add=>>toevoegen>> installer_files_add_tooltip=Voog het geselecteerde bestand toe aan de lijst installer_files_remove=<Aten\u00E7\u00E3o:

Este projecto est\u00E1 ligado a outros projectos.
Deseja explor\u00E1-los e carregar todos os arquivos relacionados?

(Recomenda-se responder SIM ao importar um pacote de actividades Clic 3.0) edit_mc_type=Tipo: edit_mc_type_unknown=Desconhecido edit_mc_type_sound=Reproduzir som edit_mc_type_video=Reproduzir v\u00EDdeo edit_mc_type_midi=Reproduzir MIDI edit_mc_type_cdaudio=Reproduzir CD \u00E1udio edit_mc_type_record=Gravar som edit_mc_type_play_recorded=Reproduzir grava\u00E7\u00E3o edit_mc_type_run_activity=Ir para actividade edit_mc_type_run_sequence=Ir para sequ\u00EAncia edit_mc_type_run_external=Executar programa edit_mc_type_url=Mostrar URL edit_mc_type_exit=Terminar edit_mc_type_return=Voltar edit_mc_level=N\u00EDvel de prioridade: edit_mc_file=Ficheiro: edit_mc_externalParam=Par\u00E2metros: edit_mc_from=De: edit_mc_to=At\u00E9: edit_mc_length=Dura\u00E7\u00E3o m\u00E1x.: edit_mc_recBuffer=Buffer de grava\u00E7\u00E3o: edit_mc_stretch=Comprimir se n\u00E3o couber edit_mc_location=Posi\u00E7\u00E3o: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=De: edit_mc_location_from_box=C\u00E9lula edit_mc_location_from_window=Janela edit_mc_location_from_frame=Moldura edit_mc_loop=Repetir indefinidamente edit_mc_autostart=Arranque autom\u00E1tico edit_mc_catchmouse=Capturar rato edit_mc_title=Conte\u00FAdo activo e multim\u00E9dia edit_mc_label=Conte\u00FAdo activo: edit_media_dlg_title=Selec\u00E7\u00E3o do objecto multim\u00E9dia edit_media_title=Biblioteca de recursos edit_mc_pos_cell=Centrado na c\u00E9lula edit_mc_pos_window=Centrado na janela edit_mc_pos_absolute=Especificar posi\u00E7\u00E3o: edit_tree_badFormat=Estrutura ou dados da \u00E1rvore incorrectos. edit_act_panels_controls=Controlos edit_act_panels_controls_tooltip=Op\u00E7\u00F5es de bot\u00F5es e contadores edit_act_class=Tipo: edit_act_gridLayout=Distribui\u00E7\u00E3o dos pain\u00E9is: edit_act_gridLayout_tooltip=Posi\u00E7\u00E3o relativa dos pain\u00E9is A e B. edit_act_inverseResolution=Resolu\u00E7\u00E3o inversa edit_act_inverseResolution_tooltip=Actividade resolvida quando todos os elementos de "B" estiverem emparelhados. edit_act_showAllArrows=Mostrar todas as setas edit_act_alt=Conte\u00FAdo alternativo: edit_act_alt_tooltip=Conte\u00FAdo a mostrar nas c\u00E9lulas resolvidas ou n\u00E3o realizadas. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Editar o conte\u00FAdo alternativo edit_act_grid=Grelha edit_act_grid_A=Grelha A edit_act_grid_B=Grelha B edit_act_grid_layout=Distribui\u00E7\u00E3o edit_act_grid_relationship=Rela\u00E7\u00F5es edit_seq_activity_header=actividade edit_seq_tag_header=etiqueta edit_seq_jump_header=saltar para edit_seq_activity=Actividade: edit_seq_tag=R\u00F3tulo: edit_seq_description=Descri\u00E7\u00E3o: edit_seq_auto=Avan\u00E7o autom\u00E1tico edit_seq_delay=Atraso: edit_seq_action_fwd=Avan\u00E7ar edit_seq_action_back=Retroceder edit_seq_action_jump=Ir para... edit_seq_action_stop=Parar edit_seq_action_return=Voltar edit_seq_action_exit=Sair do JClic edit_seq_arrow_fwd=Seta "seguir": edit_seq_arrow_back=Seta "voltar": edit_seq_action=Ac\u00E7\u00E3o: edit_seq_button_enabled=Mostrar bot\u00E3o edit_seq_project=Projecto JClic: edit_act_absolute=Posi\u00E7\u00E3o absoluta edit_act_absolute_tooltip=O objecto ser\u00E1 colocado nas coordenadas X e Y especificadas edit_act_location=Posi\u00E7\u00E3o: edit_seq_newElement=Novo elemento da sequ\u00EAncia... edit_seq_newElement_tooltip=Inserir um novo elemento na sequ\u00EAncia de actividades edit_seq_newElement_msg=Seleccione uma actividade para o novo elemento da sequ\u00EAncia. edit_seq_newElement_error_noAct=N\u00E3o \u00E9 poss\u00EDvel criar um novo elemento de sequ\u00EAncia sem indicar a actividade! edit_seq_newElement_error_emptyList=Neste projecto n\u00E3o h\u00E1 nenhuma actividade. N\u00E3o \u00E9 poss\u00EDvel criar elementos de sequ\u00EAncia num projecto vazio. edit_seq_jump_msg=Destino do salto: edit_seq_jump_title=Destino do salto edit_act_newActivity_tooltip=Adicionar uma nova actividade ao projecto edit_act_prompt_class=Tipo de actividade: edit_act_prompt_name=Nome: edit_act_newActivity_msg=Seleccione o tipo de actividade a criar e d\u00EA-lhe um nome: edit_act_newActivity_error_noAct=Deve seleccionar um tipo de actividade! edit_act_newActivity_error_noName=Deve indicar um nome para a actividade! edit_act_newActivity_error_creating=N\u00E3o foi poss\u00EDvel criar a actividade! edit_act_newActivity_class=Classe Java: edit_text_act_format=Formato edit_text_act_answer=Resposta edit_text_act_popup=Janela emergente ("pop up") edit_text_act_answer_label=Respostas v\u00E1lidas: edit_list_newElement_tooltip=Adicionar um novo elemento \u00E0 lista edit_list_editElement_tooltip=Modificar o elemento seleccionado edit_list_deleteElement_tooltip=Eliminar o elemento seleccionado da lista edit_list_upBtn_tooltip=Mover para cima edit_list_downBtn_tooltip=Mover para baixo edit_list_newValue=Novo texto: edit_list_addElement=Adicionar um novo elemento de texto edit_list_modifyValue=Modifica\u00E7\u00E3o do texto seleccionado edit_text_act_target=Inc\u00F3gnita edit_text_act_maxLen=Comprimento m\u00E1x.: edit_text_act_maxLen_tooltip=N\u00FAmero m\u00E1ximo de caracteres permitidos na resposta. edit_text_act_fillingChar=Car\u00E1cter de preenchimento edit_text_act_fillingChar_tooltip=Car\u00E1cter utilizado para indicar a inc\u00F3gnita edit_text_act_iniLen=Comprimento inicial: edit_text_act_iniLen_tooltip=N\u00FAmero de caracteres de preenchimento a mostrar ao iniciar a actividade. edit_text_act_iniText=Texto inicial: edit_text_act_iniText_tooltip=Texto a mostrar ao iniciar a actividade. edit_text_act_list=Mostrar uma lista de op\u00E7\u00F5es: edit_text_act_list_tooltip=O utilizador deve escolher uma op\u00E7\u00E3o numa lista. edit_text_act_check_title=Op\u00E7\u00F5es de avalia\u00E7\u00E3o edit_text_act_popup_no=Sem janela emergente ("pop up") edit_text_act_popup_always=Apari\u00E7\u00E3o autom\u00E1tica edit_text_act_popup_onError=Apari\u00E7\u00E3o em erros edit_text_act_popup_onDemand=Apari\u00E7\u00E3o com F1 edit_text_act_popup_type=Tipo: edit_text_act_popup_delay=Atraso na apari\u00E7\u00E3o: edit_text_act_popup_maxTime=Tempo m\u00E1ximo: edit_text_act_popup_onlyPlay=Apenas som edit_text_act_err_noSelection=Para criar uma nova inc\u00F3gnita, seleccione um fragmento de texto. edit_text_act_err_badCharInSelection=O texto das inc\u00F3gnitas n\u00E3o pode incluir par\u00E1grafos nem tabula\u00E7\u00F5es. edit_text_act_err_nestedTargets=As inc\u00F3gnitas n\u00E3o podem sobrepor-se edit_text_act_err_cellInTarget=As inc\u00F3gnitas n\u00E3o podem conter c\u00E9lulas! edit_text_act_pageBgColor=Cor do papel: edit_text_act_editStylesBtn=Editar os estilos do documento... edit_text_act_mainStyle=Estilo principal: edit_text_act_tabSpc=Espa\u00E7amento de tabula\u00E7\u00E3o: edit_text_act_tabSize=Espa\u00E7os entre marcas de tabula\u00E7\u00E3o: edit_text_act_colors=Cores: edit_text_act_targetStyle=Cores das inc\u00F3gnitas: edit_text_act_errorStyle=Cores de erro: edit_text_act_preview=Previsualizar: edit_text_act_styleSample_default_start=Texto normal edit_text_act_styleSample_target=inc\u00F3gnita edit_text_act_styleSample_error=erro edit_text_act_styleSample_default_fill=texto normal edit_text_act_styleSample_default_end=texto normal. edit_text_act_warnDeleteTarget=Aten\u00E7\u00E3o: esta ac\u00E7\u00E3o suprimir\u00E1 a inc\u00F3gnita seleccionada. Tem a certeza de que deseja suprimi-la? edit_text_act_prevScreen_title=Ecr\u00E3 anterior edit_text_act_prevScreen_no=N\u00E3o mostrar texto antes de iniciar a actividade edit_text_act_prevScreen_original=Mostrar o texto completo do exerc\u00EDcio edit_text_act_prevScreen_special=Mostrar este texto: edit_text_act_prevScreen_time=Tempo m\u00E1ximo: edit_text_act_edit_target=Inc\u00F3gnita... edit_text_act_checkButton_show=Mostrar bot\u00E3o de avalia\u00E7\u00E3o edit_text_act_checkButtonText=Texto do bot\u00E3o: edit_text_act_checkCase=Verificar mai\u00FAsculas / min\u00FAsculas edit_text_act_checkAccents=Considerar acentos e caracteres especiais edit_text_act_checkPunct=Considerar os sinais de pontua\u00E7\u00E3o edit_text_act_checkDoubleSpc=Permitir espa\u00E7os repetidos edit_text_act_checkOptions=Crit\u00E9rios edit_text_act_checkAutoJump=Saltar automaticamente para inc\u00F3gnita seguinte edit_text_act_checkForceOk=Avan\u00E7ar apenas se responder correctamente edit_text_act_checkDetail=Indicar erros letra a letra edit_text_act_checkDetail_params=Par\u00E2metros do algoritmo de an\u00E1lise: edit_text_act_checkDetail_steps=Passos: edit_text_act_checkDetail_field=Campo de explora\u00E7\u00E3o: edit_text_act_defaultCheckButtonText=Verifica\u00E7\u00E3o edit_text_act_advancedCorrectionOptions=An\u00E1lise das respostas edit_text_act_check_bt=Avalia\u00E7\u00E3o... edit_text_act_checkButton=Bot\u00E3o de avalia\u00E7\u00E3o edit_text_act_checkProgress=Progresso edit_text_act_typeBtn=Tipo... edit_text_act_orderParagraphs=Ordenar par\u00E1grafos edit_text_act_orderWords=Ordenar palavras edit_text_act_order_amongstPar=Misturar palavras entre par\u00E1grafos edit_text_act_type_title=Tipo de actividade edit_text_act_warnChangeType=Esta ac\u00E7\u00E3o suprimir\u00E1 todas as inc\u00F3gnitas. Tem a certeza de que deseja suprimi-las? edit_text_act_identWords=Identificar palavras edit_text_act_identChars=Identificar caracteres edit_media_change_name=Renomear... edit_media_change_file=Mudar ficheiro... edit_media_includeInZip=Guardar em ficheiro ZIP edit_media_type=Tipo de recurso: edit_media_size=Tamanho do ficheiro: edit_media_show_type=Tipo de ficheiros: edit_media_preview=Visualizar objecto edit_media_preview_tooltip=Previsualiza\u00E7\u00E3o do recurso multim\u00E9dia edit_media_rename=Mudar o nome do recurso edit_media_rename_title=Renomear edit_media_rename_prompt=Novo nome: edit_media_rename_invalid=Nome de recurso inv\u00E1lido! edit_media_rename_exists=J\u00E1 existe outro recurso com este nome. Os recursos devem ter um nome \u00FAnico no projecto. edit_media_chfile_invalid=Ficheiro incorrecto err_media_chfile_different=Ficheiro deve ser do mesmo tipo edit_media_font_error=N\u00E3o foi poss\u00EDvel carregar o tipo de letra. edit_media_save_file=Guardar o ficheiro (extra\u00ED-lo do ZIP) edit_media_refresh_file=Actualizar o conte\u00FAdo a partir do ficheiro edit_media_warn_zipFileNotExternal=N\u00E3o \u00E9 um ficheiro "real", \u00E9 um objecto dentro de um ficheiro ZIP. Para utilizar esta fun\u00E7\u00E3o, \u00E9 necess\u00E1rio que exista um ficheiro com o mesmo nome na pasta onde est\u00E1 o ficheiro ZIP. edit_activities=Actividades edit_sequences=Sequ\u00EAncias edit_media=Biblioteca de recursos edit_media_tooltip=Gest\u00E3o de imagens e outros recursos utilizados no projecto. edit_activities_tooltip=Cria\u00E7\u00E3o e edi\u00E7\u00E3o das actividades do projecto edit_sequences_tooltip=Cria\u00E7\u00E3o e edi\u00E7\u00E3o de sequ\u00EAncias de actividades edit_project_title=T\u00EDtulo: edit_project_title_tooltip=T\u00EDtulo do projecto edit_project=Projecto edit_project_tooltip=Edi\u00E7\u00E3o das propriedades do projecto edit_project_description=Descri\u00E7\u00E3o: edit_project_description_tooltip=Descri\u00E7\u00E3o geral do projecto edit_project_area=\u00C1reas: edit_project_area_tooltip=\u00C1reas curriculares a que se destina o projecto edit_project_level=N\u00EDveis: edit_project_level_tooltip=N\u00EDveis e ciclos educativos a que se destina o projecto edit_project_descriptors=Descritores: edit_project_descriptors_tooltip=Descritores do projecto (separados por v\u00EDrgulas) edit_project_languages=Idiomas: edit_project_languages_tooltip=Idiomas utilizados no projecto edit_project_languages_modify=Mudar idioma seleccionado edit_project_languages_add=Adicionar idioma edit_project_languages_select=C\u00F3digos de idioma ISO-639: edit_project_authors=Autores: edit_project_authors_tooltip=Pessoas que participaram na cria\u00E7\u00E3o do projecto edit_project_author_name=Nome: edit_project_author_mail=Correio electr\u00F3nico: edit_project_author_rol=Fun\u00E7\u00E3o: edit_project_author_organization=Organiza\u00E7\u00E3o: edit_project_author_comments=Coment\u00E1rios: edit_project_author_url=URL: edit_project_author_name_tooltip=Nome do autor (obrigat\u00F3rio) edit_project_author_mail_tooltip=Endere\u00E7o de correio electr\u00F3nico do autor (opcional) edit_project_author_rol_tooltip=Fun\u00E7\u00E3o da pessoa no projecto: autor, colaborador, desenhos, sons... (opcional) edit_project_author_organization_tooltip=Escola, universidade, associa\u00E7\u00E3o... (opcional) edit_project_author_url_tooltip=P\u00E1gina web pessoal (opcional) edit_project_author_comments_tooltip=Outras caracter\u00EDsticas (opcional) edit_project_author_info=Dados do autor: edit_project_author_add=Adicionar um autor \u00E0 lista edit_project_author_edit=Modifica\u00E7\u00E3o dos dados do autor edit_project_org_name=Nome: edit_project_org_name_tooltip=Nome da escola edit_project_org_mail=Correio electr\u00F3nico: edit_project_org_mail_tooltip=Endere\u00E7o de correio electr\u00F3nico da escola edit_project_org_url=URL: edit_project_org_url_tooltip=Endere\u00E7o web da escola edit_project_org_address=Endere\u00E7o: edit_project_org_address_tooltip=Endere\u00E7o postal da escola edit_project_org_pc=CP: edit_project_org_pc_tooltip=C\u00F3digo postal edit_project_org_city=Localidade: edit_project_org_city_tooltip=Localidade da escola edit_project_org_country=Pa\u00EDs: edit_project_org_state=Estado: edit_project_org_comments=Coment\u00E1rios: edit_project_org=Centro/s: edit_project_org_tooltip=Escolas e outras institui\u00E7\u00F5es que participaram no projecto edit_project_org_info=dados da organiza\u00E7\u00E3o: edit_project_org_add=Adicionar uma nova organiza\u00E7\u00E3o edit_project_org_edit=Modificar os dados da organiza\u00E7\u00E3o edit_project_org_country_tooltip=Estado, pa\u00EDs, federa\u00E7\u00E3o... edit_project_org_state_tooltip=Estado federal, nacionalidade, comunidade, regi\u00E3o... edit_project_org_comments_tooltip=Outros dados... edit_project_rev_date=Data: edit_project_rev_date_tooltip=Data da revis\u00E3o edit_project_rev_authors=Autores: edit_project_rev_authors_tooltip=Autores da revis\u00E3o edit_project_rev_description=Descri\u00E7\u00E3o: edit_project_rev_description_tooltip=Breve descri\u00E7\u00E3o das altera\u00E7\u00F5es edit_project_rev_comments=Coment\u00E1rios: edit_project_rev_comments_tooltip=Informa\u00E7\u00E3o adicional edit_project_rev=Revis\u00F5es: edit_project_rev_tooltip=Registo das principais modifica\u00E7\u00F5es efectuadas no projecto edit_project_rev_add=Adicionar um registo de revis\u00E3o edit_project_rev_edit=Edi\u00E7\u00E3o dos dados da revis\u00E3o edit_project_rev_info=Caracter\u00EDsticas da revis\u00E3o edit_media_objects=objectos edit_media_object=objecto edit_evsounds_start=In\u00EDcio de actividade: edit_evsounds_click=Clicar num objecto: edit_evsounds_actionError=Ac\u00E7\u00E3o errada: edit_evsounds_actionOk=Ac\u00E7\u00E3o correcta: edit_evsounds_finishedError=Actividade terminada com erros: edit_evsounds_finishedOk=Actividade correctamente terminada: edit_project_rev_err_nodesc=Erro: A descri\u00E7\u00E3o deve ser preenchida edit_evsounds_dlg_title=Edi\u00E7\u00E3o dos sons de evento edit_project_evsounds=Sons de evento: edit_project_evsounds_tooltip=Definir sons espec\u00EDficos para cada evento de JClic edit_act_evsounds=Sons de evento: edit_act_evsounds_tooltip=Definir sons espec\u00EDficos para cada evento de JClic edit_evsounds_default=som padr\u00E3o edit_evsounds_disabled=desactivado edit_evsounds_chk_tooltip=Activa/desactiva o som para este evento edit_evsounds_select_tooltip=Clique para seleccionar o som ligado a este evento, ou desmarque para utilizar o som padr\u00E3o action_newProject_caption=Novo projecto... action_newProject_keys=NN action_newProject_tooltip=Criar um novo projecto JClic edit_arith_op_from=De: edit_arith_op_from_tooltip=Valor m\u00EDnimo do operando edit_arith_op_to=At\u00E9: edit_arith_op_to_tooltip=Valor m\u00E1ximo do operando edit_arith_op_with=Com: edit_arith_op_with_tooltip=Se seleccionado, o operando pode ter tamb\u00E9m este valor edit_arith_op_fromList=Um da lista: edit_arith_op_fromList_tooltip=Lista de poss\u00EDveis valores do operando edit_arith_op_decimals=Decimais: edit_arith_op_decimals_tooltip=N\u00FAmero de decimais do operando edit_arith_op_dec0=# (inteiro) edit_arith_op_dec1=#,# edit_arith_op_dec2=#,## edit_arith_firstOp=Primeiro operando edit_arith_secondOp=Segundo operando edit_arith_title=Arith2 para JClic edit_arith_operations=Opera\u00E7\u00F5es: edit_arith_operations_tooltip=Selecciona o tipo de opera\u00E7\u00F5es a efectuar edit_arith_operations_plus=Somar edit_arith_operations_minus=Subtrair edit_arith_operations_multiply=Multiplicar edit_arith_operations_divide=Dividir edit_arith_unknown=Inc\u00F3gnita: edit_arith_unknown_tooltip=Selecciona o elemento que funcionar\u00E1 como inc\u00F3gnita edit_arith_unknown_aobx=A inc\u00F3gnita \u00E9 o resultado edit_arith_unknown_aoxr=A inc\u00F3gnita \u00E9 o segundo operando edit_arith_unknown_xobr=O primeiro operando \u00E9 a inc\u00F3gnita edit_arith_unknown_axbr=A opera\u00E7\u00E3o \u00E9 a inc\u00F3gnita edit_arith_unknown_invert=Escrever a express\u00E3o come\u00E7ando pelo resultado edit_arith_result=Resultado: edit_arith_result_notCarry=Sem transporte edit_arith_result_random=Aleat\u00F3rio edit_arith_result_asc=Ascendente edit_arith_result_order=Ordenar por resultado: edit_arith_result_desc=Descendente edit_arith_result_avoidDup=Evitar duplicados edit_arith_cond=Condi\u00E7\u00F5es: edit_arith_cond_ind=Indiferente edit_arith_cond_agb=O primeiro operando deve ser maior que o segundo edit_arith_cond_alb=O primeiro operando deve ser menor que o segundo edit_arith_cond_tooltip=Outras condi\u00E7\u00F5es edit_autocp=Gerador autom\u00E1tico de conte\u00FAdo: edit_autocp_tooltip=Selec\u00E7\u00E3o do tipo de gerador autom\u00E1tico de conte\u00FAdo para esta actividade. edit_autocp_block=Gerador de conte\u00FAdo edit_autocp_btn=Defini\u00E7\u00F5es... edit_autocp_btn_tooltip=Configura\u00E7\u00E3o dos par\u00E2metros do gerador de conte\u00FAdo edit_data=Edi\u00E7\u00E3o de dados edit_act=Edi\u00E7\u00E3o da actividade edit_acp=Edi\u00E7\u00E3o do gerador de conte\u00FAdo edit_acp_err_creating=Erro ao criar o gerador de conte\u00FAdo edit_project_author_group=Cria\u00E7\u00E3o edit_project_description_block=Descri\u00E7\u00E3o edit_project_ui_block=Interface de utilizador edit_act_description=Descri\u00E7\u00E3o: m_Edit=Edi\u00E7\u00E3o m_Edit_Mnemonic=E edit_media_preview_keys=V* edit_act_newActivity=Nova actividade... edit_act_newActivity_keys=A* edit_act_testAction_keys=M#10 edit_seq_newElement_keys=S* m_Insert=Inserir m_Insert_Mnemonic=I m_View=Ver m_View_Mnemonic=V action_editProject_caption=Projecto action_editProject_keys=PP action_editProject_tooltip=Editar as propriedades do projecto action_editMedia_caption=Mediateca action_editMedia_keys=MM action_editMedia_tooltip=Edi\u00E7\u00E3o da biblioteca multim\u00E9dia do projecto action_editActivities_caption=Actividades action_editActivities_keys=AA action_editActivities_tooltip=Edi\u00E7\u00E3o das actividades action_editSeq_caption=Sequ\u00EAncias action_editSeq_keys=SS action_editSeq_tooltip=Edi\u00E7\u00E3o das sequ\u00EAncias de actividades warn_project_modified=O projecto actual foi modificado. Deseja guardar as altera\u00E7\u00F5es? edit_project_descriptors_block=Descritores edit_media_new=Novo objecto multim\u00E9dia... edit_media_new_tooltip=Adicionar uma imagem ou um objecto multim\u00E9dia \u00E0 mediateca edit_media_new_keys=M* edit_seq_threshold=Limite de pontua\u00E7\u00E3o: edit_seq_threshold_tooltip_up=Seguir este caminho quando a pontua\u00E7\u00E3o global for maior ou igual a... edit_seq_time=Limite de tempo: edit_seq_time_tooltip_up=Para seguir este caminho \u00E9 necess\u00E1rio ter realizado as actividades num tempo inferior a... edit_seq_threshold_tooltip_down=Siga este caminho sempre que a pontua\u00E7\u00E3o global for inferior a... edit_seq_time_tooltip_down=Seguir este caminho sempre que o tempo decorrido nas actividades for superior a... edit_seq_condJump=Saltos condicionais edit_seq_condJump_tooltip=Indicar saltos a executar apenas se ocorrerem determinadas condi\u00E7\u00F5es edit_seq_condJump_upper_tooltip=Indicar as condi\u00E7\u00F5es para saltar para um n\u00EDvel superior edit_seq_condJump_lower=Salto inferior: edit_seq_condJump_upper=Salto superior: edit_seq_condJump_lower_tooltip=Indicar as condi\u00E7\u00F5es para saltar para um n\u00EDvel inferior edit_seq_action_tooltip_fw=Ac\u00E7\u00E3o atribu\u00EDda ao bot\u00E3o "Seguinte" edit_seq_action_tooltip_bk=Ac\u00E7\u00E3o atribu\u00EDda ao bot\u00E3o "Anterior" edit_seq_jump_tooltip=Indicar o destino do salto edit_seq_action_tooltip=Ac\u00E7\u00E3o a realizar edit_seq_activity_tooltip=Actividade atribu\u00EDda a este elemento da sequ\u00EAncia edit_seq_tag_tooltip=Etiqueta utilizada para referir-se a este elemento de sequ\u00EAncia (opcional) edit_seq_description_tooltip=Descri\u00E7\u00E3o do elemento de sequ\u00EAncia (opcional) edit_seq_button_enabled_tooltip=Activar/desactivar o bot\u00E3o de mudan\u00E7a de actividade edit_seq_auto_tooltip=Avan\u00E7ar automaticamente ao terminar a actividade edit_seq_delay_tooltip=Segundos de espera antes de realizar o avan\u00E7o autom\u00E1tico edit_color_dlgTitle=Seleccionar cor edit_media_renaming=Por favor, espere enquanto se altera o nome do recurso... edit_act_cell_width=Largura: edit_act_cell_width_tooltip=Largura das c\u00E9lulas (em p\u00EDxeis) edit_act_cell_height=Altura: edit_act_cell_height_tooltip=Altura das c\u00E9lulas (em p\u00EDxeis) edit_act_hiddenWords=Palavras escondidas: edit_act_hiddenWords_tooltip=Lista das palavras escondidas no painel edit_act_wordSearch_panelB=Utilizar o painel B edit_act_wordSearch_panelB_tooltip=Usar um segundo painel, que surge \u00E0 medida que as palavras s\u00E3o encontradas edit_act_shaper_tooltip=Selec\u00E7\u00E3o do tipo de gerador de formas do painel edit_act_num_cols_tooltip=N\u00FAmero de colunas do painel edit_act_num_rows_tooltip=N\u00FAmero de filas do painel edit_act_wildTransparent=Separadores transparentes edit_act_wildTransparent_tooltip=Exibir os separadores (quadros negros) como buracos transparentes edit_act_behavior_scramble_times=Misturas: edit_act_behavior_scramble_times_tooltip=N\u00FAmero de vezes a misturar as pe\u00E7as edit_act_copy_title=Copiar atributos para... edit_act_copy_attributes=Atributos: edit_act_copy_dest=Aplicar a: edit_act_copy_style_main=Janela principal edit_act_copy_style_play=Janela de jogo edit_act_copy_activities=Actividades a modificar: edit_act_copyAttributes=Copiar atributos edit_act_copyAttributes_keys=F edit_act_copyAttributes_tooltip=Copiar atributos da actividade actual para outras actividades edit_new_project_name=Nome do projecto: edit_new_project_name_tooltip=Nome curto e descritivo do projecto edit_new_project_filename=Nome do ficheiro: edit_new_project_filename_tooltip=Nome do ficheiro do projecto (sem extens\u00E3o) edit_new_project_folder=Pasta: edit_new_project_folder_tooltip=Nome da pasta em que se guardar\u00E1 o projecto edit_new_project_folder_browse=Procurar... edit_new_project_title=Cria\u00E7\u00E3o de um novo projecto JClic edit_new_project_err_empty=Erro: Tanto o projecto como o ficheiro e a pasta devem ter nomes v\u00E1lidos. edit_new_project_warning_noEmptyFolder=Nesta pasta j\u00E1 existe outro projecto Clic3.0 ou JClic. Para evitar confus\u00F5es, recomenda-se manter cada projecto numa pasta independente, ainda que n\u00E3o seja um requisito imprescind\u00EDvel. Deseja criar o novo projecto nesta pasta? edit_new_project_err_folderCreation=Erro: n\u00E3o foi poss\u00EDvel criar a pasta (directoria)! edit_act_copy_err_noSelection=Erro: N\u00E3o foi seleccionada nenhuma actividade. Para utilizar esta fun\u00E7\u00E3o, deve seleccionar na lista a actividade ou actividades \u00E0s quais ser\u00E3o aplicados os atributos indicados. edit_act_copy_action_prefix=A copiar atributos para: edit_act_copy_margin=Margem edit_act_copy_bgColor=Cor de fundo edit_act_copy_gradient=Gradiente edit_act_copy_bgImage=Imagem de fundo edit_act_copy_border=Limite edit_act_copy_transparentBg=Fundo transparente edit_act_copy_position=Posi\u00E7\u00E3o edit_act_copy_messages=Mensagens edit_act_copy_messages_ini=Estilo da mensagem inicial edit_act_copy_messages_end=Estilo da mensagem final edit_act_copy_messages_err=Estilo da mensagem de erro edit_act_copy_reports=Relat\u00F3rios edit_act_copy_rep_include=Incluir a actividade nos relat\u00F3rios edit_act_copy_rep_actions=Registar ac\u00E7\u00F5es edit_act_copy_interface=Interface de utilizador edit_act_copy_skin=Aspecto edit_act_copy_evSounds=Sons de evento edit_act_copy_counters=Contadores edit_act_copy_cTime=Contador de tempo edit_act_copy_maxTime=Tempo m\u00E1ximo edit_act_copy_cTries=Contador de tentativas edit_act_copy_maxTries=N\u00FAmero m\u00E1ximo de tentativas edit_act_copy_cScore=Contador de acertos edit_act_copy_scramble=N\u00FAmero de vezes a baralhar edit_act_copy_buttons=Bot\u00F5es edit_act_copy_btnHelp=Bot\u00E3o de ajuda edit_act_copy_btnInfo=Bot\u00E3o de informa\u00E7\u00E3o edit_act_copy_grids=Pain\u00E9is edit_act_copy_gridA=Estilo do painel A edit_act_copy_gridB=Estilo do painel B edit_act_copy_textGrid=Estilo dos pain\u00E9is de texto edit_act_copy_text=Actividades de texto edit_act_copy_fontFace=Tipo de letra edit_act_copy_fontSize=Tamanho de letra edit_act_copy_fontStyle=Estilo de letra edit_act_copy_textColour=Cor do texto principal edit_act_copy_textTargetColour=Escolha o projecto JClic do qual as actividades ser\u00E3o importadas edit_act_copy_textErrorColour=Cor dos erros edit_act_copy_tabSpace=Espa\u00E7o entre tabula\u00E7\u00F5es edit_act_copy_messages_prev=Estilo da mensagem anterior edit_act_changeType=Mudar o tipo de actividade edit_act_newActivity_class_tooltip=Nome completo da classe que se utilizar\u00E1 para construir a actividade (utilizadores avan\u00E7ados!) edit_act_newActivity_other=Outras... edit_act_newActivity_info=Os utilizadores avan\u00E7ados podem criar outros tipos de actividades JClic n\u00E3o registadas. Escreva abaixo o nome completo da classe, precedida pelo do pacote (por exemplo: "com.acme.activities.FooActivity"). As novas actividades devem expandir edu.xtec.jclic.Activity, e devem ser access\u00EDveis ao carregador de classes da m\u00E1quina virtual de Java. edit_act_newActivity_name=Nome da actividade edit_act_newActivity_name_tooltip=Cada actividade deve ter um nome \u00FAnico no projecto edit_act_changeType_warning=

Aten\u00E7\u00E3o: Mudar o tipo de actividade pode causar a perda de atributos e objectos da actividade actual. Utilize esta fun\u00E7\u00E3o com cuidado!

 

applet_codebase=Localiza\u00E7\u00E3o do c\u00F3digo JClic: applet_codebase_tooltip=URL que aponta para uma pasta com os ficheiros e scripts do JClic applet_prev_text=C\u00F3digo HTML pr\u00E9vio: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Texto ou c\u00F3digo HTML que aparecer\u00E1 antes do applet applet_post_text=C\u00F3digo HTML posterior: applet_post_text_tooltip=Texto ou c\u00F3digo HTML que aparecer\u00E1 depois do applet applet_size=Tamanho do applet: applet_size_tooltip=Largura e altura do applet, em valores absolutos ou percentuais. applet_page_title=T\u00EDtulo da p\u00E1gina: applet_page_title_tooltip=Texto a mostrar na parte superior da janela do navegador applet_created_info=A p\u00E1gina web "%s" foi criada com \u00EAxito. applet_created_prompt=Deseja abri-la agora com o navegador? action_createHTML_caption=Criar p\u00E1gina web... applet_create_title=Cria\u00E7\u00E3o de uma p\u00E1gina HTML com um applet JClic action_createHTML_tooltip=Cria\u00E7\u00E3o de uma p\u00E1gina HTML com um applet que contem o projecto actual. applet_filename=Nome do arquivo: applet_filename_tooltip=Nome do arquivo HTML a criar action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Valores padr\u00E3o usados na cria\u00E7\u00E3o de p\u00E1ginas web applet_bgcolor=Cor de fundo: applet_bgcolor_tooltip=Cor de fundo da p\u00E1gina web applet_centered=Centrado applet_centered_tooltip=Applet centrado horizontalmente applet_width_tooltip=Largura do applet (em valor absoluto ou percentual) applet_height_tooltip=Altura do applet (em valor absoluto ou percentual) applet_exitUrl=Ao sair, ir para: applet_exitUrl_tooltip=URL a visitar ap\u00F3s sair do JClic applet_infoFrame=Quadro de informa\u00E7\u00E3o: applet_infoFrame_tooltip=Nome do quadro usado para mostrar o conte\u00FAdo relacionado com o bot\u00E3o de informa\u00E7\u00E3o. action_createInstaller_caption=Criar instalador do projecto... action_createInstaller_keys=I* action_createInstaller_tooltip=Cria\u00E7\u00E3o de um ficheiro de instala\u00E7\u00E3o do projecto para JClic player installer_caption=Edi\u00E7\u00E3o do ficheiro de instala\u00E7\u00E3o do projecto installer_title=T\u00EDtulo: installer_title_tooltip=T\u00EDtulo do projecto a mostrar no assistente de instala\u00E7\u00E3o installer_authors=Autores: installer_authors_tooltip=Autores do projecto (texto curto) installer_folder=Pasta: installer_folder_tooltip=Nome da pasta a sugerir pelo assistente de instala\u00E7\u00E3o installer_files=Ficheiros a copiar: installer_files_tooltip=Ficheiros copiados durante a instala\u00E7\u00E3o installer_files_available=Ficheiros dispon\u00EDveis installer_files_selected=Ficheiros seleccionados installer_files_add=>> adicionar >> installer_files_add_tooltip=Adicionar o ficheiro seleccionado \u00E0 lista installer_files_remove=<< remover << installer_files_remove_tooltip=Remover da lista o ficheiro seleccionado installer_button=Bot\u00E3o de activa\u00E7\u00E3o installer_button_tooltip=Propriedades do bot\u00E3o a mostrar na biblioteca de projectos installer_button_project=Projecto principal: installer_button_project_tooltip=Projecto JClic associado ao bot\u00E3o installer_button_text=Etiqueta: installer_button_text_tooltip=Breve etiqueta de texto, que aparecer\u00E1 dentro do bot\u00E3o installer_button_icon=\u00CDcone: installer_button_icon_tooltip=Imagem a usar como \u00EDcone do bot\u00E3o. Deixar em branco para usar o \u00EDcone padr\u00E3o do JClic. installer_button_description=Descri\u00E7\u00E3o installer_button_description_tooltip=Texto de ajuda a mostrar pelo bot\u00E3o installer_error_noTitle=Erro: Falta o t\u00EDtulo do projecto installer_error_noBaseFolder=Erro: Falta o nome da pasta de instala\u00E7\u00E3o do projecto installer_error_noFilesSelected=Erro: N\u00E3io foi seleccionado nenhum ficheiro installer_error_noButtonText=Erro: Falta texto do bot\u00E3o de activa\u00E7\u00E3o installer_error_projectNotInFiles=Erro: O projecto associado ao bot\u00E3o de activa\u00E7\u00E3o n\u00E3o faz da lista de ficheiros a copiar applet_page_full=O applet ocupa toda a p\u00E1gina applet_page_mixed=O applet tem dimens\u00F5es espec\u00EDficas edit_text_align_left=Alinhar o texto \u00E0 esquerda edit_text_align_center=Centrar texto edit_text_align_right=Alinhar \u00E0 direita edit_text_act_target_toggle=Criar uma inc\u00F3gnita ou suprimi-la edit_text_act_insertCell=Inserir uma c\u00E9lula edit_text_act_content=Conte\u00FAdo edit_text_act_style=Estilo edit_cell_size=Dimens\u00F5es: edit_project_orphanActivities=As actividades seguintes n\u00E3o aparecem em nenhuma sequ\u00EAncia de actividades do projecto. N\u00E3o ser\u00E3o mostradas: edit_project_orphanMedia=Os seguintes objectos da mediateca n\u00E3o s\u00E3o utilizados directamente em nenhuma actividade: edit_project_orphanActivities_prompt=Deseja adicion\u00E1-los ao final da \u00FAltima sequ\u00EAncia de actividades? edit_project_orphanMedia_prompt=Deseja elimin\u00E1-los? edit_project_orphanMedia_title=Remo\u00E7\u00E3o de objectos multim\u00E9dia n\u00E3o utilizados edit_project_orphanActivities_title=Actividades \u00F3rf\u00E3s edit_media_refreshAll=Actualizar o conte\u00FAdo de todos os recursos edit_media_refreshAll_tooltip=Actualizar todos os recursos voltando a carregar os ficheiros edit_media_refreshAll_keys=R* edit_media_refreshAll_working=A actualizar recursos... edit_media_exportAll=Exportar todos os recursos edit_media_exportAll_tooltip=Gravar em ficheiros o conte\u00FAdo de todos os recursos edit_media_exportAll_keys=X* edit_shape_select=Seleccionar edit_shape_addPoint=Adicionar ponto edit_shape_deletePoint=Eliminar edit_shape_drawRect=Desenhar um rect\u00E2ngulo edit_shape_drawEllipse=Desenhar uma elipse edit_shape_drawPoly=Desenhar um pol\u00EDgono edit_shape_toLine=Converter em linha edit_shape_toBezier=Converter em curva de B\u00E9zier edit_shape_toQuad=Converter em qu\u00E1drica edit_shape_rLeft=Girar para esquerda edit_shape_rRight=Girar para direita edit_shape_expand=Expandir edit_shape_contract=Contrair edit_shape_zoomIn=Aproximar edit_shape_zoomOut=Afastar edit_shape_aproxPoints=Juntar pontos pr\u00F3ximos edit_shape_showPoints=Mostrar pontos edit_shape_showPoints_tooltip=Mostrar/Ocultar pontos edit_shape_gridSize=Tamanho da grelha: edit_shape_hideGrid=Mostrar/Ocultar grelha edit_shape_magnetRadius=Raio do im\u00E1n: edit_shape_elements=Elementos definidos edit_shape_elemName=Nome do elemento seleccionado edit_shape_magnetRadius_tooltip=Raio de ac\u00E7\u00E3o do \u00EDman, quando est\u00E1 activado edit_shape_gridSize_tooltip=Tamanho da grelha edit_mc_activity=Actividade: edit_mc_sequence=Sequ\u00EAncia: edit_mc_url=URL: edit_mc_project=Projecto: edit_mc_activity_selection=Selec\u00E7\u00E3o da actividade edit_mc_sequence_selection=Selec\u00E7\u00E3o da sequ\u00EAncia edit_mc_err_nullContent=Dados insuficientes! edit_act_arrowColor=Cor das setas: edit_act_arrowColor_tooltip=Cor utilizada pelo editor ao desenhar as setas (n\u00E3o exactamente, j\u00E1 que utiliza uma m\u00E1scara XOR de bits) edit_act_editActivity=Editar... edit_act_editActivity_tooltip=Editar a actividade seleccionada action_saveFileAs_caption=Guardar como... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Guardar o projecto com um nome diferente edit_act_behavior_block=Comportamento edit_act_behavior=Comportamento edit_act_behavior_drag=Arrastar edit_act_behavior_drag_tooltip=Arrastar c\u00E9lulas em vez de usar linha de conex\u00E3o edit_act_behavior_order=Marcar ordem de resolu\u00E7\u00E3o edit_act_behavior_order_tooltip=C\u00E9lulas dever\u00E3o ser resolvidas por ordem edit_act_scramble=Misturar action_importActivities_caption=Importar actividades... action_importActivities_keys=I* action_importActivities_tooltip=Importar actividades de outro projecto import_warn_samefile=O ficheiro que foi seleccionado corresponde ao projecto actual. S\u00F3 pode importar actividades entre projectos diferentes. Por favor, escolha outro projecto. import_selectActivities=Seleccione uma ou mais actividades a importar para o projecto actual: import_importing=A importar... import_checkdep=A verificar depend\u00EAncias... import_impmedia=Importar recursos: import_impact=Importar actividade: import_selectProject=Escolha o projecto JClic do qual as actividades ser\u00E3o importadas edit_tagRep_tags=Marcas edit_tagRep_tagStart=Marcas de in\u00EDcio edit_tagRep_tagStart_tooltip=Marca que indica in\u00EDcio de etiqueta edit_tagRep_tagEnd=Marca final: edit_tagRep_tagEnd_tooltip=Marca que indica final de etiqueta edit_tagRep_file=Ficheiro edit_tagRep_fileName=Ficheiro ou URL: edit_tagRep_fileName_tooltip=Nome ou URL do ficheiro com os valores que substituir\u00E3o as etiquetas edit_tagRep_charset=Codifica\u00E7\u00E3o de caracteres: edit_tagRep_charset_tooltip=Codifica\u00E7\u00E3o de caracteres usada no ficheiro edit_tagRep_browseFile=Procurar... edit_tagRep_browseFile_tooltip=Procurar no sistema de ficheiros edit_tagRep_title=Substituir etiqueta edit_text_act_clearStylesBtn=Eliminar estilos de texto edit_text_act_clearStylesPrompt=Aten\u00E7\u00E3o: Esta ac\u00E7\u00E3o eliminar\u00E1 os atributos de texto do documento, aplicando o estilo predefinido. Esta ac\u00E7\u00E3o n\u00E3o pode ser desfeita. Quer eliminar os atributos de texto? img_max_size=Tamanho m\u00E1ximo das imagens img_max_width_tooltip=Largura m\u00E1xima das imagens importadas para biblioteca de media. img_max_height_tooltip=Altura m\u00E1xima das imagens importadas para biblioteca de media. img_resize_prompt=A imagem "%s" tem %s pixeis. Excede o m\u00E1ximo permitido pelo JClic Author (%s). Quer redimension\u00E1-la? src/author/edu/xtec/resources/messages/AuthorMessages_pt_BR.properties000066400000000000000000001314231335566474600266750ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Descri\u00E7\u00E3o edit_act_name_tooltip=Nome da atividade edit_act_name=Nome: edit_act_description_tooltip=Descri\u00E7\u00E3o da atividade edit_act_reports_block=Relat\u00F3rios edit_act_includeInReports=Incluir esta atividade nos relat\u00F3rios edit_act_includeInReports_tooltip=Incluir os resultados desta atividade no relat\u00F3rio dos usu\u00E1rios edit_act_code=C\u00F3digo: edit_act_code_tooltip=C\u00F3digo adicional para agrupar e buscar no banco de dados de relat\u00F3rios. edit_act_reportActions=Registrar a\u00E7\u00F5es dos usu\u00E1rios edit_act_reportActions_tooltip=Registrar os detalhes de todas as a\u00E7\u00F5es realizadas pelos usu\u00E1rios. edit_act_counters_block=Contadores edit_act_timeCounter=Contador de tempo edit_act_timeCounter_tooltip=Mostrar/ocultar contador de tempo edit_act_actionsCounter=Contador de tentativas edit_act_actionsCounter_tooltip=Show/hide the tries counter edit_act_scoreCounter=Contador de acertos edit_act_scoreCounter_tooltip=Mostrar/ocultar os acertos. edit_act_maxTime=Tempo m\u00E1ximo: edit_act_maxTime_tooltip=Tempo m\u00E1ximo para resolver a atividade, em segundos, ou 0 para tempo ilimitado. edit_act_countdown=Contagem regressiva edit_act_countdown_tooltip=O contador \u00E9 iniciado com um valor m\u00E1ximo, decrescendo at\u00E9 0. edit_act_maxActions=M\u00E1ximo n\u00BA de tentativas: edit_act_maxActions_tooltip=N\u00FAmero m\u00E1ximo de tentativas permitido (use 0 para tentativas ilimitadas). edit_act_buttons_block=Bot\u00F5es edit_act_helpBtn=Ajuda edit_act_helpBtn_tooltip=Mostrar/ocultar bot\u00E3o de ajuda edit_act_helpBtn_solution=Mostrar solu\u00E7\u00E3o edit_act_helpBtn_msg=Mostrar essa mensagem: edit_act_infoBtn=Informa\u00E7\u00E3o: edit_act_infoBtn_tooltip=Mostrar/ocultar o bot\u00E3o de informa\u00E7\u00E3o adicional edit_act_infoBtn_url=Mostrar esta URL: edit_act_infoBtn_cmd=Execute este comando: edit_act_infoBtn_url_tooltip=Endere\u00E7o na web que ser\u00E1 acessado ao clicar no bot\u00E3o de informa\u00E7\u00F5es adicionais edit_act_infoBtn_cmd_tooltip=Linha de comando a ser executada ao clicar no bot\u00E3o de informa\u00E7\u00F5es adicionais edit_act_mainWindow=Janela Principal: edit_act_gameWindow=Janela de Jogos: edit_act_margin=Margem: edit_act_margin_tooltip=Espa\u00E7amento horizontal e vertical entre objetos visuais. edit_act_bgColor=Cor do fundo da tela: edit_act_bgColor_tooltip=Altere a cor do fundo da tela. edit_gradient_startColor=Cor inicial: edit_gradient_endColor=Cor final: edit_gradient_startColor_tooltip=Escolha a primeira cor edit_gradient_endColor_tooltip=Escolha a cor final edit_gradient_cycles=Ciclos: edit_gradient_cycles_tooltip=N\u00FAmero de repeti\u00E7\u00F5es do gradiente sobre a superf\u00EDcie de desenho edit_gradient_orientation=Orienta\u00E7\u00E3o: edit_gradient_orientation_tooltip=Orienta\u00E7\u00E3o do gradiente, medida em graus sobre a horizontal edit_act_gradient=Gradiente: edit_act_gradient_tooltip=Use gradiente de cores edit_color_opacity=Opacidade edit_color_opacity_tooltip=Defina valor do canal alfa de cores (opacidade). edit_gradient_title=Gradiente edit_gradient_default=Use os valores padr\u00E3o (gradiente nulo) edit_act_image=Imagem: edit_act_descriptionTab=Descri\u00E7\u00E3o edit_act_descriptionTab_tooltip=Nome e descri\u00E7\u00E3o edit_act_tiledBgImg=Ladrilhado edit_act_tiledBgImg_tooltip=Pinte toda a superf\u00EDcie com a imagem, repetindo-a ao longo dos eixos X e Y conforme necess\u00E1rio. edit_act_preview=Pr\u00E9-visualiza\u00E7\u00E3o: edit_act_border=Contorno edit_act_border_tooltip=Desenhe uma linha de contorno ao redor da janela edit_act_transparent=Transparente edit_act_transparent_tooltip=A janela possui fundo transparente edit_act_width=Largura: edit_act_height=Altura: edit_act_width_tooltip=Largura do objeto, medida em pixels edit_act_height_tooltip=Altura do objeto, medida em pixels edit_act_centered=Centralizado edit_act_centered_tooltip=O objeto ser\u00E1 centralizado sobre a janela principal edit_act_x=X: edit_act_x_tooltip=Localiza\u00E7\u00E3o horizontal absoluta edit_act_y=Y: edit_act_y_tooltip=Localiza\u00E7\u00E3o vertical absoluta edit_act_ui_block=Interface do usu\u00E1rio edit_act_image_tooltip=Selecione uma imagem edit_act_text=Texto: edit_act_text_tooltip=Texto a ser exibido dentro deste objeto edit_font_face=Tipo de fonte: edit_font_size=Tamanho: edit_font_bold=Negrito edit_font_italic=It\u00E1lico edit_font_underline=Sublinhado edit_font_style=Estilo: edit_cell_title=Conte\u00FAdo da c\u00E9lula edit_act_messages=Mensagens edit_act_msg_initial=Mensagem inicial: edit_act_msg_final=Mensagem final: edit_act_msg_prev=Mensagem anterior: edit_act_msg_error=Mensagem de erro: edit_act_msg_initial_tooltip=Mensagem a ser exibida quando a atividade iniciar edit_act_msg_final_tooltip=Mensagem a ser exibida quando a atividade terminar edit_act_msg_error_tooltip=Mensagem a ser exibida quando a atividade terminar com erros edit_act_msg_prev_tooltip=Mensagem a ser exibida antes do in\u00EDcio da atividade (somente em certos tipos de atividade) edit_align=Alinhar: edit_act_textColor=Cor do texto: edit_act_textColor_tooltip=Cor usada para escrever o texto edit_act_shadowColor=Cor da sombra: edit_act_shadowColor_tooltip=Cor da sombra do texto, quando selecionada edit_act_shadow=Sombreamento edit_act_shadow_tooltip=Escreva o texto com sombreamento edit_act_borderColor=Cor do contorno: edit_act_borderColor_tooltip=Cor usada para desenhar o contorno da c\u00E9lula edit_act_inactiveColor=Cor utilizada em estado inativo: edit_act_inactiveColor_tooltip=Cor utilizada quando a c\u00E9lula estiver desabilitada edit_act_altColor=Cor alternativa: edit_act_altColor_tooltip=Cor utilizada para escrever o conte\u00FAdo alternativo em c\u00E9lulas solucionadas. edit_cell_marked=Marcado edit_cell_disabled=Desabilitado edit_cell_alt=Alternativo edit_cell_textMargin=Margem interna: edit_cell_textMargin_tooltip=Quantidade de espa\u00E7o entre o contorno da c\u00E9lula e o texto. edit_cell_borderWidth=Largura do contorno: edit_cell_borderWidth_tooltip=Largura da linha utilizada para desenhar o contorno padr\u00E3o edit_cell_markerWidth=Largura do marcador: edit_cell_markerWidth_tooltip=Largura da linha utilizada para desenhar o contorno quando a c\u00E9lula est\u00E1 marcada ou selecionada edit_cell_alt_tooltip=Pr\u00E9-visualiza\u00E7\u00E3o em estado "alternativo" edit_cell_disabled_tooltip=Pr\u00E9-visualiza\u00E7\u00E3o em estado "desabilitado" edit_cell_marked_tooltip=Pr\u00E9-visualiza\u00E7\u00E3o em estado "marcado" edit_act_testAction=Pr\u00E9-visualiza\u00E7\u00E3o da atividade edit_act_testAction_tooltip=Pr\u00E9-visualiza\u00E7\u00E3o e teste da atividade edit_act_panels_description=Descri\u00E7\u00E3o edit_act_panels_description_tooltip=T\u00EDtulo e descri\u00E7\u00E3o da atividade edit_act_panels_options=Op\u00E7\u00F5es edit_act_panels_options_tooltip=Op\u00E7\u00F5es da atividade edit_act_panels_frame=Janela edit_act_panels_frame_tooltip=Aspecto, tamanho e posi\u00E7\u00E3o da janela de atividades edit_act_panels_messages=Mensagens edit_act_panels_messages_tooltip=Conte\u00FAdo das mensagens da atividade edit_act_panels_panel=Painel edit_act_panels_panel_tooltip=Conte\u00FAdos do painel edit_style_title=Estilo edit_style_tooltip=Defina a cor, a fonte e o tamanho das c\u00E9lulas edit_act_style=Estilo: edit_act_overlap=Evite a sobreposi\u00E7\u00E3o de texto/imagem edit_act_overlap_tooltip=Tente evitar a sobreposi\u00E7\u00E3o da imagem com o texto edit_media_exists_1=O arquivo edit_media_exists_2=j\u00E1 existe na biblioteca de m\u00EDdia! edit_act_shaper=Moldador: edit_act_shaper_err=Erro do moldador: edit_act_num_cols=Colunas: edit_act_num_rows=Filas: edit_act_toothHeightFactor=Altura dos dentes: edit_act_toothWidthFactor=Largura dos dentes: edit_act_toothRandom=Distribui\u00E7\u00E3o aleat\u00F3ria edit_act_shaper_properties=Propriedades do moldador edit_act_panels_text=Texto edit_act_panels_text_tooltip=Texto da atividade action_saveFile_caption=Salvar... action_saveFile_keys=SS action_saveFile_tooltip=Salva (guarda) o projeto atual action_docTree_caption=\u00C1rvore de documentos... action_docTree_keys=A* action_docTree_tooltip=Mostre os documentos do projeto na forma de \u00E1rvore edit_docTree_title=\u00C1rvore de documentos edit_media_referencedBy=Referenciado por: msg_prompt_loadReferences=Aviso:

Este projeto conecta-se com outros projetos.
Voc\u00EA quer explorar as conex\u00F5es (links) e carregar todos os arquivos relacionados?

(\u00C9 aconselh\u00E1vel responder SIM ao importar atividades do Clic 3.0) edit_mc_type=Tipo: edit_mc_type_unknown=Desconhecido edit_mc_type_sound=Toque som edit_mc_type_video=Toque v\u00EDdeo edit_mc_type_midi=Toque MIDI edit_mc_type_cdaudio=Toque CD de audio edit_mc_type_record=Grave som edit_mc_type_play_recorded=Toque som gravado edit_mc_type_run_activity=V\u00E1 para a atividade edit_mc_type_run_sequence=V\u00E1 para a sequ\u00EAncia edit_mc_type_run_external=Execute o programa edit_mc_type_url=Mostre a URL edit_mc_type_exit=Fim edit_mc_type_return=Retorne edit_mc_level=N\u00EDvel de prioridades: edit_mc_file=Arquivo: edit_mc_externalParam=Par\u00E2metros: edit_mc_from=De: edit_mc_to=At\u00E9: edit_mc_length=Comprimento m\u00E1ximo: edit_mc_recBuffer=Fita gravada: edit_mc_stretch=Tamanho do trajeto edit_mc_location=Localiza\u00E7\u00E3o: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=De: edit_mc_location_from_box=C\u00E9lula edit_mc_location_from_window=Janela edit_mc_location_from_frame=Quadro edit_mc_loop=La\u00E7o de reprodu\u00E7\u00E3o edit_mc_autostart=In\u00EDcio autom\u00E1tico edit_mc_catchmouse=Capture o mouse edit_mc_title=Multim\u00EDdia e conte\u00FAdo ativo edit_mc_label=Conte\u00FAdo ativo: edit_media_dlg_title=Sele\u00E7\u00E3o de objetos multim\u00EDdia edit_media_title=Biblioteca de m\u00EDdias edit_mc_pos_cell=Centralizado sobre a c\u00E9lula edit_mc_pos_window=Centralizado sobre a janela edit_mc_pos_absolute=Especifique posi\u00E7\u00E3o: edit_tree_badFormat=Informa\u00E7\u00F5es ou estruturas de \u00E1rvore incorretas! edit_act_panels_controls=Controles edit_act_panels_controls_tooltip=Op\u00E7\u00F5es para bot\u00F5es e contadores edit_act_class=Tipo: edit_act_gridLayout=Formata\u00E7\u00E3o da grade (layout): edit_act_gridLayout_tooltip=Posi\u00E7\u00E3o relativa dos pain\u00E9is A e B. edit_act_inverseResolution=Resolu\u00E7\u00E3o inversa edit_act_inverseResolution_tooltip=A atividade \u00E9 solucionada quando todos os elementos selecionados de "B" corresponderem aos seus pares opostos. edit_act_showAllArrows=Mostre todas as setas edit_act_alt=Conte\u00FAdo alternativo: edit_act_alt_tooltip=Conte\u00FAdo exibido em c\u00E9lulas solucionadas e em c\u00E9lulas n\u00E3o-atribu\u00EDdas. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Edite o conte\u00FAdo alternativo edit_act_grid=Grade edit_act_grid_A=Grade A edit_act_grid_B=Grade B edit_act_grid_layout=Formata\u00E7\u00E3o (layout) edit_act_grid_relationship=Relacionamento edit_seq_activity_header=atividade edit_seq_tag_header=etiqueta edit_seq_jump_header=pule para edit_seq_activity=Atividade: edit_seq_tag=R\u00F3tulo: edit_seq_description=Descri\u00E7\u00E3o: edit_seq_auto=Continue automaticamente edit_seq_delay=Atraso: edit_seq_action_fwd=Avance edit_seq_action_back=Volte edit_seq_action_jump=Pule para... edit_seq_action_stop=Pare edit_seq_action_return=Retorne edit_seq_action_exit=Sair do JClic edit_seq_arrow_fwd=Seta adiante: edit_seq_arrow_back=Seta retorno: edit_seq_action=A\u00E7\u00E3o: edit_seq_button_enabled=Mostre bot\u00E3o edit_seq_project=Projeto do JClic: edit_act_absolute=Posi\u00E7\u00E3o absoluta edit_act_absolute_tooltip=O objeto ser\u00E1 localizado nas coordenadas X e Y especificadas edit_act_location=Localiza\u00E7\u00E3o: edit_seq_newElement=Novo elemento na sequ\u00EAncia... edit_seq_newElement_tooltip=Insira um novo elemento na sequ\u00EAncia de atividades edit_seq_newElement_msg=Por favor, selecione uma atividade para o novo elemento da sequ\u00EAncia. edit_seq_newElement_error_noAct=N\u00E3o \u00E9 poss\u00EDvel criar um novo elemento de sequ\u00EAncia sem uma atividade! edit_seq_newElement_error_emptyList=Este projeto n\u00E3o possui atividades! Incapaz de criar elementos de sequ\u00EAncia em um projeto vazio. edit_seq_jump_msg=Pular alvo: edit_seq_jump_title=Pular alvo edit_act_newActivity_tooltip=Adicione uma nova atividade ao projeto edit_act_prompt_class=Tipo de atividade: edit_act_prompt_name=Nome: edit_act_newActivity_msg=Favor, selecione o tipo de atividade a ser criado e nomeie-o: edit_act_newActivity_error_noAct=Voc\u00EA deve selecionar um tipo de atividade! edit_act_newActivity_error_noName=Voc\u00EA deve especificar um nome para a atividade! edit_act_newActivity_error_creating=Incapaz de criar a nova atividade! edit_act_newActivity_class=Nome da Classe Java: edit_text_act_format=Formato edit_text_act_answer=Resposta edit_text_act_popup=Pop up edit_text_act_answer_label=Respostas v\u00E1lidas: edit_list_newElement_tooltip=Adicione um novo elemento \u00E0 lista edit_list_editElement_tooltip=Edite o elemento selecionado na lista edit_list_deleteElement_tooltip=Apague o elemento selecionado na lista edit_list_upBtn_tooltip=Mover para cima edit_list_downBtn_tooltip=Mover para baixo edit_list_newValue=Novo texto: edit_list_addElement=Adicione um novo elemento da lista edit_list_modifyValue=Modifique o texto selecionado edit_text_act_target=Alvo edit_text_act_maxLen=Comprimento m\u00E1ximo: edit_text_act_maxLen_tooltip=Quantidade m\u00E1xima de caracteres na resposta. edit_text_act_fillingChar=Caractere de preenchimento edit_text_act_fillingChar_tooltip=Caractere utilizado para indicar uma lacuna edit_text_act_iniLen=Comprimento inicial: edit_text_act_iniLen_tooltip=N\u00FAmero de caracteres de preenchimento que ser\u00E3o exibidos no in\u00EDcio da atividade. edit_text_act_iniText=Texto inicial: edit_text_act_iniText_tooltip=Texto exibido na lacuna durante o in\u00EDcio da atividade. edit_text_act_list=Mostrar uma lista de op\u00E7\u00F5es: edit_text_act_list_tooltip=Exibir uma lista de op\u00E7\u00F5es a partir da qual o usu\u00E1rio deve selecionar uma. edit_text_act_check_title=Op\u00E7\u00F5es de corre\u00E7\u00E3o edit_text_act_popup_no=Sem janelas de destaque (pop up) edit_text_act_popup_always=Janelas de destaque (pop up) exibidas automaticamente edit_text_act_popup_onError=Janelas de destaque (pop up) em erros edit_text_act_popup_onDemand=Janelas de destaque (pop up) ao comando da tecla F1 edit_text_act_popup_type=Tipo: edit_text_act_popup_delay=Atraso da janela de destaque (pop up): edit_text_act_popup_maxTime=Tempo m\u00E1ximo: edit_text_act_popup_onlyPlay=Somente o som edit_text_act_err_noSelection=Voc\u00EA deve selecionar um fragmento do texto para criar um novo alvo! edit_text_act_err_badCharInSelection=Texto-alvo n\u00E3o pode possuir caracteres de "Enter" (nova linha) nem de "Tab" (tabula\u00E7\u00E3o). edit_text_act_err_nestedTargets=Alvos n\u00E3o podem ser aninhados! edit_text_act_err_cellInTarget=Alvos n\u00E3o podem conter c\u00E9lulas! edit_text_act_pageBgColor=Cor do papel: edit_text_act_editStylesBtn=Edite o estilo do documento... edit_text_act_mainStyle=Estilo principal: edit_text_act_tabSpc=Espa\u00E7o de tabula\u00E7\u00E3o (tab): edit_text_act_tabSize=Espa\u00E7os entre marcas de tabula\u00E7\u00E3o (tab): edit_text_act_colors=Cores: edit_text_act_targetStyle=Cores do alvo: edit_text_act_errorStyle=Cores de erro: edit_text_act_preview=Pr\u00E9-visualiza\u00E7\u00E3o: edit_text_act_styleSample_default_start=Texto padr\u00E3o edit_text_act_styleSample_target=alvo edit_text_act_styleSample_error=erro edit_text_act_styleSample_default_fill=texto padr\u00E3o edit_text_act_styleSample_default_end=texto padr\u00E3o. edit_text_act_warnDeleteTarget=Aviso: Esta a\u00E7\u00E3o suprimir\u00E1 o alvo atualmente selecionado. Voc\u00EA tem certeza de que quer continuar? edit_text_act_prevScreen_title=Tela anterior... edit_text_act_prevScreen_no=N\u00E3o exibir qualquer texto antes de iniciar a atividade edit_text_act_prevScreen_original=Exibir o texto completo do exerc\u00EDcio edit_text_act_prevScreen_special=Exibir este texto: edit_text_act_prevScreen_time=Tempo m\u00E1ximo: edit_text_act_edit_target=Alvo... edit_text_act_checkButton_show=Mostre o bot\u00E3o de corre\u00E7\u00E3o edit_text_act_checkButtonText=Texto do bot\u00E3o: edit_text_act_checkCase=Coincidir com a palavra inteira edit_text_act_checkAccents=Considerar acentos e caracteres especiais edit_text_act_checkPunct=Considerar marcas de pontua\u00E7\u00E3o edit_text_act_checkDoubleSpc=Permitir espa\u00E7os repetidos edit_text_act_checkOptions=Crit\u00E9rios edit_text_act_checkAutoJump=Siga para o pr\u00F3ximo alvo quando a lacuna for preenchida edit_text_act_checkForceOk=Siga somente quando a resposta estiver correta edit_text_act_checkDetail=Indique os erros letra por letra edit_text_act_checkDetail_params=Par\u00E2metros do algoritmo de an\u00E1lise: edit_text_act_checkDetail_steps=Passos: edit_text_act_checkDetail_field=Campos de explora\u00E7\u00E3o: edit_text_act_defaultCheckButtonText=Verifique edit_text_act_advancedCorrectionOptions=An\u00E1lise de respostas edit_text_act_check_bt=Corre\u00E7\u00E3o... edit_text_act_checkButton=Bot\u00E3o de corre\u00E7\u00E3o edit_text_act_checkProgress=Progresso edit_text_act_typeBtn=Tipo... edit_text_act_orderParagraphs=Ordenar par\u00E1grafos edit_text_act_orderWords=Ordenar palavras edit_text_act_order_amongstPar=Embaralhar palavras entre par\u00E1grafos edit_text_act_type_title=Tipos de atividades edit_text_act_warnChangeType=Esta a\u00E7\u00E3o ir\u00E1 limpar todos os alvos existentes. Voc\u00EA quer realmente prosseguir? edit_text_act_identWords=Identifique palavras edit_text_act_identChars=Identifique caracteres edit_media_change_name=Mudar nome... edit_media_change_file=Mudar arquivo... edit_media_includeInZip=Salvar em um arquivo zipado (ZIP) edit_media_type=Tipo de m\u00EDdia: edit_media_size=Tamanho do arquivo: edit_media_show_type=Arquivos do tipo: edit_media_preview=Pr\u00E9-visualiza\u00E7\u00E3o da m\u00EDdia edit_media_preview_tooltip=Pr\u00E9-visualiza\u00E7\u00E3o dos recursos da m\u00EDdia edit_media_rename=Mudar nome do recurso edit_media_rename_title=Renomear edit_media_rename_prompt=Novo nome: edit_media_rename_invalid=Nome de recurso inv\u00E1lido! edit_media_rename_exists=Existe outro recurso com este nome! Cada recurso deve possuir um nome \u00FAnico. edit_media_chfile_invalid=Arquivo inv\u00E1lido! err_media_chfile_different=O arquivo deve ser do mesmo tipo edit_media_font_error=Incapaz de carregar fonte! edit_media_save_file=Salvar arquivo (extrair de um ZIP) edit_media_refresh_file=Atualizar conte\u00FAdo de m\u00EDdias a partir de um arquivo edit_media_warn_zipFileNotExternal=Este n\u00E3o \u00E9 um arquivo "real", mas um objeto localizado em um arquivo ZIP. Para utilizar esta fun\u00E7\u00E3o, um arquivo com o mesmo nome deve estar presente na pasta em que o arquivo zip est\u00E1 localizado. edit_activities=Atividades edit_sequences=Sequ\u00EAncias edit_media=Biblioteca de m\u00EDdias edit_media_tooltip=Gerenciar imagens e outros arquivos de m\u00EDdia utilizados no projeto edit_activities_tooltip=Criar e editar atividades do projeto edit_sequences_tooltip=Editar e criar sequ\u00EAncias de atividades edit_project_title=T\u00EDtulo: edit_project_title_tooltip=T\u00EDtulo do projeto edit_project=Projeto edit_project_tooltip=Editar propriedades do projeto edit_project_description=Descri\u00E7\u00E3o: edit_project_description_tooltip=Descri\u00E7\u00E3o geral do projeto edit_project_area=\u00C1reas: edit_project_area_tooltip=\u00C1reas curriculares do projeto edit_project_level=N\u00EDveis: edit_project_level_tooltip=N\u00EDveis educacionais do projeto edit_project_descriptors=Descri\u00E7\u00F5es: edit_project_descriptors_tooltip=Descri\u00E7\u00F5es do projeto (separadas por v\u00EDrgula) edit_project_languages=Idiomas: edit_project_languages_tooltip=Idiomas utilizados neste projeto edit_project_languages_modify=Altere a l\u00EDngua selecionada edit_project_languages_add=Escolha idioma a ser adicionado edit_project_languages_select=C\u00F3digo de idioma (ISO-639): edit_project_authors=Autores: edit_project_authors_tooltip=Pessoas envolvidas na cria\u00E7\u00E3o do projeto edit_project_author_name=Nome: edit_project_author_mail=e-mail: edit_project_author_rol=Fun\u00E7\u00E3o: edit_project_author_organization=Organiza\u00E7\u00E3o: edit_project_author_comments=Coment\u00E1rios: edit_project_author_url=URL: edit_project_author_name_tooltip=Nome do autor (obrigat\u00F3rio) edit_project_author_mail_tooltip=E-mail do autor (opcional) edit_project_author_rol_tooltip=Papel da pessoa no projeto: autor, colaborador, desenhista, sonoplasta... (opcional) edit_project_author_organization_tooltip=Escola, universidade, associa\u00E7\u00E3o... (opcional) edit_project_author_url_tooltip=P\u00E1gina da web pessoal (opcional) edit_project_author_comments_tooltip=Campo para outras informa\u00E7\u00F5es (opcional) edit_project_author_info=Informa\u00E7\u00E3o do autor: edit_project_author_add=Adicionar um autor \u00E0 lista edit_project_author_edit=Editar informa\u00E7\u00F5es do autor edit_project_org_name=Nome: edit_project_org_name_tooltip=Nome da escola edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=Endere\u00E7o de e-mail da escola edit_project_org_url=URL: edit_project_org_url_tooltip=P\u00E1gina da escola na web edit_project_org_address=Endere\u00E7o: edit_project_org_address_tooltip=Endere\u00E7o para correspond\u00EAncia edit_project_org_pc=CEP: edit_project_org_pc_tooltip=C\u00F3digo postal edit_project_org_city=Cidade: edit_project_org_city_tooltip=Cidade da escola edit_project_org_country=Pa\u00EDs: edit_project_org_state=Estado: edit_project_org_comments=Coment\u00E1rios: edit_project_org=Escola(s): edit_project_org_tooltip=Escola ou outra institui\u00E7\u00E3o envolvida no projeto edit_project_org_info=Informa\u00E7\u00F5es da organiza\u00E7\u00E3o: edit_project_org_add=Adicionar organiza\u00E7\u00E3o edit_project_org_edit=Editar dados da organiza\u00E7\u00E3o edit_project_org_country_tooltip=Pa\u00EDs, federa\u00E7\u00E3o, uni\u00E3o... edit_project_org_state_tooltip=Estado federado, comunidade, regi\u00E3o... edit_project_org_comments_tooltip=Outras informa\u00E7\u00F5es... edit_project_rev_date=Data: edit_project_rev_date_tooltip=Data de revis\u00E3o edit_project_rev_authors=Autores: edit_project_rev_authors_tooltip=Autores da revis\u00E3o edit_project_rev_description=Descri\u00E7\u00E3o: edit_project_rev_description_tooltip=Breve descri\u00E7\u00E3o das mudan\u00E7as realizadas edit_project_rev_comments=Coment\u00E1rios: edit_project_rev_comments_tooltip=Outras informa\u00E7\u00F5es relevantes edit_project_rev=Revis\u00F5es: edit_project_rev_tooltip=Hist\u00F3rico das modifica\u00E7\u00F5es principais realizadas no projeto edit_project_rev_add=Adicionar registro de revis\u00F5es edit_project_rev_edit=Editar registro de revis\u00F5es edit_project_rev_info=Dados de revis\u00E3o edit_media_objects=objetos edit_media_object=objeto edit_evsounds_start=In\u00EDcio da atividade: edit_evsounds_click=Clique no objeto: edit_evsounds_actionError=A\u00E7\u00E3o equivocada: edit_evsounds_actionOk=A\u00E7\u00E3o correta: edit_evsounds_finishedError=Atividade finalizada com erros: edit_evsounds_finishedOk=Atividade finalizada sem erros: edit_project_rev_err_nodesc=Erro: O campo de descri\u00E7\u00E3o n\u00E3o pode ser deixado em branco! edit_evsounds_dlg_title=Editar sons eventuais edit_project_evsounds=Sons eventuais: edit_project_evsounds_tooltip=Definir sons espec\u00EDficos para cada evento do JClic edit_act_evsounds=Sons eventuais: edit_act_evsounds_tooltip=Definir sons espec\u00EDficos para cada evento do JClic edit_evsounds_default=som padr\u00E3o edit_evsounds_disabled=desabilitado edit_evsounds_chk_tooltip=Habilitar ou desabilitar o som para este evento edit_evsounds_select_tooltip=Clique para selecionar um som para este evento, ou desabilite para utilizar o som padr\u00E3o action_newProject_caption=Novo projeto... action_newProject_keys=NN action_newProject_tooltip=Criar um novo projeto JClic edit_arith_op_from=De: edit_arith_op_from_tooltip=Valor m\u00EDnimo do operador edit_arith_op_to=At\u00E9: edit_arith_op_to_tooltip=Valor m\u00E1ximo do operador edit_arith_op_with=Com: edit_arith_op_with_tooltip=Se habilitado, o operador pode tamb\u00E9m ter esse valor edit_arith_op_fromList=Um a partir da lista: edit_arith_op_fromList_tooltip=Lista de valores poss\u00EDveis para o operador edit_arith_op_decimals=Decimais: edit_arith_op_decimals_tooltip=N\u00FAmero de decimais do operador edit_arith_op_dec0=# (inteiro) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=Primeiro operador edit_arith_secondOp=Segundo operador edit_arith_title=Arith2 para JClic edit_arith_operations=Opera\u00E7\u00F5es: edit_arith_operations_tooltip=Selecione o tipo de opera\u00E7\u00F5es a serem realizadas edit_arith_operations_plus=Adicionar edit_arith_operations_minus=Subtrair edit_arith_operations_multiply=Multiplicar edit_arith_operations_divide=Dividir edit_arith_unknown=Desconhecido: edit_arith_unknown_tooltip=Selecione o item que agir\u00E1 como um desconhecido edit_arith_unknown_aobx=O resultado \u00E9 o desconhecido edit_arith_unknown_aoxr=O segundo operador \u00E9 o desconhecido edit_arith_unknown_xobr=O primeiro operador \u00E9 o desconhecido edit_arith_unknown_axbr=A opera\u00E7\u00E3o \u00E9 desconhecida edit_arith_unknown_invert=Escreva o resultado no in\u00EDcio da express\u00E3o edit_arith_result=Resultado: edit_arith_result_notCarry=N\u00E3o carregue edit_arith_result_random=Aleat\u00F3rio edit_arith_result_asc=Crescente edit_arith_result_order=Ordenar por resultado: edit_arith_result_desc=Decrescente edit_arith_result_avoidDup=Evitar duplicados edit_arith_cond=Condi\u00E7\u00F5es: edit_arith_cond_ind=Indiferente edit_arith_cond_agb=O primeiro operador deve ser maior que o segundo edit_arith_cond_alb=O primeiro operador deve ser menor que o segundo edit_arith_cond_tooltip=Outras condi\u00E7\u00F5es edit_autocp=Gerador autom\u00E1tico de conte\u00FAdo: edit_autocp_tooltip=Selecione o tipo de gerador de conte\u00FAdo autom\u00E1tico para esta atividade. edit_autocp_block=Gerador de conte\u00FAdo edit_autocp_btn=Configura\u00E7\u00F5es... edit_autocp_btn_tooltip=Configure as especifica\u00E7\u00F5es do provedor de conte\u00FAdo edit_data=Editar dados edit_act=Editar atividade edit_acp=Editar provedor de conte\u00FAdo edit_acp_err_creating=Erro ao criar o provedor de conte\u00FAdo! edit_project_author_group=Cria\u00E7\u00E3o edit_project_description_block=Descri\u00E7\u00E3o edit_project_ui_block=Interface do usu\u00E1rio edit_act_description=Descri\u00E7\u00E3o: m_Edit=Editar m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=Nova atividade... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Inserir m_Insert_Mnemonic=I m_View=Visualizar m_View_Mnemonic=V action_editProject_caption=Projeto action_editProject_keys=PP action_editProject_tooltip=Editar configura\u00E7\u00F5es do projeto action_editMedia_caption=M\u00EDdia action_editMedia_keys=MM action_editMedia_tooltip=Editar a biblioteca de m\u00EDdia do projeto action_editActivities_caption=Atividades action_editActivities_keys=AA action_editActivities_tooltip=Editar as atividades action_editSeq_caption=Sequ\u00EAncias action_editSeq_keys=SS action_editSeq_tooltip=Editar as sequ\u00EAncias das atividades warn_project_modified=O atual projeto foi modificado. Voc\u00EA quer salvar as mudan\u00E7as? edit_project_descriptors_block=Descritores edit_media_new=Novo objeto de m\u00EDdia... edit_media_new_tooltip=Adicione uma nova imagem ou objeto de multim\u00EDdia \u00E0 biblioteca edit_media_new_keys=M* edit_seq_threshold=Limite de pontua\u00E7\u00E3o: edit_seq_threshold_tooltip_up=Selecione este modo quando a pontua\u00E7\u00E3o global for igual a / ou maior que... edit_seq_time=Limite de tempo: edit_seq_time_tooltip_up=Para selecionar este modo, o tempo gasto em atividades deve ser menor que... edit_seq_threshold_tooltip_down=Selecione este modo quando a pontua\u00E7\u00E3o global for menor que... edit_seq_time_tooltip_down=Selecione este modo quando o tempo gasto em atividades for maior que... edit_seq_condJump=Pulos condicionais edit_seq_condJump_tooltip=Definir pulos especiais a serem executados somente em condi\u00E7\u00F5es espec\u00EDficas edit_seq_condJump_upper_tooltip=Definir condi\u00E7\u00F5es de pulo para um n\u00EDvel superior edit_seq_condJump_lower=Pulo Inferior: edit_seq_condJump_upper=Pulo Superior: edit_seq_condJump_lower_tooltip=Definir condi\u00E7\u00F5es de pulo para um n\u00EDvel inferior edit_seq_action_tooltip_fw=A\u00E7\u00E3o definida para o bot\u00E3o "pr\u00F3ximo" edit_seq_action_tooltip_bk=A\u00E7\u00E3o definida para o bot\u00E3o "anterior" edit_seq_jump_tooltip=Definir o alvo do pulo edit_seq_action_tooltip=A\u00E7\u00E3o a ser realizada edit_seq_activity_tooltip=Atividade definida para este elemento da sequ\u00EAncia edit_seq_tag_tooltip=Etiqueta usada para fazer refer\u00EAncia a este elemento de sequ\u00EAncia (campo opcional) edit_seq_description_tooltip=Descri\u00E7\u00E3o do elemento da sequ\u00EAncia (campo opcional) edit_seq_button_enabled_tooltip=Habilitar ou desabilitar o bot\u00E3o de setas edit_seq_auto_tooltip=Seguir para a pr\u00F3xima atividade automaticamente quando a atual for finalizada edit_seq_delay_tooltip=Segundos de espera antes de realizar a mudan\u00E7a autom\u00E1tica edit_color_dlgTitle=Selecione uma cor edit_media_renaming=Por favor, espere enquanto o recurso est\u00E1 sendo renomeado... edit_act_cell_width=Largura: edit_act_cell_width_tooltip=Largura da c\u00E9lula (em pixels) edit_act_cell_height=Altura: edit_act_cell_height_tooltip=Altura da c\u00E9lula (em pixels) edit_act_hiddenWords=Palavras escondidas: edit_act_hiddenWords_tooltip=Lista das palavras escondidas localizadas no painel edit_act_wordSearch_panelB=Use o painel B edit_act_wordSearch_panelB_tooltip=Os conte\u00FAdos do segundo painel ser\u00E3o exibidos conforme as palavras forem encontradas edit_act_shaper_tooltip=Selecione o tipo de formatador a ser utilizado no painel edit_act_num_cols_tooltip=N\u00FAmero de colunas do painel edit_act_num_rows_tooltip=N\u00FAmero de linhas do painel edit_act_wildTransparent=Delimitadores transparentes edit_act_wildTransparent_tooltip=Trate os delimitadores (caixas pretas) como buracos transparentes edit_act_behavior_scramble_times=Embaralhar: edit_act_behavior_scramble_times_tooltip=N\u00FAmero de vezes para embaralhar edit_act_copy_title=Copiar atributos para... edit_act_copy_attributes=Atributos edit_act_copy_dest=Aplicar a: edit_act_copy_style_main=Janela Principal edit_act_copy_style_play=Janela de Jogos edit_act_copy_activities=Atividades a serem modificadas: edit_act_copyAttributes=Copiar atributos edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copiar os atributos da atividade atual para outras atividades edit_new_project_name=Nome do projeto: edit_new_project_name_tooltip=Nome descritivo do projeto em poucas palavras edit_new_project_filename=Nome do arquivo: edit_new_project_filename_tooltip=Nome do arquivo do projeto, sem a extens\u00E3o edit_new_project_folder=Pasta: edit_new_project_folder_tooltip=Nome da pasta em que o projeto ser\u00E1 armazenado edit_new_project_folder_browse=Procurar... edit_new_project_title=Criar novo projeto do JClic edit_new_project_err_empty=Erro: Projeto, arquivo e pasta devem ter nomes v\u00E1lidos (nomes nulos s\u00E3o inv\u00E1lidos). edit_new_project_warning_noEmptyFolder=Esta pasta j\u00E1 cont\u00E9m outro projeto do Clic 3.0 ou do JClic. A fim de evitar confus\u00F5es, recomenda-se manter cada projeto em uma pasta separada, mas esta n\u00E3o \u00E9 uma regra. Voc\u00EA realmente quer criar o novo projeto nesta pasta? edit_new_project_err_folderCreation=Erro: Incapaz de criar a pasta especificada! edit_act_copy_err_noSelection=Erro: Nenhuma atividade selecionada! Para usar esta fun\u00E7\u00E3o voc\u00EA deve selecionar atividades \u00E0s quais os atributos indicados ser\u00E3o aplicados. edit_act_copy_action_prefix=Copiando atributos para: edit_act_copy_margin=Margem edit_act_copy_bgColor=Cor do plano de fundo edit_act_copy_gradient=Gradiente edit_act_copy_bgImage=Imagem do plano de fundo edit_act_copy_border=Borda edit_act_copy_transparentBg=Plano de fundo transparente edit_act_copy_position=Posi\u00E7\u00E3o edit_act_copy_messages=Mensagens edit_act_copy_messages_ini=Estilo da mensagem inicial edit_act_copy_messages_end=Estilo da mensagem final edit_act_copy_messages_err=Estilo da mensagem de erro edit_act_copy_reports=Relat\u00F3rios edit_act_copy_rep_include=Incluir atividade no relat\u00F3rio edit_act_copy_rep_actions=Registrar a\u00E7\u00F5es edit_act_copy_interface=Interface do usu\u00E1rio edit_act_copy_skin=Skin (apar\u00EAncia da moldura) edit_act_copy_evSounds=Sons eventuais edit_act_copy_counters=Contadores edit_act_copy_cTime=Contador de tempo edit_act_copy_maxTime=Tempo m\u00E1ximo edit_act_copy_cTries=Contador de tentativas edit_act_copy_maxTries=M\u00E1ximo de tentativas edit_act_copy_cScore=Contador de acertos edit_act_copy_scramble=Embaralhar # vezes edit_act_copy_buttons=Bot\u00F5es edit_act_copy_btnHelp=Bot\u00E3o de Ajuda edit_act_copy_btnInfo=Bot\u00E3o de informa\u00E7\u00E3o edit_act_copy_grids=Grades edit_act_copy_gridA=Estilo da grade A edit_act_copy_gridB=Estilo da grade B edit_act_copy_textGrid=Estilo das grades de texto edit_act_copy_text=Atividades de texto edit_act_copy_fontFace=Fonte edit_act_copy_fontSize=Tamanho da fonte edit_act_copy_fontStyle=Estilo da fonte edit_act_copy_textColour=Cor principal do texto edit_act_copy_textTargetColour=Selecione o projeto jClic do qual as atividades ser\u00E3o importadas edit_act_copy_textErrorColour=Cor de erro edit_act_copy_tabSpace=Espa\u00E7o de tabula\u00E7\u00E3o edit_act_copy_messages_prev=Estilo da mensagem anterior edit_act_changeType=Alterar tipo de atividade edit_act_newActivity_class_tooltip=Nome completo da Classe a ser utilizada para construir a atividade (somente para usu\u00E1rios avan\u00E7ados!) edit_act_newActivity_other=Outro... edit_act_newActivity_info=Usu\u00E1rios avan\u00E7ados podem tamb\u00E9m criar tipos n\u00E3o-registrados de atividades do JClic. Somente escreva abaixo o nome completo da Classe, prefixado pelo pacote (como "com.acme.activities.FooActivity"). Classes de atividade devem extender edu.xtec.jclic.Activity, e devem ser acess\u00EDveis para o carregador de classes JVM (JVM classloader). edit_act_newActivity_name=Nome da atividade: edit_act_newActivity_name_tooltip=Cada atividade deve ter um nome \u00FAnico no projeto edit_act_changeType_warning=

Aviso: Alterar o tipo de atividade pode causar perda de alguns atributos e objetos da atividade atual. Realize esse procedimento com cuidado!

 

applet_codebase=Localiza\u00E7\u00E3o do c\u00F3digo do JClic: applet_codebase_tooltip=Endere\u00E7o (URL) apontando para a pasta com os arquivos de programas JClic e scripts applet_prev_text=C\u00F3digo HTML anterior: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Texto ou c\u00F3digo HTML a ser aplicado antes do applet applet_post_text=C\u00F3digo HTML posterior: applet_post_text_tooltip=Texto ou c\u00F3digo HTML a ser aplicado ap\u00F3s o applet applet_size=Tamanho do applet: applet_size_tooltip=largura e altura do applet, em valores absolutos ou percentuais. applet_page_title=T\u00EDtulo da p\u00E1gina: applet_page_title_tooltip=Texto a ser exibido no topo da janela do navegador applet_created_info=A p\u00E1gina "%s" foi criada com sucesso. applet_created_prompt=Voc\u00EA quer abrir a p\u00E1gina com o navegador agora? action_createHTML_caption=Criar p\u00E1gina da web... applet_create_title=Cria\u00E7\u00E3o da p\u00E1gina HTML com um applet do JClic action_createHTML_tooltip=Criar uma p\u00E1gina HTML com um applet do JClic contendo o atual projeto applet_filename=Nome do arquivo: applet_filename_tooltip=Nome do arquivo HTML a ser criado action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Valores padr\u00E3o utilizados na cria\u00E7\u00E3o da p\u00E1gina da web applet_bgcolor=Cor do plano de fundo: applet_bgcolor_tooltip=Cor do plano de fundo da p\u00E1gina HTML applet_centered=Centralizado applet_centered_tooltip=Exibir o applet centralizado horizontalmente applet_width_tooltip=Largura do applet (absoluto ou percentual) applet_height_tooltip=Altura do applet (absoluto ou percentual) applet_exitUrl=Ao sair, v\u00E1 para: applet_exitUrl_tooltip=Ao sair, redirecionar a navega\u00E7\u00E3o do JClic para o endere\u00E7o (URL) applet_infoFrame=Nome do quadro de informa\u00E7\u00F5es: applet_infoFrame_tooltip=Nome do quadro utilizado para exibir conte\u00FAdos relacionados com o bot\u00E3o "informa\u00E7\u00F5es" action_createInstaller_caption=Criar instalador do projeto... action_createInstaller_keys=I* action_createInstaller_tooltip=Criar um script instalador de projeto para o JClic player installer_caption=Editar script instalador de projetos installer_title=T\u00EDtulo: installer_title_tooltip=T\u00EDtulo de projeto, a ser mostrado no auxiliar de instala\u00E7\u00E3o installer_authors=Autores: installer_authors_tooltip=Autor/es do projeto (texto curto) installer_folder=Pasta: installer_folder_tooltip=Nome da pasta a ser sugerido pelo auxiliar de instala\u00E7\u00E3o installer_files=Arquivos a serem copiados: installer_files_tooltip=Arquivos a serem copiados pelo instalador installer_files_available=Arquivos dispon\u00EDveis installer_files_selected=Arquivos selecionados installer_files_add=>> adicionar >> installer_files_add_tooltip=Adicionar \u00E0 lista o arquivo selecionado installer_files_remove=<< remover << installer_files_remove_tooltip=Remover da lista o arquivo selecionado installer_button=Bot\u00E3o de in\u00EDcio installer_button_tooltip=Propriedades do bot\u00E3o a ser exibido na biblioteca de projetos installer_button_project=Projeto principal: installer_button_project_tooltip=Projeto JClic a ser iniciado pelo bot\u00E3o installer_button_text=R\u00F3tulo: installer_button_text_tooltip=R\u00F3tulo de texto curto, a ser exibido dentro do bot\u00E3o installer_button_icon=\u00CDcone: installer_button_icon_tooltip=Imagem a ser utilizada como \u00EDcone do bot\u00E3o. Deixe em branco para usar o \u00EDcone padr\u00E3o do JClic. installer_button_description=Descri\u00E7\u00E3o installer_button_description_tooltip=Dica a ser exibida pelo bot\u00E3o installer_error_noTitle=Erro: Est\u00E1 faltando o t\u00EDtulo do projeto installer_error_noBaseFolder=Erro: Est\u00E1 faltando o nome da pasta installer_error_noFilesSelected=Erro: Nenhum arquivo selecionado installer_error_noButtonText=Erro: Est\u00E1 faltando o r\u00F3tulo de texto do bot\u00E3o de in\u00EDcio installer_error_projectNotInFiles=Erro: O projeto definido pelo bot\u00E3o de in\u00EDcio n\u00E3o est\u00E1 na lista de arquivos a serem copiados applet_page_full=Applet de p\u00E1gina cheia applet_page_mixed=Applet com dimens\u00F5es espec\u00EDficas edit_text_align_left=Alinhar texto \u00E0 esquerda edit_text_align_center=Centralizar texto edit_text_align_right=Alinhar texto \u00E0 direita edit_text_act_target_toggle=Criar ou remover alvo edit_text_act_insertCell=Inserir uma c\u00E9lula edit_text_act_content=Conte\u00FAdo edit_text_act_style=Estilo edit_cell_size=Tamanho da c\u00E9lula: edit_project_orphanActivities=As seguintes atividades n\u00E3o aparecem em sequ\u00EAncias de atividade do projeto, portanto nunca ser\u00E3o exibidas: edit_project_orphanMedia=Os seguintes objetos de m\u00EDdia n\u00E3o est\u00E3o sendo usados diretamente em nenhuma atividade: edit_project_orphanActivities_prompt=Voc\u00EA quer adicion\u00E1-los ap\u00F3s a \u00FAltima atividade da sequ\u00EAncia? edit_project_orphanMedia_prompt=Voc\u00EA quer remov\u00EA-los? edit_project_orphanMedia_title=Remo\u00E7\u00E3o de objetos de m\u00EDdia n\u00E3o utilizados edit_project_orphanActivities_title=Atividades isoladas edit_media_refreshAll=Atualizar todo o conte\u00FAdo de m\u00EDdia edit_media_refreshAll_tooltip=Atualizar todos os objetos de m\u00EDdia recarregando estes arquivos edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Atualizando m\u00EDdia... edit_media_exportAll=Exportar toda m\u00EDdia edit_media_exportAll_tooltip=Salvar em arquivos todo o conte\u00FAdo de todos os elementos de m\u00EDdia edit_media_exportAll_keys=X* edit_shape_select=Selecione edit_shape_addPoint=Adicione ponto edit_shape_deletePoint=Apague edit_shape_drawRect=Desenhe ret\u00E2ngulo edit_shape_drawEllipse=Desenhe elipse edit_shape_drawPoly=Desenhe pol\u00EDgono edit_shape_toLine=Converter para linha edit_shape_toBezier=Converter para curva B\u00E9zier edit_shape_toQuad=Converter para curva quadratica edit_shape_rLeft=Girar esquerda edit_shape_rRight=Girar direita edit_shape_expand=Expandir edit_shape_contract=Contrair edit_shape_zoomIn=Zoom + edit_shape_zoomOut=Zoom - edit_shape_aproxPoints=Unir os pontos mais pr\u00F3ximos edit_shape_showPoints=Mostrar pontos edit_shape_showPoints_tooltip=Mostrar/ Ocultar os pontos edit_shape_gridSize=Tamanho da grade: edit_shape_hideGrid=Mostrar/ Ocultar a grade edit_shape_magnetRadius=Raio de Magneto: edit_shape_elements=Elementos definidos edit_shape_elemName=Nome do elemento selecionado edit_shape_magnetRadius_tooltip=Ativar Raio de Magneto,quando habilitado edit_shape_gridSize_tooltip=Tamanho da grade edit_mc_activity=Atividade: edit_mc_sequence=Sequ\u00EAncia: edit_mc_url=URL: edit_mc_project=Projeto: edit_mc_activity_selection=Escolha atividade edit_mc_sequence_selection=Escolha sequ\u00EAncia edit_mc_err_nullContent=Dados insuficientes! edit_act_arrowColor=Cor da seta: edit_act_arrowColor_tooltip=Cor utilizada pelo editor para desenhar as setas (n\u00E3o exatamente, porque uma m\u00E1scara de bit XOR \u00E9 utilizada) edit_act_editActivity=Editar... edit_act_editActivity_tooltip=Editar a atividade selecionada action_saveFileAs_caption=Salvar como... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Salva o projeto atual com um nome diferente edit_act_behavior_block=Comportamento edit_act_behavior=Comportamento edit_act_behavior_drag=Arrastar edit_act_behavior_drag_tooltip=Arrastar c\u00E9lulas em vez de usar linhas de conex\u00E3o edit_act_behavior_order=Verificar ordem de solu\u00E7\u00E3o edit_act_behavior_order_tooltip=As c\u00E9lulas devem ser solucionadas em ordem edit_act_scramble=Embaralhar action_importActivities_caption=Importar atividades... action_importActivities_keys=I* action_importActivities_tooltip=Importar atividades de outro projeto import_warn_samefile=O arquivo selecionado corresponde ao projeto atual. Atividades podem ser importadas apenas de projetos diferentes. Por favor, escolha outro arquivo de projeto. import_selectActivities=Selecione uma ou mais atividades para importar ao projeto atual: import_importing=Importando... import_checkdep=Verificando depend\u00EAncias... import_impmedia=Importando m\u00EDdia: import_impact=Importanto atividade: import_selectProject=Selecione o projeto jClic do qual as atividades ser\u00E3o importadas edit_tagRep_tags=Marcas edit_tagRep_tagStart=Marcas de in\u00EDcio: edit_tagRep_tagStart_tooltip=Marca usada para indicar come\u00E7o de etiqueta edit_tagRep_tagEnd=Marca final: edit_tagRep_tagEnd_tooltip=Marca que indica final de etiqueta edit_tagRep_file=Arquivo edit_tagRep_fileName=Arquivo ou URL: edit_tagRep_fileName_tooltip=Nome ou URL do arquivo com os valores que substituir\u00E3o as etiquetas edit_tagRep_charset=Codifica\u00E7\u00E3o de caracteres: edit_tagRep_charset_tooltip=Codifica\u00E7\u00E3o de caracteres usada no arquivo edit_tagRep_browseFile=Procurar... edit_tagRep_browseFile_tooltip=Procurar entre os arquivos edit_tagRep_title=Substituir etiqueta edit_text_act_clearStylesBtn=Apagar estilos de texto... edit_text_act_clearStylesPrompt=Alerta: Essa a\u00E7\u00E3o ir\u00E1 apagar os atributos de caracteres espec\u00EDficos aplicados ao documento, devolvendo-o ao seu estilo principal. Essa a\u00E7\u00E3o n\u00E3o poder\u00E1 ser desfeita. Deseja continuar? img_max_size=Tamanho m\u00E1ximo das imagens: img_max_width_tooltip=Largura m\u00E1xima das imagens importadas para a biblioteca. img_max_height_tooltip=Altura m\u00E1xima das imagens importadas para a biblioteca. img_resize_prompt=A imagem "%s" possui %s pixels. Ela est\u00E1 maior que o permitido pelo JClic Author (%s). Deseja redimension\u00E1-la? src/author/edu/xtec/resources/messages/AuthorMessages_ru.properties000066400000000000000000002164471335566474600263270ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 edit_act_name_tooltip=\u0418\u043C\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 edit_act_name=\u0418\u043C\u044F: edit_act_description_tooltip=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 edit_act_reports_block=\u041E\u0442\u0447\u0451\u0442\u044B edit_act_includeInReports=\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u044D\u0442\u0443 \u0434\u0435\u044F\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0432 \u043E\u0442\u0447\u0435\u0442\u044B edit_act_includeInReports_tooltip=\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u044D\u0442\u043E\u0439 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 \u0432 \u043E\u0442\u0447\u0435\u0442\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 edit_act_code=\u041A\u043E\u0434: edit_act_code_tooltip=\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043A\u043E\u0434, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0433\u0440\u0443\u043F\u043F\u0438\u0440\u043E\u0432\u043A\u0438 \u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0447\u0435\u0442\u043E\u0432. edit_act_reportActions=\u041E\u0442\u0447\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F edit_act_reportActions_tooltip=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044F \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u043E \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F\u0445, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\u043C\u0438 edit_act_counters_block=\u0421\u0447\u0435\u0442\u0447\u0438\u043A\u0438 edit_act_timeCounter=\u0421\u0447\u0435\u0442\u0447\u0438\u043A \u0432\u0440\u0435\u043C\u0435\u043D\u0438 edit_act_timeCounter_tooltip=\u0421\u043A\u0440\u044B\u0442\u044C/\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u0447\u0435\u0442\u0447\u0438\u043A \u0432\u0440\u0435\u043C\u0435\u043D\u0438 edit_act_actionsCounter=\u0421\u0447\u0435\u0442\u0447\u0438\u043A \u043F\u043E\u043F\u044B\u0442\u043E\u043A edit_act_actionsCounter_tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C/\u0441\u043A\u0440\u044B\u0442\u044C \u0441\u0447\u0435\u0442\u0447\u0438\u043A \u043F\u043E\u043F\u044B\u0442\u043E\u043A edit_act_scoreCounter=\u0411\u0430\u043B\u044B edit_act_scoreCounter_tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C/\u0441\u043A\u0440\u044B\u0442\u044C \u0431\u0430\u043B\u044B edit_act_maxTime=\u041C\u0430\u043A\u0441. \u0432\u0440\u0435\u043C\u044F: edit_act_maxTime_tooltip=\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E \u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u043E\u0435 \u0432\u0440\u0435\u043C\u044F \u0434\u043B\u044F \u0440\u0435\u0448\u0435\u043D\u0438\u044F \u0432 \u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445, \u0435\u0441\u043B\u0438 0, \u0442\u043E \u0432\u0440\u0435\u043C\u044F \u043D\u0435 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043E. edit_act_countdown=\u041E\u0431\u0440\u0430\u0442\u043D\u044B\u0439 \u043E\u0442\u0441\u0447\u0451\u0442 edit_act_countdown_tooltip=\u0421\u0447\u0435\u0442\u0447\u0438\u043A \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442 \u0441 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F, \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044F\u0441\u044C \u0434\u043E 0. edit_act_maxActions=\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u043F\u043E\u043F\u044B\u0442\u043E\u043A edit_act_maxActions_tooltip=\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043D\u044B\u0445 \u043F\u043E\u043F\u044B\u0442\u043E\u043A , \u0435\u0441\u043B\u0438 0, \u0442\u043E \u0431\u0435\u0437 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0439. edit_act_buttons_block=\u041A\u043D\u043E\u043F\u043A\u0438 edit_act_helpBtn=\u041F\u043E\u043C\u043E\u0449\u044C edit_act_helpBtn_tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C / \u0441\u043A\u0440\u044B\u0442\u044C \u043A\u043E\u043D\u043F\u043A\u0443 \u043F\u043E\u043C\u043E\u0449\u0438 edit_act_helpBtn_solution=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0440\u0435\u0448\u0435\u043D\u0438\u0435. edit_act_helpBtn_msg=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u044D\u0442\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435: edit_act_infoBtn=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F edit_act_infoBtn_tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C / \u0421\u043A\u0440\u044B\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 edit_act_infoBtn_url=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u044D\u0442\u0443 URL-\u0441\u0441\u044B\u043B\u043A\u0443: edit_act_infoBtn_cmd=\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443: edit_act_infoBtn_url_tooltip=\u0410\u0434\u0440\u0435\u0441 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0443 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 edit_act_infoBtn_cmd_tooltip=\u041A\u043E\u043C\u0430\u043D\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0434\u043B\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043D\u043E\u043F\u043A\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438. edit_act_mainWindow=\u0413\u043B\u0430\u0432\u043D\u043E\u0435 \u043E\u043A\u043D\u043E: edit_act_gameWindow=\u0418\u0433\u0440\u043E\u0432\u043E\u0435 \u043E\u043A\u043D\u043E: edit_act_margin=\u041F\u043E\u043B\u044F: edit_act_margin_tooltip=\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0439 \u0438 \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u043C\u0435\u0436\u0434\u0443 \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u044B\u043C\u0438 \u043E\u0431\u044A\u0435\u043A\u0442\u0430\u043C\u0438. edit_act_bgColor=\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430: edit_act_bgColor_tooltip=\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0444\u043E\u043D\u0430. edit_gradient_startColor=\u0418\u0441\u0445\u043E\u0434\u043D\u044B\u0439 \u0446\u0432\u0435\u0442 edit_gradient_endColor=\u041A\u043E\u043D\u0435\u0447\u043D\u044B\u0439 \u0446\u0432\u0435\u0442: edit_gradient_startColor_tooltip=\u0412\u044B\u0431\u043E\u0440 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0446\u0432\u0435\u0442\u0430 edit_gradient_endColor_tooltip=\u0412\u044B\u0431\u043E\u0440 \u043A\u043E\u043D\u0435\u0447\u043D\u043E\u0433\u043E \u0446\u0432\u0435\u0442\u0430 edit_gradient_cycles=\u0426\u0438\u043A\u043B\u044B: edit_gradient_cycles_tooltip=\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0433\u0440\u0430\u0434\u0438\u0435\u043D\u0442\u043D\u044B\u0445 \u043F\u043E\u0432\u0442\u043E\u0440\u043E\u0432 \u0432 \u0440\u0438\u0441\u0443\u043D\u043A\u0435 edit_gradient_orientation=\u041E\u0440\u0438\u0435\u043D\u0442\u0430\u0446\u0438\u044F: edit_gradient_orientation_tooltip=\u041E\u0440\u0438\u0435\u043D\u0442\u0430\u0446\u0438 \u0433\u0440\u0430\u0434\u0438\u0435\u043D\u0442\u0430, \u0438\u0437\u043C\u0435\u0440\u044F\u0435\u0442\u0441\u044F \u0432 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u0445 \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438. edit_act_gradient=\u0413\u0440\u0430\u0434\u0438\u0435\u043D\u0442: edit_act_gradient_tooltip=\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043D\u0442 \u0446\u0432\u0435\u0442\u0430 edit_color_opacity=\u041F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C edit_color_opacity_tooltip=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0446\u0432\u0435\u0442\u0430 \u0430\u043B\u044C\u0444\u0430 \u043A\u0430\u043D\u0430\u043B\u0430 (\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C). edit_gradient_title=\u0413\u0440\u0430\u0434\u0438\u0435\u043D\u0442 edit_gradient_default=\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E (\u043F\u0443\u0441\u0442\u043E\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043D\u0442) edit_act_image=\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435: edit_act_descriptionTab=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 edit_act_descriptionTab_tooltip=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0438 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 edit_act_tiledBgImg=\u0427\u0435\u0440\u0435\u043F\u0438\u0446\u0435\u0439 edit_act_tiledBgImg_tooltip=\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0432\u0441\u044E \u043F\u043E\u0432\u0435\u0440\u0445\u043D\u043E\u0441\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C, \u043F\u043E \u043C\u0435\u0440\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u044F \u0435\u0433\u043E \u043F\u043E X \u0438 Y \u043E\u0441\u0438. edit_act_preview=\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440: edit_act_border=\u0413\u0440\u0430\u043D\u0438\u0446\u0430 edit_act_border_tooltip=\u041D\u0430\u0440\u0438\u0441\u0443\u0439\u0442\u0435 \u043B\u0438\u043D\u0438\u044E \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432\u043E\u043A\u0440\u0443\u0433 \u043E\u043A\u043D\u0430 edit_act_transparent=\u041F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C edit_act_transparent_tooltip=\u041E\u043A\u043D\u043E \u0438\u043C\u0435\u0435\u0442 \u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u0439 \u0444\u043E\u043D edit_act_width=\u0428\u0438\u0440\u0438\u043D\u0430: edit_act_height=\u0412\u044B\u0441\u043E\u0442\u0430: edit_act_width_tooltip=\u0428\u0438\u0440\u0438\u043D\u0430 \u043E\u0431\u044A\u0435\u043A\u0442\u0430, \u0438\u0437\u043C\u0435\u0440\u044F\u0435\u043C\u0430\u044F \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445 edit_act_height_tooltip=\u0412\u044B\u0441\u043E\u0442\u0430 \u043E\u0431\u044A\u0435\u043A\u0442\u0430, \u0438\u0437\u043C\u0435\u0440\u044F\u0435\u043C\u0430\u044F \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445 edit_act_centered=\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443 edit_act_centered_tooltip=\u041E\u0431\u044A\u0435\u043A\u0442 \u0431\u0443\u0434\u0435\u0442 \u0446\u0435\u043D\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D \u043D\u0430\u0434 \u0433\u043B\u0430\u0432\u043D\u044B\u043C \u043E\u043A\u043D\u043E\u043C edit_act_x=X: edit_act_x_tooltip=\u0410\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0430\u044F \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F edit_act_y=Y: edit_act_y_tooltip=\u0410\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0430\u044F \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F edit_act_ui_block=\u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 edit_act_image_tooltip=\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 edit_act_text=\u0422\u0435\u043A\u0441\u0442: edit_act_text_tooltip=\u0422\u0435\u043A\u0441\u0442 \u0434\u043B\u044F \u043F\u043E\u043A\u0430\u0437\u0430 \u0432\u043D\u0443\u0442\u0440\u0438 \u044D\u0442\u043E\u0433\u043E \u043E\u0431\u044A\u0435\u043A\u0442\u0430 edit_font_face=\u0428\u0440\u0438\u0444\u0442 edit_font_size=\u0420\u0430\u0437\u043C\u0435\u0440 edit_font_bold=\u0416\u0438\u0440\u043D\u044B\u0439 edit_font_italic=\u041A\u0443\u0440\u0441\u0438\u0432 edit_font_underline=\u041F\u043E\u0434\u0447\u0451\u0440\u043A\u043D\u0443\u0442\u044B\u0439 edit_font_style=\u0421\u0442\u0438\u043B\u044C: edit_cell_title=\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u044F\u0447\u0435\u0439\u043A\u0438 edit_act_messages=\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F edit_act_msg_initial=\u041F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435: edit_act_msg_final=\u0417\u0430\u043A\u043B\u044E\u0447\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435: edit_act_msg_prev=\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435: edit_act_msg_error=\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0435: edit_act_msg_initial_tooltip=\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435, \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C\u043E\u0435 \u043F\u0440\u0438 \u043D\u0430\u0447\u0430\u043B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F edit_act_msg_final_tooltip=\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435, \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C\u043E\u0435 \u043F\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F edit_act_msg_error_tooltip=\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435, \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u043C\u043E\u0435 \u043F\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0441 \u043E\u0448\u0438\u0431\u043A\u0430\u043C\u0438 edit_act_msg_prev_tooltip=Message to be shown prior to the start of the activity (only in certain types of activities) edit_align=\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435: edit_act_textColor=\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430: edit_act_textColor_tooltip=\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 edit_act_shadowColor=\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438: edit_act_shadowColor_tooltip=\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043D\u0430\u043D\u0435\u0441\u0435\u043D\u0438\u044F \u0442\u0435\u043D\u0438 \u0442\u0435\u043A\u0441\u0442\u0430, \u043A\u043E\u0433\u0434\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F edit_act_shadow=\u0422\u0435\u043D\u044C edit_act_shadow_tooltip=\u0420\u0438\u0441\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u0441 \u0442\u0435\u043D\u044C\u044E edit_act_borderColor=\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B: edit_act_borderColor_tooltip=\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0440\u0438\u0441\u043E\u0432\u0430\u043D\u0438\u044F \u0433\u0440\u0430\u043D\u0438\u0446 \u044F\u0447\u0435\u0435\u043A edit_act_inactiveColor=\u0426\u0432\u0435\u0442 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F : edit_act_inactiveColor_tooltip=\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439, \u043A\u043E\u0433\u0434\u0430 \u044F\u0447\u0435\u0439\u043A\u0430 \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u0430 edit_act_altColor=\u0410\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0446\u0432\u0435\u0442: edit_act_altColor_tooltip=\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0440\u0438\u0441\u043E\u0432\u0430\u043D\u0438\u044F \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0432 \u0440\u0435\u0437\u0440\u0435\u0448\u0435\u043D\u043D\u044B\u0445 \u043A\u043B\u0435\u0442\u043A\u0430\u0445. edit_cell_marked=\u041E\u0442\u043C\u0435\u0447\u0435\u043D\u043D\u044B\u0435 edit_cell_disabled=\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E edit_cell_alt=\u0410\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E edit_cell_textMargin=\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0435 \u043F\u043E\u043B\u0435: edit_cell_textMargin_tooltip=\u0420\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u043C\u0435\u0436\u0434\u0443 \u0433\u0440\u0430\u043D\u0438\u0446\u0435\u0439 \u044F\u0447\u0435\u0435\u043A \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C. edit_cell_borderWidth=\u0428\u0438\u0440\u0438\u043D\u0430 \u0440\u0430\u043C\u043A\u0438: edit_cell_borderWidth_tooltip=\u0428\u0438\u0440\u0438\u043D\u0430 \u043B\u0438\u043D\u0438\u0438, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0439 \u0434\u043B\u044F \u0440\u0438\u0441\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0445 \u0433\u0440\u0430\u043D\u0438\u0446 edit_cell_markerWidth=Marker width: edit_cell_markerWidth_tooltip=\u0428\u0438\u0440\u0438\u043D\u0430 \u0447\u0435\u0440\u0442\u044B, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0439 \u0434\u043B\u044F \u0440\u0438\u0441\u043E\u0432\u0430\u043D\u0438\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u044B, \u043A\u043E\u0433\u0434\u0430 \u044F\u0447\u0435\u0439\u043A\u0430 \u043E\u0442\u043C\u0435\u0447\u0435\u043D\u0430 \u0438\u043B\u0438 \u0432\u044B\u0431\u0440\u0430\u043D\u0430 edit_cell_alt_tooltip=\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0432 "\u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u043C" \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 edit_cell_disabled_tooltip=\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0432 "\u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u043D\u043E\u043C" \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 edit_cell_marked_tooltip=\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0432 "\u043E\u0442\u043C\u0435\u0447\u0435\u043D\u043D\u043E\u043C" \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 edit_act_testAction=\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F edit_act_testAction_tooltip=\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F edit_act_panels_description=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 edit_act_panels_description_tooltip=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0438 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F edit_act_panels_options=\u041E\u043F\u0446\u0438\u0438 edit_act_panels_options_tooltip=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F edit_act_panels_frame=\u041E\u043A\u043D\u043E edit_act_panels_frame_tooltip=\u0412\u043D\u0435\u0448\u043D\u0438\u0439 \u0432\u0438\u0434, \u0440\u0430\u0437\u043C\u0435\u0440 \u0438 \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043E\u043A\u043D\u0430 \u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F edit_act_panels_messages=\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F edit_act_panels_messages_tooltip=\u0421\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F edit_act_panels_panel=\u041F\u0430\u043D\u0435\u043B\u044C edit_act_panels_panel_tooltip=\u0421\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435 \u043F\u0430\u043D\u0435\u043B\u0438 edit_style_title=\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 edit_style_tooltip=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0446\u0432\u0435\u0442 \u044F\u0447\u0435\u0439\u043A\u0438, \u0448\u0440\u0438\u0444\u0442 \u0438 \u0440\u0430\u0437\u043C\u0435\u0440 edit_act_style=\u0412\u0438\u0434: edit_act_overlap=\u0418\u0437\u0431\u0435\u0433\u0430\u0439\u0442\u0435 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0442\u0438\u044F \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u043E\u043C edit_act_overlap_tooltip=\u0421\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044C \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044C \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0442\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043D\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 edit_media_exists_1=\u0424\u0430\u0439\u043B edit_media_exists_2=\u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043C\u0435\u0434\u0438\u0430-\u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0435 ! edit_act_shaper=Shaper: edit_act_shaper_err=\u041E\u0448\u0438\u0431\u043A\u0430 \u0432\u0438\u0434\u043E\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F: edit_act_num_cols=\u041A\u043E\u043B\u043E\u043D\u043A\u0438: edit_act_num_rows=\u0421\u0442\u0440\u043E\u043A\u0438: edit_act_toothHeightFactor=Tooth height: edit_act_toothWidthFactor=Tooth width: edit_act_toothRandom=\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u043E\u0435 \u0440\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 edit_act_shaper_properties=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0440\u0430\u0441\u043A\u0440\u043E\u044F \u0440\u0438\u0441\u0443\u043D\u043A\u0430 edit_act_panels_text=\u0422\u0435\u043A\u0441\u0442 edit_act_panels_text_tooltip=\u0422\u0435\u043A\u0441\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F action_saveFile_caption=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C... action_saveFile_keys=SS action_saveFile_tooltip=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043F\u0440\u043E\u0435\u043A\u0442 action_docTree_caption=\u0414\u0435\u0440\u0435\u0432\u043E \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 ... action_docTree_keys=T* action_docTree_tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 edit_docTree_title=\u0414\u0435\u0440\u0435\u0432\u043E \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 edit_media_referencedBy=\u0421\u0441\u044B\u043B\u0430\u0435\u0442\u0441\u044F \u043D\u0430: msg_prompt_loadReferences=Warning:

\u042D\u0442\u043E\u0442 \u043F\u0440\u043E\u0435\u043A\u0442 \u0441\u0432\u044F\u0437\u0430\u043D \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430\u043C\u0438.
\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0444\u0430\u0439\u043B\u044B ?

(\u041D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043E\u0442\u0432\u0435\u0442\u0438\u0442\u044C \u0414\u0430 \u043F\u0440\u0438 \u0438\u043C\u043F\u043E\u0440\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F Clic 3.0) edit_mc_type=\u0428\u0440\u0438\u0444\u0442: edit_mc_type_unknown=\u041D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u043E edit_mc_type_sound=\u0412\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0437\u0432\u0443\u043A edit_mc_type_video=\u0412\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0432\u0438\u0434\u0435\u043E edit_mc_type_midi=\u0412\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 MIDI edit_mc_type_cdaudio=\u0412\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0430\u0443\u0434\u0438\u043E \u043A\u043E\u043C\u043F\u0430\u043A\u0442-\u0434\u0438\u0441\u043A edit_mc_type_record=\u0417\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0437\u0432\u0443\u043A\u043E\u0432\u043E\u0439 \u043E\u0442\u0440\u044B\u0432\u043E\u043A edit_mc_type_play_recorded=\u0412\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043D\u044B\u0439 \u0437\u0432\u0443\u043A\u043E\u0432\u043E\u0439 \u043E\u0442\u0440\u044B\u0432\u043E\u043A edit_mc_type_run_activity=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044E edit_mc_type_run_sequence=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438 edit_mc_type_run_external=\u0417\u0430\u043F\u0443\u0441\u043A \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B edit_mc_type_url=\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 edit_mc_type_exit=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0435 edit_mc_type_return=\u041D\u0430\u0437\u0430\u0434 edit_mc_level=\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0430: edit_mc_file=\u0424\u0430\u0439\u043B: edit_mc_externalParam=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B: edit_mc_from=\u041E\u0442: edit_mc_to=\u041A\u043E\u043C\u0443: edit_mc_length=\u041C\u0430\u043A\u0441. \u0434\u043B\u0438\u043D\u0430: edit_mc_recBuffer=\u0417\u0430\u043F\u0438\u0441\u044C edit_mc_stretch=\u0420\u0430\u0437\u043C\u0435\u0440 \u0440\u0430\u0441\u0442\u044F\u0433\u0438\u0432\u0430\u043D\u0438\u044F: edit_mc_location=\u0420\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=\u041E\u0442: edit_mc_location_from_box=\u042F\u0447\u0435\u0439\u043A\u0430 edit_mc_location_from_window=\u041E\u043A\u043D\u043E edit_mc_location_from_frame=\u0420\u0430\u043C\u043A\u0430 edit_mc_loop=Loop playback edit_mc_autostart=\u0410\u0432\u0442\u043E\u0437\u0430\u043F\u0443\u0441\u043A edit_mc_catchmouse=\u0417\u0430\u0445\u0432\u0430\u0442 \u043C\u044B\u0448\u0438 edit_mc_title=\u041C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0430 \u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 edit_mc_label=\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435: edit_media_dlg_title=\u0412\u044B\u0431\u043E\u0440 \u043C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0430 \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432 edit_media_title=\u041C\u0435\u0434\u0438\u0430\u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 edit_mc_pos_cell=\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443 \u043D\u0430\u0434 \u044F\u0447\u0435\u0439\u043A\u043E\u0439: edit_mc_pos_window=\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443 \u043D\u0430\u0434 \u043E\u043A\u043D\u043E\u043C: edit_mc_pos_absolute=\u041E\u0441\u043E\u0431\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F: edit_tree_badFormat=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0430\u044F \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u043B\u0438 \u0434\u0430\u043D\u043D\u044B\u0445! edit_act_panels_controls=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 edit_act_panels_controls_tooltip=\u041E\u043F\u0446\u0438\u0438 \u043A\u043D\u043E\u043F\u043E\u043A \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043A\u043E\u0432 edit_act_class=\u0428\u0440\u0438\u0444\u0442: edit_act_gridLayout=\u0420\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B: edit_act_gridLayout_tooltip=\u0412\u0437\u0430\u0438\u043C\u043D\u043E\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0430\u043D\u0435\u043B\u0435\u0439 \u0410 \u0438 B. edit_act_inverseResolution=\u041E\u0431\u0440\u0430\u0442\u043D\u043E\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 edit_act_inverseResolution_tooltip=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E, \u043A\u043E\u0433\u0434\u0430 \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B "\u0412" \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0442. edit_act_showAllArrows=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0441\u0435 \u0441\u0442\u0440\u0435\u043B\u043A\u0438 edit_act_alt=\u0410\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435: edit_act_alt_tooltip=\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u043F\u043E\u043A\u0430\u0437\u0430\u043D\u043E \u0432 \u0440\u0435\u0448\u0435\u043D\u043D\u044B\u0445 \u0438 \u043D\u0435\u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044B\u0445 \u043A\u043B\u0435\u0442\u043A\u0430\u0445. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 edit_act_grid=\u0422\u0430\u0431\u043B\u0438\u0446\u0430 edit_act_grid_A=\u0422\u0430\u0431\u043B\u0438\u0446\u0430 \u0410 edit_act_grid_B=\u0422\u0430\u0431\u043B\u0438\u0446\u0430 \u0412 edit_act_grid_layout=\u0420\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 edit_act_grid_relationship=\u0412\u0437\u0430\u0438\u043C\u043E\u0441\u0432\u044F\u0437\u044C edit_seq_activity_header=\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C edit_seq_tag_header=\u0442\u0435\u0433 edit_seq_jump_header=\u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A edit_seq_activity=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435: edit_seq_tag=\u041C\u0435\u0442\u043A\u0430: edit_seq_description=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435: edit_seq_auto=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 edit_seq_delay=\u0417\u0430\u0434\u0435\u0440\u0436\u043A\u0430: edit_seq_action_fwd=\u0412\u043F\u0435\u0440\u0451\u0434 edit_seq_action_back=\u041D\u0430\u0437\u0430\u0434 edit_seq_action_jump=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A... edit_seq_action_stop=\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C edit_seq_action_return=\u041D\u0430\u0437\u0430\u0434 edit_seq_action_exit=\u0412\u044B\u0445\u043E\u0434 \u0438\u0437 JClic edit_seq_arrow_fwd=\u0421\u0442\u0440\u0435\u043B\u043A\u0430-\u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C \u0432\u043F\u0435\u0440\u0435\u0434: edit_seq_arrow_back=\u0421\u0442\u0440\u0435\u043B\u043A\u0430-\u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C \u0432\u043F\u0435\u0440\u0435\u0434:\u043D\u0430\u0437\u0430\u0434 edit_seq_action=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435: edit_seq_button_enabled=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 edit_seq_project=\u041F\u0440\u043E\u0435\u043A\u0442 JClic : edit_act_absolute=\u0410\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0430 \u043F\u043E\u0437\u0438\u0446\u0438\u044F: edit_act_absolute_tooltip=\u041E\u0431\u044A\u0435\u043A\u0442 \u0431\u0443\u0434\u0435\u0442 \u043F\u043E\u043C\u0435\u0449\u0435\u043D \u0432 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0435 X \u0438 Y \u043A\u043E\u043E\u0440\u0434\u0438\u043D\u0430\u0442\u044B edit_act_location=\u0420\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435: edit_seq_newElement=\u041D\u043E\u0432\u0430\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 ... edit_seq_newElement_tooltip=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0432 \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 edit_seq_newElement_msg=\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 \u0434\u043B\u044F \u043D\u043E\u0432\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438. edit_seq_newElement_error_noAct=\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438 \u0431\u0435\u0437 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438! edit_seq_newElement_error_emptyList=\u042D\u0442\u043E\u0442 \u043F\u0440\u043E\u0435\u043A\u0442 \u043D\u0435 \u0438\u043C\u0435\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438! \u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0432 \u043F\u0443\u0441\u0442\u043E\u0439 \u043F\u0440\u043E\u0435\u043A\u0442. edit_seq_jump_msg=\u0426\u0435\u043B\u044C \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430: edit_seq_jump_title=\u0426\u0435\u043B\u044C \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 edit_act_newActivity_tooltip=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u0432\u0438\u0434 \u0434\u0435\u0439\u0441\u044C\u0432\u0438\u044F \u0432 \u043F\u0440\u043E\u0435\u043A\u0442 edit_act_prompt_class=\u0412\u0438\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F: edit_act_prompt_name=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435: edit_act_newActivity_msg=\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0438\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0438 \u0434\u0430\u0439\u0442\u0435 \u0435\u043C\u0443 \u0438\u043C\u044F: edit_act_newActivity_error_noAct=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0432\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0438\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F! edit_act_newActivity_error_noName=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043D\u0430\u0437\u0432\u0430\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 edit_act_newActivity_error_creating=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0430\u043A\u0442\u0438\u0432\u043E\u0441\u0442\u044C! edit_act_newActivity_class=Java class name: edit_text_act_format=\u0424\u043E\u0440\u043C\u0430\u0442 edit_text_act_answer=\u041E\u0442\u0432\u0435\u0442 edit_text_act_popup=Pop up edit_text_act_answer_label=Valid answers: edit_list_newElement_tooltip=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0441\u043F\u0438\u0441\u043A\u0430 edit_list_editElement_tooltip=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0441\u043F\u0438\u0441\u043A\u0430 edit_list_deleteElement_tooltip=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0441\u043F\u0438\u0441\u043A\u0430 edit_list_upBtn_tooltip=\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u0432\u0435\u0440\u0445 edit_list_downBtn_tooltip=\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u043D\u0438\u0437 edit_list_newValue=\u041D\u043E\u0432\u044B\u0439 \u0442\u0435\u043A\u0441\u0442: edit_list_addElement=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0441\u043F\u0438\u0441\u043A\u0430 edit_list_modifyValue=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 edit_text_act_target=\u041E\u0431\u044A\u0435\u043A\u0442 edit_text_act_maxLen=\u041C\u0430\u043A\u0441. \u0434\u043B\u0438\u043D\u0430: edit_text_act_maxLen_tooltip=\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 \u043E\u0442\u0432\u0435\u0442\u0435. edit_text_act_fillingChar=\u0417\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u0441\u043E\u043C\u0432\u043E\u043B\u0430 edit_text_act_fillingChar_tooltip=\u0421\u0438\u043C\u0432\u043E\u043B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043E\u0431\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u0430 edit_text_act_iniLen=\u041F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: edit_text_act_iniLen_tooltip=\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0432 \u043D\u0430\u0447\u0430\u043B\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438. edit_text_act_iniText=\u041F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442: edit_text_act_iniText_tooltip=\u0422\u0435\u043A\u0441\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0439 \u0432 \u043F\u0440\u043E\u0431\u0435\u043B\u0435 \u0432 \u043D\u0430\u0447\u0430\u043B\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438. edit_text_act_list=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u043F\u0438\u0441\u043E\u043A \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432: edit_text_act_list_tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u043F\u0438\u0441\u043E\u043A \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432, \u0438\u0437 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0434\u043E\u043B\u0436\u0435\u043D \u0432\u044B\u0431\u0440\u0430\u0442\u044C \u043E\u0434\u0438\u043D. edit_text_act_check_title=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F edit_text_act_popup_no=No pop up edit_text_act_popup_always=Pop up automatically edit_text_act_popup_onError=\u0412\u0441\u043F\u043B\u044B\u0442\u0438\u0435 \u043F\u0440\u0438 \u043E\u0448\u0438\u0431\u043A\u0430\u0445 edit_text_act_popup_onDemand=Pop up with F1 edit_text_act_popup_type=\u0428\u0440\u0438\u0444\u0442: edit_text_act_popup_delay=\u0417\u0430\u0434\u0435\u0440\u0436\u043A\u0430 \u0432\u0441\u043F\u043B\u044B\u0442\u0438\u044F: edit_text_act_popup_maxTime=\u041C\u0430\u043A\u0441. \u0432\u0440\u0435\u043C\u044F: edit_text_act_popup_onlyPlay=\u0422\u043E\u043B\u044C\u043A\u043E \u0437\u0432\u0443\u043A edit_text_act_err_noSelection=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0432\u044B\u0431\u0440\u0430\u0442\u044C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u0442\u0435\u043A\u0441\u0442\u0430, \u0432 \u0446\u0435\u043B\u044F\u0445 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043D\u043E\u0432\u043E\u0433\u043E \u0446\u0435\u043B\u0435\u0432\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430! edit_text_act_err_badCharInSelection=Target text cannot include paragraph returns nor tabs. edit_text_act_err_nestedTargets=\u0426\u0435\u043B\u0438 \u043D\u0435 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B! edit_text_act_err_cellInTarget=\u0426\u0435\u043B\u0438 \u043D\u0435 \u043C\u043E\u0433\u0443\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438! edit_text_act_pageBgColor=\u0426\u0432\u0435\u0442 \u043B\u0438\u0441\u0442\u0430: edit_text_act_editStylesBtn=\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0438\u043B\u0438 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 ... edit_text_act_mainStyle=\u041E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u0441\u0442\u0438\u043B\u044C: edit_text_act_tabSpc=\u041E\u0431\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u0430: edit_text_act_tabSize=\u0420\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u043C\u0435\u0436\u0434\u0443 \u043F\u043E\u0437\u0438\u0446\u0438\u044F\u043C\u0438 \u0432\u043A\u043B\u0430\u0434\u043E\u043A: edit_text_act_colors=\u0426\u0432\u0435\u0442\u0430: edit_text_act_targetStyle=Target colors: edit_text_act_errorStyle=\u0426\u0432\u0435\u0442\u0430 \u043E\u0448\u0438\u0431\u043E\u043A: edit_text_act_preview=\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440: edit_text_act_styleSample_default_start=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 edit_text_act_styleSample_target=\u0446\u0435\u043B\u044C edit_text_act_styleSample_error=\u043E\u0448\u0438\u0431\u043A\u0430 edit_text_act_styleSample_default_fill=\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 edit_text_act_styleSample_default_end=\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442. edit_text_act_warnDeleteTarget=\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: \u042D\u0442\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043F\u0440\u0435\u0449\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u0443\u044E \u0446\u0435\u043B\u044C. \u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C? edit_text_act_prevScreen_title=\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u044D\u043A\u0440\u0430\u043D ... edit_text_act_prevScreen_no=\u041D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u043F\u0435\u0440\u0435\u0434 \u043D\u0430\u0447\u0430\u043B\u043E\u043C \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438 edit_text_act_prevScreen_original=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u043E\u043B\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F edit_text_act_prevScreen_special=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u044D\u0442\u043E\u0442 \u0442\u0435\u043A\u0441\u0442: edit_text_act_prevScreen_time=\u041C\u0430\u043A\u0441. \u0432\u0440\u0435\u043C\u044F: edit_text_act_edit_target=Target... edit_text_act_checkButton_show=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u043D\u043E\u043F\u043A\u0443 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F edit_text_act_checkButtonText=\u0422\u0435\u043A\u0441\u0442 \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0435: edit_text_act_checkCase=\u0421 \u0443\u0447\u0451\u0442\u043E\u043C \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 edit_text_act_checkAccents=\u0423\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0437\u043D\u0430\u043A\u0438 \u0443\u0434\u0430\u0440\u0435\u043D\u0438\u044F \u0438 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B edit_text_act_checkPunct=\u0423\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0437\u043D\u0430\u043A\u0438 \u043F\u0440\u0435\u043F\u0438\u043D\u0430\u043D\u0438\u044F edit_text_act_checkDoubleSpc=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 edit_text_act_checkOptions=\u0423\u0441\u043B\u043E\u0432\u0438\u0435 edit_text_act_checkAutoJump=\u041F\u0435\u0440\u0435\u0445\u043E\u0434\u0438\u0442\u0435 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0437\u0430\u0434\u0430\u043D\u0438\u044E, \u043A\u043E\u0433\u0434\u0430 \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 edit_text_act_checkForceOk=\u0414\u0432\u0438\u0433\u0430\u0442\u044C\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0439 \u0434\u043E\u0433\u0430\u0434\u043A\u0438 edit_text_act_checkDetail=Indicate mistakes letter by letter edit_text_act_checkDetail_params=Analysis algorithm parameters: edit_text_act_checkDetail_steps=Steps: edit_text_act_checkDetail_field=Exploration field: edit_text_act_defaultCheckButtonText=Check edit_text_act_advancedCorrectionOptions=Answer analysis edit_text_act_check_bt=Correction... edit_text_act_checkButton=Correction button edit_text_act_checkProgress=Progress edit_text_act_typeBtn=Type... edit_text_act_orderParagraphs=Order paragraphs edit_text_act_orderWords=Order words edit_text_act_order_amongstPar=Shuffle words amongst paragraphs edit_text_act_type_title=Activity type edit_text_act_warnChangeType=This action will clear all the existing targets. Do you want to proceed? edit_text_act_identWords=Identify words edit_text_act_identChars=Identify characters edit_media_change_name=Change name... edit_media_change_file=Change file... edit_media_includeInZip=Save into ZIP file edit_media_type=Media type: edit_media_size=File size: edit_media_show_type=Files of type: edit_media_preview=Preview media edit_media_preview_tooltip=Preview media resource edit_media_rename=Change resource name edit_media_rename_title=Rename edit_media_rename_prompt=New name: edit_media_rename_invalid=Invalid resource name! edit_media_rename_exists=There is another resource with this name! Each resource must have a unique name. edit_media_chfile_invalid=Invalid file! err_media_chfile_different=File must be of same type edit_media_font_error=Unable to load font! edit_media_save_file=Save file (extract from ZIP) edit_media_refresh_file=Update media content from file edit_media_warn_zipFileNotExternal=This is not a "real" file, but a object located into a ZIP container. In order to use this feature, a file with the same name must be present in the folder where the ZIP file is located. edit_activities=Activities edit_sequences=Sequences edit_media=Media library edit_media_tooltip=Manage images and other media files used in the project edit_activities_tooltip=Create and edit project activities edit_sequences_tooltip=Edit and create sequences of activities edit_project_title=Title: edit_project_title_tooltip=Project's title edit_project=Project edit_project_tooltip=Edit project properties edit_project_description=Description: edit_project_description_tooltip=General description of the project edit_project_area=Areas: edit_project_area_tooltip=Curricular areas of the project edit_project_level=Levels: edit_project_level_tooltip=Educational levels of the project edit_project_descriptors=Descriptors: edit_project_descriptors_tooltip=Descriptors of the project (separed with comma) edit_project_languages=Languages: edit_project_languages_tooltip=Languages used in the project edit_project_languages_modify=Change the selected language edit_project_languages_add=Add language edit_project_languages_select=ISO-639 language codes: edit_project_authors=Authors: edit_project_authors_tooltip=People involved in the creation of the project edit_project_author_name=Name: edit_project_author_mail=e-mail: edit_project_author_rol=Rol: edit_project_author_organization=Organization: edit_project_author_comments=Comments: edit_project_author_url=URL: edit_project_author_name_tooltip=Author's name (required) edit_project_author_mail_tooltip=Author's e-mail (optional) edit_project_author_rol_tooltip=Person's rol in the project: author, collaborator, drawings, sounds... (optional) edit_project_author_organization_tooltip=School, university, association... (optional) edit_project_author_url_tooltip=Personal web page (optional) edit_project_author_comments_tooltip=Field for other information (optional) edit_project_author_info=Author info: edit_project_author_add=Add author to list edit_project_author_edit=Edit author info edit_project_org_name=Name: edit_project_org_name_tooltip=School name edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=e-mail address of the school edit_project_org_url=URL: edit_project_org_url_tooltip=School website edit_project_org_address=Address: edit_project_org_address_tooltip=Snail-mail address edit_project_org_pc=PC: edit_project_org_pc_tooltip=Postal code edit_project_org_city=City: edit_project_org_city_tooltip=School city edit_project_org_country=Country: edit_project_org_state=State: edit_project_org_comments=Comments: edit_project_org=School/s: edit_project_org_tooltip=School or other institution involved in the project edit_project_org_info=Organization info: edit_project_org_add=Add organization edit_project_org_edit=Edit organization data edit_project_org_country_tooltip=Country, federation, union... edit_project_org_state_tooltip=Federal state, community, region... edit_project_org_comments_tooltip=Other info... edit_project_rev_date=Date: edit_project_rev_date_tooltip=Date of the revision edit_project_rev_authors=Authors: edit_project_rev_authors_tooltip=Authors of the revision edit_project_rev_description=Description: edit_project_rev_description_tooltip=Brief description of the changes made edit_project_rev_comments=Comments: edit_project_rev_comments_tooltip=Other relevant info edit_project_rev=Revisions: edit_project_rev_tooltip=History of main modifications made to the project edit_project_rev_add=Add revision record edit_project_rev_edit=Edit revision record edit_project_rev_info=Revision data edit_media_objects=objects edit_media_object=object edit_evsounds_start=Start of activity: edit_evsounds_click=Click on object: edit_evsounds_actionError=Erroneous action: edit_evsounds_actionOk=Correct action: edit_evsounds_finishedError=Activity finished with errors: edit_evsounds_finishedOk=Activity finished OK: edit_project_rev_err_nodesc=Error: The description field cannot be leaved blank! edit_evsounds_dlg_title=Edit event sounds edit_project_evsounds=Event sounds: edit_project_evsounds_tooltip=Set specific sounds for each JClic event edit_act_evsounds=Event sounds: edit_act_evsounds_tooltip=Set specific sounds for each JClic event edit_evsounds_default=default sound edit_evsounds_disabled=disabled edit_evsounds_chk_tooltip=Enable or disable the sound for this event edit_evsounds_select_tooltip=Click to select a sound for this event, or uncheck to use the default sound action_newProject_caption=New project... action_newProject_keys=NN action_newProject_tooltip=Create a new JClic project edit_arith_op_from=From: edit_arith_op_from_tooltip=Minimum value of the operator edit_arith_op_to=To: edit_arith_op_to_tooltip=Maximum value of the operator edit_arith_op_with=With: edit_arith_op_with_tooltip=If checked, the operator can also have this value edit_arith_op_fromList=One from the list: edit_arith_op_fromList_tooltip=List of possible values for the operator edit_arith_op_decimals=Decimals: edit_arith_op_decimals_tooltip=Number of decimals of the operand edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=First operand edit_arith_secondOp=Second operand edit_arith_title=Arith2 for JClic edit_arith_operations=Operations: edit_arith_operations_tooltip=Select the kind of operations to be performed edit_arith_operations_plus=Plus edit_arith_operations_minus=Minus edit_arith_operations_multiply=Multiply edit_arith_operations_divide=Divide edit_arith_unknown=Unknown: edit_arith_unknown_tooltip=Select the item that will act as a unknown edit_arith_unknown_aobx=The result is the unknown edit_arith_unknown_aoxr=The second operator is the unknown edit_arith_unknown_xobr=The first operator is the unknown edit_arith_unknown_axbr=The operation is the unknown edit_arith_unknown_invert=Write the result at the beggining of the expression edit_arith_result=Result: edit_arith_result_notCarry=Do not carry edit_arith_result_random=Random edit_arith_result_asc=Ascending edit_arith_result_order=Order by result: edit_arith_result_desc=Descending edit_arith_result_avoidDup=Avoid duplicates edit_arith_cond=Conditions: edit_arith_cond_ind=Indifferent edit_arith_cond_agb=The first operator must be greather than the second one edit_arith_cond_alb=The first operator must be lesser than the second one edit_arith_cond_tooltip=Other conditions edit_autocp=Automatic content generator: edit_autocp_tooltip=Select the type of automatic content generator for this activity. edit_autocp_block=Content generator edit_autocp_btn=Settings... edit_autocp_btn_tooltip=Configure the content provider settings edit_data=Edit data edit_act=Activity edit edit_acp=Content provider edit edit_acp_err_creating=Error creating the content provider! edit_project_author_group=Creation edit_project_description_block=Description edit_project_ui_block=User interface edit_act_description=Description: m_Edit=Edit m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=New activity... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Insert m_Insert_Mnemonic=I m_View=View m_View_Mnemonic=V action_editProject_caption=Project action_editProject_keys=PP action_editProject_tooltip=Edit project settings action_editMedia_caption=Media action_editMedia_keys=MM action_editMedia_tooltip=Edit the project's multimedia library action_editActivities_caption=Activities action_editActivities_keys=AA action_editActivities_tooltip=Edit the activities action_editSeq_caption=Sequences action_editSeq_keys=SS action_editSeq_tooltip=Edit the sequences of activities warn_project_modified=Current project has been modified. Do you want to save the changes? edit_project_descriptors_block=Descriptors edit_media_new=New media object... edit_media_new_tooltip=Add a new image or multimedia object to the library edit_media_new_keys=M* edit_seq_threshold=Score threshold: edit_seq_threshold_tooltip_up=Take this way when the global score is equal to or higher than... edit_seq_time=Time threshold: edit_seq_time_tooltip_up=In order to take this way, the time spent on the activities must be less than... edit_seq_threshold_tooltip_down=Take this way when the global score is lower than... edit_seq_time_tooltip_down=Take this way when the time spent on the activities is more than... edit_seq_condJump=Conditional jumps edit_seq_condJump_tooltip=Set special jumps to be executed only under specific condicions edit_seq_condJump_upper_tooltip=Set conditions to jump to an upper level edit_seq_condJump_lower=Lower jump: edit_seq_condJump_upper=Upper jump: edit_seq_condJump_lower_tooltip=Set conditions to jump to an lower level edit_seq_action_tooltip_fw=Action assigned to the "next" button edit_seq_action_tooltip_bk=Action assigned to the "previous" button edit_seq_jump_tooltip=Set the jump target edit_seq_action_tooltip=Action to be done edit_seq_activity_tooltip=Activity assigned to this sequence element edit_seq_tag_tooltip=Tag used to reference this sequence element (optional field) edit_seq_description_tooltip=Description of the sequence element (optional field) edit_seq_button_enabled_tooltip=Enable or disable the arrow button edit_seq_auto_tooltip=Move on automatically when the activity finishes edit_seq_delay_tooltip=Seconds to wait before to do the automatic move edit_color_dlgTitle=Select color edit_media_renaming=Please wait while the resource is being renamed... edit_act_cell_width=Width: edit_act_cell_width_tooltip=Cell width (in pixels) edit_act_cell_height=Height: edit_act_cell_height_tooltip=Cell height (in pixels) edit_act_hiddenWords=Hidden words: edit_act_hiddenWords_tooltip=List of the hidden words placed in the panel edit_act_wordSearch_panelB=Use panel B edit_act_wordSearch_panelB_tooltip=The contents of a second panel will be displayed as words are found edit_act_shaper_tooltip=Select the shaper type to be used in the panel edit_act_num_cols_tooltip=Number of columns of the panel edit_act_num_rows_tooltip=Number of rows of the panel edit_act_wildTransparent=Transparent delimiters edit_act_wildTransparent_tooltip=Treat the delimiters (black boxes) as transparent holes edit_act_behavior_scramble_times=Mixes: edit_act_behavior_scramble_times_tooltip=Number of times to shuffle edit_act_copy_title=Copy attributtes to... edit_act_copy_attributes=Attributes edit_act_copy_dest=Apply to: edit_act_copy_style_main=Main window edit_act_copy_style_play=Play window edit_act_copy_activities=Activities to be modified: edit_act_copyAttributes=Copy attributes edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copy current activity attributes to other activities edit_new_project_name=Project name: edit_new_project_name_tooltip=Short, descriptive name of the project edit_new_project_filename=File name: edit_new_project_filename_tooltip=Name of the project file, without extension edit_new_project_folder=Folder: edit_new_project_folder_tooltip=Name of the folder where the project will be stored edit_new_project_folder_browse=Browse... edit_new_project_title=Create new JClic project edit_new_project_err_empty=Error: Project, file and folder must have valid, non-empty names. edit_new_project_warning_noEmptyFolder=This folder already contains another Clic 3.0 or JClic project. In order to avoid confusions, is preferable to maintain each project in a separate folder, but that isn't a strict rule. Do you really want to create the new project in this folder? edit_new_project_err_folderCreation=Error: Unable to create the specified folder! edit_act_copy_err_noSelection=Error: No activity selected! In order to use this function you must select in the list the activity or activities to wich the indicated attributes will be applied. edit_act_copy_action_prefix=Copying attributes to: edit_act_copy_margin=Margin edit_act_copy_bgColor=Background color edit_act_copy_gradient=Gradient edit_act_copy_bgImage=Background image edit_act_copy_border=Border edit_act_copy_transparentBg=Transparent background edit_act_copy_position=Position edit_act_copy_messages=Messages edit_act_copy_messages_ini=Style of initial message edit_act_copy_messages_end=Style of end message edit_act_copy_messages_err=Style of error message edit_act_copy_reports=Reports edit_act_copy_rep_include=Include activity in reports edit_act_copy_rep_actions=Record actions edit_act_copy_interface=User interface edit_act_copy_skin=Skin edit_act_copy_evSounds=Event sounds edit_act_copy_counters=Counters edit_act_copy_cTime=Time counter edit_act_copy_maxTime=Max. time edit_act_copy_cTries=Tries counter edit_act_copy_maxTries=Max. tries edit_act_copy_cScore=Score counter edit_act_copy_scramble=Times to scramble edit_act_copy_buttons=Buttons edit_act_copy_btnHelp=Help button edit_act_copy_btnInfo=Information button edit_act_copy_grids=Grids edit_act_copy_gridA=Style of grid A edit_act_copy_gridB=Style of grid B edit_act_copy_textGrid=Style of text grids edit_act_copy_text=Text activities edit_act_copy_fontFace=Font face edit_act_copy_fontSize=Font size edit_act_copy_fontStyle=Font style edit_act_copy_textColour=Main text colour edit_act_copy_textTargetColour=Select the JClic project of which the activities will be imported edit_act_copy_textErrorColour=Errors colour edit_act_copy_tabSpace=Tab space edit_act_copy_messages_prev=Style of previous message edit_act_changeType=Change activity type edit_act_newActivity_class_tooltip=Full name of the class to be used to build the activity (advanced users only!) edit_act_newActivity_other=Other... edit_act_newActivity_info=Advanced users can also create unregistered types of JClic activities. Just write below the full class name, prefixed by the package (like "com.acme.activities.FooActivity"). Activity classes must extend edu.xtec.jclic.Activity, and must be accessibles to the JVM classloader. edit_act_newActivity_name=Name of the activity: edit_act_newActivity_name_tooltip=Each activity must have a name unique in the project edit_act_changeType_warning=

Warning: Changing the type of activity can cause lost of some of the current activity attributes and objects. Use it with care!

 

applet_codebase=Location of JClic code: applet_codebase_tooltip=URL pointing to a folder with the JClic program files and scripts applet_prev_text=HTML code before: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Text or HTML code to be placed before the applet applet_post_text=HTML code after: applet_post_text_tooltip=Text or HTML code to be placed after the applet applet_size=Applet size: applet_size_tooltip=Width and height of the applet, in absolute or percentage values. applet_page_title=Page title: applet_page_title_tooltip=Text to be shown at the top of the browser window applet_created_info=The web page "%s" has been created successfully. applet_created_prompt=Do you want to open it now with the browser? action_createHTML_caption=Create web page... applet_create_title=Creation of an HTML page with a JClic applet action_createHTML_tooltip=Create a HTML page with an applet containing the current project applet_filename=File name: applet_filename_tooltip=Name of the HTML file to be created action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Default values used in web page creation applet_bgcolor=Background color: applet_bgcolor_tooltip=HTML page background color applet_centered=Centered applet_centered_tooltip=Place the applet horizontally centered applet_width_tooltip=Applet width (absolute or percentage) applet_height_tooltip=Applet height (absolute or percentage) applet_exitUrl=On exit, go to: applet_exitUrl_tooltip=URL where to redirect the navigation on JClic exit applet_infoFrame=Info frame name: applet_infoFrame_tooltip=Name of the frame used to show the content related to the "info" button action_createInstaller_caption=Create project installer... action_createInstaller_keys=I* action_createInstaller_tooltip=Create a project installer script for JClic player installer_caption=Edit project installer script installer_title=Title: installer_title_tooltip=Project title, to be shown on the installer wizard installer_authors=Autors: installer_authors_tooltip=Author/s of the project (short text) installer_folder=Folder: installer_folder_tooltip=Folder name to be suggested by the installer wizard installer_files=Files to be copied: installer_files_tooltip=Files to be copied by the installer installer_files_available=Available files installer_files_selected=Selected files installer_files_add=>> add >> installer_files_add_tooltip=Add selected file to the list installer_files_remove=<< remove << installer_files_remove_tooltip=Remove selected file from the list installer_button=Launch button installer_button_tooltip=Properties of the button to be shown in the project library installer_button_project=Main project: installer_button_project_tooltip=JClic project to be launched by the button installer_button_text=Label: installer_button_text_tooltip=Short text label, to be shown inside the button installer_button_icon=Icon: installer_button_icon_tooltip=Picture to be used as button icon. Leave blank to use the default JClic icon. installer_button_description=Description installer_button_description_tooltip=Tooltip to be shown by the button installer_error_noTitle=Error: Missing project title installer_error_noBaseFolder=Error: Missing folder name installer_error_noFilesSelected=Error: No files selected installer_error_noButtonText=Error: Missing launch button text label installer_error_projectNotInFiles=Error: The project assigned to the launch button is not in the list of files to be copied applet_page_full=Full-page applet applet_page_mixed=Applet with specific dimensions edit_text_align_left=Align text left edit_text_align_center=Center text edit_text_align_right=Align text right edit_text_act_target_toggle=Create or remove target edit_text_act_insertCell=Insert a cell edit_text_act_content=Content edit_text_act_style=Style edit_cell_size=Cell size: edit_project_orphanActivities=The following activities never appear in any of the project's activity sequences, so they never will be displayed: edit_project_orphanMedia=The following media objects are not used directly in any activity: edit_project_orphanActivities_prompt=Do you want to add them at the end of the last activity sequence? edit_project_orphanMedia_prompt=Do you want to remove them? edit_project_orphanMedia_title=Removal of unused media objects edit_project_orphanActivities_title=Orphan activities edit_media_refreshAll=Update all media content edit_media_refreshAll_tooltip=Update all media objects reloading its files edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Updating media... edit_media_exportAll=Export all media edit_media_exportAll_tooltip=Save to files the content of all media elements edit_media_exportAll_keys=X* edit_shape_select=Select edit_shape_addPoint=Add point edit_shape_deletePoint=Delete edit_shape_drawRect=Draw rectangle edit_shape_drawEllipse=Draw ellipse edit_shape_drawPoly=Draw polygon edit_shape_toLine=Convert to line edit_shape_toBezier=Convert to B\u00E9zier curve edit_shape_toQuad=Convert to quadratic curve edit_shape_rLeft=Rotate left edit_shape_rRight=Rotate right edit_shape_expand=Expand edit_shape_contract=Contract edit_shape_zoomIn=Zoom in edit_shape_zoomOut=Zoom out edit_shape_aproxPoints=Join nearest points edit_shape_showPoints=Show points edit_shape_showPoints_tooltip=Show/Hide the points edit_shape_gridSize=Grid size: edit_shape_hideGrid=Show / Hide grid edit_shape_magnetRadius=Magnet radius: edit_shape_elements=Defined elements edit_shape_elemName=Name of the selected element edit_shape_magnetRadius_tooltip=Action radius of the magnet, when enabled edit_shape_gridSize_tooltip=Size of the grid edit_mc_activity=Activity: edit_mc_sequence=Sequence: edit_mc_url=URL: edit_mc_project=Project: edit_mc_activity_selection=Choose activity edit_mc_sequence_selection=Choose sequence edit_mc_err_nullContent=Insufficient data! edit_act_arrowColor=Arrow color: edit_act_arrowColor_tooltip=Color used by the editor to draw the arrows (not exactly, because an XOR bit mask is used) edit_act_editActivity=Edit... edit_act_editActivity_tooltip=Edit the selected activity action_saveFileAs_caption=Save as... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Save the current project with a different name edit_act_behavior_block=Behavior edit_act_behavior=Behavior edit_act_behavior_drag=Drag objects edit_act_behavior_drag_tooltip=Drag objects instead of use a connection line edit_act_behavior_order=Check solving order edit_act_behavior_order_tooltip=Cells must be solved in order edit_act_scramble=Scramble action_importActivities_caption=Import activities... action_importActivities_keys=I* action_importActivities_tooltip=Import activities from another project import_warn_samefile=The selected file corresponds to the current project. Activities can be imported only between different projects. Please select another project file. import_selectActivities=Select one or more activities to import into the current project: import_importing=Importing... import_checkdep=Checking dependencies... import_impmedia=Importing media: import_impact=Importing activity: import_selectProject=Select the JClic project of which the activities will be imported edit_tagRep_tags=Tag marks edit_tagRep_tagStart=Start mark: edit_tagRep_tagStart_tooltip=Mark used at the beginning of tags edit_tagRep_tagEnd=End mark: edit_tagRep_tagEnd_tooltip=Mark used at the end of tags edit_tagRep_file=File edit_tagRep_fileName=File or URL: edit_tagRep_fileName_tooltip=Name or URL of the file containing the values that will replace tags edit_tagRep_charset=Charset: edit_tagRep_charset_tooltip=Character encoding used in the file edit_tagRep_browseFile=Browse... edit_tagRep_browseFile_tooltip=Browse the filesystem edit_tagRep_title=Tag replacing edit_text_act_clearStylesBtn=Clear text styles... edit_text_act_clearStylesPrompt=Warning: This action will clear the specific character attributes applied to the document, setting it back to its main style. This action cannot be undone. Do you want to do it? img_max_size=Maximum size of images: img_max_width_tooltip=Maximum width of images imported into the media library. img_max_height_tooltip=\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0432\u044B\u0441\u043E\u0442\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F, \u0438\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0432 \u043C\u0435\u0434\u0438\u0430\u0442\u0435\u043A\u0443. img_resize_prompt=\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 "% S" \u0438\u043C\u0435\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 "% S" \u043F\u0438\u043A\u0441\u0435\u043B\u0435\u0439. \u042D\u0442\u043E \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u0435\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C, \u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0439 \u0410\u0432\u0442\u043E\u0440\u043E\u043C JClic (%s). \u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435, \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0435\u0451 \u0440\u0430\u0437\u043C\u0435\u0440? src/author/edu/xtec/resources/messages/AuthorMessages_tr.properties000066400000000000000000001162531335566474600263200ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Description edit_act_name_tooltip=Aktivitenin ismi edit_act_name=\u0130sim: edit_act_description_tooltip=Aktivitenin tan\u0131m\u0131 edit_act_reports_block=Raporlar edit_act_includeInReports=Include this activity in reports edit_act_includeInReports_tooltip=Include the results of this activity in users' reports edit_act_code=Kod: edit_act_code_tooltip=Optional code used to group and search in the reports database. edit_act_reportActions=Kullan\u0131c\u0131 i\u015Flemlerini raporla edit_act_reportActions_tooltip=Kullan\u0131c\u0131lar taraf\u0131ndan ger\u00E7ekle\u015Ftirilen i\u015Flemlerin detaylar\u0131n\u0131 kaydet edit_act_counters_block=Saya\u00E7lar edit_act_timeCounter=Zaman sayac\u0131 edit_act_timeCounter_tooltip=Zaman sayac\u0131n\u0131 G\u00F6ster/Gizle edit_act_actionsCounter=Deneme Sayac\u0131 edit_act_actionsCounter_tooltip=Deneme sayac\u0131n\u0131 G\u00F6ster/Gizle edit_act_scoreCounter=Skor sayac\u0131 edit_act_scoreCounter_tooltip=Skor sayac\u0131n\u0131 G\u00F6ster/Gizle edit_act_maxTime=Azami S\u00FCre: edit_act_maxTime_tooltip=Aktiviteyi \u00E7\u00F6zmek i\u00E7in azami s\u00FCre (saniye olarak), ya da S\u0131n\u0131rs\u0131z s\u00FCre i\u00E7in 0. edit_act_countdown=Geri Say\u0131m edit_act_countdown_tooltip=Geri say\u0131m azami de\u011Ferden ba\u015Flay\u0131p s\u0131f\u0131ra do\u011Fru devam eder edit_act_maxActions=Azami deneme: edit_act_maxActions_tooltip=\u0130zin verilen azami deneme (s\u0131n\u0131rs\u0131z deneme i\u00E7in 0) edit_act_buttons_block=D\u00FC\u011Fmeler edit_act_helpBtn=Yard\u0131m edit_act_helpBtn_tooltip=Yard\u0131m d\u00FC\u011Fmesini g\u00F6ster/gizle edit_act_helpBtn_solution=\u00C7\u00F6z\u00FCm\u00FC g\u00F6ster edit_act_helpBtn_msg=Bu mesaj\u0131 g\u00F6ster: edit_act_infoBtn=Bilgi edit_act_infoBtn_tooltip=Bilgi d\u00FC\u011Fmesini g\u00F6ster/gizle edit_act_infoBtn_url=Bu URLyi g\u00F6ster edit_act_infoBtn_cmd=Bu komutu \u00E7al\u0131\u015Ft\u0131r: edit_act_infoBtn_url_tooltip=Web site address to show when click on the info button edit_act_infoBtn_cmd_tooltip=Command line to be executed on click to the info button. edit_act_mainWindow=Main window: edit_act_gameWindow=Game window: edit_act_margin=Margin: edit_act_margin_tooltip=Horizontal and vertical spacing between visual objects. edit_act_bgColor=Background color: edit_act_bgColor_tooltip=Arkaplan rengini de\u011Fi\u015Ftir edit_gradient_startColor=Ba\u015Flang\u0131\u00E7 rengi: edit_gradient_endColor=Biti\u015F rengi: edit_gradient_startColor_tooltip=Ba\u015Flang\u0131\u00E7 rengi se\u00E7imi edit_gradient_endColor_tooltip=Biti\u015F rengi se\u00E7imi edit_gradient_cycles=Cycles: edit_gradient_cycles_tooltip=Number of repetitions of the gradient over the paint surface edit_gradient_orientation=Y\u00F6nelim: edit_gradient_orientation_tooltip=Gradient's orientation, measured in degrees over the horizontal edit_act_gradient=Gradient: edit_act_gradient_tooltip=Use gradient of colours edit_color_opacity=Opacity edit_color_opacity_tooltip=Set the color's alpha channel (opacity) value. edit_gradient_title=Gradient edit_gradient_default=Use default values (null gradient) edit_act_image=Image: edit_act_descriptionTab=Description edit_act_descriptionTab_tooltip=Name and description edit_act_tiledBgImg=Tiled edit_act_tiledBgImg_tooltip=Paint all the surface with the image, repeating it along the X and Y axis as needed. edit_act_preview=Preview: edit_act_border=Border edit_act_border_tooltip=Draw a line border arround the window edit_act_transparent=Transparent edit_act_transparent_tooltip=Window has transparent background edit_act_width=Width: edit_act_height=Height: edit_act_width_tooltip=Width of the object, measured in pixels edit_act_height_tooltip=Height of the object, measured in pixels edit_act_centered=Centered edit_act_centered_tooltip=The object will be centered over the main window edit_act_x=X: edit_act_x_tooltip=Absolute horizontal location edit_act_y=Y: edit_act_y_tooltip=Absolute vertical location edit_act_ui_block=User interface edit_act_image_tooltip=Select an image edit_act_text=Text: edit_act_text_tooltip=Text to be shown inside this object edit_font_face=Typeface: edit_font_size=Size: edit_font_bold=Bold edit_font_italic=Italic edit_font_underline=Underline edit_font_style=Style: edit_cell_title=Cell contents edit_act_messages=Messages edit_act_msg_initial=Initial message: edit_act_msg_final=Final message: edit_act_msg_prev=Previous message: edit_act_msg_error=Error message: edit_act_msg_initial_tooltip=Message to be shown when the activity starts edit_act_msg_final_tooltip=Message to be shown when the activity is finished edit_act_msg_error_tooltip=Message to be shown when the activity ends with errors edit_act_msg_prev_tooltip=Message to be shown prior to the start of the activity (only in certain types of activities) edit_align=Align: edit_act_textColor=Text color: edit_act_textColor_tooltip=Color used to draw text edit_act_shadowColor=Shadow color: edit_act_shadowColor_tooltip=Color used for drawing the text's shadow, when appliable edit_act_shadow=Shadow edit_act_shadow_tooltip=Draw text with shadow edit_act_borderColor=Border color: edit_act_borderColor_tooltip=Color used to draw the cell's border edit_act_inactiveColor=Inactive state color: edit_act_inactiveColor_tooltip=Color used when the cell is disabled edit_act_altColor=Alternative color: edit_act_altColor_tooltip=Color used to draw the alternative content in solved cells. edit_cell_marked=Marked edit_cell_disabled=Disabled edit_cell_alt=Alternative edit_cell_textMargin=Internal margin: edit_cell_textMargin_tooltip=Amount of space between cell's border and text. edit_cell_borderWidth=Border width: edit_cell_borderWidth_tooltip=Width of the stroke used to draw the standard border edit_cell_markerWidth=Marker width: edit_cell_markerWidth_tooltip=Width of the stroke used to draw the border when the cell is marked or selected edit_cell_alt_tooltip=Preview in "alternative" state edit_cell_disabled_tooltip=Preview in "disabled" state edit_cell_marked_tooltip=Preview in "marked" state edit_act_testAction=Preview activity edit_act_testAction_tooltip=Preview and test the activity edit_act_panels_description=Description edit_act_panels_description_tooltip=Title and description of the activity edit_act_panels_options=Options edit_act_panels_options_tooltip=Options of the activity edit_act_panels_frame=Window edit_act_panels_frame_tooltip=Aspect, size and position of the activity window edit_act_panels_messages=Messages edit_act_panels_messages_tooltip=Content of the activity messages edit_act_panels_panel=Panel edit_act_panels_panel_tooltip=Contents of the panel edit_style_title=Style edit_style_tooltip=Set the cells color, font and size edit_act_style=Style: edit_act_overlap=Avoid text overlap image edit_act_overlap_tooltip=Try to avoid text overlapping over image edit_media_exists_1=The file edit_media_exists_2=already exists in the media library! edit_act_shaper=Shaper: edit_act_shaper_err=Shaper error: edit_act_num_cols=Columns: edit_act_num_rows=Rows: edit_act_toothHeightFactor=Tooth height: edit_act_toothWidthFactor=Tooth width: edit_act_toothRandom=Random distribution edit_act_shaper_properties=Shaper properties edit_act_panels_text=Text edit_act_panels_text_tooltip=Text of the activity action_saveFile_caption=Save... action_saveFile_keys=SS action_saveFile_tooltip=Save the current project action_docTree_caption=Document tree... action_docTree_keys=T* action_docTree_tooltip=Show the project's document as a tree edit_docTree_title=Document tree edit_media_referencedBy=Referenced by: msg_prompt_loadReferences=Warning:

This project connects with other projects.
Do you want to explore the links and to load all the related files?

(It's advisable to answer YES when importing Clic 3.0 activities) edit_mc_type=Type: edit_mc_type_unknown=Unknown edit_mc_type_sound=Play sound edit_mc_type_video=Play video edit_mc_type_midi=Play MIDI edit_mc_type_cdaudio=Play CD audio edit_mc_type_record=Record sound edit_mc_type_play_recorded=Play recorded sound edit_mc_type_run_activity=Go to activity edit_mc_type_run_sequence=Go to sequence edit_mc_type_run_external=Run program edit_mc_type_url=Show URL edit_mc_type_exit=End edit_mc_type_return=Return edit_mc_level=Priority level: edit_mc_file=File: edit_mc_externalParam=Parameters: edit_mc_from=From: edit_mc_to=To: edit_mc_length=Max. length: edit_mc_recBuffer=Record tape: edit_mc_stretch=Stretch size edit_mc_location=Location: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=From: edit_mc_location_from_box=Cell edit_mc_location_from_window=Window edit_mc_location_from_frame=Frame edit_mc_loop=Loop playback edit_mc_autostart=Auto start edit_mc_catchmouse=Catch mouse edit_mc_title=Multimedia and active content edit_mc_label=Active content: edit_media_dlg_title=Multimedia object selection edit_media_title=Media library edit_mc_pos_cell=Centered over cell edit_mc_pos_window=Centered over window edit_mc_pos_absolute=Specify position: edit_tree_badFormat=Incorrect tree structure or data! edit_act_panels_controls=Controls edit_act_panels_controls_tooltip=Options for buttons and counters edit_act_class=Type: edit_act_gridLayout=Grid layout: edit_act_gridLayout_tooltip=Relative postion of the panels A and B. edit_act_inverseResolution=Inverse resolution edit_act_inverseResolution_tooltip=The activity is solved when all assigned elements of "B" are matched. edit_act_showAllArrows=Show all arrows edit_act_alt=Alternative content: edit_act_alt_tooltip=Content shown in solved cells and non-assigned cells. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Edit the alternative content edit_act_grid=Grid edit_act_grid_A=Grid A edit_act_grid_B=Grid B edit_act_grid_layout=Layout edit_act_grid_relationship=Relationship edit_seq_activity_header=activity edit_seq_tag_header=tag edit_seq_jump_header=jump to edit_seq_activity=Activity: edit_seq_tag=Label: edit_seq_description=Description: edit_seq_auto=Move on automatically edit_seq_delay=Delay: edit_seq_action_fwd=Go forward edit_seq_action_back=Go bak edit_seq_action_jump=Jump to... edit_seq_action_stop=Stop edit_seq_action_return=Return edit_seq_action_exit=Exit JClic edit_seq_arrow_fwd=Forward arrow: edit_seq_arrow_back=Back arrow: edit_seq_action=Action: edit_seq_button_enabled=Show button edit_seq_project=JClic Project: edit_act_absolute=Absolute position edit_act_absolute_tooltip=The object will be placed at the specified X and Y co-ordinates edit_act_location=Location: edit_seq_newElement=New sequence element... edit_seq_newElement_tooltip=Insert a new element into the activity sequence edit_seq_newElement_msg=Please select an activity for the new sequence element. edit_seq_newElement_error_noAct=Cannot create a new sequence element without activity! edit_seq_newElement_error_emptyList=This project has no activities! Unable to create sequence elements in an empty project. edit_seq_jump_msg=Jump target: edit_seq_jump_title=Jump target edit_act_newActivity_tooltip=Add a new activity to project edit_act_prompt_class=Type of activity: edit_act_prompt_name=Name: edit_act_newActivity_msg=Please select the type of activity to create and give it a name: edit_act_newActivity_error_noAct=You must select an activity type! edit_act_newActivity_error_noName=You must especify a name for the activity! edit_act_newActivity_error_creating=Unable to create activity! edit_act_newActivity_class=Java class name: edit_text_act_format=Format edit_text_act_answer=Answer edit_text_act_popup=Pop up edit_text_act_answer_label=Valid answers: edit_list_newElement_tooltip=Add a new list element edit_list_editElement_tooltip=Edit the selected list element edit_list_deleteElement_tooltip=Delete the selected list element edit_list_upBtn_tooltip=Move up edit_list_downBtn_tooltip=Move down edit_list_newValue=New text: edit_list_addElement=Add new list element edit_list_modifyValue=Modify selected text edit_text_act_target=Target edit_text_act_maxLen=Max. length: edit_text_act_maxLen_tooltip=Maximum amount of characters in the answer. edit_text_act_fillingChar=Filling character edit_text_act_fillingChar_tooltip=Character used to indicate the blank edit_text_act_iniLen=Initial length: edit_text_act_iniLen_tooltip=Number of filling chars that will be displayed at the beginning of the activity. edit_text_act_iniText=Initial text: edit_text_act_iniText_tooltip=Text displayed in the blank at the beggining of the activity. edit_text_act_list=Show a list of options: edit_text_act_list_tooltip=Display a list of options from which the user must select one. edit_text_act_check_title=Correction options edit_text_act_popup_no=No pop up edit_text_act_popup_always=Pop up automatically edit_text_act_popup_onError=Pop up in errors edit_text_act_popup_onDemand=Pop up with F1 edit_text_act_popup_type=Type: edit_text_act_popup_delay=Pop up delay: edit_text_act_popup_maxTime=Max. time: edit_text_act_popup_onlyPlay=Sound only edit_text_act_err_noSelection=You must select a fragment of text in order to create a new text target! edit_text_act_err_badCharInSelection=Target text cannot include paragraph returns nor tabs. edit_text_act_err_nestedTargets=Targets cannot nest! edit_text_act_err_cellInTarget=Targets cannot contain cells! edit_text_act_pageBgColor=Paper colour: edit_text_act_editStylesBtn=Edit document styles... edit_text_act_mainStyle=Main style: edit_text_act_tabSpc=Tab space: edit_text_act_tabSize=Spaces between tab marks: edit_text_act_colors=Colors: edit_text_act_targetStyle=Target colors: edit_text_act_errorStyle=Error colors: edit_text_act_preview=Preview: edit_text_act_styleSample_default_start=Standard text edit_text_act_styleSample_target=target edit_text_act_styleSample_error=error edit_text_act_styleSample_default_fill=standard text edit_text_act_styleSample_default_end=standard text. edit_text_act_warnDeleteTarget=Warning: This action will supress the currently selected target. Do you want to proceed? edit_text_act_prevScreen_title=Previous screen... edit_text_act_prevScreen_no=Don't display any text before starting the activity edit_text_act_prevScreen_original=Display the complete text of the exercise edit_text_act_prevScreen_special=Display this text: edit_text_act_prevScreen_time=Max. time: edit_text_act_edit_target=Target... edit_text_act_checkButton_show=Show correction button edit_text_act_checkButtonText=Button text: edit_text_act_checkCase=Match case edit_text_act_checkAccents=Consider accents and special characters edit_text_act_checkPunct=Consider punctuation marks edit_text_act_checkDoubleSpc=Allow repeated spaces edit_text_act_checkOptions=Criteria edit_text_act_checkAutoJump=Move on to next target when filled in edit_text_act_checkForceOk=Move only after correct guess edit_text_act_checkDetail=Indicate mistakes letter by letter edit_text_act_checkDetail_params=Analysis algorithm parameters: edit_text_act_checkDetail_steps=Steps: edit_text_act_checkDetail_field=Exploration field: edit_text_act_defaultCheckButtonText=Check edit_text_act_advancedCorrectionOptions=Answer analysis edit_text_act_check_bt=Correction... edit_text_act_checkButton=Correction button edit_text_act_checkProgress=Progress edit_text_act_typeBtn=Type... edit_text_act_orderParagraphs=Order paragraphs edit_text_act_orderWords=Order words edit_text_act_order_amongstPar=Shuffle words amongst paragraphs edit_text_act_type_title=Activity type edit_text_act_warnChangeType=This action will clear all the existing targets. Do you want to proceed? edit_text_act_identWords=Identify words edit_text_act_identChars=Identify characters edit_media_change_name=Change name... edit_media_change_file=Change file... edit_media_includeInZip=Save into ZIP file edit_media_type=Media type: edit_media_size=File size: edit_media_show_type=Files of type: edit_media_preview=Preview media edit_media_preview_tooltip=Preview media resource edit_media_rename=Change resource name edit_media_rename_title=Rename edit_media_rename_prompt=New name: edit_media_rename_invalid=Invalid resource name! edit_media_rename_exists=There is another resource with this name! Each resource must have a unique name. edit_media_chfile_invalid=Invalid file! err_media_chfile_different=File must be of same type edit_media_font_error=Unable to load font! edit_media_save_file=Save file (extract from ZIP) edit_media_refresh_file=Update media content from file edit_media_warn_zipFileNotExternal=This is not a "real" file, but a object located into a ZIP container. In order to use this feature, a file with the same name must be present in the folder where the ZIP file is located. edit_activities=Activities edit_sequences=Sequences edit_media=Media library edit_media_tooltip=Manage images and other media files used in the project edit_activities_tooltip=Create and edit project activities edit_sequences_tooltip=Edit and create sequences of activities edit_project_title=Title: edit_project_title_tooltip=Project's title edit_project=Project edit_project_tooltip=Edit project properties edit_project_description=Description: edit_project_description_tooltip=General description of the project edit_project_area=Areas: edit_project_area_tooltip=Curricular areas of the project edit_project_level=Levels: edit_project_level_tooltip=Educational levels of the project edit_project_descriptors=Descriptors: edit_project_descriptors_tooltip=Descriptors of the project (separed with comma) edit_project_languages=Languages: edit_project_languages_tooltip=Languages used in the project edit_project_languages_modify=Change the selected language edit_project_languages_add=Add language edit_project_languages_select=ISO-639 language codes: edit_project_authors=Authors: edit_project_authors_tooltip=People involved in the creation of the project edit_project_author_name=Name: edit_project_author_mail=e-mail: edit_project_author_rol=Rol: edit_project_author_organization=Organization: edit_project_author_comments=Comments: edit_project_author_url=URL: edit_project_author_name_tooltip=Author's name (required) edit_project_author_mail_tooltip=Author's e-mail (optional) edit_project_author_rol_tooltip=Person's rol in the project: author, collaborator, drawings, sounds... (optional) edit_project_author_organization_tooltip=School, university, association... (optional) edit_project_author_url_tooltip=Personal web page (optional) edit_project_author_comments_tooltip=Field for other information (optional) edit_project_author_info=Author info: edit_project_author_add=Add author to list edit_project_author_edit=Edit author info edit_project_org_name=Name: edit_project_org_name_tooltip=School name edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=e-mail address of the school edit_project_org_url=URL: edit_project_org_url_tooltip=School website edit_project_org_address=Address: edit_project_org_address_tooltip=Snail-mail address edit_project_org_pc=PC: edit_project_org_pc_tooltip=Postal code edit_project_org_city=City: edit_project_org_city_tooltip=School city edit_project_org_country=Country: edit_project_org_state=State: edit_project_org_comments=Comments: edit_project_org=School/s: edit_project_org_tooltip=School or other institution involved in the project edit_project_org_info=Organization info: edit_project_org_add=Add organization edit_project_org_edit=Edit organization data edit_project_org_country_tooltip=Country, federation, union... edit_project_org_state_tooltip=Federal state, community, region... edit_project_org_comments_tooltip=Other info... edit_project_rev_date=Date: edit_project_rev_date_tooltip=Date of the revision edit_project_rev_authors=Authors: edit_project_rev_authors_tooltip=Authors of the revision edit_project_rev_description=Description: edit_project_rev_description_tooltip=Brief description of the changes made edit_project_rev_comments=Comments: edit_project_rev_comments_tooltip=Other relevant info edit_project_rev=Revisions: edit_project_rev_tooltip=History of main modifications made to the project edit_project_rev_add=Add revision record edit_project_rev_edit=Edit revision record edit_project_rev_info=Revision data edit_media_objects=objects edit_media_object=object edit_evsounds_start=Start of activity: edit_evsounds_click=Click on object: edit_evsounds_actionError=Erroneous action: edit_evsounds_actionOk=Correct action: edit_evsounds_finishedError=Activity finished with errors: edit_evsounds_finishedOk=Activity finished OK: edit_project_rev_err_nodesc=Error: The description field cannot be leaved blank! edit_evsounds_dlg_title=Edit event sounds edit_project_evsounds=Event sounds: edit_project_evsounds_tooltip=Set specific sounds for each JClic event edit_act_evsounds=Event sounds: edit_act_evsounds_tooltip=Set specific sounds for each JClic event edit_evsounds_default=default sound edit_evsounds_disabled=disabled edit_evsounds_chk_tooltip=Enable or disable the sound for this event edit_evsounds_select_tooltip=Click to select a sound for this event, or uncheck to use the default sound action_newProject_caption=New project... action_newProject_keys=NN action_newProject_tooltip=Create a new JClic project edit_arith_op_from=From: edit_arith_op_from_tooltip=Minimum value of the operator edit_arith_op_to=To: edit_arith_op_to_tooltip=Maximum value of the operator edit_arith_op_with=With: edit_arith_op_with_tooltip=If checked, the operator can also have this value edit_arith_op_fromList=One from the list: edit_arith_op_fromList_tooltip=List of possible values for the operator edit_arith_op_decimals=Decimals: edit_arith_op_decimals_tooltip=Number of decimals of the operand edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=First operand edit_arith_secondOp=Second operand edit_arith_title=Arith2 for JClic edit_arith_operations=Operations: edit_arith_operations_tooltip=Select the kind of operations to be performed edit_arith_operations_plus=Plus edit_arith_operations_minus=Minus edit_arith_operations_multiply=Multiply edit_arith_operations_divide=Divide edit_arith_unknown=Unknown: edit_arith_unknown_tooltip=Select the item that will act as a unknown edit_arith_unknown_aobx=The result is the unknown edit_arith_unknown_aoxr=The second operator is the unknown edit_arith_unknown_xobr=The first operator is the unknown edit_arith_unknown_axbr=The operation is the unknown edit_arith_unknown_invert=Write the result at the beggining of the expression edit_arith_result=Result: edit_arith_result_notCarry=Do not carry edit_arith_result_random=Random edit_arith_result_asc=Ascending edit_arith_result_order=Order by result: edit_arith_result_desc=Descending edit_arith_result_avoidDup=Avoid duplicates edit_arith_cond=Conditions: edit_arith_cond_ind=Indifferent edit_arith_cond_agb=The first operator must be greather than the second one edit_arith_cond_alb=The first operator must be lesser than the second one edit_arith_cond_tooltip=Other conditions edit_autocp=Automatic content generator: edit_autocp_tooltip=Select the type of automatic content generator for this activity. edit_autocp_block=Content generator edit_autocp_btn=Settings... edit_autocp_btn_tooltip=Configure the content provider settings edit_data=Edit data edit_act=Activity edit edit_acp=Content provider edit edit_acp_err_creating=Error creating the content provider! edit_project_author_group=Creation edit_project_description_block=Description edit_project_ui_block=User interface edit_act_description=Description: m_Edit=Edit m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=New activity... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Insert m_Insert_Mnemonic=I m_View=View m_View_Mnemonic=V action_editProject_caption=Project action_editProject_keys=PP action_editProject_tooltip=Edit project settings action_editMedia_caption=Media action_editMedia_keys=MM action_editMedia_tooltip=Edit the project's multimedia library action_editActivities_caption=Activities action_editActivities_keys=AA action_editActivities_tooltip=Edit the activities action_editSeq_caption=Sequences action_editSeq_keys=SS action_editSeq_tooltip=Edit the sequences of activities warn_project_modified=Current project has been modified. Do you want to save the changes? edit_project_descriptors_block=Descriptors edit_media_new=New media object... edit_media_new_tooltip=Add a new image or multimedia object to the library edit_media_new_keys=M* edit_seq_threshold=Score threshold: edit_seq_threshold_tooltip_up=Take this way when the global score is equal to or higher than... edit_seq_time=Time threshold: edit_seq_time_tooltip_up=In order to take this way, the time spent on the activities must be less than... edit_seq_threshold_tooltip_down=Take this way when the global score is lower than... edit_seq_time_tooltip_down=Take this way when the time spent on the activities is more than... edit_seq_condJump=Conditional jumps edit_seq_condJump_tooltip=Set special jumps to be executed only under specific condicions edit_seq_condJump_upper_tooltip=Set conditions to jump to an upper level edit_seq_condJump_lower=Lower jump: edit_seq_condJump_upper=Upper jump: edit_seq_condJump_lower_tooltip=Set conditions to jump to an lower level edit_seq_action_tooltip_fw=Action assigned to the "next" button edit_seq_action_tooltip_bk=Action assigned to the "previous" button edit_seq_jump_tooltip=Set the jump target edit_seq_action_tooltip=Action to be done edit_seq_activity_tooltip=Activity assigned to this sequence element edit_seq_tag_tooltip=Tag used to reference this sequence element (optional field) edit_seq_description_tooltip=Description of the sequence element (optional field) edit_seq_button_enabled_tooltip=Enable or disable the arrow button edit_seq_auto_tooltip=Move on automatically when the activity finishes edit_seq_delay_tooltip=Seconds to wait before to do the automatic move edit_color_dlgTitle=Select color edit_media_renaming=Please wait while the resource is being renamed... edit_act_cell_width=Width: edit_act_cell_width_tooltip=Cell width (in pixels) edit_act_cell_height=Height: edit_act_cell_height_tooltip=Cell height (in pixels) edit_act_hiddenWords=Hidden words: edit_act_hiddenWords_tooltip=List of the hidden words placed in the panel edit_act_wordSearch_panelB=Use panel B edit_act_wordSearch_panelB_tooltip=The contents of a second panel will be displayed as words are found edit_act_shaper_tooltip=Select the shaper type to be used in the panel edit_act_num_cols_tooltip=Number of columns of the panel edit_act_num_rows_tooltip=Number of rows of the panel edit_act_wildTransparent=Transparent delimiters edit_act_wildTransparent_tooltip=Treat the delimiters (black boxes) as transparent holes edit_act_behavior_scramble_times=Mixes: edit_act_behavior_scramble_times_tooltip=Number of times to shuffle edit_act_copy_title=Copy attributtes to... edit_act_copy_attributes=Attributes edit_act_copy_dest=Apply to: edit_act_copy_style_main=Main window edit_act_copy_style_play=Play window edit_act_copy_activities=Activities to be modified: edit_act_copyAttributes=Copy attributes edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=Copy current activity attributes to other activities edit_new_project_name=Project name: edit_new_project_name_tooltip=Short, descriptive name of the project edit_new_project_filename=File name: edit_new_project_filename_tooltip=Name of the project file, without extension edit_new_project_folder=Folder: edit_new_project_folder_tooltip=Name of the folder where the project will be stored edit_new_project_folder_browse=Browse... edit_new_project_title=Create new JClic project edit_new_project_err_empty=Error: Project, file and folder must have valid, non-empty names. edit_new_project_warning_noEmptyFolder=This folder already contains another Clic 3.0 or JClic project. In order to avoid confusions, is preferable to maintain each project in a separate folder, but that isn't a strict rule. Do you really want to create the new project in this folder? edit_new_project_err_folderCreation=Error: Unable to create the specified folder! edit_act_copy_err_noSelection=Error: No activity selected! In order to use this function you must select in the list the activity or activities to wich the indicated attributes will be applied. edit_act_copy_action_prefix=Copying attributes to: edit_act_copy_margin=Margin edit_act_copy_bgColor=Background color edit_act_copy_gradient=Gradient edit_act_copy_bgImage=Background image edit_act_copy_border=Border edit_act_copy_transparentBg=Transparent background edit_act_copy_position=Position edit_act_copy_messages=Messages edit_act_copy_messages_ini=Style of initial message edit_act_copy_messages_end=Style of end message edit_act_copy_messages_err=Style of error message edit_act_copy_reports=Reports edit_act_copy_rep_include=Include activity in reports edit_act_copy_rep_actions=Record actions edit_act_copy_interface=User interface edit_act_copy_skin=Skin edit_act_copy_evSounds=Event sounds edit_act_copy_counters=Counters edit_act_copy_cTime=Time counter edit_act_copy_maxTime=Max. time edit_act_copy_cTries=Tries counter edit_act_copy_maxTries=Max. tries edit_act_copy_cScore=Score counter edit_act_copy_scramble=Times to scramble edit_act_copy_buttons=Buttons edit_act_copy_btnHelp=Help button edit_act_copy_btnInfo=Information button edit_act_copy_grids=Grids edit_act_copy_gridA=Style of grid A edit_act_copy_gridB=Style of grid B edit_act_copy_textGrid=Style of text grids edit_act_copy_text=Text activities edit_act_copy_fontFace=Font face edit_act_copy_fontSize=Font size edit_act_copy_fontStyle=Font style edit_act_copy_textColour=Main text colour edit_act_copy_textTargetColour=Select the JClic project of which the activities will be imported edit_act_copy_textErrorColour=Errors colour edit_act_copy_tabSpace=Tab space edit_act_copy_messages_prev=Style of previous message edit_act_changeType=Change activity type edit_act_newActivity_class_tooltip=Full name of the class to be used to build the activity (advanced users only!) edit_act_newActivity_other=Other... edit_act_newActivity_info=Advanced users can also create unregistered types of JClic activities. Just write below the full class name, prefixed by the package (like "com.acme.activities.FooActivity"). Activity classes must extend edu.xtec.jclic.Activity, and must be accessibles to the JVM classloader. edit_act_newActivity_name=Name of the activity: edit_act_newActivity_name_tooltip=Each activity must have a name unique in the project edit_act_changeType_warning=

Warning: Changing the type of activity can cause lost of some of the current activity attributes and objects. Use it with care!

 

applet_codebase=Location of JClic code: applet_codebase_tooltip=URL pointing to a folder with the JClic program files and scripts applet_prev_text=HTML code before: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=Text or HTML code to be placed before the applet applet_post_text=HTML code after: applet_post_text_tooltip=Text or HTML code to be placed after the applet applet_size=Applet size: applet_size_tooltip=Width and height of the applet, in absolute or percentage values. applet_page_title=Page title: applet_page_title_tooltip=Text to be shown at the top of the browser window applet_created_info=The web page "%s" has been created successfully. applet_created_prompt=Do you want to open it now with the browser? action_createHTML_caption=Create web page... applet_create_title=Creation of an HTML page with a JClic applet action_createHTML_tooltip=Create a HTML page with an applet containing the current project applet_filename=File name: applet_filename_tooltip=Name of the HTML file to be created action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Default values used in web page creation applet_bgcolor=Background color: applet_bgcolor_tooltip=HTML page background color applet_centered=Centered applet_centered_tooltip=Place the applet horizontally centered applet_width_tooltip=Applet width (absolute or percentage) applet_height_tooltip=Applet height (absolute or percentage) applet_exitUrl=On exit, go to: applet_exitUrl_tooltip=URL where to redirect the navigation on JClic exit applet_infoFrame=Info frame name: applet_infoFrame_tooltip=Name of the frame used to show the content related to the "info" button action_createInstaller_caption=Create project installer... action_createInstaller_keys=I* action_createInstaller_tooltip=Create a project installer script for JClic player installer_caption=Edit project installer script installer_title=Title: installer_title_tooltip=Project title, to be shown on the installer wizard installer_authors=Autors: installer_authors_tooltip=Author/s of the project (short text) installer_folder=Folder: installer_folder_tooltip=Folder name to be suggested by the installer wizard installer_files=Files to be copied: installer_files_tooltip=Files to be copied by the installer installer_files_available=Available files installer_files_selected=Selected files installer_files_add=>> add >> installer_files_add_tooltip=Add selected file to the list installer_files_remove=<< remove << installer_files_remove_tooltip=Remove selected file from the list installer_button=Launch button installer_button_tooltip=Properties of the button to be shown in the project library installer_button_project=Main project: installer_button_project_tooltip=JClic project to be launched by the button installer_button_text=Label: installer_button_text_tooltip=Short text label, to be shown inside the button installer_button_icon=Icon: installer_button_icon_tooltip=Picture to be used as button icon. Leave blank to use the default JClic icon. installer_button_description=Description installer_button_description_tooltip=Tooltip to be shown by the button installer_error_noTitle=Error: Missing project title installer_error_noBaseFolder=Error: Missing folder name installer_error_noFilesSelected=Error: No files selected installer_error_noButtonText=Error: Missing launch button text label installer_error_projectNotInFiles=Error: The project assigned to the launch button is not in the list of files to be copied applet_page_full=Full-page applet applet_page_mixed=Applet with specific dimensions edit_text_align_left=Align text left edit_text_align_center=Center text edit_text_align_right=Align text right edit_text_act_target_toggle=Create or remove target edit_text_act_insertCell=Insert a cell edit_text_act_content=Content edit_text_act_style=Style edit_cell_size=Cell size: edit_project_orphanActivities=The following activities never appear in any of the project's activity sequences, so they never will be displayed: edit_project_orphanMedia=The following media objects are not used directly in any activity: edit_project_orphanActivities_prompt=Do you want to add them at the end of the last activity sequence? edit_project_orphanMedia_prompt=Do you want to remove them? edit_project_orphanMedia_title=Removal of unused media objects edit_project_orphanActivities_title=Orphan activities edit_media_refreshAll=Update all media content edit_media_refreshAll_tooltip=Update all media objects reloading its files edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Updating media... edit_media_exportAll=Export all media edit_media_exportAll_tooltip=Save to files the content of all media elements edit_media_exportAll_keys=X* edit_shape_select=Select edit_shape_addPoint=Add point edit_shape_deletePoint=Delete edit_shape_drawRect=Draw rectangle edit_shape_drawEllipse=Draw ellipse edit_shape_drawPoly=Draw polygon edit_shape_toLine=Convert to line edit_shape_toBezier=Convert to B\u00E9zier curve edit_shape_toQuad=Convert to quadratic curve edit_shape_rLeft=Rotate left edit_shape_rRight=Rotate right edit_shape_expand=Expand edit_shape_contract=Contract edit_shape_zoomIn=Zoom in edit_shape_zoomOut=Zoom out edit_shape_aproxPoints=Join nearest points edit_shape_showPoints=Show points edit_shape_showPoints_tooltip=Show/Hide the points edit_shape_gridSize=Grid size: edit_shape_hideGrid=Show / Hide grid edit_shape_magnetRadius=Magnet radius: edit_shape_elements=Defined elements edit_shape_elemName=Name of the selected element edit_shape_magnetRadius_tooltip=Action radius of the magnet, when enabled edit_shape_gridSize_tooltip=Size of the grid edit_mc_activity=Activity: edit_mc_sequence=Sequence: edit_mc_url=URL: edit_mc_project=Project: edit_mc_activity_selection=Choose activity edit_mc_sequence_selection=Choose sequence edit_mc_err_nullContent=Insufficient data! edit_act_arrowColor=Arrow color: edit_act_arrowColor_tooltip=Color used by the editor to draw the arrows (not exactly, because an XOR bit mask is used) edit_act_editActivity=Edit... edit_act_editActivity_tooltip=Edit the selected activity action_saveFileAs_caption=Save as... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Save the current project with a different name edit_act_behavior_block=Behavior edit_act_behavior=Behavior edit_act_behavior_drag=Drag objects edit_act_behavior_drag_tooltip=Drag objects instead of use a connection line edit_act_behavior_order=Check solving order edit_act_behavior_order_tooltip=Cells must be solved in order edit_act_scramble=Scramble action_importActivities_caption=Import activities... action_importActivities_keys=I* action_importActivities_tooltip=Import activities from another project import_warn_samefile=The selected file corresponds to the current project. Activities can be imported only between different projects. Please select another project file. import_selectActivities=Select one or more activities to import into the current project: import_importing=Importing... import_checkdep=Checking dependencies... import_impmedia=Importing media: import_impact=Importing activity: import_selectProject=Select the JClic project of which the activities will be imported edit_tagRep_tags=Tag marks edit_tagRep_tagStart=Start mark: edit_tagRep_tagStart_tooltip=Mark used at the beginning of tags edit_tagRep_tagEnd=End mark: edit_tagRep_tagEnd_tooltip=Mark used at the end of tags edit_tagRep_file=File edit_tagRep_fileName=File or URL: edit_tagRep_fileName_tooltip=Name or URL of the file containing the values that will replace tags edit_tagRep_charset=Charset: edit_tagRep_charset_tooltip=Character encoding used in the file edit_tagRep_browseFile=Browse... edit_tagRep_browseFile_tooltip=Browse the filesystem edit_tagRep_title=Tag replacing edit_text_act_clearStylesBtn=Clear text styles... edit_text_act_clearStylesPrompt=Warning: This action will clear the specific character attributes applied to the document, setting it back to its main style. This action cannot be undone. Do you want to do it? img_max_size=Maximum size of images: img_max_width_tooltip=Maximum width of images imported into the media library. img_max_height_tooltip=Maximum height of images imported into the media library. img_resize_prompt=The image "%s" has a size of %s pixels. This exceeds the maximum allowed by JClic Author (%s). Do you want to resize it? src/author/edu/xtec/resources/messages/AuthorMessages_vec.properties000066400000000000000000001343641335566474600264530ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=Descrision edit_act_name_tooltip=N\u00F2me de \u019Aa ativit\u00E0 edit_act_name=N\u00F2me: edit_act_description_tooltip=Descrision de \u019Aa ativit\u00E0 edit_act_reports_block=Reports edit_act_includeInReports=Includi sta ativit\u00E0 inte i reports edit_act_includeInReports_tooltip=Includi i rexultadi de sta ativit\u00E0 inte i reports utente edit_act_code=C\u00F2dexe: edit_act_code_tooltip=C\u00F2dexe opsional par grupar e sercar inte 'l database de i reports. edit_act_reportActions=Asion utente report edit_act_reportActions_tooltip=Registra i detali de tute \u019Ae asion fate da i utenti edit_act_counters_block=Contadori edit_act_timeCounter=Conta tenpo edit_act_timeCounter_tooltip=Mostra/scondi el conta tenpo edit_act_actionsCounter=Contador de tentadivi edit_act_actionsCounter_tooltip=Mostra/scondi el contador de tentadivi edit_act_scoreCounter=Contador de pontexio edit_act_scoreCounter_tooltip=Mostra/scondi el contador de pontexio edit_act_maxTime=Tenpo m\u00E0simo: edit_act_maxTime_tooltip=Tenpo m\u00E0simo par res\u00F2lver \u019Aa ativit\u00E0, in secondi, o 0 se tenpo sensa l\u00ECmite. edit_act_countdown=Conta a indr\u00ECo edit_act_countdown_tooltip=El contador el parte da 'l va\u019Aor m\u00E0simo, a ca\u019Aando fin 0. edit_act_maxActions=M\u00E0simo tentadivi: edit_act_maxActions_tooltip=N\u00F9maro m\u00E0simo de tentadivi consent\u00ECi, o 0 par tentadivi sensa l\u00ECmite. edit_act_buttons_block=Botoni edit_act_helpBtn=\u00C0ida edit_act_helpBtn_tooltip=Mostra/scondi el boton de \u00E0ida edit_act_helpBtn_solution=Mostra so\u019Ausion edit_act_helpBtn_msg=Mostra sto mesajo edit_act_infoBtn=Informasion edit_act_infoBtn_tooltip=Mostra/scondi el boton de informasion edit_act_infoBtn_url=Mostra sto URL: edit_act_infoBtn_cmd=Ex\u00E8gui sto comando: edit_act_infoBtn_url_tooltip=Indriso de sito web da mostrar co se clica so 'l boton de informasion edit_act_infoBtn_cmd_tooltip=Command line da exeguir co se clica so 'l boton de informasion edit_act_mainWindow=Fen\u00E8stra prensipal: edit_act_gameWindow=Fen\u00E8stra xiogo: edit_act_margin=M\u00E0rxine: edit_act_margin_tooltip=Spassio orixontal e vertical fra i og\u00E8ti. edit_act_bgColor=Co\u019Aor de sfondro: edit_act_bgColor_tooltip=Canbia el co\u019Aor de sfondro. edit_gradient_startColor=Co\u019Aor a 'l inv\u00ECo: edit_gradient_endColor=Co\u019Aor in \u00F9ltima: edit_gradient_startColor_tooltip=Se\u019Aesion de 'l co\u019Aor a 'l inv\u00ECo edit_gradient_endColor_tooltip=Se\u019Aesion de 'l co\u019Aor in \u00F9ltima edit_gradient_cycles=Cicli: edit_gradient_cycles_tooltip=N\u00F9maro de repetision de \u019Aa sfumadura so \u019Aa superfisie co\u019Aorada edit_gradient_orientation=Orientasion: edit_gradient_orientation_tooltip=Orientasion de \u019Aa sfumadura, mexurada in grai so \u019Aa orixontal. edit_act_gradient=Sfumadura: edit_act_gradient_tooltip=D\u00F2para sfumadura de co\u019Aori edit_color_opacity=Opasit\u00E0 edit_color_opacity_tooltip=Desernisi el va\u019Aor de 'l alpha channel (opasit\u00E0) de 'l co\u019Aor edit_gradient_title=Sfumadura edit_gradient_default=D\u00F2para va\u019Aori preinpost\u00E0i (gninte sfumadura) edit_act_image=Im\u00E0xene: edit_act_descriptionTab=Descrision edit_act_descriptionTab_tooltip=N\u00F2me e descrision edit_act_tiledBgImg=Repetesto edit_act_tiledBgImg_tooltip=Co\u00E8rxi tuta \u019Aa superfisie co' \u019Aa im\u00E0xene, a repet\u00ECndo\u019Aa drio i asi X e Y conforme che senghe vol. edit_act_preview=Anteprima: edit_act_border=Bordo edit_act_border_tooltip=F\u00E0 na riga de bordo intorno \u019Aa im\u00E0xene edit_act_transparent=Trasparente edit_act_transparent_tooltip=\u023Da fen\u00E8stra a g\u00E0 el sfondro trasparente edit_act_width=Larghesa: edit_act_height=Altesa: edit_act_width_tooltip=Larghesa de 'l og\u00E8to, mexurada in pixels. edit_act_height_tooltip=Altesa de 'l og\u00E8to, mexurada in pixels. edit_act_centered=In m\u00E8xo edit_act_centered_tooltip=El og\u00E8to el vegnar\u00E0 inte 'l ponto median de \u019Aa larghesa de \u019Aa fen\u00E8stra edit_act_x=X: edit_act_x_tooltip=Poxision orixontal aso\u019Auta edit_act_y=Y: edit_act_y_tooltip=Poxision vertical aso\u019Auta edit_act_ui_block=Interfacia utente edit_act_image_tooltip=Desernisi na im\u00E0xene edit_act_text=T\u00E8sto: edit_act_text_tooltip=T\u00E8sto da mostrar indrento sto og\u00E8to edit_font_face=Faciavista car\u00E0tere edit_font_size=Dimension: edit_font_bold=Graseto edit_font_italic=Corsivo edit_font_underline=Sotolini\u00E0 edit_font_style=Stil: edit_cell_title=Contenudo cax\u00E8\u019Ae edit_act_messages=Mesaji edit_act_msg_initial=Mesajo in prinsipio: edit_act_msg_final=Mesajo in \u00F9ltima: edit_act_msg_prev=Mesajo presedente: edit_act_msg_error=Mesajo de eror: edit_act_msg_initial_tooltip=Mesajo da mostrar co se invia \u019Aa ativit\u00E0 edit_act_msg_final_tooltip=Mesajo da mostrar co se fenise \u019Aa ativit\u00E0 edit_act_msg_error_tooltip=Mesajo da mostrar co se fenise \u019Aa ativit\u00E0 co' erori edit_act_msg_prev_tooltip=Mesajo da mostrar inanso de 'l inv\u00ECo de l'ativit\u00E0 (n\u00F2ma che in calche segnato de ativit\u00E0). edit_align=Inriga: edit_act_textColor=Co\u019Aor de 'l t\u00E8sto: edit_act_textColor_tooltip=Co\u019Aor dopar\u00E0 par scr\u00ECvar el t\u00E8sto edit_act_shadowColor=Co\u019Aor de \u00F3nbrixamento: edit_act_shadowColor_tooltip=Co\u019Aor dopar\u00E0 par mostrar el onbrixamento de 'l t\u00E8sto (co x\u00E9 pos\u00ECbi\u019Ae) edit_act_shadow=Onbra edit_act_shadow_tooltip=Scrivi el t\u00E8sto onbrix\u00E0 edit_act_borderColor=Co\u019Aor de 'l bordo: edit_act_borderColor_tooltip=Co\u019Aor dopar\u00E0 par i bordi de \u019Ae cax\u00E8\u019Ae edit_act_inactiveColor=Co\u019Aor par stato inativo edit_act_inactiveColor_tooltip=Co\u019Aor dopar\u00E0 co \u019Aa cax\u00E8\u019Aa \u019Aa x\u00E9 dexativada edit_act_altColor=Co\u019Aor alternadivo: edit_act_altColor_tooltip=Co\u019Aor dopar\u00E0 par scr\u00ECvar el contenudo alternadivo inte \u019Ae cax\u00E8\u019Ae resolveste. edit_cell_marked=Evidensi\u00E0 edit_cell_disabled=Dexabi\u019Ait\u00E0 edit_cell_alt=Alternadivo edit_cell_textMargin=m\u00E0rxine int\u00E8rno: edit_cell_textMargin_tooltip=Spasio fra bordo de \u019Aa cax\u00E8\u019Aa e t\u00E8sto. edit_cell_borderWidth=Larghesa bordo: edit_cell_borderWidth_tooltip=Larghesa de 'l segno dopar\u00E0 par far el bordo edit_cell_markerWidth=Larghexa de 'l marcador: edit_cell_markerWidth_tooltip=Larghesa de 'l segno dopar\u00E0 par far el bordo co \u019Aa cax\u00E8\u019Aa \u019Aa x\u00E9 evidensiada o desern\u00ECa edit_cell_alt_tooltip=Anterpima in stato "alternadivo" edit_cell_disabled_tooltip=Anterpima in stato "dexativ\u00E0" edit_cell_marked_tooltip=Anterpima in stato "evidens\u00E0" edit_act_testAction=Anteprima ativit\u00E0 edit_act_testAction_tooltip=Anteprima e prova de \u019Aa ativit\u00E0 edit_act_panels_description=Descrision edit_act_panels_description_tooltip=T\u00ECto\u019Ao e descrision de \u019Aa ativit\u00E0 edit_act_panels_options=Opsion edit_act_panels_options_tooltip=Opsion de \u019Aa ativit\u00E0 edit_act_panels_frame=Fen\u00E8stra edit_act_panels_frame_tooltip=Faciavista, dimension e poxision de \u019Aa fen\u00E8stra de ativit\u00E0 edit_act_panels_messages=Mesaji edit_act_panels_messages_tooltip=Contenudo de i mesaji de \u019Aa ativit\u00E0 edit_act_panels_panel=Pan\u00E8\u019Ao edit_act_panels_panel_tooltip=Contenudi de 'l pan\u00E8\u019Ao edit_style_title=Stil edit_style_tooltip=Inp\u00F2sta i co\u019Aori de \u019Ae cax\u00E8\u019Ae, el font e \u019Aa dimension edit_act_style=Stil: edit_act_overlap=Inpedisi che el t\u00E8sto el soramonte \u019Aa im\u00E0xene edit_act_overlap_tooltip=Proa a inpedir che el t\u00E8sto el soramonte \u019Aa im\u00E0xene edit_media_exists_1=El file edit_media_exists_2=el existe x\u00E0 inte \u019Aa librer\u00ECa de i media! edit_act_shaper=Shaper: edit_act_shaper_err=Eror de 'l shaper: edit_act_num_cols=Co\u019A\u00F2ne: edit_act_num_rows=Righe: edit_act_toothHeightFactor=Altesa de 'l dente: edit_act_toothWidthFactor=Larghesa de 'l dente: edit_act_toothRandom=Destribusion a caxo edit_act_shaper_properties=Propiet\u00E0 de 'l shaper edit_act_panels_text=T\u00E8sto edit_act_panels_text_tooltip=T\u00E8sto de l'ativit\u00E0 action_saveFile_caption=Salva... action_saveFile_keys=SS action_saveFile_tooltip=Salva el prox\u00E8to corente action_docTree_caption=\u00C0lbaro de 'l documento... action_docTree_keys=T* action_docTree_tooltip=Mostra el documento de 'l prox\u00E8to f\u00E0 un \u00E0lbaro edit_docTree_title=\u00C0lbaro de 'l documento edit_media_referencedBy=Referensi\u00E0 da: msg_prompt_loadReferences=Atension:

Sto prox\u00E8to el g\u00E0 indrentto altri prox\u00E8ti.
Vusto esplorar i link e cargar tuti i files re\u019Aativi?

(Se conseja de resp\u00F3nder S\u00CC se se x\u00E9 drio inportar ativit\u00E0 de Clic 3.0) edit_mc_type=Tipo: edit_mc_type_unknown=Desconosesto edit_mc_type_sound=Inv\u00ECa son\u00F2ro edit_mc_type_video=Inv\u00ECa video edit_mc_type_midi=Inv\u00ECa MIDI edit_mc_type_cdaudio=Inv\u00ECa CD audio edit_mc_type_record=Rejistra son\u00F2ro edit_mc_type_play_recorded=Inv\u00ECa son\u00F2ro rejistr\u00E0 edit_mc_type_run_activity=V\u00E0 a ativit\u00E0 edit_mc_type_run_sequence=V\u00E0 a secuensa edit_mc_type_run_external=Inv\u00ECa programa edit_mc_type_url=Mostra URL edit_mc_type_exit=S\u00F2rti edit_mc_type_return=Torna a programa edit_mc_level=Liv\u00E8\u019Ao de priorit\u00E0: edit_mc_file=File: edit_mc_externalParam=Par\u00E0metri: edit_mc_from=Da: edit_mc_to=A: edit_mc_length=Longhesa m\u00E0sima: edit_mc_recBuffer=Rejistrador: edit_mc_stretch=Destira dimension edit_mc_location=Poxision: edit_mc_location_x=X: edit_mc_location_y=Y: edit_mc_location_from=Da: edit_mc_location_from_box=Cax\u00E8\u019Aa edit_mc_location_from_window=Fen\u00E8stra edit_mc_location_from_frame=Frame edit_mc_loop=Repetision cont\u00ECnua edit_mc_autostart=Inv\u00ECa da to p\u00F2sta edit_mc_catchmouse=Catura el mouse edit_mc_title=Contenudo miltimedial e ativo edit_mc_label=Contenudo ativo: edit_media_dlg_title=Se\u019Aesion og\u00E8to multimedial edit_media_title=Librer\u00ECa multimedia edit_mc_pos_cell=Inte \u019Aa cax\u00E8\u019Aa in m\u00E8xo edit_mc_pos_window=Inte \u019Aa fen\u00E8stra in m\u00E8xo edit_mc_pos_absolute=Spes\u00ECfega poxision edit_tree_badFormat=Strututa o dati de 'l \u00E0lbaro no cor\u00E8ti! edit_act_panels_controls=Contr\u00F2\u019Ai edit_act_panels_controls_tooltip=Opsion par botoni e contadori edit_act_class=Tipo: edit_act_gridLayout=Dispoxision gr\u00E8\u019Aa: edit_act_gridLayout_tooltip=Poxision re\u019Aativa de i pan\u00E8\u019Ai A e B. edit_act_inverseResolution=Reso\u019Ausion invert\u00ECa edit_act_inverseResolution_tooltip=\u023Da ativit\u00E0 \u019Aa x\u00E9 resolvesta co tuti i elementi asegn\u00E0i de "B" i conbina. edit_act_showAllArrows=Mostra tute \u019Ae frece edit_act_alt=Contenudo alternadivo: edit_act_alt_tooltip=Contenudo mostr\u00E0 inte \u019Ae cax\u00E8\u019Ae resolveste e no-asegn\u00E0e. edit_act_alt_toggle=ALT edit_act_alt_toggle_tooltip=Mod\u00ECfega el contenudo alternadivo edit_act_grid=Gr\u00E8\u019Aa edit_act_grid_A=Gr\u00E8\u019Aa A edit_act_grid_B=Gr\u00E8\u019Aa B edit_act_grid_layout=Despoxision edit_act_grid_relationship=Rap\u00F2rttoo edit_seq_activity_header=ativit\u00E0 edit_seq_tag_header=tag edit_seq_jump_header=salta a edit_seq_activity=Ativit\u00E0: edit_seq_tag=Ticheta: edit_seq_description=Descrision: edit_seq_auto=Va vanti da to p\u00F2sta edit_seq_delay=Retardo: edit_seq_action_fwd=V\u00E0 vanti edit_seq_action_back=V\u00E0 indr\u00ECo edit_seq_action_jump=Salta a... edit_seq_action_stop=Stop edit_seq_action_return=Torna a programa edit_seq_action_exit=S\u00F2rti da JClic edit_seq_arrow_fwd=Frecia invanti: edit_seq_arrow_back=Frecia indr\u00ECo: edit_seq_action=Asion: edit_seq_button_enabled=Mostra boton edit_seq_project=Prox\u00E8to JClic edit_act_absolute=Poxision aso\u019Auta edit_act_absolute_tooltip='L og\u00E8to el vegnar\u00E0 poxision\u00E0 so \u019Ae coordinade X e Y spesifeg\u00E0e edit_act_location=Poxision: edit_seq_newElement=Elemento niovo de secuensa... edit_seq_newElement_tooltip=Inserisi naltro elementointe \u019Aa secuensa de ativit\u00E0 edit_seq_newElement_msg=Desernisi na ativit\u00E0 par 'll elemento niovo de secuensa. edit_seq_newElement_error_noAct=No se pol inviar un elemento de secuensa niovo sensa ativit\u00E0! edit_seq_newElement_error_emptyList=Sto prox\u00E8to no 'l g\u00E0 ativit\u00E0! No se pol inviar lementi de ativit\u00E0 inte un prox\u00E8to vodo. edit_seq_jump_msg=Obietivo de 'l salto: edit_seq_jump_title=Obietivo de 'l salto edit_act_newActivity_tooltip=Xonta ativit\u00E0 niova a prox\u00E8to edit_act_prompt_class=Tipo de ativit\u00E0: edit_act_prompt_name=N\u00F2me edit_act_newActivity_msg=Desernisi el tipo de ativit\u00E0 par prod\u00F9xerla e darghe un n\u00F2me: edit_act_newActivity_error_noAct=Te g\u00E0 da desernir un tipo de ativit\u00E0! edit_act_newActivity_error_noName=Te g\u00E0 da spesifegar un n\u00F2me par sta ativit\u00E0! edit_act_newActivity_error_creating=No se pol inviar \u019Aa ativit\u00E0! edit_act_newActivity_class=N\u00F2me de \u019Aa Java class: edit_text_act_format=Formato edit_text_act_answer=Resp\u00F2sta edit_text_act_popup=Pop up edit_text_act_answer_label=Resp\u00F2ste v\u00E0\u019Aide: edit_list_newElement_tooltip=Xonta naltro elemento de lista edit_list_editElement_tooltip=Mod\u00ECfega el lemento de lista desern\u00ECo edit_list_deleteElement_tooltip=Scans\u00E8\u019Aa el elemento de lista desern\u00ECo edit_list_upBtn_tooltip=Sposta in suxo edit_list_downBtn_tooltip=Sp\u00F2sta in xoxo edit_list_newValue=T\u00E8sto niovo: edit_list_addElement=Xonta elemento de lista niovo edit_list_modifyValue=Mod\u00ECfega el t\u00E8sto se\u019Aesion\u00E0 edit_text_act_target=Obietivo edit_text_act_maxLen=Longhesa m\u00E0sima: edit_text_act_maxLen_tooltip=N\u00F9maro de car\u00E0teri m\u00E0simo inte \u019Aa resp\u00F2sta. edit_text_act_fillingChar=Car\u00E0tere de inpenimento edit_text_act_fillingChar_tooltip=Car\u00E0tere dopar\u00E0 par indicar el mancante edit_text_act_iniLen=Longhesa in partensa: edit_text_act_iniLen_tooltip=N\u00F9maro de car\u00E0teri de inpenimento che i vegnar\u00E0 mostr\u00E0i co scominsia \u019Aa ativit\u00E0. edit_text_act_iniText=T\u00E8sto in patensa: edit_text_act_iniText_tooltip=T\u00E8sto mostr\u00E0 inte 'l mancante co scominsia na ativit\u00E0. edit_text_act_list=Mostra na lista de alternadive: edit_text_act_list_tooltip=Mostra na lista de alternadive da cui el utente el g\u00E0 da desern\u00ECrghene una. edit_text_act_check_title=Opsion de coresion edit_text_act_popup_no=No pop up edit_text_act_popup_always=Manda popup da to p\u00F2sta edit_text_act_popup_onError=Popup in caxo de eror edit_text_act_popup_onDemand=Popup co' F1 edit_text_act_popup_type=Tipo: edit_text_act_popup_delay=Retardo popup: edit_text_act_popup_maxTime=Tenpo m\u00E0simo: edit_text_act_popup_onlyPlay=N\u00F2ma che son\u00F2ro edit_text_act_err_noSelection=Te g\u00E0 da desernir na porsion de t\u00E8sto par far un target de t\u00E8sto niovo! edit_text_act_err_badCharInSelection=El t\u00E8sto target no 'l pol ver drento n\u00E9 ritorni de par\u00E0grafo n\u00E9 tav\u00E8\u019Ae. edit_text_act_err_nestedTargets=I target no i pol ser ignar\u00E0! edit_text_act_err_cellInTarget=I targets no i pol ver drento cax\u00E8\u019Ae! edit_text_act_pageBgColor=Co\u019Aor carta: edit_text_act_editStylesBtn=Mod\u00ECfega stili de 'l documento... edit_text_act_mainStyle=Stil primario: edit_text_act_tabSpc=Spasio tav\u00E8\u019Aa: edit_text_act_tabSize=Spasi fra i delimitadori de tav\u00E8\u019Aa: edit_text_act_colors=Co\u019Aori: edit_text_act_targetStyle=Co\u019Aori taget: edit_text_act_errorStyle=Co\u019Aori erori: edit_text_act_preview=Anteprima: edit_text_act_styleSample_default_start=T\u00E8sto standard edit_text_act_styleSample_target=target edit_text_act_styleSample_error=eror edit_text_act_styleSample_default_fill=t\u00E8sto standard edit_text_act_styleSample_default_end=t\u00E8sto standard edit_text_act_warnDeleteTarget=Atension: sta asion \u019Aa cavar\u00E0 via el target se\u019Aesion\u00E0. Vusto nar vanti? edit_text_act_prevScreen_title=Schermada presedente... edit_text_act_prevScreen_no=No st\u00E0 mostrar nisun t\u00E8sto inanso de inviar \u019Aa ativit\u00E0 edit_text_act_prevScreen_original=mostra tuto el t\u00E8sto de 'l exercisio edit_text_act_prevScreen_special=Mostra sto t\u00E8sto: edit_text_act_prevScreen_time=Tenpo m\u00E0simo: edit_text_act_edit_target=Target... edit_text_act_checkButton_show=Mostra boton de coresion edit_text_act_checkButtonText=T\u00E8sto de 'l boton: edit_text_act_checkCase=Cons\u00ECdera maj\u00F9sco\u019Ao/min\u00F9sco\u019Ao edit_text_act_checkAccents=Cons\u00ECdera acenti e car\u00E0teri partico\u019Aari edit_text_act_checkPunct=Cons\u00ECdera segni de pontexadura edit_text_act_checkDoubleSpc=Consenti spasi repetesti edit_text_act_checkOptions=Criteri edit_text_act_checkAutoJump=Sp\u00F2stite a 'l target dap\u00F2 co se \u019Ao inpenise edit_text_act_checkForceOk=Sp\u00F2stite n\u00F2ma che co' se indovina po\u019Aito edit_text_act_checkDetail=Mostra erori l\u00E9tara par l\u00E9tara edit_text_act_checkDetail_params=Par\u00E0metri de 'l algoritmo de n\u00E0\u019Aixe edit_text_act_checkDetail_steps=Pasi: edit_text_act_checkDetail_field=Canpo de esplorasion: edit_text_act_defaultCheckButtonText=Contr\u00F2\u019Ao edit_text_act_advancedCorrectionOptions=N\u00E0\u019Aixe resp\u00F2sta edit_text_act_check_bt=Coresion... edit_text_act_checkButton=Boton coresion edit_text_act_checkProgress=Progr\u00E8so edit_text_act_typeBtn=Tipo edit_text_act_orderParagraphs=Ordenamento par\u00E0grafi edit_text_act_orderWords=Ordenamento par\u00F2\u019Ae edit_text_act_order_amongstPar=Insenbra par\u00F2\u019Ae fra i par\u00E0grafi edit_text_act_type_title=Tipo de ativit\u00E0 edit_text_act_warnChangeType=Sta asion \u019Aa snetar\u00E0 tuti i target existenti. Vusto nar vanti? edit_text_act_identWords=Ident\u00ECfega par\u00F2\u019Ae edit_text_act_identChars=Ident\u00ECfega car\u00E0teri edit_media_change_name=Canbia n\u00F2me... edit_media_change_file=Canbia file... edit_media_includeInZip=Salva inte file xip edit_media_type=Tipo de media: edit_media_size=Dimension de 'l file: edit_media_show_type=Files de tipo: edit_media_preview=Anteprima multimedia edit_media_preview_tooltip=Anteprima resorsa multimedial edit_media_rename=C\u00E0nbieghe n\u00F2me a resorsa edit_media_rename_title=Ren\u00F2ma edit_media_rename_prompt=N\u00F2me niovo: edit_media_rename_invalid=N\u00F2me resorsa no v\u00E0\u019Aido! edit_media_rename_exists=Ghe x\u00E9 naltra resorsa co' sto n\u00F2me! \u00D2gni resorsa \u019Aa g\u00E0 da ver un n\u00F2me suo. edit_media_chfile_invalid=File no v\u00E0\u019Aido! err_media_chfile_different=El file el g\u00E0 da \u00E8sar de 'l steso tipo edit_media_font_error=No se pol cargar le font! edit_media_save_file=Salva el file (despacheta da zip) edit_media_refresh_file=Axorna contenudo multimedial da file edit_media_warn_zipFileNotExternal=Cuesto no 'l x\u00E9 un file "real", ma un og\u00E8to log\u00E0 inte un contenidor zip. Par far sta fatura, g\u00E0 da \u00E8sarghe un file co'l steso n\u00F2me inte \u019Aa cart\u00E8\u019Aa indove che ghe x\u00E9 log\u00E0 el file zip. edit_activities=Ativit\u00E0 edit_sequences=Secuense edit_media=Librer\u00ECa multimedia edit_media_tooltip=Gestisi im\u00E0xine e altri files multimedia dopar\u00E0i inte 'l prox\u00E8to edit_activities_tooltip=Produxi e mod\u00ECfega ativit\u00E0 de prox\u00E8to edit_sequences_tooltip=Mod\u00ECfega e produxi secuense de ativit\u00E0 edit_project_title=T\u00ECto\u019Ao: edit_project_title_tooltip=T\u00ECto\u019Ao de 'l prox\u00E8to edit_project=Prox\u00E8to edit_project_tooltip=Mod\u00ECfega propiet\u00E0 de 'l prox\u00E8to edit_project_description=Descrision: edit_project_description_tooltip=Descrision xeneral de 'l prox\u00E8to edit_project_area=\u00C0ree edit_project_area_tooltip=\u00C0ree curicolari de 'l prox\u00E8to edit_project_level=Liv\u00E8\u019Ai: edit_project_level_tooltip=Liv\u00E8\u019Ai formadivi de 'l prox\u00E8to edit_project_descriptors=Descritori: edit_project_descriptors_tooltip=Descritori de 'l prox\u00E8to (separ\u00E0i da v\u00ECrgo\u019Aa) edit_project_languages=Lengue: edit_project_languages_tooltip=Lengue dopar\u00E0e inte 'l prox\u00E8to edit_project_languages_modify=Canbia \u019Aa lengua se\u019Aesionada edit_project_languages_add=Xonta lengua edit_project_languages_select=C\u00F2dexi de lengua ISO-639 edit_project_authors=Autori: edit_project_authors_tooltip=Persone partesipante inte \u019Aa produsion de 'l prox\u00E8to. edit_project_author_name=N\u00F2me: edit_project_author_mail=e-mail: edit_project_author_rol=R\u00F2\u019Ao: edit_project_author_organization=Organexasion: edit_project_author_comments=Comenti: edit_project_author_url=URL: edit_project_author_name_tooltip=N\u00F2me de 'l autor (richi\u00E8sto) edit_project_author_mail_tooltip=Email de 'l autor (facoltadivo) edit_project_author_rol_tooltip=R\u00F2\u019Ao de \u019Aa persona inte 'l prox\u00E8to: atuor, co\u019Aaborante, dexegni, son\u00F2ri.. (facoltadivo) edit_project_author_organization_tooltip=Sc\u00F2\u019Aa, universit\u00E0, sociasion, organexasion... (facoltadivo) edit_project_author_url_tooltip=P\u00E0xena web personal (facoltadivo) edit_project_author_comments_tooltip=Canpo par altre infirmasion (facoltadivo) edit_project_author_info=Informasion autor: edit_project_author_add=Xonta autor a lista edit_project_author_edit=Mod\u00ECfega informasion autor edit_project_org_name=N\u00F2me: edit_project_org_name_tooltip=N\u00F2me sc\u00F2\u019Aa edit_project_org_mail=e-mail: edit_project_org_mail_tooltip=indriso e-mail de \u019Aa sc\u00F2\u019Aa edit_project_org_url=URL: edit_project_org_url_tooltip=Sito web de \u019Aa sc\u00F2\u019Aa edit_project_org_address=indriso: edit_project_org_address_tooltip=Indriso de p\u00F2sta tradisional edit_project_org_pc=CP: edit_project_org_pc_tooltip=C\u00F2dexe postal edit_project_org_city=Sit\u00E0: edit_project_org_city_tooltip=Sit\u00E0 de \u019Aa sc\u00F2\u019Aa edit_project_org_country=Paexe: edit_project_org_state=Stato: edit_project_org_comments=Comenti: edit_project_org=Sc\u00F2\u019Aa/e: edit_project_org_tooltip=Sc\u00F2\u019Aa o altre istitusion coinv\u00F2lte inte 'l prox\u00E8to edit_project_org_info=Informasion organexasion: edit_project_org_add=Xonta organexasion edit_project_org_edit=Mod\u00ECfega dati organexasion edit_project_org_country_tooltip=Paexe, federasion, union... edit_project_org_state_tooltip=Stato federal, comunit\u00E0, rexion... edit_project_org_comments_tooltip=Altre informasion... edit_project_rev_date=Data: edit_project_rev_date_tooltip=Data de revixion edit_project_rev_authors=Autori: edit_project_rev_authors_tooltip=Autori de \u019Aa revixion edit_project_rev_description=Descrision: edit_project_rev_description_tooltip=Descrision br\u00E8ve de i canbiamenti fati edit_project_rev_comments=Comenti: edit_project_rev_comments_tooltip=Altre informasion ri\u019Aevante: edit_project_rev=Revixion: edit_project_rev_tooltip=St\u00F2rego de \u019Ae modifegasion primarie fate a 'l prox\u00E8to edit_project_rev_add=Xonta record revixion edit_project_rev_edit=Mod\u00ECfega record revixion edit_project_rev_info=Dati revixion edit_media_objects=og\u00E8ti edit_media_object=og\u00E8to edit_evsounds_start=Inv\u00ECo de \u019Aa ativit\u00E0: edit_evsounds_click=Clica so 'l og\u00E8to: edit_evsounds_actionError=Asion sbaliada: edit_evsounds_actionOk=Cor\u00E8xi asion: edit_evsounds_finishedError=Ativit\u00E0 terminada co' erori: edit_evsounds_finishedOk=Ativit\u00E0 terminada po\u019Aito: edit_project_rev_err_nodesc=Eror: el canpo de descrision no 'l pol ser \u019Aas\u00E0 vodo! edit_evsounds_dlg_title=Mod\u00ECfega son\u00F2ri de evento edit_project_evsounds=Son\u00F2ri de evento: edit_project_evsounds_tooltip=Inp\u00F2sta son\u00F2ri spes\u00ECfeghi par \u00F2gni evento JClic edit_act_evsounds=Son\u00F2ri de evento: edit_act_evsounds_tooltip=Inp\u00F2sta son\u00F2ri spes\u00ECfeghi par \u00F2gni evento JClic edit_evsounds_default=son\u00F2ro predefin\u00ECo edit_evsounds_disabled=dexativ\u00E0 edit_evsounds_chk_tooltip=Ativa o dexativa el son\u00F2ro par sto evento edit_evsounds_select_tooltip=Clica par desernir el son\u00F2ro par sto evento, desponta par doparar el son\u00F2ro predefin\u00ECo action_newProject_caption=Prox\u00E8to niovo... action_newProject_keys=NN action_newProject_tooltip=Inv\u00ECa un prox\u00E8to JClic niovo edit_arith_op_from=Da: edit_arith_op_from_tooltip=Va\u019Aor m\u00ECnimo de 'l operador edit_arith_op_to=A: edit_arith_op_to_tooltip=Va\u019Aor m\u00E0simo de 'l operador edit_arith_op_with=Co': edit_arith_op_with_tooltip=Se spont\u00E0, el operador el pol ver anca sto va\u019Aor edit_arith_op_fromList=Uno da \u019Aa lista: edit_arith_op_fromList_tooltip=Lista de va\u019Aori pos\u00ECbi\u019Ai par 'l operador edit_arith_op_decimals=Desima\u019Ai: edit_arith_op_decimals_tooltip=N\u00F9maro de desima\u019Ai de l operando edit_arith_op_dec0=# (inti\u00E8ro) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=Primo operando edit_arith_secondOp=Secondo operando edit_arith_title=Arith2 par JClic edit_arith_operations=Operasion: edit_arith_operations_tooltip=Desernisi el tipo de operasion da far edit_arith_operations_plus=P\u00EC edit_arith_operations_minus=Manco edit_arith_operations_multiply=Via edit_arith_operations_divide=Divixo edit_arith_unknown=Desconosesto: edit_arith_unknown_tooltip=Se\u019Aesiona el elemento che el far\u00E0 da desconosesto edit_arith_unknown_aobx=El rexultado el x\u00E9 el desconosesto edit_arith_unknown_aoxr=El secondo operador el x\u00E9 el desconosesto edit_arith_unknown_xobr=El primo operador el x\u00E9 el desconosesto edit_arith_unknown_axbr=\u023Da operasion \u019Aa x\u00E9 el desconosesto edit_arith_unknown_invert=Scrivi el rexultado in prinsipio de \u019Aa espresion edit_arith_result=Rexultado: edit_arith_result_notCarry=No sta reportar edit_arith_result_random=A caxo edit_arith_result_asc=In cr\u00E9sar edit_arith_result_order=Meti in \u00F3rdene par rexultado: edit_arith_result_desc=In ca\u019Aar edit_arith_result_avoidDup=\u00C8vita dopioni edit_arith_cond=Condision: edit_arith_cond_ind=Indifarente edit_arith_cond_agb=El primo operador el g\u00E0 da \u00E8sar p\u00EC grando de 'l secondo edit_arith_cond_alb=El primo operador el g\u00E0 da \u00E8sar p\u00EC p\u00ECco\u019Ao de 'l secondo edit_arith_cond_tooltip=Altre condision edit_autocp=Xenerador de contenudo edit_autocp_tooltip=Se\u019Aesiona el xenerador de contenudo par sta ativit\u00E0. edit_autocp_block=Xenerador de contenudo edit_autocp_btn=Inpostasion... edit_autocp_btn_tooltip=Confegura \u019Ae inpostasion de 'l provider de contenudi edit_data=Mod\u00ECfega dati edit_act=Mod\u00ECfega de l'ativit\u00E0 edit_acp=Mod\u00ECfega de 'l provider de contenudi edit_acp_err_creating=Ghe x\u00E9 st\u00E0 un eror a produxendo el provider de contenudi! edit_project_author_group=Produsion edit_project_description_block=Descrision edit_project_ui_block=Interfacia utente edit_act_description=Descrision: m_Edit=Mod\u00ECfega m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=Ativit\u00E0 niova... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=Inserisi m_Insert_Mnemonic=I m_View=Vedi m_View_Mnemonic=V action_editProject_caption=Prox\u00E8to action_editProject_keys=PP action_editProject_tooltip=Mod\u00ECfega inpostasion de 'l prox\u00E8to action_editMedia_caption=multimedia action_editMedia_keys=MM action_editMedia_tooltip=Mod\u00ECfega \u019Aa librer\u00ECa de multimedia d e'l pox\u00E8to action_editActivities_caption=Ativit\u00E0 action_editActivities_keys=AA action_editActivities_tooltip=Mod\u00ECfega \u019Ae ativit\u00E0 action_editSeq_caption=Secuense action_editSeq_keys=SS action_editSeq_tooltip=Mod\u00ECfega \u019Ae secuense de \u019Ae ativit\u00E0 warn_project_modified=El prox\u00E8to corente el x\u00E9 st\u00E0 modifeg\u00E0. Vusto salvar i canbiamenti? edit_project_descriptors_block=Descritori edit_media_new=Og\u00E8to miltimedianiovo... edit_media_new_tooltip=Xonta naltra im\u00E0xene o og\u00E8to multimedia a \u019Aa librer\u00ECa edit_media_new_keys=M* edit_seq_threshold=L\u00ECmite pontexio: edit_seq_threshold_tooltip_up=F\u00E0 cusita co el pontexio global el x\u00E9 conpagno o p\u00EC alto de... edit_seq_time=L\u00ECmite de tenpo: edit_seq_time_tooltip_up=Par far cusita, el tenpo spexo inte \u019Ae ativit\u00E0 el g\u00E0 da \u00E8sar manco de... edit_seq_threshold_tooltip_down=F\u00E0 cusita co el pontexio global el x\u00E9 manco de... edit_seq_time_tooltip_down=F\u00E0 cusita co el tenpo spexo inte \u019Ae ativit\u00E0 el x\u00E9 p\u00EC de... edit_seq_condJump=Salti condision\u00E0i edit_seq_condJump_tooltip=Inp\u00F2sta salti partico\u019Aari da v\u00E9gner fati n\u00F2ma che a s\u00E8rte condision edit_seq_condJump_upper_tooltip=Inp\u00F2sta condision par saltar a un liv\u00E8\u019Ao p\u00EC desora edit_seq_condJump_lower=Salto in xoxo: edit_seq_condJump_upper=Salto in suxo: edit_seq_condJump_lower_tooltip=Inp\u00F2sta \u019Ae condision par saltar a un liv\u00E8\u019Ao p\u00EC in xoxo edit_seq_action_tooltip_fw=Asion asegnada a 'l boton "vanti" edit_seq_action_tooltip_bk=Asion asegnada a 'l boton "indr\u00ECo" edit_seq_jump_tooltip=Inp\u00F2sta el obietivo de 'l salto edit_seq_action_tooltip=Asion da far edit_seq_activity_tooltip=Ativit\u00E0 asegnada a sto elemento de secuensa edit_seq_tag_tooltip=Tag dopar\u00E0 par referensiar sto elemento de secuensa (canpo facoltadivo) edit_seq_description_tooltip=Descrision de 'l elemento de secuensa (canpo facoltadivo) edit_seq_button_enabled_tooltip=Ativa o dexativa el boton frecia edit_seq_auto_tooltip=V\u00E0 vanti da to p\u00F2sta co fenise \u019Aa ativit\u00E0 edit_seq_delay_tooltip=Secondi da spetar inanso de nar vanti da to p\u00F2sta edit_color_dlgTitle=Desernisi co\u019Aor edit_media_renaming=Pr\u00E8go, sp\u00E8ta mentre che se rin\u00F2ma \u019Aa resorsa... edit_act_cell_width=Larghesa: edit_act_cell_width_tooltip=Larghesa cax\u00E8\u019Aa (in pixels) edit_act_cell_height=Altesa: edit_act_cell_height_tooltip=Altesa cax\u00E8\u019Aa (in pixels) edit_act_hiddenWords=Par\u00F2\u019Ae sconte: edit_act_hiddenWords_tooltip=Lista de \u019Ae par\u00F2\u019Ae sconte indrento el pan\u00E8\u019Ao edit_act_wordSearch_panelB=D\u00F2para pan\u00E8\u019Ao B edit_act_wordSearch_panelB_tooltip=I contenudi de 'l secondo pan\u00E8\u019Ao i vengar\u00E0 mostr\u00E0i pena che vien cat\u00E0 \u019Ae par\u00F2\u019Ae edit_act_shaper_tooltip=Desernisi el tipo de shaper da doparar inte 'l pan\u00E8\u019Ao edit_act_num_cols_tooltip=N\u00F9maro de co\u019A\u00F2ne d e'l pan\u00E8\u019Ao edit_act_num_rows_tooltip=N\u00F9maro de righe de 'l pan\u00E8\u019Ao edit_act_wildTransparent=Delimitadori trasparenti edit_act_wildTransparent_tooltip=Trata i delimitadori (cuadri negri) f\u00E0 buxi trasparenti edit_act_behavior_scramble_times=Smisiamenti: edit_act_behavior_scramble_times_tooltip=N\u00F9maro de v\u00F2lte da smisiar edit_act_copy_title=C\u00F2pia i atribudi in... edit_act_copy_attributes=Atribudi edit_act_copy_dest=\u00C0plica a: edit_act_copy_style_main=Fen\u00E8stra primaria edit_act_copy_style_play=Fen\u00E8stra de execusion edit_act_copy_activities=Ativit\u00E0 da modifegar: edit_act_copyAttributes=C\u00F2pia atribudi edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=C\u00F2pia i atribudi de \u019Aa ativit\u00E0 corente inte altre ativit\u00E0 edit_new_project_name=N\u00F2me prox\u00E8to: edit_new_project_name_tooltip=N\u00F2me curto, descritivo de 'l prox\u00E8to edit_new_project_filename=N\u00F2me de 'l file edit_new_project_filename_tooltip=N\u00F2me de 'l file de prox\u00E8to, sensa estension edit_new_project_folder=Cart\u00E8\u019Aa: edit_new_project_folder_tooltip=N\u00F2me d e\u019Aa cart\u00E8\u019Aa indove che x\u00E9 salv\u00E0 el prox\u00E8to edit_new_project_folder_browse=Espl\u00F2ra... edit_new_project_title=Inv\u00ECa un prox\u00E8to JClic niovo edit_new_project_err_empty=Eror: Prox\u00E8to, file e cart\u00E8\u019Aa i g\u00E0 da ver n\u00F2mi v\u00E0\u019Aidi, no vodi. edit_new_project_warning_noEmptyFolder=Sta cart\u00E8\u019Aa \u019Aa g\u00E0 x\u00E0 drento un prox\u00E8to Clic 3.0 o Jclic. Par no far confuxion, x\u00E9 m\u00E8jo de tegnir \u00F2gni prox\u00E8to inte cart\u00E8\u019Ae separ\u00E0e, ma no \u019Aa x\u00E9 na ri\u00E8go\u019Aa fisa. Vusto dabon prod\u00F9xer un prox\u00E8to niovo inte sta cart\u00E8\u019Aa? edit_new_project_err_folderCreation=Eror: no se pol prod\u00F9xer \u019Aa cart\u00E8\u019Aa spesifegada! edit_act_copy_err_noSelection=Eror: No x\u00E9 st\u00E0 se\u019Aesion\u00E0 ativit\u00E0! Par doparar sta funsion te g\u00E0 da desernir inte \u019Aa lista \u019Aa ativit\u00E0 o \u019Ae ativit\u00E0 a cui i atribudi indic\u00E0i i vegnar\u00E0 aplic\u00E0i. edit_act_copy_action_prefix=Drio copiar i atribudi in: edit_act_copy_margin=M\u00E0rxene edit_act_copy_bgColor=Co\u019Aor de sfondro edit_act_copy_gradient=Sfumadura edit_act_copy_bgImage=Im\u00E0xene de sfondro edit_act_copy_border=Bordo edit_act_copy_transparentBg=Sfondro trasparente edit_act_copy_position=Poxision edit_act_copy_messages=Mesaxi edit_act_copy_messages_ini=Stil de 'l mesajo de inv\u00ECo edit_act_copy_messages_end=Stil de mesajo de concluxion edit_act_copy_messages_err=Stil de mesajo de eror edit_act_copy_reports=Reports edit_act_copy_rep_include=Includi ativit\u00E0 in reports edit_act_copy_rep_actions=Rejistra \u019Ae asion edit_act_copy_interface=Interfacia utente edit_act_copy_skin=Skin edit_act_copy_evSounds=Son\u00F2ri de i eventi edit_act_copy_counters=Contadori edit_act_copy_cTime=Conta tenpo edit_act_copy_maxTime=Tenpo m\u00E0simo edit_act_copy_cTries=Contador de tentadivi edit_act_copy_maxTries=M\u00E0simo tentadivi edit_act_copy_cScore=Contador de pontexio edit_act_copy_scramble=Cuantit\u00E0 de smisiamenti edit_act_copy_buttons=Botoni edit_act_copy_btnHelp=Boton de \u00E0ida edit_act_copy_btnInfo=Boton de informasion edit_act_copy_grids=Gr\u00E8\u019Ae edit_act_copy_gridA=Stil de \u019Aa gr\u00E8\u019Aa A edit_act_copy_gridB=Stil de \u019Aa gr\u00E8\u019Aa B edit_act_copy_textGrid=Stil de \u019Ae gr\u00E8\u019Ae de t\u00E8sto edit_act_copy_text=Ativit\u00E0 de t\u00E8sto edit_act_copy_fontFace=Tipo font edit_act_copy_fontSize=Dimension font edit_act_copy_fontStyle=Stil font edit_act_copy_textColour=Co\u019Aor t\u00E8sto primario edit_act_copy_textTargetColour=Desernisi el prox\u00E8to JClic de cui vegnar\u00E0 inport\u00E0 \u019Ae ativit\u00E0 edit_act_copy_textErrorColour=Co\u019Aor erori edit_act_copy_tabSpace=Spasio tabu\u019Aasion edit_act_copy_messages_prev=Stil de 'l mesajo presedente edit_act_changeType=Canbia tipo de ativit\u00E0 edit_act_newActivity_class_tooltip=N\u00F2me inti\u00E8ro de \u019Aa clase da doparar par costruir \u019Aa ativit\u00E0 (utenti esp\u00E8rti!) edit_act_newActivity_other=Altro... edit_act_newActivity_info=I utenti avans\u00E0i i pol anca inpostar ativit\u00E0 de JClic no registr\u00E0e. Scrivi cu\u00E0 soto el n\u00F2me de clase inti\u00E8ro, prefis\u00E0 da 'l pacheto (come "com.acme.activities.FooActivity"). \u023De clase de ativit\u00E0 \u019Ae g\u00E0 da est\u00E9ndar edu.xtec.jclic.Activity, e \u019Ae g\u00E0 da ser aces\u00ECbi\u019Ae da parte de 'l cargador de class de \u019Aa JVM. edit_act_newActivity_name=N\u00F2me de l'ativit\u00E0: edit_act_newActivity_name_tooltip=\u00D2gni ativit\u00E0 \u019Aa g\u00E0 da ver un n\u00F2me \u00F9gno\u019Ao inte 'l prox\u00E8to edit_act_changeType_warning=

Atension: Canbiarghe n\u00F2me a \u019Aa ativit\u00E0 pol cauxar \u019Aa p\u00E8rdita de calchedun de i atribudi e og\u00E8ti de \u019Aa ativit\u00E0 corente. D\u00F2para co' prudensa!

 

applet_codebase=Poxision de 'l c\u00F2dexe JClic: applet_codebase_tooltip=URL che el ponta a na cart\u00E8\u019Aa co' i files e i scripts de JClic. applet_prev_text=C\u00F2dexe HTML prima de: #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=T\u00E8sto o c\u00F2dexe HTML da m\u00E9tar prima de \u019Aa applet applet_post_text=C\u00F2dexe HTML dap\u00F2: applet_post_text_tooltip=T\u00E8sto o c\u00F2dexe HTML da m\u00E9tar dap\u00F2 \u019Aa applet applet_size=Dimension de \u019Aa applet: applet_size_tooltip=Larghesa e altesa de l'applet, in va\u019Aori aso\u019Auti o parsentua\u019Ai. applet_page_title=T\u00ECto\u019Ao de \u019Aa p\u00E0xena: applet_page_title_tooltip=T\u00E8sto da mostrar insima a \u019Aa fen\u00E8stra de 'l navegador applet_created_info=\u023Da p\u00E0xena web "%s" \u019Aa x\u00E9 stada prodota po\u019Aito. applet_created_prompt=Vusto v\u00E8xarla co 'l navegador? action_createHTML_caption=Produsion p\u00E0xena web... applet_create_title=Produsion de na p\u00E0xena HTML co' na applet JClic action_createHTML_tooltip=Produxi na p\u00E0xena HTML co' na applet co ' drento el prox\u00E8to corente applet_filename=N\u00F2me de 'l file applet_filename_tooltip=N\u00F2me de l file HTML da prod\u00F9xer action_createHTML_keys=H* settings_applet=Applet settings_applet_tooltip=Va\u019Aori preinpost\u00E0i dopar\u00E0i inte \u019Aa produsion de p\u00E0xene web applet_bgcolor=Co\u019Aor de sfondro: applet_bgcolor_tooltip=Co\u019Aor de sfondro de \u019Aa p\u00E0xena HTML applet_centered=M\u00E8dio applet_centered_tooltip=Poxisiona \u019Aa applet in poxixion m\u00E8dio orixontal applet_width_tooltip=Larghesa applet (aso\u019Auto o parsentual) applet_height_tooltip=Altesa applet (aso\u019Auto o parsentual) applet_exitUrl=In insida, v\u00E0 a: applet_exitUrl_tooltip=URL indove mandar el navegador co se v\u00E0 fora da JClic applet_infoFrame=N\u00F2me frame informasion: applet_infoFrame_tooltip=N\u00F2me d e'l frame dopar\u00E0 par mostrar el contenudo re\u019Aativo a 'l boton "info" action_createInstaller_caption=Produxi ista\u019Aador de prox\u00E8to action_createInstaller_keys=I* action_createInstaller_tooltip=Produxi un script de un ista\u019Aador de prox\u00E8to par el JClic player installer_caption=Mod\u00ECfega script de un ista\u019Aador de prox\u00E8to installer_title=T\u00ECto\u019Ao: installer_title_tooltip=T\u00ECto\u019Ao de 'l prox\u00E8to, da mostrar inte \u019Aa guida de auto ista\u019Aasion installer_authors=Autori: installer_authors_tooltip=Autor(i) de 'l prox\u00E8to (t\u00E8sto curto) installer_folder=Cart\u00E8\u019Aa: installer_folder_tooltip=N\u00F2me de \u019Aa cart\u00E8\u019Aa che \u019Aa guida de auto ista\u019Aasion \u019Aa g\u00E0 da suxerir installer_files=Files da copiar: installer_files_tooltip=Files che 'l ista\u019Aador el g\u00E0 da copiar installer_files_available=Files dispon\u00ECbi\u019Ai installer_files_selected=Files se\u019Aesion\u00E0i installer_files_add=>> xonta >> installer_files_add_tooltip=Xonta el file desern\u00ECo a \u019Aa lista installer_files_remove=<< cava via << installer_files_remove_tooltip=Cava via el file desern\u00ECo da \u019Aa lista installer_button=Boton de inv\u00ECo installer_button_tooltip=Propiet\u00E0 de 'l boton da mostrar inte \u019Aa librer\u00ECa prox\u00E8ti installer_button_project=Prox\u00E8to primario: installer_button_project_tooltip=Prox\u00E8to JClic che se inv\u00ECa a clicando so 'l boton installer_button_text=Ticheta: installer_button_text_tooltip=Ticheta de t\u00E8sto curto, da mostrar indrento el boton installer_button_icon=Icona: installer_button_icon_tooltip=Im\u00E0xene da doparar f\u00E0 boton. \u023Dasa vodo se te vol doparar \u019Aa icona preinpostada de JClic. installer_button_description=Descrision installer_button_description_tooltip=Suxerimento da mostrar co l boton installer_error_noTitle=Eror: manca t\u00ECto\u019Ao prox\u00E8to installer_error_noBaseFolder=Eror: manca t\u00ECto\u019Ao n\u00F2me cart\u00E8a installer_error_noFilesSelected=Eror: no x\u00E9 st\u00E0 desern\u00ECo files installer_error_noButtonText=Eror: manca ticheta de t\u00E8sto de 'l boton de inv\u00ECo installer_error_projectNotInFiles=Eror: el prox\u00E8to asegn\u00E0 a 'l boton de inv\u00ECo no 'l x\u00E9 inte \u019Aa lista de i files da copiar applet_page_full=Applet a p\u00E0xena inti\u00E8ra applet_page_mixed=Applet co' dimension precixe edit_text_align_left=Inriga t\u00E8sto a sanca edit_text_align_center=Inriga t\u00E8sto in m\u00E8xo edit_text_align_right=Inriga t\u00E8sto a dr\u00E8ta edit_text_act_target_toggle=Produxi o scans\u00E8\u019Aa target edit_text_act_insertCell=Inserisi na cax\u00E8\u019Aa edit_text_act_content=Contenudo edit_text_act_style=Stil edit_cell_size=Dimension cax\u00E8\u019Aa: edit_project_orphanActivities=\u023De ativit\u00E0 soto no \u019Ae x\u00E9 mai prexenti inte nisuna de \u019Ae secuense de \u019Ae ativit\u00E0 de prox\u00E8to, sich\u00E9 no \u019Ae vegnar\u00E0 mai mostr\u00E0e: edit_project_orphanMedia=I og\u00E8ti multimedia seguenti no i x\u00E9 dopar\u00E0i diretamente inte nisuna ativit\u00E0: edit_project_orphanActivities_prompt=Vusto xontarli a \u019Aa fin de \u019Aa \u00F9ltima secuensa de ativit\u00E0? edit_project_orphanMedia_prompt=Vusto scanse\u019Aarli? edit_project_orphanMedia_title=Remosion de i og\u00E8ti multimedia no dopar\u00E0i edit_project_orphanActivities_title=Ativit\u00E0 \u00F2rfene edit_media_refreshAll=Axorna tuto el contenudo multimedia edit_media_refreshAll_tooltip=Axorna tuti i og\u00E8ti multimedia a ricargando i so files edit_media_refreshAll_keys=R* edit_media_refreshAll_working=Drio axornar i multimedia edit_media_exportAll=Esp\u00F2rta tuti i multimedia edit_media_exportAll_tooltip=Salva inte un file el contenudo de tuti i elementi multimedia edit_media_exportAll_keys=X* edit_shape_select=Desernisi edit_shape_addPoint=Xonta ponto edit_shape_deletePoint=E\u019A\u00ECmina edit_shape_drawRect=Dixegna ret\u00E0ngo\u019Ao edit_shape_drawEllipse=Dixegna elise edit_shape_drawPoly=Dixegna po\u019A\u00ECgono edit_shape_toLine=Converti in riga edit_shape_toBezier=Conv\u00E8rti inte na curva BEzier edit_shape_toQuad=Conv\u00E8rti inte ne curva cuadr\u00E0tega edit_shape_rLeft=Xira a sanca edit_shape_rRight=Xira a dr\u00E8ta edit_shape_expand=Espandi edit_shape_contract=Conprimi edit_shape_zoomIn=Zoom in edit_shape_zoomOut=Zoom out edit_shape_aproxPoints=Unisi i ponti p\u00EC darente edit_shape_showPoints=Mostra i ponti edit_shape_showPoints_tooltip=Mostra/scondi i ponti edit_shape_gridSize=Dimension de \u019Aa gr\u00E8\u019Aa: edit_shape_hideGrid=Mostra/scondi gr\u00E8\u019Aa edit_shape_magnetRadius=Anpiesa magn\u00E8te edit_shape_elements=Elementi defin\u00ECi edit_shape_elemName=N\u00F2me de 'l elemento desern\u00ECo edit_shape_magnetRadius_tooltip=Larghesa de l'sion de 'l magn\u00E8te, co 'l x\u00E9 ativ\u00E0 edit_shape_gridSize_tooltip=Dimension de \u019Aa gr\u00E8\u019Aa edit_mc_activity=Ativit\u00E0: edit_mc_sequence=Secuensa: edit_mc_url=URL: edit_mc_project=Proj\u00E8to: edit_mc_activity_selection=Desernisi ativit\u00E0 edit_mc_sequence_selection=Desernisi secuensa edit_mc_err_nullContent=Dati insuficenti! edit_act_arrowColor=Co\u019Aor frecia: edit_act_arrowColor_tooltip=Co\u019Aor dopar\u00E0 da 'l editor par dixegnar \u019Ae frece (no precixamente, parch\u00E9 vien dopar\u00E0 na m\u00E0scara XOR) edit_act_editActivity=Mod\u00ECfega... edit_act_editActivity_tooltip=Mod\u00ECfega \u019Aa ativit\u00E0 se\u019Aesionada action_saveFileAs_caption=Salva cof\u00E0... action_saveFileAs_keys=AA action_saveFileAs_tooltip=Salva el prox\u00E8to corente co' naltro n\u00F2me edit_act_behavior_block=Conportamento edit_act_behavior=Conportamento edit_act_behavior_drag=Strasina og\u00E8ti edit_act_behavior_drag_tooltip=Strasina i og\u00E8ti invense de doparar na riga par m\u00E9tarli in re\u019Aasion edit_act_behavior_order=Contr\u00F2\u019Aa el \u00F3rdene de so\u019Ausion edit_act_behavior_order_tooltip=\u023De cax\u00E8\u019Ae \u019Ae g\u00E0 da \u00E8sar resolveste in \u00F3rdene edit_act_scramble=Insenbra action_importActivities_caption=Inp\u00F2rta ativit\u00E0... action_importActivities_keys=I* action_importActivities_tooltip=Inp\u00F2rta ativit\u00E0 da naltro prox\u00E8to import_warn_samefile=El file desern\u00ECo el coresponde a 'l prox\u00E8to corente. Se pol inportar ativit\u00E0 n\u00F2ma che da prox\u00E8ti difarenti. Desernisi naltro file de prox\u00E8to. import_selectActivities=Desernisi na, o p\u00EC de na, ativit\u00E0 da inportar inte 'l prox\u00E8to corente: import_importing=Drio inportar... import_checkdep=Drio verifegar \u019Ae dipendense... import_impmedia=Drio inportar multimedia: import_impact=Drio inportar ativit\u00E0: import_selectProject=Desernisi el prox\u00E8to JClic de cui se inportar\u00E0 \u019Ae ativit\u00E0 edit_tagRep_tags=Marcatori tag edit_tagRep_tagStart=Marcador de partensa: edit_tagRep_tagStart_tooltip=Marcador dopar\u00E0 in prinsipio de i tags edit_tagRep_tagEnd=Marcador final: edit_tagRep_tagEnd_tooltip=Marcador dopar\u00E0 in final de i tags edit_tagRep_file=File edit_tagRep_fileName=File o URL: edit_tagRep_fileName_tooltip=N\u00F2me o URL de 'l file che el g\u00E0 indrento i va\u019Aori che i sostituir\u00E0 i tags edit_tagRep_charset=Charset: edit_tagRep_charset_tooltip=Cod\u00ECfega car\u00E0teri doparada inte 'l file edit_tagRep_browseFile=Espl\u00F2ra... edit_tagRep_browseFile_tooltip=Espl\u00F2ra el filesystem edit_tagRep_title=Sostitusion tag edit_text_act_clearStylesBtn=Sneta stili de t\u00E8sto... edit_text_act_clearStylesPrompt=Atension: sta fatura \u019Aa snetar\u00E0 i atribusi spes\u00ECfeghi de i car\u00E0teri aplic\u00E0i a 'l documento, repristinando el so stil primario. Sta fatura no \u019Aa pol ser restorada. Vusto farlo? img_max_size=Dimension m\u00E0sima de \u019Ae im\u00E0xene: img_max_width_tooltip=Larghesa m\u00E0sima de \u019Ae im\u00E0xene inport\u00E0e inte \u019Aa librer\u00ECa multimedia. img_max_height_tooltip=Altesa m\u00E0sima de \u019Ae im\u00E0xene inport\u00E0e inte \u019Aa librer\u00ECa multimedia. img_resize_prompt=\u023Da im\u00E0xene "%s" \u019Aa g\u00E0 na dimension de $s pixels. Cuesto el s\u00F9pera el m\u00E0simo consent\u00ECo da JClic Author (%a). Vusto redimensionarla? src/author/edu/xtec/resources/messages/AuthorMessages_zh_TW.properties000066400000000000000000001466221335566474600267310ustar00rootroot00000000000000#JClic Author messages edit_act_description_block=\u63CF\u8FF0: edit_act_name_tooltip=\u6D3B\u52D5\u540D\u7A31 edit_act_name=\u540D\u7A31\uFF1A edit_act_description_tooltip=\u6D3B\u52D5\u8AAA\u660E edit_act_reports_block=\u5831\u544A edit_act_includeInReports=\u5C07\u6D3B\u52D5\u5217\u5165\u5831\u544A edit_act_includeInReports_tooltip=\u5C07\u6D3B\u52D5\u7D50\u679C\u5217\u5165\u4F7F\u7528\u8005\u7684\u5831\u544A edit_act_code=\u7DE8\u78BC\uFF1A edit_act_code_tooltip=\u5718\u9AD4\u4E2D\u53EF\u9078\u7684\u7A0B\u5F0F\u548C\u5728\u5831\u544A\u6578\u64DA\u4E2D\u641C\u5C0B edit_act_reportActions=\u56DE\u5831\u4F7F\u7528\u8005\u7684\u52D5\u4F5C edit_act_reportActions_tooltip=\u8A3B\u518A\u6240\u6709\u4F7F\u7528\u8005\u88FD\u4F5C\u7684\u6D3B\u52D5\u7684\u7D30\u76EE edit_act_counters_block=\u8A08\u6578\u5668 edit_act_timeCounter=\u8A08\u6642\u5668 edit_act_timeCounter_tooltip=\u986F\u793A/\u96B1\u85CF \u8A08\u6642\u5668 edit_act_actionsCounter=\u5617\u8A66\u8A08\u6578\u5668 edit_act_actionsCounter_tooltip=\u986F\u793A/\u96B1\u85CF\u5617\u8A66\u5012\u6578 edit_act_scoreCounter=\u7A4D\u5206 edit_act_scoreCounter_tooltip=\u986F\u793A/\u96B1\u85CF \u7A4D\u5206 edit_act_maxTime=\u6700\u9577\u6642\u9593\uFF1A edit_act_maxTime_tooltip=\u89E3\u6C7A\u6D3B\u52D5\u6240\u9700\u6700\u591A\u6642\u9593(\u79D2)\uFF0C\u7BC4\u570D\u5F9E0\u5230\u7121\u9650\u5927 edit_act_countdown=\u5012\u6578\u8A08\u6642 edit_act_countdown_tooltip=\u8A08\u6642\u5668\u5F9E\u6700\u5927\u503C\u5012\u6578\u52300\u3002 edit_act_maxActions=\u6700\u591A\u5617\u8A66\u6B21\u6578\uFF1A edit_act_maxActions_tooltip=\u6700\u591A\u53EF\u5617\u8A66\u6B21\u6578,\u6216\u8005\u7121\u9650\u5236\u5247\u586B\u5BEB0\u3002 edit_act_buttons_block=\u6309\u9215 edit_act_helpBtn=\u5E6B\u52A9 edit_act_helpBtn_tooltip=\u986F\u793A/\u96B1\u85CF \u6309\u9215 edit_act_helpBtn_solution=\u986F\u793A\u7B54\u6848 edit_act_helpBtn_msg=\u986F\u793A\u8A0A\u606F\uFF1A edit_act_infoBtn=\u8CC7\u8A0A edit_act_infoBtn_tooltip=\u986F\u793A/\u96B1\u85CF\u5E95\u90E8\u8CC7\u8A0A edit_act_infoBtn_url=\u986F\u793AURL\uFF1A edit_act_infoBtn_cmd=\u57F7\u884C\u9019\u500B\u6307\u4EE4\uFF1A edit_act_infoBtn_url_tooltip=\u9EDE\u9078\u9019\u500B\u6309\u9215\u986F\u793A\u7DB2\u5740 edit_act_infoBtn_cmd_tooltip=\u9EDE\u9078\u9019\u500B\u6309\u9215\u4EE5\u57F7\u884C\u547D\u4EE4\u5217 edit_act_mainWindow=\u4E3B\u756B\u9762 edit_act_gameWindow=\u904A\u6232\u8996\u7A97: edit_act_margin=\u908A\u754C\uFF1A edit_act_margin_tooltip=\u6C34\u5E73\u53CA\u5782\u76F4\u7A7A\u9593\u5728\u53EF\u898B\u7269\u4EF6\u9593\u3002 edit_act_bgColor=\u80CC\u666F\u984F\u8272\uFF1A edit_act_bgColor_tooltip=\u6539\u8B8A\u80CC\u666F\u984F\u8272\u3002 edit_gradient_startColor=\u958B\u59CB\u984F\u8272\uFF1A edit_gradient_endColor=\u7D50\u675F\u984F\u8272\uFF1A edit_gradient_startColor_tooltip=\u9078\u64C7\u958B\u59CB\u7684\u984F\u8272 edit_gradient_endColor_tooltip=\u9078\u64C7\u7D50\u675F\u7684\u984F\u8272 edit_gradient_cycles=\u5FAA\u74B0: edit_gradient_cycles_tooltip=\u6CB9\u6F06\u8868\u9762\u68AF\u5EA6\u5730\u4F4D edit_gradient_orientation=\u65B9\u5411\uFF1A edit_gradient_orientation_tooltip=\u5782\u76F4\u68AF\u5EA6\u53D6\u5411 edit_act_gradient=\u6F38\u5C64\uFF1A edit_act_gradient_tooltip=\u4F7F\u7528\u6F38\u5C64\u984F\u8272 edit_color_opacity=\u4E0D\u900F\u660E edit_color_opacity_tooltip=\u8A2D\u5B9A\u8272\u5F69\u900F\u660E\u5EA6 edit_gradient_title=\u6F38\u5C64 edit_gradient_default=\u4F7F\u7528\u9810\u8A2D\u503C(\u7A7A\u6F38\u5C64) edit_act_image=\u5F71\u50CF\uFF1A edit_act_descriptionTab=\u63CF\u8FF0 edit_act_descriptionTab_tooltip=\u540D\u7A31\u53CA\u63CF\u8FF0 edit_act_tiledBgImg=\u62FC\u8CBC edit_act_tiledBgImg_tooltip=\u5716\u7247\u6574\u9762\u91CD\u8907 edit_act_preview=\u9810\u89BD\uFF1A edit_act_border=\u908A\u6846 edit_act_border_tooltip=\u8996\u7A97\u56DB\u5468\u756B\u4E0A\u908A\u6846 edit_act_transparent=\u900F\u660E edit_act_transparent_tooltip=\u8996\u7A97\u6709\u900F\u660E\u80CC\u666F edit_act_width=\u5BEC\u5EA6: edit_act_height=\u9AD8\u5EA6\uFF1A edit_act_width_tooltip=\u7269\u4EF6\u7684\u5BEC\u5EA6(\u50CF\u7D20) edit_act_height_tooltip=\u7269\u4EF6\u7684\u9AD8\u5EA6(\u50CF\u7D20) edit_act_centered=\u7F6E\u4E2D edit_act_centered_tooltip=\u7269\u4EF6\u7F6E\u4E2D edit_act_x=X\u8EF8 edit_act_x_tooltip=\u7D55\u5C0D\u6C34\u5E73\u4F4D\u7F6E edit_act_y=Y\u8EF8 edit_act_y_tooltip=\u7D55\u5C0D\u5782\u76F4\u4F4D\u7F6E edit_act_ui_block=\u4F7F\u7528\u8005\u4ECB\u9762 edit_act_image_tooltip=\u9078\u64C7\u5716\u7247 edit_act_text=\u6587\u5B57\uFF1A edit_act_text_tooltip=\u7269\u4EF6\u4E2D\u986F\u793A\u7684\u6587\u5B57 edit_font_face=\u6587\u5B57 edit_font_size=\u5927\u5C0F\uFF1A edit_font_bold=\u7C97\u9AD4 edit_font_italic=\u659C\u9AD4 edit_font_underline=\u5E95\u7DDA edit_font_style=\u6A23\u5F0F: edit_cell_title=\u5132\u5B58\u683C\u5167\u5BB9 edit_act_messages=\u8A0A\u606F edit_act_msg_initial=\u958B\u59CB\u8A0A\u606F edit_act_msg_final=\u5B8C\u6210\u8A0A\u606F edit_act_msg_prev=\u524D\u4E00\u5247\u8A0A\u606F edit_act_msg_error=\u932F\u8AA4\u8A0A\u606F\uFF1A edit_act_msg_initial_tooltip=\u52D5\u4F5C\u958B\u59CB\u986F\u793A\u7684\u6587\u5B57 edit_act_msg_final_tooltip=\u52D5\u4F5C\u7D50\u675F\u5F8C\u51FA\u73FE\u7684\u8A0A\u606F edit_act_msg_error_tooltip=\u52D5\u4F5C\u7D50\u675F\u932F\u8AA4\u6642\u51FA\u73FE\u7684\u8A0A\u606F edit_act_msg_prev_tooltip=\u512A\u5148\u65BC\u52D5\u4F5C\u524D\u51FA\u73FE\u7684\u8A0A\u606F(\u53EA\u5C0D\u7279\u5B9A\u52D5\u4F5C) edit_align=\u5C0D\u9F4A edit_act_textColor=\u6587\u5B57\u984F\u8272\uFF1A edit_act_textColor_tooltip=\u6587\u5B57\u524D\u666F\u8272\u5F69 edit_act_shadowColor=\u9670\u5F71\u984F\u8272\uFF1A edit_act_shadowColor_tooltip=\u6587\u5B57\u80CC\u666F\u8272\u5F69 edit_act_shadow=\u9670\u5F71 edit_act_shadow_tooltip=\u6587\u5B57\u9670\u5F71 edit_act_borderColor=\u908A\u6846\u984F\u8272\uFF1A edit_act_borderColor_tooltip=\u683C\u5B50\u908A\u6846\u7684\u984F\u8272 edit_act_inactiveColor=\u672A\u52D5\u4F5C\u5F62\u614B\u6642\u7684\u984F\u8272 edit_act_inactiveColor_tooltip=\u7576\u683C\u5B50\u88AB\u7981\u7528\u7684\u984F\u8272 edit_act_altColor=\u66FF\u4EE3\u984F\u8272 edit_act_altColor_tooltip=\u984F\u8272\u7528\u65BC\u7E6A\u88FD\u5728\u5DF2\u89E3\u6C7A\u55AE\u5143\u5167\u7684\u66FF\u4EE3\u5167\u5BB9 edit_cell_marked=\u6A19\u8A18 edit_cell_disabled=\u5DF2\u505C\u7528 edit_cell_alt=\u66FF\u4EE3 edit_cell_textMargin=\u5167\u6846 edit_cell_textMargin_tooltip=\u7269\u4EF6\u5916\u6846\u8207\u6587\u5B57\u9593\u7684\u9593\u8DDD edit_cell_borderWidth=\u908A\u6846\u5BEC\u5EA6\uFF1A edit_cell_borderWidth_tooltip=\u4E00\u822C\u683C\u5B50\u908A\u6846\u5BEC\u5EA6 edit_cell_markerWidth=\u6A19\u8A18\u7684\u5BEC\u5EA6\uFF1A edit_cell_markerWidth_tooltip=\u7B46\u5283\u5BEC\u5EA6\u4F86\u7E6A\u88FD\u5DF2\u88AB\u6A19\u8A18\u7684\u55AE\u5143\u6216\u9078\u64C7\u6642\u7684\u908A\u754C edit_cell_alt_tooltip=\u201C\u5176\u4ED6\u201D\u7684\u72C0\u614B\u4E2D\u9810\u89BD edit_cell_disabled_tooltip=\u9810\u89BD"\u7981\u7528"\u72C0\u614B edit_cell_marked_tooltip=\u9810\u89BD\u201C\u6A19\u8A18\u201D\u72C0\u614B edit_act_testAction=\u9810\u89A7 edit_act_testAction_tooltip=\u5957\u7528 edit_act_panels_description=\u63CF\u8FF0: edit_act_panels_description_tooltip=\u52D5\u4F5C\u7684\u6A19\u984C\u8207\u8AAA\u660E edit_act_panels_options=\u9078\u9805 edit_act_panels_options_tooltip=\u52D5\u4F5C\u9078\u9805 edit_act_panels_frame=\u8996\u7A97 edit_act_panels_frame_tooltip=\u6D3B\u52D5\u7A97\u53E3\u7684\u754C\u9762\u3001\u5927\u5C0F\u8207\u4F4D\u7F6E edit_act_panels_messages=\u8A0A\u606F edit_act_panels_messages_tooltip=\u52D5\u4F5C\u7684\u8A0A\u606F\u5167\u5BB9 edit_act_panels_panel=\u9762\u677F edit_act_panels_panel_tooltip=\u9762\u677F\u5167\u5BB9 edit_style_title=\u6B3E\u5F0F edit_style_tooltip=\u8A2D\u7F6E\u683C\u5B50\u7684\u984F\u8272\u3001\u5B57\u9AD4\u8207\u5927\u5C0F edit_act_style=\u98A8\u683C\uFF1A edit_act_overlap=\u907F\u514D\u6587\u5B57\u8207\u5716\u7247\u91CD\u758A edit_act_overlap_tooltip=\u5617\u8A66\u907F\u514D\u6587\u5B57\u8986\u84CB\u5716\u7247 edit_media_exists_1=\u6A94\u6848 edit_media_exists_2=\u5DF2\u5B58\u5728\u65BC\u5A92\u9AD4\u5EAB edit_act_shaper=\u9020\u5F62\u6A5F\uFF1A edit_act_shaper_err=\u9020\u5F62\u6A5F\u767C\u751F\u932F\u8AA4\uFF1A edit_act_num_cols=\u6B04\uFF1A edit_act_num_rows=\u5217: edit_act_toothHeightFactor=\u9F52\u9AD8 edit_act_toothWidthFactor=\u9F52\u5BEC edit_act_toothRandom=\u96A8\u6A5F\u5206\u914D edit_act_shaper_properties=\u9020\u578B\u6A5F\u7684\u5C6C\u6027\uFF1A edit_act_panels_text=\u6587\u5B57: edit_act_panels_text_tooltip=\u52D5\u4F5C\u5167\u5BB9 action_saveFile_caption=\u5132\u5B58... action_saveFile_keys=SS action_saveFile_tooltip=\u5132\u5B58\u76EE\u524D\u5C08\u6848 action_docTree_caption=\u6587\u4EF6\u6A39\u72C0\u7D50\u69CB... action_docTree_keys=T* action_docTree_tooltip=\u7528\u6A39\u72C0\u7D50\u69CB\u5C55\u793A\u9805\u76EE\u6587\u4EF6 edit_docTree_title=\u6587\u4EF6\u5217\u8868 edit_media_referencedBy=\u53C3\u7167\u65BC\uFF1A msg_prompt_loadReferences=html>\u6CE8\u610F\uFF1A

\u9019\u500B\u9805\u76EE\u8207\u5176\u4ED6\u9805\u76EE\u6709\u9023\u7D50
\u60A8\u662F\u5426\u8981\u67E5\u770B\u8A72\u93C8\u63A5\u8207\u52A0\u8F09\u6240\u6709\u76F8\u95DC\u6587\u4EF6\uFF1F

(\u6211\u5011\u5EFA\u8B70\u60A8\u9078\u64C7 \u662F \u7576\u60A8\u8F38\u5165Clic 3.0\u7684\u6D3B\u52D5) edit_mc_type=\u985E\u578B: edit_mc_type_unknown=\u4E0D\u660E edit_mc_type_sound=\u64AD\u653E\u97F3\u6548 edit_mc_type_video=\u64AD\u653E\u5F71\u7247 edit_mc_type_midi=\u64AD\u653EMIDI\u6A94 edit_mc_type_cdaudio=\u64AD\u653ECD\u97F3\u6A02 edit_mc_type_record=\u9304\u97F3 edit_mc_type_play_recorded=\u64AD\u653E\u5DF2\u9304\u88FD\u8072\u97F3 edit_mc_type_run_activity=\u8DF3\u5230\u6D3B\u52D5 edit_mc_type_run_sequence=\u8DF3\u5230\u5E8F\u5217 edit_mc_type_run_external=\u57F7\u884C\u7A0B\u5F0F edit_mc_type_url=\u986F\u793A URL edit_mc_type_exit=\u7D50\u675F edit_mc_type_return=\u56DE\u50B3 edit_mc_level=\u512A\u5148\u9806\u5E8F edit_mc_file=\u6A94\u6848\uFF1A edit_mc_externalParam=\u53C3\u6578\uFF1A edit_mc_from=\u4F86\u81EA: edit_mc_to=\u5230\uFF1A edit_mc_length=\u6700\u5927\u9577\u5EA6 edit_mc_recBuffer=\u8A18\u9304\u5E36 edit_mc_stretch=\u4F38\u7E2E\u5927\u5C0F edit_mc_location=\u4F4D\u7F6E: edit_mc_location_x=X\uFF1A edit_mc_location_y=Y\uFF1A edit_mc_location_from=\u4F86\u81EA: edit_mc_location_from_box=\u5132\u5B58\u683C edit_mc_location_from_window=\u8996\u7A97 edit_mc_location_from_frame=\u6846\u67B6 edit_mc_loop=\u91CD\u8907\u64AD\u653E edit_mc_autostart=\u81EA\u52D5\u958B\u59CB edit_mc_catchmouse=\u8DDF\u8E2A\u9F20\u6A19 edit_mc_title=\u591A\u5A92\u9AD4\u6D3B\u52D5\u5167\u5BB9 edit_mc_label=\u6D3B\u52D5\u5167\u5BB9\uFF1A edit_media_dlg_title=\u591A\u5A92\u9AD4\u7269\u4EF6\u9078\u9805 edit_media_title=\u5A92\u9AD4\u5EAB edit_mc_pos_cell=\u7F6E\u4E2D\u65BC\u5132\u5B58\u683C edit_mc_pos_window=\u7F6E\u4E2D\u8207\u8996\u7A97 edit_mc_pos_absolute=\u7279\u5B9A\u7684\u4F4D\u7F6E\uFF1A edit_tree_badFormat=\u6A39\u72C0\u7D50\u69CB\u6216\u8CC7\u6599\u4E0D\u6B63\u78BA\uFF01 edit_act_panels_controls=\u64CD\u63A7\u4ECB\u9762 edit_act_panels_controls_tooltip=\u8A08\u6578\u5668\u548C\u6309\u7D10\u9078\u9805 edit_act_class=\u985E\u578B: edit_act_gridLayout=\u7DB2\u683C\u4F48\u5C40\uFF1A edit_act_gridLayout_tooltip=\u9762\u677FA\u8207B\u7684\u76F8\u5C0D\u4F4D\u7F6E edit_act_inverseResolution=\u76F8\u53CD\u7684\u6C7A\u8B70 edit_act_inverseResolution_tooltip=\u7576"B"\u7684\u6240\u6709\u6307\u5B9A\u7684\u5143\u7D20\u7686\u88AB\u5206\u914D\u5247\u6D3B\u52D5\u5DF2\u5B8C\u6210 edit_act_showAllArrows=\u986F\u793A\u6240\u6709\u7BAD\u982D edit_act_alt=\u66FF\u4EE3\u7684\u5167\u6587 edit_act_alt_tooltip=\u5DF2\u89E3\u6C7A\u7684\u55AE\u5143\u548C\u672A\u88AB\u5206\u914D\u7684\u55AE\u5143\u4E2D\u986F\u793A\u7684\u5167\u5BB9 edit_act_alt_toggle=ALT\u9375 edit_act_alt_toggle_tooltip=\u7DE8\u8F2F\u66FF\u4EE3\u7684\u5167\u6587 edit_act_grid=\u7DB2\u683C edit_act_grid_A=\u683C\u7DDAA edit_act_grid_B=\u683C\u7DDAB edit_act_grid_layout=\u7248\u9762\u914D\u7F6E edit_act_grid_relationship=\u95DC\u4FC2 edit_seq_activity_header=\u6D3B\u52D5 edit_seq_tag_header=\u6A19\u7C64 edit_seq_jump_header=\u8DF3\u81F3 edit_seq_activity=\u6D3B\u52D5\uFF1A edit_seq_tag=\u6A19\u7C64: edit_seq_description=\u63CF\u8FF0\uFF1A edit_seq_auto=\u81EA\u52D5\u524D\u9032 edit_seq_delay=\u5EF6\u9072\uFF1A edit_seq_action_fwd=\u5F80\u524D edit_seq_action_back=\u9000\u5F8C edit_seq_action_jump=\u8DF3\u81F3 edit_seq_action_stop=\u66AB\u505C\u9032\u7A0B edit_seq_action_return=\u8FD4\u56DE edit_seq_action_exit=\u96E2\u958BJClic edit_seq_arrow_fwd=\u524D\u9032\u7BAD\u982D\uFF1A edit_seq_arrow_back=\u5F8C\u9000\u7BAD\u982D\uFF1A edit_seq_action=\u52D5\u4F5C: edit_seq_button_enabled=\u986F\u793A\u6309\u9215 edit_seq_project=JClic \u5C08\u6848: edit_act_absolute=\u7D55\u5C0D\u4F4D\u7F6E edit_act_absolute_tooltip=\u8A72\u7269\u9AD4\u5C07\u88AB\u653E\u7F6E\u5728\u6307\u5B9A\u7684X\u548CY\u5750\u6A19 edit_act_location=\u4F4D\u7F6E: edit_seq_newElement=\u65B0\u7684\u5E8F\u5217\u5143\u7D20... edit_seq_newElement_tooltip=\u6D3B\u52D5\u5E8F\u5217\u4E2D\u63D2\u5165\u4E00\u500B\u65B0\u5143\u7D20 edit_seq_newElement_msg=\u8ACB\u9078\u64C7\u4E00\u500B\u65B0\u7684\u5E8F\u5217\u5143\u7D20\u7684\u6D3B\u52D5\u3002 edit_seq_newElement_error_noAct=\u6C92\u6709\u6D3B\u52D5\uFF0C\u4E0D\u80FD\u5275\u5EFA\u4E00\u500B\u65B0\u7684\u5E8F\u5217\u7684\u5143\u7D20\uFF01 edit_seq_newElement_error_emptyList=\u9019\u500B\u9805\u76EE\u6709\u6C92\u6709\u6D3B\u52D5\uFF01\u7121\u6CD5\u5728\u7A7A\u7684\u5C08\u6848\u5167\u5275\u5EFA\u5E8F\u5217\u5143\u7D20\u3002 edit_seq_jump_msg=\u8DF3\u8F49\u7684\u76EE\u6A19\uFF1A edit_seq_jump_title=\u8DF3\u8F49\u7684\u76EE\u6A19 edit_act_newActivity_tooltip=\u5728\u5C08\u6848\u5167\u65B0\u589E\u4E00\u500B\u65B0\u7684\u6D3B\u52D5 edit_act_prompt_class=\u6D3B\u52D5\u578B\u614B\uFF1A edit_act_prompt_name=\u540D\u7A31\uFF1A edit_act_newActivity_msg=\u8ACB\u9078\u64C7\u6D3B\u52D5\u578B\u614B\u4E26\u5C07\u5B83\u547D\u540D\uFF1A edit_act_newActivity_error_noAct=\u4F60\u5FC5\u9808\u9078\u64C7\u4E00\u500B\u6D3B\u52D5\u7684\u578B\u614B\uFF01 edit_act_newActivity_error_noName=\u4F60\u5FC5\u9808\u7D66\u4E88\u6D3B\u52D5\u4E00\u500B\u660E\u78BA\u7684\u540D\u7A31\uFF01 edit_act_newActivity_error_creating=\u7121\u6CD5\u5275\u5EFA\u65B0\u7684\u6D3B\u52D5\uFF01 edit_act_newActivity_class=Java\u985E\u5225\u7684\u540D\u7A31\uFF1A edit_text_act_format=\u683C\u5F0F\u5316 edit_text_act_answer=\u7B54\u6848 edit_text_act_popup=\u5F48\u51FA edit_text_act_answer_label=\u6709\u6548\u7684\u7B54\u6848\uFF1A edit_list_newElement_tooltip=\u589E\u52A0\u4E00\u500B\u65B0\u7684\u5217\u8868\u5143\u7D20 edit_list_editElement_tooltip=\u7DE8\u8F2F\u5DF2\u9078\u53D6\u7684\u5217\u8868\u5143\u7D20 edit_list_deleteElement_tooltip=\u522A\u9664\u5DF2\u9078\u53D6\u7684\u5217\u8868\u5143\u7D20 edit_list_upBtn_tooltip=\u4E0A\u79FB edit_list_downBtn_tooltip=\u4E0B\u79FB edit_list_newValue=\u65B0\u7684\u6587\u5B57\uFF1A edit_list_addElement=\u589E\u52A0\u65B0\u7684\u5217\u8868\u5143\u7D20 edit_list_modifyValue=\u66F4\u6539\u4EE5\u9078\u53D6\u7684\u6587\u5B57 edit_text_act_target=\u76EE\u6A19 edit_text_act_maxLen=\u6700\u5927\u9577\u5EA6 edit_text_act_maxLen_tooltip=\u7B54\u6848\u4E2D\u7684\u5B57\u5143\u7684\u6700\u5927\u6578\u91CF\u3002 edit_text_act_fillingChar=\u586B\u5165\u7684\u6027\u8CEA edit_text_act_fillingChar_tooltip=\u5B57\u7B26\u7528\u4F86\u8868\u793A\u7A7A\u767D edit_text_act_iniLen=\u521D\u59CB\u9577\u5EA6\uFF1A edit_text_act_iniLen_tooltip=\u5C07\u5728\u6D3B\u52D5\u958B\u59CB\u986F\u793A\u586B\u5165\u7684\u5B57\u7B26\u6578\u3002 edit_text_act_iniText=\u521D\u59CB\u6587\u672C\uFF1A edit_text_act_iniText_tooltip=\u5728\u6D3B\u52D5\u7684\u958B\u59CB\u6642\u5C07\u6587\u5B57\u986F\u793A\u5728\u7A7A\u767D\u8655 edit_text_act_list=\u986F\u793A\u4E00\u500B\u9078\u9805\u5217\u8868\uFF1A edit_text_act_list_tooltip=\u986F\u793A\u4E00\u500B\u9078\u9805\u5217\u8868\uFF0C\u7528\u6236\u5FC5\u9808\u9078\u64C7\u4E00\u500B\u3002 edit_text_act_check_title=\u66F4\u6B63\u9078\u9805 edit_text_act_popup_no=\u7121\u5F48\u51FA edit_text_act_popup_always=\u81EA\u52D5\u5F48\u51FA edit_text_act_popup_onError=\u5F48\u51FA\u932F\u8AA4 edit_text_act_popup_onDemand=\u6309F1\u6642\u5F48\u51FA edit_text_act_popup_type=\u985E\u578B: edit_text_act_popup_delay=\u5F48\u51FA\u5EF6\u9072\uFF1A edit_text_act_popup_maxTime=\u6700\u5927\u6642\u9593\uFF1A edit_text_act_popup_onlyPlay=\u53EA\u5141\u8A31\u8072\u97F3 edit_text_act_err_noSelection=\u4F60\u5FC5\u9808\u9078\u64C7\u4E00\u500B\u6587\u5B57\u7247\u6BB5\uFF0C\u4EE5\u5275\u5EFA\u4E00\u500B\u65B0\u7684\u76EE\u6A19\u6587\u5B57\uFF01 edit_text_act_err_badCharInSelection=\u76EE\u6A19\u6587\u672C\u4E0D\u80FD\u5305\u542B\u6574\u6BB5\u56DE\u5831\u6216\u662F\u6A19\u7C64\u3002 edit_text_act_err_nestedTargets=\u76EE\u6A19\u7121\u6CD5\u5DE2\u72C0\uFF01 edit_text_act_err_cellInTarget=\u76EE\u6A19\u4E0D\u80FD\u5305\u542B\u55AE\u5143\uFF01 edit_text_act_pageBgColor=\u7D19\u5F35\u984F\u8272\uFF1A edit_text_act_editStylesBtn=\u7DE8\u8F2F\u6587\u4EF6\u7684\u6A23\u5F0F... edit_text_act_mainStyle=\u4E3B\u8981\u6A23\u5F0F\uFF1A edit_text_act_tabSpc=\u7E2E\u6392\u7A7A\u9593\uFF1A edit_text_act_tabSize=\u5728\u88AB\u6A19\u8A18\u7E2E\u6392\u4E4B\u9593\u7684\u7A7A\u9593 edit_text_act_colors=\u984F\u8272\uFF1A edit_text_act_targetStyle=\u76EE\u6A19\u984F\u8272\uFF1A edit_text_act_errorStyle=\u932F\u8AA4\u7684\u984F\u8272\uFF1A edit_text_act_preview=\u9810\u89BD\uFF1A edit_text_act_styleSample_default_start=\u6A19\u6E96\u6587\u5B57 edit_text_act_styleSample_target=\u76EE\u6A19 edit_text_act_styleSample_error=\u767C\u751F\u932F\u8AA4 edit_text_act_styleSample_default_fill=\u6A19\u6E96\u6587\u5B57 edit_text_act_styleSample_default_end=\u6A19\u6E96\u6587\u5B57\u3002 edit_text_act_warnDeleteTarget=\u8B66\u544A\uFF1A\u6B64\u64CD\u4F5C\u5C07\u6291\u5236\u7576\u524D\u9078\u5B9A\u7684\u76EE\u6A19\u3002\u4F60\u8981\u7E7C\u7E8C\u55CE\uFF1F edit_text_act_prevScreen_title=\u524D\u4E00\u500B\u756B\u9762... edit_text_act_prevScreen_no=\u6D3B\u52D5\u958B\u59CB\u4E4B\u524D\uFF0C\u4E0D\u986F\u793A\u4EFB\u4F55\u6587\u672C edit_text_act_prevScreen_original=\u986F\u793A\u9019\u6B21\u984C\u76EE\u7684\u5B8C\u6574\u6587\u672C edit_text_act_prevScreen_special=\u986F\u793A\u9019\u500B\u6587\u672C\uFF1A edit_text_act_prevScreen_time=\u6700\u5927\u6642\u9593\uFF1A edit_text_act_edit_target=\u76EE\u6A19... edit_text_act_checkButton_show=\u986F\u793A\u6821\u6B63\u6309\u9215 edit_text_act_checkButtonText=\u6309\u9375\u6587\u5B57 edit_text_act_checkCase=\u7B26\u5408\u689D\u4EF6 edit_text_act_checkAccents=\u8003\u616E\u53E3\u97F3\u548C\u7279\u6B8A\u5B57\u6BCD edit_text_act_checkPunct=\u8003\u616E\u6A19\u9EDE\u7B26\u865F edit_text_act_checkDoubleSpc=\u5141\u8A31\u91CD\u8907\u7684\u7A7A\u683C edit_text_act_checkOptions=\u6A19\u6E96 edit_text_act_checkAutoJump=\u586B\u5BEB\u5F8C\u79FB\u52D5\u5230\u4E0B\u4E00\u500B\u76EE\u6A19 edit_text_act_checkForceOk=\u53EA\u6709\u6B63\u78BA\u7684\u731C\u6E2C\u5F8C\u79FB\u52D5 edit_text_act_checkDetail=\u9010\u5B57\u986F\u793A\u932F\u8AA4 edit_text_act_checkDetail_params=\u5206\u6790\u6F14\u7B97\u6CD5\u53C3\u6578 edit_text_act_checkDetail_steps=\u6B65\u9A5F\uFF1A edit_text_act_checkDetail_field=\u52D8\u63A2\u9818\u57DF edit_text_act_defaultCheckButtonText=\u6838\u5C0D edit_text_act_advancedCorrectionOptions=\u7B54\u6848\u5206\u6790 edit_text_act_check_bt=\u66F4\u6B63 edit_text_act_checkButton=\u6821\u6B63\u9215 edit_text_act_checkProgress=\u9032\u5EA6 edit_text_act_typeBtn=\u985E\u578B edit_text_act_orderParagraphs=\u968E\u6BB5 edit_text_act_orderWords=\u63DB\u53E5\u8A71\u8AAA edit_text_act_order_amongstPar=\u5728\u6BB5\u843D\u4E2D\u7684\u96A8\u6A5F\u8A5E edit_text_act_type_title=\u6D3B\u52D5\u985E\u578B edit_text_act_warnChangeType=\u6B64\u52D5\u4F5C\u5C07\u6E05\u9664\u6240\u6709\u73FE\u6709\u7684\u76EE\u6A19\u3002\u7E7C\u7E8C\u55CE\uFF1F edit_text_act_identWords=\u8B58\u5225\u5B57 edit_text_act_identChars=\u8B58\u5225\u5B57\u5143 edit_media_change_name=\u66F4\u6539\u540D\u7A31 edit_media_change_file=\u66F4\u6539\u6587\u4EF6 edit_media_includeInZip=\u5132\u5B58\u81F3ZIP\u6587\u4EF6 edit_media_type=\u5A92\u9AD4\u985E\u578B\uFF1A edit_media_size=\u6A94\u6848\u5927\u5C0F\uFF1A edit_media_show_type=\u6A94\u6848\u985E\u578B\uFF1A edit_media_preview=\u9810\u89BD\u5A92\u9AD4 edit_media_preview_tooltip=\u9810\u89BD\u5A92\u9AD4\u8CC7\u6E90 edit_media_rename=\u66F4\u6539\u8CC7\u6E90\u7684\u540D\u7A31 edit_media_rename_title=\u91CD\u65B0\u547D\u540D edit_media_rename_prompt=\u65B0\u540D\u7A31: edit_media_rename_invalid=\u7121\u6548\u7684\u8CC7\u6E90\u540D\u7A31\uFF01 edit_media_rename_exists=\u540D\u7A31\u91CD\u8907\uFF01\u6BCF\u500B\u8CC7\u6E90\u90FD\u5FC5\u9808\u6709\u4E00\u500B\u552F\u4E00\u7684\u540D\u7A31\u3002 edit_media_chfile_invalid=\u7121\u6548\u7684\u6587\u4EF6\uFF01 err_media_chfile_different=\u6587\u4EF6\u5FC5\u9808\u662F\u540C\u4E00\u985E\u578B\u7684 edit_media_font_error=\u7121\u6CD5\u52A0\u8F09\u5B57\u9AD4\uFF01 edit_media_save_file=\u4FDD\u5B58\u6587\u4EF6\uFF08\u5F9EZIP\u63D0\u53D6\uFF09 edit_media_refresh_file=\u5F9E\u6587\u4EF6\u66F4\u65B0\u5A92\u9AD4\u5167\u5BB9 edit_media_warn_zipFileNotExternal=\u9019\u4E0D\u662F\u4E00\u500B\u201C\u771F\u5BE6\u201D\u7684\u6587\u4EF6\uFF0C\u800C\u662F\u4F4D\u65BCZIP\u4E2D\u7684\u4E00\u500B\u5C0D\u8C61\u3002\u70BA\u4E86\u4F7F\u7528\u9019\u500B\u529F\u80FD\uFF0C\u4E00\u500B\u5177\u6709\u76F8\u540C\u540D\u7A31\u7684\u6587\u4EF6\u5FC5\u9808\u51FA\u73FE\u5728ZIP\u6587\u4EF6\u6240\u5728\u7684\u6587\u4EF6\u593E\u4E2D\u3002 edit_activities=\u6D3B\u52D5 edit_sequences=\u5E8F\u5217 edit_media=\u5A92\u9AD4\u5EAB edit_media_tooltip=\u7BA1\u7406\u5728\u9805\u76EE\u4E2D\u4F7F\u7528\u7684\u5716\u50CF\u548C\u5176\u4ED6\u5A92\u9AD4\u6587\u4EF6 edit_activities_tooltip=\u5275\u5EFA\u548C\u7DE8\u8F2F\u6D3B\u52D5\u9805\u76EE edit_sequences_tooltip=\u7DE8\u8F2F\u548C\u5275\u5EFA\u6D3B\u52D5\u7684\u9806\u5E8F edit_project_title=\u6A19\u984C edit_project_title_tooltip=\u9805\u76EE\u7684\u6A19\u984C edit_project=\u5C08\u6848 edit_project_tooltip=\u7DE8\u8F2F\u5C08\u6848\u5C6C\u6027 edit_project_description=\u63CF\u8FF0\uFF1A edit_project_description_tooltip=\u8A72\u9805\u76EE\u7684\u4E00\u822C\u63CF\u8FF0 edit_project_area=\u9818\u57DF: edit_project_area_tooltip=\u8A72\u9805\u76EE\u7684\u8AB2\u7A0B\u9818\u57DF edit_project_level=\u7B49\u7D1A\uFF1A edit_project_level_tooltip=\u8A72\u9805\u76EE\u7684\u6559\u80B2\u6C34\u5E73 edit_project_descriptors=\u63CF\u8FF0 edit_project_descriptors_tooltip=\u9805\u76EE\u63CF\u8FF0\uFF08\u7528\u9017\u865F\u5206\u9694\uFF09 edit_project_languages=\u8A9E\u7CFB\uFF1A edit_project_languages_tooltip=\u5728\u9805\u76EE\u4E2D\u4F7F\u7528\u7684\u8A9E\u8A00 edit_project_languages_modify=\u66F4\u6539\u6240\u9078\u64C7\u7684\u8A9E\u8A00 edit_project_languages_add=\u589E\u52A0\u8A9E\u8A00 edit_project_languages_select=ISO-639\u8A9E\u8A00\u4EE3\u78BC\uFF1A edit_project_authors=\u4F5C\u8005: edit_project_authors_tooltip=\u53C3\u8207\u8A72\u9805\u76EE\u7684\u5275\u5EFA\u4EBA edit_project_author_name=\u540D\u7A31\uFF1A edit_project_author_mail=\u96FB\u5B50\u90F5\u4EF6 edit_project_author_rol=\u89D2\u8272: edit_project_author_organization=\u7D44\u7E54\uFF1A edit_project_author_comments=\u5099\u8A3B\uFF1A edit_project_author_url=URL\uFF1A edit_project_author_name_tooltip=\u4F5C\u8005\u7684\u540D\u5B57\uFF08\u5FC5\u9700\uFF09 edit_project_author_mail_tooltip=\u4F5C\u8005\u7684\u96FB\u5B50\u90F5\u4EF6\uFF08\u53EF\u9078\uFF09 edit_project_author_rol_tooltip=\u5728\u8A72\u9805\u76EE\u4E2D\u7684\u89D2\u8272\uFF1A\u4F5C\u8005\uFF0C\u5408\u4F5C\u8005\uFF0C\u5716\u756B\uFF0C\u8072\u97F3... \uFF08\u53EF\u9078\uFF09 edit_project_author_organization_tooltip=\u5B78\u6821\uFF0C\u5927\u5B78\uFF0C\u5354\u6703... \uFF08\u53EF\u9078\uFF09 edit_project_author_url_tooltip=\u500B\u4EBA\u7DB2\u9801\uFF08\u53EF\u9078\uFF09 edit_project_author_comments_tooltip=\u73FE\u5834\u7684\u5176\u4ED6\u4FE1\u606F\uFF08\u53EF\u9078\uFF09 edit_project_author_info=\u4F5C\u8005\u8A0A\u606F\uFF1A edit_project_author_add=\u5728\u5217\u8868\u4E2D\u589E\u52A0\u4F5C\u8005 edit_project_author_edit=\u7DE8\u8F2F\u4F5C\u8005\u8A0A\u606F edit_project_org_name=\u540D\u7A31\uFF1A edit_project_org_name_tooltip=\u5B78\u6821\u540D\u7A31 edit_project_org_mail=\u96FB\u5B50\u90F5\u4EF6 edit_project_org_mail_tooltip=\u5B78\u6821\u7684\u96FB\u5B50\u90F5\u4EF6\u5730\u5740 edit_project_org_url=URL\uFF1A edit_project_org_url_tooltip=\u5B78\u6821\u7DB2\u9801 edit_project_org_address=\u5730\u5740\uFF1A edit_project_org_address_tooltip=\u96FB\u5B50\u90F5\u4EF6\u5730\u5740 edit_project_org_pc=PC: edit_project_org_pc_tooltip=\u90F5\u653F\u7DE8\u78BC edit_project_org_city=\u5E02\uFF1A edit_project_org_city_tooltip=\u5B78\u6821\u6240\u5728\u57CE\u5E02 edit_project_org_country=\u570B\u5BB6/\u5730\u5340: edit_project_org_state=\u7701/\u5DDE\uFF1A edit_project_org_comments=\u5099\u8A3B\uFF1A edit_project_org=\u5B78\u6821: edit_project_org_tooltip=\u53C3\u8207\u8A72\u9805\u76EE\u7684\u5B78\u6821\u6216\u5176\u4ED6\u6A5F\u69CB edit_project_org_info=\u7D44\u7E54\u8A0A\u606F\uFF1A edit_project_org_add=\u589E\u52A0\u7D44\u7E54 edit_project_org_edit=\u589E\u52A0\u7D44\u7E54\u8CC7\u6599 edit_project_org_country_tooltip=\u570B\u5BB6\u3001\u806F\u90A6\u3001\u806F\u5408\u6703... edit_project_org_state_tooltip=\u806F\u90A6\u570B\u5BB6\uFF0C\u793E\u5340\uFF0C\u5340\u57DF... edit_project_org_comments_tooltip=\u5176\u4ED6\u8A0A\u606F... edit_project_rev_date=\u65E5\u671F\uFF1A edit_project_rev_date_tooltip=\u4FEE\u8A02\u65E5\u671F edit_project_rev_authors=\u4F5C\u8005: edit_project_rev_authors_tooltip=\u4FEE\u8A02\u7684\u4F5C\u8005 edit_project_rev_description=\u63CF\u8FF0\uFF1A edit_project_rev_description_tooltip=\u7C21\u8981\u8AAA\u660E\u8B8A\u5316 edit_project_rev_comments=\u5099\u8A3B\uFF1A edit_project_rev_comments_tooltip=\u5176\u4ED6\u76F8\u95DC\u4FE1\u606F edit_project_rev=\u4FEE\u6539\uFF1A edit_project_rev_tooltip=\u4E3B\u8981\u4FEE\u6539\u6B64\u5C08\u6848\u7684\u6B77\u53F2\u7D00\u9304 edit_project_rev_add=\u65B0\u589E\u7684\u4FEE\u8A02\u8A18\u9304 edit_project_rev_edit=\u7DE8\u8F2F\u4FEE\u8A02\u8A18\u9304 edit_project_rev_info=\u4FEE\u8A02\u8CC7\u6599 edit_media_objects=\u7269\u4EF6 edit_media_object=\u7269\u4EF6 edit_evsounds_start=\u958B\u59CB\u7684\u6D3B\u52D5\uFF1A edit_evsounds_click=\u9EDE\u9078\u7269\u4EF6\uFF1A edit_evsounds_actionError=\u932F\u8AA4\u52D5\u4F5C\uFF1A edit_evsounds_actionOk=\u6B63\u78BA\u52D5\u4F5C\uFF1A edit_evsounds_finishedError=\u6D3B\u52D5\u932F\u8AA4\u7684\u7D50\u675F\uFF1A edit_evsounds_finishedOk=\u6D3B\u52D5\u6B63\u78BA\u7684\u7D50\u675F\uFF1A edit_project_rev_err_nodesc=\u932F\u8AA4\uFF1A\u63CF\u8FF0\u5B57\u6BB5\u4E0D\u80FD\u7559\u4E0B\u7A7A\u767D\uFF01 edit_evsounds_dlg_title=\u7DE8\u8F2F\u4E8B\u4EF6\u8072\u97F3 edit_project_evsounds=\u4E8B\u4EF6\u97F3\u6548\uFF1A edit_project_evsounds_tooltip=\u8A2D\u7F6E\u7279\u5B9A\u7684\u8072\u97F3\u7D66\u6BCF\u4E00\u500BJClic\u4E8B\u4EF6 edit_act_evsounds=\u4E8B\u4EF6\u97F3\u6548\uFF1A edit_act_evsounds_tooltip=\u8A2D\u7F6E\u7279\u5B9A\u7684\u8072\u97F3\u7D66\u6BCF\u4E00\u500BJClic\u4E8B\u4EF6 edit_evsounds_default=\u9810\u8A2D\u7684\u8072\u97F3 edit_evsounds_disabled=\u505C\u7528 edit_evsounds_chk_tooltip=\u555F\u7528\u6216\u7981\u7528\u6B64\u4E8B\u4EF6\u7684\u8072\u97F3 edit_evsounds_select_tooltip=\u55AE\u64CA\u4EE5\u9078\u4E2D\u6B64\u4E8B\u4EF6\u7684\u8072\u97F3\uFF0C\u6216\u53D6\u6D88\u9078\u64C7\u4F7F\u7528\u9810\u8A2D\u7684\u8072\u97F3 action_newProject_caption=\u65B0\u5C08\u6848... action_newProject_keys=NN action_newProject_tooltip=\u65B0\u589E\u4E00\u500B\u65B0\u7684JClic\u5C08\u6848 edit_arith_op_from=\u4F86\u81EA: edit_arith_op_from_tooltip=\u64CD\u4F5C\u8005\u7684\u6700\u4F4E\u503C edit_arith_op_to=\u5230\uFF1A edit_arith_op_to_tooltip=\u64CD\u4F5C\u8005\u7684\u6700\u5927\u503C edit_arith_op_with=\u70BA\uFF1A edit_arith_op_with_tooltip=\u7D93\u904E\u78BA\u8A8D\uFF0C\u64CD\u4F5C\u8005\u4E5F\u53EF\u4EE5\u6709\u6B64\u503C edit_arith_op_fromList=\u5F9E\u5217\u8868\u4E4B\u4E00\uFF1A edit_arith_op_fromList_tooltip=\u64CD\u4F5C\u7684\u53EF\u80FD\u503C\u5217\u8868 edit_arith_op_decimals=\u5341\u9032\u4F4D\u7684\uFF1A edit_arith_op_decimals_tooltip=\u5C0F\u6578\u9EDE\u53D6\u5230\u7B2C\u5E7E\u4F4D edit_arith_op_dec0=# (integer) edit_arith_op_dec1=#.# edit_arith_op_dec2=#.## edit_arith_firstOp=\u7B2C\u4E00\u4F4D edit_arith_secondOp=\u7B2C\u4E8C\u4F4D edit_arith_title=\u5C0DJClic\u7684\u6578\u5B572 edit_arith_operations=\u6709\u6548\u4F4D\u6578: edit_arith_operations_tooltip=\u8ACB\u9078\u64C7\u4F4D\u6578\u7684\u8F38\u51FA\u5F62\u5F0F edit_arith_operations_plus=\u52A0\u865F edit_arith_operations_minus=\u6E1B\u865F edit_arith_operations_multiply=\u4E58\u865F edit_arith_operations_divide=\u9664\u865F edit_arith_unknown=\u672A\u77E5: edit_arith_unknown_tooltip=\u8ACB\u9078\u64C7\u6B32\u8868\u73FE\u672A\u77E5\u52D5\u4F5C\u7684\u9805\u76EE edit_arith_unknown_aobx=\u7D50\u679C\u4E0D\u660E edit_arith_unknown_aoxr=\u7B2C\u4E8C\u904B\u7B97\u5B50\u4E0D\u660E edit_arith_unknown_xobr=\u7B2C\u4E00\u904B\u7B97\u5B50\u4E0D\u660E edit_arith_unknown_axbr=\u904B\u7B97\u5B50\u4E0D\u660E edit_arith_unknown_invert=\u8ACB\u5BEB\u51FA\u5728\u958B\u982D\u8868\u9054\u7684\u7D50\u679C edit_arith_result=\u7D50\u679C: edit_arith_result_notCarry=\u4E0D\u8981\u9032\u4F4D edit_arith_result_random=\u96A8\u6A5F\u4E82\u6578 edit_arith_result_asc=\u905E\u589E edit_arith_result_order=\u5C07\u7D50\u679C\u6392\u5E8F: edit_arith_result_desc=\u905E\u6E1B edit_arith_result_avoidDup=\u907F\u514D\u91CD\u8907 edit_arith_cond=\u60C5\u6CC1\uFF1A edit_arith_cond_ind=\u540C\u503C\u6027 edit_arith_cond_agb=\u7B2C\u4E00\u500B\u904B\u7B97\u5B50\u5FC5\u9808\u5927\u65BC\u7B2C\u4E8C\u500B\u904B\u7B97\u5B50 edit_arith_cond_alb=\u7B2C\u4E00\u500B\u904B\u7B97\u5B50\u5FC5\u9808\u5C0F\u65BC\u7B2C\u4E8C\u500B\u904B\u7B97\u5B50 edit_arith_cond_tooltip=\u5176\u4ED6\u60C5\u6CC1 edit_autocp=\u81EA\u52D5\u5167\u5BB9\u7522\u751F\u5668 edit_autocp_tooltip=\u5C0D\u6B64\u52D5\u4F5C\u9078\u53D6\u81EA\u52D5\u5167\u5BB9\u7522\u751F\u5668\u7684\u578B\u614B\u3002 edit_autocp_block=\u5167\u5BB9\u7522\u751F\u5668 edit_autocp_btn=\u8A2D\u5B9A... edit_autocp_btn_tooltip=\u8ACB\u914D\u7F6E\u5167\u5BB9\u4F86\u6E90\u8A2D\u5B9A edit_data=\u7DE8\u8F2F\u8CC7\u6599 edit_act=\u52D5\u614B\u7DE8\u8F2F edit_acp=\u5167\u5BB9\u4F86\u6E90\u7DE8\u8F2F edit_acp_err_creating=\u7522\u751F\u5167\u5BB9\u4F86\u6E90\u6642\u767C\u751F\u932F\u8AA4\uFF01 edit_project_author_group=\u5EFA\u7ACB edit_project_description_block=\u63CF\u8FF0 edit_project_ui_block=\u4F7F\u7528\u8005\u4ECB\u9762 edit_act_description=\u63CF\u8FF0\uFF1A m_Edit=\u7DE8\u8F2F m_Edit_Mnemonic=E edit_media_preview_keys=P* edit_act_newActivity=\u958B\u65B0\u52D5\u4F5C... edit_act_newActivity_keys=A* edit_act_testAction_keys=P#10 edit_seq_newElement_keys=S* m_Insert=\u63D2\u5165 m_Insert_Mnemonic=I m_View=\u6AA2\u8996 m_View_Mnemonic=V action_editProject_caption=\u5C08\u6848 action_editProject_keys=PP action_editProject_tooltip=\u7DE8\u8F2F\u5C08\u6848\u8A2D\u5B9A action_editMedia_caption=\u5A92\u9AD4 action_editMedia_keys=MM action_editMedia_tooltip=\u7DE8\u8F2F\u5C08\u6848\u7684\u591A\u5A92\u9AD4\u51FD\u6578\u5EAB action_editActivities_caption=\u6D3B\u52D5 action_editActivities_keys=AA action_editActivities_tooltip=\u7DE8\u8F2F\u6D3B\u52D5 action_editSeq_caption=\u5E8F\u5217 action_editSeq_keys=SS action_editSeq_tooltip=\u82F1\u6587\uFF1A warn_project_modified=\u76EE\u524D\u7684\u5C08\u6848\u5DF2\u88AB\u4FEE\u6539\u3002\u8981\u5132\u5B58\u9019\u4E9B\u8B8A\u66F4\u55CE? edit_project_descriptors_block=\u63CF\u8FF0\u7B26\u865F edit_media_new=\u958B\u65B0\u5A92\u9AD4\u7269\u4EF6... edit_media_new_tooltip=\u52A0\u5165\u65B0\u7684\u5716\u50CF\u6216\u591A\u5A92\u9AD4\u5230\u51FD\u6578\u5EAB\u4E2D edit_media_new_keys=M* edit_seq_threshold=\u5206\u6578\u9580\u6ABB: edit_seq_threshold_tooltip_up=\u7576\u4E16\u754C\u5206\u6578\u5927\u65BC\u6216\u7B49\u65BC\u6642\u505A\u6B64\u65B9\u6CD5... edit_seq_time=\u6642\u9593\u9580\u6ABB: edit_seq_time_tooltip_up=\u63A1\u53D6\u9019\u7A2E\u65B9\u5F0F\uFF0C\u6240\u82B1\u8CBB\u7684\u6642\u9593\u4E0A\u7684\u6D3B\u52D5\u5FC5\u9808\u5C0F\u65BC... edit_seq_threshold_tooltip_down=\u7576\u5168\u7403\u5206\u6578\u5C0F\u65BC\u6642\u505A\u6B64\u65B9\u6CD5... edit_seq_time_tooltip_down=\u63A1\u53D6\u6B64\u65B9\u6CD5\u7576\u82B1\u8CBB\u5728\u6D3B\u52D5\u4E0A\u6642\u9593\u8D85\u904E... edit_seq_condJump=\u689D\u4EF6\u8DF3\u8F49 edit_seq_condJump_tooltip=\u8A2D\u7F6E\u53EA\u6709\u5728\u7279\u5B9A\u689D\u4EF6\u4E0B\u57F7\u884C\u7684\u7279\u6B8A\u8DF3\u8F49 edit_seq_condJump_upper_tooltip=\u8A2D\u5B9A\u8DF3\u8F49\u81F3\u8F03\u9AD8\u7B49\u7D1A\u7684\u689D\u4EF6 edit_seq_condJump_lower=\u8F03\u4F4E\u968E\u7684\u8DF3\u8F49: edit_seq_condJump_upper=\u8F03\u9AD8\u968E\u7684\u8DF3\u8F49: edit_seq_condJump_lower_tooltip=\u8A2D\u5B9A\u8DF3\u8F49\u81F3\u8F03\u4F4E\u7B49\u7D1A\u7684\u689D\u4EF6 edit_seq_action_tooltip_fw=\u52D5\u4F5C\u6307\u5B9A\u7D66\u300C\u4E0B\u4E00\u9805\u300D\u6309\u9215 edit_seq_action_tooltip_bk=\u52D5\u4F5C\u6307\u5B9A\u7D66\u300C\u4E0A\u4E00\u9805\u300D\u6309\u9215 edit_seq_jump_tooltip=\u8A2D\u5B9A\u8DF3\u8F49\u76EE\u6A19 edit_seq_action_tooltip=\u52D5\u4F5C\u5373\u5B8C\u6210 edit_seq_activity_tooltip=\u5206\u914D\u6D3B\u52D5\u5230\u6B64\u5E8F\u5217\u5143\u7D20 edit_seq_tag_tooltip=\u6A19\u7C64\u7528\u65BC\u5F15\u7528\u6B64\u5E8F\u5217\u5143\u7D20\uFF08\u53EF\u9078\u5340\u57DF\u4E2D\uFF09 edit_seq_description_tooltip=\u6B64\u5E8F\u5217\u5143\u7D20(\u53EF\u9078\u5340\u57DF)\u7684\u63CF\u8FF0 edit_seq_button_enabled_tooltip=\u555F\u7528\u6216\u505C\u7528\u7BAD\u865F\u6309\u9215 edit_seq_auto_tooltip=\u7576\u6D3B\u52D5\u7D50\u675F\u6642\u81EA\u52D5\u79FB\u52D5 edit_seq_delay_tooltip=\u81EA\u52D5\u79FB\u52D5\u524D\u9700\u7B49\u5F85\u6578\u79D2\u9418 edit_color_dlgTitle=\u9078\u53D6\u984F\u8272 edit_media_renaming=\u7576\u8CC7\u6E90\u88AB\u6539\u540D\u6642\u8ACB\u7B49\u5F85... edit_act_cell_width=\u5BEC\u5EA6: edit_act_cell_width_tooltip=\u683C\u5B50\u5BEC\u5EA6(\u50CF\u7D20) edit_act_cell_height=\u9AD8\u5EA6: edit_act_cell_height_tooltip=\u683C\u5B50\u9AD8\u5EA6(\u50CF\u7D20) edit_act_hiddenWords=\u88AB\u96B1\u85CF\u7684\u6587\u5B57: edit_act_hiddenWords_tooltip=\u5728\u9762\u677F\u4E0A\u96B1\u85CF\u5B57\u7684\u5217\u8868 edit_act_wordSearch_panelB=\u4F7F\u7528\u7D44\u5225B edit_act_wordSearch_panelB_tooltip=\u7B2C\u4E8C\u500B\u9762\u7248\u7684\u5167\u5BB9\u6703\u986F\u793A\u6210\u6587\u5B57 edit_act_shaper_tooltip=\u8ACB\u9078\u64C7\u5728\u9762\u677F\u4E2D\u578B\u614B\u7684\u985E\u578B edit_act_num_cols_tooltip=\u9762\u7248\u7684\u6B04\u6578 edit_act_num_rows_tooltip=\u9762\u7248\u7684\u884C\u6578 edit_act_wildTransparent=\u900F\u660E\u5206\u9694\u865F edit_act_wildTransparent_tooltip=\u5C07\u5206\u9694\u7B26(\u9ED1\u76D2)\u7576\u4F5C\u900F\u660E\u5B54 edit_act_behavior_scramble_times=\u6DF7\u5408: edit_act_behavior_scramble_times_tooltip=\u6253\u4E82\u6B21\u6578 edit_act_copy_title=\u8907\u88FD\u5C6C\u6027\u5230... edit_act_copy_attributes=\u5C6C\u6027 edit_act_copy_dest=\u5957\u7528\u5230: edit_act_copy_style_main=\u4E3B\u8996\u7A97 edit_act_copy_style_play=\u64AD\u653E\u8996\u7A97 edit_act_copy_activities=\u88AB\u4FEE\u6539\u7684\u6D3B\u52D5 edit_act_copyAttributes=\u8907\u88FD\u5C6C\u6027 edit_act_copyAttributes_keys=T edit_act_copyAttributes_tooltip=\u5C07\u73FE\u5728\u6D3B\u52D5\u7279\u5FB5\u8907\u88FD\u5230\u5176\u5B83\u7684\u6D3B\u52D5 edit_new_project_name=\u5C08\u6848\u540D\u7A31: edit_new_project_name_tooltip=\u5C08\u6848\u7C21\u8FF0\u3001\u63CF\u8FF0\u540D\u7A31 edit_new_project_filename=\u6A94\u6848\u540D\u7A31\uFF1A edit_new_project_filename_tooltip=\u5C08\u6848\u6587\u4EF6\u7684\u540D\u7A31\uFF0C\u4E0D\u6703\u64F4\u5C55 edit_new_project_folder=\u8CC7\u6599\u593E: edit_new_project_folder_tooltip=\u5132\u5B58\u5C08\u6848\u7684\u6587\u4EF6\u593E\u540D\u7A31 edit_new_project_folder_browse=\u700F\u89BD... edit_new_project_title=\u5EFA\u7ACB\u65B0\u7684JClic\u5C08\u6848 edit_new_project_err_empty=\u767C\u751F\u932F\u8AA4\uFF1A\u5C08\u6848,\u6A94\u6848\u53CA\u8CC7\u6599\u593E\u5FC5\u9808\u662F\u53EF\u884C\u4E14\u7121\u7A7A\u767D\u7684\u540D\u7A31 edit_new_project_warning_noEmptyFolder=\u6B64\u8CC7\u6599\u593E\u5DF2\u5305\u542B\u5176\u4ED6Clic 3.0\u6216\u5176\u4ED6Clic\u7684\u5C08\u6848\u3002\r\n\u70BA\u907F\u514D\u6DF7\u6DC6\uFF0C\u76E1\u91CF\u7DAD\u6301\u6BCF\u500B\u5C08\u6848\u5728\u5206\u958B\u7684\u8CC7\u6599\u593E\uFF0C\u4F46\u9019\u4E0D\u662F\u5F37\u5236\u7684\u898F\u5B9A\u3002\r\n\u60A8\u771F\u7684\u8981\u5728\u6B64\u8CC7\u6599\u593E\u5EFA\u7ACB\u65B0\u7684\u5C08\u6848\u55CE\uFF1F edit_new_project_err_folderCreation=\u767C\u751F\u932F\u8AA4\uFF1A\u7121\u6CD5\u5EFA\u7ACB\u6307\u5B9A\u7684\u8CC7\u6599\u593E edit_act_copy_err_noSelection=\u932F\u8AA4: \u6C92\u6709\u9078\u64C7\u6D3B\u52D5! \u70BA\u4E86\u4F7F\u7528\u9019\u500B\u529F\u80FD\uFF0C\u4F60\u5FC5\u9808\u8981\u9078\u64C7\u5217\u8868\u4E2D\u7684\u6D3B\u52D5\u4EE5\u61C9\u7528\u88AB\u6307\u5B9A\u7684\u5C6C\u6027 edit_act_copy_action_prefix=\u8907\u88FD\u5C6C\u6027\u81F3... edit_act_copy_margin=\u908A\u754C edit_act_copy_bgColor=\u80CC\u666F\u984F\u8272 edit_act_copy_gradient=\u6F38\u5C64 edit_act_copy_bgImage=\u80CC\u666F\u5716\u7247 edit_act_copy_border=\u5916\u6846 edit_act_copy_transparentBg=\u900F\u660E\u80CC\u666F edit_act_copy_position=\u4F4D\u7F6E edit_act_copy_messages=\u8A0A\u606F edit_act_copy_messages_ini=\u521D\u59CB\u8A0A\u606F\u7684\u8A2D\u8A08 edit_act_copy_messages_end=\u7D50\u675F\u8A0A\u606F\u7684\u8A2D\u8A08 edit_act_copy_messages_err=\u932F\u8AA4\u8A0A\u606F\u7684\u8A2D\u8A08 edit_act_copy_reports=\u5831\u544A edit_act_copy_rep_include=\u5C07\u6D3B\u52D5\u5305\u62EC\u5728\u5831\u544A\u4E2D edit_act_copy_rep_actions=\u88AB\u8A18\u9304\u7684\u52D5\u4F5C edit_act_copy_interface=\u4F7F\u7528\u8005\u4ECB\u9762 edit_act_copy_skin=\u5916\u89C0 edit_act_copy_evSounds=\u4E8B\u4EF6\u97F3\u6548 edit_act_copy_counters=\u8A08\u6578\u5668 edit_act_copy_cTime=\u8A08\u6642\u5668 edit_act_copy_maxTime=\u6700\u5927\u6642\u9593 edit_act_copy_cTries=\u5617\u8A66\u8A08\u6578\u5668 edit_act_copy_maxTries=\u6700\u5927\u5617\u8A66\u6578 edit_act_copy_cScore=\u7A4D\u5206 edit_act_copy_scramble=\u722D\u53D6\u6B21\u6578 edit_act_copy_buttons=\u6309\u9215 edit_act_copy_btnHelp=[\u8AAA\u660E] \u6309\u9215 edit_act_copy_btnInfo=\u4FE1\u606F\u6309\u9215 edit_act_copy_grids=\u7DB2\u683C edit_act_copy_gridA=\u7DB2\u683CA\u7684\u8A2D\u8A08 edit_act_copy_gridB=\u7DB2\u683CB\u7684\u8A2D\u8A08 edit_act_copy_textGrid=\u6587\u672C\u7DB2\u683C\u7684\u8A2D\u8A08 edit_act_copy_text=\u6587\u672C\u52D5\u4F5C edit_act_copy_fontFace=\u5B57\u9AD4 edit_act_copy_fontSize=\u5B57\u578B\u5927\u5C0F edit_act_copy_fontStyle=\u5B57\u578B\u6A23\u5F0F edit_act_copy_textColour=\u4E3B\u8981\u6587\u672C\u984F\u8272 edit_act_copy_textTargetColour=\u9078\u64C7JClic\u5C08\u6848\u4E2D\u5C07\u532F\u5165\u7684\u6D3B\u52D5 edit_act_copy_textErrorColour=\u932F\u8AA4\u984F\u8272 edit_act_copy_tabSpace=Tab\u9375\u7A7A\u767D\u7A7A\u9593 edit_act_copy_messages_prev=\u5148\u524D\u7684\u8A0A\u606F\u8A2D\u8A08 edit_act_changeType=\u66F4\u6539\u6D3B\u52D5\u985E\u578B edit_act_newActivity_class_tooltip=\u7528\u4F86\u5EFA\u9020\u6D3B\u52D5\u7684\u985E\u5225\u5168\u540D\uFF08\u50C5\u8B93\u9032\u968E\u4F7F\u7528\u8005\u4F7F\u7528\uFF01\uFF09 edit_act_newActivity_other=\u5176\u5B83\u2026 edit_act_newActivity_info=\u9AD8\u7D1A\u7528\u6236\u9084\u53EF\u4EE5\u5275\u5EFA\u672A\u8A3B\u518AJClic\u6D3B\u52D5\u985E\u578B\u3002\u53EA\u662F\u5BEB\u5728\u4E0B\u9762\u7684\u5B8C\u6574\u985E\u540D\u524D\u7DB4\u5305\uFF08\u50CF\u201Ccom.acme.activities.FooActivity\u201D\uFF09\u3002\u6D3B\u52D5\u8AB2\u5FC5\u9808\u5EF6\u9577 edu.xtec.jclic.Activity\uFF0C\u5FC5\u9808\u5230JVM\u7684\u985E\u52A0\u8F09\u5668\u8A2A\u554F\u3002 edit_act_newActivity_name=\u6D3B\u52D5\u540D\u7A31 edit_act_newActivity_name_tooltip=\u5728\u5C08\u6848\u7684\u4E2D\u7684\u6BCF\u500B\u6D3B\u52D5\u5730\u9700\u6709\u500B\u7368\u7279\u7684\u540D\u7A31 edit_act_changeType_warning=

\u8B66\u544A\uFF1A\u66F4\u6539\u985E\u578B\u7684\u6D3B\u52D5\u53EF\u4EE5\u5C0E\u81F4\u5931\u53BB\u4E86\u4E00\u4E9B\u7576\u524D\u6D3B\u52D5\u7684\u5C6C\u6027\u548C\u5C0D\u8C61\u3002\u5C0F\u5FC3\u4F7F\u7528\uFF01

applet_codebase=JClic \u4EE3\u78BC\u7684\u4F4D\u7F6E applet_codebase_tooltip=\u6307\u5411\u5167\u6709JClic\u7A0B\u5F0F\u6587\u4EF6\u8207\u8173\u672C\u7684\u6587\u4EF6\u593EURL applet_prev_text=\u4E4B\u524D\u7684HTML\u4EE3\u78BC #Text to be displayed below the applet. HTM code allowed. applet_prev_text_tooltip=\u7F6E\u65BC\u5C0F\u61C9\u7528\u7A0B\u5F0F\u524D\u7684\u6587\u672C\u6216HTML\u4EE3\u78BC applet_post_text=\u4E4B\u5F8C\u7684HTML\u4EE3\u78BC applet_post_text_tooltip=\u7F6E\u65BC\u5C0F\u61C9\u7528\u7A0B\u5F0F\u5F8C\u7684\u6587\u672C\u6216HTML\u4EE3\u78BC applet_size=\u61C9\u7528\u5C0F\u7A0B\u5F0F\u7684\u5927\u5C0F applet_size_tooltip=\u5C0F\u61C9\u7528\u7A0B\u5F0F\u7684\u5BEC\u5EA6\u8207\u9AD8\u5EA6\uFF08\u7D55\u5C0D\u503C\u6216\u767E\u5206\u6BD4\uFF09 applet_page_title=\u9801\u9762\u6A19\u984C\uFF1A applet_page_title_tooltip=\u700F\u89BD\u5668\u7A97\u53E3\u9802\u7AEF\u7684\u6587\u5B57 applet_created_info=\u7DB2\u9801 "%s" \u6210\u529F\u5EFA\u7ACB\u3002 applet_created_prompt=\u73FE\u5728\u4F60\u60F3\u7528\u700F\u89BD\u5668\u6253\u958B\u5B83\u55CE\uFF1F action_createHTML_caption=\u5275\u9020\u7DB2\u9801\u9801\u9762... applet_create_title=\u7528JClic \u9762\u677F\u5C0F\u7A0B\u5F0F\u5275\u9020\u7684HTML\u9801\u9762 action_createHTML_tooltip=\u5275\u5EFA\u4E00\u500BHTML\u9801\u9762\u5305\u542B\u7576\u524D\u9805\u76EE\u7684\u9762\u677F\u5C0F\u7A0B\u5F0F applet_filename=\u6A94\u6848\u540D\u7A31\uFF1A applet_filename_tooltip=\u88AB\u5275\u9020\u7684HTML\u6A94\u6848\u540D\u7A31 action_createHTML_keys=H* settings_applet=\u9762\u677F\u5C0F\u7A0B\u5F0F settings_applet_tooltip=\u9801\u9762\u5275\u4F5C\u9810\u8A2D\u503C applet_bgcolor=\u80CC\u666F\u984F\u8272\uFF1A applet_bgcolor_tooltip=HTML\u9801\u9762\u80CC\u666F\u984F\u8272 applet_centered=\u7F6E\u4E2D applet_centered_tooltip=\u6C34\u5E73\u7F6E\u4E2D\u5C0F\u61C9\u7528\u7A0B\u5F0F applet_width_tooltip=\u5C0F\u61C9\u7528\u7A0B\u5F0F\u5BEC\u5EA6\uFF08\u7D55\u5C0D\u503C\u6216\u767E\u5206\u6BD4\uFF09 applet_height_tooltip=\u5C0F\u61C9\u7528\u7A0B\u5F0F\u9AD8\u5EA6\uFF08\u7D55\u5C0D\u503C\u6216\u767E\u5206\u6BD4\uFF09 applet_exitUrl=\u96E2\u958B\uFF0C\u8DF3\u5230\uFF1A applet_exitUrl_tooltip=\u91CD\u5B9A\u5411\u9000\u51FAJClic\u5C0E\u822A\u7684URL applet_infoFrame=\u8A0A\u606F\u5E55\u7684\u540D\u5B57\uFF1A applet_infoFrame_tooltip=\u986F\u793A\u201C\u4FE1\u606F\u201D\u6309\u9215\u76F8\u95DC\u5167\u5BB9\u5834\u666F\u7684\u540D\u7A31 action_createInstaller_caption=\u5B89\u88DD\u5275\u5EFA\u7684\u5C08\u6848 action_createInstaller_keys=I* action_createInstaller_tooltip=\u5EFA\u7ACBJClic\u64AD\u653E\u5668\u7684\u9805\u76EE\u5B89\u88DD\u8173\u672C installer_caption=\u7DE8\u8F2F\u9805\u76EE\u5B89\u88DD\u56AE\u5C0E\u8173\u672C installer_title=\u6A19\u984C installer_title_tooltip=\u5B89\u88DD\u56AE\u5C0E\u5167\u7684\u9805\u76EE\u6A19\u984C installer_authors=\u4F5C\u8005\uFF1A installer_authors_tooltip=\u9805\u76EE\u7684\u4F5C\u8005 installer_folder=\u8CC7\u6599\u593E: installer_folder_tooltip=\u5B89\u88DD\u56AE\u5C0E\u5EFA\u8B70\u7684\u8CC7\u6599\u593E\u540D\u7A31 installer_files=\u8981\u5FA9\u5236\u7684\u6587\u4EF6 installer_files_tooltip=\u88AB\u5B89\u88DD\u7A0B\u5F0F\u8907\u88FD\u7684\u6587\u4EF6 installer_files_available=\u73FE\u6709\u7684\u6587\u4EF6 installer_files_selected=\u88AB\u9078\u53D6\u7684\u6587\u4EF6 installer_files_add=>>\u65B0\u589E>> installer_files_add_tooltip=\u65B0\u589E\u88AB\u9078\u53D6\u6587\u4EF6\u81F3\u5217\u8868\u4E2D installer_files_remove=<<\u79FB\u9664<< installer_files_remove_tooltip=\u79FB\u9664\u88AB\u9078\u53D6\u6587\u4EF6 installer_button=\u57F7\u884C\u6309\u9215 installer_button_tooltip=\u9805\u76EE\u5EAB\u4E2D\u986F\u793A\u7684\u6309\u9215\u7684\u5C6C\u6027 installer_button_project=\u4E3B\u5C08\u6848 installer_button_project_tooltip=JClic\u9805\u76EE\u6309\u9215\u555F\u52D5 installer_button_text=\u6A19\u7C64: installer_button_text_tooltip=\u7C21\u77ED\u7684\u6587\u5B57\u6A19\u7C64_\u88E1\u9762\u7684\u6309\u9215\u986F\u793A installer_button_icon=\u5716\u793A: installer_button_icon_tooltip=\u88AB\u7528\u4F86\u4F5C\u70BA\u6309\u9215\u5716\u6A19\u7684\u5716\u7247\u3002\u7559\u7A7A\u4F7F\u7528\u9ED8\u8A8DJClic\u5716\u6A19\u3002 installer_button_description=\u63CF\u8FF0 installer_button_description_tooltip=\u88AB\u6309\u9215\u986F\u793A\u5DE5\u5177\u63D0\u793A installer_error_noTitle=\u932F\u8AA4\uFF1A\u7F3A\u5C11\u9805\u76EE\u540D\u7A31 installer_error_noBaseFolder=\u932F\u8AA4\uFF1A\u7F3A\u5C11\u6587\u4EF6\u593E\u7684\u540D\u7A31 installer_error_noFilesSelected=\u932F\u8AA4\uFF1A\u5C1A\u672A\u9078\u53D6\u6A94\u6848 installer_error_noButtonText=\u932F\u8AA4\uFF1A\u7F3A\u5C11\u555F\u52D5\u6309\u9215\u7684\u6587\u5B57\u6A19\u7C64 installer_error_projectNotInFiles=\u932F\u8AA4\uFF1A\u8A72\u9805\u76EE\u5206\u914D\u7D66\u767C\u5C04\u6309\u9215\u662F\u4E0D\u662F\u8981\u8907\u88FD\u7684\u6587\u4EF6\u5217\u8868 applet_page_full=\u5168\u9801\u9762\u61C9\u7528\u5C0F\u5DE5\u5177 applet_page_mixed=\u7279\u5B9A\u7DAD\u5EA6\u7684\u61C9\u7528\u5C0F\u5DE5\u5177 edit_text_align_left=\u6587\u672C\u7F6E\u5DE6 edit_text_align_center=\u6587\u672C\u7F6E\u4E2D edit_text_align_right=\u6587\u672C\u7F6E\u53F3 edit_text_act_target_toggle=\u5275\u5EFA\u6216\u522A\u9664\u76EE\u6A19 edit_text_act_insertCell=\u63D2\u5165\u4E00\u500B\u55AE\u5143 edit_text_act_content=\u5167\u5BB9 edit_text_act_style=\u6A23\u5F0F edit_cell_size=\u55AE\u5143\u5C3A\u5BF8: edit_project_orphanActivities=\u4EE5\u4E0B\u6D3B\u52D5\u4E0D\u6703\u51FA\u73FE\u5728\u4EFB\u4F55\u9805\u76EE\u7684\u6D3B\u52D5\u5E8F\u5217\uFF0C\u6240\u4EE5\u4ED6\u5011\u6C38\u9060\u4E5F\u4E0D\u6703\u88AB\u986F\u793A\uFF1A edit_project_orphanMedia=\u4EE5\u4E0B\u7684\u5A92\u9AD4\u5C0D\u8C61\uFF0C\u4E0D\u80FD\u76F4\u63A5\u4F7F\u7528\u7684\u4EFB\u4F55\u6D3B\u52D5\uFF1A edit_project_orphanActivities_prompt=\u4F60\u60F3\u5728\u6700\u5F8C\u4E00\u500B\u6D3B\u52D5\u5E8F\u5217\u7684\u7D50\u5C3E\u4E2D\u6DFB\u52A0\u55CE\uFF1F edit_project_orphanMedia_prompt=\u4F60\u8981\u522A\u9664\u9019\u4E9B\u9078\u9805\u55CE? edit_project_orphanMedia_title=\u79FB\u9664\u4E0D\u7528\u500B\u5A92\u9AD4\u7269\u4EF6 edit_project_orphanActivities_title=\u5B64\u5152\u6D3B\u52D5 edit_media_refreshAll=\u4E0A\u8F09\u6240\u6709\u5A92\u9AD4\u5167\u6587 edit_media_refreshAll_tooltip=\u4E0A\u8F09\u6240\u6709\u5A92\u9AD4\u7269\u4EF6\u4E26\u91CD\u8F09\u6A94\u6848 edit_media_refreshAll_keys=R* edit_media_refreshAll_working=\u6B63\u5728\u66F4\u65B0\u5A92\u9AD4... edit_media_exportAll=\u5C0E\u51FA\u6240\u6709\u5A92\u9AD4 edit_media_exportAll_tooltip=\u4FDD\u5B58\u6587\u4EF6\u7684\u6240\u6709\u5A92\u9AD4\u5143\u7D20\u7684\u542B\u91CF edit_media_exportAll_keys=X* edit_shape_select=\u9078\u64C7 edit_shape_addPoint=\u65B0\u589E\u9EDE edit_shape_deletePoint=\u522A\u9664 edit_shape_drawRect=\u7E6A\u88FD\u77E9\u5F62 edit_shape_drawEllipse=\u7E6A\u88FD\u6A62\u5713\u5F62 edit_shape_drawPoly=\u7E6A\u88FD\u591A\u908A\u5F62 edit_shape_toLine=\u8F49\u63DB\u6210\u7DDA\u6BB5 edit_shape_toBezier=\u8F49\u63DB\u70BA\u8C9D\u585E\u723E\u66F2\u7DDA edit_shape_toQuad=\u8F49\u63DB\u70BA\u4E8C\u6B21\u66F2\u7DDA edit_shape_rLeft=\u5411\u5DE6\u65CB\u8F49 edit_shape_rRight=\u5411\u53F3\u65CB\u8F49 edit_shape_expand=\u5C55\u958B edit_shape_contract=\u5408\u7D04 edit_shape_zoomIn=\u653E\u5927 edit_shape_zoomOut=\u7E2E\u5C0F edit_shape_aproxPoints=\u52A0\u5165\u6700\u8FD1\u9EDE edit_shape_showPoints=\u986F\u793A\u9EDE edit_shape_showPoints_tooltip=\u986F\u793A/\u5F71\u85CF\u9EDE edit_shape_gridSize=\u7DB2\u683C\u5927\u5C0F: edit_shape_hideGrid=\u986F\u793A/\u5F71\u85CF\u7DB2\u683C edit_shape_magnetRadius=\u78C1\u6027\u534A\u5F91 edit_shape_elements=\u5B9A\u7FA9\u7269\u4EF6 edit_shape_elemName=\u88AB\u9078\u53D6\u7684\u7269\u4EF6\u540D\u7A31 edit_shape_magnetRadius_tooltip=\u53EF\u7528\u7684\u6D3B\u52D5\u78C1\u6027\u534A\u5F91 edit_shape_gridSize_tooltip=\u7DB2\u683C\u5927\u5C0F edit_mc_activity=\u6D3B\u52D5\uFF1A edit_mc_sequence=\u7247\u6BB5 edit_mc_url=\u7DB2\u5740\uFF1A edit_mc_project=\u5C08\u6848\uFF1A edit_mc_activity_selection=\u9078\u64C7\u4E00\u500B\u6D3B\u52D5 edit_mc_sequence_selection=\u9078\u64C7\u7247\u6BB5 edit_mc_err_nullContent=\u4E0D\u7B26\u5408\u7684\u6587\u4EF6 edit_act_arrowColor=\u7BAD\u865F\u984F\u8272: edit_act_arrowColor_tooltip=\u7DE8\u8F2F\u5668\u7528\u65BC\u7E6A\u88FD\u7BAD\u982D\uFF08\u4E0D\u5B8C\u5168\uFF0C\u56E0\u70BA\u4F7F\u7528XOR\u4F4D\u63A9\u78BC\uFF09\u984F\u8272 edit_act_editActivity=\u7DE8\u8F2F\u2026 edit_act_editActivity_tooltip=\u7DE8\u8F2F\u6240\u9078\u7684\u6D3B\u52D5 action_saveFileAs_caption=\u5132\u5B58\u81F3... action_saveFileAs_keys=AA action_saveFileAs_tooltip=\u5C07\u76EE\u524D\u7684\u5C08\u6848\u4EE5\u53E6\u4E00\u500B\u540D\u5B57\u5132\u5B58 edit_act_behavior_block=\u52D5\u4F5C edit_act_behavior=\u52D5\u4F5C edit_act_behavior_drag=\u62D6\u66F3\u7269\u4EF6 edit_act_behavior_drag_tooltip=\u7528\u9023\u7D50\u7DDA\u62D6\u66F3\u7269\u4EF6 edit_act_behavior_order=\u78BA\u8A8D\u6B63\u5728\u89E3\u6C7A\u7684\u6B21\u5E8F edit_act_behavior_order_tooltip=\u55AE\u5143\u5FC5\u9808\u88AB\u6B21\u5E8F\u6027\u8655\u7406 edit_act_scramble=\u722D\u596A action_importActivities_caption=\u6B63\u5728\u532F\u5165\u6D3B\u52D5... action_importActivities_keys=I* action_importActivities_tooltip=\u5F9E\u53E6\u4E00\u500B\u5C08\u6848\u532F\u5165\u6D3B\u52D5 import_warn_samefile=\u9078\u53D6\u7684\u6A94\u6848\u9700\u8207\u76EE\u524D\u7684\u5C08\u6848\u76F8\u7B26\u3002\u6D3B\u52D5\u53EA\u80FD\u5728\u4E0D\u540C\u7684\u5C08\u6848\u4E2D\u532F\u5165\u3002\u8ACB\u9078\u53D6\u53E6\u4E00\u500B\u5C08\u6848\u6A94\u6848\u3002 import_selectActivities=\u9078\u53D6\u4E00\u500B\u6216\u591A\u500B\u6D3B\u52D5\u532F\u5165\u5230\u76EE\u524D\u7684\u5C08\u6848: import_importing=\u6B63\u5728\u532F\u5165... import_checkdep=\u78BA\u8A8D\u7368\u7ACB\u6027 import_impmedia=\u532F\u5165\u5A92\u9AD4 import_impact=\u532F\u5165\u6D3B\u52D5 import_selectProject=\u9078\u64C7JClic\u5C08\u6848\u4E2D\u5C07\u532F\u5165\u7684\u6D3B\u52D5 edit_tagRep_tags=\u6A19\u8A8C\u8A18\u865F edit_tagRep_tagStart=\u958B\u59CB\u6A19\u8A18 edit_tagRep_tagStart_tooltip=\u6A19\u8A18\u5728\u958B\u59CB\u4F7F\u7528\u7684\u6A19\u7C64 edit_tagRep_tagEnd=\u7D50\u675F\u6A19\u8A18 edit_tagRep_tagEnd_tooltip=\u6A19\u8A18\u7528\u65BC\u5728\u6A19\u7C64\u7D50\u5C3E edit_tagRep_file=\u6A94\u6848 edit_tagRep_fileName=\u6A94\u6848\u6216\u7DB2\u5740\uFF1A edit_tagRep_fileName_tooltip=\u540D\u7A31\u6216\u6587\u4EF6\u7684URL\u5305\u542B\u7684\u503C\u5C07\u53D6\u4EE3\u6A19\u7C64 edit_tagRep_charset=\u5B57\u7B26\u96C6\\\uFF1A edit_tagRep_charset_tooltip=\u5728\u6587\u4EF6\u4E2D\u4F7F\u7528\u7684\u5B57\u7B26\u7DE8\u78BC edit_tagRep_browseFile=\u700F\u89BD... edit_tagRep_browseFile_tooltip=\u700F\u89BD\u6A94\u6848\u7CFB\u7D71 edit_tagRep_title=\u53D6\u4EE3\u9019\u884C edit_text_act_clearStylesBtn=\u6E05\u9664\u6587\u672C\u6A23\u5F0F... edit_text_act_clearStylesPrompt=\u8B66\u544A\uFF1A\u9019\u500B\u52D5\u4F5C\u5C07\u6E05\u9664\u6587\u4EF6\u88E1\u7684\u7279\u6B8A\u5B57\u5143\uFF0C\u4E26\u6539\u70BA\u4E00\u822C\u5B57\u5143\u3002\u78BA\u5B9A\u8981\u57F7\u884C\u55CE\uFF1F img_max_size=\u5716\u7247\u7684\u6700\u5927\u5C3A\u5BF8 img_max_width_tooltip=\u63D2\u5165\u5A92\u9AD4\u5EAB\u7684\u5716\u7247\u6700\u5927\u5BEC\u5EA6 img_max_height_tooltip=\u63D2\u5165\u5A92\u9AD4\u5EAB\u7684\u5716\u7247\u6700\u5927\u9AD8\u5EA6 img_resize_prompt=\u5716\u50CF\u201C\uFF05S\u201D\u6709\uFF05s\u7684\u50CF\u7D20\u5927\u5C0F\u3002\u9019\u8D85\u904E\u4E86\u5141\u8A31\u7684\u6700\u5927\u503C\uFF08\uFF05S\uFF09JClic\u4F5C\u8005\u3002\u4F60\u60F3\u6539\u8B8A\u5B83\u7684\u5927\u5C0F\u55CE\uFF1F src/author/edu/xtec/resources/textures/000077500000000000000000000000001335566474600206075ustar00rootroot00000000000000src/author/edu/xtec/resources/textures/diagonal.gif000066400000000000000000000000671335566474600230570ustar00rootroot00000000000000GIF89a!,D.bیZ(;src/author/edu/xtec/util/000077500000000000000000000000001335566474600156675ustar00rootroot00000000000000src/author/edu/xtec/util/JDomTreeObject.java000066400000000000000000000072051335566474600213360ustar00rootroot00000000000000/* * File : JDomTreeObject.java * Created : 05-dec-2002 11:19 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.util.Iterator; import javax.swing.table.AbstractTableModel; import javax.swing.tree.DefaultMutableTreeNode; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class JDomTreeObject extends AbstractTableModel { org.jdom.Element element; Options options; JDomTreeObject(org.jdom.Element element, Options options) { super(); this.element = element; this.options = options; } @Override public String getColumnName(int column) { return options.getMsg(column == 0 ? "XML_ATTRIBUTE" : "XML_VALUE"); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return (columnIndex != 0); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (aValue == null) return; if (rowIndex == 0) { if (element.getChildren().isEmpty()) element.setText(aValue.toString()); else options.getMessages().showAlert(options.getMainComponent(), "XML_NOT_EDITABLE"); } else { org.jdom.Attribute atr = (org.jdom.Attribute) element.getAttributes().get(rowIndex - 1); atr.setValue(aValue.toString()); } } public int getRowCount() { return 1 + element.getAttributes().size(); } public int getColumnCount() { return 2; } public Object getValueAt(int row, int column) { if (row == 0) { return (column == 0 ? options.getMsg("XML_TEXT") : element.getText()); } org.jdom.Attribute atr = (org.jdom.Attribute) element.getAttributes().get(row - 1); return (column == 0 ? atr.getName() : atr.getValue()); } @Override public String toString() { org.jdom.Attribute atr; StringBuilder result = new StringBuilder(element.getName()); if ((atr = element.getAttribute(JDomUtility.NAME)) != null) result.append(" ").append(atr.getValue()); if ((atr = element.getAttribute(JDomUtility.ID)) != null) result.append(" - ").append(atr.getValue()); if ((atr = element.getAttribute(JDomUtility.TYPE)) != null) result.append(" - ").append(atr.getValue()); return result.substring(0); } public static DefaultMutableTreeNode processNode(DefaultMutableTreeNode parent, org.jdom.Element element, Options options) { JDomTreeObject te = new JDomTreeObject(element, options); DefaultMutableTreeNode node = new DefaultMutableTreeNode(te); Iterator iter = element.getChildren().iterator(); while (iter.hasNext()) { processNode(node, (org.jdom.Element) iter.next(), options); } if (parent != null) parent.add(node); return node; } /** * Getter for property element. * * @return Value of property element. */ public org.jdom.Element getElement() { return element; } } src/author/edu/xtec/util/JDomTreePanel.form000066400000000000000000000355111335566474600212120ustar00rootroot00000000000000

src/author/edu/xtec/util/JDomTreePanel.java000066400000000000000000000401741335566474600211710ustar00rootroot00000000000000/* * File : JDomTreePanel.java * Created : 05-dec-2002 10:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import java.awt.Component; import java.awt.Dimension; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableModel; import javax.swing.tree.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class JDomTreePanel extends javax.swing.JPanel { ResourceBridge rb; TreeSelectionListener treeSelectionListener; ListSelectionListener listSelectionListener; JDomTreeObject current; DefaultMutableTreeNode currentNode; FileSystem fs; String fileName; org.jdom.Element element; private DefaultMutableTreeNode clip; private boolean cut; /** Creates new form ProjectTreePanel */ public JDomTreePanel(org.jdom.Element element, ResourceBridge rb, FileSystem fs, String fileName) { this.rb = rb; this.fs = fs; this.fileName = fileName; this.element = element; initComponents(); initMembers(); tree.setModel(new DefaultTreeModel(JDomTreeObject.processNode(null, element, rb.getOptions()))); tree.addTreeSelectionListener(treeSelectionListener); table.getSelectionModel().addListSelectionListener(listSelectionListener); } private void initMembers() { treeSelectionListener = new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { checkEnabled(); } }; listSelectionListener = new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { delAttributeBtn.setEnabled(e.getFirstIndex() >= 0); } } }; } private void checkEnabled() { current = null; currentNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (currentNode == null) { newElementBtn.setEnabled(false); delElementBtn.setEnabled(false); copyBtn.setEnabled(false); cutBtn.setEnabled(false); pasteBtn.setEnabled(false); } else { current = (JDomTreeObject) currentNode.getUserObject(); setTableModel(); String s = current.getElement().getText(); boolean empty = (s == null || s.length() == 0); boolean root = current.getElement().isRootElement(); newElementBtn.setEnabled(empty); delElementBtn.setEnabled(!root); copyBtn.setEnabled(!root); cutBtn.setEnabled(!root); pasteBtn.setEnabled(clip != null && empty && clip != currentNode && !clip.isNodeChild(currentNode)); } } private void setTableModel() { AbstractTableModel model = current; if (model == null) model = new DefaultTableModel(); table.setModel(model); model.fireTableStructureChanged(); newAttributeBtn.setEnabled(current != null); delAttributeBtn.setEnabled(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JPanel buttonsPanel; javax.swing.JSplitPane split; javax.swing.JPanel tablePanel; javax.swing.JScrollPane tableScroll; javax.swing.JPanel treeButtonsPanel; javax.swing.JPanel treePanel; javax.swing.JScrollPane treeScroll; split = new javax.swing.JSplitPane(); treePanel = new javax.swing.JPanel(); treeScroll = new javax.swing.JScrollPane(); tree = new javax.swing.JTree(); treeButtonsPanel = new javax.swing.JPanel(); newElementBtn = new javax.swing.JButton(); delElementBtn = new javax.swing.JButton(); copyBtn = new javax.swing.JButton(); pasteBtn = new javax.swing.JButton(); cutBtn = new javax.swing.JButton(); saveBtn = new javax.swing.JButton(); tablePanel = new javax.swing.JPanel(); tableScroll = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); buttonsPanel = new javax.swing.JPanel(); newAttributeBtn = new javax.swing.JButton(); delAttributeBtn = new javax.swing.JButton(); setLayout(new java.awt.BorderLayout()); treePanel.setLayout(new java.awt.BorderLayout()); treeScroll.setMinimumSize(new java.awt.Dimension(150, 22)); treeScroll.setViewportView(tree); treePanel.add(treeScroll, java.awt.BorderLayout.CENTER); newElementBtn .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/new_element.gif"))); newElementBtn.setToolTipText(rb.getMsg("XML_NEW_ELEMENT")); newElementBtn.setEnabled(false); newElementBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newElementBtnActionPerformed(evt); } }); treeButtonsPanel.add(newElementBtn); delElementBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/delete.gif"))); delElementBtn.setToolTipText(rb.getMsg("XML_DEL_ELEMENT")); delElementBtn.setEnabled(false); delElementBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { delElementBtnActionPerformed(evt); } }); treeButtonsPanel.add(delElementBtn); copyBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/copy.gif"))); copyBtn.setToolTipText(rb.getMsg("COPY")); copyBtn.setEnabled(false); copyBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { copyBtnActionPerformed(evt); } }); treeButtonsPanel.add(copyBtn); pasteBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/paste.gif"))); pasteBtn.setToolTipText(rb.getMsg("PASTE")); pasteBtn.setEnabled(false); pasteBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { pasteBtnActionPerformed(evt); } }); treeButtonsPanel.add(pasteBtn); cutBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/cut.gif"))); cutBtn.setToolTipText(rb.getMsg("CUT")); cutBtn.setEnabled(false); cutBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cutBtnActionPerformed(evt); } }); treeButtonsPanel.add(cutBtn); saveBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/file_save.gif"))); saveBtn.setToolTipText(rb.getMsg("FILE_SAVE")); saveBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveBtnActionPerformed(evt); } }); treeButtonsPanel.add(saveBtn); treePanel.add(treeButtonsPanel, java.awt.BorderLayout.SOUTH); split.setLeftComponent(treePanel); tablePanel.setLayout(new java.awt.BorderLayout()); table.setModel(new javax.swing.table.DefaultTableModel(new Object[][] {}, new String[] {})); tableScroll.setViewportView(table); tablePanel.add(tableScroll, java.awt.BorderLayout.CENTER); newAttributeBtn .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/new_attribute.gif"))); newAttributeBtn.setToolTipText(rb.getMsg("XML_NEW_ATTRIBUTE")); newAttributeBtn.setEnabled(false); newAttributeBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newAttributeBtnActionPerformed(evt); } }); buttonsPanel.add(newAttributeBtn); delAttributeBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/delete.gif"))); delAttributeBtn.setToolTipText(rb.getMsg("XML_DEL_ATTRIBUTE")); delAttributeBtn.setEnabled(false); delAttributeBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { delAttributeBtnActionPerformed(evt); } }); buttonsPanel.add(delAttributeBtn); tablePanel.add(buttonsPanel, java.awt.BorderLayout.SOUTH); split.setRightComponent(tablePanel); add(split, java.awt.BorderLayout.CENTER); } // GEN-END:initComponents private void cutBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_cutBtnActionPerformed if (currentNode != null && current != null && !current.getElement().isRootElement()) { clip = currentNode; cut = true; checkEnabled(); } } // GEN-LAST:event_cutBtnActionPerformed private void pasteBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_pasteBtnActionPerformed if (currentNode != null && current != null && clip != null && clip != currentNode && !clip.isNodeChild(currentNode)) { org.jdom.Element clipElement = ((JDomTreeObject) clip.getUserObject()).getElement(); org.jdom.Element el = (org.jdom.Element) clipElement.clone(); current.getElement().addContent(el); TreeNode node = JDomTreeObject.processNode(currentNode, el, rb.getOptions()); ((DefaultTreeModel) tree.getModel()).nodeStructureChanged(currentNode); if (cut) { clipElement.detach(); ((DefaultTreeModel) tree.getModel()).removeNodeFromParent(clip); clip = null; } setTableModel(); checkEnabled(); } } // GEN-LAST:event_pasteBtnActionPerformed private void copyBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_copyBtnActionPerformed if (currentNode != null && current != null && !current.getElement().isRootElement()) { clip = currentNode; cut = false; checkEnabled(); } } // GEN-LAST:event_copyBtnActionPerformed private void saveBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_saveBtnActionPerformed if (fs == null) fs = new FileSystem(rb); int[] filters = { Utils.JCLIC_FF }; String result = fs.chooseFile(fileName + ".jclic", true, filters, rb.getOptions(), null, this, false); if (result != null) { String fullFileName = fs.getFullFileNamePath(result); try { FileOutputStream fos = fs.createSecureFileOutputStream(fullFileName, false); JDomUtility.saveDocument(fos, new org.jdom.Document(element)); fos.close(); // addRecentFile(fileName); } catch (Exception ex) { rb.getOptions().getMessages().showErrorWarning(this, "FILE_ERR_SAVING", fullFileName, ex, null); } } } // GEN-LAST:event_saveBtnActionPerformed private void delElementBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_delElementBtnActionPerformed if (currentNode != null && current != null && !current.getElement().isRootElement()) { if (clip == currentNode) clip = null; current.getElement().detach(); ((DefaultTreeModel) tree.getModel()).removeNodeFromParent(currentNode); setTableModel(); } } // GEN-LAST:event_delElementBtnActionPerformed private void newElementBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_newElementBtnActionPerformed if (currentNode != null && current != null) { String s = current.getElement().getText(); if (s == null || s.length() == 0) { JTextField[] fields = new JTextField[] { new JTextField() }; Dimension dim = new Dimension(100, 20); for (int i = 0; i < fields.length; i++) fields[i].setPreferredSize(dim); String[] promptKeys = new String[] { "XML_NAME" }; if (rb.getOptions().getMessages().showInputDlg(JDomTreePanel.this, null, promptKeys, fields, "XML_NEW_ELEMENT")) { String elementName = fields[0].getText(); if (elementName != null && elementName.length() > 0) { org.jdom.Element el = new org.jdom.Element(elementName); current.getElement().addContent(el); JDomTreeObject te = new JDomTreeObject(el, rb.getOptions()); DefaultMutableTreeNode node = new DefaultMutableTreeNode(te); ((DefaultTreeModel) tree.getModel()).insertNodeInto(node, currentNode, currentNode.getChildCount()); setTableModel(); } } } } } // GEN-LAST:event_newElementBtnActionPerformed private void delAttributeBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_delAttributeBtnActionPerformed if (current != null) { int r = table.getSelectedRow(); if (r >= 0) { if (r == 0) { List toRemove = new ArrayList(); List ls = current.getElement().getContent(); for (Object o : ls) { if (o instanceof org.jdom.Text) toRemove.add((org.jdom.Text) o); } ls.removeAll(toRemove); } else { String s = (String) current.getValueAt(r, 0); if (s != null) current.getElement().removeAttribute(s); } setTableModel(); } } } // GEN-LAST:event_delAttributeBtnActionPerformed private void newAttributeBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_newAttributeBtnActionPerformed if (current != null) { JTextField[] fields = new JTextField[] { new JTextField(), new JTextField() }; Dimension dim = new Dimension(100, 20); for (int i = 0; i < fields.length; i++) fields[i].setPreferredSize(dim); String[] promptKeys = new String[] { "XML_ATTRIBUTE", "XML_VALUE" }; if (rb.getOptions().getMessages().showInputDlg(JDomTreePanel.this, null, promptKeys, fields, "XML_NEW_ATTRIBUTE")) { String atrName = fields[0].getText(); String atrValue = fields[1].getText(); if (atrName != null && atrValue != null && atrName.length() > 0) { current.getElement().setAttribute(atrName, atrValue); setTableModel(); } } } } // GEN-LAST:event_newAttributeBtnActionPerformed public static org.jdom.Element editElement(Component parent, org.jdom.Element element, ResourceBridge rb, FileSystem fs, String fileName, String titleKey) { org.jdom.Element clon = (org.jdom.Element) element.clone(); boolean b = rb.getOptions().getMessages().showInputDlg(parent, new JDomTreePanel(clon, rb, fs, fileName), titleKey); return b ? clon : null; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton copyBtn; private javax.swing.JButton cutBtn; private javax.swing.JButton delAttributeBtn; private javax.swing.JButton delElementBtn; private javax.swing.JButton newAttributeBtn; private javax.swing.JButton newElementBtn; private javax.swing.JButton pasteBtn; private javax.swing.JButton saveBtn; private javax.swing.JTable table; private javax.swing.JTree tree; // End of variables declaration//GEN-END:variables } src/author/edu/xtec/util/Resizer.java000066400000000000000000000107651335566474600201660ustar00rootroot00000000000000/* * File : Resizer.java * Created : 08-mai-2003 14:42 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import edu.xtec.jclic.Constants; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.*; import javax.swing.JComponent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class Resizer implements MouseListener, MouseMotionListener { JComponent jc; Rectangle r; Cursor defaultCursor; boolean doGetBounds; boolean dragging; boolean dragCursorX, dragCursorY; ResizerListener rl; Dimension minSize; Dimension maxSize; boolean editable; boolean enabled; public static final int MARGIN = 5; /** Creates a new instance of Resizer */ public Resizer(JComponent jc, Rectangle r, boolean editable, ResizerListener rl) { this.jc = jc; setRect(r); this.editable = editable; if (editable) defaultCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); this.rl = rl; jc.addMouseListener(this); jc.addMouseMotionListener(this); minSize = new Dimension(Constants.MIN_CELL_SIZE, Constants.MIN_CELL_SIZE); maxSize = new Dimension(jc.getPreferredSize()); setEnabled(true); } public void setEnabled(boolean enabled) { this.enabled = enabled; jc.setCursor(defaultCursor); } public boolean getEnabled() { return enabled; } public void setMinSize(Dimension d) { minSize = d; } public void setMaxSize(Dimension d) { maxSize = d; } public void setRect(Rectangle r) { this.r = r; doGetBounds = (r == null); if (doGetBounds) this.r = jc.getBounds(); } public void mouseClicked(MouseEvent mouseEvent) { if (enabled && editable && rl != null && r.contains(mouseEvent.getPoint())) { rl.editObject(r, jc, mouseEvent.getPoint()); } } public void mouseDragged(MouseEvent mouseEvent) { if (enabled && dragging) resizeByDrag(mouseEvent.getPoint()); } public void mouseEntered(MouseEvent mouseEvent) { } public void mouseExited(MouseEvent mouseEvent) { } public void mouseMoved(MouseEvent mouseEvent) { if (!dragging && enabled) { Point p = mouseEvent.getPoint(); Cursor newCursor = defaultCursor; if (doGetBounds) r = jc.getBounds(); dragCursorX = Math.abs(p.x - r.x - r.width) < MARGIN && p.y >= r.y && p.y < (r.y + r.height + MARGIN); dragCursorY = Math.abs(p.y - r.y - r.height) < MARGIN && p.x >= r.x && p.x < (r.x + r.width + MARGIN); if (dragCursorX && dragCursorY) newCursor = Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR); else if (dragCursorY) newCursor = Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR); else if (dragCursorX) newCursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR); jc.setCursor(newCursor); } else if (dragging) mouseDragged(mouseEvent); } public void mousePressed(MouseEvent mouseEvent) { if (enabled && (dragCursorX || dragCursorY)) { dragging = true; resizeByDrag(mouseEvent.getPoint()); } } public void mouseReleased(MouseEvent mouseEvent) { if (enabled && dragging) { resizeByDrag(mouseEvent.getPoint()); dragging = false; } } private void resizeByDrag(Point p) { int w = r.width; int h = r.height; if (dragCursorX) w = Math.min(maxSize.width, Math.max(minSize.width, p.x - r.x)); if (dragCursorY) h = Math.min(maxSize.height, Math.max(minSize.height, p.y - r.y)); r = new Rectangle(r.x, r.y, w, h); if (rl != null) rl.resizeObjectTo(r, jc); } public JComponent getComponent() { return jc; } public interface ResizerListener { public void resizeObjectTo(Rectangle r, JComponent jc); public void editObject(Rectangle r, JComponent jc, Point pt); } } src/author/edu/xtec/util/ResizerPanel.java000066400000000000000000000036341335566474600211430ustar00rootroot00000000000000/* * File : ResizerPanel.java * Created : 05-jun-2003 10:15 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.TexturePaint; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JPanel; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class ResizerPanel extends JPanel { public static final String DEFAULT_TEXTURE = "textures/diagonal.gif"; TexturePaint tp; public ResizerPanel() { this(DEFAULT_TEXTURE); } public ResizerPanel(String texture) { super(); ImageIcon img = edu.xtec.util.ResourceManager.getImageIcon(texture); int w = img.getIconWidth(); int h = img.getIconHeight(); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D big = bi.createGraphics(); big.setBackground(getBackground()); big.drawImage(img.getImage(), 0, 0, getBackground(), null); Rectangle r = new Rectangle(0, 0, w, h); tp = new TexturePaint(bi, r); } @Override protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setPaint(tp); g2.fill(g2.getClipBounds()); } } src/core/000077500000000000000000000000001335566474600126205ustar00rootroot00000000000000src/core/JClicApplet.html000066400000000000000000000015361335566474600156450ustar00rootroot00000000000000 Applet HTML Page


Applet HTML Page


Generated by NetBeans IDE src/core/JClicApplet.java000066400000000000000000000257601335566474600156270ustar00rootroot00000000000000 /* * File : JClicApplet.java * Created : 01-feb-2001 13:39 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.Player; import edu.xtec.jclic.PlayerSettings; import edu.xtec.jclic.RunnableComponent; import edu.xtec.jclic.media.CheckMediaSystem; import edu.xtec.jclic.project.ProjectInstallerDlg; import edu.xtec.util.BasicResourceBridge; import edu.xtec.util.Check; import edu.xtec.util.LFUtil; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import java.net.URL; import javax.swing.RootPaneContainer; /** * Default JClic applet. Shows a splash screen at startup and loads a * {@link Player} in a separate process. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.10.02 */ public class JClicApplet extends javax.swing.JApplet implements edu.xtec.jclic.Constants { private Options options; private RunnableComponent rc; private String activityPack, sequence; private boolean initiated; private boolean trace; private javax.swing.JLabel splashLabel; private boolean isInstaller; // useful constants private static final String HTTP = "http:", HTTPS = "https", FILE = "file:"; private static final String STRING = "string", BOOL = "boolean", URL = "url"; // parameters private static final String ACTIVITY_PACK = "activityPack"; private static final String SEQUENCE = "sequence"; private static final int NUM_PRIVATE_PARAMS = 2; private static final String[][] pInfo = { { ACTIVITY_PACK, STRING, "absolute or relative URL of the JClic project to load" }, { SEQUENCE, STRING, "optional project's starting sequence name" }, { Messages.LANGUAGE, STRING, "two-char language code" }, { Messages.COUNTRY, STRING, "two-char country code" }, { Messages.VARIANT, STRING, "locale variant code" }, { SKIN, STRING, "skin to be used" }, { COOKIE, STRING, "optional session cookie value. currently not used" }, { REPORTER_CLASS, STRING, "reporter class name" }, { REPORTER_PARAMS, STRING, "reporter parameters" }, { EXIT_URL, URL, "URL where to redirect navigation at end" }, { INFO_URL_FRAME, STRING, "optional frame where to display info documents. If unespecified, _BLANK will be used" }, { SYSTEM_SOUNDS, BOOL, "to play or not system sounds" }, { COMPRESS_IMAGES, BOOL, "to compress or not images in cells" }, { LFUtil.LOOK_AND_FEEL, STRING, "look & feel to use" }, { AUDIO_ENABLED, BOOL, "to have audio enabled or not" }, { MEDIA_SYSTEM, STRING, "preferred multimedia system: 'JMF' for Java Media Framework or 'QT' for QuickTime" }, { TRACE, BOOL, "show debug messages in console" }, { MYURL, STRING, "URL of the document containing the applet, used as a base for relative paths" } }; /** Creates new JClicApplet */ public JClicApplet() { super(); trace = false; rc = null; initiated = false; activityPack = null; sequence = null; options = new Options(this); splashLabel = new javax.swing.JLabel(" ", ResourceManager.getImageIcon("icons/logo_applet.png"), javax.swing.SwingConstants.CENTER); splashLabel.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); splashLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); splashLabel.setBackground(BG_COLOR); splashLabel.setOpaque(true); getContentPane().add(splashLabel, java.awt.BorderLayout.CENTER); } @Override public void init() { // init only once by applet instance if (initiated) { return; } initiated = true; // get "trace" flag trace = TRUE.equals(getParameter(TRACE)); final StringBuilder sb = new StringBuilder(); final RootPaneContainer rpc = this; edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { @Override public Object construct() { // get parameters for (int i = NUM_PRIVATE_PARAMS; i < pInfo.length; i++) { options.put(pInfo[i][0], getParameter(pInfo[i][0])); if (trace) { System.out.println(">>> param " + pInfo[i][0] + " is " + getParameter(pInfo[i][0])); } } Messages messages; try { messages = edu.xtec.util.PersistentSettings.getMessages(options, DEFAULT_BUNDLE); } catch (Exception ex) { System.err.println("Unable to get default user messages language!\n" + ex); messages = Messages.getMessages(options, DEFAULT_BUNDLE); } messages.addBundle(COMMON_SETTINGS); if (splashLabel != null) { splashLabel.setText(messages.get("LOADING")); } if (!Check.checkSignature(options, true)) { return null; } CheckMediaSystem.check(options, false); // process JClic project parameters activityPack = getParameter(ACTIVITY_PACK); sequence = getParameter(SEQUENCE); if (activityPack != null) { if (activityPack.indexOf("http://") < 0 && activityPack.indexOf("https://") < 0 && activityPack.indexOf(":") < 1 && activityPack.indexOf("\\\\") < 0) { String base = ""; URL baseURL = getDocumentBase(); if (baseURL != null) base = baseURL.toString(); else if (options.getString(MYURL) != null) base = options.getString(MYURL); if (trace) { System.out.println(">>> original base is: " + base); } int i = base.indexOf("file:/"); if (i >= 0) { base = base.substring(i + 6); if (trace) { System.out.println(">>> protocol is 'file', so base is: " + base); } // Mozilla in Linux if (!options.getBoolean(Options.WIN) && !base.startsWith(java.io.File.pathSeparator)) { base = "/" + base; if (trace) { System.out.println(">>> non-Windows and not starts with '/', so base is: " + base); } } } // Opera if (base.startsWith("/localhost/")) { base = base.substring(11); } // Opera if (base.endsWith(".htm") || base.endsWith(".html")) { i = base.lastIndexOf('/'); if (i < 0) { i = base.lastIndexOf('\\'); } if (i > 0) { base = base.substring(0, i + 1); } } options.put(URL_BASE, base); if (trace) { System.out.println(">>> corrected base is: " + base); } activityPack = base + activityPack; if (trace) { System.out.println(">>> project path is: " + activityPack); } String s = options.getString(SKIN); if (s != null && !s.startsWith("@") && !s.startsWith(HTTP) && !s.startsWith(HTTPS) && !s.startsWith(FILE)) { options.put(SKIN, base + s); } s = options.getString(EXIT_URL); if (s != null && !s.startsWith(HTTP) && !s.startsWith(HTTPS) && !s.startsWith(FILE)) { options.put(EXIT_URL, base + s); } } // Check if activityPack is an installer if (activityPack.endsWith(".jclic.inst")) { isInstaller = true; messages.addBundle(edu.xtec.jclic.ExtendedPlayer.MESSAGES_BUNDLE); } } // build player try { if (isInstaller) { String installer = activityPack; activityPack = null; BasicResourceBridge rb = new BasicResourceBridge(options); PlayerSettings settings = PlayerSettings.loadPlayerSettings(rb); if (settings.promptPassword(null, null)) { settings.checkLibrary(); ProjectInstallerDlg pi = ProjectInstallerDlg.getProjectInstallerDlg(null, settings.libraryManager, installer); if (pi != null) { pi.setVisible(true); if (!pi.cancel && pi.launchNow && pi.pathToMainProject != null) { activityPack = pi.pathToMainProject; } } } } if (activityPack != null) { rc = new Player(options); } } catch (Exception ex) { sb.append("ERROR: ").append(ex); } return rc; } @Override public void finished() { if (getValue() == null) { if (isInstaller && options.getString(EXIT_URL) != null) { try { String url = options.getString(EXIT_URL); if (url.indexOf(':') < 0) // no protocol, assume "file://" { url = "file://" + url; } getAppletContext().showDocument(new URL(url)); } catch (Exception ex) { sb.append("ERROR: ").append(ex); } } // no player build! if (splashLabel != null) { String s = sb.substring(0); splashLabel.setText(s); System.err.println(s); } } else { // remove label and place player getContentPane().removeAll(); splashLabel = null; rc.addTo(rpc, java.awt.BorderLayout.CENTER); getRootPane().revalidate(); // load project javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { rc.start(activityPack, sequence); } }); } } }; if (trace) { System.out.println(">>> initializing..."); } // launch swingWorker sw.start(); } @Override public void start() { if (trace) { System.out.println(">>> applet started"); } } @Override public void stop() { if (rc != null) { rc.stop(); } if (trace) { System.out.println(">>> applet stopped"); } } @Override public void destroy() { if (rc != null) { if (trace) { System.out.println(">>> destroying applet..."); } getContentPane().removeAll(); rc.end(); rc = null; initiated = false; } if (trace) { System.out.println(">>> applet destroyed"); } } @Override public String getAppletInfo() { return "JClic applet"; } @Override public String[][] getParameterInfo() { return pInfo; } } src/core/JClicInstaller.java000066400000000000000000000055041335566474600163310ustar00rootroot00000000000000 /* * File : JClicInstaller.java * Created : 01-dec-2000 17:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.Constants; import edu.xtec.jclic.ExtendedPlayer; import edu.xtec.jclic.PlayerSettings; import edu.xtec.jclic.SingleInstanceJFrame; import edu.xtec.jclic.project.ProjectInstallerDlg; import edu.xtec.util.BasicResourceBridge; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.PersistentSettings; /* * JClicInstaller.java * * Created on 20 / febrer / 2004, 16:21 */ /** @author Francesc Busquets (fbusquets@xtec.cat) */ public abstract class JClicInstaller { /** @param args the command line arguments */ public static void main(String[] args) { boolean exit = true; try { Options options = new Options((java.awt.Component) null); Messages messages = PersistentSettings.getMessages(options, Constants.DEFAULT_BUNDLE); messages.addBundle(Constants.COMMON_SETTINGS); messages.addBundle(ExtendedPlayer.MESSAGES_BUNDLE); String installer = SingleInstanceJFrame.loadArgs(args, options); if (installer == null) { System.err.println("Error: no installer file specified!"); } else if (!installer.endsWith(".jclic.inst")) { System.err.println("Error: " + installer + " isn't a JClic package install script.\nJClic package install scripts end always with .jclic.inst"); } else { BasicResourceBridge rb = new BasicResourceBridge(options); PlayerSettings settings = PlayerSettings.loadPlayerSettings(rb); if (settings.promptPassword(null, null)) { settings.checkLibrary(); ProjectInstallerDlg pi = ProjectInstallerDlg.getProjectInstallerDlg(null, settings.libraryManager, installer); if (pi != null) { pi.setVisible(true); if (!pi.cancel && pi.launchNow && pi.pathToMainProject != null) { JClicPlayer.main(new String[] { pi.pathToMainProject }); exit = false; } } } } } catch (Exception ex) { System.err.println("Error installing:\n" + ex); } if (exit) { System.exit(0); } } } src/core/JClicPlayer.java000066400000000000000000000025261335566474600156310ustar00rootroot00000000000000 /* * File : JClicPlayer.java * Created : 01-dec-2000 12:34 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.SingleInstanceJFrame; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public abstract class JClicPlayer { public static final int INSTANCE_PORT = 5872; /** @param args the command line arguments */ public static void main(String args[]) { SingleInstanceJFrame jcp = new SingleInstanceJFrame("edu.xtec.jclic.ExtendedPlayer", args, "JClic player", "icons/logo.png", "icons/miniclic.png", INSTANCE_PORT); if (jcp.isArmed()) jcp.setVisible(true); else System.exit(0); } } src/core/edu/000077500000000000000000000000001335566474600133755ustar00rootroot00000000000000src/core/edu/xtec/000077500000000000000000000000001335566474600143405ustar00rootroot00000000000000src/core/edu/xtec/jclic/000077500000000000000000000000001335566474600154245ustar00rootroot00000000000000src/core/edu/xtec/jclic/Activity.java000066400000000000000000001070251335566474600200700ustar00rootroot00000000000000/* * File : Activity.java * Created : 16-aug-2001 1:05 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.automation.AutoContentProvider; import edu.xtec.jclic.bags.MediaBagElement; import edu.xtec.jclic.boxes.ActiveBagContent; import edu.xtec.jclic.boxes.ActiveBoxBag; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.jclic.boxes.BoxConnector; import edu.xtec.jclic.boxes.TextGridContent; import edu.xtec.jclic.clic3.Clic3Activity; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.misc.Gradient; import edu.xtec.jclic.project.JClicProject; import edu.xtec.jclic.skins.Skin; import edu.xtec.util.Domable; import edu.xtec.util.Html; import edu.xtec.util.JDomUtility; import edu.xtec.util.ResourceBridge; import java.awt.AWTEvent; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.lang.reflect.Constructor; import java.util.Iterator; import java.util.Map; import java.util.StringTokenizer; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.border.BevelBorder; /** * Activity is the abstract base class for JClic activities. It * defines also the inner class {@link edu.xtec.jclic.Activity.Panel}, wich is * responsible of the user interaction with the activity content. Activities * should extend both Activity and Activity.Panel * classes in order to become fully operative. JClic stores activities * in memory as {@link org.jdom.Element} objects. So, all non-transient data * must be stored to and retrieved from JDom elements. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public abstract class Activity extends Object implements Constants, Editable, Domable { /** The {@link JClicProject} this activity belongs to. */ protected JClicProject project; // public fields /** The activity name */ public String name = DEFAULT_NAME; /** Code used in reports to filter queries. Default is null. */ public String code; /** Description of the activity. */ public String description; /** Space, measured in pixels, between the activity components. */ public int margin = DEFAULT_MARGIN; /** Background color of the activity panel. */ public Color bgColor = DEFAULT_BG_COLOR; /** Gradient used to draw the background of the activity panel. */ public Gradient bgGradient; /** Whether the bgImage (if any) has to be tiled across the panel background. */ public boolean tiledBgImg; /** * Filename of the image painted in the panel background. Default is * null. */ public String bgImageFile; /** Whether to draw a border around the activity panel. */ public boolean border = true; /** * Whether to place the activity panel at the point specified by * {@link absolutePosition}, or leave it centered in the main window of the * player. */ public boolean absolutePositioned; /** Position of the activity panel into the {@link edu.xtec.jclic.Player}. */ public Point absolutePosition; /** Whether to generate usage reports. */ public boolean includeInReports = true; /** * Whether to send action events to the {@link edu.xtec.jclic.report.Reporter}. */ public boolean reportActions; /** Whether to have a help window or not. */ public boolean helpWindow; /** Whether to show the solution on the help window. */ public boolean showSolution; /** * Message to show in the help window when {@link showSolution} is * false. */ public String helpMsg; /** * Specific set of {@link EventSounds} used in the activity. The default is * null, meaning to use the {@link edu.xtec.jclic.Player} sounds. */ public EventSounds eventSounds = new EventSounds(null); /** * Wheter the activity must be solved in a specific order. The default is * false. */ public boolean useOrder; /** * Wheter the cells of the activity will be dragged across the screen. When * false, a line will be painted to link elements. */ public boolean dragCells; /** * File name of the Skin used by the activity. The default value is null, * meaning that the activity will use the skin specified for the project. */ public String skinFileName; /** * Maximum amount of time (seconds) to solve the activity. The default value is * 0, meaning unlimited time. */ public int maxTime; /** * Whether the time counter should display a countdown when {@link #maxTime} * > 0. */ public boolean countDownTime; /** * Maximum number of actions allowed to solve the activity. The default value is * 0, meaning unlimited actions. */ public int maxActions; /** * Whether the actions counter should display a countdown when * {@link #maxActions} > 0. */ public boolean countDownActions; /** * String with the URL to be displayed when the user clicks on the info * button. Default is null. */ public String infoUrl; /** * System command to be executed when the user clicks the info button. * Default is * null. Applets have this function disabled. */ public String infoCmd; // protected fields /** * String labels corresponding to the four identifiers of JClic messages: * PREVIOUS, MAIN, END and END_ERROR. */ public static final String[] MSG_TYPE = { "previous", "initial", "final", "finalError" }; /** * Identifier of the message displayed before the activity starts. Used only in * certain types of activities. */ public static final int PREVIOUS = 0; /** * Identifier of the main message, displayed as long as the activity is playing. */ public static final int MAIN = 1; /** * Identifier of the message displayed when the user successfully ends the * activity. */ public static final int END = 2; /** * Identifier of the message displayed when the user exceeds the maximum amount * of time or actions allowed. * * @see maxTime * @see maxActions */ public static final int END_ERROR = 3; /** Number of message types. */ public static final int NUM_MSG = 4; protected ActiveBoxContent[] messages = new ActiveBoxContent[NUM_MSG]; protected Dimension windowSize = new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); protected boolean transparentBg; protected Color activityBgColor = DEFAULT_BG_COLOR; protected Gradient activityBgGradient; protected boolean bTimeCounter = true; protected boolean bScoreCounter = true; protected boolean bActionsCounter = true; protected int shuffles = DEFAULT_SHUFFLES; protected AutoContentProvider acp; // fields used only by certain activity types public ActiveBagContent[] abc; public TextGridContent tgc; public int boxGridPos; public boolean[] scramble = new boolean[2]; public boolean invAss; // static fields // layout constants public static final int AB = 0, BA = 1, AUB = 2, BUA = 3; public static final String[] LAYOUT_NAMES = { "AB", "BA", "AUB", "BUA" }; public static final int DEFAULT_WIDTH = 400; public static final int DEFAULT_HEIGHT = 300; public static final int MINIMUM_WIDTH = 40; public static final int MINIMUM_HEIGHT = 40; public static final String DEFAULT_NAME = "---"; public static final int DEFAULT_MARGIN = 8; public static final int DEFAULT_SHUFFLES = 31; public static final int DEFAULT_GRID_ELEMENT_SIZE = 20; public static final Color DEFAULT_BG_COLOR = Color.lightGray; // Constants for actions public static final String ACTION_MATCH = "MATCH", ACTION_PLACE = "PLACE", ACTION_WRITE = "WRITE", ACTION_SELECT = "SELECT", ACTION_HELP = "HELP"; // Constants for XML fields public static final String ELEMENT_NAME = "activity", NAME = "name"; public static final String BASE_CLASS = "edu.xtec.jclic.activities.", BASE_CLASS_TAG = "@"; // Already defined in edu.xtec.jclic.Constants: // public static final String ID="id", SKIN="skin"; public static final String CODE = "code", DESCRIPTION = "description", MESSAGES = "messages", TYPE = "type", SETTINGS = "settings", LAYOUT = "layout", MARGIN = "margin", CONTAINER = "container", BGCOLOR = "bgColor", IMAGE = "image", TILED = "tiled", COUNTERS = "counters", TIME = "time", ACTIONS = "actions", SCORE = "score", WINDOW = "window", TRANSPARENT = "transparent", BORDER = "border", POSITION = "position", X = "x", Y = "y", SIZE = "size", WIDTH = "width", HEIGHT = "height", PRIMARY = "primary", SECONDARY = "secondary", SOLVED_PRIMARY = "solvedPrimary", SOLVED_SECONDARY = "solved_secondary", GRID = "grid", ROW = "row", CLUES = "clues", CLUE = "clue", RANDOM_CHARS = "random_chars", SCRAMBLE = "scramble", TIMES = "times", REPORT = "report", REPORT_ACTIONS = "reportActions", HELP_WINDOW = "helpWindow", HELP_SHOW_SOLUTION = "showSolution", USE_ORDER = "useOrder", DRAG_CELLS = "dragCells", FILE = "file", MAX_TIME = "maxTime", COUNT_DOWN_TIME = "countDownTime", MAX_ACTIONS = "maxActions", COUNT_DOWN_ACTIONS = "countDownActions", INFO_URL = "infoUrl", INFO_CMD = "infoCmd"; public static final String[][] COMPATIBLE_ACTIVITIES = new String[][] { new String[] { "@puzzles.DoublePuzzle", "@puzzles.ExchangePuzzle", "@puzzles.HolePuzzle", "@memory.MemoryGame", "@associations.SimpleAssociation", "@associations.ComplexAssociation", "@panels.Explore", "@panels.Identify", "@panels.InformationScreen", "@text.WrittenAnswer" }, new String[] { "@text.FillInBlanks", "@text.Identify", "@text.Order", "@text.Complete", } }; /** Creates new edu.xtec.jclicActivity */ public Activity(JClicProject project) { this.project = project; } public void initNew() { name = project.getBridge().getMsg("UNNAMED"); } public String getPublicName() { return name; } public JClicProject getProject() { return project; } public Editor getEditor(Editor parent) { Editor result = null; String s = getClass().getName() + "Editor"; try { Class.forName(s); } catch (ClassNotFoundException ex) { s = "edu.xtec.jclic.ActivityEditor"; } return Editor.createEditor(s, this, parent); } public String getShortClassName() { String s = getClass().getName(); if (s.startsWith(BASE_CLASS)) s = BASE_CLASS_TAG + s.substring(BASE_CLASS.length()); return s; } public String[] getSimilarActivityClasses() { String[] result = null; String cl = getShortClassName(); for (String[] classGroup : COMPATIBLE_ACTIVITIES) { for (String s : classGroup) { if (cl.equals(s)) { result = classGroup; break; } } } if (result == null) { result = new String[] { cl }; } return result; } public org.jdom.Element getJDomElement() { org.jdom.Element child, child2, child3; org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(JDomUtility.CLASS, getShortClassName()); e.setAttribute(NAME, name); if (code != null) e.setAttribute(CODE, code); if (description != null) JDomUtility.addParagraphs(e, DESCRIPTION, description); child = new org.jdom.Element(MESSAGES); for (int i = 0; i < NUM_MSG; i++) if (messages[i] != null) child.addContent(messages[i].getJDomElement().setAttribute(TYPE, MSG_TYPE[i])); e.addContent(child); child = new org.jdom.Element(SETTINGS); child.setAttribute(MARGIN, Integer.toString(margin)); if (infoUrl != null && infoUrl.length() > 0) child.setAttribute(INFO_URL, infoUrl); else if (infoCmd != null && infoCmd.length() > 0) child.setAttribute(INFO_CMD, infoCmd); if (useOrder) child.setAttribute(USE_ORDER, JDomUtility.boolString(useOrder)); if (dragCells) child.setAttribute(DRAG_CELLS, JDomUtility.boolString(dragCells)); if (maxTime > 0) { child.setAttribute(MAX_TIME, Integer.toString(maxTime)); child.setAttribute(COUNT_DOWN_TIME, JDomUtility.boolString(countDownTime)); } if (maxActions > 0) { child.setAttribute(MAX_ACTIONS, Integer.toString(maxActions)); child.setAttribute(COUNT_DOWN_ACTIONS, JDomUtility.boolString(countDownActions)); } child.setAttribute(REPORT, JDomUtility.boolString(includeInReports)); if (includeInReports) child.setAttribute(REPORT_ACTIONS, JDomUtility.boolString(reportActions)); if (helpWindow) { child2 = new org.jdom.Element(HELP_WINDOW); boolean hsa = helpSolutionAllowed(); if (hsa) child2.setAttribute(HELP_SHOW_SOLUTION, JDomUtility.boolString(showSolution)); if (helpMsg != null && (!hsa || !showSolution)) JDomUtility.setParagraphs(child2, helpMsg); child.addContent(child2); } child2 = new org.jdom.Element(CONTAINER); child2.setAttribute(BGCOLOR, JDomUtility.colorToString(bgColor)); if (bgGradient != null) child2.addContent(bgGradient.getJDomElement()); if (bgImageFile != null && bgImageFile.length() > 0) { child3 = new org.jdom.Element(IMAGE); child3.setAttribute(NAME, bgImageFile); child3.setAttribute(TILED, JDomUtility.boolString(tiledBgImg)); child2.addContent(child3); } child3 = new org.jdom.Element(COUNTERS); child3.setAttribute(TIME, JDomUtility.boolString(bTimeCounter)); child3.setAttribute(ACTIONS, JDomUtility.boolString(bActionsCounter)); child3.setAttribute(SCORE, JDomUtility.boolString(bScoreCounter)); child2.addContent(child3); child.addContent(child2); child2 = new org.jdom.Element(WINDOW); child2.setAttribute(BGCOLOR, JDomUtility.colorToString(activityBgColor)); if (activityBgGradient != null) child2.addContent(activityBgGradient.getJDomElement()); if (transparentBg) child2.setAttribute(TRANSPARENT, JDomUtility.boolString(transparentBg)); child2.setAttribute(BORDER, JDomUtility.boolString(border)); if (absolutePositioned && absolutePosition != null) { child3 = new org.jdom.Element(POSITION); child3.setAttribute(X, Integer.toString(absolutePosition.x)); child3.setAttribute(Y, Integer.toString(absolutePosition.y)); child2.addContent(child3); } if (windowSize.width != DEFAULT_WIDTH || windowSize.height != DEFAULT_HEIGHT) { child3 = new org.jdom.Element(SIZE); child3.setAttribute(WIDTH, Integer.toString(windowSize.width)); child3.setAttribute(HEIGHT, Integer.toString(windowSize.height)); child2.addContent(child3); } child.addContent(child2); if ((child2 = eventSounds.getJDomElement()) != null) child.addContent(child2); if (skinFileName != null) { child2 = new org.jdom.Element(SKIN); child2.setAttribute(FILE, skinFileName); child.addContent(child2); } e.addContent(child); if (acp != null) e.addContent(acp.getJDomElement()); return e; } public static Activity getActivity(Object o, JClicProject project) throws Exception { Activity act; org.jdom.Element e = null; Clic3Activity c3a = null; String className; if (o instanceof org.jdom.Element) { e = (org.jdom.Element) o; JDomUtility.checkName(e, ELEMENT_NAME); className = JDomUtility.getClassName(e); } else if (o instanceof Clic3Activity) { c3a = (Clic3Activity) o; className = c3a.className; } else if (o instanceof String) { className = (String) o; } else throw new Exception("unknown data!!"); Class activityClass; Constructor con; Class[] cparams = { JClicProject.class }; Object[] initArgs = { project }; if (className.startsWith(BASE_CLASS_TAG)) className = BASE_CLASS + className.substring(1); activityClass = Class.forName(className); con = activityClass.getConstructor(cparams); act = (Activity) con.newInstance(initArgs); if (e != null) act.setProperties(e, null); else if (c3a != null) act.setProperties(c3a); else act.initNew(); return act; } public Activity duplicate() throws Exception { return Activity.getActivity(getJDomElement(), project); } public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child, child2, child3; JDomUtility.checkName(e, ELEMENT_NAME); name = JDomUtility.getStringAttr(e, NAME, name, false); code = JDomUtility.getStringAttr(e, CODE, code, false); if ((child = e.getChild(DESCRIPTION)) != null) description = JDomUtility.getParagraphs(child); if ((child = e.getChild(MESSAGES)) != null) { Iterator itr = child.getChildren(ActiveBoxContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) { child2 = ((org.jdom.Element) itr.next()); int i = JDomUtility.getStrIndexAttr(child2, TYPE, MSG_TYPE, -1); if (i >= 0) messages[i] = ActiveBoxContent.getActiveBoxContent(child2, project.mediaBag); } } if ((child = e.getChild(SETTINGS)) != null) { margin = JDomUtility.getIntAttr(child, MARGIN, margin); infoUrl = JDomUtility.getStringAttr(child, INFO_URL, infoUrl, false); if (infoUrl == null) infoCmd = JDomUtility.getStringAttr(child, INFO_CMD, infoCmd, false); useOrder = JDomUtility.getBoolAttr(child, USE_ORDER, useOrder); dragCells = JDomUtility.getBoolAttr(child, DRAG_CELLS, dragCells); maxTime = JDomUtility.getIntAttr(child, MAX_TIME, maxTime); if (maxTime > 0) countDownTime = JDomUtility.getBoolAttr(child, COUNT_DOWN_TIME, countDownTime); maxActions = JDomUtility.getIntAttr(child, MAX_ACTIONS, maxActions); if (maxActions > 0) countDownActions = JDomUtility.getBoolAttr(child, COUNT_DOWN_ACTIONS, countDownActions); includeInReports = JDomUtility.getBoolAttr(child, REPORT, includeInReports); if (includeInReports) reportActions = JDomUtility.getBoolAttr(child, REPORT_ACTIONS, reportActions); else reportActions = false; if ((child2 = child.getChild(HELP_WINDOW)) != null) { if (helpSolutionAllowed()) { showSolution = JDomUtility.getBoolAttr(child2, HELP_SHOW_SOLUTION, showSolution); } if (!showSolution) helpMsg = JDomUtility.getParagraphs(child2); helpWindow = helpMsg != null || showSolution; } if ((child2 = child.getChild(CONTAINER)) != null) { bgColor = JDomUtility.getColorAttr(child2, BGCOLOR, bgColor); if ((child3 = child2.getChild(Gradient.ELEMENT_NAME)) != null) bgGradient = Gradient.getGradient(child3); if ((child3 = child2.getChild(IMAGE)) != null) { bgImageFile = child3.getAttributeValue(NAME); tiledBgImg = JDomUtility.getBoolAttr(child3, TILED, tiledBgImg); } if ((child3 = child2.getChild(COUNTERS)) != null) { bTimeCounter = JDomUtility.getBoolAttr(child3, TIME, bTimeCounter); bActionsCounter = JDomUtility.getBoolAttr(child3, ACTIONS, bActionsCounter); bScoreCounter = JDomUtility.getBoolAttr(child3, SCORE, bScoreCounter); // Check for old version bug String v = project.version; if (v != null && v.compareTo("0.1.1") <= 0) { boolean b = bScoreCounter; bScoreCounter = bTimeCounter; bTimeCounter = bActionsCounter; bActionsCounter = b; } } } if ((child2 = child.getChild(WINDOW)) != null) { activityBgColor = JDomUtility.getColorAttr(child2, BGCOLOR, activityBgColor); if ((child3 = child2.getChild(Gradient.ELEMENT_NAME)) != null) activityBgGradient = Gradient.getGradient(child3); transparentBg = JDomUtility.getBoolAttr(child2, TRANSPARENT, transparentBg); border = JDomUtility.getBoolAttr(child2, BORDER, border); if ((child3 = child2.getChild(POSITION)) != null) { absolutePositioned = true; absolutePosition = JDomUtility.getPointAttr(child3, X, Y, absolutePosition); } if ((child3 = child2.getChild(SIZE)) != null) { windowSize = JDomUtility.getDimensionAttr(child3, WIDTH, HEIGHT, windowSize); } } if ((child2 = child.getChild(EventSounds.ELEMENT_NAME)) != null) eventSounds = EventSounds.getEventSounds(child2); if ((child2 = child.getChild(SKIN)) != null) { skinFileName = JDomUtility.getStringAttr(child2, FILE, skinFileName, false); /* * if(skinFileName!=null && skinFileName.length()>0){ if(project.getBridge() * instanceof PlayStation) skin=project.mediaBag.getSkinElement(skinFileName, * (PlayStation)project.getBridge()); } else skinFileName=null; */ } } if ((child = e.getChild(AutoContentProvider.ELEMENT_NAME)) != null) { acp = AutoContentProvider.getAutoContentProvider(child); } } public void setProperties(Clic3Activity c3a) throws Exception { name = c3a.fileName; if (c3a.fileDesc.length() > 0) description = c3a.fileDesc; BoxBase bbMessage = c3a.getBoxBase(2); for (int i = MAIN; i < END_ERROR; i++) { messages[i] = new ActiveBoxContent(); messages[i].setBoxBase(bbMessage); c3a.setActiveBoxTextContent(messages[i], i == MAIN ? c3a.initMess : c3a.endMess); if (messages[i].mediaContent != null) messages[i].mediaContent.level = 2; } absolutePositioned = c3a.pwrp; absolutePosition = new Point(c3a.pwrx, c3a.pwry); transparentBg = c3a.pwTransp; activityBgColor = c3a.colorFons[1]; border = c3a.marcs; bgImageFile = c3a.bmpFons; if (bgImageFile != null && bgImageFile.length() > 0) project.mediaBag.getImageElement(bgImageFile); tiledBgImg = c3a.tileBmp; bgColor = c3a.colorFons[0]; bTimeCounter = c3a.comptadors[0]; bScoreCounter = c3a.comptadors[1]; bActionsCounter = c3a.comptadors[2]; includeInReports = !c3a.noAv; if (c3a.custHlp == true && c3a.custHelpFile != null && c3a.custHelpFile.length() > 0) { StringBuilder sb = new StringBuilder(); sb.append(c3a.custHelpFile); if (c3a.hlpTopic != null && c3a.hlpTopic.length() > 0) sb.append(" ").append(c3a.hlpTopic); String s = sb.substring(0); if (s.indexOf(".htm") > 0) { StringTokenizer st = new StringTokenizer(s, " "); while (st.hasMoreTokens()) { String r = st.nextToken(); if (r.indexOf(".htm") > 0) { infoUrl = r; break; } } } else { if (c3a.custHelpFile.toLowerCase().indexOf(".hlp") > 0) infoCmd = "winhelp.exe " + c3a.custHelpFile; else infoCmd = s; } } if (helpSolutionAllowed()) showSolution = c3a.shHelp; if (showSolution) helpWindow = true; if (c3a.useDLL) { if (c3a.rgDLL.equalsIgnoreCase("arith2.dll")) { org.jdom.Element e = new org.jdom.Element(AutoContentProvider.ELEMENT_NAME); e.setAttribute(JDomUtility.CLASS, "edu.xtec.jclic.automation.arith.Arith"); try { acp = AutoContentProvider.getAutoContentProvider(e); if (acp != null) acp.setClic3Properties(c3a.dllOptions); } catch (Exception ex) { System.err.println("Unable to start arith2:\n" + ex); } } } } public static void listReferences(org.jdom.Element e, Map map) { org.jdom.Element child, child2, child3; if ((child = e.getChild(MESSAGES)) != null) { Iterator itr = child.getChildren(ActiveBoxContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) ActiveBoxContent.listReferences((org.jdom.Element) itr.next(), map); } if ((child = e.getChild(SETTINGS)) != null) { if ((child2 = child.getChild(CONTAINER)) != null) { if ((child3 = child2.getChild(IMAGE)) != null) { map.put(child3.getAttributeValue(NAME), Constants.MEDIA_OBJECT); } } if ((child2 = child.getChild(EventSounds.ELEMENT_NAME)) != null) EventSounds.listReferences(child2, map); if ((child2 = child.getChild(SKIN)) != null) { String skfn = JDomUtility.getStringAttr(child2, FILE, null, false); if (skfn != null && !skfn.startsWith(Skin.INTERNAL_SKIN_PREFIX)) map.put(skfn, Constants.SKIN_OBJECT); // TODO: check skin dependences... } } Iterator itr = e.getChildren(ActiveBagContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) ActiveBagContent.listReferences((org.jdom.Element) itr.next(), map); if ((child = e.getChild("document")) != null) { innerListReferences(child, map); } if ((child = e.getChild(AutoContentProvider.ELEMENT_NAME)) != null) { try { AutoContentProvider.listReferences(child, map); } catch (Exception ex) { System.err.println("Error checking AutoContentProvider: " + ex); } } } public static void innerListReferences(org.jdom.Element e, Map map) { Iterator it = e.getChildren(ActiveBoxContent.ELEMENT_NAME).iterator(); while (it.hasNext()) ActiveBoxContent.listReferences((org.jdom.Element) it.next(), map); it = e.getChildren().iterator(); while (it.hasNext()) { org.jdom.Element child = (org.jdom.Element) it.next(); if (!ActiveBoxContent.ELEMENT_NAME.equals(child.getName())) innerListReferences(child, map); } } public ActiveBoxContent[] getMessages() { return messages; } public String toHtmlString(ResourceBridge rb) { Html html = new Html(1000); html.doubleCell(rb.getMsg("about_window_lb_activity"), true, name, true); if (description != null) html.doubleCell(rb.getMsg("about_window_lb_description"), true, description, false); return Html.table(html.toString(), null, 1, 5, -1, null, false); } // 02-oct-2006: Param "ResourceBridge" removed (can be obtained from "project"), // Changed the call to "init" public void initAutoContentProvider() { if (acp != null) acp.init(project.getBridge(), project.getFileSystem()); } public boolean prepareMedia(PlayStation ps) { if (eventSounds != null) eventSounds.realize(ps.getOptions(), project.mediaBag); for (ActiveBoxContent msg : messages) if (msg != null) msg.prepareMedia(ps); if (abc != null) for (ActiveBagContent b : abc) if (b != null) b.prepareMedia(ps); return true; } protected Activity getActivity() { return this; } public abstract Activity.Panel getActivityPanel(PlayStation ps); public boolean helpSolutionAllowed() { return false; } public boolean helpWindowAllowed() { return helpWindow && ((helpSolutionAllowed() && showSolution) || helpMsg != null); } public abstract int getMinNumActions(); public boolean mustPauseSequence() { return getMinNumActions() != 0; } public boolean canReinit() { return true; } public boolean hasInfo() { return ((infoUrl != null && infoUrl.length() > 0) || (infoCmd != null && infoCmd.length() > 0)); } public boolean hasRandom() { return false; } public boolean shuffleAlways() { return false; } public boolean needsKeyboard() { return false; } public void end() { if (eventSounds != null) { eventSounds.close(); eventSounds = null; } clear(); } public void clear() { } @Override public void finalize() throws Throwable { try { end(); } finally { super.finalize(); } } /** * Getter for property windowSize. * * @return Value of property windowSize. */ public Dimension getWindowSize() { return new Dimension(windowSize); } /** * Setter for property windowSize. * * @param windowSize New value of property windowSize. */ public void setWindowSize(Dimension windowSize) { this.windowSize = new Dimension(windowSize); } public abstract class Panel extends JPanel { public Skin skin = null; public boolean solved = false; public Image bgImage = null; protected boolean playing = false; protected boolean firstRun = true; protected int currentItem = 0; protected BoxConnector bc = null; public PlayStation ps; /** Creates new ActivityPanel */ protected Panel(PlayStation ps) { super(); this.ps = ps; setMinimumSize(new Dimension(100, 100)); setPreferredSize(new Dimension(500, 400)); enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.KEY_EVENT_MASK); // 02-oct-2006: Added a call to initAutoContentProvider initAutoContentProvider(); } public Activity getActivity() { return Activity.this; } public PlayStation getPs() { return ps; } public void buildVisualComponents() throws Exception { playing = false; skin = null; if (skinFileName != null && skinFileName.length() > 0) skin = project.mediaBag.getSkinElement(skinFileName, ps); bgImage = null; if (bgImageFile != null && bgImageFile.length() > 0) { MediaBagElement mbe = project.mediaBag.getImageElement(bgImageFile); bgImage = mbe.getImage(); bgImageFile = mbe.getName(); } setBackground(activityBgColor); if (transparentBg) { setOpaque(false); } setBorder(border ? BorderFactory.createBevelBorder(BevelBorder.RAISED) : BorderFactory.createEmptyBorder()); invalidate(); } protected void playEvent(int event) { if (eventSounds != null) eventSounds.play(event); } public void initActivity() throws Exception { if (playing) { playing = false; ps.reportEndActivity(Activity.this, solved); } solved = false; ps.reportNewActivity(Activity.this, 0); enableCounters(); } public void startActivity() throws Exception { } public void showHelp() { } public abstract void render(Graphics2D g2, Rectangle dirtyRegion); public abstract Dimension setDimension(Dimension maxSize); public void processMouse(MouseEvent e) { } public void processKey(KeyEvent e) { } public boolean isPlaying() { return playing; } public final void fitTo(Rectangle proposed, Rectangle bounds) { Point origin = new Point(0, 0); if (absolutePositioned && absolutePosition != null) { origin.x = Math.max(0, absolutePosition.x + proposed.x); origin.y = Math.max(0, absolutePosition.y + proposed.y); proposed.width -= absolutePosition.x; proposed.height -= absolutePosition.y; } Dimension d = setDimension(new Dimension(Math.max(2 * margin + Activity.MINIMUM_WIDTH, proposed.width), Math.max(2 * margin + Activity.MINIMUM_HEIGHT, proposed.height))); if (!absolutePositioned) { origin.setLocation(Math.max(0, proposed.x + (proposed.width - d.width) / 2), Math.max(0, proposed.y + (proposed.height - d.height) / 2)); } if (origin.x + d.width > bounds.width) origin.x = Math.max(0, bounds.width - d.width); if (origin.y + d.height > bounds.height) origin.y = Math.max(0, bounds.height - d.height); setBounds(origin.x, origin.y, d.width, d.height); } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(DEFAULT_RENDERING_HINTS); if (!transparentBg) { if (activityBgGradient == null || activityBgGradient.hasTransparency()) super.paintComponent(g2); if (activityBgGradient != null) activityBgGradient.paint(g2, new Rectangle(0, 0, getWidth(), getHeight())); } while (true) { BoxBase.flagFontReduced = false; render(g2, g2.getClipBounds()); if (!BoxBase.flagFontReduced) break; } g2.setRenderingHints(rh); } public void forceFinishActivity() { } public void finishActivity(boolean result) { playing = false; solved = result; if (bc != null) bc.end(); if (result) { setAndPlayMsg(END, EventSounds.FINISHED_OK); } else { setAndPlayMsg(END_ERROR, EventSounds.FINISHED_ERROR); } ps.activityFinished(solved); ps.reportEndActivity(Activity.this, solved); } protected void setAndPlayMsg(int msgCode, int eventSoundsCode) { ps.setMsg(messages[msgCode]); if (messages[msgCode] == null || messages[msgCode].mediaContent == null) playEvent(eventSoundsCode); else ps.playMsg(); } public void end() { forceFinishActivity(); if (playing) { if (bc != null) bc.end(); ps.reportEndActivity(Activity.this, solved); playing = false; solved = false; } clear(); } public abstract void clear(); @Override public void finalize() throws Throwable { try { end(); } finally { super.finalize(); } } protected void enableCounters() { enableCounters(bTimeCounter, bScoreCounter, bActionsCounter); } protected void enableCounters(boolean eTime, boolean eScore, boolean eActions) { ps.setCounterEnabled(TIME_COUNTER, eTime); if (countDownTime) ps.setCountDown(TIME_COUNTER, maxTime); ps.setCounterEnabled(SCORE_COUNTER, eScore); ps.setCounterEnabled(ACTIONS_COUNTER, eActions); if (countDownActions) ps.setCountDown(ACTIONS_COUNTER, maxActions); } @Override public void doLayout() { } protected void shuffle(ActiveBoxBag[] bg, boolean visible, boolean fitInArea) { int steps = shuffles; int i = shuffles; while (i > 0) { int k = i > steps ? steps : i; for (ActiveBoxBag abb : bg) if (abb != null) abb.scrambleCells(k, fitInArea); i -= steps; } } @Override protected void processEvent(AWTEvent e) { if (playing && e instanceof MouseEvent) { if (e.getID() == MouseEvent.MOUSE_PRESSED && !hasFocus()) requestFocus(); // Modified 05-Aug-2010: // Medium button must not be processed when "fressa" enabled if (e.getID() != MouseEvent.BUTTON3 || ps.getFressa() == null) processMouse((MouseEvent) e); } else if (playing && e instanceof KeyEvent) processKey((KeyEvent) e); super.processEvent(e); } public void calcScanPoints() { if (ps.getFressa() != null) { ps.getFressa().calcScanPoints(); } } public void calcInactivePoints() { // does nothing by default } public void nextScanPosition() { if (ps.getFressa() != null) { ps.getFressa().nextScanPosition(); } } public void clickLeftButton() { if (ps.getFressa() != null) { ps.getFressa().clickLeftButton(); if (ps.getFressa().jumpWellPlaced) calcInactivePoints(); } } } } src/core/edu/xtec/jclic/Constants.java000066400000000000000000000240151335566474600202450ustar00rootroot00000000000000/* * File : Constants.java * Created : 31-jul-2002 09:35 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; /** * Definition of some global constants widely used in JClic. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.10.02 */ public interface Constants { /** * Path to the bundle of .properties files with the basic JClic messages */ public static final String DEFAULT_BUNDLE = "messages.JClicMessages"; /** Path to the basic JClic settings */ public static final String COMMON_SETTINGS = "commonSettings"; /** Path to the JClic logo */ public static final String LOGO_ICON = "icons/logo.png"; /** Name of the application (JClic) */ public static final String PROGRAM = "JClic"; // String constants used in applet parameters and common properties /** Key for the parameter cookie, used in applets */ public static final String COOKIE = "cookie"; /** * Key for the parameter exitUrl, used in applets to specify the * URL where the browser should navigate when JClic executes an * exit command. */ public static final String EXIT_URL = "exitUrl"; /** * Key for the parameter urlBase, used in applets to specify the * absolute base URL used to locate other files. */ public static final String URL_BASE = "urlBase"; /** * Key for the parameter infoUrlFrame, used in applets to specify * the name of the browser frame or window where the info content * of the activities will be displayed. */ public static final String INFO_URL_FRAME = "infoUrlFrame"; /** * Key for the boolean parameter compressImages. When * false, images larger than the cell will be cropped. Otherwise, * JClic will compress it to fit into the cell. */ public static final String COMPRESS_IMAGES = "compressImages"; /** * Key for the boolean parameter 'preDrawImages', used in past versions to * activate a workaround to a Java graphics bug. */ public static final String PRE_DRAW_IMAGES = "preDrawImages"; /** * Key for the parameter 'skin', used to specify the * {@link edu.xtec.jclic.skins.Skin} to be used. */ public static final String SKIN = "skin"; /** * Key for the parameter 'reporterClass', used to specify the type of * {@link edu.xtec.jclic.report.Reporter} to be used. */ public static final String REPORTER_CLASS = "reporter"; /** * Key for the parameter 'reporterParams', used to pass specific parametres to * the reporter. */ public static final String REPORTER_PARAMS = "reporterParams"; /** * Key for the boolean parameter 'systemSounds'. When false, no * system sounds are played. */ public static final String SYSTEM_SOUNDS = "systemSounds"; /** * Key for the boolean parameter 'audioEnabled'. When false, no * sounds or other media are played. */ public static final String AUDIO_ENABLED = "audioEnabled"; /** * Key for the boolean parameter 'navButtonsAlways'. When true, the * navigation buttons (next activity and previous activity) are * always displayed. */ public static final String NAV_BUTTONS_ALWAYS = "navButtonsAlways"; /** * Key for the boolean parameter 'trace'. When true, debug messages * are displayed in the console. */ public static final String TRACE = "trace"; /** * Key for the boolean parameter 'myurl'. Used by applets to know its * DocumentBase since Oracle has broken this funcionality for local filesystems * in Java 1.7.40. */ public static final String MYURL = "myurl"; /** String used to represent the boolean value true. */ public static final String TRUE = "true"; /** String used to represent the boolean value false. */ public static final String FALSE = "false"; /** String used to represent the default value */ public static final String DEFAULT = "default"; /** String used to represent the enabled value */ public static final String ENABLED = "enabled"; /** String used to represent the id value */ public static final String ID = "id"; /** * String used to represent the QuickTime for Java (pre-6.1) multimedia system */ public static final String QT = "QuickTime"; /** * String used to represent the QuickTime for Java (6.1 or later) multimedia * system */ public static final String QT61 = "QuickTime 6.1"; /** String used to represent the Java Media Framework system */ public static final String JMF = "Java Media Framework"; /** * Key for the runtime property mediaSystem. Possible values are * JMF, QT, QT61 or null. */ public static final String MEDIA_SYSTEM = "mediaSystem"; /** * Key for the parameter or runtime property 'noMediaSystemWarn', used to * indicate that users should not be warned about the absence of multimedia * extensions in their Java system. */ public static final String NO_MEDIASYSTEM_WARN = "NoMediaSystemWarn"; /** * Array of strings containing the values of all the valid multimedia extensions */ public static final String[] MEDIA_SYSTEMS = { DEFAULT, JMF, QT }; /** Default rendering hints used with {@link java.awt.Graphics2D} objects. */ public static final java.awt.RenderingHints DEFAULT_RENDERING_HINTS = new java.awt.RenderingHints(null); /** * Index of the hand (standard) cursor in the * {@link edu.xtec.jclic.Player} member cursors. */ public static final int HAND_CURSOR = 0; /** * Index of the ok cursor in the {@link edu.xtec.jclic.Player} * member cursors * . */ public static final int OK_CURSOR = 1; // Constants for cursors /** * Index of the record (microphone) cursor in the * {@link edu.xtec.jclic.Player} member cursors. */ public static final int REC_CURSOR = 2; /** Default color used to fill backgrounds of graphic objects. */ public static final java.awt.Color BG_COLOR = new java.awt.Color(239, 247, 221); public static final int ACTION_PREV = 0, ACTION_NEXT = 1, ACTION_RETURN = 2, ACTION_RESET = 3, ACTION_INFO = 4, ACTION_HLP = 5, ACTION_AUDIO = 6, ACTION_REPORTS = 7, NUM_ACTIONS = 8; /** * Array that contains integers representing all the dynamic actions, useful for * operations involving the actions member of * {@link edu.xtec.jclic.Player}. */ public static final int[] DYNAMIC_ACTIONS = { ACTION_PREV, ACTION_NEXT, ACTION_RETURN, ACTION_RESET, ACTION_INFO, ACTION_HLP }; /** * Array with the names of all the dynamic actions used in * {@link edu.xtec.jclic.Player} objects. */ public static final String[] ACTION_NAME = { "prev", "next", "return", "reset", "info", "help", "audio", "about" }; /** Index of the score counter. */ public static final int SCORE_COUNTER = 0; /** Index of the actions counter. */ public static final int ACTIONS_COUNTER = 1; /** Index of the time counter. */ public static final int TIME_COUNTER = 2; // Constants for counters /** * Number of counters used in JClic players (currently 3: score, * actions and time) */ public static final int NUM_COUNTERS = 3; /** * Names used to represent the counters (score, actions and * time) */ public static final String[] counterNames = { "score", "actions", "time" }; /** * Minimal margin between the activity container internal frame and the activity * window bounds. */ public static final int AC_MARGIN = 6; /** Minimal value for both with and height of cells. */ public static final int MIN_CELL_SIZE = 10; /** Names used to represent different kinds of objects. */ public static final String MEDIA_OBJECT = "media", SEQUENCE_OBJECT = "sequence", ACTIVITY_OBJECT = "activity", URL_OBJECT = "url", EXTERNAL_OBJECT = "external", SKIN_OBJECT = "skin", PROJECT_OBJECT = "project"; /** Bit masks used to represent different types of resources. */ public static final int T_ACTIVITY = 0x0001, T_SEQUENCE = 0x0002, T_URL = 0x0004, T_EXTERNAL = 0x0008, T_IMAGE = 0x0010, T_AUDIO = 0x0020, T_MIDI = 0x0040, T_VIDEO = 0x0080, T_ANIM = 0x0100, T_XML = 0x0200, T_FONT = 0x0400, T_JCLIC = 0x0800, T_CLIC = 0x1000, T_INST = 0x2000, T_UNKNOWN_MEDIA = 0x4000, T_TEXT = 0x8000; /** Generic value used to represent all the supported media types. */ public static final int T_MEDIA = T_IMAGE | T_AUDIO | T_MIDI | T_VIDEO | T_ANIM | T_XML | T_FONT | T_UNKNOWN_MEDIA; } src/core/edu/xtec/jclic/ExtendedPlayer.java000066400000000000000000000331141335566474600212060ustar00rootroot00000000000000/* * File : ExtendedPlayer.java * Created : 25-oct-2001 10:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.accessibility.FressaFunctions; import edu.xtec.jclic.fileSystem.*; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.*; import edu.xtec.util.*; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ExtendedPlayer extends Player { JFrame debugFrame = null; public static final String MESSAGES_BUNDLE = "messages.PlayerMessages"; protected int recentFilesOffset; protected JMenuBar menuBar; protected JMenu fileMenu, recentFilesMenu, activityMenu, toolsMenu, helpMenu; protected PlayerSettings settings; protected FressaFunctions fressa; /** Creates new ExtendedPlayer */ public ExtendedPlayer(Options options) { super(options); } @Override protected void init() { settings = PlayerSettings.loadPlayerSettings(this); super.init(); settings.checkLibrary(); if (settings.fressaEnabled) fressa = new FressaFunctions(options); } protected void doInstall(String fileName) { if (settings.promptPassword(this, new String[] { "install_info_description", "settings_passwordRequired" })) { try { ProjectInstallerDlg pi = ProjectInstallerDlg.getProjectInstallerDlg(this, settings.libraryManager, fileName); if (pi != null) { pi.setVisible(true); if (pi.result != null && !pi.cancel) { if (pi.launchNow && pi.pathToMainProject != null) load(pi.pathToMainProject, null); else launchProjectLibrary(pi.result); } } } catch (Exception ex) { System.err.println("Error installing: " + ex.getMessage()); } } } @Override public boolean start(String fullPath, String sequence) { boolean result = super.start(fullPath, sequence); if (!result) { try { ProjectLibrary pl = settings.libraryManager.getAutoStartProjectLibrary(); if (pl != null) launchProjectLibrary(pl); } catch (Exception ex) { System.err.println("Error loading autoStart project library!\n" + ex); } } return result; } @Override public boolean load(String fullPath, String sequence) { boolean result = false; if (fullPath != null && sequence == null && fullPath.endsWith(ProjectInstaller.INSTALLER_EXTENSION)) doInstall(fullPath); else result = super.load(fullPath, sequence); return result; } @Override public Messages setMessages() { super.setMessages(); messages.addBundle(MESSAGES_BUNDLE); return messages; } @Override protected FileSystem createFileSystem() { return settings.fileSystem; } protected void createMenu() { menuBar = new JMenuBar(); fileMenu = new JMenu(messages.get("m_File")); fileMenu.setMnemonic(messages.get("m_File_Mnemonic").charAt(0)); fileMenu.add(new KJMenuItem(getAction(ACTION_OPEN_FILE))); fileMenu.add(new KJMenuItem(getAction(ACTION_OPEN_URL))); menuBar.add(fileMenu); activityMenu = new JMenu(messages.get("m_Activity")); activityMenu.setMnemonic(messages.get("m_Activity_Mnemonic").charAt(0)); activityMenu.add(new KJMenuItem(getAction(ACTION_NEXT))); activityMenu.add(new KJMenuItem(getAction(ACTION_PREV))); activityMenu.add(new KJMenuItem(getAction(ACTION_RETURN))); activityMenu.add(new KJMenuItem(getAction(ACTION_RESET))); activityMenu.addSeparator(); activityMenu.add(new KJMenuItem(getAction(ACTION_INFO))); activityMenu.add(new KJMenuItem(getAction(ACTION_HLP))); activityMenu.add(new KJMenuItem(getAction(ACTION_REPORTS))); activityMenu.addSeparator(); activityMenu.add(new KJMenuItem(getAction(ACTION_AUDIO))); menuBar.add(activityMenu); toolsMenu = new JMenu(messages.get("m_Tools")); toolsMenu.setMnemonic(messages.get("m_Tools_Mnemonic").charAt(0)); toolsMenu.add(new KJMenuItem(getAction(ACTION_LIBRARIES))); toolsMenu.add(new KJMenuItem(getAction(ACTION_SETTINGS))); menuBar.add(toolsMenu); helpMenu = new JMenu(messages.get("m_Help")); helpMenu.setMnemonic(messages.get("m_Help_Mnemonic").charAt(0)); helpMenu.add(new KJMenuItem(getAction(ACTION_ABOUT))); menuBar.add(helpMenu); } protected void postCreateMenu() { fileMenu.addSeparator(); fileMenu.add(new KJMenuItem(getAction(ACTION_EXIT))); fileMenu.addSeparator(); recentFilesMenu = fileMenu; recentFilesOffset = fileMenu.getItemCount(); updateRecentFilesMenu(); } @Override public void addTo(RootPaneContainer cont, Object constraints) { super.addTo(cont, constraints); checkMenu(false); } protected void checkMenu(boolean recreate) { JRootPane rp = getRootPane(); if (rp == null) return; if (recreate || rp.getJMenuBar() == null) { if (recreate || menuBar == null) { createMenu(); postCreateMenu(); } rp.setJMenuBar(menuBar); rp.revalidate(); } } protected void updateRecentFilesMenu() { if (recentFilesMenu != null && recentFilesOffset >= 0) { JMenuItem jmi; int itemsToRemove = recentFilesMenu.getItemCount() - recentFilesOffset; for (int i = 0; i < itemsToRemove; i++) recentFilesMenu.remove(recentFilesOffset); for (int i = 0; i < PlayerSettings.MAX_RECENT; i++) { if (settings.recentFiles[i] != null) { String s = settings.recentFiles[i]; int k = s.lastIndexOf('\\'); if (k < 0) k = s.lastIndexOf('/'); if (k >= 0) s = s.substring(k + 1); createMenuItem(recentFilesMenu, Integer.toString(i + 1) + ". " + s, "recent" + i, true, KeyStroke.getKeyStroke(KeyEvent.VK_1 + i, ActionEvent.ALT_MASK)); } } } } JMenuItem createMenuItem(JComponent parent, String text, String actionCommand, boolean mnemonic, KeyStroke accelerator) { JMenuItem jmi = new JMenuItem(text); if (actionCommand != null) { jmi.setActionCommand(actionCommand); jmi.addActionListener(this); } if (mnemonic) jmi.setMnemonic(jmi.getText().charAt(0)); if (accelerator != null) jmi.setAccelerator(accelerator); parent.add(jmi); return jmi; } public static final int ACTION_OPEN_FILE = NUM_ACTIONS, ACTION_OPEN_URL = NUM_ACTIONS + 1, ACTION_EXIT = NUM_ACTIONS + 2, ACTION_SETTINGS = NUM_ACTIONS + 3, ACTION_LIBRARIES = NUM_ACTIONS + 4, ACTION_ABOUT = NUM_ACTIONS + 5, NUM_ACTIONS_EXT = NUM_ACTIONS + 6; public static final String[] ACTION_NAME_EXT = { "openFile", "openUrl", "exit", "settings", "libraries", "helpAbout" }; public static final String[] ACTION_ICONS_EXT = { "icons/file_open.gif", "icons/world.gif", "icons/exit_small.gif", "icons/settings.gif", "icons/database.gif", "icons/help.gif" }; @Override protected int getNumActions() { return NUM_ACTIONS_EXT; } @Override protected void buildActions() { super.buildActions(); actions[ACTION_OPEN_FILE] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { FileSystem fs = project.getFileSystem(); if (fs.isUrlBased()) fs = settings.fileSystem; int[] filters = { Utils.ALL_CLIC_FF, Utils.INSTALL_FF, Utils.ALL_JCLIC_FF }; String result = fs.chooseFile(null, false, filters, options, null, ExtendedPlayer.this, false); if (result != null) { String fileName = fs.getFullFileNamePath(result); if (load(fileName, null)) addRecentFile(fileName); } } }; actions[ACTION_OPEN_URL] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { String url = messages.showInputDlg(ExtendedPlayer.this, "URL_OPEN", "URL", "http://", "URL_OPEN", false); if (url != null) { url = url.trim(); if (url.indexOf("://", 7) >= 0) url = url.substring(7); if (url.length() > 0 && !url.equals("http://")) { if (load(url, null)) addRecentFile(url); } } } }; actions[ACTION_EXIT] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { exit(); } }; actions[ACTION_SETTINGS] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { String currentLook = options.getString(LFUtil.LOOK_AND_FEEL); String currentLanguage = options.getString(Messages.LANGUAGE); String currentCountry = options.getString(Messages.COUNTRY); String currentVariant = options.getString(Messages.VARIANT); String currentSkin = options.getString(SKIN); String currentReporterClass = settings.reporterClass; String currentReporterParams = settings.reporterParams; boolean currentReporterEnabled = settings.reporterEnabled; String currentMediaSystem = settings.mediaSystem; if (settings.edit(ExtendedPlayer.this)) { settings.save(); options.syncProperties(settings.getProperties(), false); if (!settings.skin.equals(currentSkin)) { initSkin(); setSkin(null); } else if (getSkin() != null) { AbstractButton bt = getSkin().getButton(ACTION_AUDIO); if (bt != null) bt.setSelected(!audioEnabled); } boolean recreateMenu = false; if (!settings.lookAndFeel.equals(currentLook)) { options.setLookAndFeel(); recreateMenu = true; } if (settings.language != null && (!StrUtils.compareObjects(settings.language, currentLanguage) || !StrUtils.compareObjects(settings.country, currentCountry) || !StrUtils.compareObjects(settings.variant, currentVariant))) { setMessages(); recreateMenu = true; } if (recreateMenu) { checkMenu(true); } if (settings.reporterEnabled && (!settings.reporterClass.equals(currentReporterClass) || !settings.reporterParams.equals(currentReporterParams))) { initReporter(); } audioEnabled = settings.soundEnabled; edu.xtec.jclic.media.EventSounds.globalEnabled = settings.systemSounds; if (!currentMediaSystem.equals(settings.mediaSystem)) { options.put(MEDIA_SYSTEM, settings.mediaSystem); edu.xtec.jclic.media.CheckMediaSystem.check(options, false); createEventSounds(); } } } }; actions[ACTION_LIBRARIES] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { try { ProjectLibrary pl = settings.libraryManager.selectProjectLibrary(true, false); if (pl != null) launchProjectLibrary(pl); } catch (Exception ex) { messages.showErrorWarning(ExtendedPlayer.this, "error_launchLibrary", ex); } } }; actions[ACTION_ABOUT] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { showAbout(false); } }; } @Override protected String getActionName(int actionId) { if (actionId >= NUM_ACTIONS && actionId < NUM_ACTIONS_EXT) return ACTION_NAME_EXT[actionId - NUM_ACTIONS]; return super.getActionName(actionId); } @Override protected Icon getActionIcon(int actionId) { if (actionId >= NUM_ACTIONS && actionId < NUM_ACTIONS_EXT) return ResourceManager.getImageIcon(ACTION_ICONS_EXT[actionId - NUM_ACTIONS]); return super.getActionIcon(actionId); } @Override protected boolean processActionEvent(String ac) { if (ac.startsWith("recent") && ac.length() > 6) { try { int i = Integer.parseInt(ac.substring(6)); if (i >= 0 && i < PlayerSettings.MAX_RECENT && settings.recentFiles[i] != null) load(settings.recentFiles[i], null); } catch (Exception ex) { System.err.println("invalid command: " + ac); } } else return super.processActionEvent(ac); return true; } protected void launchProjectLibrary(ProjectLibrary pl) { if (pl != null) { setProject(null); edu.xtec.jclic.media.MediaContent mc = new edu.xtec.jclic.media.MediaContent(); mc.externalParam = pl.getFullPath(); mc.mediaFileName = pl.activitySequence.getElement(0, false).getTag(); mc.mediaType = edu.xtec.jclic.media.MediaContent.RUN_CLIC_PACKAGE; playMedia(mc, null); } } protected void addRecentFile(String fName) { settings.addRecentFile(fName); updateRecentFilesMenu(); settings.save(); } /** * FressaFunctions offers special accessibility features like atomatic scanning * and voice synthesis. * * @return The FressaFunctions object, or null if accessibility * features are not enabled */ @Override public edu.xtec.jclic.accessibility.FressaFunctions getFressa() { return fressa; } } src/core/edu/xtec/jclic/HelpActivityComponent.java000066400000000000000000000077751335566474600225770ustar00rootroot00000000000000/* * File : HelpActivityComponent.java * Created : 16-aug-2001 1:32 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.boxes.AbstractBox; import edu.xtec.jclic.boxes.ActiveBox; import java.awt.AWTEvent; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.border.BevelBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * JClic activities have the pottibility to show a dialog window containig an * object with help contents. Activities should call the ShowHelp * method of {@link edu.xtec.jclic.PlayStation} to make this help window appear. * The abstract class * HelpActivityComponent can be used as a base class for this kind of * help objects. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.23 */ public abstract class HelpActivityComponent extends JPanel implements ListSelectionListener { /** Key used to store the preferred location property. */ public static final String PREFERRED_LOCATION = "prefLoc"; /** The {@link edu.xtec.jclic.Activity.Panel} that this object belongs to. */ public Activity.Panel ap; /** * The currently selected box in the HelpActivityComponent, if any. */ public AbstractBox markedBox; public boolean markedBoxWasVisible; /** Creates new HelpActivityComponent */ public HelpActivityComponent(Activity.Panel setAct) { super(); ap = setAct; markedBox = null; enableEvents(AWTEvent.MOUSE_EVENT_MASK); setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); putClientProperty(PREFERRED_LOCATION, new Point(ap.getLocationOnScreen())); } public void init() { } public void end() { unmarkBox(); } public abstract void render(Graphics2D g2, Rectangle dirtyRegion); @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(Constants.DEFAULT_RENDERING_HINTS); super.paintComponent(g2); render(g2, g2.getClipBounds()); g2.setRenderingHints(rh); } public void unmarkBox() { ap.ps.stopMedia(1); if (markedBox != null) { markedBox.setMarked(!markedBox.isMarked()); markedBox.setInverted(!markedBox.isInverted()); markedBox.setVisible(markedBoxWasVisible); markedBox = null; } } public void markBox(AbstractBox bx, boolean play) { unmarkBox(); markedBox = bx; if (bx != null) { markedBoxWasVisible = bx.isVisible(); if (play && bx instanceof ActiveBox) ((ActiveBox) bx).playMedia(ap.ps); bx.setMarked(!bx.isMarked()); bx.setInverted(!bx.isInverted()); bx.setVisible(true); } } public void processMouse(MouseEvent p1) { } @Override protected void processEvent(AWTEvent e) { if (e instanceof MouseEvent) processMouse((MouseEvent) e); super.processEvent(e); } public void valueChanged(ListSelectionEvent ev) { } @Override public void doLayout() { } } src/core/edu/xtec/jclic/PlayStation.java000066400000000000000000000234361335566474600205460ustar00rootroot00000000000000/* * File : PlayStation.java * Created : 16-sep-2002 12:31 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; /** * A PlayStation is a container for activities. All the classes * capables of showing and running JClic activities must implement this * interface. It describes the necessary methods to make JClic activities work. * These methods are called by the activities to get resources, play media or * notify events. * * @author Francesc Busquets (fbusquets@xtec.cat) */ public interface PlayStation extends edu.xtec.util.ResourceBridge { /** * The action corresponding to this index. The indexes of actions are defined as * constants in edu.xtec.jclic.Constants. * * @param id The index for the requested action. * @return The action coresponding to this index, or null if it does not exist. */ public javax.swing.Action getAction(int id); /** * Sets the content of the messages area of the player. * * @param abc The content to show in the message box. */ public void setMsg(edu.xtec.jclic.boxes.ActiveBoxContent abc); /** * Performs or executes the media associated with the current content of the * player's message box, if any. */ public void playMsg(); /** * Sets the text of the system messages, usually displayed in the status bar of * the player. There are two system messages in JClic: The main message, that * describes the error or action being performed, and the secondary message, * used to complement the main information with filenames or other details. * * @param msg1 Text of the main message. * @param msg2 Text of the secondary message. */ public void setSystemMessage(String msg1, String msg2); /** * Enables or disables the wait cursor (hourglass). This method uses a counter * that increments or decrements as called with true or * false params. The hourglass is maintained while the counter * remains >0. * * @param state To enable or disable the wait cursor. */ public void setWaitCursor(boolean state); /** * Obtains the Cursor resource of the specified type. Identifiers * for all the available cursors are defined in * edu.xtec.jclic.Constants. * * @param type The type of cursor requested (hand, stop, record...) * @return The {@link java.awt.Cursor} resource, or null if it does no exist. */ public java.awt.Cursor getCustomCursor(int type); /** * Provides an appropiated MediaPlayer suitable for a specific * media. * * @param mediaContent The MediaContent to be used in this * MediaPlayer. * @return A MediaPlayer useful for this MediaContent. */ public edu.xtec.jclic.media.ActiveMediaPlayer getActiveMediaPlayer(edu.xtec.jclic.media.MediaContent mediaContent); /** * Plays, performs or executes a MediaContent. If the media has graphical * content, the specified ActiveBox will be used to display it. * * @param mediaContent The MediaContent to be performed. * @param mediaPlacement The ActiveBox where the graphical content * of the media (if any) will be displayed. */ public void playMedia(edu.xtec.jclic.media.MediaContent mediaContent, edu.xtec.jclic.boxes.ActiveBox mediaPlacement); /** * Stops all the media content currently playing that has a priority level equal * or below the specified. * * @param level The priority level under wich all media contents will be halted, * or -1 to stop all media. */ public void stopMedia(int level); /** * Enables or disables the specified counter. * * @param counterId The identifier of the counter to enable or disable, as * specified in * edu.xtec.jclic.Constants. * @param bEnabled true to enable the counter, false * otherwise. */ public void setCounterEnabled(int counterId, boolean bEnabled); /** * Changes the mode of operation of the specified counter to count down, * starting by the indicated value and stopping at zero. * * @param counterId The identifier of the counter, as specified in * edu.xtec.jclic.Constants * . * @param maxValue The value to initially assign to the counter. */ public void setCountDown(int counterId, int maxValue); /** * Increments the value of the specified counter, or decrements it when in * countDown mode. * * @param counterId The identifier of the counter, as specified in * edu.xtec.jclic.Constants * . */ public void incCounterValue(int counterId); /** * Sets the specified counter to a specific value. * * @param counterId The identifier of the counter, as specified in * edu.xtec.jclic.Constants * . * @param newValue The value to be assigned to the counter. */ public void setCounterValue(int counterId, int newValue); /** * Gets the current value of the specified counter. * * @param counterId The identifier of the counter, as specified in * edu.xtec.jclic.Constants * . * @return The current value of the conuter. */ public int getCounterValue(int counterId); /** * Turns on the specified {@link edu.xtec.jclic.Activity.Panel}. * * @param actp The activity panel that will be started. */ public void startActivity(Activity.Panel actp); /** * Activity panels use this method to notify Players that the user has finished * the current activity. * * @param completedOk true if the activity was successfully * finished. */ public void activityFinished(boolean completedOk); /** * Notifies the player that the activity has been started. * * @param act The {@link Activity} that has been started. * @param currentScore The score at the beggining of the activity (usually zero, * but can be different in some cases) */ public void reportNewActivity(Activity act, int currentScore); /** * Notifies the {@link edu.xtec.jclic.report.Reporter} (if any) that an action * has been performed. This method is only used by activities that explicity * have the reportActions flag set. * * @param act The activity in wich panel the action has been performed. * @param type The type of action, as defined in {@link Activity}. * @param source The description of the object (cell, word, letter...) in * wich the action has been performed. * @param dest If the action involves more than one object, the * description of the second one. * @param ok true if the action was successful, * false otherwise. * @param currentScore Score obtained just after the action. */ public void reportNewAction(Activity act, String type, String source, String dest, boolean ok, int currentScore); /** * Notifies the {@link edu.xtec.jclic.report.Reporter} (if any) that an action * has been finished. * * @param act The Activity yhat has been finished. * @param solved true if the activity was solved, * false otherwise. */ public void reportEndActivity(Activity act, boolean solved); /** * Instructs the Player to show a help dialog window displaying a content * associated with the current activity. * * @param hlpComponent The {@link javax.swing.JComponent} to be placed in the * help dialog, or null if no special content * must be used. Activities usually use * {@link edu.xtec.jclic.HelpActivityComponent} objects for * this param. * @param hlpMsg A message to be displayed on the help window, usually * used in place of a specific JComponent. This parameter * can be null. * @return true if the user clicks on the OK button of the * help dialog, * false otherwise. */ public boolean showHelp(javax.swing.JComponent hlpComponent, String hlpMsg); /** * FressaFunctions offers special accessibility features like atomatic scanning * and voice synthesis. * * @return The FressaFunctions object, or null if accessibility * features are not enabled */ public edu.xtec.jclic.accessibility.FressaFunctions getFressa(); } src/core/edu/xtec/jclic/Player.java000066400000000000000000001445401335566474600175330ustar00rootroot00000000000000/* * File : Player.java * Created : 18-dec-2000 10:21 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.bags.ActivityBagElement; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.bags.JumpInfo; import edu.xtec.jclic.boxes.ActiveBox; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.jclic.boxes.BoxConnector; import edu.xtec.jclic.boxes.Counter; import edu.xtec.jclic.clic3.Clic3; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.fileSystem.ZipFileSystem; import edu.xtec.jclic.media.ActiveMediaBag; import edu.xtec.jclic.media.ActiveMediaPlayer; import edu.xtec.jclic.media.CheckMediaSystem; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.media.JavaSoundAudioBuffer; import edu.xtec.jclic.media.MediaContent; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.JClicProject; import edu.xtec.jclic.report.Reporter; import edu.xtec.jclic.skins.AboutWindow; import edu.xtec.jclic.skins.Skin; import edu.xtec.util.BrowserLauncher; import edu.xtec.util.Html; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import edu.xtec.util.StrUtils; import java.applet.Applet; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Locale; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.RootPaneContainer; import javax.swing.SwingUtilities; import javax.swing.Timer; import org.json.JSONObject; /** * Player is one of the the main classes of the JClic system. It * implements the {@link edu.xtec.jclic.PlayStation} interface, so it can read * and play JClic projects from files or streams. In order to allow activities * to run, Player provides them of all the necessary resources: * media bags (to load and realize images and other media contents), sequence * control, report system management, user interface (loading and management of * skins), display of system messages, etc. Player is also a * {@link edu.xtec.jclic.RunnableComponent}, so it can be embedded in applets, * frames and other containers. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class Player extends JPanel implements Constants, RunnableComponent, PlayStation, ActionListener { // static fields /** Name of the resource corresponding to the default skin of JClic. */ public static final String DEFAULT_SKIN = "@default.xml"; /** Name of the default reporter used by JClic. */ public static final String DEFAULT_REPORTER = "Reporter"; /** * List of the names of the internal resources corresponding to the default * event sounds used by JClic. */ public static final String[] DEFAULT_EVENT_SOUNDS = { // // CHANGED 01-Mar-2013: Use sounds in WAV format to avoid openJDK errors // /* START */ "sounds/start.wav", /* CLICK */ "sounds/click.wav", /* ACTION_ERROR */ "sounds/action_error.wav", /* ACTION_OK */ "sounds/action_ok.wav", /* FINISHED_ERROR */ "sounds/finished_error.wav", /* FINISHED_OK */ "sounds/finished_ok.wav" }; /** * List of the names of the internal resources corresponding to the default * icons associated to the basic actions defined in * {@link edu.xtec.jclic.Constants}. */ public static final String[] ACTION_ICONS = { "icons/prev.gif", "icons/next.gif", "icons/return.gif", "icons/reset.gif", "icons/info_small.gif", "icons/help.gif", "icons/audio_on.gif", "icons/logo_button.gif" }; /** The default name of the application (JClic) */ public static final String DEFAULT_APP_NAME = "JClic"; /** * Array containing the {@link javax.swing.Action} objects used by the player. */ protected Action[] actions; /** The main {@link edu.xtec.util.Messages} object. */ protected Messages messages; /** * The {@link edu.xtec.jclic.project.JClicProject} currently hosted by the * {@code Player}. */ protected JClicProject project; /** * The UI element (Panel)of the Activity currently * running in the * Player. */ protected Activity.Panel actPanel; /** * This object manages a list with the names of all the activities currently * played by the user in this Player. */ protected PlayerHistory history; /** Current {@link edu.xtec.jclic.skins.Skin} of the Player. */ protected Skin skin; /** * Default skin of this Player. Users can override the * DEFAULT_SKIN setting and choose another Skin to be used by * default in JClic. */ protected Skin defaultSkin; /** Bag of realized media objects, ready to play. */ protected ActiveMediaBag activeMediaBag; /** Current reporter used by this Player. */ protected Reporter reporter; /** Current set of system sonds used in this Player. */ protected EventSounds eventSounds; /** * Main Timer, used to feed the time conter. This timer generates * an * ActionPerformed event every second. */ protected Timer timer; /** * This flag indicates if the Player must play the sounds * (including system sounds) and other media contents of the activities. */ protected boolean audioEnabled = true; /** * This flag indicates if the program must write verbose info to the system * console. */ protected boolean trace = false; /** * This flag indicates if the navigation buttons (go to next activity and * go back) are enabled o disabled. */ protected boolean navButtonsDisabled = false; /** * When this flag is true, the navigation buttons are always * enabled, despite of the indications made by the activities or the sequence * control system. Used only for debugging projects with complicated sequence * chaining. */ protected boolean navButtonsAlways = false; /** * The main name of the application in wich this Player is running. */ protected String appName = DEFAULT_APP_NAME; Timer delayedTimer; Action delayedAction; Object currentConstraints; int[] counterVal = new int[NUM_COUNTERS]; Cursor[] cursors = new Cursor[3]; Options options; Image splashImg; Point bgImageOrigin = new Point(); private edu.xtec.util.SwingWorker worker = null; /** * Creates a new Player object. * * @param options Options object to be used in the initialization process */ public Player(Options options) { this(options, null); } /** * Creates a new Player object that will be initially loaded with a * specific * JClicProject. * * @param options Options object to be used in the initialization process * @param project JClic project to load (can be null) */ public Player(Options options, JClicProject project) { this.options = options; this.project = project; init(); } /** * Main initialization process, called once by constructors. Subclasses of * Player should override this method to initialize additional * members. */ protected void init() { options.setLookAndFeel(); CheckMediaSystem.check(options, false); setPreferredSize(new Dimension(600, 400)); setLayout(null); Utils.checkRenderingHints(options); BoxConnector.checkOptions(options); ActiveBox.checkOptions(options); for (int i = 0; i < NUM_COUNTERS; i++) counterVal[i] = 0; setMessages(); buildActions(); setActionsText(); history = new PlayerHistory(this); trace = options.getBoolean(TRACE); ActiveBox.compressImages = options.getBoolean(COMPRESS_IMAGES, true); audioEnabled = options.getBoolean(AUDIO_ENABLED, true); navButtonsAlways = options.getBoolean(NAV_BUTTONS_ALWAYS, false); setProject(project); activeMediaBag = new ActiveMediaBag(); initSkin(); setSkin(skin); setSystemMessage(getMessages().get("msg_initializing"), null); setWaitCursor(true); createCursors(); createEventSounds(); initTimers(); splashImg = ResourceManager.getImageIcon(LOGO_ICON).getImage(); if (skin != null && skin.hasMemMonitor()) skin.setMem(Runtime.getRuntime().freeMemory()); setWaitCursor(false); setWindowTitle(); setSystemMessage(getMessages().get("msg_ready"), null); } /** * Starts the player, loading a specific project if specified. This method is * defined in the {@link RunnableComponent} interface. * * @param fullPath Full path to the JClic project file to be loaded. Can be * null. * @param sequence Optional parameter, used only when fullPath is * not null. It indicates the sequence where the to * start. It's also possible to indicate a string representation * of a number "N". In this case, the player will start with the * activity indicated by the Nth element of the main sequence of * the project. * @return true if the player starts successfully. * false otherwise. */ public boolean start(String fullPath, String sequence) { initReporter(); if (fullPath != null) return load(fullPath, sequence); else return false; } /** * This method is called when the container gains the focus for the first time * or when losts it. Not used in Player. */ public void activate() { } /** Instructs the RunnableComponent to stop working. */ public void stop() { stopMedia(-1); } /** @throws Throwable */ @Override protected void finalize() throws Throwable { try { end(); } finally { super.finalize(); } } /** Executes miscellaneous finalization routines. */ public void end() { if (worker != null) { worker.interrupt(); worker = null; } stopMedia(); closeHelpWindow(); if (actPanel != null) { actPanel.end(); remove(actPanel); actPanel = null; } if (eventSounds != null) { eventSounds.close(); eventSounds = null; } if (project != null) { project.end(); project = null; } if (activeMediaBag != null) activeMediaBag.removeAll(); if (reporter != null) { reporter.end(); reporter = null; } } /** Creates and initializes the members of the {@link cursors} array. */ protected void createCursors() { try { Toolkit tk = Toolkit.getDefaultToolkit(); cursors[HAND_CURSOR] = tk.createCustomCursor(ResourceManager.getImageIcon("cursors/hand.gif").getImage(), new Point(8, 0), "hand"); cursors[OK_CURSOR] = tk.createCustomCursor(ResourceManager.getImageIcon("cursors/ok.gif").getImage(), new Point(0, 0), "ok"); cursors[REC_CURSOR] = tk.createCustomCursor(ResourceManager.getImageIcon("cursors/micro.gif").getImage(), new Point(15, 3), "record"); } catch (Exception e) { System.err.println("Error creating cursor:\n" + e); } } /** Creates the {@link eventSounds} member and initializes the sound system. */ protected void createEventSounds() { // Workaround for a JavaSound bug in Mac OS X if (options.getBoolean(Options.MAC)) { try { JavaSoundAudioBuffer.initialize(); } catch (Exception ex) { System.err.println("Error initializing AudioBuffer lines:\n" + ex); } } // end of workaround eventSounds = new EventSounds(null); try { for (int i = 0; i < DEFAULT_EVENT_SOUNDS.length; i++) { String s = DEFAULT_EVENT_SOUNDS[i]; eventSounds.setDataSource(i, ResourceManager.getResourceAsByteArray(s), options); } eventSounds.realize(options, project.mediaBag); } catch (Exception ex) { System.err.println("Error reading system sound:\"" + ex); } EventSounds.globalEnabled = options.getBoolean(SYSTEM_SOUNDS, true); } /** Creates and initializes the {@link reporter} member. */ protected void initReporter() { if (reporter != null) { reporter.end(); reporter = null; } String reporterClassName = StrUtils.secureString(options.getString(REPORTER_CLASS), DEFAULT_REPORTER); try { reporter = Reporter.getReporter(reporterClassName, options.getString(REPORTER_PARAMS), this, messages); } catch (Exception ex) { reporter = null; messages.showErrorWarning(this, "report_err_creating", reporterClassName, ex, null); } } /** Creates and initializes the {@link defaultSkin} member. */ protected void initSkin() { String s = ""; try { FileSystem fsSk = null; s = options.getString(SKIN); if (s == null) s = DEFAULT_SKIN; else if (!s.startsWith(Skin.INTERNAL_SKIN_PREFIX)) { fsSk = new FileSystem(FileSystem.getPathPartOf(s), this); s = FileSystem.getFileNameOf(s); } defaultSkin = Skin.getSkin(s, fsSk, this); actions[ACTION_REPORTS].setEnabled(true); actions[ACTION_AUDIO].setEnabled(true); } catch (Exception ex) { System.err.println("Error creating skin \"" + s + "\":\n" + ex); } } /** * Creates and initializes the members {@link timer}, {@link delayedTimer} and * {@link delayedAction} */ protected void initTimers() { timer = new Timer(1000, this); delayedTimer = new Timer(1000, this); delayedTimer.setRepeats(false); delayedAction = null; } /** If open, closes the help dialog window. */ public void closeHelpWindow() { if (skin != null) { if (skin.currentHelpWindow != null) skin.currentHelpWindow.setVisible(false); if (skin.currentAboutWindow != null) skin.currentAboutWindow.setVisible(false); } } /** * Creates and initializes the {@link messages} member. * * @return The messages member. */ protected Messages setMessages() { messages = Messages.getMessages(options, DEFAULT_BUNDLE); messages.addBundle(COMMON_SETTINGS); setLocale(messages.getLocale()); Locale.setDefault(messages.getLocale()); setActionsText(); if (skin != null) { skin.setLocale(messages.getLocale()); } return messages; } public Component getTopComponent() { if (skin != null) return skin; return this; } public Skin getSkin() { return skin; } /** @param newSkin */ public void setSkin(Skin newSkin) { if (newSkin == null) newSkin = defaultSkin; if (newSkin != null && !newSkin.equals(skin)) { Container top = null; Object[] currentSkinSettings = null; if (skin != null) { currentSkinSettings = skin.getCurrentSettings(); skin.detach(); top = skin.getParent(); top.remove(skin); } newSkin.attach(this); skin = newSkin; if (top != null) { RootPaneContainer rpc = null; while (top != null && rpc == null) { if (top instanceof RootPaneContainer) rpc = (RootPaneContainer) top; else top = top.getParent(); } if (rpc != null) { addTo(rpc, currentConstraints); top.validate(); top.repaint(); } } if (currentSkinSettings != null && skin != null) skin.setCurrentSettings(currentSkinSettings); } } public void addTo(RootPaneContainer cont, Object constraints) { currentConstraints = constraints; if (constraints == null) { cont.getContentPane().add(getTopComponent()); } else { cont.getContentPane().add(getTopComponent(), constraints); } } protected FileSystem createFileSystem() { return new FileSystem(this); } protected void setProject(JClicProject p) { if (project != null) { if (project != p) project.end(); removeActivity(); } project = (p != null ? p : new JClicProject(this, createFileSystem(), null)); project.realize(eventSounds, this); if (project.skin != null) defaultSkin = project.skin; } public boolean load(String fullPath, String sequence) { load(fullPath, sequence, null, null); return true; } public void load(final String sFullPath, final String sSequence, final String sActivity, final ActivityBagElement sAbe) { if (worker != null) { return; } worker = new edu.xtec.util.SwingWorker() { Activity.Panel actp; Exception exception = null; Player thisPlayer = Player.this; @Override public Object construct() { if (skin != null) skin.startAnimation(); setWaitCursor(true); String fullPath = Clic3.pacNameToLowerCase(sFullPath); String sequence = Clic3.pacNameToLowerCase(sSequence); Activity act = null; String activityName = sActivity; ActivityBagElement abe = sAbe; FileSystem fileSystem = project.getFileSystem(); try { // Step 1: load or create project and set a valid value for "sequence" if (fullPath != null) { setSystemMessage(messages.get("msg_loading_project"), FileSystem.getFileNameOf(fullPath)); if (sequence == null) sequence = "0"; // Check fileSystem and projectName if (fileSystem != null) { fullPath = fileSystem.getUrl(fullPath); if (fullPath.startsWith("file://")) fullPath = fullPath.substring(7); // Added 03-Feb-2011 // Remove trailing parameters of URLs else if (fullPath.indexOf('?') > 0) fullPath = fullPath.substring(0, fullPath.indexOf('?')); // ---------- } String projectName = null; JSONObject json = null; if (fullPath.endsWith(Utils.EXT_JCLIC_ZIP)) { fileSystem = FileSystem.createFileSystem(fullPath, thisPlayer); String[] projects = ((ZipFileSystem) fileSystem).getEntries(".jclic"); if (projects == null) throw new Exception("File " + fullPath + " does not contain any jclic project"); projectName = projects[0]; } else if (fullPath.endsWith(Utils.EXT_SCORM_ZIP)) { fileSystem = FileSystem.createFileSystem(fullPath, thisPlayer); if (fileSystem.fileExists("project.json")) { json = new JSONObject(new String(fileSystem.getBytes("project.json"))); projectName = json.optString("mainFile", null); } if (projectName == null) throw new Exception("Invalid JClic SCORM file: " + fullPath); } else { fileSystem = new FileSystem(FileSystem.getPathPartOf(fullPath), thisPlayer); projectName = FileSystem.getFileNameOf(fullPath); if (fileSystem.fileExists("project.json")) json = new JSONObject(new String(fileSystem.getBytes("project.json"))); } // Set project if (projectName.endsWith(".jclic")) { org.jdom.Document doc = fileSystem.getXMLDocument(projectName); JClicProject prj = JClicProject.getJClicProject(doc.getRootElement(), thisPlayer, fileSystem, fullPath); if (json != null) prj.readJSON(json, false); setProject(prj); if (reporter != null) reporter.newSession(project, thisPlayer, messages); } else { sequence = projectName; setProject(new JClicProject(thisPlayer, fileSystem, fullPath)); } } // Step 2: load ActivitySequenceElement ase if (sequence != null) { String seqName = FileSystem.stdFn(sequence); setSystemMessage(messages.get("msg_loading_project"), FileSystem.getFileNameOf(seqName)); navButtonsDisabled = false; ActivitySequenceElement ase = project.activitySequence.getElementByTag(seqName, true); // if sequence does no exists, get existing sequence by number if (ase == null) { int i = StrUtils.getAbsIntValueOf(seqName); if (i >= 0) ase = project.activitySequence.getElement(i, true); } // at this point, if ase==null the sequence was not found in project. // try load new sequence (only with Clic3 files) if (ase == null) { boolean firstPac = (project.activitySequence.getSize() == 0); boolean isPcc = seqName.endsWith(".pcc"); boolean isPac = seqName.endsWith(".pac"); if (isPcc || isPac) { if (isPcc) { String path = fileSystem.root + seqName; fileSystem = FileSystem.createFileSystem(path, thisPlayer); if (firstPac) { project.setFileSystem(fileSystem); project.setFullPath(path); } else setProject(new JClicProject(thisPlayer, fileSystem, path)); firstPac = true; Clic3.readPccFile(project); ase = project.activitySequence.getCurrentAct(); } else if (isPac) { Clic3.addPacToSequence(project, seqName); ase = project.activitySequence.getElementByTag(seqName, true); } if (firstPac) { project.setName(seqName); if (reporter != null) reporter.newSession(project, thisPlayer, messages); } } } if (ase != null) { if (reporter != null) reporter.newSequence(ase); activityName = ase.getActivityName(); } } // step 3: load ActivityBagElement abe if (activityName != null) { String actName = FileSystem.stdFn(activityName); abe = project.activityBag.getElement(actName); } // step 4: load Activity act if (abe != null) { setSystemMessage(messages.get("msg_loading_activity"), abe.getName()); act = Activity.getActivity(abe.getData(), project); } // step 5: Load activity if (act != null) { setSystemMessage(null, messages.get("msg_preparing_media")); if (project.settings.eventSounds != null) act.eventSounds.setParent(project.settings.eventSounds); project.mediaBag.waitForAllImages(); act.prepareMedia(thisPlayer); activeMediaBag.realizeAll(); if (abe != null) project.activitySequence.checkCurrentActivity(abe.getName()); setSystemMessage(null, messages.get("msg_initializing")); actp = act.getActivityPanel(thisPlayer); actp.buildVisualComponents(); } } catch (Exception ex) { exception = ex; if (project == null) setProject(null); actp = null; } return actp; } @Override public void finished() { setWaitCursor(false); if (actPanel != null) { actPanel.end(); remove(actPanel); actPanel = null; setCounterValue(TIME_COUNTER, 0); } if (actp != null && worker != null) { // moved to thread setBackgroundSettings(actp.getActivity()); add(actPanel = actp); actPanel.setCursor(null); splashImg = null; // set skin if (skin != null) skin.resetAllCounters(false); if (actp.skin != null) setSkin(actp.skin); else if (project.skin != null) setSkin(project.skin); else setSkin(defaultSkin); if (skin != null) { boolean hasReturn = (history.storedElementsCount() > 0); int navBtnFlag = navButtonsAlways ? ActivitySequenceElement.NAV_BOTH : navButtonsDisabled ? ActivitySequenceElement.NAV_NONE : project.activitySequence.getNavButtonsFlag(); if (actions != null) { actions[ACTION_NEXT].setEnabled((navBtnFlag & ActivitySequenceElement.NAV_FWD) != 0 && project.activitySequence.hasNextAct(hasReturn)); actions[ACTION_PREV].setEnabled((navBtnFlag & ActivitySequenceElement.NAV_BACK) != 0 && project.activitySequence.hasPrevAct(hasReturn)); actions[ACTION_RETURN].setEnabled(history.storedElementsCount() > 0); actions[ACTION_HLP].setEnabled(actp.getActivity().helpWindowAllowed()); actions[ACTION_RESET].setEnabled(actp.getActivity().canReinit()); actions[ACTION_INFO].setEnabled(actp.getActivity().hasInfo()); } } // place activity on screen setSystemMessage(messages.get("msg_ready"), null); initActivity(); } else if (exception != null) { String sType = null; List v = new ArrayList(); if (sFullPath != null) { v.add(sFullPath); sType = "msg_error_loading_project"; } if (sSequence != null) { v.add(sSequence); if (sType == null) sType = "msg_error_loading_sequence"; } if (sActivity != null) { v.add(sActivity); if (sType == null) sType = "msg_error_loading_activity"; } if (sAbe != null) { v.add(sAbe.getName()); if (sType == null) sType = "msg_error_loading_activity"; } if (sType == null) sType = Messages.ERROR; setSystemMessage(messages.get(sType), null); messages.showErrorWarning(thisPlayer, "err_reading_data", v, exception, null); validate(); } else { setSystemMessage(messages.get("msg_ready"), null); } // unlock events setWindowTitle(); worker = null; if (skin != null) { skin.stopAnimation(); skin.setEnabled(true); } setEnabled(true); } }; // Main thread, after SwingWorker was build: forceFinishActivity(); if (skin != null) skin.setEnabled(false); setEnabled(false); worker.start(); } public void forceFinishActivity() { if (timer != null) { timer.stop(); delayedTimer.stop(); if (actPanel != null) { closeHelpWindow(); actPanel.forceFinishActivity(); stopMedia(); activeMediaBag.removeAll(); if (Utils.lowMemoryCondition()) { if (trace) System.out.println(">>> LOW MEMORY! cleaning..."); project.mediaBag.clearData(); System.runFinalization(); System.gc(); } } setCursor(null); } } public void removeActivity() { forceFinishActivity(); if (actPanel != null) { actPanel.end(); remove(actPanel); setMsg(null); setBackgroundSettings(null); actPanel = null; } } public void initActivity() { setWaitCursor(true); setCursor(null); timer.stop(); delayedTimer.stop(); setCounterValue(TIME_COUNTER, 0); stopMedia(); try { if (actPanel != null) { actPanel.initActivity(); timer.start(); if (!actPanel.getActivity().mustPauseSequence()) startAutoPassTimer(); if (getFressa() != null) getFressa().initActivity(actPanel); setSystemMessage(messages.get("msg_activity_running"), null); } if (skin != null) skin.setMem(Runtime.getRuntime().freeMemory()); } catch (Exception ex) { messages.showErrorWarning(this, "msg_error_starting_activity", ex); setSystemMessage(messages.get("ERROR"), null); } finally { setWaitCursor(false); validate(); repaint(); } } public void startActivity(Activity.Panel ap) { setWaitCursor(true); try { ap.startActivity(); } catch (Exception ex) { messages.showErrorWarning(this, "msg_error_starting_activity", ex); setSystemMessage(messages.get("ERROR"), null); } finally { setWaitCursor(false); } } @Override public void doLayout() { if (trace) System.out.println(">>> layout!"); if (actPanel != null) { BoxBase.resetAllFonts(); Rectangle bounds = getBounds(); Rectangle proposedRect = new Rectangle(AC_MARGIN, AC_MARGIN, bounds.width - 2 * AC_MARGIN, bounds.height - 2 * AC_MARGIN); if (actPanel.bgImage != null && !actPanel.getActivity().tiledBgImg) { bgImageOrigin.x = (getWidth() - actPanel.bgImage.getWidth(this)) / 2; bgImageOrigin.y = (getHeight() - actPanel.bgImage.getHeight(this)) / 2; if (actPanel.getActivity().absolutePositioned) { proposedRect.x = bgImageOrigin.x; proposedRect.y = bgImageOrigin.y; proposedRect.width -= (bgImageOrigin.x - AC_MARGIN); proposedRect.height -= (bgImageOrigin.y - AC_MARGIN); proposedRect.width = Math.min(proposedRect.width, bounds.width); proposedRect.height = Math.min(proposedRect.height, bounds.height); } } actPanel.fitTo(proposedRect, bounds); } } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; if (splashImg != null) { int x, y, imgW, imgH; g2.setColor(BG_COLOR); g2.fill(g2.getClip()); imgW = splashImg.getWidth(this); imgH = splashImg.getHeight(this); x = (getBounds().width - imgW) / 2; y = (getBounds().height - imgH) / 2; g2.drawImage(splashImg, x, y, this); return; } Rectangle rBounds = new Rectangle(0, 0, getWidth(), getHeight()); if (actPanel == null || actPanel.getActivity().bgGradient == null || actPanel.getActivity().bgGradient.hasTransparency()) super.paintComponent(g); if (actPanel != null && (actPanel.getActivity().bgGradient != null || actPanel.bgImage != null)) { RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(DEFAULT_RENDERING_HINTS); if (actPanel.getActivity().bgGradient != null) actPanel.getActivity().bgGradient.paint(g2, rBounds); if (actPanel.bgImage != null) { Rectangle r = new Rectangle(0, 0, actPanel.bgImage.getWidth(this), actPanel.bgImage.getHeight(this)); Rectangle gBounds = g2.getClipBounds(); if (!actPanel.getActivity().tiledBgImg) { r.setLocation(bgImageOrigin); if (r.intersects(gBounds)) { g2.drawImage(actPanel.bgImage, bgImageOrigin.x, bgImageOrigin.y, this); } } else { Utils.tileImage(g2, actPanel.bgImage, rBounds, r, this); } } g2.setRenderingHints(rh); } } // Methods inherited from interface ActionListener public void actionPerformed(ActionEvent e) { String ac = null; if (timer != null && e.getSource().equals(timer)) { incCounterValue(TIME_COUNTER); if (actPanel != null && actPanel.getActivity().maxTime > 0 && actPanel.isPlaying() && counterVal[TIME_COUNTER] >= actPanel.getActivity().maxTime) { actPanel.finishActivity(false); } return; } if (delayedTimer != null && e.getSource().equals(delayedTimer)) { delayedTimer.stop(); if (delayedAction != null) { delayedAction.actionPerformed(null); } } if (ac == null && (ac = e.getActionCommand()) == null) return; delayedAction = null; processActionEvent(ac); } protected int getNumActions() { return NUM_ACTIONS; } protected void buildActions() { actions = new Action[getNumActions()]; actions[ACTION_NEXT] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if(history != null && project != null && project.activitySequence != null) history.processJump(project.activitySequence.getJump(false, reporter), false); } }; actions[ACTION_PREV] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if(history != null && project != null && project.activitySequence != null) history.processJump(project.activitySequence.getJump(true, reporter), false); } }; actions[ACTION_RETURN] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if(history != null) history.pop(); } }; actions[ACTION_RESET] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (actPanel != null && actPanel.getActivity().canReinit()) initActivity(); } }; actions[ACTION_HLP] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (actPanel != null) actPanel.showHelp(); } }; actions[ACTION_INFO] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { if (actPanel != null && actPanel.getActivity().hasInfo()) { if (actPanel.getActivity().infoUrl != null) { displayUrl(actPanel.getActivity().infoUrl, true); } else if (actPanel.getActivity().infoCmd != null) { runCmd(actPanel.getActivity().infoCmd); } } } }; actions[ACTION_REPORTS] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { showAbout(true); } }; actions[ACTION_AUDIO] = new AbstractAction() { public void actionPerformed(ActionEvent ev) { Object vBack = getValue(AbstractAction.DEFAULT); audioEnabled = !audioEnabled; Object vNew = audioEnabled ? Boolean.TRUE : Boolean.FALSE; if (!audioEnabled) { stopMedia(); EventSounds.globalEnabled = false; } else { EventSounds.globalEnabled = options.getBoolean(SYSTEM_SOUNDS, true); } putValue(AbstractAction.DEFAULT, vNew); if (changeSupport != null) { PropertyChangeEvent evt = new PropertyChangeEvent(this, "selected", vBack, vNew); changeSupport.firePropertyChange(evt); } } }; actions[ACTION_AUDIO].putValue(AbstractAction.DEFAULT, audioEnabled ? Boolean.TRUE : Boolean.FALSE); for (int dynAct : DYNAMIC_ACTIONS) { actions[dynAct].setEnabled(false); } actions[ACTION_AUDIO].setEnabled(true); } protected void setActionsText() { if (actions != null) { for (int i = 0; i < actions.length; i++) { if (actions[i] != null) { String s = messages.get("action_" + getActionName(i) + "_caption"); if (!s.equals(actions[i].getValue(Action.NAME))) actions[i].putValue(Action.NAME, s); s = messages.get("action_" + getActionName(i) + "_tooltip"); if (!s.equals(actions[i].getValue(Action.SHORT_DESCRIPTION))) actions[i].putValue(Action.SHORT_DESCRIPTION, s); s = messages.get("action_" + getActionName(i) + "_keys"); if (s != null && s.length() == 2) { actions[i].putValue(Action.MNEMONIC_KEY, new Integer(s.charAt(0))); char c = s.charAt(1); int kk = -1; if (c == '*') { switch (i) { case ACTION_NEXT: kk = KeyEvent.VK_RIGHT; break; case ACTION_PREV: kk = KeyEvent.VK_LEFT; break; case ACTION_RETURN: kk = KeyEvent.VK_UP; break; case ACTION_RESET: kk = KeyEvent.VK_ENTER; break; default: break; } } else kk = (int) c; if (kk >= 0) actions[i].putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(kk, KeyEvent.CTRL_MASK)); } Icon icon = getActionIcon(i); if (icon != null && !icon.equals(actions[i].getValue(Action.SMALL_ICON))) actions[i].putValue(Action.SMALL_ICON, icon); } } } } protected String getActionName(int actionId) { if (actionId < 0 || actionId >= ACTION_NAME.length) return null; return ACTION_NAME[actionId]; } protected Icon getActionIcon(int actionId) { if (actionId < 0 || actionId >= ACTION_ICONS.length) return null; return ResourceManager.getImageIcon(ACTION_ICONS[actionId]); } public Action getAction(int id) { if (actions == null || id < 0 || id >= actions.length) return null; return actions[id]; } protected boolean processActionEvent(String ac) { return !isEnabled(); } protected void showAbout(boolean selectReportPane) { if (skin != null) { AboutWindow aw = skin.buildAboutWindow(); try { aw.buildAboutTab("JClic", getMsg("JCLIC_VERSION"), null, null, null, null, null); aw.buildStandardTab(aw.getHtmlSystemInfo(), "about_window_systemInfo", "about_window_lb_system", "icons/system_small.gif"); if (project != null) { StringBuilder sb = new StringBuilder(4096); sb.append(project.settings.toHtmlString(messages)); if (actPanel != null) { sb.append(Html.BR).append(actPanel.getActivity().toHtmlString(this)); } aw.buildStandardTab(sb.substring(0), "about_window_projectInfo", "about_window_lb_project", "icons/info_small.gif"); } if (reporter != null) { aw.buildStandardTab(reporter.toHtmlString(messages), "about_window_reportInfo", "about_window_lb_report", "icons/report_small.gif"); if (selectReportPane) aw.getTabbedPane().setSelectedIndex(3); } skin.showAboutWindow(aw); } catch (Exception ex) { System.err.println("Error building about window!\n" + ex); } } } // Methods inherited from interface ActivityContainer public void playMedia(final MediaContent mediaContent, final ActiveBox mediaPlacement) { SwingUtilities.invokeLater(new Runnable() { public void run() { String s = mediaContent.mediaFileName; JumpInfo ji; switch (mediaContent.mediaType) { case MediaContent.RUN_CLIC_PACKAGE: ji = new JumpInfo(JumpInfo.JUMP, FileSystem.stdFn(s)); ji.projectPath = mediaContent.externalParam; history.processJump(ji, true); break; case MediaContent.RUN_CLIC_ACTIVITY: history.push(); load(null, null, s, null); break; case MediaContent.RETURN: history.pop(); break; case MediaContent.EXIT: String exitUrl = mediaContent.mediaFileName; if (exitUrl != null) exitUrl = project.getFileSystem().getUrl(exitUrl); ji = new JumpInfo(JumpInfo.EXIT, exitUrl); history.processJump(ji, false); break; case MediaContent.RUN_EXTERNAL: if (mediaContent.mediaFileName != null) { StringBuilder sb = new StringBuilder(mediaContent.mediaFileName); if (mediaContent.externalParam != null) sb.append(" ").append(mediaContent.externalParam); runCmd(sb.substring(0)); } break; case MediaContent.URL: if (mediaContent.mediaFileName != null) { displayUrl(mediaContent.mediaFileName, true); } break; case MediaContent.PLAY_AUDIO: case MediaContent.PLAY_MIDI: case MediaContent.PLAY_VIDEO: case MediaContent.RECORD_AUDIO: case MediaContent.PLAY_RECORDED_AUDIO: if (audioEnabled) { ActiveMediaPlayer amp = activeMediaBag.getActiveMediaPlayer(mediaContent, project.mediaBag, Player.this); if (amp != null) { amp.play(mediaPlacement); } } break; default: break; } } }); } protected void runCmd(String cmd) { if (options.get(Options.APPLET) != null) { messages.showAlert(this, "msg_warn_no_exec_in_applets"); return; } try { Runtime.getRuntime().exec(cmd, null, new File(project.getFileSystem().root)); } catch (Exception ex) { messages.showErrorWarning(this, "msg_error_executing_external", cmd, ex, null); } } public void stopMedia() { stopMedia(-1); } public void stopMedia(int level) { activeMediaBag.stopAll(level); } public void activityFinished(boolean completedOk) { closeHelpWindow(); if (getFressa() != null) getFressa().activityFinished(); if (completedOk) { setCursor(getCustomCursor(OK_CURSOR)); actPanel.setCursor(null); } setSystemMessage(messages.get("msg_activity_finished"), null); timer.stop(); startAutoPassTimer(); } public void startAutoPassTimer() { ActivitySequenceElement ase = project.activitySequence.getCurrentAct(); if (ase != null && ase.delay > 0 && !delayedTimer.isRunning() && !navButtonsDisabled) { delayedAction = actions[ACTION_NEXT]; delayedTimer.setInitialDelay(ase.delay * 1000); delayedTimer.start(); } } protected void setBackgroundSettings(Activity act) { setBackground(act != null ? act.bgColor : Color.lightGray); bgImageOrigin.setLocation(0, 0); repaint(); } public void setMsg(ActiveBoxContent abc) { ActiveBox ab = null; if (skin != null) ab = skin.getMsgBox(); if (ab != null) { ab.clear(); ab.setContent(abc == null ? ActiveBoxContent.getEmptyContent() : abc); } } public void playMsg() { if (skin != null && skin.getMsgBox() != null) { skin.getMsgBox().playMedia(this); } } public void incCounterValue(int counterId) { counterVal[counterId]++; Counter c = null; if (skin != null && (c = skin.getCounter(counterId)) != null) c.setValue(counterVal[counterId]); if (counterId == ACTIONS_COUNTER && actPanel != null && actPanel.getActivity().maxActions > 0 && actPanel.isPlaying() && counterVal[ACTIONS_COUNTER] >= actPanel.getActivity().maxActions) { SwingUtilities.invokeLater(new Runnable() { public void run() { actPanel.finishActivity(actPanel.solved); } }); } } public void setCountDown(int counterId, int maxValue) { Counter c = null; if (skin != null && (c = skin.getCounter(counterId)) != null) c.setCountDown(maxValue); } public void setCounterValue(int counterId, int newValue) { counterVal[counterId] = newValue; Counter c = null; if (skin != null && (c = skin.getCounter(counterId)) != null) c.setValue(newValue); } public int getCounterValue(int counterId) { return counterVal[counterId]; } public void setCounterEnabled(int counterId, boolean bEnabled) { if (skin != null) { skin.enableCounter(counterId, bEnabled); setCountDown(counterId, 0); } } public Messages getMessages() { return (messages == null ? setMessages() : messages); } public void setWaitCursor(boolean state) { if (skin != null) { skin.setWaitCursor(state); } } public void setSystemMessage(String msg1, String msg2) { if (skin != null) skin.setSystemMessage(msg1, msg2); if (trace) System.out.println("MSG " + (msg1 == null ? "" : msg1 + " ") + (msg2 == null ? "" : msg2)); } public JComponent getComponent() { return this; } public ActiveMediaPlayer getActiveMediaPlayer(MediaContent mediaContent) { if (activeMediaBag != null && mediaContent != null) return activeMediaBag.getActiveMediaPlayer(mediaContent, project.mediaBag, this); else return null; } /** * Gets the custom cursor corresponding to the indicated type * * @param type Type of cursor. * @return The requested cursor, or the default system cursor if not found. */ public Cursor getCustomCursor(int type) { if (type >= 0 && type < cursors.length) return cursors[type]; else return null; } public void reportNewActivity(Activity act, int currentScore) { ActivitySequenceElement ase = project.activitySequence.getCurrentAct(); if (reporter != null) { if (ase.getTag() != null && !ase.getTag().equals(reporter.getCurrentSequenceTag())) reporter.newSequence(ase); if (act.includeInReports) reporter.newActivity(act); } setCounterValue(ACTIONS_COUNTER, 0); setCounterValue(SCORE_COUNTER, 0); } public void reportNewAction(Activity act, String type, String source, String dest, boolean ok, int currentScore) { if (reporter != null && act.includeInReports && act.reportActions) reporter.newAction(type, source, dest, ok); if (currentScore >= 0) { incCounterValue(ACTIONS_COUNTER); setCounterValue(SCORE_COUNTER, currentScore); } } public void reportEndActivity(Activity act, boolean solved) { if (reporter != null && act.includeInReports) reporter.endActivity(counterVal[SCORE_COUNTER], counterVal[ACTIONS_COUNTER], solved); } public boolean showHelp(JComponent hlpComponent, String hlpMsg) { if (skin != null) { skin.showHelp(hlpComponent, hlpMsg); return true; } return false; } public InputStream getProgressInputStream(InputStream is, int expectedLength, String name) { if (skin != null && is != null && !(is instanceof ByteArrayInputStream)) { is = skin.getProgressInputStream(is, expectedLength, name); } return is; } public Options getOptions() { return options; } public PlayerHistory getHistory() { return history; } public void displayUrl(String url, boolean inFrame) { if (url != null) { url = project.getFileSystem().getUrl(url); try { displayUrl(new URL(url), inFrame); } catch (Exception ex) { System.err.println("Unable to invoque URL " + url + "\n" + ex); } } } public void displayUrl(URL url, boolean inFrame) { if (url == null) return; Applet applet = options.getApplet(); try { if (applet != null && !options.getBoolean(Options.MAC)) { if (inFrame) { String frame = (String) options.get(INFO_URL_FRAME); if (frame == null) frame = "_BLANK"; applet.getAppletContext().showDocument(url, frame); } else { end(); applet.getAppletContext().showDocument(url); } } else { BrowserLauncher.openURL(url.toExternalForm()); } } catch (Exception ex) { System.err.println("Unable to invoque URL " + url + "\n" + ex); } } public void exit() { exit(null); } public void exit(String url) { final String sUrl = (url == null ? options.getString(EXIT_URL) : url); SwingUtilities.invokeLater(new Runnable() { public void run() { if (sUrl != null) { displayUrl(sUrl, false); } if (options.getApplet() == null) { try { end(); Frame fr = JOptionPane.getFrameForComponent(getTopComponent()); if (fr != null) fr.dispose(); else System.exit(0); } catch (Exception ex) { System.err.println("Unable to exit!\n" + ex); } } } }); } @Override public void requestFocus() { if (actPanel != null) actPanel.requestFocus(); } public String getMsg(String key) { return messages.get(key); } public void doAutoStart() { } public boolean newInstanceRequest(final String param1, final String param2) { boolean result = false; if (param1 != null) { SwingUtilities.invokeLater(new Runnable() { public void run() { Frame frame = JOptionPane.getFrameForComponent(Player.this); if (frame != null) frame.toFront(); load(param1, param2); } }); result = true; } return result; } public boolean windowCloseRequested() { return true; } public void setWindowTitle(String docTitle) { Window w = Options.getWindowForComponent(this); if (w != null) { StringBuilder sb = new StringBuilder(); String s = StrUtils.nullableString(docTitle); if (s != null) sb.append(s).append(" - "); sb.append(appName); if (w instanceof Frame) ((Frame) w).setTitle(sb.substring(0)); else if (w instanceof Dialog) ((Dialog) w).setTitle(sb.substring(0)); } } public void setWindowTitle() { StringBuilder sb = new StringBuilder(); String prjName = project == null ? null : StrUtils.nullableString(project.getPublicName()); String actName = actPanel == null ? null : StrUtils.nullableString(actPanel.getActivity().getPublicName()); if (actName != null) { sb.append(actName); if (prjName != null) sb.append(" ["); } if (prjName != null) { sb.append(prjName); if (actName != null) sb.append("]"); } setWindowTitle(sb.substring(0)); } /** * FressaFunctions offers special accessibility features like atomatic scanning * and voice synthesis. * * @return The FressaFunctions object, or null if accessibility * features are not enabled */ public edu.xtec.jclic.accessibility.FressaFunctions getFressa() { return null; } } src/core/edu/xtec/jclic/PlayerHistory.java000066400000000000000000000171311335566474600211100ustar00rootroot00000000000000/* * File : PlayerHistory.java * Created : 11-jan-2002 15:31 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.bags.ActivitySequence; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.bags.JumpInfo; import java.util.Stack; /** * PlayerHistory uses a {@link java.util.Stack} object to store the list of * projects and activities done by the user. This class allows * {@link edu.xtec.jclic.Player} objects to rewind a sequence or go back to a * caller menu. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class PlayerHistory { /** The Player this PlayerHistory belongs to */ protected Player player; /** * This is the main member of the class. PlayerHistory puts and * retrieves on it information about the proects and activities done by the * current user. */ protected Stack sequenceStack; /** * When in test mode (for instance, in the Player used by JClic * author to preview activities), jumps are only simulated. */ protected boolean testMode; /** * Creates a new PlayerHistory * * @param player The Player this PlayerHistory belongs * to */ public PlayerHistory(Player player) { this.player = player; sequenceStack = new Stack(); } /** * Counts the number of history elements stored in the stack * * @return The number of stored elements */ public int storedElementsCount() { return sequenceStack.size(); } /** Removes all the elements from the history stack */ public void clearHistory() { sequenceStack.clear(); } /** * PlayerHistory uses this inner class to store history elements. */ protected class HistoryElement { String projectPath; String sequence; int activity; HistoryElement(String path, String seq, int act) { projectPath = path; sequence = seq; activity = act; } } /** * Adds the current Player's project and activity to the top of the * history stack. */ public void push() { if (player.project != null && player.project.getFullPath() != null) { ActivitySequence ase = player.project.activitySequence; int act = ase.getCurrentActNum(); if (act >= 0) { if (!sequenceStack.isEmpty()) { HistoryElement last = sequenceStack.peek(); if (last.projectPath.equals(player.project.getFullPath()) && last.activity == act) return; } sequenceStack.push(new HistoryElement(player.project.getFullPath(), ase.getSequenceForElement(act), act)); } } } /** * Retrieves the history element placed at the top of the stack (if any) and * makes the * Player to load it. The obtained effect is to "rewind" or "go back", * usually to a caller menu or activity. * * @return The current implementation of this method always returns * true. */ public boolean pop() { // todo: check return value if (!sequenceStack.isEmpty()) { HistoryElement e = sequenceStack.pop(); if (e.projectPath.equals(player.project.getFullPath())) player.load(null, Integer.toString(e.activity), null, null); else { if (testMode && e.projectPath != null && e.projectPath.length() > 0) { player.getMessages().showAlert(player, new String[] { player.getMsg("test_alert_jump_to"), e.projectPath }); } else { player.load(e.projectPath, Integer.toString(e.activity), null, null); } } } return true; } /** * Processes the provided JumpInfo object, instructing the * Player to go back, stop or jump to another point in the * sequence. * * @param ji The JumpInfo object to be processed * @param allowReturn When this param is true, the jump instructed * by the * JumpInfo (if any) will be recorded, in order to make possible to * go back to the current activity. * @return true if the jump can be processed without errors. * false otherwise. */ public boolean processJump(JumpInfo ji, boolean allowReturn) { boolean result = false; if (ji != null && player.project != null) { switch (ji.action) { case JumpInfo.STOP: break; case JumpInfo.RETURN: result = pop(); break; case JumpInfo.EXIT: if (testMode) { player.getMessages().showAlert(player, "test_alert_exit"); } else player.exit(ji.sequence); break; case JumpInfo.JUMP: if (ji.sequence == null && ji.projectPath == null) { ActivitySequenceElement ase = player.project.activitySequence.getElement(ji.actNum, true); if (ase != null) { if (allowReturn) push(); player.load(null, null, ase.getActivityName(), null); result = true; } } else { if (testMode && ji.projectPath != null && ji.projectPath.length() > 0) { player.getMessages().showAlert(player, new String[] { player.getMsg("test_alert_jump_to"), ji.projectPath }); } else result = jumpToSequence(ji.sequence, ji.projectPath, allowReturn); } break; } } return result; } private boolean jumpToSequence(String sequence, String path, boolean allowReturn) { if (sequence == null && path == null) return false; if (path == null) path = player.project.getFullPath(); if (!sequenceStack.isEmpty()) { HistoryElement e = sequenceStack.peek(); if (sequence != null && path.equals(e.projectPath)) { boolean same = sequence.equals(e.sequence); if (path.equals(player.project.getFullPath())) { ActivitySequenceElement ase = player.project.activitySequence.getElement(e.activity, false); same = (ase != null && sequence.equals(ase.getTag())); } if (same) return pop(); } } if (allowReturn) push(); if (path.equals(player.project.getFullPath())) player.load(null, sequence, null, null); else player.load(path, sequence, null, null); return true; } /** * Getter for property testMode. * * @return Value of property testMode. */ public boolean isTestMode() { return testMode; } /** * Setter for property testMode. * * @param testMode New value of property testMode. */ public void setTestMode(boolean testMode) { this.testMode = testMode; } } src/core/edu/xtec/jclic/PlayerSettings.java000066400000000000000000000336471335566474600212610ustar00rootroot00000000000000/* * File : PlayerSettings.java * Created : 19-jun-2002 10:22 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.project.LibraryManager; import edu.xtec.util.BrowserLauncher; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.LFUtil; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceBridge; import java.awt.Component; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class PlayerSettings extends Object implements Cloneable, edu.xtec.jclic.Constants, Domable { public ResourceBridge rb; public LibraryManager libraryManager; public String language, country, variant; public String reporterClass, reporterParams; public boolean reporterEnabled; public boolean soundEnabled, systemSounds; public String lookAndFeel; public String skin; public Map misc; public String rootPath; public String mediaSystem; public FileSystem fileSystem; public static int MAX_RECENT = 8; public String[] recentFiles; public String preferredBrowser; protected String password; protected boolean passwordConfirmed; public String cfgFile; public boolean readOnly; protected static String defaultCfgFile = null; public static final String PROJECTS_PATH = "projects", CFG_FILE = "jclic.cfg", DEFAULT_SKIN = "@default.xml", DEFAULT_REPORTER = "TCPReporter", DEFAULT_REPORTER_PARAMS = "path=localhost:9000"; public boolean fressaEnabled; /** Creates new PlayerSettings */ public PlayerSettings(ResourceBridge rb, String fromPath /* , Options options */) { this.rb = rb; password = null; misc = new HashMap(); reporterEnabled = false; reporterClass = DEFAULT_REPORTER; reporterParams = DEFAULT_REPORTER_PARAMS; soundEnabled = true; systemSounds = true; lookAndFeel = edu.xtec.util.LFUtil.DEFAULT; preferredBrowser = ""; skin = DEFAULT_SKIN; recentFiles = new String[MAX_RECENT]; mediaSystem = DEFAULT; readOnly = false; rootPath = System.getProperty("user.home"); cfgFile = (fromPath == null ? getDefaultCfgFile(rb.getOptions()) : fromPath); fileSystem = new FileSystem(rb); if (FileSystem.isStrUrl(cfgFile)) { readOnly = true; } else { File f = new File(cfgFile); readOnly = !f.canWrite(); } libraryManager = new LibraryManager(this); passwordConfirmed = false; } public static final String ELEMENT_NAME = "JClicSettings", REPORTER = "reporter", CLASS = "class", PARAMS = "params", SOUND = "sound", SYSTEM = "system", MISC = "misc", PATHS = "paths", PATH = "path", ROOT = "root", RECENT_FILES = "recentFiles", FILE = "file", PASSWORD = "password"; public static String getDefaultCfgFile(Options options) { if (defaultCfgFile == null) { defaultCfgFile = edu.xtec.util.PersistentSettings.getFilePath(PROGRAM, CFG_FILE, options, true); } return defaultCfgFile; } public static PlayerSettings loadPlayerSettings(ResourceBridge rb) { PlayerSettings result = null; String cfgFile = rb.getOptions().getString(ELEMENT_NAME); if (cfgFile != null) { try { result = new PlayerSettings(rb, cfgFile); result.loadSettings(result.fileSystem.getXMLDocument(cfgFile).getRootElement()); } catch (Exception ex) { result = null; System.err.println("Unable to read settings from " + cfgFile + "\n" + ex); } } if (result == null) { cfgFile = getDefaultCfgFile(rb.getOptions()); result = new PlayerSettings(rb, cfgFile); try { result.loadSettings(result.fileSystem.getXMLDocument(cfgFile).getRootElement()); } catch (Exception ex) { result.initNewSettings(); } } rb.getOptions().syncProperties(result.getProperties(), true); if (!rb.getOptions().getBoolean(Options.LANGUAGE_BY_PARAM) && result.language != null) { rb.getOptions().put(Messages.LANGUAGE, result.language); if (result.country != null) { rb.getOptions().put(Messages.COUNTRY, result.country); } if (result.variant != null) { rb.getOptions().put(Messages.VARIANT, result.variant); } } return result; } private void initNewSettings() { try { Messages msg = rb.getOptions().getMessages(); if (language == null) { language = msg.getLocale().getLanguage(); country = msg.getLocale().getCountry(); variant = msg.getLocale().getVariant(); } readOnly = false; File f = new File(new File(cfgFile).getParentFile(), PROJECTS_PATH); f.mkdirs(); rootPath = f.getAbsolutePath(); fileSystem = new FileSystem(rootPath, rb); } catch (Exception ex) { System.err.println("Unable to create new settings!\n" + ex); } } public void checkLibrary() { if (!readOnly && libraryManager.isEmpty() && rootPath != null && !FileSystem.isStrUrl(rootPath)) { File f = new File(new File(rootPath), "library.jclic"); try { libraryManager.addNewLibrary(f.getAbsolutePath(), null); save(); } catch (Exception ex) { System.err.println("Unable to create new project library!\n" + ex); } } } public void save() { if (!readOnly) { try { FileOutputStream fos = fileSystem.createSecureFileOutputStream(cfgFile, false); JDomUtility.saveDocument(fos, getJDomElement()); fos.close(); } catch (Exception ex) { System.err.println("unable to save settings in " + cfgFile + ": " + ex.getMessage()); } } } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); org.jdom.Element child, child2; e.addContent(libraryManager.getJDomElement()); if (password != null) { e.setAttribute(PASSWORD, edu.xtec.util.Encryption.Encrypt(password)); } if (language != null) { child = new org.jdom.Element(Messages.LANGUAGE); child.setAttribute(ID, language); if (country != null) { child.setAttribute(Messages.COUNTRY, country); } if (variant != null) { child.setAttribute(Messages.VARIANT, variant); } e.addContent(child); } child = new org.jdom.Element(PATHS); child2 = new org.jdom.Element(PATH); child2.setAttribute(ID, ROOT); child2.setAttribute(PATH, rootPath); child.addContent(child2); e.addContent(child); child = new org.jdom.Element(REPORTER); child.setAttribute(ENABLED, JDomUtility.boolString(reporterEnabled)); child.setAttribute(CLASS, reporterClass); child.setAttribute(PARAMS, reporterParams); e.addContent(child); child = new org.jdom.Element(SOUND); child.setAttribute(ENABLED, JDomUtility.boolString(soundEnabled)); child.setAttribute(SYSTEM, JDomUtility.boolString(systemSounds)); child.setAttribute(MEDIA_SYSTEM, mediaSystem); e.addContent(child); child = new org.jdom.Element(LFUtil.LOOK_AND_FEEL); child.setAttribute(ID, lookAndFeel); e.addContent(child); child = new org.jdom.Element(BrowserLauncher.BROWSER); child.setAttribute(ID, preferredBrowser); e.addContent(child); child = new org.jdom.Element(SKIN); child.setAttribute(ID, skin); e.addContent(child); if (!misc.isEmpty()) { child = new org.jdom.Element(MISC); for (java.util.Map.Entry me : misc.entrySet()) { String k = (String) me.getKey(); Object v = me.getValue(); if (k != null && v != null && v instanceof String) { child.setAttribute(k, (String) v); } } e.addContent(child); } child = new org.jdom.Element(RECENT_FILES); for (int i = 0; i < MAX_RECENT; i++) { if (recentFiles[i] != null) { child2 = new org.jdom.Element(FILE); child2.setAttribute(PATH, recentFiles[i]); child.addContent(child2); } } e.addContent(child); return e; } public void loadSettings(org.jdom.Element e) throws Exception { setProperties(e, null); } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child, child2; password = JDomUtility.getStringAttr(e, PASSWORD, password, false); if (password != null) { password = edu.xtec.util.Encryption.Decrypt(password); } if ((child = e.getChild(LibraryManager.ELEMENT_NAME)) != null) { libraryManager = LibraryManager.getLibraryManager(this, child); } if ((child = e.getChild(PATHS)) != null) { String rp = null; Iterator it = child.getChildren(PATH).iterator(); while (it.hasNext()) { child2 = (org.jdom.Element) it.next(); if (ROOT.equals(child2.getAttributeValue(ID))) { rp = JDomUtility.getStringAttr(child2, PATH, rootPath, false); } } if (rp != null) { rootPath = rp; if (!FileSystem.isStrUrl(rootPath)) { fileSystem = new FileSystem(rootPath, rb); } } } if ((child = e.getChild(Messages.LANGUAGE)) != null) { language = JDomUtility.getStringAttr(child, ID, language, false); country = JDomUtility.getStringAttr(child, Messages.COUNTRY, country, false); variant = JDomUtility.getStringAttr(child, Messages.VARIANT, variant, false); } if ((child = e.getChild(REPORTER)) != null) { reporterEnabled = JDomUtility.getBoolAttr(child, ENABLED, reporterEnabled); reporterClass = JDomUtility.getStringAttr(child, CLASS, reporterClass, false); reporterParams = JDomUtility.getStringAttr(child, PARAMS, reporterParams, false); } if ((child = e.getChild(SOUND)) != null) { soundEnabled = JDomUtility.getBoolAttr(child, ENABLED, soundEnabled); systemSounds = JDomUtility.getBoolAttr(child, SYSTEM, systemSounds); mediaSystem = JDomUtility.getStringAttr(child, MEDIA_SYSTEM, mediaSystem, false); } if ((child = e.getChild(LFUtil.LOOK_AND_FEEL)) != null) { lookAndFeel = JDomUtility.getStringAttr(child, ID, lookAndFeel, false); } if ((child = e.getChild(BrowserLauncher.BROWSER)) != null) { preferredBrowser = JDomUtility.getStringAttr(child, ID, preferredBrowser, false); BrowserLauncher.setPreferredBrowser(preferredBrowser); } if ((child = e.getChild(SKIN)) != null) { skin = JDomUtility.getStringAttr(child, ID, skin, false); } if ((child = e.getChild(MISC)) != null) { java.util.Iterator it = child.getAttributes().iterator(); while (it.hasNext()) { org.jdom.Attribute a = (org.jdom.Attribute) it.next(); misc.put(a.getName(), a.getValue()); } } if ((child = e.getChild(RECENT_FILES)) != null) { java.util.Iterator it = child.getChildren(FILE).iterator(); for (int i = 0; i < MAX_RECENT; i++) { if (it.hasNext()) { recentFiles[i] = JDomUtility.getStringAttr(((org.jdom.Element) it.next()), PATH, null, false); } else { recentFiles[i] = null; } } } } public Messages getMessages() { return rb.getOptions().getMessages(); } public Map getProperties() { HashMap prop = new HashMap(); String t = TRUE; String f = FALSE; if (language != null) { prop.put(Messages.LANGUAGE, language); prop.put(Messages.COUNTRY, country); prop.put(Messages.VARIANT, variant); } if (reporterEnabled) { prop.put(REPORTER_CLASS, reporterClass); prop.put(REPORTER_PARAMS, reporterParams); } prop.put(SYSTEM_SOUNDS, systemSounds ? t : f); prop.put(AUDIO_ENABLED, soundEnabled ? t : f); prop.put(LFUtil.LOOK_AND_FEEL, lookAndFeel); prop.put(BrowserLauncher.BROWSER, preferredBrowser); prop.put(MEDIA_SYSTEM, mediaSystem); prop.put(SKIN, skin); prop.putAll(misc); return prop; } public boolean edit(Component parent) { boolean result = false; if (promptPassword(parent, null)) { PlayerSettingsDlg dlg = new PlayerSettingsDlg(this, parent); dlg.setVisible(true); result = dlg.result; if (result) { BrowserLauncher.setPreferredBrowser(preferredBrowser); } } return result; } public boolean promptPassword(Component parent, String[] msgKeys) { boolean result = (passwordConfirmed || password == null || password.length() == 0); while (!result) { if (msgKeys == null) { msgKeys = new String[] { "settings_passwordRequired" }; } String r = getMessages().showInputDlg(parent, msgKeys, null, null, null, true); if (r == null) { break; } result = password.equals(r); if (!result) { getMessages().showAlert(parent, "PASSWORD_INCORRECT"); } else { passwordConfirmed = true; } } return result; } public void addRecentFile(String fName) { if (fName != null) { String[] recentBak = recentFiles; recentFiles = new String[MAX_RECENT]; recentFiles[0] = fName.trim(); for (int i = 0, j = 1; i < MAX_RECENT && j < MAX_RECENT; i++) { if (recentBak[i] != null && !recentBak[i].equals(fName)) { recentFiles[j++] = recentBak[i]; } } } } } src/core/edu/xtec/jclic/PlayerSettingsDlg.form000066400000000000000000002252471335566474600217310ustar00rootroot00000000000000
src/core/edu/xtec/jclic/PlayerSettingsDlg.java000066400000000000000000001063341335566474600217020ustar00rootroot00000000000000/* * File : PlayerSettingsDlg.java * Created : 20-jun-2002 13:23 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.project.LibraryManager; import edu.xtec.jclic.report.TCPReporter; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class PlayerSettingsDlg extends edu.xtec.util.ExtendedJDialog { PlayerSettings settings; public boolean result; java.awt.Component parent; LibraryManager libraryManager; Messages msg; Map reporterOptions; /** Creates new form SettingsDlg */ public PlayerSettingsDlg(PlayerSettings settings, java.awt.Component parent) { super(parent, "", true); this.parent = parent; this.settings = settings; msg = settings.getMessages(); setTitle(msg.get("settings_title")); try { libraryManager = LibraryManager.getLibraryManager(settings, settings.libraryManager.getJDomElement()); } catch (Exception ex) { msg.showErrorWarning(this, "library_error_clone", ex); libraryManager = settings.libraryManager; } result = false; reporterOptions = new HashMap(); Options.strToMap(settings.reporterParams, reporterOptions, ";", '=', false); initComponents(); checkEnabled(null); centerOver(parent); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.ButtonGroup reportGroup = new javax.swing.ButtonGroup(); javax.swing.ButtonGroup mediaGroup = new javax.swing.ButtonGroup(); javax.swing.JTabbedPane mainPane = new javax.swing.JTabbedPane(); javax.swing.JPanel securityPane = new javax.swing.JPanel(); pwdCheck = new javax.swing.JCheckBox(); javax.swing.JLabel pwdLb1 = new javax.swing.JLabel(); pwdField1 = new javax.swing.JPasswordField(settings.password, 20); javax.swing.JLabel pwdLb2 = new javax.swing.JLabel(); pwdField2 = new javax.swing.JPasswordField(settings.password, 20); javax.swing.JPanel generalPane = new javax.swing.JPanel(); javax.swing.JLabel lookLb = new javax.swing.JLabel(); lookCombo = new javax.swing.JComboBox(edu.xtec.util.LFUtil.VALUES); javax.swing.JLabel skinLb = new javax.swing.JLabel(); skinCombo = new javax.swing.JComboBox(edu.xtec.jclic.skins.Skin.getSystemSkinList(false)); javax.swing.JLabel langLb = new javax.swing.JLabel(); langCombo = new javax.swing.JComboBox(Messages.getDescriptiveLanguageCodes(msg.getLocale())); javax.swing.JLabel countryLb = new javax.swing.JLabel(); countryField = new javax.swing.JTextField(); javax.swing.JLabel variantLb = new javax.swing.JLabel(); variantField = new javax.swing.JTextField(); javax.swing.JLabel browserLb = new javax.swing.JLabel(); browserField = new javax.swing.JTextField(); javax.swing.JPanel reportPane = new javax.swing.JPanel(); reportChk = new javax.swing.JCheckBox(); javax.swing.JPanel reportOptionsPanel = new javax.swing.JPanel(); tcpBtn = new javax.swing.JRadioButton(); javax.swing.JLabel rpAddressLb = new javax.swing.JLabel(); rpAddressTxt = new javax.swing.JTextField(); jdbcBtn = new javax.swing.JRadioButton(); javax.swing.JLabel rpDriverLb = new javax.swing.JLabel(); rpDriverTxt = new javax.swing.JTextField(); javax.swing.JLabel rpUrlLb = new javax.swing.JLabel(); rpUrlTxt = new javax.swing.JTextField(); javax.swing.JLabel rpUserLb = new javax.swing.JLabel(); rpUserTxt = new javax.swing.JTextField(); javax.swing.JLabel rpPwdLb = new javax.swing.JLabel(); rpPwdTxt = new javax.swing.JPasswordField(); otherBtn = new javax.swing.JRadioButton(); javax.swing.JLabel rpClassLb = new javax.swing.JLabel(); rpClassTxt = new javax.swing.JTextField(); javax.swing.JLabel rpParamsLb = new javax.swing.JLabel(); rpParamsTxt = new javax.swing.JTextField(); javax.swing.JPanel mediaPane = new javax.swing.JPanel(); soundEnabledChk = new javax.swing.JCheckBox(); javax.swing.JPanel mediaSystemPanel = new javax.swing.JPanel(); mDefaultBtn = new javax.swing.JRadioButton(); mJMFbtn = new javax.swing.JRadioButton(); mQTbtn = new javax.swing.JRadioButton(); systemSoundsChk = new javax.swing.JCheckBox(); javax.swing.JPanel libraryPane = new javax.swing.JPanel(); autoRunLibChk = new javax.swing.JCheckBox(); editLibPanel = libraryManager.getLibraryPane(true, true); javax.swing.JPanel btPanel = new javax.swing.JPanel(); javax.swing.JButton okButton = new javax.swing.JButton(); javax.swing.JButton cancelButton = new javax.swing.JButton(); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); mainPane.setToolTipText(msg.get("settings_report_tooltip")); mainPane.setPreferredSize(new java.awt.Dimension(500, 400)); securityPane.setToolTipText(msg.get("settings_security_tooltip")); securityPane.setLayout(new java.awt.GridBagLayout()); pwdCheck.setSelected(settings.password != null); pwdCheck.setText(msg.get("settings_password_protect")); pwdCheck.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { pwdCheckActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); securityPane.add(pwdCheck, gridBagConstraints); pwdLb1.setText(msg.get("settings_new_password")); pwdLb1.setLabelFor(pwdField1); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); securityPane.add(pwdLb1, gridBagConstraints); pwdField1.setEnabled(settings.password != null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); securityPane.add(pwdField1, gridBagConstraints); pwdLb2.setText(msg.get("settings_new_password_confirm")); pwdLb2.setLabelFor(pwdField2); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); securityPane.add(pwdLb2, gridBagConstraints); pwdField2.setEnabled(settings.password != null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); securityPane.add(pwdField2, gridBagConstraints); mainPane.addTab(msg.get("settings_security"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/security.gif")), securityPane, ""); // NOI18N generalPane.setToolTipText(msg.get("settings_general_tooltip")); generalPane.setLayout(new java.awt.GridBagLayout()); lookLb.setLabelFor(lookCombo); lookLb.setText(msg.get("settings_look")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(lookLb, gridBagConstraints); lookCombo.setSelectedItem(settings.lookAndFeel); lookCombo.setToolTipText(msg.get("settings_look_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(lookCombo, gridBagConstraints); skinLb.setLabelFor(skinCombo); skinLb.setText(msg.get("settings_skin")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(skinLb, gridBagConstraints); skinCombo.setEditable(true); skinCombo.setSelectedItem(settings.skin); skinCombo.setToolTipText(msg.get("settings_skin_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(skinCombo, gridBagConstraints); langLb.setLabelFor(langCombo); langLb.setText(msg.get("settings_language")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(langLb, gridBagConstraints); langCombo.setSelectedItem(Messages.getDescriptiveLanguageCode(settings.language)); langCombo.setToolTipText(msg.get("settings_language_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(langCombo, gridBagConstraints); countryLb.setLabelFor(countryField); countryLb.setText(msg.get("settings_country")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(countryLb, gridBagConstraints); countryField.setText(settings.country); countryField.setToolTipText(msg.get("settings_country_tooltip")); countryField.setMinimumSize(new java.awt.Dimension(75, 21)); countryField.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(countryField, gridBagConstraints); variantLb.setLabelFor(variantField); variantLb.setText(msg.get("settings_variant")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(variantLb, gridBagConstraints); variantField.setText(settings.variant); variantField.setToolTipText(msg.get("settings_variant_tooltip")); variantField.setMinimumSize(new java.awt.Dimension(75, 21)); variantField.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(variantField, gridBagConstraints); browserLb.setText(msg.get("settings_browser")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(browserLb, gridBagConstraints); browserField.setText(settings.preferredBrowser); browserField.setToolTipText(msg.get("settings_browser_tooltip")); browserField.setMinimumSize(new java.awt.Dimension(75, 21)); browserField.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); generalPane.add(browserField, gridBagConstraints); mainPane.addTab(msg.get("settings_general"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/settings.gif")), generalPane, ""); // NOI18N reportPane.setLayout(new java.awt.GridBagLayout()); reportChk.setToolTipText(msg.get("settings_report_use_tooltip")); reportChk.setSelected(settings.reporterEnabled); reportChk.setText(msg.get("settings_report_use")); reportChk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { reportChkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportPane.add(reportChk, gridBagConstraints); reportOptionsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.get("settings_report_type"))); reportOptionsPanel.setLayout(new java.awt.GridBagLayout()); reportGroup.add(tcpBtn); tcpBtn.setSelected(settings.reporterClass.equals("TCPReporter") && (settings.reporterParams == null || settings.reporterParams.indexOf(";") < 0)); tcpBtn.setText(msg.get("settings_report_tcp")); tcpBtn.setToolTipText(msg.get("settings_report_tcp_tooltip")); tcpBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { tcpBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(tcpBtn, gridBagConstraints); rpAddressLb.setText(msg.get("settings_report_address")); rpAddressLb.setLabelFor(rpAddressTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 8, 3, 3); reportOptionsPanel.add(rpAddressLb, gridBagConstraints); rpAddressTxt.setText(Options.getString(reporterOptions, TCPReporter.SERVER_PATH, TCPReporter.DEFAULT_SERVER_PATH)); rpAddressTxt.setToolTipText(msg.get("settings_report_address_tooltip")); rpAddressTxt.setPreferredSize(new java.awt.Dimension(80, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(rpAddressTxt, gridBagConstraints); reportGroup.add(jdbcBtn); jdbcBtn.setSelected(settings.reporterClass.equals("JDBCReporter")); jdbcBtn.setText(msg.get("settings_report_jdbc")); jdbcBtn.setToolTipText(msg.get("settings_report_jdbc_tooltip")); jdbcBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jdbcBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(jdbcBtn, gridBagConstraints); rpDriverLb.setText(msg.get("settings_report_driver")); rpDriverLb.setLabelFor(rpDriverTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 8, 3, 3); reportOptionsPanel.add(rpDriverLb, gridBagConstraints); rpDriverTxt.setText(Options.getString(reporterOptions, "driver", "sun.jdbc.odbc.JdbcOdbcDriver")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(rpDriverTxt, gridBagConstraints); rpUrlLb.setText(msg.get("settings_report_url")); rpUrlLb.setLabelFor(rpUrlTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 8, 3, 3); reportOptionsPanel.add(rpUrlLb, gridBagConstraints); rpUrlTxt.setText(Options.getString(reporterOptions, "url", "jdbc:odbc:JClic")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(rpUrlTxt, gridBagConstraints); rpUserLb.setText(msg.get("settings_report_user")); rpUserLb.setLabelFor(rpUserTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 8, 3, 3); reportOptionsPanel.add(rpUserLb, gridBagConstraints); rpUserTxt.setText(Options.getString(reporterOptions, "system_user", null)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(rpUserTxt, gridBagConstraints); rpPwdLb.setText(msg.get("settings_report_pwd")); rpPwdLb.setLabelFor(rpPwdTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 8, 3, 3); reportOptionsPanel.add(rpPwdLb, gridBagConstraints); rpPwdTxt.setText(Options.getString(reporterOptions, "system_pwd", null)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 0.5; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(rpPwdTxt, gridBagConstraints); reportGroup.add(otherBtn); otherBtn.setSelected(!tcpBtn.isSelected() && !jdbcBtn.isSelected()); otherBtn.setText(msg.get("settings_report_other")); otherBtn.setToolTipText(msg.get("settings_report_other_tooltip")); otherBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { otherBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(otherBtn, gridBagConstraints); rpClassLb.setText(msg.get("settings_report_engine")); rpClassLb.setLabelFor(rpClassTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 8, 3, 3); reportOptionsPanel.add(rpClassLb, gridBagConstraints); rpClassTxt.setText(otherBtn.isSelected() ? settings.reporterClass : null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(rpClassTxt, gridBagConstraints); rpParamsLb.setText(msg.get("settings_report_params")); rpParamsLb.setLabelFor(rpParamsTxt); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 8, 3, 3); reportOptionsPanel.add(rpParamsLb, gridBagConstraints); rpParamsTxt.setText(otherBtn.isSelected() ? settings.reporterParams : null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportOptionsPanel.add(rpParamsTxt, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); reportPane.add(reportOptionsPanel, gridBagConstraints); mainPane.addTab(msg.get("settings_reports"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/report_small.gif")), reportPane, ""); // NOI18N mediaPane.setToolTipText(msg.get("settings_media_tooltip")); mediaPane.setLayout(new java.awt.GridBagLayout()); soundEnabledChk.setSelected(settings.soundEnabled); soundEnabledChk.setText(msg.get("settings_media_enabled")); soundEnabledChk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { soundEnabledChkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mediaPane.add(soundEnabledChk, gridBagConstraints); mediaSystemPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.get("settings_media_system"))); mediaSystemPanel.setLayout(new java.awt.GridBagLayout()); mediaGroup.add(mDefaultBtn); mDefaultBtn.setSelected(edu.xtec.jclic.Constants.DEFAULT.equals(settings.mediaSystem)); mDefaultBtn.setText(msg.get("settings_media_default")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 0, 3); mediaSystemPanel.add(mDefaultBtn, gridBagConstraints); mediaGroup.add(mJMFbtn); mJMFbtn.setSelected(edu.xtec.jclic.Constants.JMF.equals(settings.mediaSystem)); mJMFbtn.setText(msg.get("settings_media_jmf")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 3); mediaSystemPanel.add(mJMFbtn, gridBagConstraints); mediaGroup.add(mQTbtn); mQTbtn.setSelected(edu.xtec.jclic.Constants.QT.equals(settings.mediaSystem)); mQTbtn.setText(msg.get("settings_media_qt")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 3, 3, 3); mediaSystemPanel.add(mQTbtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mediaPane.add(mediaSystemPanel, gridBagConstraints); systemSoundsChk.setSelected(settings.systemSounds); systemSoundsChk.setText(msg.get("settings_media_event_sounds")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); mediaPane.add(systemSoundsChk, gridBagConstraints); mainPane.addTab(msg.get("settings_media"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/audio_on.gif")), mediaPane, ""); // NOI18N libraryPane.setToolTipText(msg.get("settings_library_tooltip")); libraryPane.setLayout(new java.awt.GridBagLayout()); autoRunLibChk.setSelected(libraryManager.autoRun); autoRunLibChk.setText(msg.get("settings_library_autorun")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); libraryPane.add(autoRunLibChk, gridBagConstraints); editLibPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(msg.get("settings_library"))); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); libraryPane.add(editLibPanel, gridBagConstraints); mainPane.addTab(msg.get("settings_library"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/database.gif")), libraryPane, ""); // NOI18N getContentPane().add(mainPane, java.awt.BorderLayout.CENTER); okButton.setText(msg.get("OK")); okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okButtonActionPerformed(evt); } }); btPanel.add(okButton); cancelButton.setText(msg.get("CANCEL")); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); btPanel.add(cancelButton); getContentPane().add(btPanel, java.awt.BorderLayout.SOUTH); pack(); } // //GEN-END:initComponents private void soundEnabledChkActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_soundEnabledChkActionPerformed checkEnabled(soundEnabledChk); } // GEN-LAST:event_soundEnabledChkActionPerformed private void otherBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_otherBtnActionPerformed checkEnabled(reportChk); } // GEN-LAST:event_otherBtnActionPerformed private void jdbcBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_jdbcBtnActionPerformed checkEnabled(reportChk); } // GEN-LAST:event_jdbcBtnActionPerformed private void tcpBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_tcpBtnActionPerformed checkEnabled(reportChk); } // GEN-LAST:event_tcpBtnActionPerformed private void reportChkActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_reportChkActionPerformed checkEnabled(reportChk); } // GEN-LAST:event_reportChkActionPerformed private void pwdCheckActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_pwdCheckActionPerformed checkEnabled(pwdCheck); } // GEN-LAST:event_pwdCheckActionPerformed private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_cancelButtonActionPerformed result = false; closeDialog(null); } // GEN-LAST:event_cancelButtonActionPerformed private void okButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_okButtonActionPerformed if (accept()) { result = true; closeDialog(null); } } // GEN-LAST:event_okButtonActionPerformed public boolean accept() { String p1 = null; if (pwdCheck.isSelected()) { p1 = StrUtils.nullableString(String.copyValueOf(pwdField1.getPassword())); String p2 = StrUtils.nullableString(String.copyValueOf(pwdField2.getPassword())); if (p1 == null || p2 == null || !p1.equals(p2)) { msg.showAlert(this, "PASSWORD_INCORRECT"); return false; } } else settings.password = null; if (tcpBtn.isSelected()) { String server = rpAddressTxt.getText(); if (server == null || server.length() < 1) { msg.showAlert(this, "settings_report_err_server"); return false; } settings.reporterClass = "TCPReporter"; settings.reporterParams = new StringBuilder(TCPReporter.SERVER_PATH).append("=").append(server).substring(0); } else if (jdbcBtn.isSelected()) { String driver = StrUtils.nullableString(rpDriverTxt.getText()); String url = StrUtils.nullableString(rpUrlTxt.getText()); String usr = rpUserTxt.getText(); String pwd = String.copyValueOf(rpPwdTxt.getPassword()); if (driver == null || url == null) { msg.showAlert(this, "settings_report_err"); return false; } settings.reporterClass = "JDBCReporter"; StringBuilder sb = new StringBuilder("driver=").append(driver); sb.append(";url=").append(url); if (usr != null) { sb.append(";system_user=").append(usr); if (pwd != null) sb.append(";system_pwd=").append(pwd); } settings.reporterParams = sb.substring(0); } else { settings.reporterClass = rpClassTxt.getText(); settings.reporterParams = rpParamsTxt.getText(); } settings.password = p1; settings.passwordConfirmed = false; settings.lookAndFeel = (String) lookCombo.getSelectedItem(); settings.preferredBrowser = browserField.getText(); settings.skin = (String) skinCombo.getSelectedItem(); settings.language = Messages.getLanguageFromDescriptive((String) langCombo.getSelectedItem()); settings.country = StrUtils.nullableString(countryField.getText()); settings.variant = StrUtils.nullableString(variantField.getText()); settings.reporterEnabled = reportChk.isSelected(); settings.soundEnabled = soundEnabledChk.isSelected(); if (mJMFbtn.isSelected()) settings.mediaSystem = edu.xtec.jclic.Constants.JMF; else if (mQTbtn.isSelected()) settings.mediaSystem = edu.xtec.jclic.Constants.QT; else settings.mediaSystem = edu.xtec.jclic.Constants.DEFAULT; settings.systemSounds = systemSoundsChk.isSelected(); libraryManager.autoRun = autoRunLibChk.isSelected(); settings.libraryManager = libraryManager; return true; } private void checkEnabled(javax.swing.JComponent cmp) { if (cmp == null || cmp == reportChk) { enable(tcpBtn, reportChk, null); enable(rpAddressTxt, tcpBtn, reportChk); enable(jdbcBtn, reportChk, null); enable(rpDriverTxt, jdbcBtn, reportChk); enable(rpUrlTxt, jdbcBtn, reportChk); enable(rpUserTxt, jdbcBtn, reportChk); enable(rpPwdTxt, jdbcBtn, reportChk); enable(otherBtn, reportChk, null); enable(rpClassTxt, otherBtn, reportChk); enable(rpParamsTxt, otherBtn, reportChk); } if (cmp == null || cmp == pwdCheck) { enable(pwdField1, pwdCheck, null); enable(pwdField2, pwdCheck, null); } if (cmp == null || cmp == soundEnabledChk) { enable(mDefaultBtn, soundEnabledChk, null); enable(mJMFbtn, soundEnabledChk, null); enable(mQTbtn, soundEnabledChk, null); enable(systemSoundsChk, soundEnabledChk, null); } } private void enable(javax.swing.JComponent cmp, javax.swing.JToggleButton tg1, javax.swing.JToggleButton tg2) { if (cmp != null && tg1 != null) { boolean b = tg1.isSelected() && (tg2 == null || tg2.isSelected()); boolean current = cmp.isEnabled(); if (b != current) cmp.setEnabled(b); } } /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt) { // GEN-FIRST:event_closeDialog setVisible(false); dispose(); } // GEN-LAST:event_closeDialog // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox autoRunLibChk; private javax.swing.JTextField browserField; private javax.swing.JTextField countryField; private javax.swing.JPanel editLibPanel; private javax.swing.JRadioButton jdbcBtn; private javax.swing.JComboBox langCombo; private javax.swing.JComboBox lookCombo; private javax.swing.JRadioButton mDefaultBtn; private javax.swing.JRadioButton mJMFbtn; private javax.swing.JRadioButton mQTbtn; private javax.swing.JRadioButton otherBtn; private javax.swing.JCheckBox pwdCheck; private javax.swing.JPasswordField pwdField1; private javax.swing.JPasswordField pwdField2; private javax.swing.JCheckBox reportChk; private javax.swing.JTextField rpAddressTxt; private javax.swing.JTextField rpClassTxt; private javax.swing.JTextField rpDriverTxt; private javax.swing.JTextField rpParamsTxt; private javax.swing.JPasswordField rpPwdTxt; private javax.swing.JTextField rpUrlTxt; private javax.swing.JTextField rpUserTxt; private javax.swing.JComboBox skinCombo; private javax.swing.JCheckBox soundEnabledChk; private javax.swing.JCheckBox systemSoundsChk; private javax.swing.JRadioButton tcpBtn; private javax.swing.JTextField variantField; // End of variables declaration//GEN-END:variables } src/core/edu/xtec/jclic/RunnableComponent.java000066400000000000000000000062161335566474600217250ustar00rootroot00000000000000/* * File : RunnableComponent.java * Created : 26-jun-2002 11:57 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; /** * Interface used to represent complex objects that can be handled by containers * of type {@link edu.xtec.jclic.SingleInstanceJFrame}. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public interface RunnableComponent { /** * Instructs this RunnableComponent to be self-placed into the * specified {@link javax.swing.RootPaneContainer}. * * @param cont The container in wich the component should be placed. * @param constraints The constraints used in the call to the add * method of the Container. This parameter can * be null. */ public void addTo(javax.swing.RootPaneContainer cont, Object constraints); /** * Instructs the RunnableComponent to start working. * * @param param1 First parameter passed to the component. Can be * null. * @param param2 Second parameter passed to the component. Can also be * null. * @return true if the component has been turned on, * false otherwise. */ public boolean start(String param1, String param2); /** Instructs the RunnableComponent to stop working. */ public void stop(); /** * Notifies the component that the main program will be halted soon, and all * resources must be freed. */ public void end(); /** * This method is called when the container gains the focus for the first time * or after have lost it. */ public void activate(); /** * A new instance of the RunnableComponent has been requested by * the user. * * @param param1 First parameter passed to the component. Can be * null. * @param param2 Second parameter passed to the component. Can also be * null. * @return true if the request was successfull, false * otherwise. */ public boolean newInstanceRequest(final String param1, final String param2); /** * Called by the main container when it receives a windowClosing * event. * * @return true if the component can be safely disposed, * false otherwise. */ public boolean windowCloseRequested(); } src/core/edu/xtec/jclic/SingleInstanceJFrame.java000066400000000000000000000235601335566474600222700ustar00rootroot00000000000000/* * File : SingleInstanceJFrame.java * Created : 19-feb-2004 14:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.util.Check; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import edu.xtec.util.StrUtils; import java.awt.Dimension; import java.awt.Toolkit; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.InterruptedIOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class SingleInstanceJFrame extends javax.swing.JFrame implements Constants { public static final String OK = "OK", CANCEL = "CANCEL"; public static final int DEFAULT_TIMEOUT = 1000; RunnableComponent rc; javax.swing.JLabel splashLabel; String project; Options options; boolean trace; String playerClass; SocketThread socketThread; boolean initializing; boolean armed; /** Creates a new instance of SingleInstanceJFrame */ public SingleInstanceJFrame(String playerClass, String[] args, String windowTitle, String logoIcon, String frameIcon, int port) { initializing = true; setDefaultCloseOperation(javax.swing.JFrame.DO_NOTHING_ON_CLOSE); this.playerClass = playerClass; options = new Options(this); project = loadArgs(args, options); if (!checkOtherInstance(port)) { build(playerClass, args, windowTitle, frameIcon, logoIcon); armed = true; } } public boolean isArmed() { return armed; } public static String loadArgs(String[] args, Options options) { String result = null; for (String arg : args) { if (arg != null && arg.length() > 0) { if (arg.startsWith("-")) { String key, value = null; int k = arg.indexOf('='); if (k > 0) { key = arg.substring(1, k); value = arg.substring(k + 1); } else key = arg.substring(1); options.put(key, value); } else result = arg; } } return result; } protected void build(String playerClass, String[] args, String windowTitle, String frameIcon, String logoIcon) { trace = options.getBoolean(TRACE); if (trace) { for (String arg : args) System.out.println(arg); } initComponents(); setTitle(windowTitle); if (frameIcon != null) setIconImage(ResourceManager.getImageIcon(frameIcon).getImage()); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int scrW = (int) screenSize.getWidth(); int scrH = (int) screenSize.getHeight(); splashLabel = new javax.swing.JLabel(" ", ResourceManager.getImageIcon(logoIcon), javax.swing.SwingConstants.CENTER); splashLabel.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); splashLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); splashLabel.setBackground(BG_COLOR); splashLabel.setOpaque(true); getContentPane().add(splashLabel, java.awt.BorderLayout.CENTER); pack(); setBounds((scrW - getWidth()) / 2, (scrH - getHeight()) / 3, scrW - 40, scrH - 80); setLocation((scrW - getWidth()) / 2, (scrH - getHeight()) / 3); if (Check.checkSignature(options, true)) init(); else System.exit(0); } protected void init() { final javax.swing.RootPaneContainer rpc = this; edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { final StringBuilder sb = new StringBuilder(); @Override public Object construct() { try { // build messages Messages messages = edu.xtec.util.PersistentSettings.getMessages(options, DEFAULT_BUNDLE); messages.addBundle(COMMON_SETTINGS); if (splashLabel != null) splashLabel.setText(messages.get("LOADING")); Class c = Class.forName(playerClass); java.lang.reflect.Constructor cons = c.getConstructor(new Class[] { edu.xtec.util.Options.class }); rc = (RunnableComponent) cons.newInstance(new Object[] { options }); } catch (Exception ex) { sb.append("ERROR: Unable to start!\n").append(ex); ex.printStackTrace(System.err); } return rc; } @Override public void finished() { if (getValue() == null) { // no player build! if (splashLabel != null) { String s = sb.substring(0); splashLabel.setText(s); System.err.println(s); } } else { // remove label and place player getContentPane().removeAll(); splashLabel = null; rc.addTo(rpc, java.awt.BorderLayout.CENTER); getRootPane().revalidate(); // load project javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { rc.start(project, null); initializing = false; } }); } } }; if (trace) System.out.println(">>> initializing..."); // launch swingWorker sw.start(); } private void initComponents() { addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(java.awt.event.WindowEvent evt) { if (rc == null || rc.windowCloseRequested()) { if (socketThread != null) socketThread.stopSocketThread(); if (rc != null) { rc.end(); rc = null; } dispose(); } } @Override public void windowActivated(java.awt.event.WindowEvent evt) { if (rc != null) rc.activate(); } @Override public void windowClosed(java.awt.event.WindowEvent evt) { exitForm(evt); } }); } /** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) { if (socketThread != null) socketThread.stopSocketThread(); if (rc != null) { rc.end(); rc = null; } while (socketThread != null) { Thread.yield(); } System.exit(0); } protected boolean checkOtherInstance(int port) { boolean result = false; try { socketThread = new SocketThread(port, DEFAULT_TIMEOUT); } catch (Exception ex) { // socket already created! // eat exception } if (socketThread == null) { try { Socket socket = new Socket(InetAddress.getLocalHost(), port); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); pw.println(playerClass); pw.println(StrUtils.secureString(project)); pw.println(""); pw.flush(); String response = in.readLine(); result = OK.equals(response); socket.close(); } catch (Exception ex) { System.err.println("Socket error: " + ex); } } else { result = false; socketThread.start(); } return result; } protected class SocketThread extends Thread { boolean running; boolean inService; boolean forceSocketClose; ServerSocket ss; int socketTimeOut; SocketThread(int port, int timeOut) throws IOException { ss = new ServerSocket(port); socketTimeOut = timeOut; running = false; } @Override public void run() { try { running = true; ss.setSoTimeout(1000); while (running) { try { inService = false; Socket socket = ss.accept(); inService = true; BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); String skPlayerClass = StrUtils.secureString(in.readLine()); String skArg1 = StrUtils.nullableString(in.readLine()); String skArg2 = StrUtils.nullableString(in.readLine()); boolean result = rc != null && !initializing && skPlayerClass.equals(playerClass) && skArg1 != null; pw.println(result ? OK : CANCEL); pw.flush(); socket.close(); if (result) rc.newInstanceRequest(skArg1, skArg2); } catch (InterruptedIOException ioex) { // Timeout. start again... } catch (Exception ex) { if (!forceSocketClose) System.err.println("Socket error: " + ex); running = false; } } forceSocketClose = true; ss.close(); } catch (IOException ex) { if (!forceSocketClose) System.err.println("Server socket error: " + ex); } running = false; inService = false; socketThread = null; } public void stopSocketThread() { if (inService) { running = false; } else { try { forceSocketClose = true; ss.close(); } catch (IOException ex) { // eat exception } finally { socketThread = null; running = false; } } } } } src/core/edu/xtec/jclic/accessibility/000077500000000000000000000000001335566474600202535ustar00rootroot00000000000000src/core/edu/xtec/jclic/accessibility/FressaFunctions.java000066400000000000000000000441521335566474600242400ustar00rootroot00000000000000/* * JClic accessibility * FressaFunctionsClass.java * Created on august / 2009 * * @author Jordi Lagares Roset "jlagares@xtec.cat - www.lagares.org" * amb el suport del Departament d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.accessibility; import edu.xtec.jclic.Activity; import edu.xtec.jclic.skins.Skin; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.AWTEvent; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.swing.Timer; /** @author jlagares */ public class FressaFunctions { // Constants public static final String BUNDLE = "messages.AccessibilityMessages"; public static final String FRESSA_VERSION = "v: alfa 99 - 23/07/2010"; public static final int DEFAULT_TIMER_SPAN = 12; public static final int MAX_SCANNING_ZONES = 3; public static final int BUTTONS_ZONE = 0; public static final int PUZZLE_ZONE = 1; public static final int ASSOCIATION_ZONE = 2; public static final int MAX_POINTS_PER_ZONE = 1000; public static final Rectangle INITIAL_FORM_EXCHANGE_POS = new Rectangle(100, 100, 45, 30); public static final int SCAN_ACTIVATION_DELAY = 5000; public static final int SCAN_ACTIVATION_CHECK_SPAN = 1000; public static final int SWAYING_ACTIVATION_DELAY = 400; public static final int SWAYING_SPAN = 100; public static final int SWAYING_AMOUNT = 2; // Static variables public static boolean noHandCursor = false; public static boolean forceRectangularShapes = false; // Global settings public boolean scanIncludingArrowButtons = true; public boolean withChangeZoneButton = false; public boolean scanArrowsAtEndOfActivity = false; public boolean scanFlagButton = false; public boolean jumpWellPlaced = true; public boolean showKeyboard = true; public boolean changeZoneIfNoClick = false; public boolean autoScanOnStart = false; public boolean directedScanOnStart = false; public boolean autoAutoScan = false; public boolean weAreAtTheStart = true; public int scanTimerSpan = DEFAULT_TIMER_SPAN; // TFormKeyboard settings public boolean mustDisableScanTimer = false; public boolean isScanning = false; public boolean isAutoScanning = false; public boolean isDirectedScanning = false; // Transient properties // Needed to know where the buttons are placed Skin skin; Activity.Panel actPanel; String activityType; // Scanning points boolean isFirstScreen = false; int place; int numberOfZones; int currentZone; int px[][] = new int[MAX_SCANNING_ZONES][MAX_POINTS_PER_ZONE]; int py[][] = new int[MAX_SCANNING_ZONES][MAX_POINTS_PER_ZONE]; int zonePoints[] = new int[MAX_SCANNING_ZONES]; // In case we need to read the contents of the cells public String sll[][] = new String[MAX_SCANNING_ZONES][MAX_POINTS_PER_ZONE]; int clickNumber = 1; boolean activityFinished = false; TFormExchange formExchange; TFormKeyboard formKeyboard; boolean activityWithKeyboard = false; // JClic Rectangle actPanelRectangle; Rectangle oldActPanelRectangle; Point actPanelRectangleMiddleBottom; // Voice synthesis boolean withVoice = true; boolean readLabels = false; // *** >> public FressaVoice fressaVoice; // Timers Timer scanTimer; Timer autoScanActivationTimer; long tickCountTime; int cursorPosX; int cursorPosY; // Swaying boolean withSwaying = false; int swayingCounter = 0; int swayingCursorX; int swayingCursorY; Timer swayingTimer; Timer directedScanStartSwayingTimer; // Robot Robot robot; // Messages Messages msg; // Keys for storing options public static final String SCAN_TIMER_SPAN = "scanTimerSpan", SCAN_INCLUDING_ARROWS = "scanIncludingArrows", CHANGE_ZONE_BUTTON = "changeZoneButton", SCAN_ARROWS_AT_END = "scanArrowsAtEnd", SCAN_FLAG = "scanFlag", JUMP_WELL_PLACED = "jumpWellPlaced", SHOW_KEYBOARD = "showKeyboard", CHANGE_ZONE_IF_NO_CLICK = "changeZoneIfNoClick", AUTO_SCAN_ON_START = "autoScanOnStart", DIRECTED_SCAN_ON_START = "directedScanOnStart", AUTO_AUTO_SCAN = "autoAutoScan", SWAYING = "swaying", NO_HAND_CURSOR = "noHandCursor", FORCE_RECTANGLES = "forceRectangles", READ_LABELS = "readLabels", WITH_VOICE = "withVoice"; public FressaFunctions(Options options) { msg = options.getMessages(BUNDLE); try { robot = new Robot(); } catch (java.awt.AWTException ex) { System.err.println("Unable to create java.awt.Robot: " + ex.getMessage()); } formExchange = new TFormExchange(INITIAL_FORM_EXCHANGE_POS, msg.get("acc_exchangeBtnChar")); formKeyboard = new TFormKeyboard(options, this); noHandCursor = options.getBoolean(NO_HAND_CURSOR, false); forceRectangularShapes = options.getBoolean(FORCE_RECTANGLES, false); scanTimerSpan = options.getInt(SCAN_TIMER_SPAN, DEFAULT_TIMER_SPAN); scanIncludingArrowButtons = options.getBoolean(SCAN_INCLUDING_ARROWS, true); withChangeZoneButton = options.getBoolean(CHANGE_ZONE_BUTTON, false); scanArrowsAtEndOfActivity = options.getBoolean(SCAN_ARROWS_AT_END, false); scanFlagButton = options.getBoolean(SCAN_FLAG, false); jumpWellPlaced = options.getBoolean(JUMP_WELL_PLACED, true); showKeyboard = options.getBoolean(SHOW_KEYBOARD, true); changeZoneIfNoClick = options.getBoolean(CHANGE_ZONE_IF_NO_CLICK, false); autoScanOnStart = options.getBoolean(AUTO_SCAN_ON_START, false); directedScanOnStart = options.getBoolean(DIRECTED_SCAN_ON_START, false); autoAutoScan = options.getBoolean(AUTO_AUTO_SCAN, false); withSwaying = options.getBoolean(SWAYING, false); readLabels = options.getBoolean(READ_LABELS, false); withVoice = options.getBoolean(WITH_VOICE, false); if (withVoice) { /* * fressaVoice=new FressaVoice(); fressaVoice.start(); * readText(msg.get("acc_voiceGreeting")); withVoice=fressaVoice.xxxxrunning; */ } } public void startScanning() { if (actPanel != null) { zonePoints[0] = -1; zonePoints[1] = -1; zonePoints[2] = -1; if (withChangeZoneButton && formExchange != null) { formExchange.setVisible(true); } place = 0; isFirstScreen = true; isScanning = true; isAutoScanning = false; isDirectedScanning = false; actPanel.calcScanPoints(); // WARNING: isScanning was just initialized, so it always will be "true": if (formKeyboard != null && activityWithKeyboard && showKeyboard && isScanning) { formKeyboard.isHorizontalScanning = false; formKeyboard.xPos = 0; formKeyboard.yPos = -1; formKeyboard.setVisible(true); formKeyboard.calcFrameSize(); numberOfZones = 1; clickNumber = 1; currentZone = 1; } } } public void stopScanning() { isScanning = false; isAutoScanning = false; isDirectedScanning = false; if (formExchange != null) { formExchange.setVisible(false); } if (formKeyboard != null) { formKeyboard.setVisible(false); } } public void initActivity(Activity.Panel actPanel) { this.actPanel = actPanel; if (formKeyboard.isVisible()) { formKeyboard.setVisible(false); } activityWithKeyboard = false; activityType = actPanel.getActivity().getShortClassName(); // Clear data // WARNING: Avoid the use of fixed-length arrays! for (int i = 0; i < MAX_SCANNING_ZONES; i++) { zonePoints[i] = -1; for (int n = 0; n < MAX_POINTS_PER_ZONE; n++) { px[i][n] = 0; py[i][n] = 0; sll[i][n] = ""; } } currentZone = 0; // Start scanning only buttons place = 0; oldActPanelRectangle.setBounds(0, 0, 0, 0); activityFinished = false; activityWithKeyboard = actPanel.getActivity().needsKeyboard(); if (formKeyboard != null && activityWithKeyboard && showKeyboard && isScanning) { formKeyboard.isHorizontalScanning = false; formKeyboard.xPos = 0; formKeyboard.yPos = -1; formKeyboard.setVisible(true); formKeyboard.calcFrameSize(); numberOfZones = 1; clickNumber = 1; currentZone = 1; } actPanel.calcScanPoints(); if (autoAutoScan) { if (autoScanActivationTimer == null) { enableAutoScanTimer(); } } else if (weAreAtTheStart) { if (autoScanOnStart) { enableAutoScan(); } else if (directedScanOnStart) { enableDirectedScan(); } } weAreAtTheStart = false; if (isAutoScanning) { startScanTimer(); } } public void startSwayingTimer() { if (swayingTimer == null) { swayingTimer = new Timer(SWAYING_SPAN, new ActionListener() { public void actionPerformed(ActionEvent e) { changeSwayingPos(); } }); swayingCounter = 0; Point p = MouseInfo.getPointerInfo().getLocation(); swayingCursorX = p.x; swayingCursorY = p.y; swayingTimer.start(); } if (!swayingTimer.isRunning()) { swayingTimer.start(); } } public void stopSwayingTimer() { if (swayingTimer != null) { swayingCounter = 0; changeSwayingPos(); swayingTimer.stop(); swayingTimer = null; } } public void changeSwayingPos() { int dx = 0; int dy = 0; switch (swayingCounter) { case 0: dx = -1; dy = -1; break; case 1: dx = 1; dy = -1; break; case 2: dx = 1; dy = 1; break; case 3: dx = -1; dy = 1; break; } swayingCounter = ++swayingCounter % 4; if (robot != null) { robot.mouseMove(swayingCursorX + dx * SWAYING_AMOUNT, swayingCursorY + dy * SWAYING_AMOUNT); } } public void startDirectedScanSwayingTimer() { if (swayingTimer == null && directedScanStartSwayingTimer == null) { directedScanStartSwayingTimer = new Timer(SWAYING_ACTIVATION_DELAY, new ActionListener() { public void actionPerformed(ActionEvent e) { startSwayingTimer(); directedScanStartSwayingTimer = null; } }); directedScanStartSwayingTimer.setRepeats(false); directedScanStartSwayingTimer.start(); } } public void disableScanning() { if (withSwaying) { stopSwayingTimer(); } stopScanning(); stopScanTimer(); Toolkit.getDefaultToolkit().removeAWTEventListener(autoScanMouseListener); Toolkit.getDefaultToolkit().removeAWTEventListener(mouseDirectedScanListener); Toolkit.getDefaultToolkit().removeAWTEventListener(directedScanKeyboardListener); if (autoAutoScan) { Point p = MouseInfo.getPointerInfo().getLocation(); cursorPosX = p.x; cursorPosY = p.y; tickCountTime = System.currentTimeMillis(); } } public void enableAutoScan() { disableScanning(); startScanning(); isAutoScanning = true; startScanTimer(); Toolkit.getDefaultToolkit().addAWTEventListener(autoScanMouseListener, AWTEvent.MOUSE_EVENT_MASK); } public void startScanTimer() { if (scanTimer == null) { scanTimer = new Timer(scanTimerSpan * 100, new ActionListener() { public void actionPerformed(ActionEvent e) { if (withSwaying) { stopSwayingTimer(); } actPanel.nextScanPosition(); if (withSwaying) { startSwayingTimer(); } } }); scanTimer.start(); } } public void stopScanTimer() { if (scanTimer != null) { scanTimer.stop(); scanTimer = null; } } private AWTEventListener autoScanMouseListener = new AWTEventListener() { public void eventDispatched(AWTEvent event) { if (isAutoScanning && event instanceof MouseEvent) { MouseEvent me = (MouseEvent) event; if (me.getButton() == MouseEvent.BUTTON1) { if (withSwaying) { stopSwayingTimer(); } // WARNING: Is this really needed? // if(event.getID()==MouseEvent.MOUSE_RELEASED) { // actPanel.ClickLeftButton(); // } } else if (me.getButton() == MouseEvent.BUTTON3) { if (withSwaying) { stopSwayingTimer(); } stopScanning(); stopScanTimer(); Toolkit.getDefaultToolkit().removeAWTEventListener(autoScanMouseListener); } } } }; public void enableAutoScanTimer() { if (autoAutoScan && (autoScanActivationTimer == null || !autoScanActivationTimer.isRunning())) { Point p = MouseInfo.getPointerInfo().getLocation(); cursorPosX = p.x; cursorPosY = p.y; tickCountTime = System.currentTimeMillis(); autoScanActivationTimer = new Timer(SCAN_ACTIVATION_CHECK_SPAN, new ActionListener() { public void actionPerformed(ActionEvent e) { if (!isScanning) { Point p = MouseInfo.getPointerInfo().getLocation(); int x = p.x; int y = p.y; if ((x != cursorPosX) || (y != cursorPosY)) { cursorPosX = x; cursorPosY = y; tickCountTime = System.currentTimeMillis(); } else if (System.currentTimeMillis() - tickCountTime > SCAN_ACTIVATION_DELAY) { enableAutoScan(); } } } }); autoScanActivationTimer.start(); } } // WARNING: Why not recicle timers instead of destroying and creating it every // time? public void disableAutoScanTimer() { if (autoScanActivationTimer != null) { autoScanActivationTimer.stop(); autoScanActivationTimer = null; } } public void enableDirectedScan() { disableScanning(); startScanning(); isDirectedScanning = true; if (withSwaying) { stopSwayingTimer(); } actPanel.nextScanPosition(); if (withSwaying) { stopSwayingTimer(); } Toolkit.getDefaultToolkit().addAWTEventListener(mouseDirectedScanListener, AWTEvent.MOUSE_EVENT_MASK); Toolkit.getDefaultToolkit().addAWTEventListener(directedScanKeyboardListener, AWTEvent.KEY_EVENT_MASK); } private AWTEventListener mouseDirectedScanListener = new AWTEventListener() { public void eventDispatched(AWTEvent event) { if (isDirectedScanning) { MouseEvent me = (MouseEvent) event; if (me.getButton() == MouseEvent.BUTTON1) { if (me.getID() == MouseEvent.MOUSE_RELEASED) { if (withSwaying) { stopSwayingTimer(); } actPanel.clickLeftButton(); if (withSwaying) { startDirectedScanSwayingTimer(); } } } else if (me.getButton() == MouseEvent.BUTTON3) { if (event.getID() == MouseEvent.MOUSE_RELEASED) { if (withSwaying) { stopSwayingTimer(); } actPanel.nextScanPosition(); if (withSwaying) { startSwayingTimer(); } } } } } }; private AWTEventListener directedScanKeyboardListener = new AWTEventListener() { public void eventDispatched(AWTEvent event) { KeyEvent ke = (KeyEvent) event; if (ke.getID() == KeyEvent.KEY_TYPED) { if (ke.getKeyChar() == KeyEvent.VK_ESCAPE) { disableScanning(); } else { // JOptionPane.showMessageDialog(null,ke.getKeyText(ke.getKeyChar()),"JAVA // PLAPHOONS",JOptionPane.INFORMATION_MESSAGE); } } } }; public void clickLeftButton() { if (withChangeZoneButton) { if (activityWithKeyboard && showKeyboard && isScanning) { if (currentZone == 0) { formKeyboard.isHorizontalScanning = false; formKeyboard.xPos = 0; formKeyboard.yPos = -1; formKeyboard.setVisible(true); formKeyboard.calcFrameSize(); numberOfZones = 1; clickNumber = 1; currentZone = 1; } formExchange.changeBgColor(currentZone); return; } if (changeZoneIfNoClick && (activityType.equals("@associations.SimpleAssociation") || activityType.equals("@associations.ComplexAssociation"))) { if (currentZone == 0 || currentZone == 2) { if (place > zonePoints[currentZone]) { if (currentZone == 0 && numberOfZones > 0) { currentZone = 1; place = 0; } else if (currentZone == 2) { currentZone = 0; place = 0; } formExchange.changeBgColor(currentZone); return; } } } else { if (currentZone == 0 || currentZone == 1) { if (place > zonePoints[currentZone]) { if (currentZone == 0 && numberOfZones > 0) { currentZone = 1; place = 0; } else if (currentZone == 1) { currentZone = 0; place = 0; } formExchange.changeBgColor(currentZone); return; } } } } if (numberOfZones == 1) { if (currentZone == 1) { if (!activityType.equals("@panels.InformationScreen") && !activityType.equals("@panels.Explore") && !activityType.equals("@panels.Identify") && !activityType.equals("@textGrid.WordSearch")) { place = 0; } } } else if (numberOfZones == 2) { if (currentZone == 1) { currentZone = 2; place = 0; } else if (currentZone == 2) { currentZone = 1; place = 0; } } } // provisional public void readText(String txt) { } public void calcScanPoints() { } public void activityFinished() { } public void nextScanPosition() { } } src/core/edu/xtec/jclic/accessibility/TFormExchange.java000066400000000000000000000037401335566474600236140ustar00rootroot00000000000000/* * JClic accessibility * TFormExchange.java * Created on august / 2009 * * @author Jordi Lagares Roset "jlagares@xtec.cat - www.lagares.org" * amb el suport del Departament d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.accessibility; import java.awt.Color; import java.awt.Rectangle; import javax.swing.JButton; import javax.swing.JFrame; /** @author jlagares */ public class TFormExchange extends JFrame { public JButton exchangeBtn; public static final Color DEFAULT_COLOR_A = Color.BLUE; public static final Color DEFAULT_COLOR_B = Color.RED; Color colorA = DEFAULT_COLOR_A; Color colorB = DEFAULT_COLOR_B; public TFormExchange(Rectangle r, String btnText) { this(r.x, r.y, r.width, r.height, btnText); } public TFormExchange(int x, int y, int dx, int dy, String btnText) { this(x, y, dx, dy, btnText, DEFAULT_COLOR_A, DEFAULT_COLOR_B); } public TFormExchange(int x, int y, int dx, int dy, String btnText, Color c1, Color c2) { setUndecorated(true); setResizable(false); setLocation(x, y); setSize(dx, dy); colorA = c1; colorB = c2; exchangeBtn = new JButton(); exchangeBtn.setText(btnText); exchangeBtn.setBackground(colorA); getContentPane().add(exchangeBtn); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setAlwaysOnTop(true); } public void changeBgColor(int curZone) { exchangeBtn.setBackground(curZone == 0 ? colorA : colorB); } } src/core/edu/xtec/jclic/accessibility/TFormKeyboard.java000066400000000000000000000647761335566474600236520ustar00rootroot00000000000000/* * JClic accessibility * TFormExchange.java * Created on august / 2009 * * @author Jordi Lagares Roset "jlagares@xtec.cat - www.lagares.org" * amb el suport del Departament d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.accessibility; import edu.xtec.util.Options; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; /** * @author jlagares *

* TODO: Allow different keyboard layouts TODO: Normalize the creation * of icons */ public class TFormKeyboard extends JFrame { JPanel panelPlaphoons; public static final int CELLS_X = 15, CELLS_Y = 5; public static final int DEFAULT_POS_X = 100, DEFAULT_POS_Y = 100; public static final int DEFAULT_WIDTH = 445, DEFAULT_HEIGHT = 160; public static final float FONT_SIZE_INCREMENT = 4.0F; int cellWidth; int cellHeight; JLabel keys[][] = new JLabel[CELLS_X][CELLS_Y]; boolean full[][] = new boolean[CELLS_X][CELLS_Y]; int frameBorder = 1; int frameSpan = 2; int span = frameSpan; boolean isShiftLock = false; boolean isShift = false; int iIsShift, nIsShift; boolean isHorizontalScanning = false; int xPos = 0; int yPos = 0; FressaFunctions fressa; Font font; Font boldFont; public TFormKeyboard(Options options, FressaFunctions fressa) { this.fressa = fressa; setResizable(true); setLocation(DEFAULT_POS_X, DEFAULT_POS_Y); setTitle(options.getMsg("acc_keyboardTitle")); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); panelPlaphoons = new JPanel(); panelPlaphoons.setBackground(Color.white); panelPlaphoons.setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); add(panelPlaphoons, BorderLayout.CENTER); panelPlaphoons.setLayout(null); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); font = (new JLabel()).getFont(); font = font.deriveFont(font.getSize2D() + FONT_SIZE_INCREMENT); boldFont = font.deriveFont(Font.BOLD); java.awt.event.MouseAdapter mAdapter = new java.awt.event.MouseAdapter() { @Override public void mouseReleased(java.awt.event.MouseEvent me) { if (me.getButton() == java.awt.event.MouseEvent.BUTTON1) { plafonsOnClick(me); } } }; for (int i = 0; i < CELLS_X; i++) { for (int n = 0; n < CELLS_Y; n++) { full[i][n] = false; keys[i][n] = new JLabel(); if (i > 0) { keys[i][n].setBorder(BorderFactory.createLineBorder(Color.black, frameBorder)); } keys[i][n].setHorizontalAlignment(javax.swing.SwingConstants.CENTER); keys[i][n].setFont(font); panelPlaphoons.add(keys[i][n]); keys[i][n].addMouseListener(mAdapter); } } lowercase(); setAlwaysOnTop(true); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height)); calcFrameSize(); addComponentListener(new java.awt.event.ComponentAdapter() { @Override public void componentResized(java.awt.event.ComponentEvent evt) { calcFrameSize(); } }); } void sendKey(int t) { if (fressa.robot != null) { fressa.robot.keyPress(t); fressa.robot.keyRelease(t); } isShiftFalse(); } void sendShiftKey(int t) { if (fressa.robot != null) { fressa.robot.keyPress(KeyEvent.VK_SHIFT); fressa.robot.keyPress(t); fressa.robot.keyRelease(t); fressa.robot.keyRelease(KeyEvent.VK_SHIFT); } isShiftFalse(); } void isShiftFalse() { if (isShift) { isShift = false; // WARNING: possible ArrayOutOfBoundsException: keys[iIsShift][nIsShift].setForeground(Color.black); // WARNING: possible unnecessary repaint of all panel: if (isShiftLock) { uppercase(); } else { lowercase(); } } } public void changeScanningPosition() { if (isHorizontalScanning) { xPos++; if (xPos >= CELLS_X) { isHorizontalScanning = false; xPos = 0; yPos = 0; } else { // WARNING: possible outOfBoundsException and NullPointerException: while ((keys[xPos][yPos].getText().equals("")) && (!full[xPos][yPos])) { xPos++; if (xPos >= CELLS_X) { isHorizontalScanning = false; xPos = 0; yPos = 0; break; } } } } else { yPos = (yPos + 1) % CELLS_Y; } int x = keys[xPos][yPos].getLocationOnScreen().x + cellWidth / 2; int y = keys[xPos][yPos].getLocationOnScreen().y + cellHeight / 2; mouseMove(x, y); if (fressa.readLabels && !keys[xPos][yPos].getText().equals("")) { fressa.readText(keys[xPos][yPos].getText()); } } public void doClick() { if (fressa.robot != null) { fressa.robot.mousePress(InputEvent.BUTTON1_MASK); fressa.robot.mouseRelease(InputEvent.BUTTON1_MASK); } } public void mouseMove(int x, int y) { if (fressa.robot != null) { fressa.robot.mouseMove(x, y); } } public void plafonsOnClick(java.awt.event.MouseEvent evt) { // WARNING: Too much "returns" int ic = -1; int nc = -1; if (fressa.actPanel == null) { return; } // WARNINIG: Use SwingUtilities.InvokeLater instead fressa.actPanel.requestFocus(); int wait = 0, maxWait = 10; while (!fressa.actPanel.hasFocus() && ++wait <= maxWait) { try { Thread.sleep(10); } catch (InterruptedException ex) { System.err.println("Error while waiting to transfer focus. " + ex.getMessage()); break; } } if (!fressa.actPanel.hasFocus()) { System.err.println("Accessible keyboard: Error transferring focus!"); return; } for (int i = 0; i < CELLS_X; i++) { for (int n = 0; n < CELLS_Y; n++) { if (evt.getComponent().equals(keys[i][n])) { ic = i; nc = n; break; } } } if ((ic == -1) && (nc == -1)) { return; } fressa.mustDisableScanTimer = true; if (ic == 0) { isHorizontalScanning = true; xPos = 0; changeScanningPosition(); return; } else { isHorizontalScanning = false; xPos = 0; yPos = -1; } if ((nc == 0) && (ic == 14)) { sendKey(KeyEvent.VK_BACK_SPACE); } else if (keys[ic][nc].getText().equals("tab")) { if (isShift) { sendShiftKey(KeyEvent.VK_TAB); } else { sendKey(KeyEvent.VK_TAB); } } else if ((((nc == 1) || (nc == 2)) && (ic == 14)) || ((nc == 0) && (ic == 1))) { sendKey(KeyEvent.VK_ENTER); } else if ((nc == 4) && (ic == 1)) { sendKey(KeyEvent.VK_SPACE); } else if ((nc == 4) && (ic == 2)) { sendKey(KeyEvent.VK_DELETE); } else if ((nc == 4) && (ic == 3)) { sendKey(KeyEvent.VK_LEFT); } else if ((nc == 4) && (ic == 4)) { sendKey(KeyEvent.VK_RIGHT); } else if ((nc == 4) && (ic == 5)) { sendKey(KeyEvent.VK_DOWN); } else if ((nc == 4) && (ic == 6)) { sendKey(KeyEvent.VK_UP); } else if (keys[ic][nc].getText().equals("º")) { } else if (keys[ic][nc].getText().equals("1")) { sendKey(KeyEvent.VK_1); } else if (keys[ic][nc].getText().equals("2")) { sendKey(KeyEvent.VK_2); } else if (keys[ic][nc].getText().equals("3")) { sendKey(KeyEvent.VK_3); } else if (keys[ic][nc].getText().equals("4")) { sendKey(KeyEvent.VK_4); } else if (keys[ic][nc].getText().equals("5")) { sendKey(KeyEvent.VK_5); } else if (keys[ic][nc].getText().equals("6")) { sendKey(KeyEvent.VK_6); } else if (keys[ic][nc].getText().equals("7")) { sendKey(KeyEvent.VK_7); } else if (keys[ic][nc].getText().equals("8")) { sendKey(KeyEvent.VK_8); } else if (keys[ic][nc].getText().equals("9")) { sendKey(KeyEvent.VK_9); } else if (keys[ic][nc].getText().equals("0")) { sendKey(KeyEvent.VK_0); } else if (keys[ic][nc].getText().equals("'")) { sendKey(KeyEvent.VK_QUOTE); } else if (keys[ic][nc].getText().equals("¡")) { sendKey(KeyEvent.VK_INVERTED_EXCLAMATION_MARK); } else if (keys[ic][nc].getText().equals("`")) { sendKey(KeyEvent.VK_DEAD_GRAVE); } else if (keys[ic][nc].getText().equals("+")) { sendKey(KeyEvent.VK_PLUS); } else if (keys[ic][nc].getText().equals("ñ")) { if (fressa.robot != null) { fressa.robot.keyPress(KeyEvent.VK_ALT); fressa.robot.keyPress(KeyEvent.VK_NUMPAD1); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD1); fressa.robot.keyPress(KeyEvent.VK_NUMPAD6); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD6); fressa.robot.keyPress(KeyEvent.VK_NUMPAD4); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD4); fressa.robot.keyRelease(KeyEvent.VK_ALT); } isShiftFalse(); } else if (keys[ic][nc].getText().equals("´")) { sendKey(KeyEvent.VK_DEAD_ACUTE); } else if (keys[ic][nc].getText().equals("ç")) { if (fressa.robot != null) { fressa.robot.keyPress(KeyEvent.VK_ALT); fressa.robot.keyPress(KeyEvent.VK_NUMPAD1); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD1); fressa.robot.keyPress(KeyEvent.VK_NUMPAD3); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD3); fressa.robot.keyPress(KeyEvent.VK_NUMPAD5); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD5); fressa.robot.keyRelease(KeyEvent.VK_ALT); } isShiftFalse(); } else if (keys[ic][nc].getText().equals(",")) { sendKey(KeyEvent.VK_COMMA); } else if (keys[ic][nc].getText().equals(".")) { sendKey(keys[ic][nc].getText().codePointAt(0)); } else if (keys[ic][nc].getText().equals("-")) { sendKey(KeyEvent.VK_MINUS); } else if (keys[ic][nc].getText().equals("<")) { sendKey(KeyEvent.VK_LESS); } else if (keys[ic][nc].getText().equals("ª")) { } else if (keys[ic][nc].getText().equals("!")) { sendShiftKey(KeyEvent.VK_1); } else if (keys[ic][nc].getText().equals("\"")) { sendShiftKey(KeyEvent.VK_2); } else if (keys[ic][nc].getText().equals("·")) { sendShiftKey(KeyEvent.VK_3); } else if (keys[ic][nc].getText().equals("$")) { sendShiftKey(KeyEvent.VK_4); } else if (keys[ic][nc].getText().equals("%")) { sendShiftKey(KeyEvent.VK_5); } else if (keys[ic][nc].getText().equals("&")) { sendShiftKey(KeyEvent.VK_6); } else if (keys[ic][nc].getText().equals("/")) { sendKey(KeyEvent.VK_DIVIDE); } else if (keys[ic][nc].getText().equals("(")) { sendShiftKey(KeyEvent.VK_8); } else if (keys[ic][nc].getText().equals(")")) { sendShiftKey(KeyEvent.VK_9); } else if (keys[ic][nc].getText().equals("=")) { sendShiftKey(KeyEvent.VK_0); } else if (keys[ic][nc].getText().equals("?")) { sendShiftKey(KeyEvent.VK_QUOTE); } else if (keys[ic][nc].getText().equals("¿")) { sendShiftKey(KeyEvent.VK_INVERTED_EXCLAMATION_MARK); } else if (keys[ic][nc].getText().equals("^")) { // sendKey(KeyEvent.VK_CIRCUMFLEX); sendShiftKey(KeyEvent.VK_DEAD_GRAVE); } else if (keys[ic][nc].getText().equals("*")) { sendShiftKey(KeyEvent.VK_PLUS); } else if (keys[ic][nc].getText().equals("¨")) { // sendShiftKey(KeyEvent.VK_DEAD_DIAERESIS); sendShiftKey(KeyEvent.VK_DEAD_ACUTE); } else if (keys[ic][nc].getText().equals("Ç")) { // sendShiftKey("ç".codePointAt(0)); if (fressa.robot != null) { fressa.robot.keyPress(KeyEvent.VK_ALT); fressa.robot.keyPress(KeyEvent.VK_NUMPAD1); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD1); fressa.robot.keyPress(KeyEvent.VK_NUMPAD2); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD2); fressa.robot.keyPress(KeyEvent.VK_NUMPAD8); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD8); fressa.robot.keyRelease(KeyEvent.VK_ALT); } isShiftFalse(); } else if (keys[ic][nc].getText().equals("Ñ")) { // sendShiftKey("ç".codePointAt(0)); if (fressa.robot != null) { fressa.robot.keyPress(KeyEvent.VK_ALT); fressa.robot.keyPress(KeyEvent.VK_NUMPAD1); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD1); fressa.robot.keyPress(KeyEvent.VK_NUMPAD6); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD6); fressa.robot.keyPress(KeyEvent.VK_NUMPAD5); fressa.robot.keyRelease(KeyEvent.VK_NUMPAD5); fressa.robot.keyRelease(KeyEvent.VK_ALT); } isShiftFalse(); } else if (keys[ic][nc].getText().equals(">")) { sendShiftKey(KeyEvent.VK_LESS); } else if (keys[ic][nc].getText().equals(";")) { sendShiftKey(KeyEvent.VK_COMMA); } else if (keys[ic][nc].getText().equals(":")) { sendShiftKey(".".codePointAt(0)); } else if (keys[ic][nc].getText().equals("_")) { sendShiftKey(KeyEvent.VK_MINUS); } else if (keys[ic][nc].getText().equals("co")) { if (fressa.robot != null && fressa.actPanelRectangleMiddleBottom != null) { mouseMove(fressa.actPanelRectangleMiddleBottom.x, fressa.actPanelRectangleMiddleBottom.y); doClick(); } } else if (keys[ic][nc].getText().equals("<>")) { fressa.currentZone = 0; fressa.place = 0; } else if (keys[ic][nc].getText().equals("BM")) { isShiftLock = !isShiftLock; if (isShift) { isShift = false; keys[iIsShift][nIsShift].setForeground(new java.awt.Color(0, 0, 0)); } if (isShiftLock) { uppercase(); // keys[ic][nc].setBackground(new java.awt.Color(127,127,127)); keys[ic][nc].setForeground(new java.awt.Color(127, 127, 127)); } else { lowercase(); keys[ic][nc].setForeground(new java.awt.Color(0, 0, 0)); } } else if (keys[ic][nc].getText().equals("shi")) { isShift = !isShift; iIsShift = ic; nIsShift = nc; if (isShift) { if (isShiftLock) { lowercase(); } else { uppercase(); } keys[ic][nc].setForeground(new java.awt.Color(127, 127, 127)); } else { if (isShiftLock) { uppercase(); } else { lowercase(); } keys[ic][nc].setForeground(new java.awt.Color(0, 0, 0)); } } else { if (!keys[ic][nc].getText().equals("")) { if (!keys[ic][nc].getText().equals(keys[ic][nc].getText().toUpperCase())) { sendKey(keys[ic][nc].getText().toUpperCase().codePointAt(0)); } else { sendShiftKey(keys[ic][nc].getText().toUpperCase().codePointAt(0)); } } } fressa.mustDisableScanTimer = false; } public void calcFrameSize() { cellWidth = panelPlaphoons.getWidth() / CELLS_X; cellHeight = panelPlaphoons.getHeight() / CELLS_Y; span = frameBorder + frameSpan; for (int i = 0; i < CELLS_X; i++) { for (int n = 0; n < CELLS_Y; n++) { keys[i][n].setVisible(false); keys[i][n].setBounds(frameSpan + cellWidth * i, frameSpan + cellHeight * n, cellWidth - frameSpan, cellHeight - frameSpan); keys[i][n].setVisible(true); } } } void lowercase() { int i = 1; int n = 0; keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("return.gif"))); full[i][n] = true; i++; keys[i][n].setText("1"); full[i][n] = true; i++; keys[i][n].setText("2"); full[i][n] = true; i++; keys[i][n].setText("3"); full[i][n] = true; i++; keys[i][n].setText("4"); full[i][n] = true; i++; keys[i][n].setText("5"); full[i][n] = true; i++; keys[i][n].setText("6"); full[i][n] = true; i++; keys[i][n].setText("7"); full[i][n] = true; i++; keys[i][n].setText("8"); full[i][n] = true; i++; keys[i][n].setText("9"); full[i][n] = true; i++; keys[i][n].setText("0"); full[i][n] = true; i++; keys[i][n].setText("'"); full[i][n] = true; i++; keys[i][n].setText("¡"); full[i][n] = true; i++; // keys[i][n].setText("bac"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("bacspace.gif"))); full[i][n] = true; i++; n++; i = 1; keys[i][n].setText("tab"); full[i][n] = true; i++; keys[i][n].setText("q"); full[i][n] = true; i++; keys[i][n].setText("w"); full[i][n] = true; i++; keys[i][n].setText("e"); full[i][n] = true; i++; keys[i][n].setText("r"); full[i][n] = true; i++; keys[i][n].setText("t"); full[i][n] = true; i++; keys[i][n].setText("y"); full[i][n] = true; i++; keys[i][n].setText("u"); full[i][n] = true; i++; keys[i][n].setText("i"); full[i][n] = true; i++; keys[i][n].setText("o"); full[i][n] = true; i++; keys[i][n].setText("p"); full[i][n] = true; i++; keys[i][n].setText("`"); full[i][n] = true; i++; keys[i][n].setText("+"); full[i][n] = true; i++; // keys[i][n].setText("Ret"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("return.gif"))); full[i][n] = true; i++; n++; i = 1; keys[i][n].setText("BM"); full[i][n] = true; i++; keys[i][n].setText("a"); full[i][n] = true; i++; keys[i][n].setText("s"); full[i][n] = true; i++; keys[i][n].setText("d"); full[i][n] = true; i++; keys[i][n].setText("f"); full[i][n] = true; i++; keys[i][n].setText("g"); full[i][n] = true; i++; keys[i][n].setText("h"); full[i][n] = true; i++; keys[i][n].setText("j"); full[i][n] = true; i++; keys[i][n].setText("k"); full[i][n] = true; i++; keys[i][n].setText("l"); full[i][n] = true; i++; keys[i][n].setText("ñ"); full[i][n] = true; // keys[i][n].setText(""); i++; keys[i][n].setText("´"); full[i][n] = true; i++; keys[i][n].setText("ç"); full[i][n] = true; // keys[i][n].setText(""); i++; // keys[i][n].setText("Ret"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("return.gif"))); full[i][n] = true; i++; n++; i = 1; keys[i][n].setText("shi"); full[i][n] = true; i++; keys[i][n].setText("<"); full[i][n] = true; i++; keys[i][n].setText("z"); full[i][n] = true; i++; keys[i][n].setText("x"); full[i][n] = true; i++; keys[i][n].setText("c"); full[i][n] = true; i++; keys[i][n].setText("v"); full[i][n] = true; i++; keys[i][n].setText("b"); full[i][n] = true; i++; keys[i][n].setText("n"); full[i][n] = true; i++; keys[i][n].setText("m"); full[i][n] = true; i++; keys[i][n].setText(","); full[i][n] = true; i++; keys[i][n].setText("."); full[i][n] = true; i++; keys[i][n].setText("-"); full[i][n] = true; i++; // keys[i][n].setText("shi"); i++; // keys[i][n].setText("A"); n++; i = 1; // keys[i][n].setText("esp"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("espai.gif"))); full[i][n] = true; i++; // keys[i][n].setText("sup"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("delete.gif"))); full[i][n] = true; i++; // keys[i][n].setText("<-"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("esquerra.gif"))); full[i][n] = true; i++; // keys[i][n].setText("->"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("dreta.gif"))); full[i][n] = true; i++; // keys[i][n].setText("|b"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("baixa.gif"))); full[i][n] = true; i++; // keys[i][n].setText("|p"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("puja.gif"))); full[i][n] = true; i++; keys[i][n].setText("<>"); // keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource( // "canviactivitatfletxes.gif" ))); full[i][n] = true; Font f = keys[i][n].getFont(); keys[i][n].setFont(new Font(f.getFontName(), Font.BOLD, f.getSize())); i++; keys[i][n].setText("co"); full[i][n] = true; f = keys[i][n].getFont(); keys[i][n].setFont(new Font(f.getFontName(), Font.BOLD, f.getSize())); i++; // keys[i][n].setText(".->"); keys[i][n].setText(""); f = keys[i][n].getFont(); keys[i][n].setFont(new Font(f.getFontName(), Font.BOLD, f.getSize())); i++; } void uppercase() { int i = 1; int n = 0; // keys[i][n].setText("ª"); // keys[i][n].setText(""); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("return.gif"))); full[i][n] = true; i++; keys[i][n].setText("!"); full[i][n] = true; i++; keys[i][n].setText("\""); full[i][n] = true; i++; keys[i][n].setText("·"); full[i][n] = true; i++; keys[i][n].setText("$"); full[i][n] = true; i++; keys[i][n].setText("%"); full[i][n] = true; i++; keys[i][n].setText("&"); full[i][n] = true; i++; keys[i][n].setText("/"); full[i][n] = true; i++; keys[i][n].setText("("); full[i][n] = true; i++; keys[i][n].setText(")"); full[i][n] = true; i++; keys[i][n].setText("="); full[i][n] = true; i++; keys[i][n].setText("?"); full[i][n] = true; i++; keys[i][n].setText("¿"); full[i][n] = true; i++; // keys[i][n].setText("bac"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("bacspace.gif"))); full[i][n] = true; i++; n++; i = 1; keys[i][n].setText("tab"); full[i][n] = true; i++; keys[i][n].setText("Q"); full[i][n] = true; i++; keys[i][n].setText("W"); full[i][n] = true; i++; keys[i][n].setText("E"); full[i][n] = true; i++; keys[i][n].setText("R"); full[i][n] = true; i++; keys[i][n].setText("T"); full[i][n] = true; i++; keys[i][n].setText("Y"); full[i][n] = true; i++; keys[i][n].setText("U"); full[i][n] = true; i++; keys[i][n].setText("I"); full[i][n] = true; i++; keys[i][n].setText("O"); full[i][n] = true; i++; keys[i][n].setText("P"); full[i][n] = true; i++; keys[i][n].setText("^"); full[i][n] = true; i++; keys[i][n].setText("*"); full[i][n] = true; i++; // keys[i][n].setText("Ret"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("return.gif"))); full[i][n] = true; i++; n++; i = 1; keys[i][n].setText("BM"); full[i][n] = true; i++; keys[i][n].setText("A"); full[i][n] = true; i++; keys[i][n].setText("S"); full[i][n] = true; i++; keys[i][n].setText("D"); full[i][n] = true; i++; keys[i][n].setText("F"); full[i][n] = true; i++; keys[i][n].setText("G"); full[i][n] = true; i++; keys[i][n].setText("H"); full[i][n] = true; i++; keys[i][n].setText("J"); full[i][n] = true; i++; keys[i][n].setText("K"); full[i][n] = true; i++; keys[i][n].setText("L"); full[i][n] = true; i++; keys[i][n].setText("Ñ"); full[i][n] = true; // keys[i][n].setText(""); i++; keys[i][n].setText("¨"); full[i][n] = true; i++; keys[i][n].setText("Ç"); full[i][n] = true; // keys[i][n].setText(""); i++; // keys[i][n].setText("Ret"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("return.gif"))); full[i][n] = true; i++; n++; i = 1; keys[i][n].setText("shi"); full[i][n] = true; i++; keys[i][n].setText(">"); full[i][n] = true; i++; keys[i][n].setText("Z"); full[i][n] = true; i++; keys[i][n].setText("X"); full[i][n] = true; i++; keys[i][n].setText("C"); full[i][n] = true; i++; keys[i][n].setText("V"); full[i][n] = true; i++; keys[i][n].setText("B"); full[i][n] = true; i++; keys[i][n].setText("N"); full[i][n] = true; i++; keys[i][n].setText("M"); full[i][n] = true; i++; keys[i][n].setText(";"); full[i][n] = true; i++; keys[i][n].setText(":"); full[i][n] = true; i++; keys[i][n].setText("_"); full[i][n] = true; i++; // keys[i][n].setText("shi"); i++; n++; i = 1; // keys[i][n].setText("esp"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("espai.gif"))); full[i][n] = true; i++; // keys[i][n].setText("sup"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("delete.gif"))); full[i][n] = true; i++; // keys[i][n].setText("<-"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("esquerra.gif"))); full[i][n] = true; i++; // keys[i][n].setText("->"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("dreta.gif"))); full[i][n] = true; i++; // keys[i][n].setText("|b"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("baixa.gif"))); full[i][n] = true; i++; // keys[i][n].setText("|p"); keys[i][n].setIcon(new javax.swing.ImageIcon(this.getClass().getResource("puja.gif"))); full[i][n] = true; i++; keys[i][n].setText("<>"); full[i][n] = true; Font f = keys[i][n].getFont(); keys[i][n].setFont(boldFont); i++; keys[i][n].setText("co"); full[i][n] = true; f = keys[i][n].getFont(); keys[i][n].setFont(boldFont); i++; // keys[i][n].setText(".->"); keys[i][n].setText(""); f = keys[i][n].getFont(); keys[i][n].setFont(boldFont); i++; } } src/core/edu/xtec/jclic/activities/000077500000000000000000000000001335566474600175705ustar00rootroot00000000000000src/core/edu/xtec/jclic/activities/associations/000077500000000000000000000000001335566474600222675ustar00rootroot00000000000000src/core/edu/xtec/jclic/activities/associations/ComplexAssociation.java000066400000000000000000000162611335566474600267440ustar00rootroot00000000000000/* * File : ComplexAssociation.java * Created : 23-apr-2001 9:57 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.associations; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.event.MouseEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class ComplexAssociation extends SimpleAssociation { int nonAssignedCells; /** Creates new ComplexAssociation */ public ComplexAssociation(JClicProject project) { super(project); nonAssignedCells = 0; invAss = false; useIdAss = true; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, 'A', true, false, 50, 30); abc[1] = ActiveBagContent.initNew(3, 2, '1'); } protected static final String INVERSE = "inverse"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); if (e != null) if (invAss) e.setAttribute(INVERSE, JDomUtility.boolString(invAss)); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); invAss = JDomUtility.getBoolAttr(e, INVERSE, invAss); abc[0].avoidAllIdsNull(abc[1].getNumCells()); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); invAss = c3a.invAss; abc[0].setIds(c3a.ass); } @Override public int getMinNumActions() { if (abc[0] == null || abc[1] == null) return 0; if (invAss) return abc[1].getNumCells(); else return abc[0].getNumCells() - nonAssignedCells; } @Override public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends SimpleAssociation.Panel { boolean[] invAssCheck; protected Panel(PlayStation ps) { super(ps); invAssCheck = null; } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null && abc[1] != null) { if (acp != null) acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, true), ps); if (invAss) { invAssCheck = new boolean[abc[1].getNumCells()]; for (int i = 0; i < invAssCheck.length; i++) invAssCheck[i] = false; } for (int i = 0; i < 2; i++) bg[i] = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[i]); bg[0].setContent(abc[0], abc[2]); bg[1].setContent(abc[1]); bg[0].setDefaultIdAss(); nonAssignedCells = 0; for (int i = 0; i < bg[0].getNumCells(); i++) { ActiveBox bx = bg[0].getActiveBox(i); if (bx.idAss == -1) { nonAssignedCells++; bx.switchToAlt(ps); } } for (int i = 0; i < 2; i++) { bg[i].setVisible(true); } invalidate(); } } private boolean checkInvAss() { int i; if (invAss == false || invAssCheck == null) return false; for (i = 0; i < invAssCheck.length; i++) if (!invAssCheck[i]) break; return i == invAssCheck.length; } @Override public void processMouse(MouseEvent e) { ActiveBox bx1, bx2; java.awt.Point p = e.getPoint(); boolean m = false; if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if (bc.active) { boolean clickOnBg0 = false; bc.end(); if ((bx1 = bg[0].findActiveBox(bc.origin)) != null) { bx2 = bg[1].findActiveBox(/* bc.dest */ p); } else if ((bx2 = bg[1].findActiveBox(bc.origin)) != null) { bx1 = bg[0].findActiveBox(/* bc.dest */ p); clickOnBg0 = true; } if (bx1 != null && bx2 != null && bx1.idAss != -1 && !bx2.isInactive()) { boolean ok = false; String src = bx1.getDescription(); String dest = bx2.getDescription(); if (bx1.idAss == bx2.idOrder || bx2.getContent().isEquivalent(abc[1].getActiveBoxContent(bx1.idAss), true)) { ok = true; bx1.setIdAss(-1); if (abc[2] != null) { bx1.switchToAlt(ps); m |= bx1.playMedia(ps); } else { if (clickOnBg0) m |= bx1.playMedia(ps); else m |= bx2.playMedia(ps); bx1.clear(); } if (invAss) { invAssCheck[bx2.idOrder] = true; bx2.clear(); } if (useOrder) currentItem = bg[0].getNextItem(currentItem); } int cellsOk = bg[0].countCellsWithIdAss(-1); ps.reportNewAction(getActivity(), ACTION_MATCH, src, dest, ok, cellsOk - nonAssignedCells); if (ok && (checkInvAss() || cellsOk == bg[0].getNumCells())) finishActivity(true); else if (!m) playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } else if ((clickOnBg0 && bg[0].contains(p)) || (!clickOnBg0 && bg[1].contains(p))) { // click on grid, out of cell String src = (bx1 != null ? bx1.getDescription() : bx2 != null ? bx2.getDescription() : "null"); ps.reportNewAction(getActivity(), ACTION_MATCH, src, "null", false, bg[1].countCellsWithIdAss(-1)); playEvent(EventSounds.ACTION_ERROR); } } else { if (((bx1 = bg[0].findActiveBox(p)) != null && bx1.idAss != -1 && (!useOrder || bx1.idOrder == currentItem)) || (!useOrder && (bx1 = bg[1].findActiveBox(p)) != null)) { if (dragCells) bc.begin(p, bx1); else bc.begin(p); m |= bx1.playMedia(ps); if (!m) playEvent(EventSounds.CLICK); } } break; case MouseEvent.MOUSE_MOVED: case MouseEvent.MOUSE_DRAGGED: if (bc.active) { bc.moveTo(p); } break; } } } } src/core/edu/xtec/jclic/activities/associations/SimpleAssociation.java000066400000000000000000000310731335566474600265640ustar00rootroot00000000000000/* * File : SimpleAssociation.java * Created : 20-apr-2001 17:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.associations; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.clic3.Clic3Activity; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.util.Iterator; /** * This activity has two {@link edu.xtec.jclic.bags.MediaBag} objects with the * same number of elements. The elements are linked one to one (first A to first * B, second A to second B, etc). * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 * @see Activity */ public class SimpleAssociation extends Activity implements ActiveBagContentKit.Compatible { // for internal use boolean useIdAss; /** * Creates new simpleAssociation * * @param project The project to wich this activity belongs. */ public SimpleAssociation(JClicProject project) { super(project); boxGridPos = AB; scramble[0] = true; scramble[1] = true; abc = new ActiveBagContent[3]; useIdAss = false; } /** Initialisation method for newly created activities. */ @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, 'A'); abc[1] = ActiveBagContent.initNew(3, 2, '1'); } /** * Creates a JDom Element that represents the current object properties, in * order to allow it to be stored into a XML files. * * @return A JDom element representing the activity properties. */ @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex; if (abc[0] == null || abc[1] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement().setAttribute(ID, PRIMARY)); e.addContent(abc[1].getJDomElement().setAttribute(ID, SECONDARY)); if (abc[2] != null) e.addContent(abc[2].getJDomElement().setAttribute(ID, SOLVED_PRIMARY)); ex = new org.jdom.Element(SCRAMBLE); ex.setAttribute(TIMES, Integer.toString(shuffles)); ex.setAttribute(PRIMARY, JDomUtility.boolString(scramble[0])); ex.setAttribute(SECONDARY, JDomUtility.boolString(scramble[1])); e.addContent(ex); ex = new org.jdom.Element(LAYOUT); ex.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]); e.addContent(ex); return e; } /** * Applies to this object the properties previously stored into a JDom Element * usually created by means of a call to the {@link #getJDomElement()} method). * * @param e The JDom element cointaining the data. * @param aux Auxiliary object. Unused here, but has to be * {@link edu.xtec.util.Domable}. * @throws Exception If something goes wrong. */ @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); ActiveBagContent bag; abc[2] = null; Iterator itr = e.getChildren(ActiveBagContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) { child = ((org.jdom.Element) itr.next()); bag = ActiveBagContent.getActiveBagContent(child, project.mediaBag); String id = JDomUtility.getStringAttr(child, ID, PRIMARY, false); if (PRIMARY.equals(id)) abc[0] = bag; else if (SECONDARY.equals(id)) abc[1] = bag; else if (SOLVED_PRIMARY.equals(id)) abc[2] = bag; } if (abc[0] == null || abc[1] == null) throw new IllegalArgumentException("Association without contents!"); if ((child = e.getChild(SCRAMBLE)) != null) { shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); scramble[0] = JDomUtility.getBoolAttr(child, PRIMARY, scramble[0]); scramble[1] = JDomUtility.getBoolAttr(child, SECONDARY, scramble[1]); } if ((child = e.getChild(LAYOUT)) != null) boxGridPos = JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos); } @Override public void setProperties(Clic3Activity c3a) throws Exception { super.setProperties(c3a); // Clic3 problem if (getClass().getSuperclass() == Activity.class) { c3a.nctxw = c3a.ncw; c3a.nctxh = c3a.nch; } // ----- boxGridPos = c3a.graPos; for (int i = 0; i < 2; i++) { abc[i] = c3a.createActiveBagContent(i); abc[i].setBoxBase(c3a.getBoxBase(i)); scramble[i] = c3a.bar[i]; } abc[2] = c3a.sol ? c3a.createActiveBagContent(2) : null; } public int getMinNumActions() { return abc[0] == null ? 0 : abc[0].getNumCells(); } @Override public boolean helpSolutionAllowed() { return true; } @Override public boolean hasRandom() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel { ActiveBoxBag[] bg = new ActiveBoxBag[2]; protected Panel(PlayStation ps) { super(ps); bc = new BoxConnector(this); for (int i = 0; i < 2; i++) { bg[i] = null; } currentItem = 0; } public void clear() { for (int i = 0; i < 2; i++) if (bg[i] != null) { bg[i].end(); bg[i] = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null && abc[1] != null) { if (acp != null) acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, false), ps); for (int i = 0; i < 2; i++) bg[i] = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[i]); for (int i = 0; i < 2; i++) { bg[i].setContent(abc[i], i == 0 ? abc[2] : null); bg[i].setVisible(true); } invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); else firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bg[0] != null && bg[1] != null) { if (scramble[0] || scramble[1]) shuffle(new ActiveBoxBag[] { scramble[0] ? bg[0] : null, scramble[1] ? bg[1] : null }, true, true); if (useOrder) currentItem = bg[0].getNextItem(-1); playing = true; } } public void render(Graphics2D g2, Rectangle dirtyRegion) { for (int i = 0; i < 2; i++) if (bg[i] != null) bg[i].update(g2, dirtyRegion, this); if (bc.active) bc.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (bg[0] == null || bg[1] == null || getSize().equals(preferredMaxSize)) return preferredMaxSize; return BoxBag.layoutDouble(preferredMaxSize, bg[0], bg[1], boxGridPos, margin); } @Override public void processMouse(MouseEvent e) { ActiveBox bx1, bx2; Point p = e.getPoint(); boolean m = false; if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if (bc.active) { boolean clickOnBg0 = false; bc.end(); if ((bx1 = bg[0].findActiveBox(bc.origin)) != null) bx2 = bg[1].findActiveBox(/* bc.dest */ p); else if ((bx2 = bg[1].findActiveBox(bc.origin)) != null) { bx1 = bg[0].findActiveBox(/* bc.dest */ p); clickOnBg0 = true; } if (bx1 != null && bx2 != null && bx1.idAss != -1 && bx2.idAss != -1) { boolean ok = false; String src = bx1.getDescription(); String dest = bx2.getDescription(); if (bx1.idOrder == bx2.idOrder || (bx2.getContent().isEquivalent(abc[1].getActiveBoxContent(bx1.idOrder), true))) { ok = true; bx1.setIdAss(-1); bx2.setIdAss(-1); if (abc[2] != null) { bx1.switchToAlt(ps); m |= bx1.playMedia(ps); } else { if (clickOnBg0) m |= bx1.playMedia(ps); else m |= bx2.playMedia(ps); bx1.clear(); } bx2.clear(); if (useOrder) currentItem = bg[0].getNextItem(currentItem); } int cellsPlaced = bg[1].countCellsWithIdAss(-1); ps.reportNewAction(getActivity(), ACTION_MATCH, src, dest, ok, cellsPlaced); if (ok && cellsPlaced == bg[1].getNumCells()) finishActivity(true); else if (!m) playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } } else { if (((bx1 = bg[0].findActiveBox(p)) != null && (!useOrder || bx1.idOrder == currentItem)) || (!useOrder && (bx1 = bg[1].findActiveBox(p)) != null) && bx1.idAss != -1) { if (dragCells) bc.begin(p, bx1); else bc.begin(p); m = bx1.playMedia(ps); if (!m) playEvent(EventSounds.CLICK); } } break; case MouseEvent.MOUSE_MOVED: case MouseEvent.MOUSE_DRAGGED: if (bc.active) bc.moveTo(p); break; } } @Override public void showHelp() { if (!helpWindowAllowed() || bg[0] == null) return; HelpActivityComponent hac = null; if (showSolution) { hac = new HelpActivityComponent(this) { ActiveBoxBag abb = null; int cellsPlaced = bg[1].countCellsWithIdAss(-1); public void render(Graphics2D g2, Rectangle dirtyRegion) { if (abb != null) abb.update(g2, dirtyRegion, this); } @Override public void init() { abb = (ActiveBoxBag) bg[0].clone(); abb.setContainer(this); Dimension size = abb.getBounds().getSize(); abb.setBounds(DEFAULT_MARGIN, DEFAULT_MARGIN, size.width, size.height); size.width += 2 * DEFAULT_MARGIN; size.height += 2 * DEFAULT_MARGIN; setPreferredSize(size); setMaximumSize(size); setMinimumSize(size); Point p = (Point) getClientProperty(HelpActivityComponent.PREFERRED_LOCATION); if (p != null) p.translate((int) bg[0].x - DEFAULT_MARGIN, (int) bg[0].y - DEFAULT_MARGIN); } @Override public void processMouse(MouseEvent e) { ActiveBox bx; boolean m; if (abb != null) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: bx = abb.findActiveBox(e.getPoint()); if (bx != null) { m = bx.playMedia(ps); if (!m) playEvent(EventSounds.CLICK); if (bx.idAss >= 0) { ActiveBox bxSolution = bg[1].getActiveBox(useIdAss ? bx.idAss : bx.idOrder); markBox(bxSolution, false); if (bxSolution != null) ps.reportNewAction(getActivity(), ACTION_HELP, bx.getDescription(), bxSolution.getDescription(), false, cellsPlaced); } } break; case MouseEvent.MOUSE_RELEASED: unmarkBox(); break; } } }; hac.init(); } if (ps.showHelp(hac, helpMsg)) ps.reportNewAction(getActivity(), ACTION_HELP, null, null, false, bg[1].countCellsWithIdAss(-1)); if (hac != null) hac.end(); } } } src/core/edu/xtec/jclic/activities/memory/000077500000000000000000000000001335566474600211005ustar00rootroot00000000000000src/core/edu/xtec/jclic/activities/memory/MemoryGame.java000066400000000000000000000203061335566474600240060ustar00rootroot00000000000000/* * File : MemoryGame.java * Created : 30-apr-2001 14:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.memory; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.MouseEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class MemoryGame extends Activity implements ActiveBagContentKit.Compatible { /** Creates new MemoryGame */ public MemoryGame(JClicProject project) { super(project); boxGridPos = AB; abc = new ActiveBagContent[2]; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, 'A'); } @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex; if (abc[0] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement().setAttribute(ID, PRIMARY)); if (abc[1] != null) e.addContent(abc[1].getJDomElement().setAttribute(ID, SECONDARY)); ex = new org.jdom.Element(SCRAMBLE); { ex.setAttribute(TIMES, Integer.toString(shuffles)); e.addContent(ex); } ex = new org.jdom.Element(LAYOUT); ex.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]); e.addContent(ex); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); ActiveBagContent bag; abc[1] = null; java.util.Iterator itr = e.getChildren(ActiveBagContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) { child = ((org.jdom.Element) itr.next()); bag = ActiveBagContent.getActiveBagContent(child, project.mediaBag); String id = JDomUtility.getStringAttr(child, ID, PRIMARY, false); if (PRIMARY.equals(id)) abc[0] = bag; else if (SECONDARY.equals(id)) abc[1] = bag; } if (abc[0] == null) throw new IllegalArgumentException("Memory game without ActiveBagContent"); if ((child = e.getChild(SCRAMBLE)) != null) { shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); } if ((child = e.getChild(LAYOUT)) != null) boxGridPos = JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); abc[0] = c3a.createActiveBagContent(0); abc[0].setBoxBase(c3a.getBoxBase(0)); boxGridPos = c3a.graPos; } public int getMinNumActions() { return abc[0] == null ? 0 : abc[0].getNumCells(); } @Override public boolean hasRandom() { return true; } @Override public boolean shuffleAlways() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel { ActiveBoxBag bg; protected Panel(PlayStation ps) { super(ps); bc = new BoxConnector(this); } public void clear() { if (bg != null) { bg.end(); bg = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null) { if (acp != null) { ActiveBagContent[] abcPass = abc[1] == null ? new ActiveBagContent[] { abc[0] } : new ActiveBagContent[] { abc[0], abc[1] }; acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abcPass, false), ps); } int ncw = abc[0].ncw; int nch = abc[0].nch; if (boxGridPos == AB || boxGridPos == BA) ncw *= 2; else nch *= 2; bg = new ActiveBoxGrid(null, this, margin, margin, abc[0].w * ncw, abc[0].h * nch, new edu.xtec.jclic.shapers.Rectangular(ncw, nch), abc[0].bb); int nc = abc[0].getNumCells(); bg.setBorder(abc[0].border); bg.setContent(abc[0], null, 0, 0, nc); bg.setContent((abc[1] != null ? abc[1] : abc[0]), null, 0, nc, nc); for (int i = 0; i < 2; i++) { for (int j = 0; j < nc; j++) { ActiveBox bx = bg.getActiveBox(i * nc + j); bx.setIdAss(j); bx.setInactive(true); } } bg.setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); else firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bg != null) { shuffle(new ActiveBoxBag[] { bg }, false, true); playing = true; } } public void render(Graphics2D g2, Rectangle dirtyRegion) { if (bg != null) bg.update(g2, dirtyRegion, this); if (bc.active) bc.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (bg == null || getSize().equals(preferredMaxSize)) return preferredMaxSize; return BoxBag.layoutSingle(preferredMaxSize, bg, margin); } @Override public void processMouse(MouseEvent e) { ActiveBox bx1, bx2; Point p = e.getPoint(); boolean m; if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if (bc.active) { bc.end(); if ((bx1 = bg.findActiveBox(bc.origin)) != null && (bx2 = bg.findActiveBox(/* bc.dest */ p)) != null && bx1.idAss != -1 && bx2.idAss != -1) { if (bx1 != bx2) { boolean ok = false; if (bx1.idAss == bx2.idAss || bx1.getContent().isEquivalent(bx2.getContent(), true)) { ok = true; bx1.setIdAss(-1); bx2.setIdAss(-1); bx1.setInactive(false); bx2.setInactive(false); } else { bx1.setInactive(true); if (dragCells) bx2.setInactive(true); else { bx2.setInactive(false); bc.begin(p); } } m = bx2.playMedia(ps); int cellsAtPlace = bg.countCellsWithIdAss(-1); ps.reportNewAction(getActivity(), ACTION_MATCH, bx1.getDescription(), bx2.getDescription(), ok, cellsAtPlace / 2); if (ok && cellsAtPlace == bg.getNumCells()) finishActivity(true); else if (!m) playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } else { playEvent(EventSounds.CLICK); bx1.setInactive(true); } } else if (bx1 != null) { bx1.setInactive(true); } repaint(); } else { if ((bx1 = bg.findActiveBox(p)) != null && bx1.idAss != -1) { if (dragCells) bc.begin(p, bx1); else bc.begin(p); m = bx1.playMedia(ps); if (!m) playEvent(EventSounds.CLICK); bx1.setInactive(false); } } break; case MouseEvent.MOUSE_MOVED: case MouseEvent.MOUSE_DRAGGED: bc.moveTo(p); break; } } } } src/core/edu/xtec/jclic/activities/panels/000077500000000000000000000000001335566474600210525ustar00rootroot00000000000000src/core/edu/xtec/jclic/activities/panels/Explore.java000066400000000000000000000175631335566474600233470ustar00rootroot00000000000000/* * File : Explore.java * Created : 27-apr-2001 12:49 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.MouseEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class Explore extends Activity implements ActiveBagContentKit.Compatible { /** Creates new Explore */ public Explore(JClicProject project) { super(project); boxGridPos = AB; abc = new ActiveBagContent[2]; // for(int i=0; i<2; i++) // abc[i]=null; scramble[0] = false; bTimeCounter = bScoreCounter = bActionsCounter = false; includeInReports = false; reportActions = false; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, '1', true, false, 50, 30); abc[1] = ActiveBagContent.initNew(1, 6, 'A'); } @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex; if (abc[0] == null || abc[1] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement().setAttribute(ID, PRIMARY)); e.addContent(abc[1].getJDomElement().setAttribute(ID, SECONDARY)); ex = new org.jdom.Element(SCRAMBLE); { ex.setAttribute(TIMES, Integer.toString(shuffles)); ex.setAttribute(PRIMARY, JDomUtility.boolString(scramble[0])); e.addContent(ex); } ex = new org.jdom.Element(LAYOUT); ex.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]); e.addContent(ex); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); ActiveBagContent bag; java.util.Iterator itr = e.getChildren(ActiveBagContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) { child = ((org.jdom.Element) itr.next()); bag = ActiveBagContent.getActiveBagContent(child, project.mediaBag); String id = JDomUtility.getStringAttr(child, ID, PRIMARY, false); if (PRIMARY.equals(id)) abc[0] = bag; else if (SECONDARY.equals(id)) abc[1] = bag; } if (abc[0] == null || abc[1] == null) throw new IllegalArgumentException("Explore activity without content!"); if ((child = e.getChild(SCRAMBLE)) != null) { shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); scramble[0] = JDomUtility.getBoolAttr(child, PRIMARY, scramble[0]); } if ((child = e.getChild(LAYOUT)) != null) boxGridPos = JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); for (int i = 0; i < 2; i++) { abc[i] = c3a.createActiveBagContent(i); abc[i].setBoxBase(c3a.getBoxBase(i)); } // Clic3 bug abc[1].border = false; abc[0].setIds(c3a.ass); boxGridPos = c3a.graPos; // Clic3 bug: // scramble=c3a.bar[0]; scramble[0] = false; bScoreCounter = bActionsCounter = false; includeInReports = false; reportActions = false; } @Override public boolean mustPauseSequence() { return true; } public int getMinNumActions() { return 0; } @Override public boolean hasRandom() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel { ActiveBoxBag[] bg = new ActiveBoxBag[2]; protected Panel(PlayStation ps) { super(ps); for (int i = 0; i < 2; i++) bg[i] = null; } public void clear() { for (int i = 0; i < 2; i++) if (bg[i] != null) { bg[i].end(); bg[i] = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null && abc[1] != null) { // consider the use of assIds if (acp != null) acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, true), ps); bg[0] = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); // Clic3 behavior!!! double w = abc[1].w; if (boxGridPos == AUB || boxGridPos == BUA) w = abc[0].getTotalWidth(); bg[1] = new ActiveBoxGrid(null, this, margin, margin, w, abc[1].h, new edu.xtec.jclic.shapers.Rectangular(1, 1), abc[1].bb); bg[0].setContent(abc[0]); bg[0].setDefaultIdAss(); bg[1].getActiveBox(0).setInactive(false); bg[0].setVisible(true); bg[1].setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); else firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bg[0] != null && bg[1] != null) { if (scramble[0]) shuffle(new ActiveBoxBag[] { bg[0] }, true, true); if (useOrder) currentItem = bg[0].getNextItem(-1); playing = true; } } public void render(Graphics2D g2, Rectangle dirtyRegion) { for (int i = 0; i < 2; i++) if (bg[i] != null) bg[i].update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (bg[0] == null || bg[1] == null || getSize().equals(preferredMaxSize)) return preferredMaxSize; return BoxBag.layoutDouble(preferredMaxSize, bg[0], bg[1], boxGridPos, margin); } @Override public void processMouse(MouseEvent e) { ActiveBox bx1, bx2; boolean m = false; if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if ((bx1 = bg[0].findActiveBox(e.getPoint())) != null) { bx2 = bg[1].getActiveBox(0); if (bx1.idAss != -1 && (!useOrder || bx1.idOrder == currentItem)) { bx2.setContent(abc[1], bx1.idAss); if (!bx2.playMedia(ps) && !bx1.playMedia(ps)) playEvent(EventSounds.CLICK); if (useOrder) currentItem = bg[0].getNextItem(currentItem); ps.reportNewAction(getActivity(), ACTION_SELECT, bx1.getDescription(), bx2.getDescription(), true, 0); // Clic 3.0 behavior: if (bx1.idAss >= 0 && bx1.idAss < abc[1].getNumCells()) { ActivitySequenceElement ase = project.activitySequence.getCurrentAct(); if (ase != null && project.activitySequence.hasNextAct(true) && ase.delay > 0 && (project.activitySequence.getNavButtonsFlag() & ActivitySequenceElement.NAV_FWD) == 0) { finishActivity(true); } } } else { bx2.clear(); bx2.setInactive(false); } } break; } } } } src/core/edu/xtec/jclic/activities/panels/Identify.java000066400000000000000000000154631335566474600235010ustar00rootroot00000000000000/* * File : Identify.java * Created : 27-apr-2001 10:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.MouseEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class Identify extends Activity implements ActiveBagContentKit.Compatible { int nonAssignedCells; int cellsToMatch; /** Creates new Identify */ public Identify(JClicProject project) { super(project); abc = new ActiveBagContent[2]; scramble[0] = true; nonAssignedCells = 0; cellsToMatch = 1; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, 'A'); abc[0].setAllIdsTo(0); abc[0].defaultIdValue = 0; } @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex; if (abc[0] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement().setAttribute(ID, PRIMARY)); if (abc[1] != null) e.addContent(abc[1].getJDomElement().setAttribute(ID, SOLVED_PRIMARY)); ex = new org.jdom.Element(SCRAMBLE); { ex.setAttribute(TIMES, Integer.toString(shuffles)); ex.setAttribute(PRIMARY, JDomUtility.boolString(scramble[0])); e.addContent(ex); } return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); ActiveBagContent bag; abc[1] = null; java.util.Iterator itr = e.getChildren(ActiveBagContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) { child = ((org.jdom.Element) itr.next()); bag = ActiveBagContent.getActiveBagContent(child, project.mediaBag); String id = JDomUtility.getStringAttr(child, ID, PRIMARY, false); if (PRIMARY.equals(id)) abc[0] = bag; else if (SOLVED_PRIMARY.equals(id)) abc[1] = bag; } if (abc[0] == null) throw new IllegalArgumentException("Identify activity without contents"); if ((child = e.getChild(SCRAMBLE)) != null) { shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); scramble[0] = JDomUtility.getBoolAttr(child, PRIMARY, scramble[0]); } } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); abc[0] = c3a.createActiveBagContent(0); abc[0].setBoxBase(c3a.getBoxBase(0)); abc[0].setIds(c3a.ass); scramble[0] = c3a.bar[0]; abc[1] = c3a.sol ? c3a.createActiveBagContent(2) : null; } public int getMinNumActions() { return cellsToMatch; } @Override public boolean hasRandom() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel { ActiveBoxBag bg; protected Panel(PlayStation ps) { super(ps); bg = null; } public void clear() { if (bg != null) { bg.end(); bg = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null) { // considerar assIds ? if (acp != null) acp.generateContent( new ActiveBagContentKit(abc[0].nch, abc[0].ncw, (new ActiveBagContent[] { abc[0], null, abc[1] }), true), ps); bg = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); bg.setContent(abc[0], abc[1]); bg.setAlternative(false); bg.setDefaultIdAss(); nonAssignedCells = 0; cellsToMatch = 0; for (int i = 0; i < bg.getNumCells(); i++) { ActiveBox bx = bg.getActiveBox(i); int id = bx.idAss; if (id == 1) cellsToMatch++; else if (id == -1) { nonAssignedCells++; bx.switchToAlt(ps); } } bg.setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bg != null) { if (scramble[0]) shuffle(new ActiveBoxBag[] { bg }, true, true); if (useOrder) currentItem = bg.getNextItem(-1, 1); playing = true; } } public void render(Graphics2D g2, Rectangle dirtyRegion) { if (bg != null) bg.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (getSize().equals(preferredMaxSize)) return preferredMaxSize; return BoxBag.layoutSingle(preferredMaxSize, bg, margin); } @Override public void processMouse(MouseEvent e) { ActiveBox bx; boolean m = false; if (playing && e.getID() == MouseEvent.MOUSE_PRESSED) { ps.stopMedia(1); if ((bx = bg.findActiveBox(e.getPoint())) != null) { if (bx.idAss != -1) { boolean ok = false; String src = bx.getDescription(); m |= bx.playMedia(ps); if (bx.idAss == 1 && (!useOrder || bx.idOrder == currentItem)) { ok = true; bx.idAss = -1; if (bx.switchToAlt(ps)) m |= bx.playMedia(ps); else bx.clear(); if (useOrder) currentItem = bg.getNextItem(currentItem, 1); } int cellsOk = bg.countCellsWithIdAss(-1); ps.reportNewAction(getActivity(), ACTION_SELECT, src, null, ok, cellsOk - nonAssignedCells); if (ok && cellsOk == cellsToMatch + nonAssignedCells) finishActivity(true); else if (!m) playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } } } } } } src/core/edu/xtec/jclic/activities/panels/InformationScreen.java000066400000000000000000000105441335566474600253460ustar00rootroot00000000000000/* * File : InformationScreen.java * Created : 22-dec-2000 13:04 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import java.awt.*; import java.awt.event.MouseEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class InformationScreen extends Activity implements ActiveBagContentKit.Compatible { /** Creates new InformationScreen */ public InformationScreen(JClicProject project) { super(project); abc = new ActiveBagContent[1]; includeInReports = false; reportActions = false; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(1, 1, 'A'); } @Override public org.jdom.Element getJDomElement() { if (abc[0] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement()); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); org.jdom.Element child = e.getChild(ActiveBagContent.ELEMENT_NAME); if (child != null) { abc[0] = ActiveBagContent.getActiveBagContent(child, project.mediaBag); } if (abc[0] == null) throw new IllegalArgumentException("InformationScreen without contents"); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); abc[0] = c3a.createActiveBagContent(0); abc[0].setBoxBase(c3a.getBoxBase(0)); bTimeCounter = bScoreCounter = bActionsCounter = false; includeInReports = false; reportActions = false; } public int getMinNumActions() { return 0; } @Override public boolean hasRandom() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel { ActiveBoxBag bg; protected Panel(PlayStation ps) { super(ps); bg = null; } public void clear() { if (bg != null) { bg.end(); bg = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null) { if (acp != null) acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, false), ps); bg = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); bg.setContent(abc[0]); bg.setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); else firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bg != null) { playing = true; } } public void render(Graphics2D g2, Rectangle dirtyRegion) { if (bg != null) bg.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (getSize().equals(preferredMaxSize)) return preferredMaxSize; return BoxBag.layoutSingle(preferredMaxSize, bg, margin); } @Override public void processMouse(MouseEvent e) { ActiveBox bx; if (playing && e.getID() == MouseEvent.MOUSE_PRESSED) { ps.stopMedia(1); if ((bx = bg.findActiveBox(e.getPoint())) != null) { if (!bx.playMedia(ps)) playEvent(EventSounds.CLICK); } } } } } src/core/edu/xtec/jclic/activities/panels/Menu.java000066400000000000000000000127501335566474600226260ustar00rootroot00000000000000/* * File : Menu.java * Created : 21.may-2002 9:28 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.*; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.media.*; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.*; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import javax.swing.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class Menu extends Activity implements Editable { protected ArrayList menuElements; public static final int MAX_LABEL_LENGTH = 30; /** Creates new Menu */ public Menu(JClicProject project) { super(project); includeInReports = false; reportActions = false; bActionsCounter = false; bScoreCounter = false; bTimeCounter = false; menuElements = new ArrayList(); } @Override public String getPublicName() { return description; } @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); for (MenuElement el : menuElements) e.addContent(el.getJDomElement()); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); includeInReports = false; java.util.Iterator it = e.getChildren(MenuElement.ELEMENT_NAME).iterator(); while (it.hasNext()) menuElements.add(MenuElement.getMenuElement((org.jdom.Element) it.next())); } public int getMenuElementCount() { return menuElements.size(); } public MenuElement getMenuElement(int n) { if (n < 0 || n >= menuElements.size()) return null; return (MenuElement) menuElements.get(n); } public void addMenuElement(MenuElement me) { menuElements.add(me); } public int getMinNumActions() { return 0; } @Override public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel implements ActionListener { VFlowScrollPane scrollPane; JPanel panel; protected Panel(PlayStation ps) { super(ps); } @Override public void buildVisualComponents() throws Exception { super.buildVisualComponents(); panel = new JPanel(); panel.setBackground(activityBgColor); panel.setLayout(new java.awt.FlowLayout()); scrollPane = new VFlowScrollPane(panel); scrollPane.setBorder(BorderFactory.createEmptyBorder()); scrollPane.getVerticalScrollBar().setBorder(BorderFactory.createLineBorder(Color.darkGray, 1)); addButtons(); add(scrollPane); } public void addButtons() { panel.removeAll(); for (int i = 0; i < menuElements.size(); i++) { MenuElement me = getMenuElement(i); JButton button = new JButton(); button.setIcon(me.getIcon(project.mediaBag)); if (me.caption != null) button.setText(StrUtils.getShortExpression(me.caption, MAX_LABEL_LENGTH)); if (me.description != null) button.setToolTipText(me.description); else if (me.caption != null) button.setToolTipText(me.caption); button.setHorizontalTextPosition(SwingConstants.CENTER); button.setVerticalTextPosition(SwingConstants.BOTTOM); button.setActionCommand(Integer.toString(i)); button.addActionListener(this); panel.add(button); } } @Override public void doLayout() { scrollPane.setBounds(0, 0, getWidth(), getHeight()); } public void clear() { } public Dimension setDimension(Dimension maxSize) { return maxSize; } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); playing = true; } public void render(Graphics2D g2, Rectangle dirtyRegion) { } public void actionPerformed(ActionEvent ae) { int i; try { i = Integer.parseInt(ae.getActionCommand()); } catch (NumberFormatException e) { return; } if (i >= 0) { MenuElement me = getMenuElement(i); if (me != null && (me.projectPath != null || me.sequence != null)) { MediaContent mc = new MediaContent(); if (MenuElement.RETURN_TAG.equals(me.sequence)) { mc.mediaType = MediaContent.RETURN; } else { mc.mediaType = MediaContent.RUN_CLIC_PACKAGE; mc.mediaFileName = me.sequence; mc.externalParam = me.projectPath; } ps.playMedia(mc, null); } } } } } src/core/edu/xtec/jclic/activities/panels/MenuEditor.java000066400000000000000000000272271335566474600240020ustar00rootroot00000000000000/* * File : MenuEditor.java * Created : 05-jun-2002 17:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.*; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.project.*; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JTree; import javax.swing.tree.TreePath; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class MenuEditor extends Editor { protected static ImageIcon icon; public static EditorAction newMenuElementAction, newMenuAction; public static boolean actionsCreated = false; protected ProjectLibrary projectLibrary; /** Creates new MenuEditor */ public MenuEditor(Menu menu) { super(menu); } protected void createChildren() { Menu m = getMenu(); ProjectLibrary pl = getProjectLibrary(); if (pl != null && !m.menuElements.isEmpty()) { for (int i = 0; i < m.getMenuElementCount(); i++) { MenuElement me = m.getMenuElement(i); if (me.projectPath == null && me.sequence != null && !MenuElement.RETURN_TAG.equals(me.sequence)) { try { Activity act = Activity.getActivity(pl.activityBag.getElement(me.sequence).getData(), pl); if (act instanceof Menu) ((Menu) act).getEditor(this); } catch (Exception ex) { System.err.println("Error reading activity:\n" + ex); } } else me.getEditor(this); } } } public Class getEditorPanelClass() { return MenuEditorPanel.class; } public EditorPanel createEditorPanel(Options options) { return new MenuEditorPanel(options); } public Menu getMenu() { return (Menu) getUserObject(); } public Options getOptions() { return getMenu().getProject().getBridge().getOptions(); } protected void saveData() { ProjectLibrary pl = getProjectLibrary(); if (pl != null) pl.activityBag.addActivity(getMenu()); } public ProjectLibrary getProjectLibrary() { if (projectLibrary == null) { Editor p = getEditorParent(); if (p != null) { if (p instanceof ProjectLibraryEditor) projectLibrary = ((ProjectLibraryEditor) p).getProjectLibrary(); else if (p instanceof MenuEditor) projectLibrary = ((MenuEditor) p).getProjectLibrary(); } } return projectLibrary; } @Override public String toString() { return getMenu().description; } @Override protected boolean canClone() { return true; } @Override protected Editor getClone() throws Exception { Menu menu = (Menu) getMenu().duplicate(); menu.name = Long.toString(System.currentTimeMillis()); MenuEditor me = (MenuEditor) menu.getEditor(null); me.projectLibrary = getProjectLibrary(); me.createChildren(); return me; } @Override public void setActionsOwner() { Editor e = getEditorParent(); allowDelete = allowCut = (e != null && !(e instanceof ProjectLibraryEditor)); allowDelete = allowCut && getChildCount() == 0; allowCopy = allowPaste = true; super.setActionsOwner(); newMenuElementAction.setActionOwner(this); newMenuAction.setActionOwner(e != null ? this : null); } @Override public void clearActionsOwner() { super.clearActionsOwner(); newMenuAction.setActionOwner(null); newMenuElementAction.setActionOwner(null); } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/file_open.gif"); return icon; } public void setDescription(String description) { Menu m = getMenu(); m.description = StrUtils.secureString(description, getOptions().getMsg("UNNAMED")); ActiveBoxContent[] messages = m.getMessages(); if (messages[Activity.MAIN] == null) { messages[Activity.MAIN] = new ActiveBoxContent(); messages[Activity.MAIN].setBoxBase(new BoxBase()); } messages[Activity.MAIN].setTextContent(m.description); MenuElement me = checkParentMenuElementRef(false, false, false, 0); if (me != null) me.caption = m.description; } protected MenuElement checkParentMenuElementRef(boolean remove, boolean create, boolean move, int index) { MenuElement result = null; Menu m = getMenu(); if (getEditorParent() instanceof MenuEditor) { Menu pm = ((MenuEditor) getEditorParent()).getMenu(); for (int i = 0; i < pm.getMenuElementCount(); i++) { MenuElement me = pm.getMenuElement(i); if (me.projectPath == null && me.sequence != null && me.sequence.equals(m.name)) { result = me; break; } } if (result != null && (remove || move)) { pm.menuElements.remove(result); if (move) pm.menuElements.add(index, result); } else if (result == null && create) { index = Math.max(0, Math.min(index, m.getMenuElementCount())); result = new MenuElement(); result.sequence = m.name; result.caption = m.description; pm.menuElements.add(index, result); } } return result; } @Override public boolean moveUp(boolean updateSelection) { boolean result = super.moveUp(updateSelection); if (result) checkParentMenuElementRef(false, false, true, getParent().getIndex(this)); return result; } @Override public boolean moveDown(boolean updateSelection) { boolean result = super.moveDown(updateSelection); if (result) checkParentMenuElementRef(false, false, true, getParent().getIndex(this)); return result; } @Override public boolean insertEditor(Editor e, boolean asChild, int index, boolean updateSelection) { boolean result = false; if (!asChild) result = super.insertEditor(e, asChild, index, updateSelection); else { if (e instanceof MenuEditor) { ProjectLibrary pl = getProjectLibrary(); if (pl != null) { Menu m = ((MenuEditor) e).getMenu(); // find last non-Menu index int i; for (i = 0; i < getChildCount(); i++) if (!(getChildAt(i) instanceof MenuEditor)) break; if (index < 0) index = i; else index = Math.min(index, i); pl.activityBag.addActivity(m); pl.activitySequence.add(new ActivitySequenceElement(m.name, true)); MenuEditor med = (MenuEditor) m.getEditor(this); med.checkParentMenuElementRef(false, true, false, index); result = super.insertEditor(med, true, index, updateSelection); } } else if (e instanceof MenuElementEditor) { MenuElement me = ((MenuElementEditor) e).getMenuElement(); if (index < 0) index = getChildCount(); else index = Math.min(index, getChildCount()); getMenu().menuElements.add(index, me); result = super.insertEditor(me.getEditor(this), true, index, updateSelection); } } return result; } public boolean createNewMenu(int index, boolean prompt, Component dlgParent) { boolean result = false; ProjectLibrary pl = getProjectLibrary(); if (pl != null) { JTree ct = getCurrentTree(); TreePath savePath = null; if (ct != null) savePath = ct.getSelectionPath(); Menu nm = new Menu(pl); nm.name = Long.toString(System.currentTimeMillis()); MenuEditor med = (MenuEditor) nm.getEditor(null); med.setDescription(getOptions().getMsg("menu_newMenuName")); if (prompt) { result = med.createEditorPanel(getOptions()).showDialog(med, "menu_newMenuElement_caption", dlgParent, true); } else { result = true; } if (result) { result = insertEditor(med, true, index, true); } else if (savePath != null && ct != null) { ct.clearSelection(); ct.setSelectionPath(savePath); } } return result; } public boolean createNewMenuElement(int index, boolean prompt, Component dlgParent) { MenuElement me = new MenuElement(); boolean result; TreePath savePath = null; JTree ct = getCurrentTree(); MenuElementEditor mee; me.caption = getOptions().getMsg("menu_newMenuElementName"); if (ct != null) savePath = ct.getSelectionPath(); mee = (MenuElementEditor) me.getEditor(null); mee.projectLibrary = getProjectLibrary(); mee.createChildren(); if (prompt) { result = mee.createEditorPanel(getOptions()).showDialog(mee, "menu_newMenuElement_caption", dlgParent, true); } else { result = true; } if (index < 0) index = getChildCount(); else index = Math.min(index, getChildCount()); if (result) { result = insertEditor(mee, true, index, true); } else if (savePath != null && ct != null) { ct.clearSelection(); ct.setSelectionPath(savePath); } return result; } @Override public boolean delete(boolean updateSelection) { boolean result = false; ProjectLibrary pl = getProjectLibrary(); String name = getMenu().name; Editor saveParent = getEditorParent(); if (name != null && (result = super.delete(updateSelection)) == true) { parent = saveParent; if (pl != null) { ActivitySequenceElement ase = pl.activitySequence.getElementByTag(name, false); if (ase != null) pl.activitySequence.remove(ase); pl.activityBag.removeElementByName(name); } checkParentMenuElementRef(true, false, false, 0); parent = null; } return result; } @Override public boolean canBeParentOf(Editor e) { return (e instanceof MenuElementEditor) || (e instanceof MenuEditor); } @Override public boolean canBeSiblingOf(Editor e) { if (getEditorParent() instanceof MenuEditor) return canBeParentOf(e); else return (e instanceof MenuElementEditor); } public static void createActions(Options options) { createBasicActions(options); if (!actionsCreated) { newMenuElementAction = new EditorAction("menu_newMenuElement_caption", "icons/new_miniclic.png", "menu_newMenuElement_tooltip", options) { protected void doAction(Editor e) { Editor ch = null; if (e instanceof MenuElementEditor) { ch = e; e = e.getEditorParent(); } if (e instanceof MenuEditor) ((MenuEditor) e).createNewMenuElement(e.getNearestIndex(ch, true), true, getComponentSrc()); } }; newMenuAction = new EditorAction("menu_newMenu_caption", "icons/new_folder.gif", "menu_newMenu_tooltip", options) { protected void doAction(Editor e) { if (e instanceof MenuElementEditor) e = e.getEditorParent(); if (e instanceof MenuEditor) ((MenuEditor) e).createNewMenu(-1, true, getComponentSrc()); } }; actionsCreated = true; } } } src/core/edu/xtec/jclic/activities/panels/MenuEditorPanel.form000066400000000000000000000067631335566474600250060ustar00rootroot00000000000000
src/core/edu/xtec/jclic/activities/panels/MenuEditorPanel.java000066400000000000000000000104331335566474600247510ustar00rootroot00000000000000/* * File : MenuEditorPanel.java * Created : 10-jun-2002 09:59 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.edit.EditorPanel; import edu.xtec.util.Options; import edu.xtec.util.SmallButton; import java.awt.Container; import javax.swing.Icon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class MenuEditorPanel extends EditorPanel { /** Creates new form MenuEditorPanel */ public MenuEditorPanel(Options options) { super(options); MenuEditor.createActions(options); initComponents(); postInit(250, true, true); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JLabel captionLb; java.awt.GridBagConstraints gridBagConstraints; mainPanel = new javax.swing.JPanel(); captionLb = new javax.swing.JLabel(); captionText = new javax.swing.JTextField(); captionText.getDocument().addDocumentListener(this); setLayout(new java.awt.BorderLayout()); mainPanel.setLayout(new java.awt.GridBagLayout()); mainPanel.setOpaque(false); captionLb.setLabelFor(captionText); captionLb.setText(options.getMsg("edit_name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); mainPanel.add(captionLb, gridBagConstraints); captionText.setToolTipText(options.getMsg("menu_dlg_name_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); mainPanel.add(captionText, gridBagConstraints); add(mainPanel, java.awt.BorderLayout.CENTER); } // GEN-END:initComponents public boolean checkIfEditorValid(Editor e) { return e instanceof MenuEditor; } protected MenuEditor getMenuEditor() { return (MenuEditor) editor; } protected Menu getMenu() { if (editor == null) return null; else return getMenuEditor().getMenu(); } public void fillData() { Menu m = getMenu(); captionText.setText(m == null ? "" : m.description); } public void saveData() { Menu m = getMenu(); if (m != null) { getMenuEditor().setDescription(captionText.getText()); } } @Override protected Icon getIcon() { return MenuEditor.getIcon(); } @Override protected String getTitle() { return options.getMsg("menu_dlg_title"); } @Override protected void addActionsTo(Container cnt) { cnt.add(new SmallButton(MenuEditor.newMenuElementAction)); cnt.add(new SmallButton(MenuEditor.newMenuAction)); cnt.add(new SmallButton(Editor.moveUpAction)); cnt.add(new SmallButton(Editor.moveDownAction)); cnt.add(new SmallButton(Editor.copyAction)); cnt.add(new SmallButton(Editor.cutAction)); cnt.add(new SmallButton(Editor.pasteAction)); cnt.add(new SmallButton(Editor.deleteAction)); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField captionText; private javax.swing.JPanel mainPanel; // End of variables declaration//GEN-END:variables } src/core/edu/xtec/jclic/activities/panels/MenuElement.java000066400000000000000000000075711335566474600241450ustar00rootroot00000000000000/* * File : MenuElement.java * Created : 21-may-2002 9:28 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class MenuElement implements Editable, Cloneable, Domable { public String caption; public String icon; public String projectPath; public String sequence; public String description; public MenuElement() { icon = DEFAULT_ICON; } public static final String ELEMENT_NAME = "menuElement"; public static final String CAPTION = "caption", ICON = "icon", PATH = "path", SEQUENCE = "sequence", DESCRIPTION = "description"; public static final String RETURN_TAG = "@RETURN"; public static final String DEFAULT_ICON = "@ico00.png", DEFAULT_FOLDER_ICON = "@icofolder.png"; public static final int MAX_ICON_WIDTH = 32, MAX_ICON_HEIGHT = 32; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (caption != null) e.setAttribute(CAPTION, caption); if (icon != null && !icon.equals(DEFAULT_ICON)) e.setAttribute(ICON, icon); if (projectPath != null) e.setAttribute(PATH, projectPath); if (sequence != null) e.setAttribute(SEQUENCE, sequence); if (description != null) e.setAttribute(DESCRIPTION, description); return e; } public ImageIcon getIcon(MediaBag mb) { ImageIcon result = null; if (icon.startsWith("@")) { String fn = icon.substring(1); // ico files converted to png if (fn.endsWith(".gif") && fn.startsWith("ico")) fn = fn.substring(0, fn.length() - 4) + ".png"; result = edu.xtec.util.ResourceManager.getImageIcon("icons/" + fn); } else { try { result = new ImageIcon(mb.getImageElement(icon).getImage()); result.setDescription(icon); } catch (Exception ex) { System.err.println("Error reading image " + icon + "\n" + ex); } } if (result == null) result = edu.xtec.util.ResourceManager.getImageIcon("icons/ico00.png"); return result; } public static MenuElement getMenuElement(org.jdom.Element e) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); MenuElement me = new MenuElement(); me.setProperties(e, null); return me; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); caption = JDomUtility.getStringAttr(e, CAPTION, caption, false); sequence = JDomUtility.getStringAttr(e, SEQUENCE, sequence, false); description = JDomUtility.getStringAttr(e, DESCRIPTION, description, false); projectPath = FileSystem.stdFn(JDomUtility.getStringAttr(e, PATH, projectPath, false)); icon = projectPath == null ? DEFAULT_FOLDER_ICON : DEFAULT_ICON; icon = FileSystem.stdFn(JDomUtility.getStringAttr(e, ICON, icon, false)); } public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } } src/core/edu/xtec/jclic/activities/panels/MenuElementEditor.java000066400000000000000000000164631335566474600253140ustar00rootroot00000000000000/* * File : MenuElementEditor.java * Created : 05-jun-2002 16:14 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.ProjectLibrary; import edu.xtec.util.Options; import java.awt.Component; import javax.swing.Icon; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class MenuElementEditor extends Editor { protected static ImageIcon icon; protected ImageIcon meIcon; protected ProjectLibrary projectLibrary; public static EditorAction findProjectAction, findIconAction; protected static boolean actionsCreated = false; /** Creates new EditorMenuElement */ public MenuElementEditor(MenuElement me) { super(me); } protected void createChildren() { ProjectLibrary pl = getProjectLibrary(); if (pl != null) { meIcon = getMenuElement().getIcon(pl.mediaBag); } } public MenuElement getMenuElement() { return (MenuElement) getUserObject(); } public MenuEditor getMenuEditorParent() { MenuEditor result = null; if (getParent() != null && getParent() instanceof MenuEditor) result = (MenuEditor) getParent(); return result; } public Class getEditorPanelClass() { return MenuElementEditorPanel.class; } public ProjectLibrary getProjectLibrary() { if (projectLibrary != null) return projectLibrary; MenuEditor me = getMenuEditorParent(); if (me != null) projectLibrary = me.getProjectLibrary(); return projectLibrary; } @Override public String toString() { return getMenuElement().caption; } public EditorPanel createEditorPanel(Options options) { return new MenuElementEditorPanel(options); } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/miniclic.png"); return icon; } @Override public javax.swing.Icon getIcon(boolean leaf, boolean expanded) { return leaf ? getIcon() : null; } @Override protected boolean canClone() { return true; } @Override protected Editor getClone() throws Exception { MenuElement me = MenuElement.getMenuElement(getMenuElement().getJDomElement()); MenuElementEditor mee = (MenuElementEditor) me.getEditor(null); mee.projectLibrary = getProjectLibrary(); mee.meIcon = meIcon; return mee; } @Override public void setActionsOwner() { allowCut = allowDelete = allowCopy = allowPaste = true; super.setActionsOwner(); if (actionsCreated) { findProjectAction.setActionOwner(this); findIconAction.setActionOwner(this); boolean hasParent = (getMenuEditorParent() != null); MenuEditor.newMenuAction.setActionOwner(hasParent ? this : null); MenuEditor.newMenuElementAction.setActionOwner(hasParent ? this : null); } } @Override public void clearActionsOwner() { super.clearActionsOwner(); if (actionsCreated) { findProjectAction.setActionOwner(null); findIconAction.setActionOwner(null); MenuEditor.newMenuAction.setActionOwner(null); MenuEditor.newMenuElementAction.setActionOwner(null); } } protected void syncParentIndex() { MenuEditor me = getMenuEditorParent(); if (me != null) { me.getMenu().menuElements.remove(getMenuElement()); me.getMenu().menuElements.add(me.getIndex(this), getMenuElement()); } } @Override public boolean moveUp(boolean updateSelection) { boolean result = super.moveUp(updateSelection); if (result) syncParentIndex(); return result; } @Override public boolean moveDown(boolean updateSelection) { boolean result = super.moveDown(updateSelection); if (result) syncParentIndex(); return result; } @Override public boolean delete(boolean updateSelection) { boolean result = false; getProjectLibrary(); MenuEditor me = getMenuEditorParent(); if (me != null && (result = super.delete(updateSelection)) == true) me.getMenu().menuElements.remove(getMenuElement()); return result; } @Override public boolean canBeParentOf(Editor e) { return false; } @Override public boolean canBeSiblingOf(Editor e) { return (e instanceof MenuElementEditor) || (e instanceof MenuEditor); } public void findProject(Options options, Component dlgOwner) { MenuElement me = getMenuElement(); ProjectLibrary pl = getProjectLibrary(); if (pl != null) { int[] filters = { Utils.ALL_CLIC_FF, Utils.ALL_JCLIC_FF }; String result = pl.getFileSystem().chooseFile(me.projectPath, false, filters, options, "edit_find_file", dlgOwner, false); if (result != null) { me.projectPath = result; fireEditorDataChanged(null); } } } public void findIcon(Options options, Component dlgOwner) { MenuElement me = getMenuElement(); ProjectLibrary pl = getProjectLibrary(); if (pl != null) { int[] filters = { Utils.ALL_IMAGES_FF, Utils.GIF_FF }; String s = me.icon; if (s != null && s.startsWith("@")) s = null; String result = pl.getFileSystem().chooseFile(s == null ? me.projectPath : s, false, filters, options, "edit_find_image", dlgOwner, false); if (result != null) { ImageIcon ii = null; try { ii = new ImageIcon(pl.getFileSystem().getImageFile(result)); if (ii.getIconWidth() > MenuElement.MAX_ICON_WIDTH || ii.getIconHeight() > MenuElement.MAX_ICON_HEIGHT) { options.getMessages().showAlert(dlgOwner, "menuElement_err_iconTooLarge"); ii = null; } } catch (Exception ex) { System.err.println("Error reading image " + result + "\n" + ex); } if (ii != null) { me.icon = result; meIcon = me.getIcon(pl.mediaBag); fireEditorDataChanged(null); } } } } public static void createActions(Options options) { createBasicActions(options); if (!actionsCreated) { findProjectAction = new EditorAction("edit_find_file", "icons/file_open.gif", "edit_find_file", options) { protected void doAction(Editor e) { if (e instanceof MenuElementEditor) ((MenuElementEditor) e).findProject(this.options, getComponentSrc()); } }; findIconAction = new EditorAction("edit_find_image", "icons/file_open.gif", "edit_find_image", options) { protected void doAction(Editor e) { if (e instanceof MenuElementEditor) ((MenuElementEditor) e).findIcon(this.options, getComponentSrc()); } }; actionsCreated = true; } } } src/core/edu/xtec/jclic/activities/panels/MenuElementEditorPanel.form000066400000000000000000000351341335566474600263120ustar00rootroot00000000000000
src/core/edu/xtec/jclic/activities/panels/MenuElementEditorPanel.java000066400000000000000000000235521335566474600262710ustar00rootroot00000000000000/* * File : MenuElementEditorPanel.java * Created : 05-jun-2002 12:17 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.panels; import edu.xtec.jclic.edit.*; import edu.xtec.util.SmallButton; import java.awt.Container; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class MenuElementEditorPanel extends EditorPanel { private static List standardIcons; private List icons; /** Creates new form MenuElementEditPanel */ public MenuElementEditorPanel(edu.xtec.util.Options options) { super(options); MenuEditor.createActions(options); MenuElementEditor.createActions(options); buildIconList(); initComponents(); postInit(250, true, true); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; mainPanel = new javax.swing.JPanel(); javax.swing.JLabel projectLabel = new javax.swing.JLabel(); projectText = new javax.swing.JTextField(); projectText.getDocument().addDocumentListener(this); btFindProject = new SmallButton(MenuElementEditor.findProjectAction); javax.swing.JLabel iconLabel = new javax.swing.JLabel(); iconCombo = new javax.swing.JComboBox( new DefaultComboBoxModel(icons.toArray(new ImageIcon[icons.size()]))); iconCombo.addActionListener(this); btFindIcon = new SmallButton(MenuElementEditor.findIconAction); javax.swing.JLabel captionLabel = new javax.swing.JLabel(); captionText = new javax.swing.JTextField(); captionText.getDocument().addDocumentListener(this); javax.swing.JLabel descLabel = new javax.swing.JLabel(); descText = new javax.swing.JTextField(); descText.getDocument().addDocumentListener(this); setPreferredSize(new java.awt.Dimension(350, 300)); setLayout(new java.awt.BorderLayout()); mainPanel.setOpaque(false); mainPanel.setLayout(new java.awt.GridBagLayout()); projectLabel.setText(options.getMsg("menuElement_dlg_project")); projectLabel.setToolTipText(options.getMsg("menuElement_dlg_project_tooltip")); projectLabel.setLabelFor(projectText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); mainPanel.add(projectLabel, gridBagConstraints); projectText.setToolTipText(options.getMsg("menuElement_dlg_project_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); mainPanel.add(projectText, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; mainPanel.add(btFindProject, gridBagConstraints); iconLabel.setText(options.getMsg("menuElement_dlg_icon")); iconLabel.setToolTipText(options.getMsg("menuElement_dlg_icon_tooltip")); iconLabel.setLabelFor(iconCombo); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); mainPanel.add(iconLabel, gridBagConstraints); iconCombo.setToolTipText(options.getMsg("menuElement_dlg_icon_tooltip")); iconCombo.setRenderer(new edu.xtec.util.CustomListCellRenderer()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); mainPanel.add(iconCombo, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; mainPanel.add(btFindIcon, gridBagConstraints); captionLabel.setText(options.getMsg("edit_text")); captionLabel.setToolTipText(options.getMsg("menuElement_dlg_text_tooltip")); captionLabel.setLabelFor(captionText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); mainPanel.add(captionLabel, gridBagConstraints); captionText.setToolTipText(options.getMsg("menuElement_dlg_text_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); mainPanel.add(captionText, gridBagConstraints); descLabel.setText(options.getMsg("menuElement_dlg_description")); descLabel.setToolTipText(options.getMsg("menuElement_dlg_description_tooltip")); descLabel.setLabelFor(descText); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); mainPanel.add(descLabel, gridBagConstraints); descText.setToolTipText(options.getMsg("menuElement_dlg_description_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); mainPanel.add(descText, gridBagConstraints); add(mainPanel, java.awt.BorderLayout.CENTER); } // //GEN-END:initComponents public boolean checkIfEditorValid(Editor e) { return e instanceof MenuElementEditor; } public void fillData() { MenuElement me = getMenuElement(); captionText.setText(me == null ? "" : me.caption); projectText.setText(me == null ? "" : me.projectPath); descText.setText(me == null ? "" : me.description); if (getMeIcon() != null && !icons.contains(getMeIcon())) { DefaultComboBoxModel model = (DefaultComboBoxModel) iconCombo.getModel(); model.addElement(getMeIcon()); } iconCombo.setSelectedItem(getMeIcon()); } protected MenuElement getMenuElement() { if (editor == null) return null; else return (getMeEditor().getMenuElement()); } public void saveData() { MenuElement me = getMenuElement(); if (me != null) { me.caption = captionText.getText(); me.projectPath = projectText.getText(); me.description = descText.getText(); getMeEditor().meIcon = (ImageIcon) iconCombo.getSelectedItem(); if (getMeIcon() != null) me.icon = getMeIcon().getDescription(); } } @Override protected void setEditor(Editor e) { super.setEditor(e); if (e != null) { icons = new ArrayList(standardIcons); iconCombo.setModel(new DefaultComboBoxModel(icons.toArray(new ImageIcon[icons.size()]))); } } @Override protected javax.swing.Icon getIcon() { return MenuElementEditor.getIcon(); } protected MenuElementEditor getMeEditor() { return (MenuElementEditor) editor; } protected ImageIcon getMeIcon() { MenuElementEditor mee = getMeEditor(); return mee == null ? null : mee.meIcon; } @Override protected String getTitle() { return options.getMsg("menuElement_dlg_title"); } @Override protected void addActionsTo(Container cnt) { cnt.add(new SmallButton(MenuEditor.newMenuElementAction)); cnt.add(new SmallButton(MenuEditor.newMenuAction)); cnt.add(new SmallButton(Editor.moveUpAction)); cnt.add(new SmallButton(Editor.moveDownAction)); cnt.add(new SmallButton(Editor.copyAction)); cnt.add(new SmallButton(Editor.cutAction)); cnt.add(new SmallButton(Editor.pasteAction)); cnt.add(new SmallButton(Editor.deleteAction)); } protected void buildIconList() { if (standardIcons == null) { standardIcons = new ArrayList(); for (int i = 0; i < 4; i++) { // String s="ico0"+i+".gif"; String s = "ico0" + i + ".png"; ImageIcon ii = edu.xtec.util.ResourceManager.getImageIcon("icons/" + s); if (ii != null) standardIcons.add(ii); } } icons = new ArrayList(standardIcons); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btFindIcon; private javax.swing.JButton btFindProject; private javax.swing.JTextField captionText; private javax.swing.JTextField descText; private javax.swing.JComboBox iconCombo; private javax.swing.JPanel mainPanel; private javax.swing.JTextField projectText; // End of variables declaration//GEN-END:variables } src/core/edu/xtec/jclic/activities/puzzles/000077500000000000000000000000001335566474600213045ustar00rootroot00000000000000src/core/edu/xtec/jclic/activities/puzzles/DoublePuzzle.java000066400000000000000000000223751335566474600246040ustar00rootroot00000000000000/* * File : DoublePuzzle.java * Created : 20-apr-2001 10:31 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.puzzles; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.MouseEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class DoublePuzzle extends Activity implements ActiveBagContentKit.Compatible { /** Creates new DoublePuzzle */ public DoublePuzzle(JClicProject project) { super(project); abc = new ActiveBagContent[1]; boxGridPos = AB; dragCells = true; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, 'A'); } @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex; if (abc[0] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement()); ex = new org.jdom.Element(SCRAMBLE); ex.setAttribute(TIMES, Integer.toString(shuffles)); e.addContent(ex); ex = new org.jdom.Element(LAYOUT); ex.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]); e.addContent(ex); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); child = e.getChild(ActiveBagContent.ELEMENT_NAME); if (child != null) abc[0] = ActiveBagContent.getActiveBagContent(child, project.mediaBag); if (abc[0] == null) throw new IllegalArgumentException("Puzzle without data!"); if ((child = e.getChild(SCRAMBLE)) != null) shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); if ((child = e.getChild(LAYOUT)) != null) boxGridPos = JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); abc[0] = c3a.createActiveBagContent(0); boxGridPos = c3a.graPos; abc[0].setBoxBase(c3a.getBoxBase(0)); dragCells = true; } public int getMinNumActions() { if (abc[0] == null) return 0; return abc[0].getNumCells(); } @Override public boolean hasRandom() { return true; } @Override public boolean shuffleAlways() { return true; } @Override public boolean helpSolutionAllowed() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel { ActiveBoxBag bgA, bgB; protected Panel(PlayStation ps) { super(ps); bc = new BoxConnector(this); } public void clear() { if (bgA != null) { bgA.end(); bgA = null; } if (bgB != null) { bgB.end(); bgB = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null) { if (acp != null) acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, false), ps); bgA = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); bgB = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); bgA.setContent(abc[0]); bgA.setVisible(true); bgB.setVisible(true); ActiveBox bgbA = bgA.getBackgroundActiveBox(); ActiveBox bgbB = bgB.getBackgroundActiveBox(); if (bgbA != null && bgbB != null) bgbB.exchangeContent(bgbA); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); else firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bgA != null && bgB != null) { shuffle(new ActiveBoxBag[] { bgA }, true, true); if (useOrder) currentItem = bgA.getNextItem(-1); playing = true; } } public void render(Graphics2D g2, Rectangle dirtyRegion) { if (bgA != null) bgA.update(g2, dirtyRegion, this); if (bgB != null) bgB.update(g2, dirtyRegion, this); if (bc.active) bc.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (bgA == null || bgB == null || getSize().equals(preferredMaxSize)) return preferredMaxSize; return BoxBag.layoutDouble(preferredMaxSize, bgA, bgB, boxGridPos, margin); } @Override public void processMouse(MouseEvent e) { ActiveBox bx1, bx2; Point p = e.getPoint(); if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if (bc.active) { if (dragCells) bx1 = bc.getBox(); else bx1 = bgA.findActiveBox(bc.origin); bc.end(); bx2 = bgB.findActiveBox(p); if (bx1 != null && bx2 != null && bx2.isInactive()) { boolean ok = false; String src = bx1.getDescription() + " (" + bx1.idOrder + ")"; String dest = "(" + bx2.idOrder + ")"; if (bx1.getContent().isEquivalent(abc[0].getActiveBoxContent(bx2.idOrder), true)) { ok = true; bx1.exchangeContent(bx2); bx1.setVisible(false); if (useOrder) currentItem = bgA.getNextItem(currentItem); } int cellsAtPlace = bgA.countInactiveCells(); ps.reportNewAction(DoublePuzzle.this, ACTION_PLACE, src, dest, ok, cellsAtPlace); if (ok && cellsAtPlace == bgA.getNumCells()) finishActivity(true); else playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } repaint(); } else { if ((bx1 = bgA.findActiveBox(p)) != null && !bx1.isInactive() && (!useOrder || bx1.idOrder == currentItem)) { if (dragCells) bc.begin(p, bx1); else bc.begin(p); if (!bx1.playMedia(ps)) playEvent(EventSounds.CLICK); } } break; case MouseEvent.MOUSE_MOVED: case MouseEvent.MOUSE_DRAGGED: bc.moveTo(p); break; } } @Override public void showHelp() { if (!helpWindowAllowed() || bgA == null) return; HelpActivityComponent hac = null; if (showSolution) { hac = new HelpActivityComponent(this) { ActiveBoxBag abb = null; public void render(Graphics2D g2, Rectangle dirtyRegion) { if (abb != null) abb.update(g2, dirtyRegion, this); } @Override public void init() { abb = ActiveBoxGrid.createEmptyGrid(null, this, DEFAULT_MARGIN, DEFAULT_MARGIN, abc[0]); abb.setContent(abc[0]); abb.setVisible(true); Dimension size = bgA.getBounds().getSize(); abb.setBounds(DEFAULT_MARGIN, DEFAULT_MARGIN, size.width, size.height); size.width += 2 * DEFAULT_MARGIN; size.height += 2 * DEFAULT_MARGIN; setPreferredSize(size); setMaximumSize(size); setMinimumSize(size); Point p = (Point) getClientProperty(HelpActivityComponent.PREFERRED_LOCATION); if (p != null) p.translate((int) bgA.x - DEFAULT_MARGIN, (int) bgA.y - DEFAULT_MARGIN); } @Override public void processMouse(MouseEvent e) { ActiveBox bx; if (abb != null) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: bx = abb.findActiveBox(e.getPoint()); if (bx != null) { boolean m = bx.playMedia(ps); markBox(bgB.getActiveBox(bx.idLoc), false); if (!m) playEvent(EventSounds.CLICK); } break; case MouseEvent.MOUSE_RELEASED: unmarkBox(); break; } } }; hac.init(); } if (ps.showHelp(hac, helpMsg)) ps.reportNewAction(getActivity(), ACTION_HELP, null, null, false, bgA.countInactiveCells()); if (hac != null) hac.end(); } } } src/core/edu/xtec/jclic/activities/puzzles/ExchangePuzzle.java000066400000000000000000000173301335566474600251070ustar00rootroot00000000000000/* * File : ExchangePuzzle.java * Created : 25-dec-2000 3:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.puzzles; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.MouseEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class ExchangePuzzle extends Activity implements ActiveBagContentKit.Compatible { /** Creates new ExchangePuzzle */ public ExchangePuzzle(JClicProject project) { super(project); abc = new ActiveBagContent[1]; dragCells = true; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, 'A'); } @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex; if (abc[0] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement()); ex = new org.jdom.Element(SCRAMBLE); { ex.setAttribute(TIMES, Integer.toString(shuffles)); e.addContent(ex); } return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); child = e.getChild(ActiveBagContent.ELEMENT_NAME); if (child != null) abc[0] = ActiveBagContent.getActiveBagContent(child, project.mediaBag); if (abc[0] == null) throw new IllegalArgumentException("Puzzle without content!"); if ((child = e.getChild(SCRAMBLE)) != null) shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); abc[0] = c3a.createActiveBagContent(0); abc[0].setBoxBase(c3a.getBoxBase(0)); dragCells = true; } public int getMinNumActions() { return abc[0] == null ? 0 : abc[0].getNumCells(); } @Override public boolean helpSolutionAllowed() { return true; } @Override public boolean hasRandom() { return true; } @Override public boolean shuffleAlways() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel { ActiveBoxBag bg; protected Panel(PlayStation ps) { super(ps); bc = new BoxConnector(this); } public void clear() { if (bg != null) { bg.end(); bg = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null) { if (acp != null) acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, false), ps); bg = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); bg.setContent(abc[0]); bg.setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bg != null) { shuffle(new ActiveBoxBag[] { bg }, true, false); ps.setCounterValue(SCORE_COUNTER, bg.countCellsAtEquivalentPlace(true)); playing = true; } } public void render(Graphics2D g2, Rectangle dirtyRegion) { if (bg != null) bg.update(g2, dirtyRegion, this); if (bc.active) bc.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (bg == null || getSize().equals(preferredMaxSize)) return preferredMaxSize; return BoxBag.layoutSingle(preferredMaxSize, bg, margin); } @Override public void processMouse(MouseEvent e) { ActiveBox bx1, bx2; Point p = e.getPoint(); if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if (bc.active) { if (dragCells) bx1 = bc.getBox(); else bx1 = bg.findActiveBox(bc.origin); bc.end(); bx2 = bg.findActiveBox(p); if (bx1 != null && bx2 != null) { String src = bx1.getDescription() + "(" + bx1.idOrder + ")"; String dest = "(" + bx2.idLoc + ")"; boolean ok = (bx1.idOrder == bx2.idLoc); bx1.exchangeLocation(bx2); int cellsAtPlace = bg.countCellsAtEquivalentPlace(true); ps.reportNewAction(getActivity(), ACTION_PLACE, src, dest, ok, cellsAtPlace); if (ok && cellsAtPlace == bg.getNumCells()) finishActivity(true); else playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } repaint(); } else { if ((bx1 = bg.findActiveBox(p)) != null) { if (dragCells) bc.begin(p, bx1); else bc.begin(p); if (!bx1.playMedia(ps)) playEvent(EventSounds.CLICK); } } break; case MouseEvent.MOUSE_MOVED: case MouseEvent.MOUSE_DRAGGED: bc.moveTo(p); break; } } @Override public void showHelp() { if (!helpWindowAllowed() || bg == null) return; HelpActivityComponent hac = null; if (showSolution) { hac = new HelpActivityComponent(this) { ActiveBoxBag abb = null; public void render(Graphics2D g2, Rectangle dirtyRegion) { if (abb != null) abb.update(g2, dirtyRegion, this); } @Override public void init() { abb = ActiveBoxGrid.createEmptyGrid(null, this, DEFAULT_MARGIN, DEFAULT_MARGIN, abc[0]); abb.setContent(abc[0]); abb.setVisible(true); Dimension size = bg.getBounds().getSize(); abb.setBounds(DEFAULT_MARGIN, DEFAULT_MARGIN, size.width, size.height); size.width += 2 * DEFAULT_MARGIN; size.height += 2 * DEFAULT_MARGIN; setPreferredSize(size); setMaximumSize(size); setMinimumSize(size); Point p = (Point) getClientProperty(HelpActivityComponent.PREFERRED_LOCATION); if (p != null) p.translate((int) bg.x - DEFAULT_MARGIN, (int) bg.y - DEFAULT_MARGIN); } @Override public void processMouse(MouseEvent e) { ActiveBox bx; if (abb != null && (bx = abb.findActiveBox(e.getPoint())) != null) bx.playMedia(ps); } }; hac.init(); } if (ps.showHelp(hac, helpMsg)) ps.reportNewAction(getActivity(), ACTION_HELP, null, null, false, bg.countCellsAtEquivalentPlace(true)); if (hac != null) hac.end(); } } } src/core/edu/xtec/jclic/activities/puzzles/HolePuzzle.java000066400000000000000000000216771335566474600242650ustar00rootroot00000000000000/* * File : HolePuzzle.java * Created : 13-sep-2001 19:52 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.puzzles; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.MouseEvent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class HolePuzzle extends Activity implements ActiveBagContentKit.Compatible { /** Creates new ExchangePuzzle */ public HolePuzzle(JClicProject project) { super(project); abc = new ActiveBagContent[1]; boxGridPos = AB; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, 'A'); } @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex; if (abc[0] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement()); ex = new org.jdom.Element(SCRAMBLE); { ex.setAttribute(TIMES, Integer.toString(shuffles)); e.addContent(ex); } ex = new org.jdom.Element(LAYOUT); ex.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]); e.addContent(ex); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); child = e.getChild(ActiveBagContent.ELEMENT_NAME); if (child != null) abc[0] = ActiveBagContent.getActiveBagContent(child, project.mediaBag); if (abc[0] == null /* || abc[0].ncw*abc[0].nch<2 */) throw new IllegalArgumentException("Puzzle without content!"); if ((child = e.getChild(SCRAMBLE)) != null) shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); if ((child = e.getChild(LAYOUT)) != null) boxGridPos = JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); abc[0] = c3a.createActiveBagContent(0); abc[0].setBoxBase(c3a.getBoxBase(0)); boxGridPos = c3a.graPos; } public int getMinNumActions() { return abc[0] == null ? 0 : abc[0].getNumCells(); } @Override public boolean helpSolutionAllowed() { return true; } @Override public boolean hasRandom() { return true; } @Override public boolean shuffleAlways() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel { ActiveBoxGrid bg, parkBg; int hiddenBoxIndex; ActiveBox hiddenBox; protected Panel(PlayStation ps) { super(ps); bg = parkBg = null; hiddenBoxIndex = 0; hiddenBox = null; } public void clear() { if (bg != null) { bg.end(); bg = null; } if (parkBg != null) { parkBg.end(); parkBg = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (abc[0] != null) { if (acp != null) acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, false), ps); bg = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); bg.setContent(abc[0]); bg.setVisible(true); hiddenBoxIndex = (int) (Math.random() * bg.getNumCells()); hiddenBox = bg.getActiveBox(hiddenBoxIndex); hiddenBox.setVisible(false); parkBg = new ActiveBoxGrid(null, this, margin, margin, hiddenBox.width, hiddenBox.height, new edu.xtec.jclic.shapers.Rectangular(1, 1), abc[0].bb); parkBg.setContent(abc[0], null, hiddenBoxIndex, 0, 1); parkBg.setBorder(bg.hasBorder()); parkBg.setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bg != null) { java.util.Random random = new java.util.Random(); if (shuffles % 2 != 1) shuffles++; for (int i = 0; i < shuffles; i++) { Point pth = bg.getCoord(hiddenBox); int v = (random.nextBoolean() ? 1 : -1); if (random.nextBoolean()) { pth.x += v; if (pth.x < 0 || pth.x >= bg.nCols) pth.x -= 2 * v; } else { pth.y += v; if (pth.y < 0 || pth.y >= bg.nRows) pth.y -= 2 * v; } ActiveBox dstBx = bg.getActiveBoxWithIdLoc(pth.y * bg.nCols + pth.x); if (dstBx != null) hiddenBox.exchangeLocation(dstBx); } ps.setCounterValue(SCORE_COUNTER, bg.countCellsAtEquivalentPlace(true)); playing = true; } } public void render(Graphics2D g2, Rectangle dirtyRegion) { if (bg != null) bg.update(g2, dirtyRegion, this); if (parkBg != null) parkBg.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (bg == null || parkBg == null || getSize().equals(preferredMaxSize)) return preferredMaxSize; return BoxBag.layoutDouble(preferredMaxSize, bg, parkBg, boxGridPos, margin); } @Override public void processMouse(MouseEvent e) { ActiveBox bx; Point p = e.getPoint(); if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); bx = bg.findActiveBox(p); if (bx != null) { if (bx.isVisible()) { Point pt = bg.getCoordDist(bx, hiddenBox); if (Math.abs(pt.x) + Math.abs(pt.y) == 1) { boolean m = bx.playMedia(ps); String src = bx.getDescription() + "(" + bx.idOrder + ")"; String dest = "(" + hiddenBox.idLoc + ")"; bx.exchangeLocation(hiddenBox); boolean ok = (bx.idOrder == bx.idLoc); int cellsAtPlace = bg.countCellsAtEquivalentPlace(true); ps.reportNewAction(getActivity(), ACTION_SELECT, src, dest, ok, cellsAtPlace); if (ok && cellsAtPlace == bg.getNumCells()) { hiddenBox.setVisible(true); parkBg.setVisible(false); finishActivity(true); } else if (!m) playEvent(EventSounds.CLICK); } } else playEvent(EventSounds.ACTION_ERROR); } repaint(); break; } } @Override public void showHelp() { if (!helpWindowAllowed() || bg == null) return; HelpActivityComponent hac = null; if (showSolution) { hac = new HelpActivityComponent(this) { ActiveBoxBag abb = null; public void render(Graphics2D g2, Rectangle dirtyRegion) { if (abb != null) abb.update(g2, dirtyRegion, this); } @Override public void init() { abb = ActiveBoxGrid.createEmptyGrid(null, this, DEFAULT_MARGIN, DEFAULT_MARGIN, abc[0]); abb.setContent(abc[0]); abb.setVisible(true); Dimension size = bg.getBounds().getSize(); abb.setBounds(DEFAULT_MARGIN, DEFAULT_MARGIN, size.width, size.height); size.width += 2 * DEFAULT_MARGIN; size.height += 2 * DEFAULT_MARGIN; setPreferredSize(size); setMaximumSize(size); setMinimumSize(size); Point p = (Point) getClientProperty(HelpActivityComponent.PREFERRED_LOCATION); if (p != null) p.translate((int) bg.x - DEFAULT_MARGIN, (int) bg.y - DEFAULT_MARGIN); } @Override public void processMouse(MouseEvent e) { // no mouse } }; hac.init(); } if (ps.showHelp(hac, helpMsg)) ps.reportNewAction(getActivity(), ACTION_HELP, null, null, false, bg.countCellsAtEquivalentPlace(true)); if (hac != null) hac.end(); } } } src/core/edu/xtec/jclic/activities/text/000077500000000000000000000000001335566474600205545ustar00rootroot00000000000000src/core/edu/xtec/jclic/activities/text/BasicEvaluator.java000066400000000000000000000106351335566474600243300ustar00rootroot00000000000000/* * File : BasicEvaluator.java * Created : 07-jun-2001 13:50 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.text.Collator; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class BasicEvaluator extends Evaluator { public static final String CHECK_CASE = "checkCase"; public static final String CHECK_ACCENTS = "checkAccents"; public static final String CHECK_PUNCTUATION = "checkPunctuation"; public static final String CHECK_DOUBLE_SPACES = "checkDoubleSpaces"; public static final String PUNCTUATION = ".,;:"; protected boolean checkCase; protected boolean checkAccents; protected boolean checkPunctuation; protected boolean checkDoubleSpaces; int strength; /** Creates new BasicEvaluator */ public BasicEvaluator(JClicProject project) { super(project); checkCase = false; checkAccents = true; checkPunctuation = true; checkDoubleSpaces = false; init(); } @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); if (checkCase) e.setAttribute(CHECK_CASE, JDomUtility.boolString(checkCase)); if (!checkAccents) e.setAttribute(CHECK_ACCENTS, JDomUtility.boolString(checkAccents)); if (!checkPunctuation) e.setAttribute(CHECK_PUNCTUATION, JDomUtility.boolString(checkPunctuation)); if (checkDoubleSpaces) e.setAttribute(CHECK_DOUBLE_SPACES, JDomUtility.boolString(checkDoubleSpaces)); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); checkCase = JDomUtility.getBoolAttr(e, CHECK_CASE, false); checkAccents = JDomUtility.getBoolAttr(e, CHECK_ACCENTS, true); checkPunctuation = JDomUtility.getBoolAttr(e, CHECK_PUNCTUATION, true); checkDoubleSpaces = JDomUtility.getBoolAttr(e, CHECK_DOUBLE_SPACES, false); } public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) { checkCase = c3a.avMaj; checkAccents = c3a.avAcc; checkPunctuation = c3a.avPunt; checkDoubleSpaces = c3a.avDblSpc; } @Override protected void init() { super.init(); strength = checkAccents ? checkCase ? Collator.TERTIARY : Collator.SECONDARY : Collator.PRIMARY; collator.setStrength(strength); } public boolean checkText(String text, String match) { return collator.equals(getClearedText(text), getClearedText(match)); } public byte[] evalText(String text, String[] match) { byte[] flags = new byte[text.length()]; boolean result = checkText(text, match); for (int i = 0; i < flags.length; i++) { flags[i] = result ? FLAG_OK : FLAG_DEFAULT_ERROR; } return flags; } protected String getClearedText(String src) { return getClearedText(src, null); } protected String getClearedText(String src, boolean[] skipped) { if (skipped == null) skipped = new boolean[src.length()]; for (int i = 0; i < src.length(); i++) skipped[i] = false; if (checkPunctuation && checkDoubleSpaces) return src; StringBuilder sb = new StringBuilder(); boolean wasSpace = false; for (int i = 0; i < src.length(); i++) { char ch = src.charAt(i); if (PUNCTUATION.indexOf(ch) >= 0 && !checkPunctuation) { if (!wasSpace) sb.append(' '); else skipped[i] = true; wasSpace = true; } else if (ch == ' ') { if (checkDoubleSpaces || !wasSpace) sb.append(ch); else skipped[i] = true; wasSpace = true; } else { wasSpace = false; sb.append(ch); } } return sb.substring(0); } } src/core/edu/xtec/jclic/activities/text/Complete.java000066400000000000000000000202341335566474600231700ustar00rootroot00000000000000/* * File : Complete.java * Created : 24-oct-2001 17:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Actions; import edu.xtec.util.StrUtils; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class Complete extends TextActivityBase { Evaluator ev; /** Creates new Complete */ public Complete(JClicProject project) { super(project); ev = new ComplexEvaluator(project); hasCheckButton = true; } @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); e.addContent(ev.getJDomElement()); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); ev = Evaluator.getEvaluator(e.getChild(Evaluator.ELEMENT_NAME), project); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); ((ComplexEvaluator) ev).setProperties(c3a); hasCheckButton = true; } @Override public boolean needsKeyboard() { return true; } @Override public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends TextActivityBase.Panel { TextActivityDocument playDoc = null; boolean locked; int nActions; protected Panel(PlayStation ps) { super(ps); locked = true; nActions = 0; } @Override protected void initDocument() throws Exception { nActions = 0; if (tad != null) { playing = false; playDoc = new TextActivityDocument(styleContext); tad.cloneDoc(playDoc, true, false, false); pane.setStyledDocument(playDoc); playDoc.attachTo(pane, Complete.Panel.this); pane.setEnabled(true); if (playDoc.tmb.size() > 0) { pane.setEditable(true); pane.requestFocus(); pane.getCaret().setVisible(true); locked = false; } else { locked = true; pane.setEditable(false); pane.getCaret().setVisible(false); } } } @Override protected TextActivityPane buildPane() { CompletePane cp = new CompletePane(); cp.setActions(); return cp; } class CompletePane extends TextActivityPane { protected CompletePane() { super(Complete.Panel.this); } @Override public boolean processMouse(MouseEvent e) { if (super.processMouse(e) && e.getID() == MouseEvent.MOUSE_PRESSED && playing && !locked) return true; return false; } protected void invalidateSelection() { int offset = getCaret().getDot(); if (getCaret().getMark() != offset) getCaret().setDot(offset); } @Override protected void fireCaretUpdate(CaretEvent e) { invalidateSelection(); super.fireCaretUpdate(e); } @Override public void replaceSelection(String content) { invalidateSelection(); if (content != null && content.length() > 0) { char ch = content.charAt(0); int offset = getCaret().getDot(); if (ch >= 0x20 && ch != 0x7F) { try { playDoc.insertString(offset, new String(new char[] { ch }), playDoc.getTargetAttributeSet()); } catch (BadLocationException ex) { System.err.println("Text activity error:\n" + ex); } } } } @Override public void cut() { invalidateSelection(); } @Override public void paste() { invalidateSelection(); } boolean readyForActions() { return playing && !locked && isEditable() && isEnabled(); } // Actions Action kitDeletePrevCharAction = null; AbstractAction deletePrevCharAction = new AbstractAction(DefaultEditorKit.deletePrevCharAction) { public void actionPerformed(ActionEvent e) { if (readyForActions() && kitDeletePrevCharAction != null) { invalidateSelection(); int offset = getCaret().getDot() - 1; if (offset > 0 && playDoc.checkBooleanAttribute(offset, TextActivityDocument.TARGET) == true) { kitDeletePrevCharAction.actionPerformed(e); } } } }; Action kitDeleteNextCharAction = null; AbstractAction deleteNextCharAction = new AbstractAction(DefaultEditorKit.deleteNextCharAction) { public void actionPerformed(ActionEvent e) { if (readyForActions() && kitDeleteNextCharAction != null) { invalidateSelection(); int offset = getCaret().getDot(); if (offset >= 0 && offset < playDoc.getLength() && playDoc.checkBooleanAttribute(offset, TextActivityDocument.TARGET) == true) { kitDeleteNextCharAction.actionPerformed(e); } } } }; protected void setActions() { kitDeleteNextCharAction = getActionMap().get(DefaultEditorKit.deleteNextCharAction); kitDeletePrevCharAction = getActionMap().get(DefaultEditorKit.deletePrevCharAction); java.util.Map actionKeys = Actions.getActionKeys(this); ActionMap am = new ActionMap(); am.setParent(getActionMap()); setActionMap(am); Actions.mapAction(this, actionKeys, deletePrevCharAction); Actions.mapAction(this, actionKeys, deleteNextCharAction); } } @Override protected void doCheck(boolean fromButton) { if (playDoc == null || locked) return; String match; String current; try { match = StrUtils.trimEnding(tad.getText(0, tad.getLength())); current = StrUtils.trimEnding(playDoc.getText(0, playDoc.getLength())); } catch (BadLocationException e) { System.err.println("Error: unable to retrieve text:\n" + e); return; } byte[] result = ev.evalText(current, match); int score = 0; if (result != null) { int l = result.length; int i = 0; while (i < l) { while (i < l && !playDoc.checkBooleanAttribute(i, TextActivityDocument.TARGET)) i++; if (i < l) { nActions++; boolean actionOk = true; int j = i; while (i < l && playDoc.checkBooleanAttribute(i, TextActivityDocument.TARGET)) i++; playDoc.setCharacterAttributes(j, i - j, styleContext.getStyle(TextActivityDocument.TARGET), true); for (int k = j; k < i; k++) { if (result[k] != Evaluator.FLAG_OK) { actionOk = false; playDoc.setCharacterAttributes(k, 1, styleContext.getStyle(TextActivityDocument.TARGET_ERROR), false); } } if (actionOk) score++; } } } ps.setCounterValue(SCORE_COUNTER, score); ps.setCounterValue(ACTIONS_COUNTER, nActions); if (Evaluator.isOk(result)) finishActivity(true); else if (fromButton) playEvent(EventSounds.FINISHED_ERROR); } @Override public void finishActivity(boolean result) { pane.setEditable(false); pane.setEnabled(false); super.finishActivity(result); } } } src/core/edu/xtec/jclic/activities/text/ComplexEvaluator.java000066400000000000000000000142161335566474600247150ustar00rootroot00000000000000/* * File : ComplexEvaluator.java * Created : 11-jun-2001 14:56 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class ComplexEvaluator extends BasicEvaluator { public static final String DETAIL = "detail"; public static final String CHECK_STEPS = "checkSteps"; public static final int DEFAULT_CHECK_STEPS = 3; public static final String CHECK_SCOPE = "checkScope"; public static final int DEFAULT_CHECK_SCOPE = 6; protected boolean detail; protected int checkSteps; protected int checkScope; /** Creates new ComplexEvaluator */ public ComplexEvaluator(JClicProject project) { super(project); detail = true; checkSteps = DEFAULT_CHECK_STEPS; checkScope = DEFAULT_CHECK_SCOPE; } @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); if (!detail) e.setAttribute(DETAIL, JDomUtility.boolString(detail)); if (checkSteps != DEFAULT_CHECK_STEPS) e.setAttribute(CHECK_STEPS, Integer.toString(checkSteps)); if (checkScope != DEFAULT_CHECK_SCOPE) e.setAttribute(CHECK_SCOPE, Integer.toString(checkScope)); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); detail = JDomUtility.getBoolAttr(e, DETAIL, true); checkSteps = JDomUtility.getIntAttr(e, CHECK_STEPS, DEFAULT_CHECK_STEPS); checkScope = JDomUtility.getIntAttr(e, CHECK_SCOPE, DEFAULT_CHECK_SCOPE); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) { super.setProperties(c3a); detail = c3a.avLletra; checkSteps = c3a.avScope; checkScope = c3a.avMaxScope; } @Override protected void init() { super.init(); } @Override public byte[] evalText(String text, String[] match) { if (!detail) return super.evalText(text, match); int[] numChecks = new int[match.length]; int maxCheck = -1, maxCheckIndex = -1; byte[][] flags = new byte[match.length][]; boolean[] skipped = new boolean[text.length()]; String sText = getClearedText(text, skipped); for (int i = 0; i < match.length; i++) { String sMatch = getClearedText(match[i]); flags[i] = new byte[sText.length()]; boolean ok = compareSegment(sText, sText.length(), match[i], match[i].length(), flags[i], false); numChecks[i] = countFlagsOk(flags[i]); if (ok) { maxCheckIndex = i; maxCheck = numChecks[i]; } } if (maxCheckIndex == -1) { for (int i = 0; i < match.length; i++) { if (numChecks[i] > maxCheck) { maxCheck = numChecks[i]; maxCheckIndex = i; } } } byte[] returnFlags = new byte[text.length()]; for (int i = 0, k = 0; i < text.length(); i++) { if (skipped[i]) returnFlags[i] = FLAG_OK; else returnFlags[i] = flags[maxCheckIndex][k++]; } return returnFlags; } private int countFlagsOk(byte[] flags) { int r = 0; for (int i = 0; i < flags.length; i++) if (flags[i] == Evaluator.FLAG_OK) r++; return r; } private boolean compareSegment(String src, int ls, String ok, int lok, byte[] attr, boolean iterate) { int coinci; int is, iok, lastIs; boolean lastiok = true; boolean result = true; char chs, chok; coinci = 0; if (ls == 0 || lok == 0 || src == null || ok == null) return false; // chs=chok= iterate ? 0 : ' '; lastIs = 0; for (iok = 0, is = 0; is < ls; is++, iok++) { chs = src.charAt(is); lastIs = is; if (iok >= 0 && iok < lok) chok = ok.charAt(iok); else chok = 0; if (collator.equals(new String(new char[] { chs }), new String(new char[] { chok }))) { coinci++; attr[is] = Evaluator.FLAG_OK; lastiok = true; } else { result = false; attr[is] = Evaluator.FLAG_DEFAULT_ERROR; if (!iterate && lastiok && chok != 0 && checkSteps > 0 && checkScope > 0) { int lbloc = 2 * checkSteps + 1; int[] itcoinc = new int[lbloc]; int i = 0, j, is2, iok2, ls2, lok2, jmax; for (j = 0; j < lbloc; j++) { itcoinc[j] = 0; i = iok + ((j + 1) / 2) * ((j & 1) != 0 ? 1 : -1); if (i >= lok) continue; is2 = (i < 0 ? is - i : is); if (is2 >= ls) continue; ls2 = (ls2 = ls - is2) > checkScope ? checkScope : ls2; iok2 = (i < 0 ? 0 : i); lok2 = (lok2 = lok - iok2) > checkScope ? checkScope : lok2; byte[] flags2 = new byte[src.length() - is2]; boolean result2 = compareSegment(src.substring(is2), ls2, ok.substring(iok2), lok2, flags2, true); itcoinc[j] = countFlagsOk(flags2); if (result2) break; } if (j == lbloc) { jmax = checkSteps; for (j = 0; j < lbloc; j++) if (itcoinc[j] > itcoinc[jmax]) jmax = j; i = iok + ((jmax + 1) / 2) * ((jmax & 1) != 0 ? 1 : -1); } else if (itcoinc[j] > 0) coinci++; iok = i; lastiok = false; } } } if (iok != lok) { result = false; attr[lastIs] = Evaluator.FLAG_DEFAULT_ERROR; } return result; } } src/core/edu/xtec/jclic/activities/text/Evaluator.java000066400000000000000000000064311335566474600233650ustar00rootroot00000000000000/* * File : Evaluator.java * Created : 07-jun-2001 13:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.text.Collator; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public abstract class Evaluator extends java.lang.Object implements Domable { public static final byte FLAG_OK = 0; public static final byte FLAG_DEFAULT_ERROR = 1; Collator collator; protected boolean initiated = false; /** Creates new Evaluator */ public Evaluator(JClicProject project) { if (project.getBridge() != null) collator = project.getBridge().getOptions().getMessages().getCollator(); else collator = Collator.getInstance(); } public static final String ELEMENT_NAME = "evaluator"; public static final String BASE_CLASS = "edu.xtec.jclic.activities.text.", BASE_CLASS_TAG = "@"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); String s = getClass().getName(); if (s.startsWith(BASE_CLASS)) s = BASE_CLASS_TAG + s.substring(BASE_CLASS.length()); e.setAttribute(JDomUtility.CLASS, s); return e; } public static Evaluator getEvaluator(org.jdom.Element e, JClicProject project) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); String className = JDomUtility.getClassName(e); if (className.startsWith(BASE_CLASS_TAG)) className = BASE_CLASS + className.substring(1); String s; Evaluator ev; Class evaluatorClass; Class[] cparams = { JClicProject.class }; Object[] initArgs = { project }; evaluatorClass = Class.forName(className); java.lang.reflect.Constructor con = evaluatorClass.getConstructor(cparams); ev = (Evaluator) con.newInstance(initArgs); ev.setProperties(e, null); ev.init(); return ev; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { } protected void init() { initiated = true; } public boolean checkText(String text, String[] match) { for (String m : match) { if (checkText(text, m)) return true; } return false; } public abstract boolean checkText(String text, String match); public abstract byte[] evalText(String text, String[] match); public byte[] evalText(String text, String match) { return evalText(text, new String[] { match }); } public static boolean isOk(byte[] flags) { for (int fl : flags) if (fl != FLAG_OK) return false; return true; } } src/core/edu/xtec/jclic/activities/text/FillInBlanks.java000066400000000000000000000511141335566474600237310ustar00rootroot00000000000000/* * File : FillInBlanks.java * Created : 01-jun-2001 8:57 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Actions; import edu.xtec.util.JDomUtility; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class FillInBlanks extends TextActivityBase { protected boolean autoJump; protected boolean forceOkToAdvance; protected Evaluator ev; /** Creates new FillInBlanks */ public FillInBlanks(JClicProject project) { super(project); autoJump = false; forceOkToAdvance = false; ev = new ComplexEvaluator(project); } public static final String AUTO_JUMP = "autoJump", FORCE_OK_TO_ADVANCE = "forceOkToAdvance"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); if (autoJump) e.setAttribute(AUTO_JUMP, JDomUtility.boolString(autoJump)); if (forceOkToAdvance) e.setAttribute(FORCE_OK_TO_ADVANCE, JDomUtility.boolString(forceOkToAdvance)); e.addContent(ev.getJDomElement()); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); ev = Evaluator.getEvaluator(e.getChild(Evaluator.ELEMENT_NAME), project); autoJump = JDomUtility.getBoolAttr(e, AUTO_JUMP, autoJump); forceOkToAdvance = JDomUtility.getBoolAttr(e, FORCE_OK_TO_ADVANCE, forceOkToAdvance); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); ((ComplexEvaluator) ev).setProperties(c3a); forceOkToAdvance = c3a.okToNext; autoJump = !c3a.avNoSalta; hasCheckButton = !c3a.avCont; // evalOnTheFly=c3a.avCont; // if(evalOnTheFly) // hasCheckButton=false; } @Override public boolean needsKeyboard() { return true; } @Override public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends TextActivityBase.Panel { boolean locked; TextActivityDocument playDoc = null; protected Panel(PlayStation ps) { super(ps); locked = true; } @Override protected void initDocument() throws Exception { if (tad != null) { playing = false; tad.tmb.setCurrentTarget(null, this); tad.tmb.reset(); playDoc = new TextActivityDocument(styleContext); tad.cloneDoc(playDoc, false, true, false); pane.setStyledDocument(playDoc); playDoc.attachTo(pane, FillInBlanks.Panel.this); tad.tmb.setParentPane(pane); pane.setEnabled(true); if (playDoc.tmb.size() > 0) { pane.setEditable(true); pane.requestFocus(); pane.getCaret().setVisible(true); setCaretPos(0); locked = false; } else { locked = true; pane.setEditable(false); pane.getCaret().setVisible(false); } } } @Override protected TextActivityPane buildPane() { FillInBlanksPane fp = new FillInBlanksPane(); fp.setActions(); return fp; } class FillInBlanksPane extends TextActivityPane { protected FillInBlanksPane() { super(FillInBlanks.Panel.this); } @Override public boolean processMouse(MouseEvent e) { if (super.processMouse(e) && e.getID() == MouseEvent.MOUSE_PRESSED && playing && !locked) { int p = this.viewToModel(e.getPoint()); if (p >= 0) setCaretPos(p); } return false; } protected void removeChar(int offset) throws BadLocationException { TargetMarker tm = playDoc.tmb.getCurrentTarget(); if (tm == null || !tm.contains(offset, false)) { playEvent(EventSounds.ACTION_ERROR); return; } boolean lastChar = (tm.getLength() == 1); playDoc.remove(offset, 1); tm.target.setModified(true); if (lastChar) { playDoc.insertString(tm.begOffset, tm.target.getFillString(1), playDoc.getFillAttributeSet()); getCaret().setDot(tm.begOffset); } else { tm.endOffset--; getCaret().setDot(offset); } tm.setPositions(); playDoc.tmb.updateOffsets(); } protected void removeCharCatch(int offset) { try { removeChar(offset); } catch (BadLocationException ex) { System.err.println("Text activity error:\n" + ex); } } protected void insertChar(int offset, char ch) throws BadLocationException { TargetMarker tm = playDoc.tmb.getCurrentTarget(); if (tm == null || !tm.contains(offset, true) || ch < 0x20) return; int firstFill = getFirstFillChar(tm); if (firstFill >= 0) { playDoc.remove(firstFill, 1); if (offset > firstFill) offset--; } else if (tm.getLength() >= tm.target.maxLenResp) { playEvent(EventSounds.ACTION_ERROR); return; } playDoc.insertString(offset, new String(new char[] { ch }), playDoc.getTargetAttributeSet()); tm.target.setModified(true); if (firstFill < 0) tm.endOffset++; tm.setPositions(); playDoc.tmb.updateOffsets(); if (autoJump && tm.getCurrentText(TextActivityDocument.FILL).length() >= tm.target.maxLenResp) { getCaret().setDot(goToTarget(playDoc.tmb.getNextTarget(tm), -1)); } else { getCaret().setDot(offset + 1); } } protected void insertCharCatch(int offset, char ch) { try { insertChar(offset, ch); } catch (BadLocationException ex) { System.err.println("Text activity error:\n" + ex); } } protected int getFirstFillChar(TargetMarker tm) { for (int i = tm.begOffset; i < tm.endOffset; i++) if (playDoc.checkBooleanAttribute(i, TextActivityDocument.FILL)) return i; return -1; } boolean readyForActions() { return playing && !locked && isEditable() && isEnabled(); } // Actions AbstractAction defaultKeyTypedAction = new AbstractAction(DefaultEditorKit.defaultKeyTypedAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { String content = e.getActionCommand(); int mod = e.getModifiers(); if ((content != null) && (content.length() > 0) && ((mod & ActionEvent.ALT_MASK) == (mod & ActionEvent.CTRL_MASK))) { char c = content.charAt(0); if ((c >= 0x20) && (c != 0x7F)) { insertCharCatch(getCaret().getDot(), c); } } } } }; AbstractAction forwardAction = new AbstractAction(DefaultEditorKit.forwardAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { int k = getCaret().getDot(); setCaretPos(k + 1, k, true); } } }; AbstractAction backwardAction = new AbstractAction(DefaultEditorKit.backwardAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { int k = getCaret().getDot(); setCaretPos(k - 1, k, false); } } }; AbstractAction nextTargetAction = new AbstractAction("next-target") { public void actionPerformed(ActionEvent e) { if (readyForActions()) { getCaret().setDot(goToTarget(playDoc.tmb.getNextTarget(null), -1)); } } }; AbstractAction prevTargetAction = new AbstractAction("prev-target") { public void actionPerformed(ActionEvent e) { if (readyForActions()) { getCaret().setDot(goToTarget(playDoc.tmb.getPrevTarget(null), -1)); } } }; AbstractAction insertBreakAction = new AbstractAction(DefaultEditorKit.insertBreakAction) { public void actionPerformed(ActionEvent e) { insertTabAction.actionPerformed(e); } }; AbstractAction insertTabAction = new AbstractAction(DefaultEditorKit.insertTabAction) { public void actionPerformed(ActionEvent e) { if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) prevTargetAction.actionPerformed(e); else nextTargetAction.actionPerformed(e); } }; AbstractAction deletePrevCharAction = new AbstractAction(DefaultEditorKit.deletePrevCharAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { removeCharCatch(getCaret().getDot() - 1); } } }; AbstractAction deleteNextCharAction = new AbstractAction(DefaultEditorKit.deleteNextCharAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { removeCharCatch(getCaret().getDot()); } } }; AbstractAction beginWordAction = new AbstractAction(DefaultEditorKit.beginWordAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { TargetMarker tm = playDoc.tmb.getCurrentTarget(); if (tm != null) setCaretPos(tm.begOffset); } } }; AbstractAction endWordAction = new AbstractAction(DefaultEditorKit.endWordAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { TargetMarker tm = playDoc.tmb.getCurrentTarget(); if (tm != null) setCaretPos(tm.endOffset); } } }; AbstractAction beginAction = new AbstractAction(DefaultEditorKit.beginAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { if ((e.getModifiers() & ActionEvent.CTRL_MASK) != 0) setCaretPos(goToTarget(playDoc.tmb.getElement(0), -1)); else beginWordAction.actionPerformed(e); } } }; AbstractAction endAction = new AbstractAction(DefaultEditorKit.endAction) { public void actionPerformed(ActionEvent e) { if (readyForActions()) { if ((e.getModifiers() & ActionEvent.CTRL_MASK) != 0) setCaretPos(goToTarget(playDoc.tmb.getElement(playDoc.tmb.size() - 1), -1)); else endWordAction.actionPerformed(e); } } }; AbstractAction showHelpAction = new AbstractAction("show-help") { public void actionPerformed(ActionEvent e) { if (readyForActions()) { TargetMarker tm = playDoc.tmb.getCurrentTarget(); if (tm != null && tm.target != null && tm.target.popupContent != null && tm.target.infoMode == TextTarget.INFO_ON_DEMAND) tm.target.checkPopup(Panel.this, tm, true); } } }; Action kitUpAction = null; AbstractAction upAction = new AbstractAction(DefaultEditorKit.upAction) { public void actionPerformed(ActionEvent e) { if (kitUpAction != null && readyForActions()) { int bkPos = getCaret().getDot(); kitUpAction.actionPerformed(e); int newPos = getCaret().getDot(); getCaret().setDot(bkPos); setCaretPos(newPos, bkPos, false); } } }; Action kitDownAction = null; AbstractAction downAction = new AbstractAction(DefaultEditorKit.downAction) { public void actionPerformed(ActionEvent e) { if (kitDownAction != null && readyForActions()) { int bkPos = getCaret().getDot(); kitDownAction.actionPerformed(e); int newPos = getCaret().getDot(); getCaret().setDot(bkPos); setCaretPos(newPos, bkPos, true); } } }; protected void setActions() { kitUpAction = getActionMap().get(DefaultEditorKit.upAction); kitDownAction = getActionMap().get(DefaultEditorKit.downAction); java.util.Map actionKeys = Actions.getActionKeys(this); ActionMap am = new ActionMap(); am.setParent(getActionMap()); setActionMap(am); // Originals: Actions.mapTraceAction(this, actionKeys, DefaultEditorKit.beepAction); Actions.mapTraceAction(this, actionKeys, "requestFocus"); Actions.mapTraceAction(this, actionKeys, "toggle-componentOrientation"); // Derivats: Actions.mapAction(this, actionKeys, defaultKeyTypedAction); Actions.mapAction(this, actionKeys, insertBreakAction); Actions.mapAction(this, actionKeys, insertTabAction); Actions.mapAction(this, actionKeys, deletePrevCharAction); Actions.mapAction(this, actionKeys, deleteNextCharAction); Actions.mapAction(this, actionKeys, forwardAction); Actions.mapAction(this, actionKeys, backwardAction); Actions.mapAction(this, actionKeys, beginWordAction); Actions.mapAction(this, actionKeys, endWordAction); Actions.mapAction(this, actionKeys, beginAction); Actions.mapAction(this, actionKeys, endAction); Actions.mapAction(this, actionKeys, upAction); Actions.mapAction(this, actionKeys, downAction); Actions.mapAction(this, actionKeys, showHelpAction); Actions.mapAction(this, actionKeys, nextTargetAction); Actions.mapAction(this, actionKeys, prevTargetAction); Actions.mapAction(this, actionKeys, nextTargetAction, DefaultEditorKit.nextWordAction); Actions.mapAction(this, actionKeys, prevTargetAction, DefaultEditorKit.previousWordAction); Actions.mapAction(this, actionKeys, nextTargetAction, DefaultEditorKit.endParagraphAction); Actions.mapAction(this, actionKeys, prevTargetAction, DefaultEditorKit.beginParagraphAction); Actions.mapAction(this, actionKeys, nextTargetAction, DefaultEditorKit.beginLineAction); Actions.mapAction(this, actionKeys, prevTargetAction, DefaultEditorKit.endLineAction); Actions.mapAction(this, actionKeys, nextTargetAction, DefaultEditorKit.pageDownAction); Actions.mapAction(this, actionKeys, prevTargetAction, DefaultEditorKit.pageUpAction); am.setParent(null); getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_TAB, java.awt.Event.SHIFT_MASK), insertTabAction.getValue(Action.NAME)); getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0), showHelpAction.getValue(Action.NAME)); } @Override protected void targetChanged(TextTarget tt) { if (readyForActions()) { TargetMarker tm = playDoc.tmb.getElement(tt); if (tm != null) { TargetMarker currentTm = playDoc.tmb.getCurrentTarget(); goToTarget(tm, -1); if (currentTm != tm && !hasCheckButton) { tm.target.setModified(true); goToTarget(tm, -1); } } } } } protected boolean evalTarget(TargetMarker tm) { if (tm.target == null) return false; String src = tm.getCurrentText(TextActivityDocument.FILL); if (src == null || src.length() < 1) return false; byte[] result = ev.evalText(src, tm.target.answer); boolean ok = Evaluator.isOk(result); tm.target.targetStatus = ok ? TextTarget.SOLVED : TextTarget.WITH_ERROR; markTarget(tm, result); return ok; } protected void markTarget(TargetMarker tm, byte[] attributes) { if (tm.target.comboList != null) { tm.target.comboList.checkColors(); tm.target.comboList.repaint(); return; } int bgTarget = tm.begPos.getOffset(); int endTarget = tm.endPos.getOffset(); int p = 0; for (int i = bgTarget; i < endTarget && p < attributes.length; i++) { if (!playDoc.checkBooleanAttribute(i, TextActivityDocument.FILL)) { playDoc.setCharacterAttributes(i, 1, styleContext.getStyle( attributes[p] == Evaluator.FLAG_OK ? TextActivityDocument.TARGET : TextActivityDocument.TARGET_ERROR), false); p++; } } } protected void setCaretPos(int offset) { setCaretPos(offset, pane.getCaret().getDot(), true); } protected void setCaretPos(int offset, int currentOffset, boolean searchForward) { int check = checkCaretPos(offset, searchForward); if (check == -1) pane.setEditable(false); else if (check != currentOffset) pane.setCaretPosition(check); } protected int checkCaretPos(int offset, boolean searchForward) { TargetMarkerBag tmb = playDoc.tmb; TargetMarker tm = tmb.getElementByOffset(offset, true); int p = offset; if (tm == null) { tm = tmb.getNearestElement(offset, searchForward); if (tm == null) tm = tmb.getNearestElement(offset, !searchForward); if (tm == null) { pane.setEditable(false); locked = true; return -1; } else { if (searchForward) p = tm.begPos.getOffset(); else p = tm.endPos.getOffset(); } } if (tmb.getCurrentTarget() != tm || tm.target.comboList != null) p = goToTarget(tm, p); return p; } protected int goToTarget(TargetMarker tm, int offset) { int p = offset; TargetMarkerBag tmb = playDoc.tmb; if (tmb.getCurrentTarget() != null && !hasCheckButton) { TargetMarker currentTm = tmb.getCurrentTarget(); if (!hasCheckButton && currentTm != null && (currentTm.target.isModified() || forceOkToAdvance)) { boolean ok = evalTarget(currentTm); if (!ok) currentTm.target.checkPopup(this, currentTm, false); int solvedTargets = tmb.countSolvedTargets(); ps.reportNewAction(getActivity(), ACTION_WRITE, currentTm.getCurrentText(TextActivityDocument.FILL), currentTm.target.getAnswers(), ok, solvedTargets); if (ok && solvedTargets == tmb.size()) { finishActivity(true); } else { playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } if (forceOkToAdvance && !ok) { tm = currentTm; tmb.setCurrentTarget(tm, this); return tm.begPos.getOffset(); } } } if (p < 0) p = tm.begPos.getOffset(); if (!tm.contains(p, true)) p = tm.begOffset; tmb.setCurrentTarget(tm, this); return p; } @Override protected void doCheck(boolean fromButton) { if (playDoc == null || locked) return; TargetMarkerBag tmb = playDoc.tmb; if (tmb.getCurrentTarget() != null && !hasCheckButton) { goToTarget(tmb.getCurrentTarget(), -1); return; } int solvedTargets = 0; for (int i = 0; i < tmb.size(); i++) { TargetMarker tm = tmb.getElement(i); if (tm != null && tm.target.targetStatus != TextTarget.NOT_EDITED) { boolean ok = evalTarget(tm); solvedTargets = tmb.countSolvedTargets(); ps.reportNewAction(getActivity(), ACTION_WRITE, tm.getCurrentText(TextActivityDocument.FILL), tm.target.getAnswers(), ok, solvedTargets); } } if (solvedTargets != tmb.size()) { if (fromButton) { playEvent(EventSounds.FINISHED_ERROR); if (tmb.getCurrentTarget() != null) goToTarget(tmb.getCurrentTarget(), -1); } } else finishActivity(true); } @Override public void finishActivity(boolean result) { pane.setEditable(false); pane.setEnabled(false); if (playDoc != null && playDoc.tmb.getCurrentTarget() != null) ; playDoc.tmb.getCurrentTarget().lostFocus(this); super.finishActivity(result); } } } src/core/edu/xtec/jclic/activities/text/Identify.java000066400000000000000000000215361335566474600232010ustar00rootroot00000000000000/* * File : Identify.java * Created : 24-oct-2001 17:03 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Actions; import edu.xtec.util.JDomUtility; import java.awt.AWTEvent; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class Identify extends TextActivityBase { public static final int IDENTIFY_WORDS = 0, IDENTIFY_CHARS = 1; protected int type; /** Creates new Identify */ public Identify(JClicProject project) { super(project); // evalOnTheFly=false; setType(IDENTIFY_WORDS); hasCheckButton = true; checkButtonText = ""; } public static final String[] TYPES = { "identifyWords", "identifyChars" }; @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); e.setAttribute(TYPE, TYPES[type]); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); setType(JDomUtility.getStrIndexAttr(e, TYPE, TYPES, type)); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); setType(c3a.puzMode == edu.xtec.jclic.clic3.Clic3.IDPARAULES ? IDENTIFY_WORDS : IDENTIFY_CHARS); } @Override public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } /** * Getter for property type. * * @return Value of property type. */ public int getType() { return type; } /** * Setter for property type. * * @param type New value of property type. */ public void setType(int type) { this.type = (type == IDENTIFY_CHARS ? IDENTIFY_CHARS : IDENTIFY_WORDS); tad.setTargetType(type == IDENTIFY_CHARS ? TextActivityDocument.TT_CHAR : TextActivityDocument.TT_WORD); } class Panel extends TextActivityBase.Panel { TextActivityDocument playDoc; int nActions; int score; boolean[] validChars; boolean[] marks; boolean[] targets; protected Panel(PlayStation ps) { super(ps); playDoc = null; nActions = 0; score = 0; validChars = null; marks = null; targets = null; } @Override protected void initDocument() throws Exception { if (tad != null) { playing = false; playDoc = new TextActivityDocument(styleContext); tad.cloneDoc(playDoc, false, false, true); if (!buildCheckArrays()) return; pane.setStyledDocument(playDoc); playDoc.attachTo(pane, Identify.Panel.this); pane.setEditable(false); pane.requestFocus(); nActions = 0; score = 0; } } private boolean buildCheckArrays() { if (playDoc == null) return false; int l = playDoc.getLength(); if (l > 0) { char[] chars; try { chars = playDoc.getText(0, l).toCharArray(); } catch (BadLocationException ex) { playDoc = null; return false; } validChars = new boolean[l]; marks = new boolean[l]; targets = new boolean[l]; for (int i = 0; i < l; i++) { marks[i] = false; targets[i] = false; validChars[i] = Character.isLetterOrDigit(chars[i]); } for (int i = 0; i < playDoc.tmb.size(); i++) { TargetMarker tm = playDoc.tmb.getElement(i); for (int j = tm.begOffset; j < tm.endOffset; j++) targets[j] = true; } } else { validChars = new boolean[1]; marks = new boolean[1]; targets = new boolean[1]; } return true; } @Override protected TextActivityPane buildPane() { IdentifyPane p = new IdentifyPane(); p.setActions(); return p; } class IdentifyPane extends TextActivityPane { protected IdentifyPane() { super(Identify.Panel.this); enableEvents(AWTEvent.MOUSE_EVENT_MASK); } @Override public boolean processMouse(MouseEvent e) { if (!super.processMouse(e) || !playing || playDoc == null) return false; if (e.getID() == MouseEvent.MOUSE_PRESSED) select(viewToModel(e.getPoint())); return false; } protected void select(int p) { if (p < 0 || p >= marks.length) { playEvent(EventSounds.ACTION_ERROR); return; } nActions++; boolean marked = marks[p]; int l = 1; TargetMarker tm = playDoc.tmb.getElementByOffset(p, false); if (tm != null) { p = tm.begOffset; l = tm.getLength(); } else { if (!validChars[p]) { playEvent(EventSounds.ACTION_ERROR); return; } if (type == IDENTIFY_WORDS) { int it = p; while (it > 0 && validChars[it] == true) it--; int p0 = it + 1; it = p; p = p0; while (it < validChars.length && validChars[it] == true) it++; l = it - p0; } } playDoc.setCharacterAttributes(p, l, styleContext.getStyle(marked ? StyleContext.DEFAULT_STYLE : TextActivityDocument.TARGET), true); for (int i = 0; i < l; i++) marks[p + i] = !marked; if (!hasCheckButton) { TargetMarkerBag tmb = playDoc.tmb; boolean ok = (tm != null && marks[p] == true); boolean finishedOk = checkScore(); try { tabp.ps.reportNewAction(Identify.this, ACTION_SELECT, playDoc.getText(p, l), (marked ? "true" : "false"), ok, score); } catch (Exception ex) { // should never done } if (finishedOk) { finishActivity(true); return; } } playEvent(EventSounds.CLICK); } protected void setActions() { java.util.Map actionKeys = Actions.getActionKeys(this); ActionMap am = new ActionMap(); am.setParent(getActionMap()); setActionMap(am); // Originals: Actions.mapTraceAction(this, actionKeys, DefaultEditorKit.beepAction); Actions.mapTraceAction(this, actionKeys, "requestFocus"); Actions.mapTraceAction(this, actionKeys, "toggle-componentOrientation"); am.setParent(null); } } protected boolean checkScore() { score = 0; for (int i = 0; i < playDoc.tmb.size(); i++) { if (marks[playDoc.tmb.getElement(i).begOffset] == true) score++; } for (int i = 0; i < targets.length; i++) if (marks[i] && !targets[i]) return false; return (score == playDoc.tmb.size()); } @Override protected void doCheck(boolean fromButton) { if (playDoc == null || playDoc.tmb.size() == 0) return; TargetMarkerBag tmb = playDoc.tmb; int i, j; playDoc.setCharacterAttributes(0, marks.length, styleContext.getStyle(StyleContext.DEFAULT_STYLE), true); for (i = 0; i < marks.length; i++) { if (marks[i]) { for (j = i; j < marks.length; j++) if (!marks[j]) break; playDoc.setCharacterAttributes(i, j - i, styleContext.getStyle(TextActivityDocument.TARGET_ERROR), true); i = j; } } for (i = 0; i < tmb.size(); i++) { TargetMarker tm = tmb.getElement(i); playDoc.applyStyleToTarget(tm, marks[tm.begOffset] ? TextActivityDocument.TARGET : StyleContext.DEFAULT_STYLE, false, true); } boolean finishedOk = checkScore(); ps.setCounterValue(SCORE_COUNTER, score); ps.setCounterValue(ACTIONS_COUNTER, nActions); if (!finishedOk) { if (fromButton) { playEvent(EventSounds.FINISHED_ERROR); pane.requestFocus(); } } else finishActivity(true); } @Override public void finishActivity(boolean result) { pane.setEnabled(false); super.finishActivity(result); } } } src/core/edu/xtec/jclic/activities/text/Order.java000066400000000000000000000327131335566474600225000ustar00rootroot00000000000000/* * File : Order.java * Created : 24-oct-2001 17:04 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Actions; import edu.xtec.util.JDomUtility; import java.awt.AWTEvent; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class Order extends TextActivityBase { public static final int ORDER_WORDS = 0, ORDER_PARAGRAPHS = 1; protected boolean amongParagraphs; protected int type; protected Evaluator ev; /** Creates new Order */ public Order(JClicProject project) { super(project); amongParagraphs = false; setType(ORDER_WORDS); hasCheckButton = true; checkButtonText = ""; ev = new BasicEvaluator(project); } public static final String[] TYPES = { "orderWords", "orderParagraphs" }; public static final String AMONG_PARAGRAPHS = "amongParagraphs"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); e.setAttribute(TYPE, TYPES[type]); if (amongParagraphs) e.setAttribute(AMONG_PARAGRAPHS, JDomUtility.boolString(amongParagraphs)); e.addContent(ev.getJDomElement()); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); setType(JDomUtility.getStrIndexAttr(e, TYPE, TYPES, type)); if (type == ORDER_WORDS) amongParagraphs = JDomUtility.getBoolAttr(e, AMONG_PARAGRAPHS, amongParagraphs); ev = Evaluator.getEvaluator(e.getChild(Evaluator.ELEMENT_NAME), project); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); ((BasicEvaluator) ev).setProperties(c3a); setType(c3a.puzMode == edu.xtec.jclic.clic3.Clic3.BPARAGRAFS ? ORDER_PARAGRAPHS : ORDER_WORDS); amongParagraphs = c3a.brPar; } @Override public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } /** * Getter for property type. * * @return Value of property type. */ public int getType() { return type; } @Override public boolean hasRandom() { return true; } @Override public boolean shuffleAlways() { return true; } /** * Setter for property type. * * @param type New value of property type. */ public void setType(int type) { this.type = (type == ORDER_WORDS ? ORDER_WORDS : ORDER_PARAGRAPHS); tad.setTargetType(type == ORDER_WORDS ? TextActivityDocument.TT_WORD : TextActivityDocument.TT_PARAGRAPH); } class Panel extends TextActivityBase.Panel { TextActivityDocument playDoc; int nActions; TargetMarker anchor, cursor; protected Panel(PlayStation ps) { super(ps); playDoc = null; nActions = 0; } @Override protected void initDocument() throws Exception { if (tad != null) { playing = false; playDoc = new TextActivityDocument(styleContext); tad.cloneDoc(playDoc, false, false, false); for (int i = 0; i < playDoc.tmb.size(); i++) { playDoc.tmb.getElement(i).target = new TextTarget(); playDoc.tmb.getElement(i).target.answer = new String[] { playDoc.tmb.getElement(i).getCurrentText() }; } if (playDoc.tmb.size() > 1) { for (int i = 0; i < 5; i++) { if (shuffle() != playDoc.tmb.size()) break; } } pane.setStyledDocument(playDoc); playDoc.attachTo(pane, Order.Panel.this); pane.setEditable(false); pane.requestFocus(); bc = new edu.xtec.jclic.boxes.BoxConnector(pane); nActions = 0; } } private int shuffle() { if (playDoc == null || playDoc.tmb.size() < 2) return 0; TargetMarkerBag tmb = playDoc.tmb; int k = tmb.size(); int[] p = tmb.getParagragraphOffsets(); int[] p2 = new int[k]; int k2; for (k2 = 0; k2 < k; k2++) p2[k2] = k2; int t1; int t2 = 0; java.util.Random rnd = new java.util.Random(); for (int i = 0; i < shuffles; i++) { t1 = rnd.nextInt(k); if (type == ORDER_WORDS && !amongParagraphs) { k2 = 0; for (int j = 0; j < k; j++) { if (j != t1 && p[j] == p[t1]) p2[k2++] = j; } } if (k2 > 0) { for (int c = 0; c < 300; c++) { t2 = p2[rnd.nextInt(k2)]; if (t2 != t1) break; } if (t1 != t2) tmb.swapTargets(tmb.getElement(t1), tmb.getElement(t2)); } } return tmb.checkTargets(ev); } @Override protected TextActivityPane buildPane() { OrderPane p = new OrderPane(); p.setActions(); return p; } class OrderPane extends TextActivityPane { protected OrderPane() { super(Order.Panel.this); enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); } @Override public boolean processMouse(MouseEvent e) { if (!super.processMouse(e) || bc == null || !playing) return false; switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: int p = viewToModel(e.getPoint()); if (p >= 0) { playEvent(EventSounds.CLICK); TargetMarker tm = playDoc.tmb.getElementByOffset(p, false); if (tm != null) { setTargetCursor(tm); if (bc.active) { bc.end(); if (cursor == anchor) { setTargetAnchor(null); setTargetCursor(tm); } else { swapTargets(anchor, cursor); } } else { setTargetAnchor(tm); bc.begin(e.getPoint()); } } else { bc.end(); setTargetAnchor(null); } } break; case MouseEvent.MOUSE_MOVED: case MouseEvent.MOUSE_DRAGGED: if (bc.active) bc.moveTo(e.getPoint()); break; } return false; } public boolean initKeyAction() { if (!playing) return false; if (bc.active) bc.end(); if (cursor == null) { setTargetCursor(playDoc.tmb.getElement(0)); return false; } return true; } // Actions AbstractAction forwardAction = new AbstractAction(DefaultEditorKit.forwardAction) { public void actionPerformed(ActionEvent e) { nextTargetAction.actionPerformed(e); } }; AbstractAction backwardAction = new AbstractAction(DefaultEditorKit.backwardAction) { public void actionPerformed(ActionEvent e) { prevTargetAction.actionPerformed(e); } }; AbstractAction nextTargetAction = new AbstractAction("next-target") { public void actionPerformed(ActionEvent e) { if (initKeyAction()) { setTargetCursor(playDoc.tmb.getNextTarget(cursor)); } } }; AbstractAction prevTargetAction = new AbstractAction("prev-target") { public void actionPerformed(ActionEvent e) { if (initKeyAction()) { setTargetCursor(playDoc.tmb.getPrevTarget(cursor)); } } }; AbstractAction insertBreakAction = new AbstractAction(DefaultEditorKit.insertBreakAction) { public void actionPerformed(ActionEvent e) { if (initKeyAction()) { if (anchor == null) setTargetAnchor(cursor); else swapTargets(anchor, cursor); } } }; AbstractAction insertTabAction = new AbstractAction(DefaultEditorKit.insertTabAction) { public void actionPerformed(ActionEvent e) { if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) prevTargetAction.actionPerformed(e); else nextTargetAction.actionPerformed(e); } }; AbstractAction beginAction = new AbstractAction(DefaultEditorKit.beginAction) { public void actionPerformed(ActionEvent e) { if (initKeyAction()) { setTargetCursor(playDoc.tmb.getElement(0)); } } }; AbstractAction endAction = new AbstractAction(DefaultEditorKit.endAction) { public void actionPerformed(ActionEvent e) { if (initKeyAction()) { setTargetCursor(playDoc.tmb.getElement(playDoc.tmb.size() - 1)); } } }; AbstractAction upAction = new AbstractAction(DefaultEditorKit.upAction) { public void actionPerformed(ActionEvent e) { prevTargetAction.actionPerformed(e); } }; AbstractAction downAction = new AbstractAction(DefaultEditorKit.downAction) { public void actionPerformed(ActionEvent e) { nextTargetAction.actionPerformed(e); } }; protected void setActions() { java.util.Map actionKeys = Actions.getActionKeys(this); ActionMap am = new ActionMap(); am.setParent(getActionMap()); setActionMap(am); // Originals: Actions.mapTraceAction(this, actionKeys, DefaultEditorKit.beepAction); Actions.mapTraceAction(this, actionKeys, "requestFocus"); Actions.mapTraceAction(this, actionKeys, "toggle-componentOrientation"); // Derived: Actions.mapAction(this, actionKeys, insertBreakAction); Actions.mapAction(this, actionKeys, insertTabAction); Actions.mapAction(this, actionKeys, forwardAction); Actions.mapAction(this, actionKeys, backwardAction); Actions.mapAction(this, actionKeys, beginAction); Actions.mapAction(this, actionKeys, endAction); Actions.mapAction(this, actionKeys, upAction); Actions.mapAction(this, actionKeys, downAction); Actions.mapAction(this, actionKeys, nextTargetAction); Actions.mapAction(this, actionKeys, prevTargetAction); am.setParent(null); getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_TAB, java.awt.Event.SHIFT_MASK), insertTabAction.getValue(Action.NAME)); } } protected void setTargetAnchor(TargetMarker tm) { if (anchor != null) playDoc.applyStyleToTarget(anchor, TextActivityDocument.TARGET, false, true); anchor = tm; if (anchor != null) playDoc.applyStyleToTarget(anchor, TextActivityDocument.TARGET, true, true); } protected void setTargetCursor(TargetMarker tm) { if (tm != null && tm == anchor) { cursor = tm; return; } if (cursor != null) { if (cursor != anchor) playDoc.applyStyleToTarget(cursor, TextActivityDocument.TARGET, false, true); } cursor = tm; if (cursor != null) playDoc.applyStyleToTarget(cursor, null, true, true); } protected void swapTargets(TargetMarker src, TargetMarker dest) { if (src == dest || !playing || playDoc == null) return; setTargetAnchor(null); TargetMarkerBag tmb = playDoc.tmb; tmb.swapTargets(src, dest); src.checkText(ev); boolean ok = dest.checkText(ev); nActions++; if (!hasCheckButton) { int solvedTargets = tmb.countSolvedTargets(); ps.reportNewAction(getActivity(), ACTION_PLACE, src.getCurrentText(), Integer.toString(tmb.indexOf(dest)), ok, solvedTargets); if (ok && solvedTargets == tmb.size()) { finishActivity(true); } else { playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } } setTargetCursor(dest); } @Override protected void doCheck(boolean fromButton) { if (playDoc == null || playDoc.tmb.size() == 0) return; TargetMarkerBag tmb = playDoc.tmb; if (bc.active) bc.end(); for (int i = 0; i < tmb.size(); i++) { TargetMarker tm = tmb.getElement(i); playDoc.applyStyleToTarget(tm, tm.target.targetStatus == TextTarget.SOLVED ? TextActivityDocument.TARGET : TextActivityDocument.TARGET_ERROR, false, true); } int tagsSolved = tmb.countSolvedTargets(); ps.setCounterValue(SCORE_COUNTER, tagsSolved); ps.setCounterValue(ACTIONS_COUNTER, nActions); if (tagsSolved != tmb.size()) { if (fromButton) { playEvent(EventSounds.FINISHED_ERROR); pane.requestFocus(); } } else finishActivity(true); } @Override public void finishActivity(boolean result) { if (bc.active) bc.end(); pane.setEnabled(false); super.finishActivity(result); } } } src/core/edu/xtec/jclic/activities/text/TargetMarker.java000066400000000000000000000102761335566474600240150ustar00rootroot00000000000000/* * File : TargetMarker.java * Created : 04-jun-2001 19:47 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class TargetMarker extends java.lang.Object { public int begOffset, endOffset; public Position begPos, endPos; public TextTarget target; public TextActivityDocument doc; public boolean hasFocus; @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("h: ").append(hashCode()); sb.append(" [").append(begOffset).append("-").append(endOffset).append("]"); sb.append(" target: ").append(target); return sb.substring(0); } /** Creates new TargetMarker */ public TargetMarker(TextActivityDocument document) { begOffset = 0; endOffset = 0; begPos = null; endPos = null; target = null; doc = document; hasFocus = false; } public void reset() { hasFocus = false; if (target != null) target.reset(); } public void setPositions() { try { begPos = doc.createPosition(begOffset); endPos = doc.createPosition(endOffset); } catch (Exception e) { System.err.println("Target marker error:\n" + e); } } public void requestFocus(TextActivityBase.Panel tabp) { hasFocus = true; if (target != null) target.requestFocus(tabp, this); } public void lostFocus(TextActivityBase.Panel tabp) { hasFocus = false; if (target != null) target.lostFocus(tabp, this); } public void updateOffsets() { if (begPos != null) begOffset = begPos.getOffset(); if (endPos != null) endOffset = endPos.getOffset(); } public java.awt.Rectangle getBegRect(JTextComponent pane) { if (begPos != null) { begOffset = begPos.getOffset(); try { return pane.modelToView(begOffset); } catch (Exception ex) { System.err.println("Error calling modelToView:\n" + ex); } } return null; } public String getCurrentText() { String result = null; if (target != null && target.comboList != null) { result = (String) target.comboList.getSelectedItem(); } else { try { result = doc.getText(begPos.getOffset(), endPos.getOffset() - begPos.getOffset()); } catch (Exception e) { // eat exception } } return result == null ? new String() : result; } public String getCurrentText(String boolAttrToExclude) { if (boolAttrToExclude == null || (target != null && target.comboList != null)) return getCurrentText(); updateOffsets(); StringBuilder stb = new StringBuilder(); for (int i = begOffset; i < endOffset; i++) { if (!doc.checkBooleanAttribute(i, boolAttrToExclude)) { try { stb.append(doc.getText(i, 1)); } catch (Exception e) { System.err.println("Error getting text answer:\n" + e); break; } } } return stb.substring(0); } public boolean checkText(Evaluator ev) { if (target == null) return false; return target.checkText(getCurrentText(), ev); } public boolean contains(int offset, boolean includeEndPos) { updateOffsets(); return offset >= begOffset && (includeEndPos ? (offset <= endOffset) : (offset < endOffset)); } public int getLength() { return endOffset - begOffset; } public int getParagraphBegOffset() { updateOffsets(); return doc.getParagraphElement(begOffset).getStartOffset(); } } src/core/edu/xtec/jclic/activities/text/TargetMarkerBag.java000066400000000000000000000131241335566474600244220ustar00rootroot00000000000000/* * File : TargetMarkerBag.java * Created : 04-jun-2001 19:54 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import java.util.Iterator; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class TargetMarkerBag extends java.util.ArrayList { private TargetMarker currentTarget; /** Creates new TargetMarkerBag */ public TargetMarkerBag() { super(10); currentTarget = null; } @Override public boolean add(TargetMarker tm) { int i; for (i = 0; i < size(); i++) { if (getElement(i).begOffset >= tm.begOffset) break; } if (i == size()) { return super.add(tm); } super.add(i, tm); return true; } public TargetMarker getElement(int n) { try { return get(n); } catch (Exception e) { return null; } } public void setParentPane(TextActivityPane parent) { for (int i = 0; i < size(); i++) { TargetMarker tm = getElement(i); if (tm.target != null) tm.target.setParentPane(parent); } } public void setPositions() { for (int i = 0; i < size(); i++) getElement(i).setPositions(); } public void updateOffsets() { for (int i = 0; i < size(); i++) getElement(i).updateOffsets(); } public void removeUnattachedElements() { Iterator it = iterator(); while (it.hasNext()) { TargetMarker tm = (TargetMarker) it.next(); tm.updateOffsets(); if (tm.begOffset < 0 || tm.endOffset < 0 || tm.begOffset == tm.endOffset) it.remove(); } } public int checkTargets(Evaluator ev) { int result = 0; for (int i = 0; i < size(); i++) { if (getElement(i).checkText(ev)) result++; } return result; } public int countSolvedTargets() { int result = 0; for (int i = 0; i < size(); i++) { TextTarget tt = getElement(i).target; if (tt != null && tt.targetStatus == TextTarget.SOLVED) result++; } return result; } public void reset() { for (int i = 0; i < size(); i++) getElement(i).reset(); } public TargetMarker getElementByOffset(int offset, boolean includeEndPos) { for (int i = 0; i < size(); i++) { TargetMarker tm = getElement(i); if (tm.contains(offset, includeEndPos)) return tm; } return null; } public TargetMarker getNearestElement(int offset, boolean searchForward) { TargetMarker prev = null, next = null; for (int i = 0; i < size(); i++) { TargetMarker tm = getElement(i); if (tm.begPos.getOffset() <= offset) { prev = tm; } if (tm.endPos.getOffset() >= offset) { next = tm; break; } } return searchForward ? next : prev; } public void setCurrentTarget(TargetMarker tm, TextActivityBase.Panel tabp) { if (currentTarget != null /* && currentTarget!=tm */) { currentTarget.lostFocus(tabp); } if (tm != null && contains(tm)) { currentTarget = tm; if (currentTarget.target != null) { currentTarget.target.setModified(false); } currentTarget.requestFocus(tabp); } else { currentTarget = null; } } public TargetMarker getCurrentTarget() { return currentTarget; } public TargetMarker getElement(TextTarget tt) { for (int i = 0; i < size(); i++) { TargetMarker tm = getElement(i); if (tm.target == tt) return tm; } return null; } public TargetMarker getNextTarget(TargetMarker tm) { return getElement(Math.min(indexOf(tm == null ? currentTarget : tm) + 1, size() - 1)); } public TargetMarker getPrevTarget(TargetMarker tm) { return getElement(Math.max(indexOf(tm == null ? currentTarget : tm) - 1, 0)); } public void swapTargets(TargetMarker tm1, TargetMarker tm2) { TextActivityDocument doc = tm1.doc; if (doc != tm2.doc) { System.err.println("Error: unable to swap among different documents"); return; } try { tm1.updateOffsets(); String tx1 = doc.getText(tm1.begOffset, tm1.getLength()); tm2.updateOffsets(); String tx2 = doc.getText(tm2.begOffset, tm2.getLength()); doc.remove(tm1.begOffset, tx1.length()); doc.insertString(tm1.begOffset, tx2, doc.getTargetAttributeSet()); tm1.endOffset = tm1.begOffset + tx2.length(); tm1.setPositions(); tm2.updateOffsets(); doc.remove(tm2.begOffset, tx2.length()); doc.insertString(tm2.begOffset, tx1, doc.getTargetAttributeSet()); tm2.endOffset = tm2.begOffset + tx1.length(); tm2.setPositions(); } catch (Exception ex) { System.err.println("Error: unable to swap target texts:\n" + ex); } updateOffsets(); } public int[] getParagragraphOffsets() { if (size() == 0) return null; int[] pOffsets = new int[size()]; for (int i = 0; i < size(); i++) pOffsets[i] = getElement(i).getParagraphBegOffset(); return pOffsets; } } src/core/edu/xtec/jclic/activities/text/TextActivityBase.java000066400000000000000000000330401335566474600246530ustar00rootroot00000000000000/* * File : TextActivitybase.java * Created : 28-may-2001 10:19 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.TextActivityContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import edu.xtec.util.StrUtils; import java.awt.*; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JScrollPane; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class TextActivityBase extends Activity implements TextActivityContentKit.Compatible { protected TextActivityDocument tad; protected StyleContext styleContext; protected boolean hasCheckButton; protected String checkButtonText; protected boolean prevScreen; protected int prevScreenMaxTime; protected String prevScreenText; protected BoxBase prevScreenStyle; // transient properties protected StyledDocument prevScreenDocument; /** Creates new TextActivityBase */ public TextActivityBase(JClicProject project) { super(project); styleContext = new StyleContext(); MutableAttributeSet mas = styleContext.getStyle(StyleContext.DEFAULT_STYLE); if (mas != null) { StyleConstants.setFontFamily(mas, BoxBase.getDefaultFont().getFamily()); StyleConstants.setBackground(mas, Color.white); } tad = new TextActivityDocument(styleContext); hasCheckButton = false; checkButtonText = ""; prevScreen = false; prevScreenMaxTime = 0; prevScreenText = null; prevScreenDocument = null; prevScreenStyle = new BoxBase(); } public static final String CHECK_BUTTON = "checkButton", PREV_SCREEN = "prevScreen", TEXT = "text"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); if (hasCheckButton) e.addContent(new org.jdom.Element(CHECK_BUTTON).setText(checkButtonText)); if (prevScreen) { org.jdom.Element child = new org.jdom.Element(PREV_SCREEN); if (prevScreenMaxTime > 0) child.setAttribute(MAX_TIME, Integer.toString(prevScreenMaxTime)); if (prevScreenText != null) { child.addContent(prevScreenStyle.getJDomElement()); JDomUtility.setParagraphs(child, prevScreenText); } e.addContent(child); } try { e.addContent(tad.getJDomElement()); } catch (Exception ex) { System.err.println("Error getting document contents!"); return null; } return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); if ((child = e.getChild(CHECK_BUTTON)) != null) { hasCheckButton = true; checkButtonText = child.getText(); } if ((child = e.getChild(PREV_SCREEN)) != null) { prevScreen = true; if ((prevScreenText = JDomUtility.getParagraphs(child)) != null) { prevScreenStyle = BoxBase.getBoxBase(child.getChild(BoxBase.ELEMENT_NAME)); prevScreenDocument = new DefaultStyledDocument(); TextActivityDocument.boxBaseToStyledDocument(prevScreenStyle, prevScreenDocument); prevScreenDocument.insertString(0, prevScreenText, null); } prevScreenMaxTime = JDomUtility.getIntAttr(child, MAX_TIME, prevScreenMaxTime); } setTextActivityDocument(e.getChild(TextActivityDocument.ELEMENT_NAME)); } public void setTextActivityDocument(org.jdom.Element e) throws Exception { tad = TextActivityDocument.getTextActivityDocument(e, this); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); setWindowSize(new Dimension(c3a.txtCW, c3a.txtCH)); hasCheckButton = c3a.btCorregir; checkButtonText = c3a.txBtCorregir; if (c3a.avPrevHelp > 0) { prevScreen = true; prevScreenMaxTime = c3a.avTimePH; if (c3a.avPrevHelp == 2) { prevScreenText = c3a.txPrev; prevScreenStyle = c3a.getBoxBase(3); } messages[PREVIOUS] = new ActiveBoxContent(); messages[PREVIOUS].setBoxBase(messages[MAIN].bb); c3a.setActiveBoxTextContent(messages[PREVIOUS], c3a.initMessPrev); } tad.readClic3Data(c3a, this); } public void setStyleContext(StyleContext sc) { if (sc != null) { try { setTextActivityDocument(tad.getJDomElement(sc)); styleContext = sc; } catch (Exception ex) { System.err.println("Error updating document styles:\n" + ex); } } } public StyleContext getStyleContext() { return styleContext; } protected Evaluator buildClic3Evaluator(edu.xtec.jclic.clic3.Clic3Activity c3a, boolean complex) throws Exception { org.jdom.Element e = new org.jdom.Element(Evaluator.ELEMENT_NAME); String evaluatorClassName = complex ? ComplexEvaluator.class.getName() : BasicEvaluator.class.getName(); e.setAttribute(JDomUtility.CLASS, evaluatorClassName); e.setAttribute(BasicEvaluator.CHECK_CASE, JDomUtility.boolString(c3a.avMaj)); e.setAttribute(BasicEvaluator.CHECK_ACCENTS, JDomUtility.boolString(c3a.avAcc)); e.setAttribute(BasicEvaluator.CHECK_PUNCTUATION, JDomUtility.boolString(c3a.avPunt)); e.setAttribute(BasicEvaluator.CHECK_DOUBLE_SPACES, JDomUtility.boolString(c3a.avDblSpc)); if (complex) { e.setAttribute(ComplexEvaluator.DETAIL, JDomUtility.boolString(c3a.avLletra)); e.setAttribute(ComplexEvaluator.CHECK_STEPS, Integer.toString(c3a.avScope)); e.setAttribute(ComplexEvaluator.CHECK_SCOPE, Integer.toString(c3a.avMaxScope)); } return Evaluator.getEvaluator(e, c3a.project); } public int getMinNumActions() { return (tad == null ? 0 : tad.tmb.size()); } @Override public boolean prepareMedia(PlayStation ps) { if (!super.prepareMedia(ps)) return false; if (tad != null) { tad.boxesContent.prepareMedia(ps); tad.popupsContent.prepareMedia(ps); } return true; } @Override public boolean helpSolutionAllowed() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } public class Panel extends Activity.Panel implements java.awt.event.ActionListener { JScrollPane scrollPane = null; JButton checkButton = null; TextActivityPane pane = null; boolean showingPrevScreen = false; javax.swing.Timer prevScreenTimer = null; TextTarget.PopupTimer popupTimer = null; protected Panel(PlayStation ps) { super(ps); popupTimer = new TextTarget.PopupTimer(this); } public void clear() { if (prevScreenTimer != null) { prevScreenTimer.stop(); prevScreenTimer = null; } } @Override public void doLayout() { int w = getWidth(), h = getHeight(); if (checkButton != null && checkButton.isVisible()) { int hb = checkButton.getPreferredSize().height; h -= hb; checkButton.setBounds(0, h, w, hb); } if (scrollPane != null && pane != null) { if (pane.getBounds().isEmpty()) pane.setBounds(0, 0, w, h); scrollPane.setBounds(0, 0, w, h); } } @Override public void buildVisualComponents() throws Exception { super.buildVisualComponents(); if (acp != null) { TextActivityContentKit kit = new TextActivityContentKit(tad, checkButtonText, prevScreenText); if (acp.generateContent(kit, ps)) { checkButtonText = kit.checkButtonText; prevScreenText = kit.prevScreenText; } } if (prevScreen == true && prevScreenText != null) { prevScreenDocument = new DefaultStyledDocument(); TextActivityDocument.boxBaseToStyledDocument(prevScreenStyle, prevScreenDocument); try { prevScreenDocument.insertString(0, prevScreenText, null); } catch (Exception e) { System.err.println("Error displaying initial screen:\n" + e); } } pane = buildPane(); scrollPane = new JScrollPane(pane); scrollPane.setBorder(BorderFactory.createEmptyBorder()); scrollPane.getVerticalScrollBar().setBorder(BorderFactory.createLineBorder(Color.darkGray, 1)); add(scrollPane); if (hasCheckButton) { checkButton = new JButton(StrUtils.secureString(checkButtonText, " ")); checkButton.setOpaque(false); checkButton.addActionListener(this); add(checkButton); } if (prevScreen && prevScreenMaxTime > 0) { prevScreenTimer = new javax.swing.Timer(1000 * prevScreenMaxTime, this); prevScreenTimer.setRepeats(false); } } protected TextActivityPane buildPane() { return new TextActivityPane(this); } @Override public void initActivity() throws Exception { if (prevScreen) preInitActivity(); else startActivity(); } @Override public void startActivity() throws Exception { super.initActivity(); showingPrevScreen = false; setAndPlayMsg(MAIN, EventSounds.START); initDocument(); if (checkButton != null) checkButton.setVisible(true); ps.playMsg(); pane.requestFocus(); playing = true; } public void preInitActivity() { if (messages[PREVIOUS] == null || prevScreen == false) return; showingPrevScreen = true; if (checkButton != null) checkButton.setVisible(false); enableCounters(true, false, false); ps.setCounterValue(TIME_COUNTER, 0); ps.setMsg(messages[PREVIOUS]); pane.setEditable(false); pane.setStyledDocument(prevScreenDocument != null ? prevScreenDocument : tad); if (prevScreenTimer != null) { ps.setCountDown(TIME_COUNTER, prevScreenMaxTime); prevScreenTimer.start(); } ps.playMsg(); } protected void initDocument() throws Exception { if (tad != null) { if (pane.getDocument() != tad) pane.setStyledDocument(tad); pane.setEnabled(true); } } public void render(Graphics2D g2, Rectangle dirtyRegion) { } @Override public void requestFocus() { if (playing && pane != null) pane.requestFocus(); } public Dimension setDimension(Dimension desiredMaxSize) { return new Dimension(Math.min(desiredMaxSize.width, getWindowSize().width), Math.min(desiredMaxSize.height, getWindowSize().height)); } @Override public void setCursor(Cursor cursor) { if (pane != null) pane.setCursor(cursor); super.setCursor(cursor); } public void actionPerformed(java.awt.event.ActionEvent e) { if (checkButton != null && e.getSource() == checkButton) { if (playing) doCheck(true); } if (prevScreenTimer != null && e.getSource() == prevScreenTimer && showingPrevScreen) { ps.startActivity(this); } } @Override public void forceFinishActivity() { if (playing) doCheck(false); } protected void doCheck(boolean fromButton) { } @Override public void showHelp() { if (!helpWindowAllowed() || pane == null) return; HelpActivityComponent hac = null; if (showSolution) { hac = new HelpActivityComponent(this) { TextActivityPane tap = null; JScrollPane jsp = null; public void render(Graphics2D g2, Rectangle dirtyRegion) { } @Override public void init() { tap = buildPane(); try { // build new document tap.setStyledDocument( TextActivityDocument.getTextActivityDocument(tad.getJDomElement(), TextActivityBase.this)); } catch (Exception ex) { // reuse existing document (lost floating elements) tap.setStyledDocument(tad); } // Modified 04-Feb-2011 // Correction of bug #64: // Leave the component not editable but enabled: tap.setEditable(false); // tap.setEnabled(false); // ------------------- jsp = new JScrollPane(tap); jsp.setBorder(BorderFactory.createEmptyBorder()); jsp.getVerticalScrollBar().setBorder(BorderFactory.createLineBorder(Color.darkGray, 1)); add(jsp); Dimension size = scrollPane.getBounds().getSize(); jsp.setBounds(0, 0, size.width, size.height); if (tap.getBounds().isEmpty()) tap.setBounds(0, 0, size.width, size.height); setPreferredSize(size); setMaximumSize(size); setMinimumSize(size); } }; hac.init(); } if (ps.showHelp(hac, helpMsg)) ps.reportNewAction(getActivity(), ACTION_HELP, null, null, false, -1); if (hac != null) hac.end(); } } public TextActivityDocument getDocument() { return tad; } } src/core/edu/xtec/jclic/activities/text/TextActivityDocument.java000066400000000000000000000756621335566474600255770ustar00rootroot00000000000000/* * File : TextActivityDocument.java * Created : 28-may-2001 10:35 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.Activity; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.clic3.*; import edu.xtec.util.JDomUtility; import edu.xtec.util.StreamIO; import java.awt.*; import java.util.ArrayList; import java.util.Iterator; import java.util.StringTokenizer; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class TextActivityDocument extends DefaultStyledDocument { public static final int NUM_TABS = 30; public static final int DEFAULT_TAB = 12; public static final Color DEFAULT_TARGET_COLOR = Color.blue; public static final Color DEFAULT_TARGET_ERROR_COLOR = Color.red; public static final String TARGET = "target", TARGET_ERROR = "targetError", FILL = "fill"; public static final int TT_FREE = 0, TT_CHAR = 1, TT_WORD = 2, TT_PARAGRAPH = 3; protected int tabSpc = DEFAULT_TAB; protected int lastBoxId = 0; protected StyleContext styleContext; public TargetMarkerBag tmb; // added public ActiveBagContent boxesContent; public ActiveBagContent popupsContent; // -- protected int targetType = TT_FREE; /** Creates new TextActivityDocument */ public TextActivityDocument(StyleContext sc) { super(sc); styleContext = sc; checkStyleContext(styleContext); tmb = new TargetMarkerBag(); boxesContent = new ActiveBagContent(1, 1); popupsContent = new ActiveBagContent(1, 1); } public static void checkStyleContext(StyleContext sc) { Style targetStyle = sc.getStyle(TARGET); if (targetStyle == null) { targetStyle = sc.addStyle(TARGET, sc.getStyle(StyleContext.DEFAULT_STYLE)); StyleConstants.setForeground(targetStyle, DEFAULT_TARGET_COLOR); targetStyle.addAttribute(TARGET, Boolean.TRUE); } Style targetErrorStyle = sc.getStyle(TARGET_ERROR); if (targetErrorStyle == null) { targetErrorStyle = sc.addStyle(TARGET_ERROR, targetStyle); StyleConstants.setForeground(targetErrorStyle, DEFAULT_TARGET_ERROR_COLOR); } } public void readClic3Data(Clic3Activity c3a, TextActivityBase tab) throws Exception { BoxBase bb = c3a.getBoxBase(0); boxesContent.setBoxBase(c3a.getBoxBase(1)); popupsContent.setBoxBase(c3a.getBoxBase(3)); Style regular = boxBaseToStyledDocument(bb, this); setTabSpc(c3a.tabSpc); Style targetStyle = getStyle(TARGET); StyleConstants.setBackground(targetStyle, c3a.colorUsuari[1]); StyleConstants.setForeground(targetStyle, c3a.colorUsuari[0]); Style targetError = getStyle(TARGET_ERROR); StyleConstants.setBackground(targetError, c3a.colorError[1]); StyleConstants.setForeground(targetError, c3a.colorError[0]); boolean multiTarget = (c3a.puzMode == Clic3.FORATS); StringBuilder sb = new StringBuilder(); sb.append(Clic3.CHBLOCK).append(Clic3.CHINC); StringTokenizer st = new StringTokenizer(c3a.txBase, sb.substring(0), true); boolean intoBlock = false; boolean intoTarget = false; TargetMarker tm = null; int targetElementCount = 0; int k = 0; // used for popups in targets int w = 0, h = 0; boolean leftAlign = false, onlyPlay = false; while (st.hasMoreTokens() || intoTarget) { String t; try { t = st.nextToken(); } catch (java.util.NoSuchElementException ex) { t = new String(new char[] { Clic3.CHINC }); targetElementCount = 6; } if (t.charAt(0) == Clic3.CHBLOCK) intoBlock = intoBlock ? false : true; else if (t.charAt(0) == Clic3.CHINC) { if (multiTarget) { targetElementCount++; if (targetElementCount == 1) { // create target tm = new TargetMarker(this); tm.target = new TextTarget(); tm.begOffset = getLength(); } if (targetElementCount > 6) { targetElementCount = 0; intoTarget = false; if (tm != null) { tm.endOffset = getLength(); tmb.add(tm); } } else { intoTarget = true; } } else { intoTarget = intoTarget ? false : true; if (intoTarget) { tm = new TargetMarker(this); tm.begOffset = getLength(); } else if (tm != null) { tm.endOffset = getLength(); tmb.add(tm); } } } else if (intoBlock) { ActiveBoxContent ab = new ActiveBoxContent(); StringTokenizer stb = new StringTokenizer(t, ","); w = Integer.parseInt(stb.nextToken()); h = Integer.parseInt(stb.nextToken()); ab.setDimension(new Dimension(w, h)); ab.setBorder((Integer.parseInt(stb.nextToken())) != 0); boolean b = ((Integer.parseInt(stb.nextToken())) != 0); ab.txtAlign[0] = b ? JDomUtility.ALIGN_LEFT : JDomUtility.ALIGN_MIDDLE; ab.imgAlign[0] = ab.txtAlign[0]; c3a.setActiveBoxTextContent(ab, stb.nextToken("").substring(1)); ab.setBoxBase(boxesContent.bb); ab.userData = getEndPosition(); boxesContent.addActiveBoxContent(ab); JPanelActiveBox jpab = new JPanelActiveBox(null, null, tab.getProject().getBridge().getComponent()); jpab.setAlignmentY(0.9f); jpab.setActiveBoxContent(ab); MutableAttributeSet attr = new SimpleAttributeSet(regular); StyleConstants.setComponent(attr, jpab); insertString(getLength(), " ", attr); } else if (intoTarget) { if (targetElementCount == 0) insertString(getLength(), t, getStyle(TARGET)); else switch (targetElementCount) { case 1: StringTokenizer stx = new StringTokenizer(t, ","); if (tm != null) { tm.target.iniChar = stx.nextToken().charAt(0); tm.target.isList = (stx.nextToken().compareTo("1") == 0); tm.target.numIniChars = Integer.parseInt(stx.nextToken()); tm.target.maxLenResp = Integer.parseInt(stx.nextToken()); tm.target.infoMode = Integer.parseInt(stx.nextToken()); int v = Integer.parseInt(stx.nextToken()); tm.target.popupDelay = v & 0xFF; tm.target.popupMaxTime = (v & 0xFF00) >> 8; } w = Integer.parseInt(stx.nextToken()); h = Integer.parseInt(stx.nextToken()); int flags = Integer.parseInt(stx.nextToken()); leftAlign = ((flags & 1) == 1); onlyPlay = ((flags & 2) == 2); break; case 2: if (tm != null && t.length() > 0) tm.target.setAnswer(t); break; case 3: StringTokenizer sty = new StringTokenizer(t, "\n\r"); ArrayList al = new ArrayList(); while (sty.hasMoreTokens()) { String s = sty.nextToken(); if (s.length() > 0) al.add(s); } if (tm != null && al.size() > 0) { tm.target.options = new String[al.size()]; for (int i = 0; i < al.size(); i++) { tm.target.options[i] = (String) (al.get(i)); } } break; case 4: if (tm != null && t.length() > 0) tm.target.iniText = t; break; case 5: if (tm != null && t.length() > 0) { tm.target.popupContent = new ActiveBoxContent(); tm.target.popupContent.setDimension(new Dimension(w, h)); c3a.setActiveBoxTextContent(tm.target.popupContent, t); tm.target.popupContent.setBoxBase(popupsContent.bb); tm.target.popupContent.txtAlign[0] = leftAlign ? JDomUtility.ALIGN_LEFT : JDomUtility.ALIGN_MIDDLE; tm.target.popupContent.imgAlign[0] = tm.target.popupContent.txtAlign[0]; tm.target.onlyPlay = onlyPlay; popupsContent.addActiveBoxContent(tm.target.popupContent); } break; case 6: insertString(getLength(), t, getStyle(TARGET)); break; } } else { insertString(getLength(), t, getStyle(StyleContext.DEFAULT_STYLE)); } } tmb.setPositions(); } public static JPanelActiveBox insertBox(ActiveBoxContent ab, int atPos, TextActivityDocument doc, TextActivityBase tab, AttributeSet atr) throws Exception { if (atr == null) atr = doc.getStyle(StyleContext.DEFAULT_STYLE); if (atPos < 0) atPos = doc.getLength(); doc.boxesContent.addActiveBoxContent(ab); JPanelActiveBox jpab = new JPanelActiveBox(null, ab.bb, tab.getProject().getBridge().getComponent()); jpab.setAlignmentY(0.9f); jpab.setActiveBoxContent(ab); SimpleAttributeSet satr = new SimpleAttributeSet(atr); StyleConstants.setComponent(satr, jpab); doc.insertString(atPos, " ", satr); return jpab; } public static Style boxBaseToStyledDocument(BoxBase bb, StyledDocument sd) { Style style = sd.getStyle(StyleContext.DEFAULT_STYLE); boxBaseToStyle(bb, style); return style; } public static void boxBaseToStyle(BoxBase bb, Style st) { StyleConstants.setFontFamily(st, bb.getFont().getFamily()); StyleConstants.setFontSize(st, bb.getFont().getSize()); StyleConstants.setBold(st, bb.getFont().isBold()); StyleConstants.setItalic(st, bb.getFont().isItalic()); StyleConstants.setBackground(st, bb.backColor); StyleConstants.setForeground(st, bb.textColor); } public void setTabSpc(int newTabSpc) { tabSpc = newTabSpc; setStyledDocumentTabSpc(tabSpc, this, styleContext); } protected static AttributeSet getAttributes(TextActivityDocument doc, AttributeSet a, org.jdom.Element e) throws Exception { int nAttributes = e.getAttributes().size(); if (nAttributes < 1) return a; String parentStyle = e.getAttributeValue(STYLE); Style style = (parentStyle != null ? doc.getStyle(parentStyle) : null); if (style != null && nAttributes == 1) return style; MutableAttributeSet atr = new SimpleAttributeSet(); atr.setResolveParent(style != null ? style : a); fillAttributes(atr, e); return atr; } protected static void fillAttributes(MutableAttributeSet a, org.jdom.Element e) throws Exception { java.util.List atrList = e.getAttributes(); for (int i = 0; i < atrList.size(); i++) { org.jdom.Attribute atr = (org.jdom.Attribute) atrList.get(i); String atrName = atr.getName(); if (atrName.equals(StyleConstants.FontFamily.toString())) StyleConstants.setFontFamily(a, edu.xtec.util.FontCheck.getValidFontFamilyName(atr.getValue())); else if (atrName.equals(StyleConstants.FontSize.toString())) StyleConstants.setFontSize(a, atr.getIntValue()); else if (atrName.equals(StyleConstants.Bold.toString())) StyleConstants.setBold(a, atr.getBooleanValue()); else if (atrName.equals(StyleConstants.Italic.toString())) StyleConstants.setItalic(a, atr.getBooleanValue()); else if (atrName.equals(StyleConstants.Background.toString())) StyleConstants.setBackground(a, JDomUtility.stringToColor(atr.getValue())); else if (atrName.equals(StyleConstants.Foreground.toString())) StyleConstants.setForeground(a, JDomUtility.stringToColor(atr.getValue())); // other attributes: else if (atrName.equals(TARGET)) a.addAttribute(atrName, atr.getBooleanValue()); // Paragraph attributes: else if (atrName.equals(StyleConstants.BidiLevel.toString())) StyleConstants.setBidiLevel(a, atr.getIntValue()); else if (atrName.equals(StyleConstants.Alignment.toString())) StyleConstants.setAlignment(a, atr.getIntValue()); } } protected static void addStyle(TextActivityDocument doc, org.jdom.Element e) throws Exception { JDomUtility.checkName(e, STYLE); Style s; String styleName = e.getAttributeValue(NAME); s = doc.getStyle(styleName); if (s == null) { String baseName = JDomUtility.getStringAttr(e, BASE, StyleContext.DEFAULT_STYLE, false); Style base = doc.getStyle(baseName); s = doc.addStyle(styleName, base); } fillAttributes(s, e); } public static void setStyledDocumentTabSpc(int tab, StyledDocument sd, StyleContext sc) { Style regular = sd.getStyle(StyleContext.DEFAULT_STYLE); FontMetrics fm = sc.getFontMetrics(sd.getFont(regular)); float sep = fm.charWidth(' ') * tab; TabStop[] tabs = new TabStop[NUM_TABS]; for (int i = 0; i < 30; i++) { tabs[i] = new TabStop(sep * (i + 1)); } StyleConstants.setTabSet(regular, new TabSet(tabs)); sd.setParagraphAttributes(0, sd.getLength(), regular, true); String tabStr = Integer.toString(tab); Object o = regular.getAttribute(TABSPC); if (o == null || !tabStr.equals(o)) { if (o != null) regular.removeAttribute(TABSPC); regular.addAttribute(TABSPC, tabStr); } } public int getTabSpc() { return tabSpc; } public static StyleContext copyStylesFrom(StyleContext src, StyleContext dest, boolean fontFace, boolean fontSize, boolean style, boolean colour, boolean targetColour, boolean errorColour) { boolean result = false; StyleContext clon; try { clon = (StyleContext) StreamIO.cloneObject(dest); } catch (Exception ex) { System.err.println("Error cloning StyleContext:\n" + ex); return src; } Style mainStyle = clon.getStyle(StyleContext.DEFAULT_STYLE); Style srcMainStyle = src.getStyle(StyleContext.DEFAULT_STYLE); if (fontFace) { String font = StyleConstants.getFontFamily(srcMainStyle); if (font != null && font.length() > 0 && !font.equals(StyleConstants.getFontFamily(mainStyle))) { StyleConstants.setFontFamily(mainStyle, font); result = true; } } if (fontSize) { int size = StyleConstants.getFontSize(srcMainStyle); if (size > 0 && size != StyleConstants.getFontSize(mainStyle)) { StyleConstants.setFontSize(mainStyle, size); result = true; } } if (colour) { Color color = StyleConstants.getForeground(srcMainStyle); if (color != null && !color.equals(StyleConstants.getForeground(mainStyle))) { StyleConstants.setForeground(mainStyle, color); result = true; } color = StyleConstants.getBackground(srcMainStyle); if (color != null && !color.equals(StyleConstants.getBackground(mainStyle))) { StyleConstants.setBackground(mainStyle, color); result = true; } } if (style) { boolean b = StyleConstants.isBold(srcMainStyle); if (b != StyleConstants.isBold(mainStyle)) { StyleConstants.setBold(mainStyle, b); result = true; } b = StyleConstants.isItalic(srcMainStyle); if (b != StyleConstants.isItalic(mainStyle)) { StyleConstants.setItalic(mainStyle, b); result = true; } b = StyleConstants.isUnderline(srcMainStyle); if (b != StyleConstants.isUnderline(mainStyle)) { StyleConstants.setUnderline(mainStyle, b); result = true; } } if (targetColour) { Style targetStyle = clon.getStyle(TARGET); Style srcTargetStyle = src.getStyle(TARGET); if (targetStyle != null && srcTargetStyle != null) { Color color = StyleConstants.getForeground(srcTargetStyle); if (color != null && !color.equals(StyleConstants.getForeground(targetStyle))) { StyleConstants.setForeground(targetStyle, color); result = true; } color = StyleConstants.getBackground(srcTargetStyle); if (color != null && !color.equals(StyleConstants.getBackground(targetStyle))) { StyleConstants.setBackground(targetStyle, color); result = true; } } } if (errorColour) { Style errorStyle = clon.getStyle(TARGET_ERROR); Style srcErrorStyle = src.getStyle(TARGET_ERROR); if (errorStyle != null && srcErrorStyle != null) { Color color = StyleConstants.getForeground(srcErrorStyle); if (color != null && !color.equals(StyleConstants.getForeground(errorStyle))) { StyleConstants.setForeground(errorStyle, color); result = true; } color = StyleConstants.getBackground(srcErrorStyle); if (color != null && !color.equals(StyleConstants.getBackground(errorStyle))) { StyleConstants.setBackground(errorStyle, color); result = true; } } } return result ? clon : dest; } public static final String ELEMENT_NAME = "document"; public static final String STYLE = "style", TABSPC = "tabWidth", TEXT = "text", P = "p", BASE = "base", NAME = "name"; public org.jdom.Element getJDomElement() throws Exception { return getJDomElement(styleContext); } public org.jdom.Element getJDomElement(StyleContext sc) throws Exception { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); tmb.setPositions(); addStylesToElement(e, sc, tabSpc); e.addContent(getJDomElement(getDefaultRootElement())); return e; } public static void addStylesToElement(org.jdom.Element e, StyleContext sc, int tabSpc) throws Exception { java.util.Enumeration styleNamesEnum = sc.getStyleNames(); // use Stack for reverse order java.util.Stack styleNames = new java.util.Stack(); while (styleNamesEnum.hasMoreElements()) styleNames.push((String) styleNamesEnum.nextElement()); while (!styleNames.empty()) { org.jdom.Element s = new org.jdom.Element(STYLE); String styleName = (String) styleNames.pop(); s.setAttribute(NAME, styleName); Style style = sc.getStyle(styleName); Style parent = (Style) style.getAttribute(AttributeSet.ResolveAttribute); if (parent != null) s.setAttribute(BASE, parent.getName()); setJDomElementAttributes(s, style, true); if (styleName.equals(StyleContext.DEFAULT_STYLE) && s.getAttribute(TABSPC) == null) s.setAttribute(TABSPC, Integer.toString(tabSpc)); e.addContent(s); } } public org.jdom.Element getJDomElement(Element element) throws Exception { org.jdom.Element e; String elementName = element.getName(); AttributeSet atr = element.getAttributes(); String style = (String) (atr.getAttribute(AttributeSet.NameAttribute)); if (elementName.equals("component")) { Object cmp = atr.getAttribute(StyleConstants.ComponentAttribute); if (cmp != null && cmp instanceof JPanelActiveBox) { JPanelActiveBox jpab = (JPanelActiveBox) cmp; return jpab.getActiveBox().getContent().getJDomElement(); } } else if (TARGET.equals(style)) { elementName = TARGET; TargetMarker tm = tmb.getElementByOffset(element.getStartOffset(), true); if (tm != null) { TextTarget tt = tm.target; if (tt != null) { e = tt.getJDomElement(); e.addContent(new org.jdom.Element(TEXT).setText(getElementText(element))); return e; } } } if (elementName.equals("content")) elementName = TEXT; else if (elementName.equals("paragraph")) elementName = P; e = new org.jdom.Element(elementName); if (style == null || !atr.isEqual(getStyle(style))) { setJDomElementAttributes(e, atr, elementName.equals(P)); } else { if (!StyleContext.DEFAULT_STYLE.equals(style) && !TARGET.equals(style)) e.setAttribute(STYLE, style); } int count = element.getElementCount(); if (count == 0) { String s = getElementText(element); if (s != null && s.length() > 0) e.setText(getElementText(element)); else { if (elementName.equals(TEXT)) return null; } } else { for (int i = 0; i < count; i++) { org.jdom.Element child = getJDomElement(element.getElement(i)); if (child != null) e.addContent(child); } } return e; } protected static String getElementText(Element element) throws Exception { String s = new String(); int offset = element.getStartOffset(); int length = element.getEndOffset() - offset; if (length > 0) s = element.getDocument().getText(offset, length); return edu.xtec.util.StrUtils.replace(s, "\n", ""); } protected static void setJDomElementAttributes(org.jdom.Element e, AttributeSet atr, boolean isParagraph) { java.util.Enumeration atrNames = atr.getAttributeNames(); if (atrNames != null) { while (atrNames.hasMoreElements()) { Object attribute = atrNames.nextElement(); if (attribute != null && atr.isDefined(attribute) && (isParagraph || !(attribute instanceof AttributeSet.ParagraphAttribute))) { JDomUtility.addGenericAttribute(e, attribute.toString(), atr.getAttribute(attribute)); } } } } public static TextActivityDocument getTextActivityDocument(org.jdom.Element e, TextActivityBase tab) throws Exception { TextActivityDocument doc = new TextActivityDocument(tab.styleContext); org.jdom.Element child, child2; JDomUtility.checkName(e, ELEMENT_NAME); java.util.List styleList = e.getChildren(STYLE); if (!styleList.isEmpty()) { Style s; String styleName, styleParent; for (int i = 0; i < styleList.size(); i++) { child = (org.jdom.Element) styleList.get(i); styleName = child.getAttributeValue(NAME); styleParent = JDomUtility.getStringAttr(child, BASE, StyleContext.DEFAULT_STYLE, false); boolean isDefault = styleName.equals(StyleContext.DEFAULT_STYLE); if (isDefault) s = doc.getStyle(styleName); else s = doc.addStyle(styleName, doc.getStyle(styleParent)); fillAttributes(s, child); if (isDefault) doc.setTabSpc(JDomUtility.getIntAttr(child, TABSPC, DEFAULT_TAB)); } } child = e.getChild(doc.getDefaultRootElement().getName()); if (child != null) { processChilds(child.getChildren(), doc, tab, doc.getStyle(StyleContext.DEFAULT_STYLE)); doc.tmb.setPositions(); } return doc; } private static void processChilds(java.util.List childs, TextActivityDocument doc, TextActivityBase tab, AttributeSet atr) throws Exception { org.jdom.Element child; AttributeSet atrBase = atr; for (int i = 0; i < childs.size(); i++) { atr = atrBase; org.jdom.Element e = (org.jdom.Element) childs.get(i); String elementName = e.getName(); if (elementName.equals(P)) { int p = doc.getLength(); atr = getAttributes(doc, atrBase, e); processChilds(e.getChildren(), doc, tab, atr); if (i < childs.size() - 1) doc.insertString(doc.getLength(), "\n", atr); doc.setParagraphAttributes(p, doc.getLength() - p, atr, true); } else if (elementName.equals(TEXT)) { doc.insertString(doc.getLength(), e.getText(), getAttributes(doc, atrBase, e)); } else if (elementName.equals(TARGET)) { atr = doc.getStyle(TARGET); TargetMarker tm = new TargetMarker(doc); tm.begOffset = doc.getLength(); if (!e.getChildren().isEmpty()) { tm.target = TextTarget.getTextTarget(e, tab.getProject().mediaBag); processChilds(e.getChildren(TEXT), doc, tab, atr); } else { doc.insertString(doc.getLength(), e.getText(), atr); } tm.endOffset = doc.getLength(); doc.tmb.add(tm); } else if (elementName.equals(ActiveBoxContent.ELEMENT_NAME)) { ActiveBoxContent ab = ActiveBoxContent.getActiveBoxContent(e, tab.getProject().mediaBag); doc.boxesContent.addActiveBoxContent(ab); JPanelActiveBox jpab = new JPanelActiveBox(null, ab.bb, tab.getProject().getBridge().getComponent()); jpab.setAlignmentY(0.9f); jpab.setActiveBoxContent(ab); SimpleAttributeSet satr = new SimpleAttributeSet(atr); StyleConstants.setComponent(satr, jpab); doc.insertString(doc.getLength(), " ", satr); } } } public TextActivityDocument cloneDoc(TextActivityDocument dest, boolean hideTargets, boolean initTargets, boolean hideTargetStyle) throws Exception { tmb.updateOffsets(); TextActivityDocument d = dest; if (d == null) d = new TextActivityDocument(styleContext); AttributeSet s, s2; s = getStyle(StyleContext.DEFAULT_STYLE); s2 = null; d.setParagraphAttributes(0, d.getLength(), s, true); d.boxesContent = boxesContent; d.popupsContent = popupsContent; int ip = 0; int lp = getLength(); char[] currentChars = getText(0, lp).toCharArray(); while (ip < lp) { Element ep = getParagraphElement(ip); int dOffset = d.getLength(); TargetMarker tm = null; TargetMarker tmx = null; MutableAttributeSet attr = null; String si = null; int i = ip; int j = i; // Bug: getEndOffset() fails! // int l=ep.getEndOffset()+1; int l = ip; while (l < currentChars.length && currentChars[l] != '\n') l++; l++; s = getCharacterElement(i).getAttributes(); s2 = null; while (i < l) { for (j = i + 1; j < l; j++) { s2 = getCharacterElement(j).getAttributes(); if (s != null && !s.isEqual(s2)) break; } attr = null; si = null; tm = tmb.getElementByOffset(i, false); if (tm != null) { tmx = new TargetMarker(d); tmx.begOffset = d.getLength(); tmx.target = tm.target; if (tm.target != null && initTargets) { if (tm.target.isList) { attr = new SimpleAttributeSet(s); StyleConstants.setComponent(attr, tm.target.buildCombo(s, getStyle(TARGET_ERROR))); si = " "; } else { if (tm.target.iniText != null) { si = tm.target.iniText; } else { si = tm.target.getFillString(); attr = new SimpleAttributeSet(s); attr.addAttribute(FILL, Boolean.TRUE); } } } else if (hideTargets) { si = new String(); } else if (hideTargetStyle) { attr = styleContext.getStyle(StyleContext.DEFAULT_STYLE); } } if (si == null) { try { si = getText(i, j - i); } catch (Exception ex) { } } if (si != null && si.length() > 0) { d.insertString(d.getLength(), si, attr != null ? attr : s); } if (tmx != null && tm != null) { tmx.endOffset = d.getLength(); d.tmb.add(tmx); } i = j; s = s2; } int lpd = d.getLength() - dOffset; if (lpd > 0) { d.setParagraphAttributes(dOffset, lpd, ep.getAttributes(), true); } // bug: getEndOffset fails! // ip=ep.getEndOffset()+1; ip = l; } d.tmb.setPositions(); return d; } public static Font attributesToFont(AttributeSet s) { int style = (StyleConstants.isBold(s) ? Font.BOLD : 0) | (StyleConstants.isItalic(s) ? Font.ITALIC : 0); return new Font(StyleConstants.getFontFamily(s), style, StyleConstants.getFontSize(s)); } public JPanelActiveBox[] getPanelBoxes() { ArrayList v = new ArrayList(); for (int i = 0; i < getLength(); i++) { Component c = StyleConstants.getComponent(getCharacterElement(i).getAttributes()); if (c != null && c instanceof JPanelActiveBox) v.add((JPanelActiveBox) c); } return v.toArray(new JPanelActiveBox[v.size()]); } public void attachTo(JTextComponent tc, Activity.Panel parent) { for (JPanelActiveBox jpab : getPanelBoxes()) { jpab.notifyMouseEventsTo(tc); jpab.setPanelParent(parent); } } public static boolean checkBooleanAttribute(AttributeSet atr, Object key) { Object o = atr.getAttribute(key); return (o != null && o.equals(Boolean.TRUE)); } public boolean checkBooleanAttribute(int offset, Object key) { Element e = getCharacterElement(offset); return e != null && checkBooleanAttribute(e.getAttributes(), key); } public MutableAttributeSet getTargetAttributeSet() { return new SimpleAttributeSet(styleContext.getStyle(TARGET)); } public MutableAttributeSet getFillAttributeSet() { MutableAttributeSet attr = getTargetAttributeSet(); attr.addAttribute(FILL, Boolean.TRUE); return attr; } public void applyStyleToTarget(TargetMarker tm, String style, boolean invertColors, boolean replace) { if (style == null) style = StyleContext.DEFAULT_STYLE; MutableAttributeSet attr = new SimpleAttributeSet(styleContext.getStyle(style)); if (invertColors) { Color bg = StyleConstants.getBackground(attr); Color fore = StyleConstants.getForeground(attr); StyleConstants.setBackground(attr, fore); StyleConstants.setForeground(attr, bg); } tm.updateOffsets(); setCharacterAttributes(tm.begOffset, tm.getLength(), attr, replace); } public void clearAllTargets() { tmb.removeUnattachedElements(); Iterator it = tmb.iterator(); while (it.hasNext()) { TargetMarker tm = (TargetMarker) it.next(); applyStyleToTarget(tm, null, false, true); it.remove(); } } public org.jdom.Element getJDomElementWithoutStyles() throws Exception { org.jdom.Element mainElement = getJDomElement(); clearElementStyles(mainElement); return mainElement; } protected void clearElementStyles(org.jdom.Element e) { String s = e.getName(); if (P.equals(s) || TEXT.equals(s)) { java.util.HashSet set = new java.util.HashSet(); Iterator it = e.getAttributes().iterator(); while (it.hasNext()) { org.jdom.Attribute at = (org.jdom.Attribute) it.next(); if (!TEXT.equals(at.getName())) set.add(at); } for (org.jdom.Attribute atr : set) e.removeAttribute(atr); } Iterator it = e.getChildren().iterator(); while (it.hasNext()) clearElementStyles((org.jdom.Element) it.next()); } /** * Getter for property targetType. * * @return Value of property targetType. */ public int getTargetType() { return targetType; } /** * Setter for property targetType. * * @param targetType New value of property targetType. */ public void setTargetType(int targetType) { this.targetType = targetType; } } src/core/edu/xtec/jclic/activities/text/TextActivityPane.java000066400000000000000000000074451335566474600246760ustar00rootroot00000000000000/* * File : TextActivityPane.java * Created : 28-may-2001 17:19 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.boxes.*; import java.awt.*; import java.awt.event.MouseEvent; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class TextActivityPane extends javax.swing.JTextPane { TextActivityBase.Panel tabp; TextActivityBase tab; ActiveBox bx; /** Creates new TextActivityPane */ public TextActivityPane(TextActivityBase.Panel tabp) { super(); this.tabp = tabp; tab = (TextActivityBase) tabp.getActivity(); bx = new ActiveBox(null, tabp, null); bx.setVisible(false); setEditorKit(new javax.swing.text.rtf.RTFEditorKit()); enableEvents(AWTEvent.MOUSE_EVENT_MASK); } @Override protected void processEvent(AWTEvent e) { if (e instanceof MouseEvent) { if (!processMouse((MouseEvent) e)) { ((MouseEvent) e).consume(); return; } } super.processEvent(e); } public boolean processMouse(MouseEvent e) { boolean result = true; if (e.getID() == MouseEvent.MOUSE_PRESSED) { if (tabp.showingPrevScreen) { tabp.ps.startActivity(tabp); result = false; } else if (tabp.isPlaying()) { if (bx.isVisible() && bx.contains(e.getPoint())) { if (bx.getContent().mediaContent != null) bx.playMedia(tabp.ps); result = false; } } } return result; } public void enableActiveBox(ActiveBoxContent abc, Point location) { if (abc.dimension != null) { bx.setContent(abc); bx.setBounds(new Rectangle(location, abc.dimension)); bx.setVisible(true); bx.repaint(); } } public void disableActiveBox() { bx.setVisible(false); } @Override public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; super.paint(g2); if (bx.isVisible()) { RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(Constants.DEFAULT_RENDERING_HINTS); while (true) { BoxBase.flagFontReduced = false; bx.update(g2, g2.getClipBounds(), this); if (!BoxBase.flagFontReduced) break; } g2.setRenderingHints(rh); } } @Override public void setStyledDocument(StyledDocument doc) { transferFocus(); // JRE 1.4 workaround, part 1: Save a clean copy of the default style attributes Style defaultStyle = doc.getStyle(StyleContext.DEFAULT_STYLE); AttributeSet as = defaultStyle.copyAttributes(); super.setStyledDocument(doc); // JRE 1.4 workaround, part 2: Restore lost attributes defaultStyle.addAttributes(as); setBackground(StyleConstants.getBackground(defaultStyle)); Style st = tab.styleContext.getStyle(TextActivityDocument.TARGET); if (st != null) setCaretColor(StyleConstants.getForeground(st)); requestFocus(); } protected void targetChanged(TextTarget tt) { } } src/core/edu/xtec/jclic/activities/text/TextTarget.java000066400000000000000000000411621335566474600235160ustar00rootroot00000000000000/* * File : TextTarget.java * Created : 31-may-2001 16:55 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.MediaContent; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class TextTarget extends java.lang.Object { public static final int NO_INFO = 0, INFO_ALWAYS = 1, INFO_ON_ERROR = 2, INFO_ON_DEMAND = 3; public static final String[] infoTypes = { "no_info", "always", "onError", "onDemand" }; public static final int NOT_EDITED = 0, EDITED = 1, SOLVED = 2, WITH_ERROR = 3; public static final int INFO_LEFTALIGN = 1, INFO_ONLYPLAY = 2; public boolean isList; public int numIniChars; public char iniChar; public int maxLenResp; public String[] answer; public String[] options; public String iniText; public int infoMode; public ActiveBoxContent popupContent; public int popupDelay; public int popupMaxTime; public boolean onlyPlay; // TRANSIENT PROPERTIES protected TargetCombo comboList; public int targetStatus; private boolean flagModified; TextActivityPane parentPane; /** Creates new TextTarget */ public TextTarget() { isList = false; numIniChars = 1; iniChar = '_'; maxLenResp = 0; answer = null; options = null; iniText = null; infoMode = NO_INFO; popupContent = null; popupDelay = 0; popupMaxTime = 0; onlyPlay = false; comboList = null; targetStatus = NOT_EDITED; flagModified = false; } public TextTarget(Document doc, int x0, int x1) { this(); if (x1 < x0) { int v = x0; x0 = x1; x1 = v; } String s; try { s = doc.getText(x0, x1 - x0); } catch (BadLocationException ex) { // should not occur! s = ""; } numIniChars = s.length(); answer = new String[] { s }; maxLenResp = numIniChars; } public void reset() { targetStatus = NOT_EDITED; flagModified = false; if (comboList != null) comboList.checkColors(); } public static final String ELEMENT_NAME = "target"; public static final String ANSWER = "answer", OPTION_LIST = "optionList", OPTION = "option", RESPONSE = "response", FILL = "fill", INI_LEN = "length", MAX_LEN = "maxLength", INI_TEXT = "show", INFO = "info", MODE = "mode", DELAY = "delay", MAX_TIME = "maxTime"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); org.jdom.Element child; if (answer != null) { for (String ans : answer) e.addContent((new org.jdom.Element(ANSWER)).addContent(ans)); } if (isList) { child = new org.jdom.Element(OPTION_LIST); if (options != null) { for (String opt : options) child.addContent((new org.jdom.Element(OPTION)).addContent(opt)); } e.addContent(child); } else { child = new org.jdom.Element(RESPONSE); child.setAttribute(FILL, new String(new char[] { iniChar })); child.setAttribute(INI_LEN, Integer.toString(numIniChars)); child.setAttribute(MAX_LEN, Integer.toString(maxLenResp)); if (iniText != null && iniText.length() > 0) child.setAttribute(INI_TEXT, iniText); e.addContent(child); } if (popupContent != null && infoMode != NO_INFO) { child = new org.jdom.Element(INFO); if (infoMode != INFO_ALWAYS) child.setAttribute(MODE, infoTypes[infoMode]); if (popupDelay > 0) child.setAttribute(DELAY, Integer.toString(popupDelay)); if (popupMaxTime > 0) child.setAttribute(MAX_TIME, Integer.toString(popupMaxTime)); if (onlyPlay && popupContent.mediaContent != null) { child.addContent(popupContent.mediaContent.getJDomElement()); } else { child.addContent(popupContent.getJDomElement()); } e.addContent(child); } return e; } public static TextTarget getTextTarget(org.jdom.Element e, MediaBag mediaBag) throws Exception { TextTarget tt = new TextTarget(); tt.setProperties(e, mediaBag); return tt; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); MediaBag mediaBag = (MediaBag) aux; org.jdom.Element child, child2; java.util.List answerLst = e.getChildren(ANSWER); if (!answerLst.isEmpty()) { answer = new String[answerLst.size()]; for (int i = 0; i < answer.length; i++) answer[i] = ((org.jdom.Element) (answerLst.get(i))).getText(); } if ((child = e.getChild(OPTION_LIST)) != null) { java.util.List optionLst = child.getChildren(OPTION); if (!optionLst.isEmpty()) { isList = true; options = new String[optionLst.size()]; for (int i = 0; i < options.length; i++) options[i] = ((org.jdom.Element) (optionLst.get(i))).getText(); } } if ((child = e.getChild(RESPONSE)) != null) { String s = new String(new char[] { iniChar }); s = JDomUtility.getStringAttr(child, FILL, s, true); if (s.length() > 0) iniChar = s.charAt(0); numIniChars = JDomUtility.getIntAttr(child, INI_LEN, numIniChars); maxLenResp = JDomUtility.getIntAttr(child, MAX_LEN, maxLenResp); iniText = child.getAttributeValue(INI_TEXT); } if ((child = e.getChild(INFO)) != null) { infoMode = JDomUtility.getStrIndexAttr(child, MODE, infoTypes, INFO_ALWAYS); popupDelay = JDomUtility.getIntAttr(child, DELAY, popupDelay); popupMaxTime = JDomUtility.getIntAttr(child, MAX_TIME, popupMaxTime); if ((child2 = child.getChild(MediaContent.ELEMENT_NAME)) != null) { onlyPlay = true; popupContent = new ActiveBoxContent(); popupContent.mediaContent = MediaContent.getMediaContent(child2); } else if ((child2 = child.getChild(ActiveBoxContent.ELEMENT_NAME)) != null) { popupContent = ActiveBoxContent.getActiveBoxContent(child2, mediaBag); } } } protected void setParentPane(TextActivityPane pane) { parentPane = pane; } public void setAnswer(String text) { java.util.StringTokenizer st = new java.util.StringTokenizer(text, "|"); int numItems = st.countTokens(); if (numItems <= 0) { answer = null; } else { answer = new String[numItems]; for (int i = 0; i < numItems; i++) { answer[i] = st.nextToken(); } } } public String getAnswers() { StringBuilder sb = new StringBuilder(); if (answer != null) for (int i = 0; i < answer.length; i++) { if (i > 0) sb.append("|"); sb.append(answer[i]); } return sb.substring(0); } public boolean checkText(String txt, Evaluator ev) { if (answer == null || txt == null) return false; boolean ok = ev.checkText(txt, answer); targetStatus = ok ? SOLVED : WITH_ERROR; return ok; } public JComboBox buildCombo(AttributeSet targetAttr, AttributeSet errorAttr) { if (!isList || options == null) return null; comboList = new TargetCombo(options, targetAttr, errorAttr); if (iniText != null) comboList.setSelectedItem(iniText); return comboList; } public String getFillString() { return getFillString(numIniChars); } public String getFillString(int length) { StringBuilder s = new StringBuilder(); for (int i = 0; i < length; i++) { s.append(iniChar); } return s.substring(0); } public void requestFocus(TextActivityBase.Panel tabp, TargetMarker tm) { if (comboList != null) { SwingUtilities.invokeLater(new Runnable() { public void run() { comboList.requestFocus(); } }); } else tabp.requestFocus(); if (popupContent != null && (infoMode == INFO_ALWAYS || (infoMode == INFO_ON_ERROR && targetStatus == WITH_ERROR))) tabp.popupTimer.setUp(this, tm); } public void checkPopup(TextActivityBase.Panel tabp, TargetMarker tm, boolean f1Key) { if (popupContent != null) { boolean show = false; if (infoMode == INFO_ON_ERROR) show = (targetStatus == WITH_ERROR); else if (infoMode == INFO_ON_DEMAND) show = f1Key; if (show) tabp.popupTimer.setUp(this, tm); else tabp.popupTimer.stopPopup(); } } protected Point getPopupLocation(TextActivityBase.Panel tabp, TargetMarker tm) { if (popupContent == null || onlyPlay) return null; Rectangle r = tm.getBegRect(tabp.pane); if (r == null) return null; Point pt = r.getLocation(); pt.y -= popupContent.dimension.height; if (pt.y < 0) pt.y = r.y + r.height; if (pt.x + popupContent.dimension.width > tabp.pane.getWidth()) { pt.x -= (tabp.pane.getWidth() - pt.x + popupContent.dimension.width); if (pt.x < 0) pt.x = 0; } return pt; } public void adjustPopupLocation(TextActivityBase.Panel tabp, TargetMarker tm) { Point pt = getPopupLocation(tabp, tm); if (pt != null) tabp.pane.bx.setLocation(pt); } public void lostFocus(TextActivityBase.Panel tabp, TargetMarker tm) { if (comboList != null && parentPane != null) { parentPane.repaint(); } if (popupContent != null) tabp.popupTimer.stopPopup(); } public class TargetCombo extends JComboBox { Color bgColor, foreColor; Color errBgColor, errForeColor; Font rFont; TargetComboCellRenderer cellRenderer; JTextField txEditor; AbstractAction showListAction, fwdAction, bkAction; public TargetCombo(String[] items, AttributeSet targetAttr, AttributeSet errorAttr) { super(items); setSelectedIndex(-1); showListAction = new AbstractAction("showList") { public void actionPerformed(ActionEvent e) { setPopupVisible(true); } }; fwdAction = new AbstractAction("forward") { public void actionPerformed(ActionEvent e) { if (parentPane != null) { Action act = parentPane.getActionMap().get("next-target"); if (act != null) act.actionPerformed(e); } } }; bkAction = new AbstractAction("backwards") { public void actionPerformed(ActionEvent e) { if (parentPane != null) { Action act = parentPane.getActionMap().get("prev-target"); if (act != null) act.actionPerformed(e); } } }; rFont = TextActivityDocument.attributesToFont(targetAttr); setFont(rFont); bgColor = StyleConstants.getBackground(targetAttr); foreColor = StyleConstants.getForeground(targetAttr); errBgColor = StyleConstants.getBackground(errorAttr); errForeColor = StyleConstants.getForeground(errorAttr); setCursor(Cursor.getDefaultCursor()); cellRenderer = new edu.xtec.jclic.activities.text.TextTarget.TargetCombo.TargetComboCellRenderer(); setRenderer(cellRenderer); Dimension d = getPreferredSize(); setPreferredSize(new Dimension((int) d.getWidth() + rFont.getSize() / 2, (int) d.getHeight())); setMaximumSize(getPreferredSize()); setEditable(true); Component c = getEditor().getEditorComponent(); if (c instanceof JTextField) txEditor = (JTextField) c; else txEditor = new JTextField(); txEditor.setEnabled(false); checkColors(); setAlignmentY(0.8f); setKActions(); } protected void setKActions() { registerKeyboardAction(showListAction, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), JComponent.WHEN_FOCUSED); registerKeyboardAction(showListAction, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_FOCUSED); txEditor.registerKeyboardAction(showListAction, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), JComponent.WHEN_FOCUSED); txEditor.registerKeyboardAction(showListAction, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_FOCUSED); registerKeyboardAction(fwdAction, KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); registerKeyboardAction(fwdAction, KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); registerKeyboardAction(fwdAction, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); registerKeyboardAction(bkAction, KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); registerKeyboardAction(bkAction, KeyStroke.getKeyStroke(KeyEvent.VK_TAB, Event.SHIFT_MASK), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); } public void checkColors() { if (targetStatus == WITH_ERROR) { txEditor.setBackground(errBgColor); txEditor.setForeground(errForeColor); txEditor.setDisabledTextColor(errForeColor); } else { txEditor.setBackground(bgColor); txEditor.setForeground(foreColor); txEditor.setDisabledTextColor(foreColor); } } class TargetComboCellRenderer extends JLabel implements ListCellRenderer { public TargetComboCellRenderer() { setOpaque(true); setFont(rFont); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { setBackground(isSelected ? foreColor : bgColor); setForeground(isSelected ? bgColor : foreColor); setText(value == null ? "" : value.toString()); return this; } } @Override public void setSelectedItem(Object o) { super.setSelectedItem(o); if (o != null && parentPane != null) { setModified(true); SwingUtilities.invokeLater(new Runnable() { public void run() { if (!isPopupVisible()) { parentPane.targetChanged(TextTarget.this); } } }); } } } public void setModified(boolean value) { flagModified = value; if (value == true && targetStatus == NOT_EDITED) targetStatus = EDITED; } public boolean isModified() { return flagModified; } public static class PopupTimer extends javax.swing.Timer { TextTarget target; boolean action; TextActivityBase.Panel tabp; TargetMarker tm; public PopupTimer(TextActivityBase.Panel tabp) { super(1000, null); this.tabp = tabp; setRepeats(false); target = null; } public void setUp(TextTarget setTarget, TargetMarker setTm) { stop(); target = setTarget; tm = setTm; action = true; if (target != null && target.popupContent != null) { SwingUtilities.invokeLater(new Runnable() { public void run() { if (target.popupDelay > 0) { setInitialDelay(target.popupDelay * 1000); setRepeats(false); start(); } else startPopup(); } }); } } public void startPopup() { stop(); if (target != null && target.popupContent != null) { if (!target.onlyPlay) { Point pt = target.getPopupLocation(tabp, tm); if (pt != null) tabp.pane.enableActiveBox(target.popupContent, pt); } if (target.popupContent.mediaContent != null) tabp.ps.playMedia(target.popupContent.mediaContent, tabp.pane.bx); if (target.popupMaxTime > 0) { action = false; setInitialDelay(target.popupMaxTime * 1000); setRepeats(false); start(); } } } public void stopPopup() { stop(); if (target != null && target.popupContent != null) { tabp.ps.stopMedia(1); tabp.pane.disableActiveBox(); } } @Override protected void fireActionPerformed(java.awt.event.ActionEvent e) { if (action == true) startPopup(); else stopPopup(); } } } src/core/edu/xtec/jclic/activities/text/WrittenAnswer.java000066400000000000000000000336331335566474600242430ustar00rootroot00000000000000/* * File : WrittenAnswer.java * Created : 09-may-2001 11:15 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.MouseEvent; import javax.swing.JTextField; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class WrittenAnswer extends Activity implements ActiveBagContentKit.Compatible { int nonAssignedCells; boolean useIdAss; /** Creates new WrittenAnswer */ public WrittenAnswer(JClicProject project) { super(project); boxGridPos = AB; abc = new ActiveBagContent[3]; scramble[0] = false; nonAssignedCells = 0; invAss = false; useIdAss = true; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 2, 'A'); abc[1] = ActiveBagContent.initNew(3, 2, 'A'); } protected static final String ANSWERS = "answers", INVERSE = "inverse"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex; if (abc[0] == null || abc[1] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(abc[0].getJDomElement().setAttribute(ID, PRIMARY)); e.addContent(abc[1].getJDomElement().setAttribute(ID, ANSWERS)); if (abc[2] != null) e.addContent(abc[2].getJDomElement().setAttribute(ID, SOLVED_PRIMARY)); ex = new org.jdom.Element(SCRAMBLE); { ex.setAttribute(TIMES, Integer.toString(shuffles)); ex.setAttribute(PRIMARY, JDomUtility.boolString(scramble[0])); e.addContent(ex); } ex = new org.jdom.Element(LAYOUT); ex.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]); e.addContent(ex); if (invAss) e.setAttribute(INVERSE, JDomUtility.boolString(invAss)); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); ActiveBagContent bag; abc[2] = null; java.util.Iterator itr = e.getChildren(ActiveBagContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) { child = ((org.jdom.Element) itr.next()); bag = ActiveBagContent.getActiveBagContent(child, project.mediaBag); String id = JDomUtility.getStringAttr(child, ID, PRIMARY, false); if (PRIMARY.equals(id)) abc[0] = bag; else if (ANSWERS.equals(id)) abc[1] = bag; else if (SOLVED_PRIMARY.equals(id)) abc[2] = bag; } if (abc[0] == null || abc[1] == null) throw new IllegalArgumentException("WrittenAnswer without content!"); if ((child = e.getChild(SCRAMBLE)) != null) { shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); scramble[0] = JDomUtility.getBoolAttr(child, PRIMARY, scramble[0]); } if ((child = e.getChild(LAYOUT)) != null) boxGridPos = JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos); invAss = JDomUtility.getBoolAttr(e, INVERSE, invAss); abc[0].avoidAllIdsNull(abc[1].getNumCells()); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); // Clic3 problem c3a.nctxw = c3a.ncw; c3a.nctxh = c3a.nch; boxGridPos = c3a.graPos; for (int i = 0; i < 2; i++) { abc[i] = c3a.createActiveBagContent(i); abc[i].setBoxBase(c3a.getBoxBase(i)); } scramble[0] = c3a.bar[0]; abc[2] = c3a.sol ? c3a.createActiveBagContent(2) : null; abc[0].avoidAllIdsNull(abc[1].getNumCells()); } public int getMinNumActions() { if (abc[0] == null || abc[1] == null) return 0; if (invAss) return abc[1].getNumCells(); else return abc[0].getNumCells() - nonAssignedCells; } @Override public boolean helpSolutionAllowed() { return true; } @Override public boolean hasRandom() { return true; } @Override public boolean needsKeyboard() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel implements java.awt.event.ActionListener { JTextField textField; ActiveBoxBag[] bg = new ActiveBoxBag[2]; int currentCell; boolean[] invAssCheck; protected Panel(PlayStation ps) { super(ps); for (int i = 0; i < 2; i++) bg[i] = null; currentCell = -1; textField = null; invAssCheck = null; } public void clear() { for (int i = 0; i < 2; i++) if (bg[i] != null) { bg[i].end(); bg[i] = null; } textField = null; } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); ActiveBox bx; currentCell = -1; clear(); if (abc[0] != null && abc[1] != null) { if (acp != null) acp.generateContent(new ActiveBagContentKit(abc[0].nch, abc[0].ncw, abc, true), ps); if (invAss) { invAssCheck = new boolean[abc[1].getNumCells()]; for (int i = 0; i < invAssCheck.length; i++) invAssCheck[i] = false; } bg[0] = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); // Clic3 behavior!!! double w = abc[1].w; if (boxGridPos == AUB || boxGridPos == BUA) w = abc[0].getTotalWidth(); bg[1] = new ActiveBoxGrid(null, this, margin, margin, w, abc[1].h, new edu.xtec.jclic.shapers.Rectangular(1, 1), abc[1].bb); textField = new JTextField(200); textField.setHorizontalAlignment(JTextField.CENTER); bx = bg[1].getActiveBox(0); bx.setInactive(false); bx.hasHostedComponent = true; bx.setHostedComponent(textField); textField.addActionListener(this); bg[0].setContent(abc[0], abc[2]); currentCell = 0; bg[0].setDefaultIdAss(); nonAssignedCells = 0; for (int i = 0; i < bg[0].getNumCells(); i++) { bx = bg[0].getActiveBox(i); if (bx.idAss == -1) { nonAssignedCells++; bx.switchToAlt(ps); } } bg[0].setVisible(true); bg[1].setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); else firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (bg[0] != null && bg[1] != null) { if (scramble[0]) shuffle(new ActiveBoxBag[] { bg[0] }, true, true); if (useOrder) currentItem = bg[0].getNextItem(-1); playing = true; setCurrentCell(0); } } public void render(Graphics2D g2, Rectangle dirtyRegion) { for (int i = 0; i < 2; i++) { if (bg[i] != null) bg[i].update(g2, dirtyRegion, this); } } public Dimension setDimension(Dimension preferredMaxSize) { return bg[0] == null || bg[1] == null || getSize().equals(preferredMaxSize) ? preferredMaxSize : BoxBag.layoutDouble(preferredMaxSize, bg[0], bg[1], boxGridPos, margin); } private boolean checkInvAss() { if (invAss == false || invAssCheck == null) return false; for (boolean b : invAssCheck) if (!b) return false; return true; } private void setCurrentCell(int i) { ActiveBox bx; boolean m = false; if (!playing) return; if (currentCell != -1) { boolean ok = false; bx = bg[0].getActiveBoxWithIdLoc(currentCell); String src = bx.getDescription(); bx.setMarked(false); int id = bx.idAss; String txCheck = (id >= 0 ? abc[1].getActiveBoxContent(id).text : ""); String txAnswer = textField.getText().trim(); if (edu.xtec.util.StrUtils.compareMultipleOptions(txAnswer, txCheck, false)) { ok = true; bx.idAss = -1; // 29-mai-2007 // When in multiple-answer, fill-in textField with // the first valid option: if (txCheck.indexOf('|') >= 0) textField.setText((new java.util.StringTokenizer(txCheck, "|")).nextToken()); if (abc[2] != null) { bx.switchToAlt(ps); m = bx.playMedia(ps); } else bx.clear(); if (invAss && id >= 0 && id < invAssCheck.length) { invAssCheck[id] = true; } if (useOrder) currentItem = bg[0].getNextItem(currentItem); } int cellsPlaced = bg[0].countCellsWithIdAss(-1); if (txAnswer.length() > 0) { ps.reportNewAction(getActivity(), ACTION_WRITE, src, txAnswer, ok, cellsPlaced); } if (ok && (checkInvAss() || cellsPlaced == bg[0].getNumCells())) { finishActivity(true); textField.setEnabled(false); return; } else if (!m && txAnswer.length() > 0) playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } if (useOrder) bx = (ActiveBox) bg[0].getBox(currentItem); else bx = bg[0].getActiveBoxWithIdLoc(i); if (bx == null || bx.idAss == -1) { for (int j = 0; j < bg[0].getNumCells(); j++) { bx = bg[0].getActiveBoxWithIdLoc(j); if (bx.idAss != -1) break; } if (bx != null && bx.idAss == -1) { // error ? finishActivity(false); textField.setEnabled(false); return; } } // 29 - mai -2007 // Draw border only if it has more than one cell if (bg[0].getNumCells() > 1 && bx != null) bx.setMarked(true); if (bx != null) currentCell = bx.idLoc; textField.setText(""); textField.requestFocus(); if (bx != null) bx.playMedia(ps); } @Override public void requestFocus() { if (playing && textField != null) textField.requestFocus(); } public void actionPerformed(java.awt.event.ActionEvent e) { if (playing && e.getSource() == textField && currentCell != -1) setCurrentCell(currentCell); } @Override public void processMouse(MouseEvent e) { ActiveBox bx; boolean m = false; if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if ((bx = bg[0].findActiveBox(e.getPoint())) != null) { if (bx.getContent() != null && bx.getContent().mediaContent == null) playEvent(EventSounds.CLICK); setCurrentCell(bx.idLoc); } break; } } @Override public void showHelp() { if (!helpWindowAllowed() || bg[0] == null) return; HelpActivityComponent hac = null; if (showSolution) { hac = new HelpActivityComponent(this) { ActiveBoxBag abb = null; String currentResponse = ""; int cellsPlaced = bg[0].countCellsWithIdAss(-1); public void render(Graphics2D g2, Rectangle dirtyRegion) { if (abb != null) abb.update(g2, dirtyRegion, this); } @Override public void init() { currentResponse = textField.getText(); abb = (ActiveBoxBag) bg[0].clone(); abb.setContainer(this); Dimension size = abb.getBounds().getSize(); abb.setBounds(DEFAULT_MARGIN, DEFAULT_MARGIN, size.width, size.height); size.width += 2 * DEFAULT_MARGIN; size.height += 2 * DEFAULT_MARGIN; setPreferredSize(size); setMaximumSize(size); setMinimumSize(size); Point p = (Point) getClientProperty(HelpActivityComponent.PREFERRED_LOCATION); if (p != null) p.translate((int) bg[0].x - DEFAULT_MARGIN, (int) bg[0].y - DEFAULT_MARGIN); } @Override public void end() { super.end(); textField.setText(currentResponse); } @Override public void processMouse(MouseEvent e) { ActiveBox bx; if (abb != null) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: bx = abb.findActiveBox(e.getPoint()); if (bx != null) { boolean m = bx.playMedia(ps); String s = abc[1].getActiveBoxContent(bx.idOrder).text; if (s != null) textField.setText(s.replace('|', ' ')); ps.reportNewAction(getActivity(), ACTION_HELP, bx.getDescription(), null, false, cellsPlaced); if (!m) playEvent(EventSounds.CLICK); } break; case MouseEvent.MOUSE_RELEASED: unmarkBox(); textField.setText(""); break; } } }; hac.init(); } if (ps.showHelp(hac, helpMsg)) ps.reportNewAction(getActivity(), ACTION_HELP, null, null, false, bg[0].countCellsWithIdAss(-1)); if (hac != null) hac.end(); } } } src/core/edu/xtec/jclic/activities/textGrid/000077500000000000000000000000001335566474600213625ustar00rootroot00000000000000src/core/edu/xtec/jclic/activities/textGrid/CrossWord.java000066400000000000000000000305261335566474600241600ustar00rootroot00000000000000/* * File : CrossWord.java * Created : 04-oct-2001 19:53 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.textGrid; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.*; import javax.swing.JToggleButton; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class CrossWord extends Activity implements ActiveBagContentKit.Compatible { public static final int NO_ADVANCE = 0, ADVANCE_RIGHT = 1, ADVANCE_DOWN = 2; public static final int LABEL_WIDTH = 40; public boolean wildTransparent; public boolean upperCase; public boolean checkCase; /** Creates new CrossWords */ public CrossWord(JClicProject project) { super(project); boxGridPos = AB; abc = new ActiveBagContent[2]; wildTransparent = false; upperCase = true; checkCase = true; } @Override public void initNew() { super.initNew(); abc[0] = ActiveBagContent.initNew(3, 1, -1, true, true, 200, 60); abc[1] = ActiveBagContent.initNew(3, 1, -1, true, true, 200, 60); tgc = TextGridContent.initNew(3, 3, 'A'); } public static final String ACROSS_CLUES = "acrossClues", DOWN_CLUES = "downClues", WILD_TRANSPARENT = "wildTransparent", UPPERCASE = "upperCase", CHECK_CASE = "checkCase"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element child; if (tgc == null || abc[0] == null || abc[1] == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(tgc.getJDomElement()); e.addContent(abc[0].getJDomElement().setAttribute(ID, ACROSS_CLUES)); e.addContent(abc[1].getJDomElement().setAttribute(ID, DOWN_CLUES)); child = new org.jdom.Element(LAYOUT); child.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]); if (wildTransparent) child.setAttribute(WILD_TRANSPARENT, JDomUtility.boolString(wildTransparent)); if (!upperCase) child.setAttribute(UPPERCASE, JDomUtility.boolString(upperCase)); if (!checkCase) child.setAttribute(CHECK_CASE, JDomUtility.boolString(checkCase)); e.addContent(child); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; super.setProperties(e, aux); if ((child = e.getChild(TextGridContent.ELEMENT_NAME)) == null) throw new IllegalArgumentException("CrossWord without TextGrid"); tgc = TextGridContent.getTextGridContent(child); java.util.Iterator it = e.getChildren(ActiveBagContent.ELEMENT_NAME).iterator(); while (it.hasNext()) { child = (org.jdom.Element) it.next(); ActiveBagContent bc = ActiveBagContent.getActiveBagContent(child, project.mediaBag); String id = JDomUtility.getStringAttr(child, ID, null, false); if (ACROSS_CLUES.equals(id)) abc[0] = bc; else if (DOWN_CLUES.equals(id)) abc[1] = bc; else throw new IllegalArgumentException("Unknown clues: " + id); } if (abc[0] == null || abc[1] == null) throw new IllegalArgumentException("CrossWord without H or V clues!"); if ((child = e.getChild(LAYOUT)) != null) { boxGridPos = JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos); wildTransparent = JDomUtility.getBoolAttr(child, WILD_TRANSPARENT, wildTransparent); upperCase = JDomUtility.getBoolAttr(child, UPPERCASE, upperCase); checkCase = JDomUtility.getBoolAttr(child, CHECK_CASE, checkCase); } } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); boxGridPos = c3a.graPos; tgc = new TextGridContent(); tgc.nch = c3a.nctxh; tgc.ncw = c3a.nctxw; tgc.w = c3a.txtCW; tgc.h = c3a.txtCH; tgc.border = true; tgc.text = c3a.graTxt; tgc.bb = c3a.getBoxBase(0); for (int k = 0; k < 2; k++) { abc[k] = new ActiveBagContent(1, 1); int i, j, l; for (i = 0, l = 0; i < c3a.tags[k].length; i++) { j = 0; java.util.StringTokenizer st = new java.util.StringTokenizer(c3a.tags[k][i], ";"); while (st.hasMoreElements()) { ActiveBoxContent bc = abc[k].getActiveBoxContent(l++); c3a.setActiveBoxTextContent(bc, st.nextToken()); bc.id = i; bc.item = j++; } } abc[k].bb = c3a.getBoxBase(1); abc[k].ncw = 1; abc[k].nch = i; abc[k].w = 200; abc[k].h = 75; } } public int getMinNumActions() { return (tgc == null ? 0 : tgc.getNumChars() - tgc.countWildChars()); } @Override public boolean helpSolutionAllowed() { return false; } @Override public boolean needsKeyboard() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } class Panel extends Activity.Panel implements ActionListener, FocusListener { TextGrid grid; BoxBag bb; int advance; int numLetters; ActiveBox hClue, vClue; JToggleButton hClueBtn, vClueBtn; protected Panel(PlayStation ps) { super(ps); grid = null; bb = null; advance = NO_ADVANCE; numLetters = 0; addFocusListener(this); } public void clear() { if (grid != null) { grid.end(); grid = null; } if (bb != null) { bb.end(); bb = null; } } private BoxBag createBoxBag(int n) { BoxBag bxb = new BoxBag(null, this, null); SimpleBox sb = new SimpleBox(bxb, null, null); sb.setBounds(0, 0, LABEL_WIDTH, abc[n].h); sb.setBorder(true); JToggleButton tgbtn = new JToggleButton( edu.xtec.util.ResourceManager.getImageIcon(n == 0 ? "buttons/textright.png" : "buttons/textdown.png")); tgbtn.addActionListener(this); javax.swing.border.Border border = tgbtn.getBorder(); sb.setHostedComponent(tgbtn); tgbtn.setBorder(border); bxb.addBox(sb); ActiveBox ab = new ActiveBox(bxb, null, n, new java.awt.geom.Rectangle2D.Double(LABEL_WIDTH, 0, abc[n].w, abc[n].h), null); bxb.addBox(ab); bxb.setBoxBase(abc[n].bb); if (n == 0) { hClue = ab; hClueBtn = tgbtn; } else { vClue = ab; vClueBtn = tgbtn; } return bxb; } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (acp != null && abc != null) acp.generateContent(new ActiveBagContentKit(0, 0, abc, false), ps); if (tgc != null) { grid = TextGrid.createEmptyGrid(null, this, margin, margin, tgc, wildTransparent); bb = new BoxBag(null, this, null); BoxBag bxbh = createBoxBag(0); BoxBag bxbv = createBoxBag(1); if (boxGridPos == AUB || boxGridPos == BUA) bxbv.setLocation(bxbh.getWidth() + margin, 0); else bxbv.setLocation(0, bxbh.getHeight() + margin); bb.addBox(bxbh); bb.addBox(bxbv); grid.setVisible(true); bb.setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); else firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (grid != null) { grid.setChars(tgc.text); numLetters = getMinNumActions(); grid.setCellAttributes(true, true); grid.setCursorEnabled(true); setCursorAt(0, 0); advance = ADVANCE_RIGHT; hClueBtn.setSelected(true); requestFocus(); playing = true; } } public int getCurrentScore() { return grid == null ? 0 : grid.countCoincidences(checkCase); } public void render(Graphics2D g2, Rectangle dirtyRegion) { if (grid != null) grid.update(g2, dirtyRegion, this); if (bb != null) bb.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (grid == null || bb == null || getSize().equals(preferredMaxSize)) return preferredMaxSize; else return BoxBag.layoutDouble(preferredMaxSize, grid, bb, boxGridPos, margin); } @Override public void processMouse(MouseEvent e) { Point p = e.getPoint(); if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if (grid.contains(p)) { Point pt = grid.getLogicalCoords(p); if (pt != null) { setCursorAt(pt.x, pt.y); } } else if (hClue.contains(p)) hClue.playMedia(ps); else if (vClue.contains(p)) vClue.playMedia(ps); break; } } protected void moveCursor(int dx, int dy) { if (grid != null) { grid.moveCursor(dx, dy, true); cursorPosChanged(); } } protected void setCursorAt(int x, int y) { grid.setCursorAt(x, y, true); cursorPosChanged(); } protected void cursorPosChanged() { Point pt = grid.getCursor(); if (pt != null && bb != null) { Point items = grid.getItemFor(pt.x, pt.y); if (items != null) { hClue.setContent(abc[0].getActiveBoxContentWith(pt.y, items.x)); vClue.setContent(abc[1].getActiveBoxContentWith(pt.x, items.y)); } } } @Override public void processKey(KeyEvent e) { if (playing && grid != null) switch (e.getID()) { case KeyEvent.KEY_TYPED: Point cur = grid.getCursor(); char ch = e.getKeyChar(); if (ch >= 0 && cur != null) { if (upperCase) ch = Character.toUpperCase(ch); grid.setCharAt(cur.x, cur.y, ch); boolean ok = grid.isCellOk(cur.x, cur.y, checkCase); int r = getCurrentScore(); ps.reportNewAction(getActivity(), ACTION_WRITE, String.copyValueOf(new char[] { ch }), "X:" + cur.x + " Y:" + cur.y, ok, r); if (r == numLetters) { grid.setCursorEnabled(false); grid.stopCursorBlink(); finishActivity(true); } else { playEvent(EventSounds.CLICK); if (advance == ADVANCE_RIGHT) moveCursor(1, 0); else if (advance == ADVANCE_DOWN) moveCursor(0, 1); } } break; case KeyEvent.KEY_PRESSED: int dx = 0, dy = 0; switch (e.getKeyCode()) { case KeyEvent.VK_RIGHT: dx = 1; break; case KeyEvent.VK_LEFT: dx = -1; break; case KeyEvent.VK_DOWN: dy = 1; break; case KeyEvent.VK_UP: dy = -1; break; } if (dx != 0 || dy != 0) moveCursor(dx, dy); break; } } public void focusGained(FocusEvent e) { if (playing && grid != null) grid.startCursorBlink(); } public void focusLost(FocusEvent e) { if (grid != null) grid.stopCursorBlink(); } public void actionPerformed(ActionEvent ev) { advance = NO_ADVANCE; if (ev.getSource().equals(hClueBtn)) { if (hClueBtn.isSelected()) advance = ADVANCE_RIGHT; vClueBtn.setSelected(false); } else if (ev.getSource().equals(vClueBtn)) { if (vClueBtn.isSelected()) advance = ADVANCE_DOWN; hClueBtn.setSelected(false); } requestFocus(); } } } src/core/edu/xtec/jclic/activities/textGrid/WordSearch.java000066400000000000000000000316611335566474600242750ustar00rootroot00000000000000/* * File : WordSearch.java * Created : 09-sep-2001 19:24 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.textGrid; import edu.xtec.jclic.*; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.event.MouseEvent; import javax.swing.JList; import javax.swing.JScrollPane; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class WordSearch extends Activity implements ActiveBagContentKit.Compatible { String[] clues; int[] clueItems; /** Creates new WordSearch */ public WordSearch(JClicProject project) { super(project); boxGridPos = AB; abc = new ActiveBagContent[1]; clues = null; clueItems = null; } @Override public void initNew() { super.initNew(); clues = new String[0]; clueItems = new int[0]; tgc = TextGridContent.initNew(3, 3, 'A'); } @Override public org.jdom.Element getJDomElement() { org.jdom.Element ex, ex2; if (clues == null || tgc == null) return null; org.jdom.Element e = super.getJDomElement(); e.addContent(tgc.getJDomElement()); ex = new org.jdom.Element(CLUES); for (int i = 0; i < clues.length; i++) { ex2 = new org.jdom.Element(CLUE); ex2.setAttribute(ID, Integer.toString(clueItems[i])); ex2.setText(clues[i]); ex.addContent(ex2); } e.addContent(ex); if (abc[0] != null) { e.addContent(abc[0].getJDomElement().setAttribute(ID, SECONDARY)); ex = new org.jdom.Element(LAYOUT); ex.setAttribute(POSITION, LAYOUT_NAMES[boxGridPos]); e.addContent(ex); if (scramble[0]) { ex = new org.jdom.Element(SCRAMBLE); ex.setAttribute(TIMES, Integer.toString(shuffles)); ex.setAttribute(SECONDARY, JDomUtility.boolString(scramble[0])); e.addContent(ex); } } return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child, child2; super.setProperties(e, aux); if ((child = e.getChild(TextGridContent.ELEMENT_NAME)) == null) throw new IllegalArgumentException("WordSearch without TextGridContent!"); tgc = TextGridContent.getTextGridContent(child); if ((child = e.getChild(CLUES)) == null) throw new IllegalArgumentException("WordSearch without clues!"); java.util.List cluesList = child.getChildren(CLUE); int numClues = cluesList.size(); clues = new String[numClues]; clueItems = new int[numClues]; for (int i = 0; i < numClues; i++) { child2 = ((org.jdom.Element) cluesList.get(i)); clueItems[i] = JDomUtility.getIntAttr(child2, ID, i); clues[i] = child2.getText(); } child = e.getChild(ActiveBagContent.ELEMENT_NAME); if (child != null) { if (!SECONDARY.equals(child.getAttributeValue(ID))) throw new IllegalArgumentException("WordSearch expects only \"secondary\" BagContent!"); abc[0] = ActiveBagContent.getActiveBagContent(child, project.mediaBag); if ((child = e.getChild(SCRAMBLE)) != null) { shuffles = JDomUtility.getIntAttr(child, TIMES, shuffles); scramble[0] = JDomUtility.getBoolAttr(child, SECONDARY, scramble[0]); } else { scramble[0] = false; } } else abc[0] = null; if ((child = e.getChild(LAYOUT)) != null) boxGridPos = JDomUtility.getStrIndexAttr(child, POSITION, LAYOUT_NAMES, boxGridPos); } @Override public void setProperties(edu.xtec.jclic.clic3.Clic3Activity c3a) throws Exception { super.setProperties(c3a); boxGridPos = c3a.graPos; tgc = new TextGridContent(); tgc.nch = c3a.nctxh; tgc.ncw = c3a.nctxw; tgc.w = c3a.txtCW; tgc.h = c3a.txtCH; tgc.border = c3a.delim[1]; tgc.text = c3a.graTxt; clues = c3a.tags[0]; clueItems = new int[clues.length]; for (int i = 0; i < clues.length; i++) clueItems[i] = i; tgc.bb = c3a.getBoxBase(0); // read second grid if (c3a.bar[0]) { // clic3 problem c3a.txtCW = c3a.txtCW2; c3a.txtCH = c3a.txtCH2; // --- abc[0] = c3a.createActiveBagContent(0); abc[0].setBoxBase(c3a.getBoxBase(1)); } else abc[0] = null; } public int getMinNumActions() { return clues.length; } @Override public boolean helpSolutionAllowed() { return true; } @Override public boolean hasRandom() { return true; } public Activity.Panel getActivityPanel(PlayStation ps) { return new Panel(ps); } /** * Getter for property clues. * * @return Value of property clues. */ public String[] getClues() { return clues; } /** * Setter for property clues. * * @param cl New value of property "clues" * @param clItems New value of property "clueItems" */ public void setClues(String[] cl, int[] clItems) { clues = cl; if (clues == null) clues = new String[0]; clueItems = clItems; if (clueItems == null || clueItems.length != clues.length) { clueItems = new int[clues.length]; for (int i = 0; i < clueItems.length; i++) clueItems[i] = i; } } class Panel extends Activity.Panel { TextGrid grid; ActiveBoxBag bgAlt; boolean[] resolvedClues; protected Panel(PlayStation ps) { super(ps); bc = new BoxConnector(this); resolvedClues = new boolean[clues.length]; grid = null; bgAlt = null; } public void clear() { if (grid != null) { grid.end(); grid = null; } if (bgAlt != null) { bgAlt.end(); bgAlt = null; } } @Override public void buildVisualComponents() throws Exception { if (firstRun) super.buildVisualComponents(); clear(); if (acp != null && abc != null) acp.generateContent(new ActiveBagContentKit(0, 0, abc, false), ps); if (tgc != null) { grid = TextGrid.createEmptyGrid(null, this, margin, margin, tgc, false); if (abc[0] != null) bgAlt = ActiveBoxGrid.createEmptyGrid(null, this, margin, margin, abc[0]); grid.setVisible(true); invalidate(); } } @Override public void initActivity() throws Exception { super.initActivity(); if (!firstRun) buildVisualComponents(); else firstRun = false; setAndPlayMsg(MAIN, EventSounds.START); if (grid != null) { grid.setChars(tgc.text); grid.randomize(); grid.setAllCellsAttribute(TextGrid.INVERTED, false); for (int i = 0; i < clueItems.length; i++) resolvedClues[i] = false; if (bgAlt != null) { bgAlt.setContent(abc[0]); if (scramble[0]) shuffle(new ActiveBoxBag[] { bgAlt }, true, true); bgAlt.setVisible(false); } playing = true; } } public int getCurrentScore() { int result = 0; if (clues != null) for (int i = 0; i < clues.length; i++) if (resolvedClues[i]) result++; return result; } public void render(Graphics2D g2, Rectangle dirtyRegion) { if (grid != null) grid.update(g2, dirtyRegion, this); if (bgAlt != null) bgAlt.update(g2, dirtyRegion, this); if (bc.active) bc.update(g2, dirtyRegion, this); } public Dimension setDimension(Dimension preferredMaxSize) { if (grid == null || getSize().equals(preferredMaxSize)) return preferredMaxSize; if (bgAlt != null) return BoxBag.layoutDouble(preferredMaxSize, grid, bgAlt, boxGridPos, margin); else return BoxBag.layoutSingle(preferredMaxSize, grid, margin); } @Override public void processMouse(MouseEvent e) { Point pt1, pt2; Point p = e.getPoint(); boolean m = false; if (playing) switch (e.getID()) { case MouseEvent.MOUSE_PRESSED: ps.stopMedia(1); if (bc.active) { bc.end(); pt1 = grid.getLogicalCoords(bc.origin); pt2 = grid.getLogicalCoords(bc.dest); if (pt1 != null && pt2 != null) { String s = grid.getStringBetween(pt1.x, pt1.y, pt2.x, pt2.y); if (s != null && s.length() > 0) { boolean ok = false; boolean repeated = false; int c; for (c = 0; c < clues.length; c++) if (s.equals(clues[c])) { ok = true; break; } if (ok && !(repeated = resolvedClues[c])) { resolvedClues[c] = true; grid.setAttributeBetween(pt1.x, pt1.y, pt2.x, pt2.y, TextGrid.INVERTED, true); if (bgAlt != null) { int k = clueItems[c]; if (k >= 0 && k < bgAlt.getNumCells()) { ActiveBox bx = bgAlt.getActiveBox(clueItems[c]); if (bx != null) { bx.setVisible(true); m = bx.playMedia(ps); } } } } if (!repeated) { int r = getCurrentScore(); ps.reportNewAction(getActivity(), ACTION_SELECT, s, null, ok, r); if (r == clues.length) finishActivity(true); else if (!m) playEvent(ok ? EventSounds.ACTION_OK : EventSounds.ACTION_ERROR); } else if (!ok && !m) playEvent(EventSounds.ACTION_ERROR); } else playEvent(EventSounds.ACTION_ERROR); } } else { if (grid.contains(p)) { playEvent(EventSounds.CLICK); bc.begin(p); } } break; case MouseEvent.MOUSE_MOVED: case MouseEvent.MOUSE_DRAGGED: if (bc.active) { bc.moveTo(p); } break; } } @Override public void showHelp() { if (!helpWindowAllowed() || grid == null) return; HelpActivityComponent hac = null; if (showSolution) { hac = new HelpActivityComponent(this) { JScrollPane scrollPane = null; JList cluesList = null; public void render(Graphics2D g2, Rectangle dirtyRegion) { // do nothing } @Override public void init() { cluesList = new JList(clues); cluesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); cluesList.addListSelectionListener(this); scrollPane = new JScrollPane(cluesList); add(scrollPane); Dimension size = grid.getBounds().getSize(); scrollPane.setBounds(DEFAULT_MARGIN, DEFAULT_MARGIN, size.width, size.height); size.width += 2 * DEFAULT_MARGIN; size.height += 2 * DEFAULT_MARGIN; setPreferredSize(size); setMaximumSize(size); setMinimumSize(size); Point p = (Point) getClientProperty(HelpActivityComponent.PREFERRED_LOCATION); if (p != null) p.translate((int) grid.x - DEFAULT_MARGIN, (int) grid.y - DEFAULT_MARGIN); } @Override public void doLayout() { Rectangle r = getBounds(); if (scrollPane != null) scrollPane.setBounds(DEFAULT_MARGIN, DEFAULT_MARGIN, r.width - 2 * DEFAULT_MARGIN, r.height - 2 * DEFAULT_MARGIN); } @Override public void valueChanged(javax.swing.event.ListSelectionEvent ev) { if (bgAlt != null && !ev.getValueIsAdjusting()) { int i = cluesList.getSelectedIndex(); if (i < 0) { unmarkBox(); } else { playEvent(EventSounds.CLICK); markBox(bgAlt.getActiveBox(clueItems[i]), true); } } } }; hac.init(); } if (ps.showHelp(hac, helpMsg)) ps.reportNewAction(getActivity(), ACTION_HELP, null, null, false, getCurrentScore()); if (hac != null) hac.end(); } } } src/core/edu/xtec/jclic/automation/000077500000000000000000000000001335566474600176045ustar00rootroot00000000000000src/core/edu/xtec/jclic/automation/ActiveBagContentKit.java000066400000000000000000000041171335566474600243020ustar00rootroot00000000000000/* * File : ActiveBagContentKit.java * Created : 04-mar-2004 10:55 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation; import edu.xtec.jclic.boxes.ActiveBagContent; /** * This class is used by {@link edu.xtec.jclic.Activity} objects to interact * with {@link edu.xtec.jclic.automation.AutoContentProvider} objects. * Activities that use {@link edu.xtec.jclic.boxes.ActiveBagContent} objects, * like puzzles or associations, use ActiveBagContentKits to pass all its * containers (up to three) in a single argument when calling the * generateContent method of AutoContentProvider. * * @author Francesc Busquets (fbusquets@xtec.cat) */ public class ActiveBagContentKit { public int nRows; public int nCols; public ActiveBagContent[] content; public boolean useIds; /** Creates a new instance of ActiveBagContentKit */ public ActiveBagContentKit(int nRows, int nCols, ActiveBagContent[] content, boolean useIds) { this.nRows = nRows; this.nCols = nCols; this.content = content; this.useIds = useIds; } /** * Activities should implement this interface when its contents are formed * basically by {@link edu.xtec.jclic.boxes.ActiveBagContent} objects, in order * to let {@link edu.xtec.jclic.automation.AutoContentProvider} objects to check * whether they are compatible with them. */ public interface Compatible { }; } src/core/edu/xtec/jclic/automation/AutoContentProvider.java000066400000000000000000000113511335566474600244260ustar00rootroot00000000000000/* * File : AutoContentProvider.java * Created : 06-may-2001 18:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.ResourceBridge; import java.lang.reflect.Method; import java.util.Map; /** * This abstract class is the base for all the classes that provide contents to * JClic activities, usually based on random values. Activities linked to a * AutoContentProvider object rely on it to build its contents on * every start. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public abstract class AutoContentProvider extends Object implements Domable, Editable { public static final String ELEMENT_NAME = "automation"; public static final String BASE_CLASS = "edu.xtec.jclic.automation.", BASE_CLASS_TAG = "@"; public AutoContentProvider() { } public abstract void setProperties(org.jdom.Element e, Object aux) throws Exception; public boolean setClic3Properties(byte[] data) { return false; } public static AutoContentProvider getAutoContentProvider(org.jdom.Element e) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); String className = JDomUtility.getClassName(e); AutoContentProvider acp = getAutoContentProvider(className); if (acp != null) acp.setProperties(e, null); return acp; } public static AutoContentProvider getAutoContentProvider(String className) throws Exception { AutoContentProvider acp = null; Class providerClass = getAutoContentProviderClass(className); return (AutoContentProvider) providerClass.newInstance(); } public static Class getAutoContentProviderClass(String className) throws Exception { if (className.startsWith(BASE_CLASS_TAG)) className = BASE_CLASS + className.substring(1); Class providerClass = Class.forName(className); return providerClass; } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(JDomUtility.CLASS, getShortClassName()); return e; } public String getShortClassName() { String result = getClass().getName(); if (result.startsWith(BASE_CLASS)) result = BASE_CLASS_TAG + result.substring(BASE_CLASS.length()); return result; } // Added new method with parameter "FileSystem", in order to allow access to // external files public void init(ResourceBridge rb, FileSystem fs) { init(rb); } public void init(ResourceBridge rb) { } public abstract boolean generateContent(Object kit, ResourceBridge rb); public Editor getEditor(Editor parent) { Editor result = null; String s = getClass().getName() + "Editor"; try { Class.forName(s); } catch (ClassNotFoundException ex) { s = "edu.xtec.jclic.automation.AutoContentProviderEditor"; } return Editor.createEditor(s, this, parent); } private static final Class[] ARRAY_OF_CLASS = new Class[] { Class.class }; public static boolean checkClient(String contentProviderClassName, Class clientClass) { boolean result = false; try { Class contentProviderClass = getAutoContentProviderClass(contentProviderClassName); Method method = contentProviderClass.getMethod("checkClient", ARRAY_OF_CLASS); if (method != null) { Object o = method.invoke((Object) null, (Object[]) new Class[] { clientClass }); if (o instanceof Boolean) { result = ((Boolean) o).booleanValue(); } } } catch (Exception ex) { System.err.println("Error checking class:\n" + ex); } return result; } public static void listReferences(org.jdom.Element e, Map map) throws Exception { AutoContentProvider acp = getAutoContentProvider(e); if (acp != null) acp.innerListReferences(map); } public void innerListReferences(Map map) throws Exception { // default implementation does nothing } } src/core/edu/xtec/jclic/automation/TextActivityContentKit.java000066400000000000000000000016551335566474600251220ustar00rootroot00000000000000/* * TextActivityContentKit.java * * Created on 20 / octubre / 2006, 13:39 */ package edu.xtec.jclic.automation; import edu.xtec.jclic.activities.text.TextActivityDocument; /** @author Francesc */ public class TextActivityContentKit { public TextActivityDocument tad; public String checkButtonText; public String prevScreenText; /** Creates a new instance of TextActivityContentKit */ public TextActivityContentKit(TextActivityDocument tad, String checkButtonText, String prevScreenText) { this.tad = tad; this.checkButtonText = checkButtonText; this.prevScreenText = prevScreenText; } /** * Activities should implement this interface if based on * {@link edu.xtec.jclic.activities.text.TextActivityDocument} objects, in order * to let {@link edu.xtec.jclic.automation.AutoContentProvider} objects to check * whether they are compatible with them. */ public interface Compatible { }; } src/core/edu/xtec/jclic/automation/arith/000077500000000000000000000000001335566474600207135ustar00rootroot00000000000000src/core/edu/xtec/jclic/automation/arith/Arith.java000066400000000000000000000544371335566474600226420ustar00rootroot00000000000000/* * File : Arith.java * Created : 06-may-2001 18:28 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.arith; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.automation.AutoContentProvider; import edu.xtec.jclic.boxes.ActiveBagContent; import edu.xtec.util.JDomUtility; import edu.xtec.util.ResourceBridge; import java.text.DecimalFormat; import java.util.Iterator; import java.util.Random; /** * Arith is the first implementation of * {@link edu.xtec.jclic.automation.AutoContentProvider}. It is based on the * code of ARITH2.DLL, made originally for Clic 3.0. It provides activities with * randomly generated menthal arithmetics operations. The operations can be * additions, substractions, multiplications or divides. The unknown can be the * result of the operation or any of the two operators (in the form A # B = ?, A * # ? = C or ? # B = C), or also the operation itself (like A ? B = C). * Activities must implement * {@link edu.xtec.jclic.automation.ActiveBagContentKit.Compatible} in order to * use Arith * . * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class Arith extends AutoContentProvider { private static final String DLL_TITLE = "ARITH2.DLL"; private static final int ARITHVER = 0x02; protected static final int NMAXLOOPS = 60; protected static final int NOSORT = 0, SORTASC = 1, SORTDESC = 2; protected static final int SUM = 1, REST = 2, MULT = 4, DIV = 8, NOPERACIONS = 4; // Math signs: // \u00D7 - multiply (cross) // \u00B7 - multiply (middle dot) // \u00F7 - division (two points+bar) protected static final String[] OPSTR = { "+", "-", "\u00D7", ":" }; protected static final int ABX = 1, AXC = 2, XBC = 4, AXBC = 8, CAXB = 16, NTIPUSEX = 5; protected static final int INDIF = 0, AGB = 1, BGA = 2; private static final int RES = -12345; private static final int MAX_STR_LEN = 100; private static String S = "\u00A0"; protected class Num { float vf; int c; } protected class Operacio { Num numA = new Num(); Num numB = new Num(); Num numR = new Num(); int op; } protected static final String ID = "id", A = "A", B = "B", OPERATIONS = "operations", PLUS = "plus", MINUS = "minus", MULTIPLY = "multiply", DIVIDE = "divide", UNKNOWN = "unknown", RESULT = "result", FIRST = "first", LAST = "last", OPERAND = "operand", INVERSE = "inverse", FROM = "from", TO = "to", NOT_CARRY = "notCarry", DUPLICATES = "duplicates", ORDER = "order", ASCENDING = "ascending", DESCENDING = "descending", CONDITION = "condition", FIRST_BIG = "firstBig", LAST_BIG = "lastBig"; protected static DecimalFormat[] DF; protected static final int WILDCARD_DF = 5; Operator opA, opB; boolean use_add, use_subst, use_mult, use_div; boolean exp_abx, exp_axc, exp_xbc, exp_axbc, exp_caxb; int resultLimInf, resultLimSup; boolean resultCarry, resultNoDup; int resultOrder; int opCond; private Random random; /** Creates new Arith */ public Arith() { random = new Random(); opA = new Operator(); opB = new Operator(); exp_abx = true; use_add = true; resultLimInf = Operator.LIM0; resultLimSup = Operator.NOLIM; resultOrder = NOSORT; opCond = INDIF; if (DF == null) { DF = new DecimalFormat[WILDCARD_DF + 1]; DF[0] = new DecimalFormat("0"); DF[1] = new DecimalFormat("0.0"); DF[2] = new DecimalFormat("0.00"); DF[3] = new DecimalFormat("0.000"); DF[4] = new DecimalFormat("0.0000"); DF[WILDCARD_DF] = new DecimalFormat("0000000000"); } } public DecimalFormat getDF(int index) { return DF[index <= WILDCARD_DF ? index : WILDCARD_DF - 1]; } @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); org.jdom.Element op = opA.getJDomElement(); op.setAttribute(ID, A); e.addContent(op); op = opB.getJDomElement(); op.setAttribute(ID, B); e.addContent(op); org.jdom.Element eop = new org.jdom.Element(OPERATIONS); eop.setAttribute(PLUS, JDomUtility.boolString(use_add)); eop.setAttribute(MINUS, JDomUtility.boolString(use_subst)); eop.setAttribute(MULTIPLY, JDomUtility.boolString(use_mult)); eop.setAttribute(DIVIDE, JDomUtility.boolString(use_div)); e.addContent(eop); org.jdom.Element eu = new org.jdom.Element(UNKNOWN); eu.setAttribute(RESULT, JDomUtility.boolString(exp_abx)); eu.setAttribute(FIRST, JDomUtility.boolString(exp_xbc)); eu.setAttribute(LAST, JDomUtility.boolString(exp_axc)); eu.setAttribute(OPERAND, JDomUtility.boolString(exp_axbc)); eu.setAttribute(INVERSE, JDomUtility.boolString(exp_caxb)); e.addContent(eu); org.jdom.Element er = new org.jdom.Element(RESULT); er.setAttribute(FROM, Operator.LIM_CH[resultLimInf]); er.setAttribute(TO, Operator.LIM_CH[resultLimSup]); if (resultCarry) er.setAttribute(NOT_CARRY, JDomUtility.boolString(resultCarry)); er.setAttribute(DUPLICATES, JDomUtility.boolString(!resultNoDup)); if (resultOrder != NOSORT) er.setAttribute(ORDER, resultOrder == SORTASC ? ASCENDING : DESCENDING); if (opCond != INDIF) er.setAttribute(CONDITION, opCond == AGB ? FIRST_BIG : LAST_BIG); e.addContent(er); return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; String s; Iterator itr = e.getChildren(Operator.ELEMENT_NAME).iterator(); while (itr.hasNext()) { child = (org.jdom.Element) (itr.next()); s = child.getAttributeValue(ID); if (A.equals(s)) opA.setProperties(child, aux); else if (B.equals(s)) opB.setProperties(child, aux); else throw new IllegalArgumentException("Unknown operator: " + s); } if ((child = e.getChild(OPERATIONS)) != null) { use_add = JDomUtility.getBoolAttr(child, PLUS, use_add); use_subst = JDomUtility.getBoolAttr(child, MINUS, use_subst); use_mult = JDomUtility.getBoolAttr(child, MULTIPLY, use_mult); use_div = JDomUtility.getBoolAttr(child, DIVIDE, use_div); } if ((child = e.getChild(UNKNOWN)) != null) { exp_abx = JDomUtility.getBoolAttr(child, RESULT, exp_abx); exp_xbc = JDomUtility.getBoolAttr(child, FIRST, exp_xbc); exp_axc = JDomUtility.getBoolAttr(child, LAST, exp_axc); exp_axbc = JDomUtility.getBoolAttr(child, OPERAND, exp_axbc); exp_caxb = JDomUtility.getBoolAttr(child, INVERSE, exp_caxb); } if ((child = e.getChild(RESULT)) != null) { resultLimInf = JDomUtility.getStrIndexAttr(child, FROM, Operator.LIM_CH, resultLimInf); resultLimSup = JDomUtility.getStrIndexAttr(child, TO, Operator.LIM_CH, resultLimSup); resultCarry = JDomUtility.getBoolAttr(child, NOT_CARRY, resultCarry); resultNoDup = !JDomUtility.getBoolAttr(child, DUPLICATES, !resultNoDup); s = child.getAttributeValue(ORDER); resultOrder = (s == null ? NOSORT : s.equals(ASCENDING) ? SORTASC : SORTDESC); s = child.getAttributeValue(CONDITION); opCond = (s == null ? INDIF : s.equals(FIRST_BIG) ? AGB : BGA); } } @Override public boolean setClic3Properties(byte[] ops) { int v; int i, lb, hb; boolean fromBlank = false; int p = 0; int arithVer; p = opA.setClic3Properties(ops, p); p = opB.setClic3Properties(ops, p); v = ops[p++] & 0x7F; if (v == 0) v = SUM; use_add = (v & SUM) != 0; use_subst = (v & REST) != 0; use_mult = (v & MULT) != 0; use_div = (v & DIV) != 0; v = ops[p++] & 0x7F; if (v == 0) v = ABX; exp_abx = (v & ABX) != 0; exp_axc = (v & AXC) != 0; exp_xbc = (v & XBC) != 0; exp_axbc = (v & AXBC) != 0; exp_caxb = (v & CAXB) != 0; resultLimInf = ((i = ops[p++] & 0x7F) == 0 ? Operator.LIM0 : i); resultLimSup = ((i = ops[p++] & 0x7F) == 0 ? Operator.NOLIM : i); resultCarry = (ops[p++] & 0x1) == 1; resultNoDup = (ops[p++] & 0x1) == 1; resultOrder = ops[p++] & 0x3; opCond = ops[p++] & 0x3; if (p < ops.length) arithVer = ops[p++] & 0x7F; else arithVer = 0; if (arithVer == 0) { arithVer = ARITHVER; if (!opA.fromBlank) { opA.limInf = Operator.adjustLimVer(opA.limInf); opA.limSup = Operator.adjustLimVer(opA.limSup); opB.limInf = Operator.adjustLimVer(opB.limInf); opB.limSup = Operator.adjustLimVer(opB.limSup); resultLimInf = Operator.adjustLimVer(resultLimInf); resultLimSup = Operator.adjustLimVer(resultLimSup); } } if (arithVer > ARITHVER) { return false; } return true; } boolean genNum(Num n, Operator op, long limInf2, long limSup2) { int r, exp, rang; long ls, li, k, v; boolean resolt; n.c = op.numDec; exp = n.c == 0 ? 1 : n.c == 1 ? 10 : 100; ls = Operator.LIMITS[op.limSup]; if (limSup2 != RES && limSup2 < ls) ls = limSup2; li = Operator.LIMITS[op.limInf]; if (limInf2 != RES && limInf2 > li) li = limInf2; resolt = false; if (op.fromList > 0) { n.vf = (long) op.lst[random.nextInt(op.fromList)]; resolt = true; } if (!resolt) { r = random.nextInt(100); if (op.wZero && r <= 10) { n.vf = 0; resolt = true; } else if (op.wOne && r > 10 && r <= 20) { n.vf = 1; resolt = true; } else if (op.wMinusOne && r > 20 && r <= 30) { n.vf = -1; resolt = true; } } if (!resolt) { if (li > ls) { k = li; li = ls; ls = k; } rang = (int) (ls - li + 1); if (rang < 0) rang = 1; v = (long) (random.nextInt(rang) + li) * exp; if (exp > 1) v += random.nextInt(exp); n.vf = ((float) v) / exp; } return true; } boolean genOp(Operacio o) { int i; int[] ops = new int[NOPERACIONS]; int nops, op; long rlinf, rlsup, ri2, rs2; float q; rlinf = Operator.LIMITS[resultLimInf]; rlsup = Operator.LIMITS[resultLimSup]; nops = 0; if (use_add) ops[nops++] = SUM; if (use_subst) ops[nops++] = REST; if (use_mult) ops[nops++] = MULT; if (use_div) ops[nops++] = DIV; op = ops[random.nextInt(nops)]; switch (op) { case SUM: for (i = 0; i < NMAXLOOPS; i++) { genNum(o.numA, opA, RES, rlsup); ri2 = o.numA.vf < rlinf ? rlinf - (long) o.numA.vf : RES; rs2 = rlsup - (long) o.numA.vf; switch (opCond) { case AGB: if (rs2 == RES || rs2 > o.numA.vf) rs2 = (long) o.numA.vf; break; case BGA: if (ri2 == RES || ri2 < o.numA.vf) ri2 = (long) o.numA.vf; break; } genNum(o.numB, opB, ri2, rs2); o.numR.vf = o.numA.vf + o.numB.vf; if (o.numR.vf >= rlinf && o.numR.vf <= rlsup) break; } o.numR.c = o.numA.c > o.numB.c ? o.numA.c : o.numB.c; o.op = 0; if (resultCarry && o.numA.vf > 0 && o.numB.vf > 0) { int va, vb; q = o.numR.c == 2 ? 100 : o.numR.c == 1 ? 10 : 1; char[] bufa = getDF(WILDCARD_DF).format((long) (o.numA.vf * q + 0.5)).toCharArray(); char[] bufb = getDF(WILDCARD_DF).format((long) (o.numB.vf * q + 0.5)).toCharArray(); for (i = 0; i < 10; i++) if (bufa[i] != '0' || bufb[i] != '0') break; for (; i < 10; i++) { va = bufa[i] - '0'; vb = bufb[i] - '0'; if (va + vb < 10) continue; while (va + vb > 9) { if (va > vb) va = (va > 0 ? random.nextInt(va) : 0); else vb = (vb > 0 ? random.nextInt(vb) : 0); } bufa[i] = '0'; for (int x = 0; x < va; x++) bufa[i]++; bufb[i] = '0'; for (int x = 0; x < vb; x++) bufb[i]++; } o.numA.vf = (float) (Long.parseLong(new String(bufa))); o.numB.vf = (float) (Long.parseLong(new String(bufb))); o.numR.vf = (float) (long) (o.numA.vf + o.numB.vf + 0.5); o.numA.vf /= q; o.numB.vf /= q; o.numR.vf /= q; } break; case REST: for (i = 0; i < NMAXLOOPS; i++) { genNum(o.numA, opA, rlinf, RES); ri2 = o.numA.vf > rlsup ? (long) (o.numA.vf - rlsup) : RES; rs2 = (long) (o.numA.vf - rlinf); switch (opCond) { case AGB: if (rs2 == RES || rs2 > o.numA.vf) rs2 = (long) o.numA.vf; break; case BGA: if (ri2 == RES || ri2 < o.numA.vf) ri2 = (long) o.numA.vf; break; } genNum(o.numB, opB, ri2, rs2); o.numR.vf = o.numA.vf - o.numB.vf; if (o.numR.vf >= rlinf && o.numR.vf <= rlsup) break; } o.numR.c = o.numA.c > o.numB.c ? o.numA.c : o.numB.c; o.op = 1; if (resultCarry && o.numA.vf > 0 && o.numB.vf > 0 && o.numA.vf >= o.numB.vf) { int va, vb; q = (o.numR.c == 2 ? 100 : (o.numR.c == 1 ? 10 : 1)); char[] bufa = getDF(WILDCARD_DF).format((long) (o.numA.vf * q + 0.5)).toCharArray(); char[] bufb = getDF(WILDCARD_DF).format((long) (o.numB.vf * q + 0.5)).toCharArray(); for (i = 0; i < 10; i++) if (bufb[i] != '0') break; for (; i < 10; i++) { va = bufa[i] - '0'; vb = bufb[i] - '0'; if (va >= vb) continue; vb = (va > 0 ? random.nextInt(va) : 0); bufb[i] = '0'; for (int x = 0; x < vb; x++) bufb[i]++; } o.numA.vf = (float) (Long.parseLong(new String(bufa))); o.numB.vf = (float) (Long.parseLong(new String(bufb))); o.numR.vf = (float) (long) (o.numA.vf - o.numB.vf + 0.5); o.numA.vf /= q; o.numB.vf /= q; o.numR.vf /= q; } break; case MULT: for (i = 0; i < NMAXLOOPS; i++) { genNum(o.numA, opA, RES, RES); ri2 = Operator.LIMITS[opB.limInf]; rs2 = Operator.LIMITS[opB.limSup]; switch (opCond) { case AGB: if (rs2 > o.numA.vf) rs2 = (long) o.numA.vf; break; case BGA: if (ri2 < o.numA.vf) ri2 = (long) o.numA.vf; break; } genNum(o.numB, opB, ri2, rs2); o.numR.vf = o.numA.vf * o.numB.vf; if (o.numR.vf >= rlinf && o.numR.vf <= rlsup) break; } o.numR.c = o.numA.c + o.numB.c; o.op = 2; break; case DIV: for (i = 0; i < NMAXLOOPS; i++) { genNum(o.numA, opA, RES, RES); ri2 = Operator.LIMITS[opB.limInf]; rs2 = Operator.LIMITS[opB.limSup]; switch (opCond) { case AGB: if (rs2 > o.numA.vf) rs2 = (long) o.numA.vf; break; case BGA: if (ri2 < o.numA.vf) ri2 = (long) o.numA.vf; break; } genNum(o.numB, opB, ri2, rs2); if (o.numB.vf != 0 && Math.abs(o.numA.vf) >= Math.abs(o.numB.vf) && (o.numR.vf = o.numA.vf / o.numB.vf) >= rlinf && o.numR.vf <= rlsup) break; } if (o.numB.vf == 0) o.numB.vf = 1; o.numR.vf = o.numA.vf / o.numB.vf; i = o.numA.c - o.numB.c; q = (float) (Math.pow(10, i)); o.numA.vf *= q; o.numR.vf *= q; o.numR.vf = ((long) o.numR.vf); o.numA.vf = o.numR.vf * o.numB.vf; o.numA.vf /= q; o.numR.vf /= q; o.numR.c = i > 0 ? i : 0; o.op = 3; break; default: return false; } return true; } public boolean generateContent(Object kit, ResourceBridge rb) { boolean result = false; if (kit instanceof ActiveBagContentKit) { ActiveBagContentKit k = (ActiveBagContentKit) kit; result = generateContent(k.nRows, k.nCols, k.content, k.useIds, rb); } return result; } protected boolean generateContent(int nRows, int nCols, ActiveBagContent[] content, boolean useIds, ResourceBridge rb) { if (nRows <= 0 || nCols <= 0 || content == null || content.length < 1 || content[0] == null || rb == null) return false; Operacio o; Operacio[] op; int i, j, k; int[] tipus = new int[NTIPUSEX]; int numTipus, tipX; boolean tipInv; String va, vb, vc, operator; String[] stra, strb, strc; int nColsB = nCols, nRowsB = nRows; int nCells = nRows * nCols; if (nCells < 2) return false; int[] ass = null; numTipus = 0; if (exp_abx) tipus[numTipus++] = ABX; if (exp_axc) tipus[numTipus++] = AXC; if (exp_xbc) tipus[numTipus++] = XBC; if (exp_axbc) tipus[numTipus++] = AXBC; if (numTipus == 0) return false; tipInv = exp_caxb; op = new Operacio[nCells]; stra = new String[nCells]; strb = new String[nCells]; strc = new String[nCells]; for (i = 0; i < nCells; i++) { o = new Operacio(); for (j = 0; j < NMAXLOOPS; j++) { genOp(o); if (resultNoDup) { for (k = 0; k < i; k++) { if (o.numR.vf == op[k].numR.vf) break; } if (k == i) break; } else break; } op[i] = o; } if (resultOrder != 0) { for (i = nCells - 1; i > 0; i--) { for (j = 0; j < i; j++) { if ((resultOrder == SORTASC && op[j].numR.vf > op[j + 1].numR.vf) || (resultOrder == SORTDESC && op[j].numR.vf < op[j + 1].numR.vf)) { o = op[j]; op[j] = op[j + 1]; op[j + 1] = o; } } } } for (i = 0; i < nCells; i++) { tipX = tipus[random.nextInt(numTipus)]; va = getDF(op[0].numA.c).format(op[i].numA.vf); vb = getDF(op[0].numB.c).format(op[i].numB.vf); vc = getDF(op[0].numR.c).format(op[i].numR.vf); operator = OPSTR[op[i].op]; if (tipInv) strc[i] = vc + S + "=" + S + va + S + operator + S + vb; else strc[i] = va + S + operator + S + vb + S + "=" + S + vc; switch (tipX) { case AXC: strb[i] = vb; if (tipInv) stra[i] = vc + S + "=" + S + va + S + operator + S + "?"; else stra[i] = va + S + operator + S + "?" + S + "=" + S + vc; break; case XBC: strb[i] = va; if (tipInv) stra[i] = vc + S + "=" + S + "?" + S + operator + S + vb; else stra[i] = "?" + S + operator + S + vb + S + "=" + S + vc; break; case AXBC: strb[i] = operator; if (tipInv) stra[i] = vc + S + "=" + S + va + S + "?" + S + vb; else stra[i] = va + S + "?" + S + vb + S + "=" + S + vc; break; default: strb[i] = vc; if (tipInv) stra[i] = "?" + S + "=" + S + va + S + operator + S + vb; else stra[i] = va + S + operator + S + vb + S + "="; break; } } if (useIds) { ass = new int[nCells]; String[] strbx = new String[nCells]; k = 0; for (i = 0; i < nCells; i++) { for (j = 0; j < k; j++) if (strb[i].equals(strbx[j])) break; if (j == k) { strbx[k] = strb[i]; ass[i] = k; k++; } else ass[i] = j; } strb = new String[k]; for (i = 0; i < k; i++) strb[i] = strbx[i]; if (nRowsB * nColsB != k) { boolean distH = false; switch (k) { case 6: nRowsB = distH ? 2 : 3; nColsB = distH ? 3 : 2; break; case 8: nRowsB = distH ? 2 : 4; nColsB = distH ? 4 : 2; break; case 9: nRowsB = 3; nColsB = 3; break; case 10: nRowsB = distH ? 2 : 5; nColsB = distH ? 5 : 2; break; case 12: nRowsB = distH ? 3 : 4; nColsB = distH ? 4 : 3; break; case 14: nRowsB = distH ? 2 : 7; nColsB = distH ? 7 : 2; break; case 15: nRowsB = distH ? 3 : 5; nColsB = distH ? 3 : 5; break; case 16: nRowsB = 4; nColsB = 4; break; case 18: nRowsB = distH ? 6 : 3; nColsB = distH ? 3 : 6; break; case 20: nRowsB = distH ? 4 : 5; nColsB = distH ? 5 : 4; break; default: nRowsB = distH ? 1 : k; nColsB = distH ? k : 1; break; } } } content[0].setTextContent(stra, nCols, nRows); if (ass != null) content[0].setIds(ass); if (content.length > 1 && content[1] != null) { content[1].setTextContent(strb, nColsB, nRowsB); content[1].getShaper().reset(nColsB, nRowsB); } if (content.length > 2 && content[2] != null) content[2].setTextContent(strc, nCols, nRows); return true; } public static boolean checkClient(Class cl) { return ActiveBagContentKit.Compatible.class.isAssignableFrom(cl); } } src/core/edu/xtec/jclic/automation/arith/Operator.java000066400000000000000000000114241335566474600233530ustar00rootroot00000000000000/* * File : Operator.java * Created : 08-mar-2004 11:24 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.arith; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; /** * Utility class used by {@link edu.xtec.jclic.automation.arith.Arith} to * encapsulate the properties and methods related to the members of the * operations. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class Operator implements Domable { protected static final int MAX_VALUE = 100000000; protected static final int WZERO = 1, WONE = 2, WMINUSONE = 4; protected static final int NLIMITS = 26; protected static final int[] LIMITS = { 0, -9999, -1000, -999, -100, -99, -50, -25, -20, -10, -9, -5, -1, 0, 1, 5, 9, 10, 20, 25, 50, 99, 100, 999, 1000, 9999 }; protected static final int DEFAULT_LIMIT = 13; protected static final int LIM0 = 13; protected static final int LIM10 = 17; protected static final int LIMI25 = 7; protected static final int LIMS25 = 19; protected static final int NOLIM = 25; protected static final String[] LIM_CH = { "x", "-9999", "-1000", "-999", "-100", "-99", "-50", "-25", "-20", "-10", "-9", "-5", "-1", "0", "1", "5", "9", "10", "20", "25", "50", "99", "100", "999", "1000", "9999" }; protected static final int NUMLST = 20; int limInf; int limSup; int numDec; boolean wZero, wOne, wMinusOne; int fromList; int[] lst = new int[NUMLST]; protected boolean fromBlank; static final String ELEMENT_NAME = "operand", DECIMALS = "decimals", VALUES = "values", FROM = "from", TO = "to", INCLUDE = "include", ZERO = "zero", ONE = "one", MINUSONE = "minusOne"; public Operator() { limInf = LIM0; limSup = LIM10; numDec = 0; wZero = false; wOne = false; wMinusOne = false; fromList = 0; } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (numDec > 0) e.setAttribute(DECIMALS, Integer.toString(numDec)); if (fromList > 0) { e.setAttribute(VALUES, JDomUtility.intArrayToString(lst, fromList)); } else { e.setAttribute(FROM, LIM_CH[limInf]); e.setAttribute(TO, LIM_CH[limSup]); if (wZero || wOne || wMinusOne) { org.jdom.Element ei = new org.jdom.Element(INCLUDE); ei.setAttribute(ZERO, JDomUtility.boolString(wZero)); ei.setAttribute(ONE, JDomUtility.boolString(wOne)); ei.setAttribute(MINUSONE, JDomUtility.boolString(wMinusOne)); e.addContent(ei); } } return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); numDec = JDomUtility.getIntAttr(e, DECIMALS, numDec); String s = e.getAttributeValue(VALUES); if (s != null) { int[] v = JDomUtility.stringToIntArray(s); fromList = v.length; System.arraycopy(v, 0, lst, 0, fromList); } else { limInf = JDomUtility.getStrIndexAttr(e, FROM, LIM_CH, limInf); limSup = JDomUtility.getStrIndexAttr(e, TO, LIM_CH, limSup); org.jdom.Element child = e.getChild(INCLUDE); if (child != null) { wZero = JDomUtility.getBoolAttr(child, ZERO, wZero); wOne = JDomUtility.getBoolAttr(child, ONE, wOne); wMinusOne = JDomUtility.getBoolAttr(child, MINUSONE, wMinusOne); } } } public int setClic3Properties(byte[] ops, int p) { int v; int i, lb, hb; int arithVer = 0; if ((limInf = ops[p++] & 0x7F) == 0) { fromBlank = true; limInf = LIM0; } limSup = ((i = ops[p++] & 0x7F) == 0 ? LIM10 : i); numDec = ops[p++] & 0x3; v = ops[p++] & 0x7F; wZero = ((v & WZERO) != 0); wOne = ((v & WONE) != 0); wMinusOne = ((v & WMINUSONE) != 0); fromList = ops[p++] & 0x7F; for (i = 0; i < NUMLST; i++) { lb = ops[p++] & 0x7F; v = ops[p++] & 0x7F; hb = v & 0x3F; lst[i] = lb + hb * 128; if ((v & 0x40) != 0) lst[i] *= -1; } return p; } protected static int adjustLimVer(int l) { if (l >= LIMI25) l++; if (l >= LIMS25) l++; return l; } } src/core/edu/xtec/jclic/automation/tagreplace/000077500000000000000000000000001335566474600217135ustar00rootroot00000000000000src/core/edu/xtec/jclic/automation/tagreplace/TagReplace.java000066400000000000000000000217411335566474600245720ustar00rootroot00000000000000/* * File : TagReplace.java * Created : 30-sep-2006 11:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.automation.tagreplace; import edu.xtec.jclic.Constants; import edu.xtec.jclic.activities.text.TargetMarker; import edu.xtec.jclic.activities.text.TextActivityDocument; import edu.xtec.jclic.activities.text.TextTarget; import edu.xtec.jclic.automation.ActiveBagContentKit; import edu.xtec.jclic.automation.AutoContentProvider; import edu.xtec.jclic.automation.TextActivityContentKit; import edu.xtec.jclic.boxes.ActiveBagContent; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.JDomUtility; import edu.xtec.util.ResourceBridge; import edu.xtec.util.StrUtils; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Position; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class TagReplace extends AutoContentProvider { public static final String DEFAULT_TAG_START = "["; public static final String DEFAULT_TAG_END = "]"; public static final String DEFAULT_CHARSET = "UTF8"; public String tagStart; public String tagEnd; public String mapFileName; public String fileCharset; private HashMap map; public static final String TAG_START = "tagStart", TAG_END = "tagEnd", MAP_FN = "mapFn", MAP_CHARSET = "charset"; /** Creates a new instance of TagReplace */ public TagReplace() { tagStart = DEFAULT_TAG_START; tagEnd = DEFAULT_TAG_END; fileCharset = DEFAULT_CHARSET; } @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); e.setAttribute(TAG_START, tagStart); e.setAttribute(TAG_END, tagEnd); if (mapFileName != null) { e.setAttribute(MAP_FN, mapFileName); e.setAttribute(MAP_CHARSET, fileCharset); } return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { tagStart = JDomUtility.getStringAttr(e, TAG_START, DEFAULT_TAG_START, false); tagEnd = JDomUtility.getStringAttr(e, TAG_END, DEFAULT_TAG_END, false); mapFileName = JDomUtility.getStringAttr(e, MAP_FN, null, false); fileCharset = JDomUtility.getStringAttr(e, MAP_CHARSET, DEFAULT_CHARSET, false); map = null; } public static boolean checkClient(Class cl) { return ActiveBagContentKit.Compatible.class.isAssignableFrom(cl) || TextActivityContentKit.Compatible.class.isAssignableFrom(cl); } public boolean generateContent(Object kit, ResourceBridge rb) { boolean result = false; if (kit instanceof ActiveBagContentKit) { ActiveBagContentKit k = (ActiveBagContentKit) kit; result = generateContent(k.nRows, k.nCols, k.content, k.useIds, rb); } else if (kit instanceof TextActivityContentKit) { result = generateContent((TextActivityContentKit) kit); } return result; } protected boolean generateContent(TextActivityContentKit k) { boolean result = false; if (k.tad != null) { try { k.checkButtonText = filter(k.checkButtonText); k.prevScreenText = filter(k.prevScreenText); filterDoc(k.tad); result = true; } catch (BadLocationException ex) { System.err.println("Error processing text document: " + ex); return false; } } return result; } protected boolean generateContent(int nRows, int nCols, ActiveBagContent[] content, boolean useIds, ResourceBridge rb) { if (content == null || content.length < 1 || rb == null) return false; for (ActiveBagContent abc : content) filterActiveBagContent(abc); return true; } protected void filterActiveBagContent(ActiveBagContent abc) { if (abc != null) { for (int j = 0; j < abc.getNumCells(); j++) { filterActiveBoxContent(abc.getActiveBoxContent(j)); } } } protected void filterActiveBoxContent(ActiveBoxContent abx) { if (abx != null) { abx.text = filter(abx.text); abx.imgName = filter(abx.imgName); if (abx.mediaContent != null) { abx.mediaContent.mediaFileName = filter(abx.mediaContent.mediaFileName); } } } protected List locateTags(String src) { ArrayList result = new ArrayList(); if (src != null && map != null) { int p = 0; int pStart; int pEnd; while ((pStart = src.indexOf(tagStart, p)) >= 0) { pEnd = src.indexOf(tagEnd, pStart + tagStart.length()); if (pEnd <= pStart) break; Object[] tagMark = new Object[4]; tagMark[0] = new Integer(pStart); tagMark[1] = new Integer(pEnd + tagEnd.length() - pStart); String key = src.substring(pStart + tagStart.length(), pEnd); String value = map.get(key); if (value != null) { tagMark[2] = value; // tagMark[3] is reserved result.add(tagMark); } p = pEnd + tagEnd.length(); } } return result; } protected String filter(String src) { String result = src; if (src != null) { StringBuilder sb = new StringBuilder(); List tagMarks = locateTags(src); int p = 0; for (Object[] tagMark : tagMarks) { int pStart = ((Integer) tagMark[0]).intValue(); int tagLength = ((Integer) tagMark[1]).intValue(); String value = (String) tagMark[2]; sb.append(src.substring(p, pStart)); sb.append(value); p = pStart + tagLength; } sb.append(src.substring(p)); result = sb.substring(0); } return result; } protected void filter(String[] strArray) { if (strArray != null) { for (int i = 0; i < strArray.length; i++) { strArray[i] = filter(strArray[i]); } } } protected void filterDoc(TextActivityDocument tad) throws BadLocationException { if (tad != null) { String src = tad.getText(0, tad.getLength()); List tagMarks = locateTags(src); int s = tagMarks.size(); for (int i = 0; i < s; i++) { Object[] tagMark = (Object[]) tagMarks.get(i); tagMark[3] = tad.createPosition(((Integer) tagMark[0]).intValue()); } for (int i = 0; i < s; i++) { Object[] tagMark = (Object[]) tagMarks.get(i); Position position = (Position) tagMark[3]; int pos = position.getOffset(); int tagLength = ((Integer) tagMark[1]).intValue(); String value = (String) tagMark[2]; AttributeSet as = tad.getCharacterElement(pos).getAttributes(); tad.getLogicalStyle(pos); tad.insertString(pos, value, as); tad.remove(pos + value.length(), tagLength); } filterActiveBagContent(tad.boxesContent); filterActiveBagContent(tad.popupsContent); if (tad.tmb != null) { for (TargetMarker tm : tad.tmb) { TextTarget target = tm.target; if (target != null) { target.iniText = filter(target.iniText); filter(target.answer); filter(target.options); filterActiveBoxContent(target.popupContent); } } } } } @Override public void init(ResourceBridge rb, FileSystem fs) { if (fs != null && mapFileName != null) { try { InputStream is = fs.getInputStream(mapFileName); if (is != null) { BufferedReader bfr = new BufferedReader(new InputStreamReader(is, fileCharset)); map = new HashMap(); String line; while ((line = bfr.readLine()) != null) { int p = line.indexOf('='); if (p > 0) { String key = StrUtils.secureString(line.substring(0, p)).trim(); String value = StrUtils.secureString(line.substring(p + 1)).trim(); if (key.length() > 0) map.put(key, value); } } } } catch (Exception ex) { System.err.println("Error initializing TagReplace: " + ex); } } } @Override public void innerListReferences(Map map) throws Exception { if (mapFileName != null) map.put(mapFileName, Constants.EXTERNAL_OBJECT); } } src/core/edu/xtec/jclic/bags/000077500000000000000000000000001335566474600163405ustar00rootroot00000000000000src/core/edu/xtec/jclic/bags/ActivityBag.java000066400000000000000000000215771335566474600214250ustar00rootroot00000000000000/* * File : ActivityBag.java * Created : 19-dec-2000 16:09 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Activity; import edu.xtec.jclic.Constants; import edu.xtec.jclic.bags.MediaBag.Listener; import edu.xtec.jclic.clic3.Clic3; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * This class stores the complete collection of activities of a * {@link edu.xtec.jclic.project.JClicProject}. The collection is managed * through a private {@link java.util.ArrayList} of objects of type * {@link edu.xtec.jclic.bags.ActivityBagElement}. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ActivityBag extends Object implements Editable, Domable, Listener { /** The project that this ActivityBag belongs to */ protected JClicProject project; private List elements; /** * Creates new ActivityBag * * @param project The project this ActivityBag belongs to */ public ActivityBag(JClicProject project) { elements = new ArrayList(20); this.project = project; } /** * Returns the project this ActiivityBag belongs to * * @return The project related to this ActivityBag. */ public JClicProject getProject() { return project; } public int size() { return elements.size(); } public ActivityBagElement elementAt(int index) throws ArrayIndexOutOfBoundsException { return elements.get(index); } public void insertElementAt(ActivityBagElement el, int index) throws ArrayIndexOutOfBoundsException { elements.add(index, el); } public void removeElementAt(int index) throws ArrayIndexOutOfBoundsException { elements.remove(index); } public void addElement(ActivityBagElement el) { elements.add(el); } public boolean removeElement(ActivityBagElement el) { return elements.remove(el); } public int getElementIndex(String name) { String s = FileSystem.stdFn(name); int result = -1, c = 0; Iterator it = elements.iterator(); while (it.hasNext()) { if (it.next().getName().equals(s)) { result = c; break; } c++; } return result; } public ActivityBagElement getElementByName(String name) { int i = getElementIndex(name); return (i >= 0 ? elementAt(i) : null); } public ActivityBagElement getElement(String name) throws Exception { ActivityBagElement abe = getElementByName(name); if (abe == null) { if (Clic3.isClic3Extension(Clic3.getExt(name))) { Clic3.addActivityToBag(project, name); abe = getElementByName(name); } } return abe; } public boolean activityExists(String name) { return getElementByName(name) != null; } /** The name of the XML elements of type ActivityBag */ public static final String ELEMENT_NAME = "activities"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); for (int i = 0; i < size(); i++) { e.addContent(elementAt(i).getData().detach()); } return e; } public void addActivity(Activity act) { if (act != null) addJDomElement(act.getJDomElement()); } public void addJDomElement(org.jdom.Element e) { if (e != null) { ActivityBagElement abe = getElementByName(e.getAttributeValue(Activity.NAME)); if (abe != null) abe.setData(e); else addElement(new ActivityBagElement(e)); } } public ActivityBagElement[] getElements() { return elements.toArray(new ActivityBagElement[size()]); } public void sortByName() { Collections.sort(elements, new Comparator() { public int compare(ActivityBagElement o1, ActivityBagElement o2) { return o1.getName().compareTo(o2.getName()); } }); } public void sortByClassAndName() { final StringBuilder sb1 = new StringBuilder(200); final StringBuilder sb2 = new StringBuilder(200); Collections.sort(elements, new Comparator() { public int compare(ActivityBagElement o1, ActivityBagElement o2) { org.jdom.Element e1 = o1.getData(); org.jdom.Element e2 = o2.getData(); sb1.setLength(0); sb1.append(e1.getAttributeValue(JDomUtility.CLASS)); sb1.append(e1.getAttributeValue(Activity.NAME)); sb2.setLength(0); sb2.append(e2.getAttributeValue(JDomUtility.CLASS)); sb2.append(e2.getAttributeValue(Activity.NAME)); return sb1.substring(0).compareTo(sb2.substring(0)); } }); } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child; List lst = e.getChildren(Activity.ELEMENT_NAME); Iterator it = lst.iterator(); while (it.hasNext()) { child = (org.jdom.Element) it.next(); // Needed in JDOM B-8: it.remove(); // Added class cast for JDOM 1.0: addJDomElement((org.jdom.Element) child.detach()); } } public void removeElementByName(String name) { ActivityBagElement abe = getElementByName(name); if (abe != null) removeElement(abe); } public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } public void listReferencesTo(String name, String type, Map map) { for (int i = 0; i < size(); i++) { ActivityBagElement abe = elementAt(i); Map dp = abe.getReferences(); if (dp != null && dp.containsKey(name) && (type == null || type.equals(dp.get(name)))) map.put(abe.getName(), Constants.ACTIVITY_OBJECT); } EventSounds evs = project.settings.eventSounds; if (evs != null) { HashMap dp = evs.getReferences(); if (dp != null && dp.containsKey(name) && (type == null || type.equals(dp.get(name)))) map.put("[" + project.getBridge().getMsg("edit_project") + "]", Constants.PROJECT_OBJECT); } if (project.settings.coverFileName != null) { MediaBagElement mbe = project.mediaBag.getElementByFileName(project.settings.coverFileName); if (mbe != null && name.equals(mbe.getName())) map.put(name, Constants.PROJECT_OBJECT); } if (project.settings.thumbnailFileName != null) { MediaBagElement mbe = project.mediaBag.getElementByFileName(project.settings.thumbnailFileName); if (mbe != null && name.equals(mbe.getName())) map.put(name, Constants.PROJECT_OBJECT); } if (project.settings.icon16 != null) { MediaBagElement mbe = project.mediaBag.getElementByFileName(project.settings.icon16); if (mbe != null && name.equals(mbe.getName())) map.put(name, Constants.PROJECT_OBJECT); } if (project.settings.icon72 != null) { MediaBagElement mbe = project.mediaBag.getElementByFileName(project.settings.icon72); if (mbe != null && name.equals(mbe.getName())) map.put(name, Constants.PROJECT_OBJECT); } if (project.settings.icon192 != null) { MediaBagElement mbe = project.mediaBag.getElementByFileName(project.settings.icon192); if (mbe != null && name.equals(mbe.getName())) map.put(name, Constants.PROJECT_OBJECT); } } @Override public void listReferences(String type, Map map) { for (int i = 0; i < size(); i++) { ActivityBagElement abe = elementAt(i); if (type == null || type.equals(Constants.ACTIVITY_OBJECT)) map.put(abe.getName(), Constants.ACTIVITY_OBJECT); Map dp = abe.getReferences(); if (dp != null) { if (type == null) map.putAll(dp); else { Iterator it = dp.keySet().iterator(); while (it.hasNext()) { String key = it.next(); if (type.equals(dp.get(key))) map.put(key, type); } } } } } } src/core/edu/xtec/jclic/bags/ActivityBagElement.java000066400000000000000000000054231335566474600227270ustar00rootroot00000000000000/* * File : ActivityBagElement.java * Created : 19-dec-2000 15:52 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Activity; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.fileSystem.FileSystem; import java.util.HashMap; import java.util.Map; /** * This class stores a XML {@link org.jdom.Element} that defines an * {@link edu.xtec.jclic.Activity}. It stores also a {@link java.util.HashMap} * with references of other objects to this activity, and implements some useful * methods to directly retrieve some properites of the related Activity, like * its name. ActivityBagElements are usually stored into * {@link edu.xtec.jclic.bags.ActivityBag} objects. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ActivityBagElement extends Object implements Editable, Cloneable { private org.jdom.Element element; private Map references; /** Creates new ActivityBagElement */ public ActivityBagElement(org.jdom.Element e) { setData(e); } public String getName() { return FileSystem.stdFn(element.getAttributeValue(Activity.NAME)); } public void setData(org.jdom.Element e) { element = e; references = null; } public org.jdom.Element getData() { return element; } @Override public String toString() { return getName(); } /** * Getter for property dependences. * * @return Value of property dependences. */ public Map getReferences() { if (references == null && element != null) { references = new HashMap(); Activity.listReferences(element, references); } return references; } public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } @Override public Object clone() throws CloneNotSupportedException { ActivityBagElement result = (ActivityBagElement) super.clone(); result.references = null; result.element = (org.jdom.Element) element.clone(); return result; } } src/core/edu/xtec/jclic/bags/ActivitySequence.java000066400000000000000000000205631335566474600224760ustar00rootroot00000000000000/* * File : ActivitySequence.java * Created : 19-dec-2000 16:35 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.project.JClicProject; import edu.xtec.jclic.report.Reporter; import edu.xtec.jclic.report.SequenceReg; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; /** * This class stores the definition of the sequence of activities related to a * specific {@link edu.xtec.jclic.project.JClicProject}. The sequence are formed * by an ordered list of objects of type * {@link edu.xtec.jclic.bags.ActivitySequenceElement}, internally stored in a * {@link java.util.ArrayList}. It stores also a transient pointer to a current * element, and provides several methods useful to deal with sequences. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ActivitySequence extends Object implements Editable, Domable { private int currentAct; private List elements; protected JClicProject project; /** Creates new ActivitySequence */ public ActivitySequence(JClicProject project) { this.project = project; elements = new ArrayList(20); currentAct = -1; } public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } public JClicProject getProject() { return project; } public void add(ActivitySequenceElement ase) { elements.add(ase); if (elements.size() == 1) { currentAct = 0; if (ase.getTag() == null) ase.setTag("start"); } } public void insertElementAt(ActivitySequenceElement ase, int index) { elements.add(index, ase); } public void remove(ActivitySequenceElement ase) { if (elements.contains(ase)) { if (elements.indexOf(ase) == currentAct) currentAct = -1; elements.remove(ase); } } public int getSize() { return elements.size(); } public static final String ELEMENT_NAME = "sequence"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); for (int i = 0; i < elements.size(); i++) { e.addContent(getElement(i, false).getJDomElement()); } return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); Iterator it = e.getChildren(ActivitySequenceElement.ELEMENT_NAME).iterator(); while (it.hasNext()) { add(ActivitySequenceElement.getActivitySequenceElement((org.jdom.Element) it.next())); } } public void clear() { currentAct = -1; elements.clear(); } public int getElementIndex(ActivitySequenceElement ase) { return ase == null ? -1 : elements.indexOf(ase); } public boolean checkAllElements() throws Exception { boolean result = true; for (int i = 0; i < elements.size(); i++) if (project.activityBag.getElement(getElement(i, false).getActivityName()) == null) result = false; return result; } public ActivitySequenceElement getElement(int n, boolean updateCurrentAct) { ActivitySequenceElement result; try { result = elements.get(n); } catch (Exception ex) { result = null; } if (result != null && updateCurrentAct) currentAct = n; return result; } public ActivitySequenceElement getElementByTag(String tag, boolean updateCurrentAct) { int i; int k = elements.size(); if (k < 1 || tag == null) return null; String normalizedTag = FileSystem.stdFn(tag); ActivitySequenceElement ase = null; for (i = 0; i < k; i++) { ase = getElement(i, false); if (ase != null && ase.getTag() != null && ase.getTag().equals(normalizedTag)) break; } if (i == k) ase = null; else if (updateCurrentAct) currentAct = i; return ase; } public ActivitySequenceElement[] getElements() { return elements.toArray(new ActivitySequenceElement[elements.size()]); } public boolean hasNextAct(boolean hasReturn) { boolean result = false; ActivitySequenceElement ase = getCurrentAct(); if (ase != null) { if (ase.fwdJump == null) result = true; else switch (ase.fwdJump.action) { case JumpInfo.STOP: break; case JumpInfo.RETURN: result = (hasReturn); break; default: result = true; } } return result; } public boolean hasPrevAct(boolean hasReturn) { boolean result = false; ActivitySequenceElement ase = getCurrentAct(); if (ase != null) { if (ase.backJump == null) result = true; else switch (ase.backJump.action) { case JumpInfo.STOP: break; case JumpInfo.RETURN: result = hasReturn; break; default: result = true; } } return result; } public int getNavButtonsFlag() { int flag = ActivitySequenceElement.NAV_NONE; ActivitySequenceElement ase = getCurrentAct(); if (ase != null) flag = ase.navButtons; return flag; } public JumpInfo getJump(boolean back, Reporter rep) { ActivitySequenceElement ase; JumpInfo result = null; if ((ase = getCurrentAct()) != null) { ActivitySequenceJump asj = (back ? ase.backJump : ase.fwdJump); if (asj == null) { int i = currentAct + (back ? -1 : 1); if (i >= elements.size() || i < 0) i = 0; result = new JumpInfo(JumpInfo.JUMP, i); } else { int rating = -1; int time = -1; if (rep != null) { SequenceReg.Info info = rep.getCurrentSequenceInfo(); if (info != null) { rating = (int) (info.tScore); time = (int) (info.tTime / 1000); } } result = asj.resolveJump(rating, time); } } return result; } public ActivitySequenceElement getCurrentAct() { return getElement(currentAct, false); } public int getCurrentActNum() { return currentAct; } public String getSequenceForElement(int e) { String s = null; if (e >= 0 && e < elements.size()) for (int i = e; i >= 0; i--) if ((s = getElement(i, false).getTag()) != null) break; return s; } public ActivitySequenceElement getElementByActivityName(String activityName) { ActivitySequenceElement result = null; if (activityName != null) { for (int i = 0; i < elements.size(); i++) { ActivitySequenceElement ase = getElement(i, false); if (ase.getActivityName().equalsIgnoreCase(activityName)) { result = ase; break; } } } return result; } public boolean checkCurrentActivity(String name) { ActivitySequenceElement ase = getCurrentAct(); if (ase == null || !ase.getActivityName().equalsIgnoreCase(name)) { for (int i = 0; i < elements.size(); i++) { if (getElement(i, false).getActivityName().equalsIgnoreCase(name)) { currentAct = i; return false; } } ase = new ActivitySequenceElement(name, 0, ActivitySequenceElement.NAV_BOTH); ase.fwdJump = new ActivitySequenceJump(JumpInfo.STOP); ase.backJump = new ActivitySequenceJump(JumpInfo.STOP); elements.add(ase); currentAct = elements.size() - 1; return false; } return true; } public void listReferences(String type, Map map) { for (int i = 0; i < elements.size(); i++) getElement(i, false).listReferences(type, map); } } src/core/edu/xtec/jclic/bags/ActivitySequenceElement.java000066400000000000000000000141341335566474600240050ustar00rootroot00000000000000/* * File : ActivitySequenceElement.java * Created : 19-dec-2000 16:18 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Constants; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.util.Iterator; import java.util.Map; /** * This class defines a specific point into a JClic sequence of activities: what * activity must run at this point, what to do or where to jump when the * activity finishes, the behavior of the "next" and "prev" buttons, etc. It can * also have a "tag", used to refer to this point of the sequence with a unique * name. ActivitySequenceElements are always stored into * {@link edu.xtec.jclic.bags.ActivitySequence} objects. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ActivitySequenceElement extends Object implements Editable, Domable, Cloneable { private String tag; private String description; private String activityName; public ActivitySequenceJump fwdJump; public ActivitySequenceJump backJump; public int navButtons; public int delay; /** Creates new ActivitySequenceElement */ public ActivitySequenceElement(String activityName) { this(activityName, false); } public ActivitySequenceElement(String activityName, boolean singleActivity) { this(activityName, 0, NAV_BOTH); if (singleActivity) { setTag(getActivityName()); fwdJump = new ActivitySequenceJump(JumpInfo.STOP); backJump = new ActivitySequenceJump(JumpInfo.RETURN); } } public ActivitySequenceElement(String activityName, int delay, int navButtons) { setActivityName(activityName); this.delay = delay; tag = null; description = null; fwdJump = null; backJump = null; this.navButtons = navButtons; } public static final String ELEMENT_NAME = "item", NAME = "name", ID = "id", DESCRIPTION = "description", DELAY = "delay", FORWARD = "forward", BACK = "back", NAV_BUTTONS = "navButtons"; public static final int NAV_NONE = 0, NAV_FWD = 1, NAV_BACK = 2, NAV_BOTH = 3; public static final String[] NAV_BUTTONS_TAG = { "none", "fwd", "back", "both" }; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (tag != null) { e.setAttribute(ID, tag); if (description != null) JDomUtility.addParagraphs(e, DESCRIPTION, description); } e.setAttribute(NAME, activityName); if (delay != 0) e.setAttribute(DELAY, Integer.toString(delay)); if (fwdJump != null) e.addContent(fwdJump.getJDomElement(FORWARD)); if (backJump != null) e.addContent(backJump.getJDomElement(BACK)); if (navButtons != NAV_BOTH) e.setAttribute(NAV_BUTTONS, NAV_BUTTONS_TAG[navButtons]); return e; } public static ActivitySequenceElement getActivitySequenceElement(org.jdom.Element e) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); ActivitySequenceElement ase = new ActivitySequenceElement("", 0, NAV_BOTH); ase.setProperties(e, null); return ase; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child; setActivityName(e.getAttributeValue(NAME)); delay = JDomUtility.getIntAttr(e, DELAY, 0); setTag(JDomUtility.getStringAttr(e, ID, tag, false)); description = JDomUtility.getParagraphs(e.getChild(DESCRIPTION)); Iterator it = e.getChildren(ActivitySequenceJump.ELEMENT_NAME).iterator(); while (it.hasNext()) { child = (org.jdom.Element) it.next(); String id = child.getAttributeValue(ActivitySequenceJump.ID); ActivitySequenceJump asj = ActivitySequenceJump.getActivitySequenceJump(child); if (FORWARD.equals(id)) fwdJump = asj; else if (BACK.equals(id)) backJump = asj; } navButtons = JDomUtility.getStrIndexAttr(e, NAV_BUTTONS, NAV_BUTTONS_TAG, NAV_BOTH); } public void setTag(String newTag) { tag = FileSystem.stdFn(newTag); } public void setDescription(String description) { this.description = description; } public String getTag() { return tag; } public String getDescription() { return description; } public void setActivityName(String sActivityName) { activityName = FileSystem.stdFn(sActivityName); } public String getActivityName() { return activityName; } public void listReferences(String type, Map map) { if (activityName != null && (type == null || type.equals(Constants.ACTIVITY_OBJECT))) map.put(activityName, Constants.ACTIVITY_OBJECT); if (tag != null && (type == null || type.equals(Constants.SEQUENCE_OBJECT))) map.put(tag, Constants.SEQUENCE_OBJECT); if (backJump != null) backJump.listReferences(type, map); if (fwdJump != null) fwdJump.listReferences(type, map); } public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } @Override public Object clone() throws CloneNotSupportedException { ActivitySequenceElement result = (ActivitySequenceElement) super.clone(); if (fwdJump != null) result.fwdJump = (ActivitySequenceJump) fwdJump.clone(); if (backJump != null) result.backJump = (ActivitySequenceJump) backJump.clone(); return result; } } src/core/edu/xtec/jclic/bags/ActivitySequenceJump.java000066400000000000000000000125161335566474600233310ustar00rootroot00000000000000/* * File : ActivitySequenceJump.java * Created : 19-dec-2000 16:27 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.util.JDomUtility; import java.util.Map; /** * This is a special case of {@link edu.xtec.jclic.bags.JumpInfo}, used only in * {@link edu.xtec.jclic.bags.ActivitySequenceElement} objects. Sequence * elements contain two ActivitySequenceJump objects: one to be processed when * the user clicks on the "next" button (or when the activity finishes, if in * automatic mode), and the other one related to the "prev" button. * ActivitySequenceJump objects define a default jump or action, but can have up * to two {@link edu.xtec.jclic.bags.ConditionalJumpInfo} objects, used to * define alternative jumps when the obtained score or the time used to solve * the activities are below or over specific values. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ActivitySequenceJump extends JumpInfo implements Cloneable { public ConditionalJumpInfo upperJump; public ConditionalJumpInfo lowerJump; /** Creates new ActivitySequenceJump */ public ActivitySequenceJump(int action) { this(action, null); } public ActivitySequenceJump(int action, String sequence) { super(action, sequence); upperJump = null; lowerJump = null; } public static final String ID = "id", NAME = "name", UPPER = "upper", LOWER = "lower"; public org.jdom.Element getJDomElement(String id) { org.jdom.Element e, child; e = super.getJDomElement(); e.setAttribute(ID, id); if (upperJump != null) { child = upperJump.getJDomElement(); child.setAttribute(ID, UPPER); e.addContent(child); } if (lowerJump != null) { child = lowerJump.getJDomElement(); child.setAttribute(ID, LOWER); e.addContent(child); } return e; } public static ActivitySequenceJump getActivitySequenceJump(org.jdom.Element e) throws Exception { ActivitySequenceJump asj = new ActivitySequenceJump(STOP); asj.setProperties(e, null); return asj; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child; // check for old version data (Jclic beta 0.4 or lower) String s = e.getAttributeValue(NAME); if (s == null) { super.setProperties(e, aux); if ((child = JDomUtility.getChildWithId(e, ELEMENT_NAME, UPPER)) != null) upperJump = ConditionalJumpInfo.getConditionalJumpInfo(child); if ((child = JDomUtility.getChildWithId(e, ELEMENT_NAME, LOWER)) != null) lowerJump = ConditionalJumpInfo.getConditionalJumpInfo(child); } else { // OLD VERSION DATA if (!s.equals(actions[STOP])) { if (s.equals(actions[EXIT])) action = EXIT; else { action = JUMP; sequence = s; } } if ((child = e.getChild(UPPER)) != null) { int v = JDomUtility.getIntAttr(child, ConditionalJumpInfo.THRESHOLD, 0); int t = JDomUtility.getIntAttr(child, ConditionalJumpInfo.TIME, -1); String sq = child.getText(); upperJump = new ConditionalJumpInfo(JUMP, sq, v, t); } if ((child = e.getChild(LOWER)) != null) { int v = JDomUtility.getIntAttr(child, ConditionalJumpInfo.THRESHOLD, 0); int t = JDomUtility.getIntAttr(child, ConditionalJumpInfo.TIME, -1); String sq = child.getText(); lowerJump = new ConditionalJumpInfo(JUMP, sq, v, t); } } } public void setConditionalJump(ConditionalJumpInfo jump, boolean upper) { if (upper) upperJump = jump; else lowerJump = jump; } public JumpInfo resolveJump(int rating, int time) { if (rating < 0 || time < 0) return this; if (upperJump != null && rating > upperJump.threshold && (upperJump.time <= 0 || time < upperJump.time)) return upperJump; if (lowerJump != null && (rating < lowerJump.threshold || (lowerJump.time > 0 && time > lowerJump.time))) return lowerJump; return this; } @Override public void listReferences(String type, Map map) { super.listReferences(type, map); if (upperJump != null) upperJump.listReferences(type, map); if (lowerJump != null) lowerJump.listReferences(type, map); } @Override public Object clone() throws CloneNotSupportedException { ActivitySequenceJump result = (ActivitySequenceJump) super.clone(); if (upperJump != null) result.upperJump = (ConditionalJumpInfo) upperJump.clone(); if (lowerJump != null) result.lowerJump = (ConditionalJumpInfo) lowerJump.clone(); return result; } } src/core/edu/xtec/jclic/bags/ConditionalJumpInfo.java000066400000000000000000000057251335566474600231270ustar00rootroot00000000000000/* * File : ConditionalJumpInfo.java * Created : 04-jan-2002 17:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.util.JDomUtility; /** * This special case of {@link edu.xtec.jclic.bags.JumpInfo} is used in * {@link edu.xtec.jclic.bags.ActivitySequenceJump} objects to decide the jump * to be taked (or the action to be performed) based on the results obtained by * the user when playing JClic activities. In addition to the standard JumpInfo * fields and methods, this class have two public members where to store a score * and time thresholds. The exact meaning of this members will depend on the * type of this ConditionalJumpInfo * ({@link edu.xtec.jclic.bags.ActivitySequenceJump#upperJump} or * {@link edu.xtec.jclic.bags.ActivitySequenceJump#lowerJump}). * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class ConditionalJumpInfo extends JumpInfo implements Cloneable { public int threshold; public int time; /** Creates new ConditionalJumpInfo */ public ConditionalJumpInfo(int action, String sequence, int threshold) { this(action, sequence, threshold, -1); } public ConditionalJumpInfo(int action, String sequence, int threshold, int time) { super(action, sequence); this.threshold = threshold; this.time = time; } private ConditionalJumpInfo() { super(STOP); threshold = -1; time = -1; } public static final String TIME = "time", THRESHOLD = "threshold"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); e.setAttribute(THRESHOLD, Integer.toString(threshold)); if (time >= 0) e.setAttribute(TIME, Integer.toString(time)); return e; } public static ConditionalJumpInfo getConditionalJumpInfo(org.jdom.Element e) throws Exception { ConditionalJumpInfo cji = new ConditionalJumpInfo(); cji.setProperties(e, null); return cji; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { super.setProperties(e, aux); threshold = JDomUtility.getIntAttr(e, THRESHOLD, threshold); time = JDomUtility.getIntAttr(e, TIME, time); } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } src/core/edu/xtec/jclic/bags/JumpInfo.java000066400000000000000000000067731335566474600207470ustar00rootroot00000000000000/* * File : JumpInfo.java * Created : 04-jan-2002 16:52 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.Constants; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.util.Map; /** * This class contains information about what the sequence manager of JClic must * do in specific circumstances: when an activity finishes, when the user clicks * on the "next" and "prev" buttons, or when a special active content is * activated. Different kinds of actions are possible: to go back to a previous * point in the sequence, to exit the program, to stop (do nothing), to jump to * a specific point in the sequence of activities or to jump to another JClic * project. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class JumpInfo implements Domable, Cloneable { public static final int JUMP = 0, STOP = 1, RETURN = 2, EXIT = 3; public int action; public String projectPath; public String sequence; public int actNum; /** Creates new JumpInfo */ public JumpInfo(int action) { this(action, null); } public JumpInfo(int action, String sequence) { this.action = action; this.sequence = sequence; projectPath = null; actNum = -1; } public JumpInfo(int action, int actNum) { this.action = action; this.actNum = actNum; projectPath = null; sequence = null; } public static final String[] actions = { "JUMP", "STOP", "RETURN", "EXIT" }; public static final String ELEMENT_NAME = "jump", ACTION = "action", TAG = "tag", PROJECT = "project"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (action != JUMP) e.setAttribute(ACTION, actions[action]); else { if (sequence != null) e.setAttribute(TAG, sequence); if (projectPath != null) e.setAttribute(PROJECT, projectPath); } return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); action = JDomUtility.getStrIndexAttr(e, ACTION, actions, JUMP); if (action == JUMP) { sequence = JDomUtility.getStringAttr(e, TAG, sequence, false); projectPath = JDomUtility.getStringAttr(e, PROJECT, projectPath, false); } } public void listReferences(String type, Map map) { if (action == JUMP) { if (projectPath != null) { if (type == null || type.equals(Constants.EXTERNAL_OBJECT)) map.put(projectPath, Constants.EXTERNAL_OBJECT); } else if (sequence != null) { if (type == null || type.equals(Constants.SEQUENCE_OBJECT)) map.put(sequence, Constants.SEQUENCE_OBJECT); } } } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } src/core/edu/xtec/jclic/bags/MediaBag.java000066400000000000000000000301541335566474600206370ustar00rootroot00000000000000/* * File : MediaBag.java * Created : 19-dec-2000 15:49 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.project.JClicProject; import edu.xtec.jclic.skins.Skin; import edu.xtec.util.Domable; import edu.xtec.util.ExtendedByteArrayInputStream; import edu.xtec.util.FontCheck; import edu.xtec.util.JDomUtility; import edu.xtec.util.StreamIO; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * This class stores and manages all the media components (images, sounds, * animations, video, MIDI files, etc.) needed to run the activities of a * {@link edu.xtec.jclic.project.JClicProject}. The main member of the class is * a {@link java.util.ArrayList} that stores * {@link edu.xtec.jclic.bags.MediaBagElement} objects. It defines also a * {@link edu.xtec.jclic.bags.MediaBag.Listener} interface to allow other * objects to be informed about changes in the media collection. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class MediaBag extends Object implements Editable, Domable, StreamIO.InputStreamProvider { /** The project this MediaBag belongs to */ protected JClicProject project; /** * List containing all the {@link edu.xtec.jclic.bags.MediaBagElement} objects * of this * MediaBag. */ protected List elements; protected Set listeners; /** Creates new MediaBag */ public MediaBag(JClicProject project) { this.project = project; elements = new ArrayList(30); listeners = new HashSet(1); } public JClicProject getProject() { return project; } public static String ELEMENT_NAME = "mediaBag"; /** * Provides a copy of the elements List * * @return a List (currently an ArrayList) of the elements */ public List getElements() { return new ArrayList(elements); } public void clear() { elements.clear(); } public List getElementsByName() { List v = getElements(); Collections.sort(v, new Comparator() { @Override public int compare(MediaBagElement o1, MediaBagElement o2) { return o1.getName().compareToIgnoreCase(o2.getName()); } }); return v; } public List getElementsByType() { final StringBuilder sb1 = new StringBuilder(200); final StringBuilder sb2 = new StringBuilder(200); List v = getElements(); Collections.sort(v, new Comparator() { @Override public int compare(MediaBagElement o1, MediaBagElement o2) { sb1.setLength(0); String fName = o1.getFileName(); String name = o1.getName(); int dot = fName.lastIndexOf('.'); sb1.append(dot > 0 ? fName.substring(dot) : ".zzz"); sb1.append(name); sb2.setLength(0); fName = o2.getFileName(); name = o2.getName(); dot = fName.lastIndexOf('.'); sb2.append(dot > 0 ? fName.substring(dot) : ".zzz"); sb2.append(name); return sb1.substring(0).compareToIgnoreCase(sb2.substring(0)); } }); return v; } @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); Iterator it = getElementsByType().iterator(); while (it.hasNext()) { e.addContent(it.next().getJDomElement()); } return e; } public void clearData() { Iterator it = elements.iterator(); while (it.hasNext()) { it.next().clearData(); } } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); Iterator it = e.getChildren(MediaBagElement.ELEMENT_NAME).iterator(); while (it.hasNext()) { elements.add(MediaBagElement.getMediaBagElement((org.jdom.Element) it.next())); } } public boolean addElement(MediaBagElement mbe) { boolean result = mbe != null && (getElement(mbe.getName()) == null); if (result) { elements.add(mbe); } return result; } public MediaBagElement getElement(String name) { MediaBagElement result = null; if (name != null) { for (int i = 0; i < elements.size(); i++) { MediaBagElement mbe = elements.get(i); if (name.equals(mbe.getName())) { result = mbe; break; } } } return result; } public MediaBagElement getElementByFileName(String fileName) { MediaBagElement result = null; if (fileName != null) { for (int i = 0; i < elements.size(); i++) { MediaBagElement mbe = elements.get(i); if (fileName.equals(mbe.getFileName())) { result = mbe; break; } } } return result; } public MediaBagElement registerElement(String name, String fileName) { MediaBagElement result = getElement(name); if (result == null) { result = new MediaBagElement(FileSystem.stdFn(fileName == null ? name : fileName), null, name); elements.add(result); } return result; } public boolean removeElement(MediaBagElement mbe) { return elements.remove(mbe); } public Object getMediaDataSource(String name) throws Exception { Object result = null; String normalizedName = project.getFileSystem().getCanonicalNameOf(name); MediaBagElement mbe = registerElement(normalizedName, null); if (mbe != null) { if (mbe.getData() != null) { if (mbe.getData() instanceof ExtendedByteArrayInputStream) { result = ((ExtendedByteArrayInputStream) mbe.getData()).duplicate(); } else { result = mbe.getData(); } } else { result = project.getFileSystem().getMediaDataSource(mbe.getFileName()); mbe.setData(result); } } return result; } @Override public InputStream getInputStream(String name) throws Exception { InputStream result = null; String normalizedName = project.getFileSystem().getCanonicalNameOf(name); MediaBagElement mbe = registerElement(normalizedName, null); if (mbe != null) { if (mbe.getData() instanceof ExtendedByteArrayInputStream) { ExtendedByteArrayInputStream ebais = (ExtendedByteArrayInputStream) mbe.getData(); mbe.setData(ebais); result = (ebais).duplicate(); } else { result = project.getFileSystem().getInputStream(mbe.getFileName()); if (result instanceof ExtendedByteArrayInputStream) { mbe.setData(result); } } } return result; } public MediaBagElement getImageElement(String name) throws Exception { MediaBagElement result; String normalizedName = project.getFileSystem().getCanonicalNameOf(name); result = registerElement(normalizedName, null); if (result != null) { result = result.prepareImage(project.getFileSystem()) ? result : null; } return result; } public void buildFonts() { // count currently empty font elements Map fonts = new HashMap(); Iterator it = elements.iterator(); while (it.hasNext()) { MediaBagElement mbe = it.next(); String name = mbe.getName(); if (name != null && mbe.getData() == null && mbe.getFileName().endsWith(".ttf")) { fonts.put(name, mbe); } } if (!fonts.isEmpty()) { String[] fontList = FontCheck.getFontList(false); int nFontsList = fontList.length; Iterator itf = fonts.keySet().iterator(); while (itf.hasNext()) { String name = itf.next(); int i = 0; for (; i < nFontsList; i++) { if (fontList[i].equalsIgnoreCase(name)) { break; } } if (i == nFontsList) { MediaBagElement mbe = fonts.get(name); try { mbe.setData(FontCheck.buildNewFont(mbe.getFileName(), this, name)); } catch (Exception ex) { System.err.println("Unable to create font:\n" + ex); } } } } } public Skin getSkinElement(String name, PlayStation ps) { if (name.startsWith(Skin.INTERNAL_SKIN_PREFIX)) { try { return Skin.getSkin(name, project.getFileSystem(), ps); } catch (Exception e) { System.err.println("Error loading skin \"" + name + "\":\n" + e); } } else { String normalizedName = project.getFileSystem().getCanonicalNameOf(name); MediaBagElement mbe = registerElement(normalizedName, null); if (mbe != null) { if (mbe.getData() == null || !(mbe.getData() instanceof Skin)) { try { Skin sk = Skin.getSkin(mbe.getFileName(), project.getFileSystem(), ps); mbe.setData(sk); } catch (Exception e) { System.err.println("Error loading skin \"" + mbe.getFileName() + "\":\n" + e); } } return (Skin) mbe.getData(); } } return null; } public long getTotalFileSize() { long result = 0; Iterator it = elements.iterator(); while (it.hasNext()) { MediaBagElement mbe = it.next(); result += mbe.getFileSize(this.project.getFileSystem()); } return result; } public boolean isWaitingForImages() { Iterator it = elements.iterator(); while (it.hasNext()) { MediaBagElement mbe = it.next(); if (mbe != null && mbe.isWaitingForImage()) { return true; } } return false; } public void waitForAllImages() { while (isWaitingForImages()) { try { Thread.sleep(100); } catch (Exception ex) { System.err.println("error waiting for images!\n" + ex); return; } } } public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } public interface Listener { public void listReferences(String type, Map map); public void listReferencesTo(String name, String type, Map map); } public void addListener(Listener lst) { if (!listeners.contains(lst)) { listeners.add(lst); } } public void removeListener(Listener lst) { listeners.remove(lst); } public void listReferencesTo(String name, String type, Map map) { Iterator it = listeners.iterator(); while (it.hasNext()) { it.next().listReferencesTo(name, type, map); } } public void setNormalizedFileNames() { HashSet currentNames = new HashSet(); Iterator it = elements.iterator(); while (it.hasNext()) { MediaBagElement mbe = it.next(); String fn = mbe.getFileName(); String fnv = FileSystem.getValidFileName(fn); // Avoid filenames starting with a dot if (fnv.charAt(0) == '.') { fnv = "_" + fnv; } if (!fnv.equals(fn)) { String fn0 = fnv; int n = 0; while (currentNames.contains(fnv)) { fnv = Integer.toString(n++) + fn0; } mbe.normalizedFileName = fnv; } currentNames.add(fnv); } } } src/core/edu/xtec/jclic/bags/MediaBagElement.java000066400000000000000000000234771335566474600221630ustar00rootroot00000000000000/* * File : MediaBagElement.java * Created : 19-dec-2000 15:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.bags; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.io.IOException; import javax.swing.ImageIcon; import net.sf.image4j.codec.bmp.BMPDecoder; import net.sf.image4j.codec.ico.ICODecoder; /** * MediaBagElements are the members of * {@link edu.xtec.jclic.bags.MediaBag} objects. Media elements have a name, a * reference to a file (the fileName) and, when initialized, a * data field containing the raw content of the media. They have * also a flag indicating if the data must be saved into the * {@link edu.xtec.jclic.project.JClicProject} file or must be mantained as a * single reference to a external file. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class MediaBagElement extends Object implements Editable, Domable, Comparable { private String name; private String fileName; private int usageCount; private Object data; public boolean projectFlag; public boolean saveFlag; public boolean animated; private boolean hasThumb; private boolean isGif; // 10-Aug-2015 // Added to allow renaming of media files private String metadata; public String normalizedFileName; /** Creates new MediaBagElement */ public MediaBagElement(String fileName) { this(fileName, null); } public MediaBagElement(String fileName, Object data) { this(fileName, data, fileName); } public MediaBagElement(String fileName, Object data, String name) { setName(name); setFileName(fileName); setData(data); usageCount = 0; animated = false; saveFlag = true; } public static final String ELEMENT_NAME = "media"; public static final String FILE = "file", NAME = "name", SAVE = "save", USAGE = "usage", ANIMATED = "animated"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(NAME, name); e.setAttribute(FILE, fileName); if (!saveFlag) { e.setAttribute(SAVE, JDomUtility.BOOL_STR[JDomUtility.FALSE]); } if (usageCount > 0) { e.setAttribute(USAGE, Integer.toString(usageCount)); } if (isGif) { e.setAttribute(ANIMATED, JDomUtility.BOOL_STR[animated ? JDomUtility.TRUE : JDomUtility.FALSE]); } return e; } protected static MediaBagElement getMediaBagElement(org.jdom.Element e) throws Exception { MediaBagElement mb = new MediaBagElement("NONAME", null); mb.setProperties(e, null); return mb; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); setName(JDomUtility.getStringAttr(e, NAME, name, false)); setFileName(JDomUtility.getStringAttr(e, FILE, fileName, false)); saveFlag = JDomUtility.getBoolAttr(e, SAVE, true); usageCount = JDomUtility.getIntAttr(e, USAGE, usageCount); animated = JDomUtility.getBoolAttr(e, ANIMATED, false); } @Override public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } public boolean isEmpty() { return data == null; } public void setFileName(String sName) { fileName = FileSystem.stdFn(sName); data = null; animated = false; isGif = fileName.toLowerCase().endsWith(".gif"); } public String getFileName() { return fileName; } public void setMetaData(String meta) { metadata = meta; } public String getMetaData() { return metadata; } public boolean isImage() { return Utils.getFileType(fileName) == Utils.TYPE_IMAGE; } public void setData(Object sData) { data = sData; // CHANGED: 28/Apr/2016 - Don't clear animated flag! // animated=false; if (data != null && data instanceof Image) { Toolkit.getDefaultToolkit().prepareImage((Image) data, -1, -1, null); } } public void clearData() { if (data != null && !(data instanceof java.awt.Font)) { if (data instanceof Image) { ((Image) data).flush(); } setData(null); } } public Object getData() { return data; } public boolean isInternal() { return (data != null); } public void incUsageCount() { usageCount++; } public void decUsageCount() { usageCount--; } public boolean isUsed() { return usageCount <= 0; } @Override protected void finalize() throws Throwable { Image img = getImage(); if (img != null) { img.flush(); } data = null; super.finalize(); } public boolean prepareImage(FileSystem fs) throws Exception { boolean result = false; if (isImage()) { if (data == null || !(data instanceof Image)) { String fn = fileName.toLowerCase(); if (fn.endsWith(".bmp")) { BufferedImage img = BMPDecoder.read(fs.getInputStream(fileName)); setData(Toolkit.getDefaultToolkit().createImage(img.getSource())); } else if (fn.endsWith(".ico")) { java.util.List list = ICODecoder.read(fs.getInputStream(fileName)); int maxs = 0; BufferedImage img = null; int listSize = list.size(); for (int i = 0; i < listSize; i++) { BufferedImage imgtmp = (BufferedImage) list.get(i); int s = imgtmp.getWidth() * imgtmp.getHeight(); if (s >= maxs) { img = imgtmp; maxs = s; } } if (img != null) { setData(Toolkit.getDefaultToolkit().createImage(img.getSource())); } } else { setData(fs.getImageFile(fileName)); } } result = true; } return result; } private static int imgReadyFlag = (ImageObserver.WIDTH | ImageObserver.HEIGHT); public Image getImage() throws Exception { int imgStatus = 0; if (data == null || !(data instanceof Image)) { return null; } if (!animated) { while (true) { imgStatus = Toolkit.getDefaultToolkit().checkImage((Image) data, -1, -1, null); if ((imgStatus & (ImageObserver.ERROR | ImageObserver.ABORT)) != 0) { System.err.println("Error loading " + getName() + " - Toolkit.checkImage returned status: " + imgStatus); data = null; break; } else if ((imgStatus & imgReadyFlag) == imgReadyFlag) { break; } Thread.sleep(50); } } if (data != null && (imgStatus & ImageObserver.FRAMEBITS) != 0) { animated = true; } return (Image) data; } public Image prepareAndGetImage(FileSystem fs) throws Exception { Image img = getImage(); if (img == null && data == null) { if (prepareImage(fs)) { img = getImage(); } } return img; } public long getFileSize(FileSystem fs) { long result = 0; if (fileName != null) { try { result = fs.getFileLength(fileName); } catch (IOException ex) { System.err.println("Error recovering the file size of \"" + fileName + "\": " + ex.getMessage()); } } return result; } public ImageIcon getThumbNail(int maxWidth, int maxHeight, FileSystem fs) { ImageIcon result = null; try { Image img = prepareAndGetImage(fs); if (img == null) { img = Utils.getFileIcon(fileName).getImage(); } if (img != null && maxWidth > 0 && maxHeight > 0) { int w = img.getWidth(null); int h = img.getHeight(null); if (w > 0 && h > 0 && (w > maxWidth || h > maxHeight)) { double f = Math.min((double) maxWidth / w, (double) maxHeight / h); img = img.getScaledInstance((int) (f * w), (int) (f * h), Image.SCALE_SMOOTH); } result = new ImageIcon(img); hasThumb = true; } } catch (Exception ex) { System.err.println("Error reading image:\n" + ex); } return result; } public boolean isWaitingForImage() { if (hasThumb == true || animated == true || data == null || !(data instanceof Image)) { return false; } int state = Toolkit.getDefaultToolkit().checkImage((Image) data, -1, -1, null); if ((state & ImageObserver.FRAMEBITS) != 0) { animated = true; } boolean result = (state & (ImageObserver.ALLBITS | ImageObserver.FRAMEBITS)) == 0; return result; } /** * Getter for property name. * * @return Value of property name. */ public java.lang.String getName() { return name; } /** * Setter for property name. * * @param name New value of property name. */ public void setName(String name) { this.name = FileSystem.stdFn(name); } @Override public String toString() { return name; } @Override public int compareTo(Object obj) { int result = -1; if (getName() != null && obj instanceof MediaBagElement) { result = getName().compareTo(((MediaBagElement) obj).getName()); } return result; } } src/core/edu/xtec/jclic/boxes/000077500000000000000000000000001335566474600165445ustar00rootroot00000000000000src/core/edu/xtec/jclic/boxes/AbstractBox.java000066400000000000000000000305651335566474600216340ustar00rootroot00000000000000/* * File : AbstractBox.java * Created : 12-dec-2000 10:55 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Shape; import java.awt.Stroke; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.Dimension2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.ImageObserver; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.text.JTextComponent; /** * This abstract class is the base for most graphic components of JClic. It * describes an {@link java.awt.geom.Area} (a rectangle by default) with some * special properties that determine how it must be drawn on screen. Some types * of boxes can act as containers for other boxes, establishing a hierarchy of * dependences. Box objects are always placed into a * {@link javax.swing.JComponent}. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public abstract class AbstractBox extends Rectangle2D.Double implements Cloneable { private AbstractBox parent; private JComponent container; private BoxBase boxBase; protected boolean border; protected Shape shape; protected boolean specialShape; private boolean visible; private boolean temporaryHidden; private boolean inactive; private boolean inverted; private boolean alternative; private boolean marked; private boolean focused; private Component hostedComponent; public AbstractBox(AbstractBox parent, JComponent container, BoxBase boxBase) { this.parent = parent; this.container = container; shape = this; specialShape = false; this.boxBase = boxBase; visible = true; } @Override public Object clone() { AbstractBox bx = (AbstractBox) super.clone(); if (specialShape) bx.shape = new Area(shape); else bx.shape = bx; if (hostedComponent != null) { if (hostedComponent instanceof JLabel) { JLabel lb = (JLabel) hostedComponent; bx.hostedComponent = new JLabel(lb.getText(), lb.getIcon(), lb.getHorizontalAlignment()); JComponent jc = bx.getContainerResolve(); if (jc != null) jc.add(hostedComponent); } else bx.hostedComponent = null; } return bx; } public void setParent(AbstractBox parent) { this.parent = parent; } public AbstractBox getParent() { return parent; } public void end() { setHostedComponent(null); } @Override public void finalize() throws Throwable { end(); super.finalize(); } public void setContainer(JComponent newContainer) { container = newContainer; if (hostedComponent != null) { if (hostedComponent.getParent() != null) { hostedComponent.getParent().remove(hostedComponent); } if (container != null) container.add(hostedComponent); } } public JComponent getContainerX() { return container; } public JComponent getContainerResolve() { AbstractBox ab = this; while (ab.container == null && ab.parent != null) ab = ab.parent; return ab.container; } public void setBoxBase(BoxBase boxBase) { this.boxBase = boxBase; repaint(); setHostedComponentColors(); setHostedComponentBorder(); } public BoxBase getBoxBaseResolve() { AbstractBox ab = this; while (ab.boxBase == null && ab.parent != null) ab = ab.parent; return ab.boxBase == null ? BoxBase.DEFAULT_BOX_BASE : ab.boxBase; } public BoxBase getBoxBaseX() { return boxBase; } public void setHostedComponent(Component jc) { if (hostedComponent != null) { if (hostedComponent.getParent() != null) { hostedComponent.getParent().remove(hostedComponent); } } hostedComponent = jc; if (hostedComponent != null) { hostedComponent.setVisible(false); JComponent cmp = getContainerResolve(); if (cmp != null) cmp.add(jc); setHostedComponentColors(); setHostedComponentBorder(); setHostedComponentBounds(); hostedComponent.setVisible(visible); } } public Component getHostedComponent() { return hostedComponent; } public void setShape(Shape setSh) { shape = setSh; specialShape = true; repaint(); super.setRect(shape.getBounds2D()); setHostedComponentBounds(); repaint(); } public Shape getShape() { return shape; } @Override public boolean contains(Point2D p) { return shape == this ? super.contains(p) : shape.contains(p); } public boolean update(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { if (hostedComponent != null) return false; if (isEmpty() || !isVisible() || isTemporaryHidden()) return false; if (dirtyRegion != null && !shape.intersects(dirtyRegion)) return false; Shape saveClip = new Area(g2.getClip()); Area clip = new Area(saveClip); clip.intersect(new Area(shape)); g2.setClip(clip); BoxBase bb = getBoxBaseResolve(); if (!bb.transparent) { if (bb.bgGradient == null || bb.bgGradient.hasTransparency()) { g2.setColor(inactive ? bb.inactiveColor : inverted ? bb.textColor : bb.backColor); g2.fill(shape); g2.setColor(Color.black); } if (bb.bgGradient != null) bb.bgGradient.paint(g2, shape); } updateContent(g2, dirtyRegion, io); g2.setClip(saveClip); drawBorder(g2); return true; } public abstract boolean updateContent(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io); protected void drawBorder(Graphics2D g2) { if (border || marked || focused) { BoxBase bb = getBoxBaseResolve(); g2.setColor(bb.borderColor); g2.setStroke((marked || focused) ? bb.getMarker() : bb.getBorder()); if (marked || focused) g2.setXORMode(Color.white); g2.draw(shape); if (marked || focused) g2.setPaintMode(); g2.setColor(Color.black); g2.setStroke(BoxBase.DEFAULT_STROKE); } } public Rectangle getBorderBounds() { if (!border && !marked && !focused) return getBounds(); BoxBase bb = getBoxBaseResolve(); Stroke strk = (marked || focused) ? bb.getMarker() : bb.getBorder(); return strk.createStrokedShape(shape).getBounds(); } public boolean hasBorder() { return border; } public void setBorder(boolean newVal) { if (!newVal) repaint(); border = newVal; setHostedComponentBorder(); if (newVal) repaint(); } public boolean isVisible() { return visible; } public void setVisible(boolean newVal) { visible = newVal; if (hostedComponent != null) hostedComponent.setVisible(newVal); repaint(); } public boolean isTemporaryHidden() { return temporaryHidden; } public void setTemporaryHidden(boolean newVal) { temporaryHidden = newVal; } public boolean isInactive() { return inactive; } public void setInactive(boolean newVal) { inactive = newVal; checkHostedComponent(); setHostedComponentColors(); repaint(); } public boolean isInverted() { return inverted; } public void setInverted(boolean newVal) { inverted = newVal; checkHostedComponent(); setHostedComponentColors(); repaint(); } public boolean isMarked() { return marked; } public void setMarked(boolean newVal) { if (!newVal) repaint(); marked = newVal; checkHostedComponent(); setHostedComponentColors(); if (newVal) repaint(); } public boolean isFocused() { return focused; } public void setFocused(boolean newVal) { if (!newVal) repaint(); focused = newVal; checkHostedComponent(); setHostedComponentColors(); if (newVal) repaint(); } public boolean isAlternative() { return alternative; } public void setAlternative(boolean newVal) { alternative = newVal; checkHostedComponent(); setHostedComponentColors(); repaint(); } private void setHostedComponentColors() { if (hostedComponent != null) { BoxBase bb = getBoxBaseResolve(); hostedComponent.setFont(bb.getFont()); hostedComponent.setBackground(inactive ? bb.inactiveColor : inverted ? bb.textColor : bb.backColor); hostedComponent.setForeground(inverted ? bb.backColor : alternative ? bb.alternativeColor : bb.textColor); if (hostedComponent instanceof JComponent) { ((JComponent) hostedComponent).setOpaque(true); if (hostedComponent instanceof JTextComponent) ((JTextComponent) hostedComponent).setCaretColor(bb.textColor); } } } private void setHostedComponentBorder() { if (hostedComponent != null && hostedComponent instanceof JComponent) { ((JComponent) hostedComponent) .setBorder(border ? BorderFactory.createLineBorder(getBoxBaseResolve().borderColor, 1) : BorderFactory.createEmptyBorder()); } } private void setHostedComponentBounds() { if (hostedComponent != null) { Rectangle r = getBounds(); hostedComponent.setBounds(r); if (hostedComponent instanceof JComponent) ((JComponent) hostedComponent).setPreferredSize(r.getSize()); } } public void repaint() { JComponent jc = getContainerResolve(); if (jc != null) jc.repaint(getBorderBounds()); if (hostedComponent != null) hostedComponent.repaint(); } public void setBounds(Rectangle2D r) { if (r.equals((Rectangle2D) this)) return; if (specialShape) { AffineTransform tx = null; if (getWidth() != r.getWidth() || getHeight() != r.getHeight()) { tx = AffineTransform.getTranslateInstance(-getX(), -getY()); shape = tx.createTransformedShape(shape); tx = AffineTransform.getScaleInstance(r.getWidth() / getWidth(), r.getHeight() / getHeight()); shape = tx.createTransformedShape(shape); tx = AffineTransform.getTranslateInstance(getX(), getY()); shape = tx.createTransformedShape(shape); } if (getX() != r.getX() || getY() != r.getY()) { tx = AffineTransform.getTranslateInstance(r.getX() - getX(), r.getY() - getY()); shape = tx.createTransformedShape(shape); } if (tx != null) { setShape(shape); } } else { repaint(); setRect(r); repaint(); } setHostedComponentBounds(); } public void setBounds(double newX, double newY, double newWidth, double newHeight) { setBounds(new Double(newX, newY, newWidth, newHeight)); setHostedComponentBounds(); } public void setLocation(Point2D p) { setBounds(p.getX(), p.getY(), width, height); } public void setLocation(double newX, double newY) { setBounds(newX, newY, width, height); } public void translate(double dx, double dy) { setBounds(x + dx, y + dy, width, height); } public void setSize(Dimension2D d) { setBounds(x, y, d.getWidth(), d.getHeight()); } public void setSize(double newWidth, double newHeight) { setBounds(x, y, newWidth, newHeight); } public Point2D getLocation() { return new java.awt.geom.Point2D.Double(x, y); } protected void checkHostedComponent() { // to be overrided } public Point2D getAbsoluteLocation() { Point2D result = null; JComponent jc = getContainerResolve(); if (jc != null) { result = new java.awt.Point(jc.getLocationOnScreen()); result.setLocation(result.getX() + getX(), result.getY() + getY()); } return result; } public Point2D getAbsoulteMiddleLocation() { Point2D result = getAbsoluteLocation(); if (result != null) { result.setLocation(result.getX() + getWidth() / 2, result.getY() + getHeight() / 2); } return result; } } src/core/edu/xtec/jclic/boxes/ActiveBagContent.java000066400000000000000000000346061335566474600226000ustar00rootroot00000000000000/* * File : ActiveBagContent.java * Created : 27-apr-2001 17:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity; import edu.xtec.jclic.Constants; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.bags.MediaBagElement; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.shapers.Rectangular; import edu.xtec.jclic.shapers.Shaper; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.awt.Graphics; import java.awt.Image; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; /** * This class stores a collection of * {@link edu.xtec.jclic.boxes.ActiveBoxContent} objects, currently in a * {@link java.util.ArrayList}, and provides methods to manage it. The two main * members of ActiveBagContent are the * {@link edu.xtec.jclic.shapers.Shaper}, responsible of determining the * position and shape of each {@link edu.xtec.jclic.boxes.ActiveBox} based on * it, and the {@link edu.xtec.jclic.boxes.BoxBase}, that provides a common * visual style. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActiveBagContent extends Object implements Domable { public Image img; public String imgName; public int ncw, nch; public double w, h; public boolean border; public BoxBase bb; protected Shaper shaper; protected ActiveBoxContent backgroundContent; protected ArrayList activeBoxContentArray = new ArrayList(12); public int defaultIdValue = -1; /** Creates new ActiveBagContent */ private ActiveBagContent() { } public ActiveBagContent(int ncw, int nch) { this.ncw = Math.max(1, ncw); this.nch = Math.max(1, nch); w = Activity.DEFAULT_GRID_ELEMENT_SIZE; h = Activity.DEFAULT_GRID_ELEMENT_SIZE; } public static ActiveBagContent initNew(int ncw, int nch, int firstChar) { return initNew(ncw, nch, firstChar, false, false, 50, 30); }; public static ActiveBagContent initNew(int ncw, int nch, int firstChar, boolean withIds, boolean withItems, int w, int h) { ActiveBagContent result = new ActiveBagContent(ncw, nch); result.w = w; result.h = h; result.setBoxBase(new BoxBase()); result.border = true; char[] ch = null; if (firstChar > 0) { ch = new char[] { (char) firstChar }; } for (int i = 0; i < nch; i++) { for (int j = 0; j < ncw; j++) { ActiveBoxContent ab = new ActiveBoxContent(); if (ch != null) { ab.setTextContent(""); ch[0]++; } else { ab.setTextContent(""); } if (withIds) { if (withItems) { ab.id = j; ab.item = i; } else { ab.id = i * ncw + j; } } result.addActiveBoxContent(ab); } } return result; } public void checkCells() { int shaperCells = getShaper().getNumCells(); int existingCells = activeBoxContentArray.size(); if (existingCells > shaperCells) { while (activeBoxContentArray.size() > shaperCells) { activeBoxContentArray.remove(activeBoxContentArray.size() - 1); } } else if (shaperCells > existingCells) { for (int i = existingCells; i < shaperCells; i++) { ActiveBoxContent ab = getActiveBoxContent(i); ab.id = defaultIdValue; } } } public static final String ELEMENT_NAME = "cells"; public static final String ROWS = "rows", COLUMNS = "columns", COLS = "cols"; public static final String CELL_WIDTH = "cellWidth", CELL_HEIGHT = "cellHeight", BORDER = "border", IMAGE = "image", IDS = "ids"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (ncw > 0 || nch > 0) { e.setAttribute(ROWS, Integer.toString(nch)); e.setAttribute(COLS, Integer.toString(ncw)); } if (imgName == null && (w != 0 || h != 0)) { e.setAttribute(CELL_WIDTH, Double.toString(w)); e.setAttribute(CELL_HEIGHT, Double.toString(h)); } e.setAttribute(BORDER, JDomUtility.boolString(border)); if (imgName != null) { e.setAttribute(IMAGE, imgName); } if (bb != null) { e.addContent(bb.getJDomElement()); } if (shaper != null) { e.addContent(shaper.getJDomElement()); } switch (testCellContents()) { case ActiveBoxContent.EMPTY_CELL: // write nothing break; case ActiveBoxContent.ONLY_ID: StringBuilder sb = new StringBuilder(); for (int i = 0; i < activeBoxContentArray.size(); i++) sb.append(getActiveBoxContent(i).id).append(" "); e.addContent(new org.jdom.Element(IDS).addContent(sb.substring(0).trim())); break; default: for (int i = 0; i < activeBoxContentArray.size(); i++) e.addContent(getActiveBoxContent(i).getJDomElement()); } return e; } public int testCellContents() { int result = ActiveBoxContent.EMPTY_CELL; for (int i = 0; i < activeBoxContentArray.size(); i++) { int r = getActiveBoxContent(i).testCellContents(); if (r > result) { result = r; if (r > ActiveBoxContent.ONLY_ID) break; } } return result; } public static ActiveBagContent getActiveBagContent(org.jdom.Element e, MediaBag mediaBag) throws Exception { ActiveBagContent abc = new ActiveBagContent(); abc.setProperties(e, mediaBag); return abc; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); MediaBag mediaBag = (MediaBag) aux; org.jdom.Element child; // Bug in JClic beta 1: "columns" is number of rows, and "rows" is number of // columns. // Corrected in beta 2: If "cols" is specified, "rows" are rows and "cols" are // columns. int k = JDomUtility.getIntAttr(e, COLS, -1); if (k >= 0) { ncw = k; nch = JDomUtility.getIntAttr(e, ROWS, nch); } else { ncw = JDomUtility.getIntAttr(e, ROWS, ncw); nch = JDomUtility.getIntAttr(e, COLUMNS, nch); } activeBoxContentArray.ensureCapacity(Math.max(12, ncw * nch)); w = JDomUtility.getDoubleAttr(e, CELL_WIDTH, w); h = JDomUtility.getDoubleAttr(e, CELL_HEIGHT, h); border = JDomUtility.getBoolAttr(e, BORDER, border); imgName = FileSystem.stdFn(e.getAttributeValue(IMAGE)); if ((child = e.getChild(BoxBase.ELEMENT_NAME)) != null) setBoxBase(BoxBase.getBoxBase(child)); if ((child = e.getChild(Shaper.ELEMENT_NAME)) != null) setShaper(Shaper.getShaper(child)); Iterator itr = e.getChildren(ActiveBoxContent.ELEMENT_NAME).iterator(); if (itr.hasNext()) while (itr.hasNext()) { child = ((org.jdom.Element) itr.next()); addActiveBoxContent(ActiveBoxContent.getActiveBoxContent(child, mediaBag)); } else { child = e.getChild(IDS); int[] v; if (child != null) if ((v = JDomUtility.stringToIntArray(child.getText())) != null) for (int i = 0; i < v.length; i++) getActiveBoxContent(i).id = v[i]; } if (imgName != null) { if (mediaBag != null && mediaBag.getProject().getBridge() != null) setImgContent(mediaBag.getImageElement(imgName), true); } // Todo: check for empty-content int n = activeBoxContentArray.size(); if (n > 0) { boolean empty = true; for (int i = 0; i < n; i++) { ActiveBoxContent bxc = getActiveBoxContent(i); if (bxc.id != -1 || bxc.item != -1 || !bxc.isEmpty()) { empty = false; break; } } if (empty) { for (int i = 0; i < n; i++) getActiveBoxContent(i).id = i; } } } public static void listReferences(org.jdom.Element e, Map map) { String s = e.getAttributeValue(IMAGE); if (s != null) map.put(s, Constants.MEDIA_OBJECT); Iterator itr = e.getChildren(ActiveBoxContent.ELEMENT_NAME).iterator(); while (itr.hasNext()) ActiveBoxContent.listReferences((org.jdom.Element) itr.next(), map); } public Shaper getShaper() { if (shaper == null) setShaper(new Rectangular(ncw, nch)); return shaper; } public void setShaper(Shaper sh) { shaper = sh; } public void addActiveBoxContent(ActiveBoxContent ab) { activeBoxContentArray.add(ab); if (ncw == 0 || nch == 0) { ncw = 1; nch = 1; } } public ActiveBoxContent getActiveBoxContent(int i) { if (i >= activeBoxContentArray.size()) { for (int j = activeBoxContentArray.size(); j <= i; j++) activeBoxContentArray.add(new ActiveBoxContent()); } return (ActiveBoxContent) activeBoxContentArray.get(i); } public ActiveBoxContent getActiveBoxContentWith(int id, int item) { ActiveBoxContent result = null; for (int i = 0; i < activeBoxContentArray.size(); i++) { ActiveBoxContent abxcnt = (ActiveBoxContent) activeBoxContentArray.get(i); if (abxcnt.id == id && abxcnt.item == item) { result = abxcnt; break; } } return result; } public void deleteActiveBoxContentWith(int id, int item) { ActiveBoxContent abc = getActiveBoxContentWith(id, item); if (abc != null) { activeBoxContentArray.remove(abc); for (int i = 0; i < activeBoxContentArray.size(); i++) { abc = (ActiveBoxContent) activeBoxContentArray.get(i); if (abc.id == id && abc.item > item) abc.item--; } } } public void insertActiveBoxContentWith(int id, int item) { ActiveBoxContent abc = getActiveBoxContentWith(id, item); int index = activeBoxContentArray.indexOf(abc); for (int i = 0; i < activeBoxContentArray.size(); i++) { abc = (ActiveBoxContent) activeBoxContentArray.get(i); if (abc.id == id && abc.item >= item) abc.item++; } abc = new ActiveBoxContent(); abc.id = id; abc.item = item; activeBoxContentArray.add(index + 1, abc); } public int indexOf(ActiveBoxContent cnt) { int result = -1; for (int i = 0; i < activeBoxContentArray.size(); i++) { if (activeBoxContentArray.get(i) == cnt) { result = i; break; } } return result; } public void setActiveBoxContentAt(ActiveBoxContent ab, int index) { if (index >= 0) { getActiveBoxContent(index); activeBoxContentArray.set(index, ab); } } public void setImgContent(MediaBagElement mbe, boolean roundSizes) throws Exception { setImgContent(mbe, getShaper(), roundSizes); } public void setImgContent(MediaBagElement mbe, Shaper sh) throws Exception { setImgContent(mbe, sh, false); } public void setImgContent(MediaBagElement mbe, Shaper sh, boolean roundSizes) throws Exception { setShaper(sh); ncw = shaper.getNumColumns(); nch = shaper.getNumRows(); if (mbe != null) { img = mbe.getImage(); imgName = mbe.getName(); w = -1; h = -1; while (true) { w = ((double) img.getWidth(null)) / ncw; h = ((double) img.getHeight(null)) / nch; if (w >= 0 && h >= 0) break; Thread.sleep(50); } if (roundSizes) { w = (double) ((int) w); h = (double) ((int) h); } if (w < 1 || h < 1) throw new Exception("Invalid image!"); } else { img = null; imgName = null; w = Math.max(w, 10); h = Math.max(h, 10); } Rectangle2D.Double r = new Rectangle2D.Double(0, 0, w * ncw, h * nch); activeBoxContentArray.ensureCapacity(shaper.getNumCells()); for (int i = 0; i < shaper.getNumCells(); i++) { getActiveBoxContent(i).setImgContent(img, shaper.getShape(i, r)); } if (shaper.hasRemainder()) { backgroundContent = new ActiveBoxContent(); backgroundContent.setImgContent(img, shaper.getRemainderShape(r)); } } public void setTextContent(String[] txt, int setNcw, int setNch) { ncw = Math.max(1, setNcw); nch = Math.max(1, setNch); int n = ncw * nch; activeBoxContentArray.ensureCapacity(n); for (int i = 0; i < n; i++) { getActiveBoxContent(i).setTextContent(((i >= txt.length || txt[i] == null) ? "" : txt[i])); } } public boolean hasImg() { return img != null; } public double getTotalWidth() { return w * ncw; } public double getTotalHeight() { return h * nch; } public int getNumCells() { return activeBoxContentArray.size(); } public boolean isEmpty() { return activeBoxContentArray.isEmpty(); } public void prepareMedia(PlayStation ps) { for (int i = 0; i < activeBoxContentArray.size(); i++) { getActiveBoxContent(i).prepareMedia(ps); } if (img != null && ps.getOptions().getBoolean(Constants.PRE_DRAW_IMAGES)) { Graphics g = ps.getComponent().getGraphics(); g.drawImage(img, 0, 0, 0, 0, ps.getComponent()); } } public void setBoxBase(BoxBase boxBase) { bb = boxBase; } public void setIds(int[] ids) { for (int i = 0; i < activeBoxContentArray.size(); i++) if (i < ids.length) getActiveBoxContent(i).id = ids[i]; } public void setAllIdsTo(int id) { for (int i = 0; i < activeBoxContentArray.size(); i++) getActiveBoxContent(i).id = id; } public void avoidAllIdsNull(int maxId) { boolean allIdsNull = true; int numCells = activeBoxContentArray.size(); for (int i = 0; i < numCells; i++) { if (getActiveBoxContent(i).id != -1) { allIdsNull = false; break; } } if (allIdsNull) { maxId = Math.max(1, maxId); for (int i = 0; i < numCells; i++) { getActiveBoxContent(i).id = i % maxId; } } } public void copyStyleTo(ActiveBagContent abc) { if (abc != null) { abc.setBoxBase(bb); abc.border = border; } } } src/core/edu/xtec/jclic/boxes/ActiveBox.java000066400000000000000000000442401335566474600212770ustar00rootroot00000000000000/* * File : ActiveBox.java * Created : 12-dec-2000 17:05 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.media.ActiveMediaPlayer; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.JDomUtility; import edu.xtec.util.Options; import edu.xtec.util.ResourceBridge; import edu.xtec.util.StrUtils; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.ImageObserver; import java.text.AttributedString; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.RepaintManager; import javax.swing.SwingUtilities; /** * Objects of this class are widely used in JClic activities: cells in puzzles * and associations, messages and other objects are active boxes. The specific * content, size and location of * ActiveBox is determined by its * {@link edu.xtec.jclic.boxes.ActiveBoxContent} members. Most ActiveBoxes have * only one content, but some of them can have a secondary or "alternative" * content, indicated by the altContent member. This content is * used only when the alternative flag of the * ActiveBox is on. Active boxes can host video and interactive * media content (specified in the mediaContent member of the * {@link edu.xtec.jclic.boxes.ActiveBoxContent}) through the * hostedMediaPlayer member. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class ActiveBox extends AbstractBox implements Cloneable { public static boolean compressImages = true; public static boolean USE_TRANSFORM = false; public int idOrder, idLoc, idAss; protected ActiveBoxContent content; protected ActiveBoxContent altContent; public boolean hasHostedComponent; protected ActiveMediaPlayer hostedMediaPlayer; /** Creates new ActiveBox */ public ActiveBox(AbstractBox parent, JComponent container, BoxBase boxBase) { super(parent, container, boxBase); clear(); idLoc = -1; idOrder = -1; idAss = -1; hasHostedComponent = false; } public ActiveBox(AbstractBox parent, JComponent container, int setIdLoc, Rectangle2D r, BoxBase boxBase) { super(parent, container, boxBase); clear(); idLoc = setIdLoc; setBounds(r); } public void setHostedMediaPlayer(ActiveMediaPlayer amp) { ActiveMediaPlayer old = hostedMediaPlayer; hostedMediaPlayer = amp; if (old != null && old != amp) old.linkTo(null); } public ActiveBoxContent getCurrentContent() { return isAlternative() ? altContent : content; } public ActiveBoxContent getContent() { if (content == null) setContent(new ActiveBoxContent()); return content; } public void clear() { content = null; altContent = null; idOrder = -1; setInactive(true); if (!hasHostedComponent) setHostedComponent(null); setHostedMediaPlayer(null); } public boolean isEquivalent(ActiveBox bx, boolean checkCase) { return bx != null && content != null && content.isEquivalent(bx.content, checkCase); } public boolean isCurrentContentEquivalent(ActiveBox bx, boolean checkCase) { return bx != null && getCurrentContent() != null && getCurrentContent().isEquivalent(bx.getCurrentContent(), checkCase); } public void exchangeLocation(ActiveBox bx) { Point2D.Double pt = new Point2D.Double(x, y); int idLoc0 = idLoc; setLocation(bx.getLocation()); bx.setLocation(pt); idLoc = bx.idLoc; bx.idLoc = idLoc0; } public void copyContent(ActiveBox bx) { idOrder = bx.idOrder; idAss = bx.idAss; content = bx.content; altContent = bx.altContent; if (content != null) { if (content.bb != null) setBoxBase(content.bb); if (content.border != null && bx.hasBorder() != content.border.booleanValue()) setBorder(content.border.booleanValue()); if (content.img != null && content.animated) Utils.refreshAnimatedImage(content.img); } setInactive(bx.isInactive()); setInverted(bx.isInverted()); setAlternative(bx.isAlternative()); setHostedComponent(bx.getHostedComponent()); hasHostedComponent = bx.hasHostedComponent; setHostedMediaPlayer(bx.hostedMediaPlayer); if (hostedMediaPlayer != null) hostedMediaPlayer.setVisualComponentVisible(!isInactive() && isVisible()); } public void exchangeContent(ActiveBox bx) { ActiveBox bx0 = new ActiveBox(getParent(), getContainerX(), getBoxBaseX()); bx0.copyContent(this); copyContent(bx); bx.copyContent(bx0); } public void setTextContent(String tx) { // only plain text! if (tx == null) tx = ""; if (content == null) content = new ActiveBoxContent(); content.rawText = tx; content.text = tx; content.mediaContent = null; content.img = null; setHostedComponent(null); setInactive(false); checkHostedComponent(); setHostedMediaPlayer(null); } public void setIdOrder(int newIdOrder) { idOrder = newIdOrder; } public void setIdAss(int newIdAss) { idAss = newIdAss; } public void setDefaultIdAss() { idAss = (content == null ? -1 : content.id); } public boolean isAtPlace() { return idOrder == idLoc; } public void setContent(ActiveBoxContent abc) { setHostedComponent(null); setHostedMediaPlayer(null); content = abc; if (content != null) { if (content.bb != getBoxBaseX()) setBoxBase(content.bb); if (content.border != null && hasBorder() != content.border.booleanValue()) setBorder(content.border.booleanValue()); setInactive(false); if (abc.img != null && abc.animated) Utils.refreshAnimatedImage(abc.img); checkHostedComponent(); checkAutoStartMedia(); } else clear(); } public void checkAutoStartMedia() { ActiveBoxContent cnt = getContent(); if (cnt != null && cnt.mediaContent != null && cnt.mediaContent.autoStart == true && cnt.amp != null) { final ActiveMediaPlayer amp = cnt.amp; SwingUtilities.invokeLater(new Runnable() { public void run() { amp.play(ActiveBox.this); } }); } } public void setAltContent(ActiveBoxContent abc) { altContent = abc; checkHostedComponent(); if (isAlternative() && hostedMediaPlayer != null) setHostedMediaPlayer(null); } public void setCurrentContent(ActiveBoxContent abc) { if (isAlternative()) setAltContent(abc); else setContent(abc); repaint(); } public void setContent(ActiveBagContent abc, int i) { if (i < 0) i = idOrder; if (abc == null || i >= abc.getNumCells()) return; if (abc.bb != getBoxBaseX()) setBoxBase(abc.bb); setContent(abc.getActiveBoxContent(i)); } public void setAltContent(ActiveBagContent abc, int i) { if (i < 0) i = idOrder; if (abc == null || abc.isEmpty() || i > abc.getNumCells()) return; setAltContent(abc.getActiveBoxContent(i)); } public boolean switchToAlt(ResourceBridge rb) { if (isAlternative() || altContent == null || altContent.isEmpty()) return false; setHostedComponent(null); setHostedMediaPlayer(null); setAlternative(true); checkHostedComponent(); checkAutoStartMedia(); return true; } @Override protected void checkHostedComponent() { if (hasHostedComponent) return; ActiveBoxContent abc = getCurrentContent(); BoxBase bb = getBoxBaseResolve(); Component jc = null; if (!isInactive() && abc != null && abc.htmlText != null) { String s = abc.htmlText; if (abc.innerHtmlText != null) { Color backColor = isInactive() ? bb.inactiveColor : isInverted() ? bb.textColor : bb.backColor; Color foreColor = isInverted() ? bb.backColor : isAlternative() ? bb.alternativeColor : bb.textColor; Font f = bb.getOriginalFont(); s = "" + "" + "
" + abc.innerHtmlText + "
" + ""; } jc = getHostedComponent(); if (jc != null && jc instanceof JLabel) { ((JLabel) jc).setText(s); return; } else { jc = new JLabel(s); } } setHostedComponent(jc); } public boolean updateContent(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { ActiveBoxContent abc = getCurrentContent(); BoxBase bb = getBoxBaseResolve(); if (isInactive() || abc == null || width < 2 || height < 2) return true; Rectangle2D.Double imgRect = null; if (abc.img != null) { if (abc.imgClip != null) { Rectangle r = abc.imgClip.getBounds(); /* * We have two methods to draw: # Using AffineTransform * Compatible with Mac * OS-X 10.1, JRE 1.3.1 rev 1. * Possibly more slow ? * * # Using Graphics.drawImage * Doesn't work with Mac OSX 10.1 Java 1.3.1 rev. 1 * * Comment one of the two, or apply method 1 only to objects of class: * com.apple.mrj.internal.awt.graphics.VImage */ // Method 1 if (USE_TRANSFORM) { if (r.width > 0 && r.height > 0) { AffineTransform at; if (r.width != width || r.height != height) { double sx = width / r.width; double sy = height / r.height; at = AffineTransform.getScaleInstance(sx, sy); at.translate(x / sx - r.x, y / sy - r.y); } else at = AffineTransform.getTranslateInstance(x - r.x, y - r.y); g2.drawImage(abc.img, at, io); } } else { // Method 2 g2.drawImage(abc.img, (int) x, (int) y, (int) (x + width), (int) (y + height), (int) r.x, (int) r.y, (int) (r.x + r.width), (int) (r.y + r.height), io); } } else { double imgw, imgh; boolean compress = false; if ((imgw = abc.img.getWidth(io)) == 0) imgw = width; if ((imgh = abc.img.getHeight(io)) == 0) imgh = height; double scale = 1.0; if (compressImages == true && (width > 0 && height > 0) && (imgw > width || imgh > height)) { scale = Math.min(width / imgw, height / imgh); imgw *= scale; imgh *= scale; compress = true; } double xs = (abc.imgAlign[0] == JDomUtility.ALIGN_LEFT ? 0 : abc.imgAlign[0] == JDomUtility.ALIGN_RIGHT ? width - imgw : (width - imgw) / 2); double ys = (abc.imgAlign[1] == JDomUtility.ALIGN_TOP ? 0 : abc.imgAlign[1] == JDomUtility.ALIGN_BOTTOM ? height - imgh : (height - imgh) / 2); if (compress) { if (USE_TRANSFORM) { // Method 1: AffineTransform at = AffineTransform.getScaleInstance(scale, scale); at.translate((x + xs) / scale, (y + ys) / scale); g2.drawImage(abc.img, at, io); } else { // Method 2: g2.drawImage(abc.img, (int) (x + xs), (int) (y + ys), (int) imgw, (int) imgh, io); } } else g2.drawImage(abc.img, (int) (x + xs), (int) (y + ys), io); if (abc.avoidOverlapping && abc.text != null /* && !JDomUtility.isDefaultAlign(abc.imgAlign) */) imgRect = new Rectangle2D.Double(Math.max(0.0, xs), Math.max(0.0, ys), Math.min(width, imgw), Math.min(height, imgh)); } } if (abc.text != null && abc.text.length() > 0) { double px = this.x; double py = this.y; double pWidth = this.width; double pHeight = this.height; if (imgRect != null) { double[] prx = new double[] { 0, imgRect.x, imgRect.x + imgRect.width, pWidth }; double[] pry = new double[] { 0, imgRect.y, imgRect.y + imgRect.height, pHeight }; Rectangle2D.Double[] rr = new Rectangle2D.Double[] { new Rectangle2D.Double(prx[0], pry[0], prx[3], pry[1]), new Rectangle2D.Double(prx[0], pry[2], prx[3], pry[3] - pry[2]), new Rectangle2D.Double(prx[0], pry[0], prx[1], pry[3]), new Rectangle2D.Double(prx[2], pry[0], prx[3] - prx[2], pry[3]) }; Rectangle2D.Double rmax = rr[0]; double maxSurface = rmax.width * rmax.height; for (int i = 1; i < rr.length; i++) { double s = rr[i].width * rr[i].height; if (s > maxSurface - 1) { if (Math.abs(s - maxSurface) <= 1) { boolean b = false; switch (i) { case 1: b = (abc.txtAlign[1] == JDomUtility.ALIGN_BOTTOM); break; case 2: b = (abc.txtAlign[0] == JDomUtility.ALIGN_LEFT); break; case 3: b = (abc.txtAlign[0] == JDomUtility.ALIGN_RIGHT); break; } if (!b) continue; } maxSurface = s; rmax = rr[i]; } } px += rmax.x; py += rmax.y; pWidth = rmax.width; pHeight = rmax.height; } double w, wtl, h, hl, dx, dy; double ww = Math.max(5.0, pWidth - 2 * bb.textMargin); AttributedString atext; TextLayout layout; int rt; FontRenderContext frc = g2.getFontRenderContext(); LineBreakMeasurer lbm; int maxLines = StrUtils.countSpaces(abc.text) + 1; for (;;) { int i; atext = new AttributedString(abc.text); atext.addAttribute(TextAttribute.FONT, bb.getFont()); lbm = new LineBreakMeasurer(atext.getIterator(), frc); w = 0; h = 0; hl = 0; lbm.setPosition(0); rt = abc.text.indexOf('\n'); for (i = 0; lbm.getPosition() < abc.text.length() && h < pHeight; i++) { if (rt > lbm.getPosition()) { layout = lbm.nextLayout((float) ww, rt, false); rt = abc.text.indexOf('\n', lbm.getPosition()); } else layout = lbm.nextLayout((float) ww); if (layout == null) break; wtl = layout.getVisibleAdvance(); if (wtl > w) w = wtl; hl = layout.getLeading(); h += layout.getAscent() + layout.getDescent() + hl; } h -= hl; if ((h <= pHeight && i <= maxLines) || bb.reduceFont() == false) break; JComponent jc = getContainerResolve(); if (jc != null) RepaintManager.currentManager(jc).markCompletelyDirty(jc); } dy = py + (abc.txtAlign[1] == JDomUtility.ALIGN_TOP ? 0 : abc.txtAlign[1] == JDomUtility.ALIGN_BOTTOM ? pHeight - h : (pHeight - h) / 2); g2.setColor(isInverted() ? bb.backColor : isAlternative() ? bb.alternativeColor : bb.textColor); lbm.setPosition(0); rt = abc.text.indexOf('\n'); h = 0; while (lbm.getPosition() < abc.text.length() && h < pHeight) { if (rt > lbm.getPosition()) { layout = lbm.nextLayout((float) ww, rt, false); rt = abc.text.indexOf('\n', lbm.getPosition()); } else layout = lbm.nextLayout((float) ww); if (layout == null) break; wtl = layout.getVisibleAdvance(); dx = px + bb.textMargin + (abc.txtAlign[0] == JDomUtility.ALIGN_LEFT ? 0 : abc.txtAlign[0] == JDomUtility.ALIGN_RIGHT ? ww - wtl : (ww - wtl) / 2); h += layout.getAscent(); if (bb.shadow) { g2.setColor(bb.shadowColor); layout.draw(g2, (float) (dx + bb.getDynFontSize() / 10), (float) (dy + h + bb.getDynFontSize() / 10)); g2.setColor(isInverted() ? bb.backColor : isAlternative() ? bb.alternativeColor : bb.textColor); } layout.draw(g2, (float) dx, (float) (dy + h)); h += layout.getDescent() + layout.getLeading(); } } return true; } public boolean playMedia(PlayStation ps) { ActiveBoxContent abc = getCurrentContent(); // ORIGINAL /* * if(abc!=null && abc.mediaContent!=null){ ac.playMedia(abc.mediaContent, * this); return true; } */ // MODIFIED TO REPAINT ANIMATED GIFS if (abc != null) { if (abc.animated) { Utils.refreshAnimatedImage(abc.img); repaint(); } if (abc.mediaContent != null) { ps.playMedia(abc.mediaContent, this); return true; } } return false; } public String getDescription() { return content == null ? "" : content.getDescription(); } @Override public void setBounds(Rectangle2D r) { super.setBounds(r); if (hostedMediaPlayer != null) hostedMediaPlayer.checkVisualComponentBounds(this); } @Override public void end() { clear(); super.end(); } public static void checkOptions(Options options) { if (!options.getBoolean(Options.JAVA14) && options.getBoolean(Options.MAC)) { USE_TRANSFORM = true; } } } src/core/edu/xtec/jclic/boxes/ActiveBoxBag.java000066400000000000000000000143621335566474600217130ustar00rootroot00000000000000/* * File : ActiveBoxBag.java * Created : 13-dec-2000 12:09 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import java.awt.geom.Point2D; import javax.swing.JComponent; /** * This class is a special case of {@link edu.xtec.jclic.boxes.BoxBag}, * containing only {@link edu.xtec.jclic.boxes.ActiveBox} objects. In addition * to the members and methods of BoxBag * , it implements specific methods to deal with * {@link edu.xtec.jclic.boxes.ActiveBagContent} objects and with other specific * members of {@link edu.xtec.jclic.boxes.ActiveBox}, like its "ids" * (idOrder, idLoc and idAss). * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class ActiveBoxBag extends BoxBag implements Cloneable { /** Creates new ActiveBoxBag */ public ActiveBoxBag(AbstractBox parent, JComponent container, BoxBase boxBase) { super(parent, container, boxBase); } public final void addActiveBox(ActiveBox bx) { bx.idLoc = cells.size(); bx.idOrder = bx.idLoc; super.addBox(bx); } public ActiveBox getActiveBox(int idLoc) { return (ActiveBox) super.getBox(idLoc); } public ActiveBox getBackgroundActiveBox() { return (ActiveBox) getBackgroundBox(); } public void setContent(ActiveBagContent abc) { setContent(abc, null); } public void setContent(ActiveBagContent abc, ActiveBagContent altAbc) { setContent(abc, altAbc, 0, 0, getNumCells()); } public void setContent(ActiveBagContent abc, ActiveBagContent altAbc, int fromIndex, int toCell, int numCells) { ActiveBox bx; for (int i = 0; i < numCells; i++) { bx = getActiveBox(toCell + i); bx.setContent(abc, fromIndex + i); bx.setAlternative(false); if (altAbc != null) bx.setAltContent(altAbc, fromIndex + i); } if (abc.backgroundContent != null && (bx = getBackgroundActiveBox()) != null) { bx.setContent(abc.backgroundContent); if (/* abc.bb!=null && */ abc.bb != bx.getBoxBaseX()) bx.setBoxBase(abc.bb); } } public ActiveBox findActiveBox(Point2D p) { return (ActiveBox) super.findBox(p); } public void clearAll() { for (int i = 0; i < cells.size(); i++) getActiveBox(i).clear(); if (backgroundBox != null) getBackgroundActiveBox().clear(); } public int countCellsAtPlace() { int cellsAtPlace = 0; for (int i = 0; i < cells.size(); i++) if (getActiveBox(i).isAtPlace()) cellsAtPlace++; return cellsAtPlace; } public ActiveBox getActiveBoxWithIdLoc(int idLoc) { ActiveBox bx; for (int i = 0; i < cells.size(); i++) { if ((bx = getActiveBox(i)).idLoc == idLoc) return bx; } return null; } public boolean cellIsAtEquivalentPlace(ActiveBox bx, boolean checkCase) { return bx.isAtPlace() || bx.isEquivalent(getActiveBoxWithIdLoc(bx.idOrder), checkCase); } public int countCellsAtEquivalentPlace(boolean checkCase) { int cellsAtPlace = 0; for (int i = 0; i < cells.size(); i++) { if (cellIsAtEquivalentPlace(getActiveBox(i), checkCase)) cellsAtPlace++; } return cellsAtPlace; } public int countCellsWithIdAss(int idAss) { int n = 0; for (int i = 0; i < cells.size(); i++) { if (getActiveBox(i).idAss == idAss) n++; } return n; } @Override public int countInactiveCells() { int n = 0; for (int i = 0; i < cells.size(); i++) { if (getActiveBox(i).isInactive()) n++; } return n; } public void setDefaultIdAss() { for (int i = 0; i < cells.size(); i++) getActiveBox(i).setDefaultIdAss(); } public void scrambleCells(int times, boolean fitInArea) { int nc = cells.size(); if (nc >= 2) { Point2D[] pos = new Point2D[nc]; int[] idLoc = new int[nc]; for (int i = 0; i < nc; i++) { ActiveBox bx = getActiveBox(i); pos[i] = new Point2D.Double(); pos[i].setLocation(bx.getLocation()); idLoc[i] = bx.idLoc; } Point2D p = new Point2D.Double(); int j; for (int i = 0; i < times; i++) { int r1 = (int) (Math.random() * nc); int r2 = (int) (Math.random() * nc); if (r1 != r2) { p.setLocation(pos[r1]); pos[r1].setLocation(pos[r2]); pos[r2].setLocation(p); j = idLoc[r1]; idLoc[r1] = idLoc[r2]; idLoc[r2] = j; } } double maxX = x + width; double maxY = y + height; for (int i = 0; i < nc; i++) { ActiveBox bx = getActiveBox(i); double px = pos[i].getX(); double py = pos[i].getY(); if (fitInArea) { px = Math.min(Math.max(px, x), maxX - bx.width); py = Math.min(Math.max(py, y), maxY - bx.height); } bx.setLocation(px, py); bx.idLoc = idLoc[i]; } } } public void resetIds() { for (int i = 0; i < cells.size(); i++) { ActiveBox bx = (ActiveBox) cells.get(i); if (bx != null) { bx.idOrder = i; bx.idAss = i; bx.idLoc = i; } } } private static final int NOT_USED = -12345; public int getNextItem(int currentItem) { return getNextItem(currentItem, NOT_USED); } public int getNextItem(int currentItem, int idAssValid) { int i; for (i = currentItem + 1; i < cells.size(); i++) { ActiveBox bx = (ActiveBox) cells.get(i); if (bx == null) break; if (idAssValid != NOT_USED) { if (idAssValid == bx.idAss) break; } else if (bx.idAss >= 0) break; } return i; } } src/core/edu/xtec/jclic/boxes/ActiveBoxContent.java000066400000000000000000000301731335566474600226320ustar00rootroot00000000000000/* * File : ActiveBoxContent.java * Created : 02-may-2001 15:29 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Constants; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.bags.MediaBagElement; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.media.ActiveMediaPlayer; import edu.xtec.jclic.media.MediaContent; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.ResourceManager; import edu.xtec.util.StrUtils; import java.awt.Dimension; import java.awt.Image; import java.awt.Rectangle; import java.awt.Shape; import java.util.Map; /** * This class defines a content that can be displayed by * {@link edu.xtec.jclic.boxes.ActiveBox} objects. This content can be a text, * an image, a fragment of an image or a combination of text and images. The * style (colours, font and size, etc.) can be specified in a * {@link edu.xtec.jclic.boxes.BoxBase} object. It stores also information about * the optimal size and location of the ActiveBox. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActiveBoxContent extends Object implements Cloneable, Domable { public BoxBase bb = null; public Dimension dimension = null; public Boolean border = null; public String text = null; public String imgName = null; public Shape imgClip = null; public MediaContent mediaContent = null; public int[] imgAlign = new int[] { JDomUtility.ALIGN_MIDDLE, JDomUtility.ALIGN_MIDDLE }; public int[] txtAlign = new int[] { JDomUtility.ALIGN_MIDDLE, JDomUtility.ALIGN_MIDDLE }; public boolean avoidOverlapping = false; public int id = -1; public int item = -1; public Image img = null; // static fields protected static ActiveBoxContent EMPTY_CONTENT; // transient properties public Object userData = null; public String rawText = null; public String htmlText = null; public String innerHtmlText = null; public boolean animated = false; public ActiveMediaPlayer amp = null; protected void copyRawDataFrom(ActiveBoxContent src) { bb = src.bb; dimension = src.dimension; border = src.border; text = src.text; imgName = src.imgName; imgClip = src.imgClip; mediaContent = src.mediaContent; imgAlign = src.imgAlign; txtAlign = src.txtAlign; avoidOverlapping = src.avoidOverlapping; id = src.id; item = src.item; img = src.img; userData = src.userData; rawText = src.rawText; htmlText = src.htmlText; innerHtmlText = src.innerHtmlText; animated = src.animated; amp = src.amp; } /** Creates new ActiveBoxContent */ public ActiveBoxContent() { } public static ActiveBoxContent getEmptyContent() { if (EMPTY_CONTENT == null) EMPTY_CONTENT = new ActiveBoxContent(); return EMPTY_CONTENT; } public static final String ELEMENT_NAME = "cell"; protected static final String ID = "id", ITEM = "item", WIDTH = "width", HEIGHT = "height", BORDER = "border", IMAGE = "image", TXTALIGN = "txtAlign", IMGALIGN = "imgAlign", AVOID_OVERLAPPING = "avoidOverlapping"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (id != -1) e.setAttribute(ID, Integer.toString(id)); if (item != -1) e.setAttribute(ITEM, Integer.toString(item)); JDomUtility.setAlignProp(e, TXTALIGN, txtAlign, true); JDomUtility.setAlignProp(e, IMGALIGN, imgAlign, true); if (avoidOverlapping) e.setAttribute(AVOID_OVERLAPPING, JDomUtility.boolString(avoidOverlapping)); if (dimension != null) { e.setAttribute(WIDTH, Integer.toString(dimension.width)); e.setAttribute(HEIGHT, Integer.toString(dimension.height)); } if (border != null) e.setAttribute(BORDER, JDomUtility.boolString(border.booleanValue())); if (imgName != null) e.setAttribute(IMAGE, imgName); if (bb != null) e.addContent(bb.getJDomElement()); if (mediaContent != null) e.addContent(mediaContent.getJDomElement()); if (text != null) JDomUtility.setParagraphs(e, text); return e; } public static final int EMPTY_CELL = 0, ONLY_ID = 1, HAS_CONTENT = 2; public int testCellContents() { if (JDomUtility.isDefaultAlign(txtAlign) && JDomUtility.isDefaultAlign(imgAlign) && !avoidOverlapping && dimension == null && border == null && imgName == null && bb == null && mediaContent == null && (text == null || text.length() == 0)) { return ((id == -1 && item == -1) ? EMPTY_CELL : ONLY_ID); } return HAS_CONTENT; } public static ActiveBoxContent getActiveBoxContent(org.jdom.Element e, MediaBag mediaBag) throws Exception { ActiveBoxContent abc = new ActiveBoxContent(); abc.setProperties(e, mediaBag); return abc; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); MediaBag mediaBag = (MediaBag) aux; org.jdom.Element child; id = JDomUtility.getIntAttr(e, ID, id); item = JDomUtility.getIntAttr(e, ITEM, item); if (e.getAttribute(JDomUtility.HALIGN) != null || e.getAttribute(JDomUtility.VALIGN) != null) { // old version!!! txtAlign[0] = JDomUtility.getHAlign(e, txtAlign[0]); txtAlign[1] = JDomUtility.getVAlign(e, txtAlign[1]); imgAlign[0] = txtAlign[0]; imgAlign[1] = txtAlign[1]; } else { txtAlign = JDomUtility.getAlignProp(e, TXTALIGN, txtAlign); imgAlign = JDomUtility.getAlignProp(e, IMGALIGN, imgAlign); } avoidOverlapping = JDomUtility.getBoolAttr(e, AVOID_OVERLAPPING, avoidOverlapping); dimension = JDomUtility.getDimensionAttr(e, WIDTH, HEIGHT, dimension); border = JDomUtility.getBooleanAttr(e, BORDER, border); imgName = FileSystem.stdFn(e.getAttributeValue(IMAGE)); if ((child = e.getChild(BoxBase.ELEMENT_NAME)) != null) setBoxBase(BoxBase.getBoxBase(child)); if ((child = e.getChild(MediaContent.ELEMENT_NAME)) != null) mediaContent = MediaContent.getMediaContent(child); setTextContent(JDomUtility.getParagraphs(e)); if (mediaBag != null) realizeContent(mediaBag); } public static void listReferences(org.jdom.Element e, Map map) { if (e != null) { String s = e.getAttributeValue(IMAGE); if (s != null && s.length() > 0) map.put(s, Constants.MEDIA_OBJECT); org.jdom.Element child = e.getChild(MediaContent.ELEMENT_NAME); if (child != null) MediaContent.listReferences(child, map); } } @Override public Object clone() { ActiveBoxContent abc = null; try { abc = (ActiveBoxContent) super.clone(); abc.txtAlign = new int[] { txtAlign[0], txtAlign[1] }; abc.imgAlign = new int[] { imgAlign[0], imgAlign[1] }; } catch (Exception ex) { System.err.println("Unexpected error cloning ActiveBoxContent!"); } return abc; } public void realizeContent(MediaBag mediaBag) throws Exception { // todo: check global img and imgclip if (imgName != null) { MediaBagElement mbe = mediaBag.getImageElement(imgName); if (mbe != null) { img = mbe.getImage(); animated = mbe.animated; } } if (mediaContent != null) { mediaContent.registerContentTo(mediaBag); if (img == null && (text == null || text.length() == 0)) { String s = mediaContent.getIconName(); img = ResourceManager.getImageIcon("icons/" + s).getImage(); } } checkHtmlText(mediaBag); } public boolean isEmpty() { return (text == null && img == null); } public boolean isEquivalent(ActiveBoxContent abc, boolean checkCase) { if (abc == this) return true; boolean result = false; if (abc != null) { if (isEmpty() && abc.isEmpty()) result = (id == abc.id); else result = (text == null ? abc.text == null : (checkCase ? text.equals(abc.text) : text.equalsIgnoreCase(abc.text))) && (mediaContent == null ? abc.mediaContent == null : mediaContent.isEquivalent(abc.mediaContent)) && (img == abc.img) && (imgClip == null ? abc.imgClip == null : imgClip.equals(abc.imgClip)); } return result; } @Override public boolean equals(Object o) { boolean result = (o == this); if (!result && o != null && o instanceof ActiveBoxContent) { ActiveBoxContent abc = (ActiveBoxContent) o; result = isEquivalent(abc, true) && ((bb == null && abc.bb == null) || (bb != null && bb.equals(abc.bb))) && txtAlign[0] == abc.txtAlign[0] && txtAlign[1] == abc.txtAlign[1] && imgAlign[0] == abc.imgAlign[0] && imgAlign[1] == abc.imgAlign[1] && avoidOverlapping == abc.avoidOverlapping; } return result; } public void setTextContent(String tx) { // only plain text! if (tx != null) { rawText = tx; text = tx; checkHtmlText(null); } else { rawText = null; text = null; htmlText = null; innerHtmlText = null; } } protected void checkHtmlText(MediaBag mediaBag) { htmlText = null; innerHtmlText = null; if (text != null && text.substring(0).toLowerCase().startsWith("")) { htmlText = text; if (mediaBag != null) { FileSystem fs = mediaBag.getProject().getFileSystem(); String path = fs.root; if (!fs.isUrlBased()) path = "file:" + FileSystem.sysFn(path); htmlText = StrUtils.replace(htmlText, "SRC=\"", "SRC=\"" + path); htmlText = StrUtils.replace(htmlText, "src=\"", "src=\"" + path); } String s = htmlText.substring(0).toLowerCase(); if (s.indexOf(""); if (s2 >= 0) { innerHtmlText = htmlText.substring(6, s2); } } } } public void setImgContent(Image setImg, Shape setImgClip) { img = setImg; imgName = null; imgClip = setImgClip; } public void setImgAlign(int[] align) { imgAlign[0] = align[0]; imgAlign[1] = align[1]; } public void setImgAlign(int h, int v) { imgAlign[0] = h; imgAlign[1] = v; } public void setTxtAlign(int[] align) { txtAlign[0] = align[0]; txtAlign[1] = align[1]; } public void setTxtAlign(int h, int v) { txtAlign[0] = h; txtAlign[1] = v; } public void prepareMedia(PlayStation ps) { if (mediaContent != null) amp = ps.getActiveMediaPlayer(mediaContent); else amp = null; } public void setBoxBase(BoxBase boxBase) { bb = boxBase; } public void setDimension(Dimension d) { dimension = d; } public Dimension getDimension() { return dimension; } public void setBorder(boolean b) { border = b; } public void copyStyleTo(ActiveBoxContent abc) { if (abc != null) { abc.setBoxBase(bb); if (border != null) abc.setBorder(border.booleanValue()); } } public String getDescription() { StringBuilder result = new StringBuilder(); if (text != null && text.length() > 0) result.append(text); else if (imgName != null) result.append("IMG:").append(imgName); else if (imgClip != null) { Rectangle r = imgClip.getBounds(); result.append("[").append(r.x).append(",").append(r.y).append(","); result.append(r.width).append(",").append(r.height).append("]"); } if (mediaContent != null) { if (result.length() > 0) result.append(' '); result.append(mediaContent.getDescription()); } return result.substring(0); } } src/core/edu/xtec/jclic/boxes/ActiveBoxGrid.java000066400000000000000000000076271335566474600221150ustar00rootroot00000000000000/* * File : ActiveBoxGrid.java * Created : 11-jan-2001 16:42 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Constants; import edu.xtec.jclic.shapers.Shaper; import edu.xtec.util.StrUtils; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.Shape; import javax.swing.JComponent; /** * This class is a {@link edu.xtec.jclic.boxes.ActiveBoxBag} with constructors * that take an argument of type {@link edu.xtec.jclic.shapers.Shaper} to build * all its {@link edu.xtec.jclic.boxes.ActiveBox} elements. It also mantains * info about the number of "rows" and "columns", useful to compute appropiate * (integer) values when resizing the ActiveBoxBag * and its ActiveBox children. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class ActiveBoxGrid extends ActiveBoxBag implements Cloneable { public int nCols; public int nRows; public ActiveBoxGrid(AbstractBox parent, JComponent container, double px, double py, double setWidth, double setHeight, Shaper sh, BoxBase boxBase) { super(parent, container, boxBase); nCols = sh.getNumColumns(); nRows = sh.getNumRows(); Rectangle r = new Rectangle((int) px, (int) py, ((int) (setWidth / nCols)) * nCols, ((int) (setHeight / nRows)) * nRows); ensureCapacity(sh.getNumCells()); for (int i = 0; i < sh.getNumCells(); i++) { Shape tmpSh = sh.getShape(i, r); ActiveBox bx = new ActiveBox(this, null, i, tmpSh.getBounds2D(), null); if (!sh.rectangularShapes()) bx.setShape(tmpSh); addActiveBox(bx); } if (sh.hasRemainder()) { Shape tmpSh = sh.getRemainderShape(r); ActiveBox bx = new ActiveBox(this, null, 0, tmpSh.getBounds2D(), null); bx.setShape(tmpSh); setBackgroundBox(bx); } } @Override public Dimension getMinimumSize() { return new Dimension(Constants.MIN_CELL_SIZE * nCols, Constants.MIN_CELL_SIZE * nRows); } @Override public Dimension getScaledSize(double scale) { return new Dimension(StrUtils.roundTo(scale * preferredBounds.getWidth(), nCols), StrUtils.roundTo(scale * preferredBounds.getHeight(), nRows)); } public static ActiveBoxGrid createEmptyGrid(AbstractBox parent, JComponent container, double px, double py, ActiveBagContent abc, Shaper sh, BoxBase boxBase) { ActiveBoxGrid result = null; if (abc != null) { result = new ActiveBoxGrid(parent, container, px, py, abc.getTotalWidth(), abc.getTotalHeight(), sh == null ? abc.getShaper() : sh, boxBase == null ? abc.bb : boxBase); result.setBorder(abc.border); } return result; } public static ActiveBoxGrid createEmptyGrid(ActiveBox parent, JComponent container, double px, double py, ActiveBagContent abc) { return createEmptyGrid(parent, container, px, py, abc, null, null); } public Point getCoord(ActiveBox bx) { int py = bx.idLoc / nCols; int px = bx.idLoc % nCols; return new Point(px, py); } public Point getCoordDist(ActiveBox src, ActiveBox dest) { Point ptSrc = getCoord(src); Point ptDest = getCoord(dest); return new Point(ptDest.x - ptSrc.x, ptDest.y - ptSrc.y); } } src/core/edu/xtec/jclic/boxes/AnimatedActiveBox.java000066400000000000000000000077651335566474600227550ustar00rootroot00000000000000/* * File : AnimatedActiveBox.java * Created : 10-jan-2002 15:41 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Rectangle2D; import javax.swing.JComponent; import javax.swing.Timer; /** * This class is currently used only in some {@link edu.xtec.jclic.skins.Skin} * classes to animate progress bars. It takes a collection of images (stored as * elements of an {@link edu.xtec.jclic.boxes.ActiveBagContent}) that are used * as "frames" of a picture, and displayed one after other. It uses a * {@link java.util.Timer} to generate the events that cause the rotation of * frames. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class AnimatedActiveBox extends ActiveBox implements ActionListener { protected ActiveBagContent abc = null; protected ActiveBagContent altAbc = null; protected Timer timer = null; protected int delay = MIN_DELAY; protected boolean running = false; protected int currentFrame = 0; private boolean waitingForFirstFrame = false; protected long startTime = 0L; protected int startDelay = 0; public static final int MIN_DELAY = 50; /** Creates new AnimatedActiveBox */ public AnimatedActiveBox(AbstractBox parent, JComponent container, BoxBase boxBase) { super(parent, container, boxBase); } public AnimatedActiveBox(AbstractBox parent, JComponent container, int setIdLoc, Rectangle2D r, BoxBase boxBase) { super(parent, container, setIdLoc, r, boxBase); } public void setStartDelay(int startDelay) { this.startDelay = startDelay; } public void setDelay(int delay) { this.delay = delay; } @Override public void clear() { super.clear(); } public void setContent(ActiveBagContent abc) { this.abc = abc; if (abc != null && !abc.isEmpty()) setContent(abc.getActiveBoxContent(0)); } public void setAltContent(ActiveBagContent abc) { this.altAbc = abc; } private void buildTimer() { if (timer != null) { timer.stop(); timer = null; } if (delay >= MIN_DELAY) { timer = new Timer(delay, this); timer.setRepeats(true); timer.setCoalesce(true); } } public void start() { stop(false); if (timer == null) { buildTimer(); } if (timer != null) { startTime = System.currentTimeMillis(); waitingForFirstFrame = false; if (!timer.isRunning()) timer.start(); } } public void stop(boolean toFirstFrame) { if (timer != null && timer.isRunning()) { if (toFirstFrame) waitingForFirstFrame = true; else { waitingForFirstFrame = false; timer.stop(); } } } public void actionPerformed(ActionEvent e) { ActiveBagContent c = isAlternative() ? altAbc : abc; if (c != null && c.getNumCells() > 0) { currentFrame++; currentFrame %= c.getNumCells(); if (currentFrame == 0 && waitingForFirstFrame) { waitingForFirstFrame = false; timer.stop(); } else { if (isAlternative()) setAltContent(c, currentFrame); else setContent(c, currentFrame); } if (!isVisible() && startDelay > 0 && (System.currentTimeMillis() - startTime) >= startDelay) setVisible(true); } } } src/core/edu/xtec/jclic/boxes/BoxBag.java000066400000000000000000000264071335566474600205620ustar00rootroot00000000000000/* * File : BoxBag.java * Created : 10-sep-2001 10:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity; import edu.xtec.jclic.Constants; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.ImageObserver; import java.util.ArrayList; import javax.swing.JComponent; /** * A BoxBag is a class derived from {@link edu.xtec.jclic.boxes.AbstractBox} * that contains a collection of "boxes" (objects also derived from * AbstractBox). The boxes are stores into a protected * {@link java.util.ArrayList}. The class implements methods to add, remove and * retrieve boxes, and to manage some of its properties like visibility, status, * location and size. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.23 */ public class BoxBag extends AbstractBox implements Cloneable, Resizable { protected ArrayList cells = new ArrayList(12); protected Rectangle2D preferredBounds = new Rectangle2D.Double(); protected AbstractBox backgroundBox = null; /** Creates new ActiveBoxBag */ public BoxBag(AbstractBox parent, JComponent container, BoxBase boxBase) { super(parent, container, boxBase); preferredBounds.setRect(getBounds()); } @Override public Object clone() { BoxBag dBB = (BoxBag) super.clone(); dBB.preferredBounds = (Rectangle2D) preferredBounds.clone(); dBB.cells = new ArrayList(); for (int i = 0; i < cells.size(); i++) dBB.cells.add((AbstractBox) getBox(i).clone()); if (backgroundBox != null) { dBB.backgroundBox = (AbstractBox) backgroundBox.clone(); dBB.backgroundBox.setParent(dBB); } return dBB; } @Override public void setContainer(JComponent newContainer) { super.setContainer(newContainer); } @Override public void end() { for (int i = 0; i < cells.size(); i++) getBox(i).end(); if (backgroundBox != null) { backgroundBox.end(); backgroundBox = null; } cells.clear(); super.end(); } public Dimension getPreferredSize() { return preferredBounds.getBounds().getSize(); } public Dimension getMinimumSize() { Dimension d = getPreferredSize(); return new Dimension(Math.max(Constants.MIN_CELL_SIZE, d.width), Math.max(Constants.MIN_CELL_SIZE, d.height)); } public Dimension getScaledSize(double scale) { Dimension d = getPreferredSize(); return new Dimension((int) (scale * d.width), (int) (scale * d.height)); } public void ensureCapacity(int n) { cells.ensureCapacity(n); } public void addBox(AbstractBox bx) { cells.add(bx); bx.setParent(this); if (cells.size() == 1) { super.setBounds(bx); } else { add(bx); } preferredBounds.setRect(getBounds()); } public int boxIndex(Object bx) { return bx == null ? -1 : cells.indexOf(bx); } public AbstractBox getBox(int id) { return (id < 0 || id >= cells.size()) ? null : (AbstractBox) cells.get(id); } public AbstractBox getBackgroundBox() { return backgroundBox; } public void setBackgroundBox(AbstractBox bx) { backgroundBox = bx; if (backgroundBox != null) { add(backgroundBox); backgroundBox.setParent(this); } preferredBounds.setRect(getBounds()); } public void recalcSize() { Rectangle2D r = new Rectangle2D.Double(x, y, 0, 0); if (backgroundBox != null) r.add(backgroundBox); for (int i = 0; i < cells.size(); i++) r.add((AbstractBox) (cells.get(i))); preferredBounds.setRect(r); x = r.getX(); y = r.getY(); width = r.getWidth(); height = r.getHeight(); } public int getNumCells() { return cells.size(); } @Override public void setBorder(boolean newVal) { for (int i = 0; i < cells.size(); i++) getBox(i).setBorder(newVal); } @Override public void setVisible(boolean newVal) { for (int i = 0; i < cells.size(); i++) getBox(i).setVisible(newVal); } @Override public void setAlternative(boolean newVal) { super.setAlternative(newVal); for (int i = 0; i < cells.size(); i++) getBox(i).setAlternative(newVal); } @Override public void setBoxBase(BoxBase setBb) { super.setBoxBase(setBb); } @Override public void setBounds(Rectangle2D r) { if (!r.isEmpty() && !r.equals(this)) { double scaleW = r.getWidth() / width; double scaleH = r.getHeight() / height; double dx = r.getX() - x; double dy = r.getY() - y; for (int i = 0; i < cells.size(); i++) { AbstractBox bx = getBox(i); Point2D.Double p = new Point2D.Double(bx.x - x, bx.y - y); bx.setBounds(dx + x + scaleW * p.x, dy + y + scaleH * p.y, scaleW * bx.width, scaleH * bx.height); } if (backgroundBox != null) { AbstractBox bx = backgroundBox; Point2D.Double p = new Point2D.Double(bx.x - x, bx.y - y); bx.setBounds(dx + x + scaleW * p.x, dy + y + scaleH * p.y, scaleW * bx.width, scaleH * bx.height); } } super.setBounds(r); } @Override public boolean update(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { if (isEmpty() || !isVisible() || isTemporaryHidden()) return false; if (!intersects(dirtyRegion)) return false; if (backgroundBox != null) backgroundBox.update(g2, dirtyRegion, io); AbstractBox bx; for (int i = 0; i < cells.size(); i++) if (!((bx = getBox(i)).isMarked())) bx.update(g2, dirtyRegion, io); for (int i = 0; i < cells.size(); i++) if ((bx = getBox(i)).isMarked()) bx.update(g2, dirtyRegion, io); return true; } public boolean updateContent(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { return true; } public AbstractBox findBox(Point2D p) { for (int i = cells.size() - 1; i >= 0; i--) { AbstractBox bx = getBox(i); if (bx.isVisible() && bx.contains(p)) return bx; } return null; } public int countInactiveCells() { int n = 0; for (int i = 0; i < cells.size(); i++) { if (getBox(i).isInactive()) n++; } return n; } public static Dimension layoutSingle(Dimension preferredMaxSize, Resizable rs, int margin) { // Avoid exceptions when rs is null if (rs == null) return preferredMaxSize; // optimal dimension Dimension d = rs.getPreferredSize(); // minimal dimension Dimension minSize = rs.getMinimumSize(); // maximal dimension Dimension maxSize = preferredMaxSize; // remove margins maxSize.width -= 2 * margin; maxSize.height -= 2 * margin; // correct maxSize if less than minSize if (minSize.width > maxSize.width || minSize.height > maxSize.height) { maxSize = minSize; } // compute scale factor double scale = 1; if (d.width > maxSize.width) { scale = (double) maxSize.width / d.width; } if ((scale * d.height) > maxSize.height) { scale = (double) maxSize.height / d.height; } // resize bg d = rs.getScaledSize(scale); rs.setBounds(margin, margin, d.width, d.height); // restore margins d.width += 2 * margin; d.height += 2 * margin; return d; } public static Dimension layoutDouble(Dimension desiredMaxSize, Resizable rsA, Resizable rsB, int boxGridPos, int margin) { // number of horizontally and vertically grids boolean isHLayout = false; int nbh = 1, nbv = 1; switch (boxGridPos) { case Activity.AB: case Activity.BA: nbh = 2; nbv = 1; isHLayout = true; break; case Activity.AUB: case Activity.BUA: nbh = 1; nbv = 2; isHLayout = false; break; } Rectangle2D ra = rsA.getBounds2D(); Rectangle2D rb = rsB.getBounds2D(); // optimal dimensions Dimension da = rsA.getPreferredSize(); Dimension db = rsB.getPreferredSize(); Dimension d = new Dimension(isHLayout ? da.width + db.width : Math.max(da.width, db.width), isHLayout ? Math.max(da.height, db.height) : da.height + db.height); // minimal dimensions Dimension minSizeA = rsA.getMinimumSize(); Dimension minSizeB = rsB.getMinimumSize(); Dimension minSize = new Dimension( isHLayout ? minSizeA.width + minSizeB.width : Math.max(minSizeA.width, minSizeB.width), isHLayout ? Math.max(minSizeA.height, minSizeB.height) : minSizeA.height + minSizeB.height); // maximal dimension Dimension maxSize = desiredMaxSize; // remove margins maxSize.width -= (1 + nbh) * margin; maxSize.height -= (1 + nbv) * margin; // correct maxSize if less than minSize if (minSize.width > maxSize.width || minSize.height > maxSize.height) { maxSize.setSize(minSize); } // compute scale factor double scale = 1; if (d.width > maxSize.width) { scale = (double) maxSize.width / d.width; } if ((scale * d.height) > maxSize.height) { scale = (double) maxSize.height / d.height; } // correct possible minimal infractions // ... // resize da = rsA.getScaledSize(scale); db = rsB.getScaledSize(scale); // margins to center one box relatove to the other int dah, dav, dbh, dbv; dah = db.width > da.width ? (db.width - da.width) / 2 : 0; dbh = da.width > db.width ? (da.width - db.width) / 2 : 0; dav = db.height > da.height ? (db.height - da.height) / 2 : 0; dbv = da.height > db.height ? (da.height - db.height) / 2 : 0; switch (boxGridPos) { case Activity.AB: rsA.setBounds(margin, margin + dav, da.width, da.height); rsB.setBounds(2 * margin + da.width, margin + dbv, db.width, db.height); break; case Activity.BA: rsB.setBounds(margin, margin + dbv, db.width, db.height); rsA.setBounds(2 * margin + db.width, margin + dav, da.width, da.height); break; case Activity.AUB: rsA.setBounds(margin + dah, margin, da.width, da.height); rsB.setBounds(margin + dbh, 2 * margin + da.height, db.width, db.height); break; case Activity.BUA: rsB.setBounds(margin + dbh, margin, db.width, db.height); rsA.setBounds(margin + dah, 2 * margin + db.height, da.width, da.height); break; default: rsA.setBounds((int) (margin + scale * ra.getX()), (int) (margin + scale * ra.getY()), da.width, da.height); rsB.setBounds((int) (margin + scale * rb.getX()), (int) (margin + scale * rb.getY()), da.width, da.height); break; } // recompute d adding margins Rectangle r = new Rectangle(rsA.getBounds()); r.add(rsB.getBounds()); d.width = r.width + 2 * margin; d.height = r.height + 2 * margin; return d; } } src/core/edu/xtec/jclic/boxes/BoxBase.java000066400000000000000000000243421335566474600207370ustar00rootroot00000000000000/* * File : BoxBase.java * Created : 12-dec-2000 11:28 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Constants; import edu.xtec.jclic.misc.Gradient; import edu.xtec.util.Domable; import edu.xtec.util.FontCheck; import edu.xtec.util.JDomUtility; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Stroke; import java.awt.geom.AffineTransform; /** * This class contains all the main visual attributes needed to draw * {@link edu.xtec.jclic.boxes.AbstractBox} objects: background and foreground * color and gradient, colors for special states (inactive, alternative, * disabled...), mrgins, fonts, strokes for borders, etc. Objects derived from * AbstractBox can have inheritance: boxes that act as "containers" * of other boxes (like {@link edu.xtec.jclic.boxes.BoxBag}). Most of the * attributes of BoxBase can be null, meaning that the value * of the ancestor, or a default value if the box has no ancestors, must be * taken. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class BoxBase extends Object implements Cloneable, Domable { private Font originalFont; public Color backColor; public Gradient bgGradient; public Color textColor; public Color shadowColor; public Color borderColor; public Color inactiveColor; public Color alternativeColor; public boolean shadow; public boolean transparent; public int textMargin; protected BasicStroke borderStroke, markerStroke; private Font font; private float dynFontSize; private static final float REDUCE_FONT_STEP = 1; public static final float MIN_FONT_SIZE = 8; private static int resetAllFontsCounter = 0; public static boolean flagFontReduced = false; private int resetFontCounter; public static final Stroke DEFAULT_STROKE = new BasicStroke(1); public static final Color DEFAULT_BACK_COLOR = Color.lightGray; public static final Color DEFAULT_TEXT_COLOR = Color.black; public static final Color DEFAULT_SHADOW_COLOR = Color.gray; public static final Color DEFAULT_INACTIVE_COLOR = Color.gray; public static final Color DEFAULT_ALTERNATIVE_COLOR = Color.gray; public static final Color DEFAULT_BORDER_COLOR = Color.black; public static final float DEFAULT_BORDER_STROKE_WIDTH = 0.75f; public static final BasicStroke DEFAULT_BORDER_STROKE = new BasicStroke(DEFAULT_BORDER_STROKE_WIDTH); public static final float DEFAULT_MARKER_STROKE_WIDTH = 2.75f; public static final BasicStroke DEFAULT_MARKER_STROKE = new BasicStroke(DEFAULT_MARKER_STROKE_WIDTH); // default font will be build on first call to getDefaultFont(); private static Font DEFAULT_FONT = null; public static BoxBase DEFAULT_BOX_BASE = new BoxBase(); /** Creates new BoxBase */ public BoxBase() { setFont(getDefaultFont()); dynFontSize = font.getSize2D(); backColor = DEFAULT_BACK_COLOR; bgGradient = null; textColor = DEFAULT_TEXT_COLOR; shadowColor = DEFAULT_SHADOW_COLOR; inactiveColor = DEFAULT_INACTIVE_COLOR; alternativeColor = DEFAULT_ALTERNATIVE_COLOR; borderColor = DEFAULT_BORDER_COLOR; shadow = false; transparent = false; textMargin = Constants.AC_MARGIN; resetFontCounter = resetAllFontsCounter; borderStroke = DEFAULT_BORDER_STROKE; markerStroke = DEFAULT_MARKER_STROKE; } @Override public Object clone() { BoxBase result = null; try { result = (BoxBase) super.clone(); if (bgGradient != null) result.bgGradient = (Gradient) bgGradient.clone(); result.setFont(originalFont); } catch (Exception ex) { System.err.println("Unexpected error cloning BoxBase!"); } return result; } @Override public boolean equals(Object o) { if (o == null) return false; boolean result = (o == this); if (!result && o instanceof BoxBase) { BoxBase bb = (BoxBase) o; result = originalFont.equals(bb.originalFont) && backColor.equals(bb.backColor) && ((bgGradient == null && bb.bgGradient == null) || (bgGradient != null && bgGradient.equals(bb.bgGradient))) && textColor.equals(bb.textColor) && shadowColor.equals(bb.shadowColor) && borderColor.equals(bb.borderColor) && inactiveColor.equals(bb.inactiveColor) && alternativeColor.equals(bb.alternativeColor) && shadow == bb.shadow && transparent == bb.transparent && textMargin == bb.textMargin && borderStroke.equals(bb.borderStroke) && markerStroke.equals(bb.markerStroke); } return result; } public static Font getDefaultFont() { if (DEFAULT_FONT == null) DEFAULT_FONT = FontCheck.getValidFont("Arial", Font.PLAIN, 17); return DEFAULT_FONT; } public static final String ELEMENT_NAME = "style"; public static final String COLOR = "color", FOREGROUND = "foreground", BACKGROUND = "background", SHADOW = "shadow", INACTIVE = "inactive", ALTERNATIVE = "alternative", BORDER = "border", TRANSPARENT = "transparent", MARGIN = "margin", BORDER_STROKE = "borderStroke", MARKER_STROKE = "markerStroke"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (!getDefaultFont().equals(originalFont)) e.addContent(JDomUtility.fontToElement(originalFont)); org.jdom.Element ce = new org.jdom.Element(COLOR); if (!textColor.equals(DEFAULT_TEXT_COLOR)) ce.setAttribute(FOREGROUND, JDomUtility.colorToString(textColor)); if (!backColor.equals(DEFAULT_BACK_COLOR)) ce.setAttribute(BACKGROUND, JDomUtility.colorToString(backColor)); if (!shadowColor.equals(DEFAULT_SHADOW_COLOR)) ce.setAttribute(SHADOW, JDomUtility.colorToString(shadowColor)); if (!inactiveColor.equals(DEFAULT_INACTIVE_COLOR)) ce.setAttribute(INACTIVE, JDomUtility.colorToString(inactiveColor)); if (!alternativeColor.equals(DEFAULT_ALTERNATIVE_COLOR)) ce.setAttribute(ALTERNATIVE, JDomUtility.colorToString(alternativeColor)); if (!borderColor.equals(DEFAULT_BORDER_COLOR)) ce.setAttribute(BORDER, JDomUtility.colorToString(borderColor)); if (!ce.getAttributes().isEmpty()) e.addContent(ce); if (bgGradient != null) e.addContent(bgGradient.getJDomElement()); if (shadow) e.setAttribute(SHADOW, JDomUtility.boolString(shadow)); if (transparent) e.setAttribute(TRANSPARENT, JDomUtility.boolString(transparent)); if (textMargin != Constants.AC_MARGIN) e.setAttribute(MARGIN, Integer.toString(textMargin)); if (borderStroke.getLineWidth() != DEFAULT_BORDER_STROKE_WIDTH) e.setAttribute(BORDER_STROKE, Float.toString(borderStroke.getLineWidth())); if (markerStroke.getLineWidth() != DEFAULT_MARKER_STROKE_WIDTH) e.setAttribute(MARKER_STROKE, Float.toString(markerStroke.getLineWidth())); return e; } public static BoxBase getBoxBase(org.jdom.Element e) throws Exception { BoxBase bb = new BoxBase(); bb.setProperties(e, null); return bb; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child; String s; if ((child = e.getChild(JDomUtility.FONT)) != null) { setFont(JDomUtility.elementToFont(child)); } if ((child = e.getChild(COLOR)) != null) { textColor = JDomUtility.getColorAttr(child, FOREGROUND, textColor); backColor = JDomUtility.getColorAttr(child, BACKGROUND, backColor); shadowColor = JDomUtility.getColorAttr(child, SHADOW, shadowColor); inactiveColor = JDomUtility.getColorAttr(child, INACTIVE, inactiveColor); alternativeColor = JDomUtility.getColorAttr(child, ALTERNATIVE, alternativeColor); borderColor = JDomUtility.getColorAttr(child, BORDER, borderColor); } shadow = JDomUtility.getBoolAttr(e, SHADOW, shadow); transparent = JDomUtility.getBoolAttr(e, TRANSPARENT, transparent); textMargin = JDomUtility.getIntAttr(e, MARGIN, textMargin); if ((s = e.getAttributeValue(BORDER_STROKE)) != null) setBorderWidth(Float.parseFloat(s)); if ((s = e.getAttributeValue(MARKER_STROKE)) != null) setMarkerWidth(Float.parseFloat(s)); if ((child = e.getChild(Gradient.ELEMENT_NAME)) != null) bgGradient = Gradient.getGradient(child); } public Stroke getBorder() { return borderStroke; } public float getBorderWidth() { return borderStroke.getLineWidth(); } public void setBorderWidth(float w) { borderStroke = new BasicStroke(w); } public Stroke getMarker() { return markerStroke; } public float getMarkerWidth() { return markerStroke.getLineWidth(); } public void setMarkerWidth(float w) { markerStroke = new BasicStroke(w); } public static void resetAllFonts() { resetAllFontsCounter++; } public void setFont(Font newFont) { if (newFont != null) { font = newFont; dynFontSize = font.getSize(); originalFont = font.deriveFont(new AffineTransform()); } } public void resetFont() { resetFontCounter = resetAllFontsCounter - 1; } public Font getFont() { if (resetFontCounter < resetAllFontsCounter) { resetFontCounter = resetAllFontsCounter; font = originalFont.deriveFont(new AffineTransform()); dynFontSize = font.getSize(); } return font; } public Font getOriginalFont() { return originalFont; } public float getDynFontSize() { return dynFontSize; } public boolean reduceFont() { if (dynFontSize <= MIN_FONT_SIZE) return false; flagFontReduced = true; dynFontSize -= REDUCE_FONT_STEP; font = font.deriveFont(dynFontSize); return true; } } src/core/edu/xtec/jclic/boxes/BoxConnector.java000066400000000000000000000173321335566474600220200ustar00rootroot00000000000000/* * File : BoxConector.java * Created : 14-dec-2000 10:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.util.Options; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Cursor; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.geom.Point2D; import java.awt.image.ImageObserver; import javax.swing.JComponent; /** * BoxConnector allows users to visually connect two * {@link edu.xtec.jclic.boxes.ActiveBox} objects in a * {@link edu.xtec.jclic.Activity.Panel}. There are two modes of operation: * drawing a line between an origin point (usually the point where the user * clicks on) and a destination point, or dragging the box from one location to * another. The lines can have arrows at its ending. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class BoxConnector extends Object { public static final float LINE_WIDTH = 1.5F; public static final BasicStroke BASIC_STROKE = new BasicStroke(LINE_WIDTH); public static final Color DEFAULT_LINE_COLOR = Color.black; public static final Color DEFAULT_XOR_COLOR = Color.white; public static final double ARROW_ANGLE = Math.PI / 6; public static final double ARROW_L = 10.0; public static boolean USE_XOR = true; public static boolean GROW_BUG = false; public Point2D origin; public Point2D dest; public boolean arrow; public boolean active = false; public boolean linePainted = false; public double arrow_l = ARROW_L; public double arrow_angle = ARROW_ANGLE; public Color lineColor = DEFAULT_LINE_COLOR; public Color xorColor = DEFAULT_XOR_COLOR; Point2D relativePos; ActiveBox bx; JComponent parent; public float line_width = LINE_WIDTH; /** Creates new BoxConnector */ public BoxConnector(JComponent setParent) { parent = setParent; origin = new Point2D.Double(); dest = new Point2D.Double(); arrow = false; active = false; linePainted = false; relativePos = new Point2D.Double(); } public boolean update(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { if (!active) return false; if (bx != null) { bx.setTemporaryHidden(false); bx.update(g2, dirtyRegion, io); bx.setTemporaryHidden(true); } else { drawLine(g2); linePainted = true; } return true; } public void drawLine(Graphics2D g2) { if (active) drawLine(g2, origin, dest, arrow, lineColor, xorColor, arrow_l, arrow_angle, line_width); } public void moveBy(double dx, double dy) { moveTo(new Point2D.Double(dest.getX() + dx, dest.getY() + dy)); } public void moveTo(Point2D p) { moveTo(p, false); } public void moveTo(Point2D p, boolean forcePaint) { Rectangle clipRect; if (!active || (forcePaint == false && dest.equals(p))) return; if (bx != null) { clipRect = new Rectangle((int) (p.getX() - relativePos.getX()), (int) (p.getY() - relativePos.getY()), (int) bx.width, (int) bx.height); clipRect.add(bx); bx.setLocation(new Point2D.Double(p.getX() - relativePos.getX(), p.getY() - relativePos.getY())); } else { if (forcePaint || !USE_XOR) { clipRect = new Rectangle((int) origin.getX(), (int) origin.getY(), 0, 0); clipRect.add(p); clipRect.add(dest); dest.setLocation(p); } else { Graphics2D g2 = (Graphics2D) parent.getGraphics(); if (linePainted) { drawLine(g2); } dest.setLocation(p); drawLine(g2); linePainted = true; return; } } growRect(clipRect, arrow ? (int) arrow_l : 1, arrow ? (int) arrow_l : 1); parent.repaint(clipRect); } public void begin(Point2D p) { if (active) end(); origin.setLocation(p); dest.setLocation(p); linePainted = false; active = true; parent.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } public void begin(Point2D p, ActiveBox setBox) { begin(p); bx = setBox; relativePos.setLocation(p.getX() - bx.x, p.getY() - bx.y); bx.setTemporaryHidden(true); Rectangle r = new Rectangle(bx.getBounds()); growRect(r, 1, 1); linePainted = false; parent.repaint(r); } public ActiveBox getBox() { return bx; } public void end() { if (!active) return; if (bx != null) { Rectangle r = new Rectangle(bx.getBounds()); growRect(r, 1, 1); parent.repaint(r); bx.setLocation(origin.getX() - relativePos.getX(), origin.getY() - relativePos.getY()); bx.setTemporaryHidden(false); r.setBounds(bx.getBounds()); growRect(r, 1, 1); parent.repaint(r); bx = null; relativePos.setLocation(0, 0); } else { moveTo(dest, true); } active = false; linePainted = false; parent.setCursor(null); } public static void drawLine(Graphics2D g2, Point2D origin, Point2D dest, boolean arrow) { drawLine(g2, origin, dest, arrow, DEFAULT_LINE_COLOR, DEFAULT_XOR_COLOR, ARROW_L, ARROW_ANGLE, LINE_WIDTH); } public static void drawLine(Graphics2D g2, Point2D origin, Point2D dest, boolean arrow, Color color, Color xorColor, double arrow_l, double arrowAngle, float strokeWidth) { Stroke oldStroke = g2.getStroke(); Object oldStrokeHint = g2.getRenderingHint(RenderingHints.KEY_STROKE_CONTROL); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); g2.setColor(color); if (USE_XOR && xorColor != null) g2.setXORMode(xorColor); g2.setStroke(strokeWidth == LINE_WIDTH ? BASIC_STROKE : new BasicStroke(strokeWidth)); g2.drawLine((int) origin.getX(), (int) origin.getY(), (int) dest.getX(), (int) dest.getY()); if (arrow) { double beta = Math.atan2(origin.getY() - dest.getY(), dest.getX() - origin.getX()); Point2D arp = new Point2D.Double(dest.getX() - arrow_l * Math.cos(beta + arrowAngle), dest.getY() + arrow_l * Math.sin(beta + arrowAngle)); g2.drawLine((int) dest.getX(), (int) dest.getY(), (int) arp.getX(), (int) arp.getY()); arp.setLocation(dest.getX() - arrow_l * Math.cos(beta - arrowAngle), dest.getY() + arrow_l * Math.sin(beta - arrowAngle)); g2.drawLine((int) dest.getX(), (int) dest.getY(), (int) arp.getX(), (int) arp.getY()); } if (USE_XOR && xorColor != null) g2.setPaintMode(); g2.setStroke(oldStroke); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, oldStrokeHint); } public static void checkOptions(Options options) { if (options.getBoolean(Options.JAVA141) && options.getBoolean(Options.MAC)) { USE_XOR = false; } } public static void growRect(Rectangle r, int h, int w) { if (GROW_BUG) { r.x -= w; r.width += 2 * w; r.y -= h; r.height += 2 * h; } else { r.grow(h, w); } } public static Color getXORColor(Color src) { return getXORColor(src, Color.white); } public static Color getXORColor(Color src, Color against) { return new Color(src.getRGB() ^ against.getRGB()); } } src/core/edu/xtec/jclic/boxes/Counter.java000066400000000000000000000061341335566474600210320ustar00rootroot00000000000000/* * File : Counter.java * Created : 02-apr-2001 17:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.geom.Rectangle2D; import java.awt.image.ImageObserver; import javax.swing.JComponent; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class Counter extends AbstractBox { int value; int countDown; boolean enabled; Image img; Dimension dSize; Point origin; /** Creates new Counter */ public Counter(AbstractBox parent, JComponent container, Rectangle2D r, BoxBase boxBase) { super(parent, container, boxBase); img = null; value = 0; enabled = false; setBounds(r); countDown = 0; } public void setEnabled(boolean bEnabled) { enabled = bEnabled; repaint(); } public boolean isEnabled() { return enabled; } public void setCountDown(int maxValue) { countDown = maxValue; repaint(); } public void setSource(Image setImg, Point setOrigin, Dimension setDigitSize) { img = setImg; origin = setOrigin; dSize = setDigitSize; repaint(); } public void incValue() { value++; if (enabled) repaint(); } public void setValue(int newValue) { value = newValue; if (enabled) repaint(); } public int getValue() { return value; } public boolean updateContent(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { int i, j, w, d, valr; boolean k; double marginW = (width - 3 * dSize.width) / 2; double marginH = (height - dSize.height) / 2; // Todo: implement text mode if (img == null) return false; valr = value; if (countDown > 0) valr = Math.max(0, countDown - value); valr = Math.min(999, valr); for (k = false, i = 0, j = 100; i < 3; i++, j /= 10) { if (!enabled) d = 1; else { if ((w = (valr / j) % 10) != 0) { k = true; d = 11 - w; } else d = (k == true || i == 2 ? 11 : 1); } g2.drawImage(img, (int) (x + marginW + dSize.width * i), (int) (y + marginH), (int) (x + marginW + dSize.width * (i + 1)), (int) (y + marginH + dSize.height), origin.x, origin.y + dSize.height * d, origin.x + dSize.width, origin.y + dSize.height * (d + 1), io); } return true; } } src/core/edu/xtec/jclic/boxes/JPanelActiveBox.java000066400000000000000000000117341335566474600223730ustar00rootroot00000000000000/* * File : JPanelActiveBox.java * Created : 29-may-2001 17:34 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.jclic.Activity.Panel; import edu.xtec.jclic.Constants; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.misc.Utils; import java.awt.AWTEvent; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.image.ImageObserver; import javax.swing.BorderFactory; import javax.swing.JPanel; /** * This class is a {@link javax.swing.JPanel} tha contains a single * {@link edu.xtec.jclic.boxes.ActiveBox}. It is used when the ActiveBox must be * integrated in a complex Swing container (for example, to place ActiveBoxes * into {@link javax.swing.JTextPane} objects), or when the active content of * the ActiveBox needs to be reresented into a swing panel (for example, in * boxes with HTML content or with boxes that have standard multimedia * controllers). * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class JPanelActiveBox extends JPanel { Panel parentActivityPanel = null; PlayStation ps; public ActiveBox ab; public boolean catchMouseEvents; Component mouseListener = null; ImageObserver io; /** Creates new JPanelActiveBox */ public JPanelActiveBox(AbstractBox parent, BoxBase boxBase, ImageObserver io) { super(); this.io = io; if (io instanceof Panel) { parentActivityPanel = (Panel) io; ps = parentActivityPanel.getPs(); } else if (io instanceof PlayStation) { ps = (PlayStation) io; } enableEvents(AWTEvent.MOUSE_EVENT_MASK); setBorder(BorderFactory.createEmptyBorder()); ab = new ActiveBox(parent, this, boxBase); catchMouseEvents = true; } public void notifyMouseEventsTo(Component cmp) { mouseListener = cmp; } public void setPanelParent(Panel parent) { parentActivityPanel = parent; ps = (parent == null ? null : parent.getPs()); repaint(); } public void setPlayStation(PlayStation ps) { this.ps = ps; } @Override protected void processEvent(AWTEvent e) { if (catchMouseEvents && e instanceof MouseEvent) { MouseEvent me = (MouseEvent) e; if (e.getID() == MouseEvent.MOUSE_PRESSED && ab != null && ps != null && (parentActivityPanel == null || parentActivityPanel.isPlaying())) { ps.stopMedia(1); ab.playMedia(ps); } if (mouseListener != null && (ab == null || ab.getContent().mediaContent == null || ab.getContent().mediaContent.catchMouseEvents == false)) { Point bkPt = me.getPoint(); Point pt = Utils.mapPointTo(this, bkPt, mouseListener); me.translatePoint(pt.x - bkPt.x, pt.y - bkPt.y); mouseListener.dispatchEvent(e); } me.consume(); return; } super.processEvent(e); } public JPanel setActiveBoxContent(ActiveBoxContent abc) { if (abc == null) abc = new ActiveBoxContent(); if (abc.dimension != null) ab.setBounds(0, 0, abc.dimension.width, abc.dimension.height); ab.setContent(abc); if (abc.mediaContent != null) { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } else { setCursor(null); } adjustSize(); return this; } public ActiveBoxContent getActiveBoxContent() { return ab.getContent(); } @Override public void setBounds(int x, int y, int width, int height) { super.setBounds(x, y, width, height); ab.setBounds(0, 0, width, height); } public ActiveBox getActiveBox() { return ab; } public void adjustSize() { if (ab != null) { Dimension size = ab.getBorderBounds().getSize(); setPreferredSize(size); setMaximumSize(size); } } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; RenderingHints rh = g2.getRenderingHints(); g2.setRenderingHints(Constants.DEFAULT_RENDERING_HINTS); if (ab == null) { super.paintComponent(g2); } else { while (true) { BoxBase.flagFontReduced = false; ab.update(g2, g2.getClipBounds(), io); if (!BoxBase.flagFontReduced) break; } } g2.setRenderingHints(rh); } } src/core/edu/xtec/jclic/boxes/Resizable.java000066400000000000000000000026651335566474600213400ustar00rootroot00000000000000/* * File : Resizable.java * Created : 03-oct-2001 20:17 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.geom.Rectangle2D; /** * This interface applies to all the objects that have "bounds" (location, witdh * and height) and can be resized or moved. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public interface Resizable { public Rectangle getBounds(); public Rectangle2D getBounds2D(); public Dimension getPreferredSize(); public Dimension getMinimumSize(); public Dimension getScaledSize(double scale); public void setBounds(Rectangle2D r); public void setBounds(double x, double y, double width, double height); } src/core/edu/xtec/jclic/boxes/SimpleBox.java000066400000000000000000000030521335566474600213110ustar00rootroot00000000000000/* * File : SimpleBox.java * Created : 08-oct-2001 9:37 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.image.ImageObserver; import javax.swing.JComponent; /** * This is the most simple implementation of * {@link edu.xtec.jclic.boxes.AbstractBox}. It does nor draws nothing. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class SimpleBox extends AbstractBox { /** Creates new SimpleBox */ public SimpleBox(AbstractBox parent, JComponent container, BoxBase boxBase) { super(parent, container, boxBase); } @Override public boolean update(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { return true; } public boolean updateContent(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { return true; } } src/core/edu/xtec/jclic/boxes/TextGrid.java000066400000000000000000000450711335566474600211500ustar00rootroot00000000000000/* * File : TextGrid.java * Created : 10-sep-2001 13:08 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.util.StrUtils; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.Stroke; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D.Double; import java.awt.image.ImageObserver; import javax.swing.JComponent; import javax.swing.RepaintManager; import javax.swing.Timer; /** * This class is a special {@link edu.xtec.jclic.boxes.AbstractBox} that * displays a grid of single characters. It is used in activities like * crosswords and scrambled letters. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class TextGrid extends AbstractBox implements Cloneable, Resizable, ActionListener { int nRows, nCols; char[][] chars; char[][] answers; int[][] attributes; double cellWidth; double cellHeight; Rectangle2D preferredBounds = new Double(); public char wild = TextGridContent.DEFAULT_WILD; String randomChars = TextGridContent.DEFAULT_RANDOM_CHARS; boolean cursorEnabled; boolean useCursor; Point cursor = new Point(); boolean cursorBlink; Timer cursorTimer; boolean wildTransparent; public static final int MIN_CELL_SIZE = 12, DEFAULT_CELL_SIZE = 20, MIN_INTERNAL_MARGIN = 2; public static final int NORMAL = 0, INVERTED = 1, HIDDEN = 2, LOCKED = 4, MARKED = 8, TRANSPARENT = 16; /** Creates new TextGridBox */ public TextGrid(AbstractBox parent, JComponent container, double setX, double setY, int setNcw, int setNch, double setCellW, double setCellH, BoxBase boxBase, boolean setBorder) { super(parent, container, boxBase); x = setX; y = setY; nCols = Math.max(1, setNcw); nRows = Math.max(1, setNch); cellWidth = Math.max(setCellW, MIN_CELL_SIZE); cellHeight = Math.max(setCellH, MIN_CELL_SIZE); width = cellWidth * nCols; height = cellHeight * nRows; chars = new char[nRows][nCols]; attributes = new int[nRows][nCols]; preferredBounds.setRect(getBounds()); setBorder(setBorder); cursorTimer = new Timer(500, this); cursorTimer.setRepeats(true); cursorEnabled = false; useCursor = false; wildTransparent = false; answers = null; } public static TextGrid createEmptyGrid(AbstractBox parent, JComponent container, double setX, double setY, TextGridContent tgc, boolean wildTransparent) { TextGrid result = new TextGrid(parent, container, setX, setY, tgc.ncw, tgc.nch, tgc.w, tgc.h, tgc.bb, tgc.border); result.wild = tgc.wild; result.randomChars = tgc.randomChars; result.wildTransparent = wildTransparent; return result; } public void setChars(String[] text) { answers = new char[nRows][nCols]; for (int py = 0; py < nRows; py++) { String line = py < text.length ? text[py] : null; for (int px = 0; px < nCols; px++) { chars[py][px] = (line == null || px >= line.length()) ? ' ' : line.charAt(px); answers[py][px] = chars[py][px]; } } repaint(); } public void randomize() { for (int py = 0; py < nRows; py++) for (int px = 0; px < nCols; px++) if (chars[py][px] == wild) chars[py][px] = randomChars.charAt((int) (Math.random() * randomChars.length())); repaint(); } public void setCellAttributes(boolean lockWild, boolean clearChars) { int atr = LOCKED; if (wildTransparent) atr |= TRANSPARENT; else atr |= INVERTED | HIDDEN; for (int py = 0; py < nRows; py++) for (int px = 0; px < nCols; px++) if (lockWild && chars[py][px] == wild) attributes[py][px] = atr; else { attributes[py][px] = NORMAL; if (clearChars) chars[py][px] = ' '; } repaint(); } public void setCellLocked(int px, int py, boolean locked) { if (px >= 0 && px < nCols && py >= 0 && py < nRows) { attributes[py][px] = locked ? LOCKED | (wildTransparent ? TRANSPARENT : INVERTED | HIDDEN) : NORMAL; } } public Point getItemFor(int rx, int ry) { if (!isValidCell(rx, ry)) return null; Point point = new Point(); boolean inBlack = false, startCount = false; for (int px = 0; px < rx; px++) { if ((attributes[ry][px] & LOCKED) != 0) { if (!inBlack) { if (startCount) point.x++; inBlack = true; } } else { startCount = true; inBlack = false; } } inBlack = false; startCount = false; for (int py = 0; py < ry; py++) { if ((attributes[py][rx] & LOCKED) != 0) { if (!inBlack) { if (startCount) point.y++; inBlack = true; } } else { startCount = true; inBlack = false; } } return point; } public void setCursorEnabled(boolean status) { cursorEnabled = status; if (status == true) startCursorBlink(); else stopCursorBlink(); } public void startCursorBlink() { if (useCursor && cursorEnabled && cursorTimer != null && !cursorTimer.isRunning()) { blink(1); cursorTimer.start(); } } public void stopCursorBlink() { if (cursorTimer != null && cursorTimer.isRunning()) { cursorTimer.stop(); blink(-1); } } public void moveCursor(int dx, int dy, boolean skipLocked) { if (useCursor) { Point point = findNextCellWithAttr(cursor.x, cursor.y, skipLocked ? LOCKED : NORMAL, dx, dy, false); if (!cursor.equals(point)) setCursorAt(point.x, point.y, skipLocked); } } public Point findFreeCell(Point from, int dx, int dy) { Point result = null; if (from != null && (dx != 0 || dy != 0)) { Point scan = new Point(from); while (result == null) { scan.x += dx; scan.y += dy; if (scan.x < 0 || scan.x >= nCols || scan.y < 0 || scan.y >= nRows) break; if (!getCellAttribute(scan.x, scan.y, LOCKED)) result = scan; } } return result; } public boolean isIntoBlacks(Point pt, boolean checkHorizontal) { boolean result; if (checkHorizontal) { result = (pt.x <= 0 || getCellAttribute(pt.x - 1, pt.y, LOCKED)) && (pt.x >= nCols - 1 || getCellAttribute(pt.x + 1, pt.y, LOCKED)); } else { result = (pt.y <= 0 || getCellAttribute(pt.x, pt.y - 1, LOCKED)) && (pt.y >= nRows - 1 || getCellAttribute(pt.x, pt.y + 1, LOCKED)); } return result; } public boolean isIntoWhites(Point pt, boolean checkHorizontal) { boolean result; if (checkHorizontal) { result = (pt.x > 0 && !getCellAttribute(pt.x - 1, pt.y, LOCKED)) && (pt.x < nCols - 1 && !getCellAttribute(pt.x + 1, pt.y, LOCKED)); } else { result = (pt.y > 0 && !getCellAttribute(pt.x, pt.y - 1, LOCKED)) && (pt.y < nRows - 1 && !getCellAttribute(pt.x, pt.y + 1, LOCKED)); } return result; } public Point findNextCellWithAttr(int startX, int startY, int attr, int dx, int dy, boolean attrState) { Point point = new Point(startX + dx, startY + dy); while (true) { if (point.x < 0) { point.x = nCols - 1; if (point.y > 0) point.y--; else point.y = nRows - 1; } else if (point.x >= nCols) { point.x = 0; if (point.y < nRows - 1) point.y++; else point.y = 0; } if (point.y < 0) { point.y = nRows - 1; if (point.x > 0) point.x--; else point.x = nCols - 1; } else if (point.y >= nRows) { point.y = 0; if (point.x < nCols - 1) point.x++; else point.x = 0; } if ((point.x == startX && point.y == startY) || getCellAttribute(point.x, point.y, attr) == attrState) break; point.x += dx; point.y += dy; } return point; } public void setCursorAt(int px, int py, boolean skipLocked) { stopCursorBlink(); if (isValidCell(px, py)) { cursor.x = px; cursor.y = py; useCursor = true; if (skipLocked && getCellAttribute(px, py, LOCKED)) { moveCursor(1, 0, skipLocked); } else { if (cursorEnabled) startCursorBlink(); } } } public void setUseCursor(boolean value) { useCursor = value; } public Point getCursor() { return cursor; } public int countCharsLike(char ch) { int result = 0; for (int py = 0; py < nRows; py++) for (int px = 0; px < nCols; px++) if (chars[py][px] == ch) result++; return result; } public int getNumCells() { return nRows * nCols; } public int countCoincidences(boolean checkCase) { int result = 0; if (answers != null) for (int py = 0; py < nRows; py++) for (int px = 0; px < nCols; px++) if (isCellOk(px, py, checkCase)) result++; return result; } public boolean isCellOk(int px, int py, boolean checkCase) { boolean result = false; if (isValidCell(px, py)) { char ch = chars[py][px]; if (ch != wild) { char ch2 = answers[py][px]; if (ch == ch2 || (!checkCase && Character.toUpperCase(ch) == Character.toUpperCase(ch2))) result = true; } } return result; } public Point getLogicalCoords(Point2D devicePoint) { if (!contains(devicePoint)) return null; int px = (int) ((devicePoint.getX() - getX()) / cellWidth); int py = (int) ((devicePoint.getY() - getY()) / cellHeight); if (isValidCell(px, py)) { return new Point(px, py); } else return null; } public boolean isValidCell(int px, int py) { return px < nCols && py < nRows && px >= 0 && py >= 0; } public void setCharAt(int px, int py, char ch) { if (isValidCell(px, py)) { chars[py][px] = ch; repaintCell(px, py); } } public char getCharAt(int px, int py) { if (isValidCell(px, py)) return chars[py][px]; else return ' '; } public String getStringBetween(int x0, int y0, int x1, int y1) { StringBuilder sb = new StringBuilder(); if (isValidCell(x0, y0) && isValidCell(x1, y1)) { int dx = x1 - x0; int dy = y1 - y0; if (dx == 0 || dy == 0 || Math.abs(dx) == Math.abs(dy)) { int steps = Math.max(Math.abs(dx), Math.abs(dy)); if (steps > 0) { dx /= steps; dy /= steps; } for (int i = 0; i <= steps; i++) sb.append(getCharAt(x0 + dx * i, y0 + dy * i)); } } return sb.substring(0); } public void setAttributeBetween(int x0, int y0, int x1, int y1, int attribute, boolean value) { if (isValidCell(x0, y0) && isValidCell(x1, y1)) { int dx = x1 - x0; int dy = y1 - y0; if (dx == 0 || dy == 0 || Math.abs(dx) == Math.abs(dy)) { int steps = Math.max(Math.abs(dx), Math.abs(dy)); if (steps > 0) { dx /= steps; dy /= steps; } for (int i = 0; i <= steps; i++) setAttribute(x0 + dx * i, y0 + dy * i, attribute, value); } } } public void setAttribute(int px, int py, int attribute, boolean state) { if (isValidCell(px, py)) { if (attribute == MARKED && !state) repaintCell(px, py); attributes[py][px] &= ~attribute; attributes[py][px] |= (state ? attribute : 0); if (attribute != MARKED || state) repaintCell(px, py); } } public void setAllCellsAttribute(int attribute, boolean state) { for (int py = 0; py < nRows; py++) for (int px = 0; px < nCols; px++) setAttribute(px, py, attribute, state); } public boolean getCellAttribute(int px, int py, int attribute) { if (isValidCell(px, py)) return (attributes[py][px] & attribute) != 0; else return false; } public Rectangle2D getCellRect(int px, int py) { return new Double(getX() + px * cellWidth, getY() + py * cellHeight, cellWidth, cellHeight); } public Rectangle getCellBorderBounds(int px, int py) { boolean isMarked = getCellAttribute(px, py, MARKED); if (!border && !isMarked) return getCellRect(px, py).getBounds(); BoxBase bb = getBoxBaseResolve(); Stroke strk = isMarked ? bb.getMarker() : bb.getBorder(); return strk.createStrokedShape(getCellRect(px, py)).getBounds(); } public void repaintCell(int px, int py) { JComponent jc = getContainerResolve(); if (jc != null) jc.repaint(getCellBorderBounds(px, py)); } @Override public Object clone() { TextGrid tgb = (TextGrid) super.clone(); tgb.nRows = nRows; tgb.nCols = nCols; tgb.chars = new char[nRows][nCols]; tgb.attributes = new int[nRows][nCols]; for (int i = 0; i < nRows; i++) { System.arraycopy(chars[i], 0, tgb.chars[i], 0, nCols); System.arraycopy(attributes[i], 0, tgb.attributes[i], 0, nCols); } tgb.cellWidth = cellWidth; tgb.cellHeight = cellHeight; tgb.preferredBounds = (Rectangle2D) preferredBounds.clone(); return tgb; } public Dimension getPreferredSize() { return preferredBounds.getBounds().getSize(); } public Dimension getMinimumSize() { return new Dimension(MIN_CELL_SIZE * nCols, MIN_CELL_SIZE * nRows); } public Dimension getScaledSize(double scale) { return new Dimension(StrUtils.roundTo(scale * preferredBounds.getWidth(), nCols), StrUtils.roundTo(scale * preferredBounds.getHeight(), nRows)); } @Override public void setBounds(Rectangle2D r) { super.setBounds(r); cellWidth = width / nCols; cellHeight = height / nRows; } @Override public boolean update(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { if (isEmpty() || !isVisible() || isTemporaryHidden()) return false; if (dirtyRegion != null && !shape.intersects(dirtyRegion)) return false; updateContent(g2, dirtyRegion, io); return true; } public boolean updateContent(Graphics2D g2, Rectangle dirtyRegion, ImageObserver io) { FontRenderContext frc = g2.getFontRenderContext(); BoxBase bb = getBoxBaseResolve(); // test font size FontMetrics fm = g2.getFontMetrics(bb.getFont()); boolean resize = false; while (true) { if (fm.charWidth('W') <= cellWidth - 2 * MIN_INTERNAL_MARGIN && fm.getAscent() + fm.getDescent() <= cellHeight - 2 * MIN_INTERNAL_MARGIN) break; if (bb.reduceFont() == false) break; resize = true; fm = g2.getFontMetrics(bb.getFont()); } if (resize) { JComponent jc = getContainerResolve(); if (jc != null) RepaintManager.currentManager(jc).markCompletelyDirty(jc); return true; } char[] ch = new char[1]; int attr; boolean isMarked, isInverted, isCursor; Rectangle2D boxBounds; double dx, dy; double ry = (cellHeight - fm.getDescent() + fm.getAscent()) / 2; for (int py = 0; py < nRows; py++) { for (int px = 0; px < nCols; px++) { Rectangle bxr = getCellBorderBounds(px, py); if (bxr.intersects(dirtyRegion)) { attr = attributes[py][px]; if ((attr & TRANSPARENT) == 0) { isInverted = (attr & INVERTED) != 0; isMarked = (attr & MARKED) != 0; isCursor = (useCursor && cursor.x == px && cursor.y == py); boxBounds = getCellRect(px, py); g2.setColor((isCursor && cursorBlink) ? bb.inactiveColor : isInverted ? bb.textColor : bb.backColor); g2.fill(boxBounds); g2.setColor(Color.black); if ((attr & HIDDEN) == 0) { ch[0] = chars[py][px]; if (ch[0] != 0) { dx = boxBounds.getX() + (cellWidth - fm.charWidth(ch[0])) / 2; dy = boxBounds.getY() + ry; GlyphVector gv = bb.getFont().createGlyphVector(frc, ch); if (bb.shadow) { g2.setColor(bb.shadowColor); g2.drawGlyphVector(gv, (float) (dx + bb.getDynFontSize() / 10), (float) (dy + bb.getDynFontSize() / 10)); } g2.setColor(isInverted ? bb.backColor : isAlternative() ? bb.alternativeColor : bb.textColor); g2.drawGlyphVector(gv, (float) dx, (float) dy); } } if (border || isMarked) { g2.setColor(bb.borderColor); g2.setStroke(isMarked ? bb.getMarker() : bb.getBorder()); if (isMarked) g2.setXORMode(Color.white); g2.draw(boxBounds); if (isMarked) g2.setPaintMode(); g2.setStroke(BoxBase.DEFAULT_STROKE); } g2.setColor(Color.black); } } } } return true; } public void actionPerformed(ActionEvent ev) { blink(0); } protected synchronized void blink(int status) { if (useCursor) { cursorBlink = status == 1 ? true : status == -1 ? false : !cursorBlink; repaintCell(cursor.x, cursor.y); } } @Override public void end() { if (cursorTimer != null) { cursorTimer.stop(); cursorTimer = null; } } public void finalize() throws Throwable { try { end(); } finally { super.finalize(); } } } src/core/edu/xtec/jclic/boxes/TextGridContent.java000066400000000000000000000151361335566474600225020ustar00rootroot00000000000000/* * File : TextGridContent.java * Created : 04-oct-2001 12:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.awt.Color; import java.util.Iterator; /** * This class encapsulates the content of {@link edu.xtec.jclic.boxes.TextGrid} * objects. It implements methods to set and retrieve individual characters on * the grid, and to serialize and de-serialize the content from/to XML objects. * It also contains information about the desired size and graphic properties * (font, colors, etc.) of the grid. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class TextGridContent extends Object implements Domable { public static final char DEFAULT_WILD = '*'; public static final String DEFAULT_RANDOM_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public int ncw = 1, nch = 1; public double w = TextGrid.DEFAULT_CELL_SIZE; public double h = TextGrid.DEFAULT_CELL_SIZE; public boolean border = false; public BoxBase bb = null; public String[] text = new String[1]; public char wild = DEFAULT_WILD; public String randomChars = DEFAULT_RANDOM_CHARS; /** Creates new TextGridContent */ public TextGridContent() { } public static TextGridContent initNew(int ncw, int nch, char firstChar) { TextGridContent result = new TextGridContent(); result.ncw = ncw; result.nch = nch; result.text = new String[nch]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < nch; i++) { sb.setLength(0); for (int j = 0; j < ncw; j++) sb.append(firstChar++); result.text[i] = sb.toString(); } result.bb = new BoxBase(); result.bb.backColor = Color.white; result.border = true; return result; } public static final String ELEMENT_NAME = "textGrid"; public static final String ROWS = "rows", COLUMNS = "columns", CELL_WIDTH = "cellWidth", CELL_HEIGHT = "cellHeight", BORDER = "border", ROW = "row", TEXT = "text", WILD = "wild", RANDOM_CHARS = "randomChars"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); org.jdom.Element child; // --------------------------------------------------------------------- // May 2015 // WARNING: The number of rows (nch) is stored as "columns", and the number // of columns (ncw) as "rows". By now, this bug will not be corrected to avoid // problems with already existing JClic packages. e.setAttribute(ROWS, Integer.toString(ncw)); e.setAttribute(COLUMNS, Integer.toString(nch)); // --------------------------------------------------------------------- e.setAttribute(CELL_WIDTH, Double.toString(w)); e.setAttribute(CELL_HEIGHT, Double.toString(h)); e.setAttribute(BORDER, JDomUtility.boolString(border)); if (wild != DEFAULT_WILD) e.setAttribute(WILD, String.copyValueOf(new char[] { wild })); if (!DEFAULT_RANDOM_CHARS.equals(randomChars)) e.setAttribute(RANDOM_CHARS, randomChars); if (bb != null) e.addContent(bb.getJDomElement()); child = new org.jdom.Element(TEXT); for (int i = 0; i < nch; i++) { if (i < text.length) child.addContent(new org.jdom.Element(ROW).setText(text[i])); } e.addContent(child); return e; } public static TextGridContent getTextGridContent(org.jdom.Element e) throws Exception { TextGridContent tgc = new TextGridContent(); tgc.setProperties(e, null); return tgc; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child, child2; JDomUtility.checkName(e, ELEMENT_NAME); ncw = JDomUtility.getIntAttr(e, ROWS, ncw); nch = JDomUtility.getIntAttr(e, COLUMNS, nch); w = JDomUtility.getDoubleAttr(e, CELL_WIDTH, w); h = JDomUtility.getDoubleAttr(e, CELL_HEIGHT, h); if (ncw < 1 || nch < 1 || w < 1 || h < 1) throw new IllegalArgumentException("Invalid TextGridContent attributes!"); String s = e.getAttributeValue(WILD); if (s != null && s.length() > 0) wild = s.charAt(0); randomChars = JDomUtility.getStringAttr(e, RANDOM_CHARS, randomChars, false); border = JDomUtility.getBoolAttr(e, BORDER, border); if ((child = e.getChild(BoxBase.ELEMENT_NAME)) != null) bb = BoxBase.getBoxBase(child); if ((child = e.getChild(TEXT)) != null) { text = new String[nch]; Iterator itr = child.getChildren(ROW).iterator(); int i = 0; while (itr.hasNext()) { child2 = ((org.jdom.Element) itr.next()); text[i++] = child2.getText(); } for (; i < nch; i++) text[i] = ""; } } public void completeText() { char[] emptyLineChars = new char[ncw]; for (int i = 0; i < ncw; i++) emptyLineChars[i] = wild; String[] result = new String[nch]; for (int i = 0; i < nch; i++) { StringBuilder sb = new StringBuilder(); if (i < text.length) { char[] txch = text[i].toCharArray(); sb.append(txch, 0, Math.min(txch.length, ncw)); int l = sb.length(); if (l < ncw) sb.append(emptyLineChars, 0, ncw - l); result[i] = sb.substring(0); } else result[i] = String.copyValueOf(emptyLineChars); } text = result; } public int countWildChars() { int result = 0; completeText(); if (text != null) for (int y = 0; y < nch; y++) for (int x = 0; x < ncw; x++) if (text[y].charAt(x) == wild) result++; return result; } public int getNumChars() { return ncw * nch; } public void setCharAt(int x, int y, char ch) { if (x >= 0 && x < ncw && y >= 0 && y < nch) { StringBuilder sb = new StringBuilder(text[y]); sb.setCharAt(x, ch); text[y] = sb.substring(0); } } public void copyStyleTo(TextGridContent tgc) { if (tgc != null) { tgc.w = w; tgc.h = h; tgc.border = border; tgc.bb = bb; } } } src/core/edu/xtec/jclic/boxes/ThumbsExplorerPanel.java000066400000000000000000000332641335566474600233620ustar00rootroot00000000000000/* * File : ThumbsExplorerPanel.java * Created : 11-feb-2004 11:44 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.boxes; import edu.xtec.util.LFUtil; import java.awt.AWTEvent; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.font.FontRenderContext; import java.awt.font.TextHitInfo; import java.awt.font.TextLayout; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.event.EventListenerList; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * This class is a {@link javax.swing.JPanel} that contains a set of * {@link edu.xtec.jclic.boxes.ThumbsExplorerPanel.ThumbElement} objects. * Elements are displayed into a grid of rectangular cells of same size, * distributed from left to right and top to bottom. It provides methods to * select a specific ThumbElement, and has a * {@link javax.swing.event.EventListenerList} used to notify observers about * selection changes. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.13 */ public class ThumbsExplorerPanel extends JPanel { public static final int DEFAULT_THUMB_WIDTH = 90; public static final int DEFAULT_THUMB_HEIGHT = 90; public static final int DEFAULT_THUMB_MARGIN = 14; public static final int DEFAULT_TEXT_HEIGHT = 14; public static final int DEFAULT_THUMB_INTERNAL_MARGIN = 2; protected static BasicStroke BORDER_STROKE = new BasicStroke(0.2F); protected int th_width, th_height, th_margin, th_textHeight, th_int_margin; protected Font font; private List elements; private ThumbElement current; private int elementsPerRow; private EventListenerList listenersList; public Dimension maxThumbSize; public Dimension boxSize; /** Creates a new instance of ThumbsExplorerPanel */ public ThumbsExplorerPanel() { setLayout(null); elements = new ArrayList(); listenersList = new EventListenerList(); setSizes(DEFAULT_THUMB_WIDTH, DEFAULT_THUMB_HEIGHT, DEFAULT_THUMB_MARGIN, DEFAULT_TEXT_HEIGHT, DEFAULT_THUMB_INTERNAL_MARGIN); setPreferredSize(new Dimension(3 * boxSize.width, boxSize.height)); setFont(new Font("Dialog", Font.PLAIN, 12)); setBackground(LFUtil.getColor("Table.background", Color.lightGray)); elementsPerRow = 1; enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK); } public void setSizes(int th_width, int th_height, int th_margin, int th_textHeight, int th_int_margin) { this.th_width = Math.max(10, th_width); this.th_height = Math.max(10, th_height); this.th_margin = Math.max(5, th_margin); this.th_textHeight = Math.max(10, th_textHeight); this.th_int_margin = Math.max(0, th_int_margin); boxSize = new Dimension(th_width + 2 * th_margin, th_height + th_textHeight + 2 * th_margin); maxThumbSize = new Dimension(th_width - 2 * th_int_margin, th_height - 2 * th_int_margin); for (int i = 0; i < elements.size(); i++) { getThumbElement(i).sizeImage(); } invalidate(); } public void resizeTo(int desiredWidth) { int numElements = elements.size(); int w = Math.max(boxSize.width, desiredWidth); int bpr = w / boxSize.width; int numRows = (numElements / bpr) + 1; int h = numRows * boxSize.height; setPreferredSize(new Dimension(w, h)); revalidate(); repaint(); } public ThumbElement getThumbElement(int p) { return elements.get(p); } public ThumbElement[] getThumbElements() { return elements.toArray(new ThumbElement[elements.size()]); } public ThumbElement getElementFor(Object object) { ThumbElement result = null; for (int i = 0; i < elements.size(); i++) { if (getThumbElement(i).getUserObject() == object) { result = getThumbElement(i); break; } } return result; } public int getThumbElementCount() { return elements.size(); } public void removeThumbElementAt(int p) { if (elements != null) { ThumbElement o = elements.get(p); if (o != null) { if (o == current) current = null; elements.remove(p); invalidate(); } } } public void removeAllThumbElements() { elements.clear(); current = null; invalidate(); repaint(); } public ThumbElement addThumbElement(int p, Object userObject, ImageIcon img, String text) { ThumbElement th = new ThumbElement(userObject, img, text); if (p >= 0) elements.add(p, th); else elements.add(th); invalidate(); return th; } public ThumbElement addThumbElement(Object userObject, ImageIcon img, String text) { return addThumbElement(-1, userObject, img, text); } /** * Getter for property current. * * @return Value of property current. */ public ThumbElement getCurrent() { return current; } public Object getCurrentObject() { return current == null ? null : current.getUserObject(); } /** * Setter for property current. * * @param th New value of {@link #current}. */ public void setCurrent(ThumbElement th) { if (current != null) { Rectangle r = getRectFor(getIndexOf(current)); if (r != null) repaint(r); } if (th != null && elements.contains(th)) { current = th; Rectangle r = getRectFor(getIndexOf(current)); if (r != null) repaint(r); scrollRectToVisible(r); } else current = null; } public void checkCurrentVisibility() { if (current != null) { Rectangle r = getRectFor(getIndexOf(current)); if (r != null) scrollRectToVisible(r); } } public void setCurrentObject(Object o) { ThumbElement th = null; for (int i = 0; i < elements.size(); i++) { if (getThumbElement(i).getUserObject() == o) { th = getThumbElement(i); break; } } setCurrent(th); } /** * Getter for property font. * * @return Value of property font. */ @Override public Font getFont() { return font; } /** * Setter for property font. * * @param font New value of property font. */ @Override public void setFont(Font font) { this.font = font; repaint(); } public int getIndexOf(ThumbElement th) { return th == null ? -1 : elements.indexOf(th); } public Rectangle getRectFor(int p) { Rectangle r = null; if (p >= 0 && p < elements.size()) { r = new Rectangle(boxSize); r.x = (p % elementsPerRow) * r.width; r.y = (p / elementsPerRow) * r.height; } return r; } @Override public void doLayout() { Dimension d = getPreferredSize(); int w = Math.max(d.width, boxSize.width); elementsPerRow = w / boxSize.width; /* * ELIMINATED DUE TO RECURSIVE CALLS IN 1.4 TEST IN 1.3.1 * * int nRows=elements.size()/elementsPerRow+1; int h=nRows*boxSize.height; * if(getHeight()!=h) setBounds(getX(), getY(), w, h); */ } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; Rectangle clip = g2.getClipBounds(); Rectangle r = new Rectangle(boxSize); for (int i = 0; i < elements.size(); i++) { r.x = (i % elementsPerRow) * r.width; r.y = (i / elementsPerRow) * r.height; if (r.intersects(clip)) { getThumbElement(i).paint(g2, r); } } } public void addActionListener(ActionListener l) { listenersList.add(ActionListener.class, l); } public void removeActionListener(ActionListener l) { listenersList.remove(ActionListener.class, l); } protected void fireActionPerformed() { ActionEvent actionEvent = new ActionEvent(current, ActionEvent.ACTION_PERFORMED, ""); Object[] listeners = listenersList.getListeners(ActionListener.class); for (Object lst : listeners) { ((ActionListener) lst).actionPerformed(actionEvent); } } public void addListSelectionListener(ListSelectionListener l) { listenersList.add(ListSelectionListener.class, l); } public void removeListSelectionListener(ListSelectionListener l) { listenersList.remove(ListSelectionListener.class, l); } protected void fireSelectionChanged(int index) { ListSelectionEvent listEvent = new ListSelectionEvent(current, index, index, false); Object[] listeners = listenersList.getListeners(ListSelectionListener.class); for (Object lst : listeners) { ((ListSelectionListener) lst).valueChanged(listEvent); } } @Override protected void processMouseEvent(MouseEvent ev) { if (isEnabled() && ev.getID() == MouseEvent.MOUSE_RELEASED) { int p = (ev.getX() / boxSize.width) + elementsPerRow * (ev.getY() / boxSize.height); if (p < elements.size()) { if (ev.getClickCount() == 1) { setCurrent(getThumbElement(p)); fireSelectionChanged(p); } else if (ev.getClickCount() == 2 /* && current==getThumbElement(p) */) { fireActionPerformed(); } } } } @Override protected void processKeyEvent(KeyEvent e) { } public class ThumbElement { ImageIcon image; String text; Object userObject; /** Creates a new instance of ThumbElement */ ThumbElement(Object userObject, ImageIcon image, String text) { setUserObject(userObject); setImage(image); setText(text); } /** * Getter for property userObject. * * @return Value of property userObject. */ public java.lang.Object getUserObject() { return userObject; } /** * Setter for property userObject. * * @param userObject New value of property userObject. */ public void setUserObject(java.lang.Object userObject) { this.userObject = userObject; } /** * Getter for property text. * * @return Value of property text. */ public java.lang.String getText() { return text; } /** * Setter for property text. * * @param text New value of property text. */ public void setText(java.lang.String text) { this.text = text; } /** * Getter for property image. * * @return Value of property image. */ public ImageIcon getImage() { return image; } /** * Setter for property image. * * @param image New value of property image. */ public void setImage(ImageIcon image) { this.image = image; if (image != null) sizeImage(); } protected void sizeImage() { if (image != null) { int w = image.getIconWidth(); int h = image.getIconHeight(); if (w > maxThumbSize.width || h > maxThumbSize.height) { double f = Math.min((double) maxThumbSize.width / w, (double) maxThumbSize.height / h); image = new ImageIcon(image.getImage().getScaledInstance((int) (f * w), (int) (f * h), Image.SCALE_SMOOTH)); } } } protected void paint(Graphics2D g2, Rectangle r) { g2.setBackground(LFUtil.getColor("Table.background", Color.white)); g2.clearRect(r.x, r.y, r.width, r.height); if (current == this) { Rectangle r2 = new Rectangle(r.x + th_margin / 2, r.y + th_margin / 2, r.width - th_margin, r.height - th_margin); g2.setColor(LFUtil.getSysColor("activeCaption", Color.orange)); g2.fill(r2); g2.setColor(LFUtil.getSysColor("activeCaptionBorder", Color.red)); g2.draw(r2); } if (image != null) { image.paintIcon(ThumbsExplorerPanel.this, g2, r.x + ((th_width + 2 * th_margin) - image.getIconWidth()) / 2, r.y + ((th_height + 2 * th_margin) - image.getIconHeight()) / 2); } g2.setColor(LFUtil.getColor("Table.gridColor", Color.gray)); g2.setStroke(BORDER_STROKE); g2.drawRect(r.x + th_margin, r.y + th_margin, th_width, th_height); if (text != null && text.length() > 0) { if (current == this) g2.setColor(LFUtil.getSysColor("activeCaptionText", Color.black)); else g2.setColor(LFUtil.getColor("Table.foreground", Color.black)); FontRenderContext frc = g2.getFontRenderContext(); Font f2 = LFUtil.getFont("Table.font", font); TextLayout layout = new TextLayout(text, f2, frc); Rectangle2D txRect = layout.getBounds(); if (layout.getBounds().getWidth() > th_width) { TextHitInfo hitInfo = layout.hitTestChar(th_width - 20, 0); int insPoint = hitInfo.getInsertionIndex(); if (insPoint > 0) { layout = new TextLayout(text.substring(0, insPoint) + "...", f2, frc); txRect = layout.getBounds(); } } layout.draw(g2, (float) r.x + th_margin + (th_width - (float) txRect.getWidth()) / 2, (float) r.y + 2 * th_margin + th_height); } } } } src/core/edu/xtec/jclic/clic3/000077500000000000000000000000001335566474600164215ustar00rootroot00000000000000src/core/edu/xtec/jclic/clic3/Clic3.java000066400000000000000000000403351335566474600202260ustar00rootroot00000000000000/* * File : Clic3.java * Created : 30-oct-2000 20:45 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.clic3; import edu.xtec.jclic.Activity; import edu.xtec.jclic.bags.ActivityBag; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.bags.ActivitySequenceJump; import edu.xtec.jclic.bags.ConditionalJumpInfo; import edu.xtec.jclic.bags.JumpInfo; import edu.xtec.jclic.bags.MediaBagElement; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.fileSystem.PCCFileSystem; import edu.xtec.jclic.project.JClicProject; import java.awt.Color; import java.util.ArrayList; /** * Constants and miscellaneous functions useful to read Clic 3.0 files and * import it into JClic projects. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public abstract class Clic3 { // CONSTANTS OF CLIC 3.0 // public static final int CLICVER = 120; public static final String CLICSTR = "CLIC120"; protected static final String BLANK = ""; protected static final String COMMA = ","; protected static final Color DEFAULT_BACK_COLOR = new Color(0xC0, 0xC0, 0xC0); protected static final Color DEFAULT_COLOR_USUARI_0 = Color.blue; protected static final Color DEFAULT_COLOR_USUARI_1 = DEFAULT_BACK_COLOR; protected static final Color DEFAULT_COLOR_ERROR_0 = Color.white; protected static final Color DEFAULT_COLOR_ERROR_1 = Color.red; protected static final TripleColor DEFAULT_TRIPLE_COLOR = new TripleColor(Color.white, Color.black, Color.gray, false); // Extensions public static final String extName[] = { "*.BMP", "*.GIF", "*.TXT", "*.PUZ", "*.SOP", "*.ASS", "*.CRW", "*.TXA", "*.PAC", "*.PCC", "*.P?C", "*.HLP", "*.MVB", "*.EXE", "*.MID", "*.WAV", "*.JPG", "*.PNG", BLANK }; public static final int EXT_BMP = 0, EXT_GIF = 1, EXT_TXT = 2, EXT_PUZ = 3, EXT_SOP = 4, EXT_ASS = 5, EXT_CRW = 6, EXT_TXA = 7, EXT_PAC = 8, EXT_PCC = 9, EXT_PCG = 10, EXT_HLP = 11, EXT_MVB = 12, EXT_EXE = 13, EXT_MID = 14, EXT_WAV = 15, EXT_JPG = 16, EXT_PNG = 17, UNKNOWN_EXT = 18, NO_EXT = -1; protected static final int MAXCW = 20, MAXCH = 20; protected static final int MAXGW = 21, MAXGH = 10; // PlayModes public static final int NONE = 0, PUZZLE = 1, SOPA = 2, ASSOCIA = 3, CREUATS = 4, TEXTACT = 5; // PuzModes public static final int INTERC = 0, FORAT = 1, DOBLE = 2, MEMORY = 3; // AssModes public static final int NORMAL = 0, ESPECIAL = 1, EXPLORA = 2, INFO = 3, IDENTIFICA = 4, ESCRIU = 5; // TxActModes public static final int FORATS = 0, COMPTEXT = 1, IDLLETRES = 2, IDPARAULES = 3, BPARAULES = 4, BPARAGRAFS = 5; // GraPositions public static final int AB = 0, BA = 1, AUB = 2, BUA = 3; public static final int DEF_TXTCASW = 140, DEF_TXTCASH = 100, DEF_CICLES = 30; public static final int NEGRE = 160; public static final char COMODI = '*'; public static final char SEPARADOR = ';'; public static final byte ENDDESC_BYTE = -121; // 0x87 // public static final char ENDDESC = '\u0000'; public static final char ENDDESC = '\u2021'; public static final char CHBLOCK = '\u008E'; public static final char CHINC = '\u008F'; public static final char SEP = '\u0090'; /* * Constants used in Clic 3.0 not needed in JClic * * WM_USERIDS WM_PLAYW=WM_USER, WM_HELPW, WM_CBNEXT, WM_CBPREV, WM_CBGETFOCUS, * WM_NOUINTENT}; * * enum USERMESSAGES {PLAYW_RESIZE, PLAYW_ENDGAME, PLAYW_INTENT, PLAYW_ENCERTS, * PLAYW_WAITMEIN, PLAYW_SETMESS, PLAYW_SETMESSPLAY, HELPW_ITEMSEL, * HELPW_MOUSE}; * * public static final int WDIGIT = 13, HDIGIT = 23; public static final int * MARGE = 6; public static final int BOTOW = 63, BOTOW2 = 30, BOTOH = 39; * * public static final int DIGITSW = 39, DIGITSH = 23; * * public static final int CTRLH = 39; // era 41 public static final int CTRLW = * 450; * * public static final int CLW = (3*MARGE+BOTOW+CTRLW); public static final int * CLH = (6*BOTOH+7*MARGE); * * public static final int PLWW = CTRLW; public static final int PLWH = * (CLH-CTRLH-3*MARGE); * * public static final int LMAXRFTXT = 512; * * String resources (to be revised!) public static final int IDS_ERRFMT = 1; * * Common variables * * public static int passos, passos0; public static int gAjVis, encertsNow; * public static boolean quick, quick0, arrossega, arrossega0, sonor0, * autoCursor, cursorGran; public static boolean doReportFile, drf0, exitDirect; * public static boolean helponhelp, menus; public static boolean allowNewUsr, * allowNewGrp, showUserReports; public static int caretVis, caretX, caretY, * caretW, caretH, autoCursorDelay; public static final Font logFont1 = new * Font("Arial", 0, 12); public static int gruixfil; * * public static String clicPath = ""; public static String ediText = ""; public * static String ediGraf = ""; public static String originalPath = ""; public * static String playerId = ""; public static String iniFile = ""; public static * String dbFile = ""; public static String originalDbFile = ""; public static * String fileName0 = ""; * * extern char cdUnit; public static String lastExt = " "; */ public static int getExt(String fileName) { int begExt; String ext; int i; if (fileName == null || fileName.length() == 0) return UNKNOWN_EXT; if ((begExt = fileName.indexOf(' ')) < 0) begExt = fileName.length() - 1; for (; begExt > 0; begExt--) if (fileName.charAt(begExt) == '.') break; if (begExt == 0 || fileName.length() - begExt < 4) return UNKNOWN_EXT; ext = "*" + fileName.substring(begExt, begExt + 4).toUpperCase(); for (i = 0; i < UNKNOWN_EXT; i++) if (ext.equals(extName[i])) break; if (i == EXT_JPG || i == EXT_PNG) i = EXT_GIF; return i; } public static boolean isClic3Extension(int ext) { return ext == EXT_PUZ || ext == EXT_ASS || ext == EXT_SOP || ext == EXT_CRW || ext == EXT_TXA; } public static int parseIntX(String s) { return parseIntX(s, 10); } public static int parseIntX(String s, int radix) { int v; try { v = Integer.parseInt(s, radix); } catch (NumberFormatException e) { v = 0; } return v; } protected static int correctColor(int color) { return (color & 0xFF) << 16 | (color & 0xFF00) | (color & 0xFF0000) >> 16; } private static final String[] strArray = { "FFFFFF", "000000", "808080", "C0C0C0", "0000FF", "00FF00", "FF0000" }; private static final Color[] colorArray = { Color.white, Color.black, Color.gray, DEFAULT_BACK_COLOR, Color.red, Color.green, Color.blue }; protected static Color strToColor(String st) { if (st == null) return Color.black; if (st.length() > 6) st = st.substring(st.length() - 6); for (int i = 0; i < strArray.length; i++) if (st.equals(strArray[i])) return colorArray[i]; return new Color(correctColor(parseIntX(st, 16))); } public static boolean copyArray(String[] dest, int indest, String[] source, int insource, int e, boolean upper) { int i, d, s; for (i = 0, d = indest, s = insource; i < e; i++, d++, s++) { if ((dest[d] = source[s]) == null) break; if (upper) dest[d] = dest[d].toUpperCase(); } return (i == e); } public static void readPccFile(JClicProject project) throws Exception { String name; byte[] bytes; MediaBagElement mbe; int i, j; if (!(project.getFileSystem() instanceof PCCFileSystem)) throw new Exception("FileSystem is not PCCFileSystem!"); PCCFileSystem pccfs = (PCCFileSystem) project.getFileSystem(); for (i = 0; i < pccfs.numFiles; i++) { name = pccfs.getEntryName(i); switch (getExt(name)) { case EXT_PAC: addPacToSequence(project, name); break; case EXT_ASS: case EXT_PUZ: case EXT_SOP: case EXT_CRW: case EXT_TXA: addActivityToBag(project, name /* , pccfs */); break; default: // do nothing; } } } private static int gcCounter = 0; public static void addActivityToBag(JClicProject project, String name) throws Exception { ActivityBag ab = project.activityBag; String normalizedName = FileSystem.stdFn(name); if (ab.getElementByName(normalizedName) != null) return; Clic3Activity c3a = new Clic3Activity(project); try { c3a.load(normalizedName, project.getFileSystem().getBytes(normalizedName)); } catch (Exception e) { System.err.println("Error loading " + normalizedName + "\n" + e); throw e; } switch (c3a.actMode) { case ASSOCIA: switch (c3a.puzMode) { case INFO: c3a.className = "edu.xtec.jclic.activities.panels.InformationScreen"; break; case NORMAL: c3a.className = "edu.xtec.jclic.activities.associations.SimpleAssociation"; break; case ESPECIAL: c3a.className = "edu.xtec.jclic.activities.associations.ComplexAssociation"; break; case IDENTIFICA: c3a.className = "edu.xtec.jclic.activities.panels.Identify"; break; case EXPLORA: c3a.className = "edu.xtec.jclic.activities.panels.Explore"; break; case ESCRIU: c3a.className = "edu.xtec.jclic.activities.text.WrittenAnswer"; break; } break; case PUZZLE: switch (c3a.puzMode) { case INTERC: c3a.className = "edu.xtec.jclic.activities.puzzles.ExchangePuzzle"; break; case DOBLE: c3a.className = "edu.xtec.jclic.activities.puzzles.DoublePuzzle"; break; case MEMORY: c3a.className = "edu.xtec.jclic.activities.memory.MemoryGame"; break; case FORAT: c3a.className = "edu.xtec.jclic.activities.puzzles.HolePuzzle"; break; } break; case SOPA: c3a.className = "edu.xtec.jclic.activities.textGrid.WordSearch"; break; case CREUATS: c3a.className = "edu.xtec.jclic.activities.textGrid.CrossWord"; break; case TEXTACT: switch (c3a.puzMode) { case FORATS: c3a.className = "edu.xtec.jclic.activities.text.FillInBlanks"; break; case COMPTEXT: c3a.className = "edu.xtec.jclic.activities.text.Complete"; break; case IDLLETRES: case IDPARAULES: c3a.className = "edu.xtec.jclic.activities.text.Identify"; break; case BPARAULES: case BPARAGRAFS: c3a.className = "edu.xtec.jclic.activities.text.Order"; break; } break; default: throw new IllegalArgumentException("Unknown Clic3 activity!"); } // WARNING: ab.addActivity(Activity.getActivity(c3a, project)); // clear memory project.mediaBag.clearData(); // force a gc every 50 activities if ((++gcCounter % 50) == 0) System.gc(); } public static void addPacToSequence(JClicProject project, String name) throws Exception { String normalizedName = FileSystem.stdFn(name); if (project.activitySequence.getElementByTag(normalizedName, false) != null) return; FileSystem fs = project.getFileSystem(); Clic3Pac c3p = new Clic3Pac(); try { c3p.load(normalizedName, fs.getBytes(normalizedName)); } catch (Exception e) { System.err.println("Error loading " + normalizedName + "\n" + e); throw e; } for (int i = 0; i < c3p.nActs; i++) { ActivitySequenceElement ase = new ActivitySequenceElement(c3p.acts[i], c3p.lapToPass, c3p.noPassButtons ? ActivitySequenceElement.NAV_NONE : ActivitySequenceElement.NAV_BOTH); if (i == 0) { ase.backJump = new ActivitySequenceJump(JumpInfo.STOP); ase.setTag(normalizedName); ase.setDescription(c3p.fileDesc != null && c3p.fileDesc.length() > 0 ? c3p.fileDesc : null); } if (i == c3p.nActs - 1) { ActivitySequenceJump asj = new ActivitySequenceJump(JumpInfo.STOP); if (c3p.def == true && c3p.chDef != null && getExt(c3p.chDef) == EXT_PAC) { asj.action = JumpInfo.JUMP; asj.sequence = fs.getCanonicalNameOf(c3p.chDef); if (c3p.sup) { asj.setConditionalJump(new ConditionalJumpInfo(JumpInfo.JUMP, fs.getCanonicalNameOf(c3p.chSup), c3p.supP, c3p.supTFlag ? c3p.supT : -1), true); } if (c3p.inf) { asj.setConditionalJump(new ConditionalJumpInfo(JumpInfo.JUMP, fs.getCanonicalNameOf(c3p.chInf), c3p.infP, c3p.infTFlag ? c3p.infT : -1), false); } } ase.fwdJump = asj; } project.activitySequence.add(ase); } } public static final String ansiChars = "\u20ac\u0081\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152" + "\u008d\u008e\u008f\u0090\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122" + "\u0161\u203a\u0153\u009d\u009e\u0178"; public static final String convertFileChars = "e__f______s_c_z__________ts_o_zy_icl_y_s_ca___r_o_23__p__10_423_aaaaaaa" + "ceeeeiiiidnooooox0uuuuy_baaaaaaaceeeeiiiionooooo_0uuuuy_y"; // 0x80 is Euro: 20ac // bytes used: // ENDDESC 0x87 ('\u2021') // CHBLOCK 0x8E (not used) // CHINC 0x8F (not used) // SEP ? 0x90 (not used) public static String bufferToString(byte[] buffer) { if (buffer == null || buffer.length == 0) return BLANK; char[] result = new char[buffer.length]; int v; for (int i = 0; i < buffer.length; i++) { v = buffer[i] & 0x00FF; if (v < 128 || v >= 160) // warning: direct map from int to char result[i] = (char) v; else result[i] = ansiChars.charAt(v - 128); } return new String(result); } public static String[] dataToArray(byte[] data) { ArrayList v = new ArrayList(); int i, j, k, l, l2; byte[] buffer; String[] array; int nLines = 0; l = data.length; for (i = 0, j = 0; i < l;) { for (; j < l; j++) if (data[j] == 0x0D || data[j] == 0x0A) break; l2 = j - i; if (l2 > 0) { buffer = new byte[l2]; for (k = 0; k < l2; k++) buffer[k] = data[i + k]; v.add(bufferToString(buffer)); } else v.add(BLANK); nLines++; if (j < l && data[++j] == 0x0A) j++; i = j; } if (nLines > 0) { array = new String[nLines]; try { array = v.toArray(array); } catch (ArrayStoreException e) { array = null; } } else array = null; return array; } public static final String validFileChars = ".:\\_!~0123456789abcdefghijklmnopqrstuvwxyz"; public static String validFileName(String name, boolean strict, boolean remember) { if (name == null) return null; StringBuilder sb = new StringBuilder(); for (char ch : name.toCharArray()) { if (validFileChars.indexOf(ch, strict ? 3 : 0) < 0) { if (ch >= 'A' && ch <= 'Z') ch = Character.toLowerCase(ch); else if (ch == '/') ch = '\\'; else { int k = ansiChars.indexOf(ch); if (k >= 0) ch = convertFileChars.charAt(k); else ch = '_'; } } sb.append(ch); } String result = sb.substring(0); if (remember && !result.equals(name)) { FileSystem.altFileNames.put(result, name); } return result; } public static String validFileName(String name) { return validFileName(name, false, true); } public static String pacNameToLowerCase(String s) { String result = s; if (s != null) { String l = s.toLowerCase(); if (l.endsWith(".pac") || l.endsWith(".pcc")) result = l; } return result; } } src/core/edu/xtec/jclic/clic3/Clic3Activity.java000066400000000000000000000722511335566474600217450ustar00rootroot00000000000000/* * File : Clic3Activity.java * Created : 30-oct-2000 20:45 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.clic3; import edu.xtec.jclic.boxes.ActiveBagContent; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.media.MediaContent; import edu.xtec.jclic.project.JClicProject; import edu.xtec.jclic.shapers.HolesMaker; import edu.xtec.jclic.shapers.Rectangular; import edu.xtec.jclic.shapers.Shaper; import edu.xtec.util.FontCheck; import edu.xtec.util.JDomUtility; import edu.xtec.util.StrUtils; import java.awt.Color; import java.awt.Font; import java.awt.Point; import java.util.StringTokenizer; /** * This class encapsulates the main properties of a Clic 3.0 activity, and * provides methods to load it from a data stream and to convert it to a JClic * {@link edu.xtec.jclic.Activity}. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class Clic3Activity extends Clic3 { public JClicProject project; public static final int TOO_MUCH_CELLS = 14; private static final Boolean BF = false; public String rPath = null; public String className = null; public String fileName; public String[] fileNameCont = new String[3]; public int actMode, puzMode, graPos; public int ncw, nch; public int nctxw, nctxh; public int txtCW, txtCH, txtCW2, txtCH2; public int[] ntags = new int[2]; public int[] cont = new int[3]; public boolean[] bar = new boolean[2]; public boolean[] delim = new boolean[2]; public boolean stretch; public String initMess; public String endMess; public String fileDesc; public String custHelpFile; public String hlpTopic; public String[][] tags = new String[2][]; public String[] graTxt; public int[] nLines = new int[3]; public int[] ass = new int[MAXCW * MAXCH]; public boolean mAss, invAss, shHelp, shPuz, sol; public boolean okToNext, btCorregir; public boolean avCont, avMaj, avAcc, avDblSpc, avPunt, avLletra, brPar, avNoSalta; public boolean noBV, shDisk, shPrint, shPorta, barraAmunt, noAv; public boolean custHlp, tileBmp, pwTransp, pwrp; public int pwrx, pwry; public int avPrevHelp, avTimePH, tabSpc; public int avScope, avMaxScope; public Font[] logF = new Font[4]; public TripleColor[] colors = new TripleColor[4]; public Color[] colorFons = new Color[2]; public Color[] colorUsuari = new Color[2]; public Color[] colorError = new Color[2]; public boolean useDLL; public String rgDLL; public byte[] dllOptions; public boolean[] comptadors = new boolean[3]; public boolean marcs; public int btTipus; public String txBase; public String txBtCorregir; public String txPrev; public String bmpFons; public String initMessPrev; public String actd; /** Creates new Clic3Activity */ public Clic3Activity(JClicProject project) { this.project = project; clear(); rPath = BLANK; } public void clear() { int i; actMode = NONE; puzMode = INTERC; graPos = AB; ncw = nch = nctxw = nctxh = 0; txtCW = txtCW2 = DEF_TXTCASW; txtCH = txtCH2 = DEF_TXTCASH; stretch = false; btCorregir = true; avCont = true; avAcc = true; avMaj = true; brPar = false; avDblSpc = false; avPunt = true; avLletra = true; avNoSalta = true; avScope = 3; avMaxScope = 6; fileName = initMess = endMess = fileDesc = custHelpFile = hlpTopic = BLANK; for (i = 0; i < (MAXCW * MAXCH); i++) ass[i] = -2; mAss = false; invAss = false; shHelp = true; shPuz = true; shDisk = true; shPrint = false; shPorta = true; custHlp = false; noBV = false; barraAmunt = false; okToNext = false; noAv = false; tabSpc = 16; for (i = 0; i < 3; i++) { fileNameCont[i] = BLANK; cont[i] = EXT_TXT; nLines[i] = 0; comptadors[i] = true; } for (i = 0; i < 2; i++) { ntags[i] = 0; tags[i] = null; bar[i] = true; delim[i] = true; colorFons[i] = DEFAULT_BACK_COLOR; } colorUsuari[0] = DEFAULT_COLOR_USUARI_0; colorUsuari[1] = DEFAULT_COLOR_USUARI_1; colorError[0] = DEFAULT_COLOR_ERROR_0; colorError[1] = DEFAULT_COLOR_ERROR_1; graTxt = null; for (i = 0; i < 4; i++) { logF[i] = BoxBase.getDefaultFont(); colors[i] = (TripleColor) DEFAULT_TRIPLE_COLOR.clone(); } colors[2].backColor = DEFAULT_BACK_COLOR; marcs = true; useDLL = false; dllOptions = null; rgDLL = BLANK; txBase = txBtCorregir = txPrev = bmpFons = initMessPrev = BLANK; avPrevHelp = 0; avTimePH = 30; btTipus = 1; tileBmp = true; pwTransp = false; pwrp = false; pwrx = pwry = 0; } Font stringToFont(String s) { int lfHeight, lfWeight, lfItalic; String lfFaceName; float size; int style; StringTokenizer st; st = new StringTokenizer(s, COMMA); lfHeight = parseIntX(st.nextToken()); for (int i = 0; i < 3; i++) st.nextToken(); lfWeight = parseIntX(st.nextToken()); lfItalic = parseIntX(st.nextToken()); for (int i = 0; i < 7; i++) st.nextToken(); lfFaceName = st.nextToken().trim(); size = (lfHeight * 10) / 12; if (size < BoxBase.MIN_FONT_SIZE) size = BoxBase.MIN_FONT_SIZE; style = 0; if (lfWeight >= 700) style |= Font.BOLD; if (lfItalic != 0) style |= Font.ITALIC; if ("system".equalsIgnoreCase(lfFaceName)) { lfFaceName = "Arial"; size = 13; style |= Font.BOLD; } return FontCheck.getValidFont(lfFaceName, style, (int) size); } TripleColor stringToTripleColor(String str) { TripleColor c = new TripleColor(); StringTokenizer st; String tx; st = new StringTokenizer(str, COMMA); c.backColor = strToColor(st.nextToken()); c.textColor = strToColor(st.nextToken()); c.shadowColor = strToColor(st.nextToken()); c.shadow = (st.nextToken().compareTo("1") == 0); return c; } public boolean load(String name, byte[] data) { String[] txt; StringBuilder tmptx = new StringBuilder(); String fn = BLANK; int i, l, tipus, nLin, fLine, ver, ncas, k; boolean result = false; int boolParms = 0; fileName = FileSystem.getCanonicalNameOf(validFileName(name), false); rPath = FileSystem.getPathPartOf(fileName); fLine = 0; nLin = 0; ver = 0; tipus = getExt(fileName); if (isClic3Extension(tipus) && (txt = dataToArray(data)) != null && (nLin = txt.length) > 0) { if (nLin > 2 && (ver = (ver = parseIntX(txt[fLine++])) > 1000 ? ver - 1000 : ver) >= 100 && ver <= CLICVER) { if (ver > 107) { StringBuilder sb = new StringBuilder(); while (fLine < nLin) { if (txt[fLine].length() > 0 && txt[fLine].charAt(0) == ENDDESC) { fLine++; break; } if (sb.length() > 0) sb.append("\r\n"); sb.append(txt[fLine++]); } fileDesc = sb.substring(0); } if (ver > 100) { for (i = 0; i < (ver < 118 ? 1 : 3); i++) { logF[i] = stringToFont(txt[fLine++]); if (ver >= 118) colors[i] = stringToTripleColor(txt[fLine++]); } if (ver < 118) for (i = 1; i < 4; i++) logF[i] = logF[0]; } if (ver > 118) { StringTokenizer st = new StringTokenizer(txt[fLine++], COMMA); comptadors[1] = (parseIntX(st.nextToken()) != 0); comptadors[2] = (parseIntX(st.nextToken()) != 0); comptadors[0] = (parseIntX(st.nextToken()) != 0); marcs = (parseIntX(st.nextToken()) != 0); colorFons[0] = strToColor(st.nextToken()); colorFons[1] = strToColor(st.nextToken()); st.nextToken(); st.nextToken(); btTipus = parseIntX(st.nextToken()); pwrx = parseIntX(st.nextToken()); pwry = parseIntX(st.nextToken()); } else if (ver == 118) { StringTokenizer st = new StringTokenizer(txt[fLine++], COMMA); comptadors[0] = (parseIntX(st.nextToken()) != 0); comptadors[1] = (parseIntX(st.nextToken()) != 0); comptadors[2] = (parseIntX(st.nextToken()) != 0); marcs = (parseIntX(st.nextToken()) != 0); colorFons[0] = strToColor(st.nextToken()); colorFons[1] = strToColor(st.nextToken()); st.nextToken(); st.nextToken(); } if (ver < 119) btTipus = 0; if (ver >= 119) if (txt[fLine++].length() > 0) bmpFons = FileSystem.getCanonicalNameOf(rPath + validFileName(txt[fLine - 1]), BF); initMess = txt[fLine++]; endMess = txt[fLine++]; if (ver > 102) { boolParms = parseIntX(txt[fLine++]); delim[0] = (boolParms & 0x0001) != 0; delim[1] = (boolParms & 0x0002) != 0; } if (ver > 105) { StringTokenizer st = new StringTokenizer(txt[fLine++], ";"); txtCW = parseIntX(st.nextToken()); if (st.hasMoreTokens()) txtCW2 = parseIntX(st.nextToken()); else txtCW2 = txtCW; st = new StringTokenizer(txt[fLine++], ";"); txtCH = parseIntX(st.nextToken()); if (st.hasMoreTokens()) txtCH2 = parseIntX(st.nextToken()); else txtCH2 = txtCH; } else { txtCW = txtCW2 = DEF_TXTCASW; txtCH = txtCH2 = DEF_TXTCASH; } if (ver < 118 && (tipus == EXT_SOP || tipus == EXT_CRW)) { txtCW = 20; txtCH = 20; } shHelp = (boolParms & 0x0004) == 0; graPos = (boolParms & (0x0018)) >> 3; shPuz = (boolParms & 0x0020) == 0; noBV = (boolParms & 0x0040) != 0; if (ver >= 118) { shDisk = (boolParms & 0x0080) != 0; shPorta = (boolParms & 0x0100) != 0; barraAmunt = (boolParms & 0x0200) != 0; } if (ver >= 119) { invAss = (boolParms & 0x400) != 0; tileBmp = (boolParms & 0x800) != 0; pwTransp = (boolParms & 0x1000) != 0; pwrp = (boolParms & 0x2000) != 0; noAv = (boolParms & 0x4000) != 0; shPrint = (boolParms & 0x8000) != 0; } if (ver > 108) { custHlp = (parseIntX(txt[fLine++]) != 0); // ADD RPATH? hlpTopic = validFileName(txt[fLine++]); custHelpFile = validFileName(txt[fLine++]); } if (ver > 114) { useDLL = (parseIntX(txt[fLine++]) != 0); rgDLL = validFileName(txt[fLine++]); dllOptions = StrUtils.extractByteSeq(data, fLine++, (byte) 0, ENDDESC_BYTE); } switch (tipus) { case EXT_PUZ: actMode = PUZZLE; if (nLin < fLine + 4) break; fileNameCont[0] = FileSystem.getCanonicalNameOf(rPath + validFileName(txt[fLine++]), BF); if ((cont[0] = getExt(fileNameCont[0])) > EXT_TXT || (ncw = parseIntX(txt[fLine++])) < 1 || (nch = parseIntX(txt[fLine++])) < 1 || ncw > MAXCW || nch > MAXCH || (ncw == 1 && nch == 1) || (puzMode = parseIntX(txt[fLine++])) < INTERC || puzMode > MEMORY) break; stretch = (nLin > fLine && parseIntX(txt[fLine++]) == 1); bar[0] = bar[1] = true; if (ver < 120 && puzMode == MEMORY) graPos = AUB; result = true; break; case EXT_ASS: actMode = ASSOCIA; if (nLin < fLine + 7) break; if (ver > 109) puzMode = parseIntX(txt[fLine++]); if ((ncw = parseIntX(txt[fLine++])) < 1 || (nch = parseIntX(txt[fLine++])) < 1 || ncw > MAXCW || nch > MAXCH) break; fileNameCont[0] = FileSystem.getCanonicalNameOf(rPath + validFileName(txt[fLine++]), BF); if ((cont[0] = getExt(fileNameCont[0])) > EXT_TXT) break; fileNameCont[1] = FileSystem.getCanonicalNameOf(rPath + validFileName(txt[fLine++]), BF); if (puzMode != INFO && puzMode != IDENTIFICA && (cont[1] = getExt(fileNameCont[1])) > EXT_TXT) break; bar[0] = (parseIntX(txt[fLine++]) == 1); bar[1] = (parseIntX(txt[fLine++]) == 1); if (puzMode == IDENTIFICA || puzMode == ESCRIU) bar[1] = false; else if (puzMode == EXPLORA || puzMode == INFO) bar[0] = bar[1] = false; stretch = true; if (ver > 106) { if (sol = (parseIntX(txt[fLine++]) != 0)) { fileNameCont[2] = FileSystem.getCanonicalNameOf(rPath + validFileName(txt[fLine++]), BF); if ((cont[2] = getExt(fileNameCont[2])) > EXT_TXT) break; } } if (ver > 101) { if (nLin < fLine + 1) break; mAss = (parseIntX(txt[fLine++]) == 1); if (mAss) { if (puzMode == NORMAL) puzMode = ESPECIAL; ncas = ncw * nch; if (nLin < fLine + ncas + 2) break; if ((nctxw = parseIntX(txt[fLine++])) < 1 || (nctxh = parseIntX(txt[fLine++])) < 1 || nctxw > MAXCW || nctxh > MAXCH) break; for (i = 0; i < ncas; i++) ass[i] = parseIntX(txt[fLine++]); } } if (puzMode == INFO || puzMode == EXPLORA) noAv = true; result = true; break; case EXT_SOP: actMode = SOPA; if (nLin < fLine + 7) break; fileNameCont[0] = txt[fLine++]; if (fileNameCont[0].length() > 0 && fileNameCont[0].charAt(0) == '*') { bar[0] = false; fileNameCont[0] = BLANK; cont[0] = EXT_BMP; } else { fileNameCont[0] = FileSystem.getCanonicalNameOf(rPath + validFileName(fileNameCont[0]), BF); bar[0] = true; } if ((bar[0] && (cont[0] = getExt(fileNameCont[0])) > EXT_TXT) || (ncw = parseIntX(txt[fLine++])) < 1 || (nch = parseIntX(txt[fLine++])) < 1 || ncw > MAXCW || nch > MAXCH || (ncw == 1 && nch == 1) || (nctxw = parseIntX(txt[fLine++])) < 1 || (nctxh = parseIntX(txt[fLine++])) < 1 || nctxw > MAXGW || nctxh > MAXGH || (nctxw == 1 && nctxh == 1) || (ntags[0] = parseIntX(txt[fLine++])) < 1 || nLin < (nctxh + ntags[0] + fLine) || (tags[0] = new String[ntags[0]]) == null || (graTxt = new String[nctxh]) == null || copyArray(graTxt, 0, txt, fLine, nctxh, true) == false || copyArray(tags[0], 0, txt, fLine + nctxh, ntags[0], true) == false) break; result = true; stretch = true; break; case EXT_CRW: actMode = CREUATS; if (nLin < fLine + 6) break; if ((nctxw = parseIntX(txt[fLine++])) < 1 || (nctxh = parseIntX(txt[fLine++])) < 1 || nctxw > MAXGW || nctxh > MAXGH || (nctxw == 1 && nctxh == 1) || nLin < (fLine + nctxh + (ntags[0] = nctxh) + (ntags[1] = nctxw)) || (graTxt = new String[nctxh]) == null || (tags[0] = new String[ntags[0]]) == null || (tags[1] = new String[ntags[1]]) == null || copyArray(graTxt, 0, txt, fLine, nctxh, true) == false || copyArray(tags[0], 0, txt, fLine + nctxh, ntags[0], false) == false || copyArray(tags[1], 0, txt, fLine + nctxh + ntags[0], ntags[1], false) == false) break; bar[0] = bar[1] = false; ncw = 1; nch = 4; stretch = false; result = true; break; case EXT_TXA: actMode = TEXTACT; logF[3] = stringToFont(txt[fLine++]); colors[3] = stringToTripleColor(txt[fLine++]); StringTokenizer st = new StringTokenizer(txt[fLine++], COMMA); colorUsuari[0] = strToColor(st.nextToken()); colorUsuari[1] = strToColor(st.nextToken()); colorError[0] = strToColor(st.nextToken()); colorError[1] = strToColor(st.nextToken()); st = new StringTokenizer(txt[fLine++], COMMA); puzMode = parseIntX(st.nextToken()); boolParms = parseIntX(st.nextToken()); avScope = parseIntX(st.nextToken()); avMaxScope = parseIntX(st.nextToken()); avPrevHelp = parseIntX(st.nextToken()); avTimePH = parseIntX(st.nextToken()); tabSpc = parseIntX(st.nextToken()); okToNext = (boolParms & 0x0001) != 0; btCorregir = (boolParms & 0x0002) != 0; avCont = (boolParms & 0x0004) != 0; avMaj = (boolParms & 0x0008) != 0; avAcc = (boolParms & 0x0010) != 0; brPar = (boolParms & 0x0020) != 0; avDblSpc = (boolParms & 0x0040) != 0; avPunt = (boolParms & 0x0080) != 0; avLletra = (boolParms & 0x0100) != 0; avNoSalta = (boolParms & 0x0200) != 0; txBtCorregir = txt[fLine++]; for (k = 0; k < 3; k++) { tmptx.setLength(0); while (fLine < nLin) { if (txt[fLine].length() > 0 && txt[fLine].charAt(0) == ENDDESC) { fLine++; break; } if (tmptx.length() > 0) tmptx.append("\n"); tmptx.append(txt[fLine++]); } switch (k) { case 0: txBase = tmptx.substring(0); break; case 1: txPrev = tmptx.substring(0); break; case 2: initMessPrev = tmptx.substring(0); break; } } if (btCorregir == false && (puzMode != FORATS || avCont == false)) noAv = true; result = (txBase != null); default: break; } } if (!result) { clear(); } } else clear(); return result; } public BoxBase getBoxBase(int i) { // we have only 4 box bases if (i > 3) return null; BoxBase bb = new BoxBase(); if (!colors[i].backColor.equals(BoxBase.DEFAULT_BACK_COLOR)) bb.backColor = colors[i].backColor; if (!colors[i].textColor.equals(BoxBase.DEFAULT_TEXT_COLOR)) bb.textColor = colors[i].textColor; if (!colors[i].shadowColor.equals(Color.gray)) { if (colors[i].shadow) bb.shadowColor = colors[i].shadowColor; bb.inactiveColor = colors[i].shadowColor; bb.alternativeColor = colors[i].shadowColor; } bb.shadow = colors[i].shadow; if (!logF[i].equals(BoxBase.getDefaultFont())) bb.setFont(logF[i]); return bb; } protected ActiveBagContent[] abcCopy = new ActiveBagContent[3]; public ActiveBagContent createActiveBagContent(int num) throws Exception { int cw, ch; double w, h; ActiveBagContent abc = null; boolean specialShape = false; boolean noAutoZones = false; boolean singleCells = false; boolean border; if (num < 0 || num >= 3 || fileNameCont[num] == null) return abc; if (num == 0 || num == 2) { cw = ncw; ch = nch; w = txtCW; h = txtCH; border = delim[0]; } else { cw = nctxw; ch = nctxh; w = txtCW2; h = txtCH2; border = delim[1]; } abc = new ActiveBagContent(cw, ch); abc.border = border; Shaper sh = null; if (fileDesc != null) { if (fileDesc.indexOf("noAutoZones") >= 0) noAutoZones = true; if (fileDesc.indexOf("singleCells") >= 0) singleCells = true; int i = fileDesc.indexOf("SHAPER:"); if (i >= 0) { StringTokenizer st = new StringTokenizer(fileDesc.substring(i + 7), "|"); if (st.hasMoreTokens()) { org.jdom.Element e = new org.jdom.Element(Shaper.ELEMENT_NAME); e.setAttribute(JDomUtility.CLASS, "@" + st.nextToken()); e.setAttribute(Shaper.COLS, Integer.toString(cw)); e.setAttribute(Shaper.ROWS, Integer.toString(ch)); while (st.hasMoreTokens()) { String attribute, value; attribute = st.nextToken(); if (st.hasMoreTokens()) { value = st.nextToken(); e.setAttribute(attribute, value); } } try { sh = Shaper.getShaper(e); } catch (Exception ex) { sh = null; } } } } if (sh == null) sh = new Rectangular(cw, ch); else specialShape = true; abc.setShaper(sh); if (fileNameCont[num].endsWith(".txt")) { String[] content = dataToArray(project.getFileSystem().getBytes(fileNameCont[num])); if (content == null) { content = new String[cw * ch]; for (int z = 0; z < cw * ch; z++) content[z] = new String(); } setActiveBagTextContent(abc, content, /* rb, */ cw, ch, w, h); } else { if (!noAutoZones && mAss && !specialShape && cw * ch > TOO_MUCH_CELLS && bar[num & 1] == false) { if (num == 2) { if (abcCopy[0] != null) { abc.setShaper(abcCopy[0].getShaper()); abc.ncw = abcCopy[0].ncw; abc.nch = abcCopy[0].nch; } } else { int[] ids = new int[cw * ch]; if (num == 0) System.arraycopy(ass, 0, ids, 0, cw * ch); else { for (int i = 0; i < cw * ch; i++) ids[i] = -1; int k = 0; int m = Math.min(ncw * nch, ass.length); for (int i = 0; i < m; i++) { int j = ass[i]; if (j >= 0) { if (ids[j] == -1) { ids[j] = k; ass[i] = k; k++; } else ass[i] = ids[j]; } } } boolean skipOnes = (actMode == ASSOCIA && puzMode == IDENTIFICA); HolesMaker hsm = new HolesMaker(cw, ch, ids, num != 1, skipOnes, singleCells); abc.setShaper(hsm.getShaper()); if (num == 0) ass = hsm.getIds(); } } abc.setImgContent(project.mediaBag.getImageElement(fileNameCont[num]), true); } abcCopy[num] = abc; return abc; } public void setActiveBoxTextContent(ActiveBoxContent abc, String tx) throws Exception { int i, j; String sub, subc; String txPrev2; abc.mediaContent = null; abc.img = null; abc.imgName = null; abc.rawText = tx; txPrev2 = tx; while ((i = txPrev2.indexOf('{')) >= 0) { j = txPrev2.indexOf('}', i); if (j < 0) break; sub = txPrev2.substring(i + 1, j); txPrev2 = txPrev2.substring(0, i) + txPrev2.substring(j + 1); sub = sub.trim(); subc = sub.toLowerCase(); if (subc.endsWith(".gif") || subc.endsWith(".jpg") || subc.endsWith(".bmp") || subc.endsWith(".png")) { abc.imgName = FileSystem.getCanonicalNameOf(rPath + validFileName(sub), BF); } else { if (abc.mediaContent == null) abc.mediaContent = new MediaContent(); try { StringTokenizer st = new StringTokenizer(subc, " "); while (st.hasMoreTokens()) { String token = st.nextToken(); if (token.equals("stretch")) abc.mediaContent.stretch = true; else if (token.equals("free")) abc.mediaContent.free = true; else if (token.equals("pos")) { abc.mediaContent.absLocation = new Point(); abc.mediaContent.absLocation.x = Integer.parseInt(st.nextToken()); abc.mediaContent.absLocation.y = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); abc.mediaContent.absLocationFrom = (k == 0 ? MediaContent.FROM_BOX : (k == 1 ? MediaContent.FROM_WINDOW : MediaContent.FROM_FRAME)); } else if (token.equals("to")) { if (abc.mediaContent.mediaType == MediaContent.PLAY_CDAUDIO) abc.mediaContent.cdTo = st.nextToken(); else abc.mediaContent.to = Integer.parseInt(st.nextToken()); } else if (token.equals("from")) abc.mediaContent.from = Integer.parseInt(st.nextToken()); else if (token.equals("exit")) abc.mediaContent.mediaType = MediaContent.EXIT; else if (token.length() == 4 && token.startsWith("rec")) { abc.mediaContent.recBuffer = Integer.parseInt(token.substring(3)); abc.mediaContent.mediaType = MediaContent.RECORD_AUDIO; if (st.hasMoreTokens()) { token = st.nextToken(); if (token.equals("play")) abc.mediaContent.mediaType = MediaContent.PLAY_RECORDED_AUDIO; else abc.mediaContent.length = Integer.parseInt(token); } } else if (token.endsWith(".wav") || token.endsWith(".mp3") || token.endsWith(".ogg") || token.endsWith(".au") || token.endsWith(".ra")) { abc.mediaContent.mediaType = MediaContent.PLAY_AUDIO; abc.mediaContent.mediaFileName = FileSystem.getCanonicalNameOf(rPath + validFileName(token), BF); } else if (token.endsWith(".mid")) { abc.mediaContent.mediaType = MediaContent.PLAY_MIDI; abc.mediaContent.mediaFileName = FileSystem.getCanonicalNameOf(rPath + validFileName(token), BF); // Compute MIDI pos!!! } else if (token.endsWith(".avi") || token.endsWith(".mpg") || token.endsWith(".swf")) { abc.mediaContent.mediaType = MediaContent.PLAY_VIDEO; abc.mediaContent.mediaFileName = FileSystem.getCanonicalNameOf(rPath + validFileName(token), BF); } else if (token.endsWith(".ass") || token.endsWith(".puz") || token.endsWith(".sop") || token.endsWith(".crw") || token.endsWith(".txa")) { abc.mediaContent.mediaType = MediaContent.RUN_CLIC_ACTIVITY; abc.mediaContent.mediaFileName = FileSystem.getCanonicalNameOf(rPath + validFileName(token), BF); } else if (token.endsWith(".pac") || token.endsWith(".pcc")) { abc.mediaContent.mediaType = MediaContent.RUN_CLIC_PACKAGE; abc.mediaContent.mediaFileName = FileSystem.getCanonicalNameOf(rPath + validFileName(token), BF); } else if (token.endsWith(".exe") || token.endsWith(".com") || token.endsWith(".bat")) { abc.mediaContent.mediaType = MediaContent.RUN_EXTERNAL; // AVOID ABSOLUTE PATH abc.mediaContent.mediaFileName = FileSystem.getCanonicalNameOf(rPath + validFileName(token), BF); abc.mediaContent.externalParam = BLANK; while (st.hasMoreTokens()) { // CHECK RPATH abc.mediaContent.externalParam = abc.mediaContent.externalParam + " " + st.nextToken(); } abc.mediaContent.externalParam = abc.mediaContent.externalParam.trim(); } else if (token.endsWith(".htm") || token.endsWith(".html") || token.startsWith("http:")) { abc.mediaContent.mediaType = MediaContent.URL; if (FileSystem.isStrUrl(token)) abc.mediaContent.mediaFileName = token; else abc.mediaContent.mediaFileName = FileSystem.getCanonicalNameOf(rPath + validFileName(token), BF); } else if (token.indexOf(".") >= 0) { abc.mediaContent.mediaType = MediaContent.UNKNOWN; abc.mediaContent.mediaFileName = FileSystem.getCanonicalNameOf(rPath + validFileName(token), BF); } else if (token.indexOf(":") >= 0) { abc.mediaContent.mediaType = MediaContent.PLAY_CDAUDIO; abc.mediaContent.cdFrom = token; } else System.err.println("Unknown media command: " + token); } } catch (Exception e) { System.err.println("Error parsing media string \"" + sub + "\"\n" + e); } } } abc.text = txPrev2; abc.realizeContent(project.mediaBag); } public void setActiveBagTextContent(ActiveBagContent abc, String[] setText, int setNcw, int setNch, double setW, double setH) throws Exception { setActiveBagTextContent(abc, setText, setNcw, setNch); abc.w = setW; abc.h = setH; } public void setActiveBagTextContent(ActiveBagContent abc, String[] txt, int setNcw, int setNch) throws Exception { abc.img = null; abc.imgName = null; abc.ncw = Math.max(1, setNcw); abc.nch = Math.max(1, setNch); int n = abc.ncw * abc.nch; for (int i = 0; i < n; i++) setActiveBoxTextContent(abc.getActiveBoxContent(i), ((i >= txt.length || txt[i] == null) ? BLANK : txt[i])); } } src/core/edu/xtec/jclic/clic3/Clic3Pac.java000066400000000000000000000110521335566474600206440ustar00rootroot00000000000000/* * File : Clic3Pac.java * Created : 08-nov-2000 20:25 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.clic3; import edu.xtec.jclic.fileSystem.FileSystem; /** * This class encapsulates a Clic 3.0 package of activities (.pac file), and * provides methods to import it from a data stream and to import it into a * {@link edu.xtec.jclic.project.JClicProject}. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class Clic3Pac extends Clic3 { public String rPath; public String fileName; public String fileDesc; public String[] acts; public int nActs; public int act; public boolean loaded, modified; public boolean autoPass, noPassButtons, noDiskButton, noExitButton; public int lapToPass; public boolean def, sup, inf, supTFlag, infTFlag; public String chDef, chSup, chInf; public int infP, infT, supP, supT; /** Creates new Clic3Pac */ public Clic3Pac() { acts = null; chDef = chSup = chInf = null; clear(); rPath = BLANK; } public void clear() { int i; acts = null; fileName = BLANK; fileDesc = BLANK; nActs = 0; act = 0; autoPass = false; noPassButtons = false; noDiskButton = false; noExitButton = false; lapToPass = 0; loaded = false; modified = false; def = sup = inf = supTFlag = infTFlag = false; infT = supT = 0; infP = 25; supP = 75; chDef = null; chSup = null; chInf = null; } public boolean load(String name, byte[] data) { String[] txt; String fn; String str; int nLin, fLine, ver; boolean result = false; int i, boolParms; fileName = FileSystem.getCanonicalNameOf(validFileName(name), false); rPath = FileSystem.getPathPartOf(fileName); fLine = 0; if (getExt(fileName) == EXT_PAC && (txt = dataToArray(data)) != null && (nLin = txt.length) > 0) { ver = parseIntX(txt[fLine++]); if (ver > 1000) ver -= 1000; if (ver > 107 && ver <= CLICVER) { StringBuilder sb = new StringBuilder(); while (fLine < nLin) { if (txt[fLine].length() > 0 && txt[fLine].charAt(0) == ENDDESC) { fLine++; break; } if (sb.length() > 0) sb.append("\r\n"); sb.append(txt[fLine++]); } fileDesc = sb.substring(0); if (ver >= 113) { boolParms = parseIntX(txt[fLine++]); autoPass = (boolParms & 0x0001) != 0; noPassButtons = (boolParms & 0x0002) != 0; noDiskButton = (boolParms & 0x0004) != 0; noExitButton = (boolParms & 0x0008) != 0; lapToPass = parseIntX(txt[fLine++]); boolParms = parseIntX(txt[fLine++]); def = (boolParms & 0x0001) != 0; sup = (boolParms & 0x0002) != 0; inf = (boolParms & 0x0004) != 0; supTFlag = (boolParms & 0x0008) != 0; infTFlag = (boolParms & 0x0010) != 0; str = txt[fLine++]; if (str.length() > 0) chDef = rPath + validFileName(str); str = txt[fLine++]; if (str.length() > 0) chSup = rPath + validFileName(str); str = txt[fLine++]; if (str.length() > 0) chInf = rPath + validFileName(str); supP = parseIntX(txt[fLine++]); supT = parseIntX(txt[fLine++]); infP = parseIntX(txt[fLine++]); infT = parseIntX(txt[fLine++]); } } if (fLine >= nLin || ver > CLICVER || (nActs = nLin - fLine) < 1 || (acts = new String[nActs]) == null || copyArray(acts, 0, txt, fLine, nActs, true) == false) result = false; else result = true; if (!result) { clear(); } else { for (int l = 0; l < acts.length; l++) acts[l] = rPath + validFileName(acts[l]); loaded = true; } } else clear(); return result; } } src/core/edu/xtec/jclic/clic3/TripleColor.java000066400000000000000000000034161335566474600215260ustar00rootroot00000000000000/* * File : TripleColor.java * Created : 19-dec-2000 23:54 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.clic3; import java.awt.Color; /** * This class is just a data structure with three {@link java.awt.Color} * objects, defining the background, foreground and shadow colors used to draw * cells, and a boolean that indicates if a shadow should be painted under * texts. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class TripleColor extends Object implements Cloneable { public Color backColor = Color.white; public Color textColor = Color.black; public Color shadowColor = Color.lightGray; public boolean shadow = false; public TripleColor(Color bak, Color text, Color shad, boolean sh) { backColor = bak; textColor = text; shadowColor = shad; shadow = sh; } public TripleColor() { } @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } } } src/core/edu/xtec/jclic/edit/000077500000000000000000000000001335566474600163515ustar00rootroot00000000000000src/core/edu/xtec/jclic/edit/EditDialog.java000066400000000000000000000060361335566474600212260ustar00rootroot00000000000000/* * File : EditDialog.java * Created : 12-jun-2002 20:21 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.edit; import edu.xtec.util.ExtendedJDialog; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dialog; import java.awt.Frame; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JPanel; /** * This class is a basic template of a {@link javax.swing.JDialog} useful for * editing objects. It builds two {@link javax.swing.Action} and * {@link javax.swing.JButton} objects under the main JPanel, used to confirm or * cancel the changes made in the edited object. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class EditDialog extends ExtendedJDialog { public Options options; public JPanel southPanel; public Action okAction; public Action cancelAction; public JButton okButton, cancelButton; public boolean result = false; protected Component owner; public EditDialog(Options options, String msgKey, Dialog owner) { super(owner, options.getMsg(msgKey), true); this.owner = owner; buildDialog(options); } public EditDialog(Options options, String msgKey, Frame owner) { super(owner, options.getMsg(msgKey), true); this.owner = owner; buildDialog(options); } /** Creates new EditDialog */ protected void buildDialog(Options options) { this.options = options; southPanel = new JPanel(); okAction = new AbstractAction(options.getMsg("OK"), ResourceManager.getImageIcon("icons/commit_changes.gif")) { public void actionPerformed(ActionEvent ev) { result = true; setVisible(false); } }; cancelAction = new AbstractAction(options.getMsg("CANCEL"), ResourceManager.getImageIcon("icons/cancel.gif")) { public void actionPerformed(ActionEvent ev) { result = false; setVisible(false); } }; okButton = new JButton(okAction); cancelButton = new JButton(cancelAction); southPanel.add(okButton); southPanel.add(cancelButton); getContentPane().add(southPanel, BorderLayout.SOUTH); } public boolean showDialog() { pack(); if (owner != null) centerOver(owner); setVisible(true); return result; } } src/core/edu/xtec/jclic/edit/Editable.java000066400000000000000000000030341335566474600207250ustar00rootroot00000000000000/* * File : Editable.java * Created : 05-jun-2002 17:25 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.edit; /** * Classes that implement this interface have always an associated * {@link edu.xtec.jclic.edit.Editor}. The interface has one single method to * implement: getEditor * . * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public interface Editable { /** * Returns the {@link edu.xtec.jclic.edit.Editor} associated to this object. * * @param parent Editors can have a parent editor. Childs should communicate its * changes to parents, and changes in parents should affect its * childs. This parameter can be null in stand-alone * objects. * @return An Editor for this object. */ public Editor getEditor(Editor parent); } src/core/edu/xtec/jclic/edit/Editor.java000066400000000000000000000435631335566474600204550ustar00rootroot00000000000000/* * File : Editor.java * Created : 04-jun-2002 16:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.edit; import edu.xtec.util.Options; import java.awt.AWTEvent; import java.awt.Component; import java.awt.SystemColor; import java.lang.reflect.Constructor; import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; import javax.swing.AbstractListModel; import javax.swing.Icon; import javax.swing.JTree; import javax.swing.ListSelectionModel; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; /** * This generic class allows to modify the content and properties of an * associated {@link edu.xtec.jclic.edit.Editable} object. Editors provide * methods to register listeners that will be informed about changes occurred in * its associated data object. The class extends * {@link javax.swing.tree.DefaultMutableTreeNode} in order to make easy to * implement a tree of dependences between editor classes. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public abstract class Editor extends DefaultMutableTreeNode { protected HashSet listeners; protected DefaultTreeModel treeModel; protected JTree currentTree; protected ListSelectionModel listSelectionModel; protected LModel listModel; private boolean modified; public static EditorAction moveUpAction, moveDownAction, copyAction, cutAction, pasteAction, deleteAction; protected static Editor clip; protected static boolean clipCutted; protected Editor(Object data) { super(data); listeners = new HashSet(); } public static Editor createEditor(String className, Object data, Editor parent) { Editor result = null; try { Class cl = Class.forName(className); Constructor[] constructors = cl.getDeclaredConstructors(); Constructor cn = null; for (Constructor constr : constructors) { Class[] parameters = constr.getParameterTypes(); if (parameters != null && parameters.length == 1 && parameters[0].isInstance(data)) { cn = constr; break; } } if (cn == null) throw new Exception(); result = (Editor) cn.newInstance(new Object[] { data }); if (result == null) throw new Exception(); if (parent != null) parent.add(result); result.createChildren(); } catch (Exception ex) { System.err.println("Unable to create " + className + " for " + data + "\n" + ex); } return result; } protected abstract void createChildren(); public String getTitleKey() { return "edit_data"; } public boolean isModified() { return modified; } public void setModified(boolean modified) { this.modified = modified; if (modified) { Editor ed = getEditorParent(); if (ed != null) ed.setModified(true); } else { Enumeration en = children(); while (en.hasMoreElements()) ((Editor) en.nextElement()).setModified(false); } } public DefaultTreeModel getTreeModel() { if (isRoot()) { if (treeModel == null) setTreeModel(new DefaultTreeModel(this)); return treeModel; } return (treeModel != null ? treeModel : getEditorParent().getTreeModel()); } public void setTreeModel(DefaultTreeModel treeModel) { this.treeModel = treeModel; } public void setCurrentTree(JTree currentTree) { this.currentTree = currentTree; } public JTree getCurrentTree() { return currentTree != null ? currentTree : isRoot() ? null : getEditorParent().getCurrentTree(); } public JTree createJTree() { setCurrentTree(new JTree(getTreeModel())); currentTree.setCellRenderer(new DefaultTreeCellRenderer() { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); if (value instanceof Editor) { Icon icon = ((Editor) value).getIcon(leaf, expanded); if (icon != null) setIcon(icon); if (clip == value && clipCutted) { setForeground(SystemColor.textInactiveText); } } return this; } }); return currentTree; } public AbstractListModel getListModel() { if (listModel == null) { listModel = new LModel(); } return listModel; } protected class LModel extends AbstractListModel { public Object getElementAt(int index) { return (index >= 0 && index < getChildCount()) ? getChildAt(index) : null; } public int getSize() { return getChildCount(); } @Override public void fireIntervalAdded(Object src, int index0, int index1) { super.fireIntervalAdded(src, index0, index1); } @Override public void fireIntervalRemoved(Object src, int index0, int index1) { super.fireIntervalRemoved(src, index0, index1); } @Override public void fireContentsChanged(Object src, int index0, int index1) { super.fireContentsChanged(src, index0, index1); } } @Override public void insert(MutableTreeNode newChild, int childIndex) { super.insert(newChild, childIndex); if (listModel != null) listModel.fireIntervalAdded(listModel, childIndex, childIndex); } @Override public void remove(int childIndex) { super.remove(childIndex); if (listModel != null) listModel.fireIntervalRemoved(listModel, childIndex, childIndex); } public void select() { JTree tree = getCurrentTree(); if (tree != null) tree.getSelectionModel().setSelectionPath(new TreePath(getPath())); if (getListSelectionModel() != null) { Editor p = getEditorParent(); if (p != null) { int index = p.getIndex(this); if (index >= 0) getListSelectionModel().setSelectionInterval(index, index); } } } public void reselect() { JTree tree = getCurrentTree(); if (tree != null) { tree.getSelectionModel().clearSelection(); tree.getSelectionModel().setSelectionPath(new TreePath(getPath())); } if (getListSelectionModel() != null) { Editor p = getEditorParent(); if (p != null) { int index = p.getIndex(this); if (index >= 0) { getListSelectionModel().removeIndexInterval(index, index); getListSelectionModel().setSelectionInterval(index, index); } } } } public int getNearestIndex(Editor fromChild, boolean down) { int result = down ? getChildCount() : 0; if (fromChild != null) { int p = getIndex(fromChild); if (p >= 0) result = p + (down ? 1 : 0); } return result; } protected boolean canClone() { return false; } protected Editor getClone() throws Exception { return null; } protected boolean delete(boolean changeSelection) { boolean result = false; Editor p = getEditorParent(); if (p != null) { p.setModified(true); if (clip == this) setClip(null, false); int index = p.getIndex(this); if (index == p.getChildCount() - 1) index--; getTreeModel().removeNodeFromParent(this); if (changeSelection) { Editor sel = index >= 0 ? (Editor) p.getChildAt(index) : p; if (sel != null) { sel.select(); } } // Added 03-Feb-2011 // Correct bug 172: when an editor loses its last element, // set their parent owner of the basic actions if (index < 0) p.setActionsOwner(); result = true; } return result; } public boolean moveToIndex(int index, boolean updateSelection) { boolean result = false; DefaultTreeModel model = getTreeModel(); Editor p = getEditorParent(); if (p != null && model != null) { index = Math.min(Math.max(0, index), p.getChildCount()); if (index != p.getIndex(this)) { p.setModified(true); model.removeNodeFromParent(this); model.insertNodeInto(this, p, index); result = true; if (updateSelection) select(); } } return result; } public boolean moveUp(boolean updateSelection) { boolean result = false; Editor p = getEditorParent(); if (p != null) { int index = parent.getIndex(this); result = moveToIndex(index - 1, updateSelection); } return result; } public boolean moveDown(boolean updateSelection) { boolean result = false; Editor p = getEditorParent(); if (p != null) { int index = parent.getIndex(this); result = moveToIndex(index + 1, updateSelection); } return result; } public boolean copy() { boolean result = false; if (allowCopy && canClone()) { setClip(this, false); result = true; } return result; } protected static void setClip(Editor e, boolean cutted) { if (clip != null) { Editor c = clip; clip = null; clipCutted = false; c.getTreeModel().nodeChanged(c); } clip = e; clipCutted = cutted; if (clip != null) clip.getTreeModel().nodeChanged(clip); } public boolean cut() { boolean result = false; if (allowCut) { setClip(this, true); result = true; } return result; } public boolean canBeParentOf(Editor e) { return !(getClass().isInstance(e)); } public boolean canBeSiblingOf(Editor e) { return true; } public boolean insertEditor(Editor e, boolean asChild, int index, boolean updateSelection) { boolean result = false; if (e != null) { if (asChild) { setModified(true); if (index < 0) index = getChildCount(); getTreeModel().insertNodeInto(e, this, index); result = true; if (updateSelection) e.select(); } else { Editor p = getEditorParent(); if (p != null) { p.setModified(true); if (index < 0) index = p.getIndex(this); result = p.insertEditor(e, true, index, updateSelection); } } } return result; } protected boolean canPasteHere() { return allowPaste && clip != null && (!clipCutted || clip != this) && (clipCutted || clip.canClone()) && (canBeParentOf(clip) || (canBeSiblingOf(clip) && getEditorParent() != null)); } public boolean paste(boolean updateSelection) { boolean result = false; if (canPasteHere()) { Editor c = clip; if (clipCutted) { clip.delete(false); } else { try { c = clip.getClone(); } catch (Exception ex) { System.err.println("Unable to clone " + clip + "\n" + ex); return false; } } result = insertEditor(c, canBeParentOf(c), -1, updateSelection); if (result) { setClip(clipCutted ? null : c, false); if (updateSelection) { c.select(); } } } return result; } public Icon getIcon(boolean leaf, boolean expanded) { return null; } public Editor getEditorParent() { return (Editor) getParent(); } public Editor getFirstParent(Class cl) { Editor result = getEditorParent(); if (result != null && !cl.isInstance(result)) result = result.getFirstParent(cl); return result; } public Editor getFirstChild(Class cl) { Editor result = null; Enumeration en = children(); while (en.hasMoreElements()) { Editor ed = (Editor) en.nextElement(); if (cl.isInstance(ed)) { result = ed; break; } } return result; } public Object getFirstObject(Class cl) { Object result = getUserObject(); if ((result == null || !cl.isInstance(result)) && !isRoot()) result = getEditorParent().getFirstObject(cl); return result; } public abstract Class getEditorPanelClass(); public abstract EditorPanel createEditorPanel(Options options); @Override public String toString() { return "generic Editor component"; } public Editor getChildByName(String name) { Editor result = null; if (name != null) { Enumeration en = children(); while (result == null && en.hasMoreElements()) { Editor e = (Editor) en.nextElement(); if (name.equals(e.toString())) result = e; } } return result; } public static void createBasicActions(Options options) { if (!basicActionsCreated) { moveUpAction = new EditorAction("editor_moveUp", "icons/up.gif", "editor_moveUp_tooltip", options) { protected void doAction(Editor e) { e.moveUp(true); } }; moveDownAction = new EditorAction("editor_moveDown", "icons/down.gif", "editor_moveDown_tooltip", options) { protected void doAction(Editor e) { e.moveDown(true); } }; copyAction = new EditorAction("COPY", "icons/copy.gif", "COPY", options) { protected void doAction(Editor e) { e.copy(); } }; cutAction = new EditorAction("CUT", "icons/cut.gif", "CUT", options) { protected void doAction(Editor e) { e.cut(); } }; pasteAction = new EditorAction("PASTE", "icons/paste.gif", "PASTE", options) { protected void doAction(Editor e) { e.paste(true); } }; deleteAction = new EditorAction("DELETE", "icons/delete.gif", "DELETE", options) { protected void doAction(Editor e) { e.delete(true); } }; basicActionsCreated = true; } } protected static boolean basicActionsCreated = false; protected boolean restrictMoveToSameType = true; protected boolean allowCopy = false, allowCut = false, allowPaste = false, allowDelete = false; public static void clearBasicActionsOwner() { if (basicActionsCreated) { moveUpAction.setActionOwner(null); moveDownAction.setActionOwner(null); copyAction.setActionOwner(null); cutAction.setActionOwner(null); pasteAction.setActionOwner(null); deleteAction.setActionOwner(null); } } public void setActionsOwner() { if (basicActionsCreated) { boolean eUp = false, eDown = false; Editor p = getEditorParent(); if (p != null) { int i = p.getIndex(this); eUp = i > 0; eDown = i < p.getChildCount() - 1; if (restrictMoveToSameType) { eUp = eUp && getClass().isInstance(p.getChildAt(i - 1)); eDown = eDown && getClass().isInstance(p.getChildAt(i + 1)); } } moveUpAction.setActionOwner(eUp ? this : null); moveDownAction.setActionOwner(eDown ? this : null); copyAction.setActionOwner(allowCopy && canClone() ? this : null); cutAction.setActionOwner(allowCut ? this : null); pasteAction.setActionOwner(canPasteHere() ? this : null); deleteAction.setActionOwner(allowDelete ? this : null); } } public void clearActionsOwner() { clearBasicActionsOwner(); } protected static Component findParentForDlg(AWTEvent ev) { if (ev != null && ev.getSource() instanceof Component) return (Component) ev.getSource(); else return null; } public interface EditorListener { public void editorDataChanged(Editor e); } public void addEditorListener(EditorListener ls) { listeners.add(ls); } public void removeEditorListener(EditorListener ls) { listeners.remove(ls); } public void fireEditorDataChanged(EditorListener agent) { setModified(true); DefaultTreeModel tm = getTreeModel(); if (tm != null) tm.nodeChanged(this); Iterator it = listeners.iterator(); while (it.hasNext()) { EditorListener ls = (EditorListener) it.next(); if (ls != agent) ls.editorDataChanged(this); } } public void collectData() { Iterator it = listeners.iterator(); while (it.hasNext()) { Object o = it.next(); if (o instanceof EditorPanel) { ((EditorPanel) o).save(); break; } } for (int i = 0; i < getChildCount(); i++) { TreeNode tn = getChildAt(i); if (tn instanceof Editor) { ((Editor) tn).collectData(); } } } /** * Getter for property listSelectionModel. * * @return Value of property listSelectionModel. */ public ListSelectionModel getListSelectionModel() { ListSelectionModel result = listSelectionModel; if (result == null && getEditorParent() != null) result = getEditorParent().getListSelectionModel(); return result; } /** * Setter for property listSelectionModel. * * @param listSelectionModel New value of property listSelectionModel. */ public void setListSelectionModel(ListSelectionModel listSelectionModel) { this.listSelectionModel = listSelectionModel; } public boolean editData(Component parent, Options options) { boolean result = false; EditorPanel panel = createEditorPanel(options); if (panel != null) { panel.attachEditor(this, false); result = options.getMessages().showInputDlg(parent, panel, getTitleKey()); panel.attachEditor(null, result); if (result) setModified(true); } return result; } } src/core/edu/xtec/jclic/edit/EditorAction.java000066400000000000000000000072531335566474600216070ustar00rootroot00000000000000/* * File : EditorAction.java * Created : 14-jun-2002 20:38 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.edit; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JComponent; import javax.swing.KeyStroke; /** * This abstract class provides a base to create {@link javax.swing.Action} * objects related to {@link edu.xtec.jclic.edit.Editor}s. Derived classes must * implement only the doAction * method, executing the required operations on the supplied * Editor. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public abstract class EditorAction extends AbstractAction { ActionEvent ev; Editor editor; public Options options; public EditorAction(String nameKey, String iconKey, String toolTipKey, Options options) { super(options.getMsg(nameKey), ResourceManager.getImageIcon(iconKey)); this.options = options; if (toolTipKey != null) putValue(AbstractAction.SHORT_DESCRIPTION, options.getMsg(toolTipKey)); String s = options.getMessages().get(nameKey + "_keys"); if (s != null && s.length() >= 2 && !s.startsWith(nameKey)) { putValue(Action.MNEMONIC_KEY, new Integer(s.charAt(0))); if (s.charAt(1) != '*') { char ch = s.charAt(1); int key = (int) ch; int keyMod = KeyEvent.CTRL_MASK; if (ch == '#' && s.length() > 2) { try { int sep = s.indexOf('#', 2); String k; if (sep > 0) { keyMod = Integer.parseInt(s.substring(sep + 1)); k = s.substring(2, sep); } else { k = s.substring(2); } key = Integer.parseInt(k); } catch (Exception ex) { System.err.println("Error initializing action keys\nBad expression: " + s); } } putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(key, keyMod)); } } setEnabled(false); } public final void actionPerformed(ActionEvent ev) { this.ev = ev; if (editor != null) doAction(editor); } protected abstract void doAction(Editor e); protected Component getComponentSrc() { Component result = null; if (ev != null && ev.getSource() instanceof Component) result = (Component) ev.getSource(); return result; } protected JComponent getJComponentSrc() { JComponent result = null; if (ev != null && ev.getSource() instanceof JComponent) result = (JComponent) ev.getSource(); return result; } protected EditorPanel getEditorPanelSrc() { Component cmp = getComponentSrc(); while (cmp != null) { if (cmp instanceof EditorPanel) break; cmp = cmp.getParent(); } return (EditorPanel) cmp; } public void setActionOwner(Editor e) { editor = e; setEnabled(editor != null); } } src/core/edu/xtec/jclic/edit/EditorPanel.java000066400000000000000000000151371335566474600214310ustar00rootroot00000000000000/* * File : EditorPanel.java * Created : 05-jun-2002 10:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.edit; import edu.xtec.jclic.edit.Editor.EditorListener; import edu.xtec.util.CtrlPanel; import edu.xtec.util.Options; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Insets; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; /** * This class is a {@link edu.xtec.util.CtrlPanel} specialized to deal with * {@link edu.xtec.jclic.edit.Editor} objects. Every implementation of editor * panel will have specific methods to deal with a specific type of * Editor objects (wich, in turn, will be designed for a specific * type of data objects). * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public abstract class EditorPanel extends CtrlPanel implements FocusListener, EditorListener { protected Editor editor; protected Options options; public static final Color titleBgColor = Color.orange; public static final Color titleForeColor = Color.blue; public static final Color panelBgColor = new Color(255, 255, 204); public static final Border titleBorder = new EmptyBorder(new Insets(6, 4, 6, 4)); public static final Border panelBorder = new EmptyBorder(0, 0, 0, 0); public JLabel northComponent; public Component southComponent; /** Creates new EditPanel */ public EditorPanel(Options options) { super(); this.options = options; } public Options getOptions() { return options; } protected void postInit(int preferredLabelWidth, boolean withTitleBar, boolean withToolBar) { setBorder(panelBorder); if (withTitleBar || withToolBar) { JPanel northPanel = new JPanel(new BorderLayout()); if (withTitleBar) { northComponent = createTitleLabel(preferredLabelWidth); northPanel.add(northComponent, BorderLayout.NORTH); } if (withToolBar) { southComponent = createToolBar(); northPanel.add(southComponent, BorderLayout.SOUTH); } add(northPanel, BorderLayout.NORTH); } } public abstract boolean checkIfEditorValid(Editor e); public final void clear() { setModified(false); } public final void fill() { setInitializing(true); fillData(); setInitializing(false); setModified(false); setEnabled(editor != null); } protected abstract void fillData(); public final void save() { if (editor != null && isModified()) { saveData(); editor.fireEditorDataChanged(this); setModified(false); } } protected abstract void saveData(); public void attachEditor(Editor e, boolean saveChanges) { if (e == editor) { if (editor != null && saveChanges && isModified()) editor.setModified(true); fill(); } else { if (editor != null) removeEditor(saveChanges); if (checkIfEditorValid(e)) { setEditor(e); editor.addEditorListener(this); fill(); } } } public Editor getEditor() { return editor; } protected synchronized void setEditor(Editor e) { if (editor != null) editor.clearActionsOwner(); editor = e; if (e != null) e.setActionsOwner(); } public void removeEditor(boolean saveChanges) { if (editor != null) { editor.removeEditorListener(this); if (saveChanges) save(); setEditor(null); fill(); } } public void editorDataChanged(Editor e) { if (e != null && e.equals(getEditor())) fillData(); } protected Icon getIcon() { return null; } protected String getTitle() { return ""; } protected JLabel createTitleLabel(int preferredWidth) { JLabel result = new JLabel(getTitle()); result.setHorizontalAlignment(SwingConstants.CENTER); if (getIcon() != null) { result.setIcon(getIcon()); result.setIconTextGap(10); } result.setBackground(titleBgColor); result.setForeground(titleForeColor); result.setOpaque(true); result.setBorder(titleBorder); result.validate(); Dimension d = result.getPreferredSize(); result.setPreferredSize(new Dimension(Math.max(d.width, preferredWidth), d.height)); result.setMinimumSize(result.getPreferredSize()); return result; } protected void addActionsTo(Container cnt) { } protected JToolBar createToolBar() { JToolBar toolBar = new JToolBar(); toolBar.setFloatable(false); toolBar.setOpaque(false); addActionsTo(toolBar); return toolBar; } protected String checkEmptyString(String src, boolean trim, String msgCodeDefault) { String result = src; if (result != null && trim) result = result.trim(); if (result == null || result.length() == 0) result = options.getMsg(msgCodeDefault); return result; } public boolean showDialog(Editor e, String titleKey, Component cmp, boolean removeActionButtons) { if (removeActionButtons && southComponent != null) remove(southComponent); attachEditor(e, false); EditDialog dlg = new EditDialog(options, titleKey, JOptionPane.getFrameForComponent(cmp)); dlg.getContentPane().add(this, BorderLayout.CENTER); if (northComponent != null) { Dimension d = dlg.getContentPane().getPreferredSize(); d.width = northComponent.getPreferredSize().width; setPreferredSize(d); } dlg.showDialog(); removeEditor(dlg.result); return dlg.result; } public void focusGained(FocusEvent focusEvent) { if (getEditor() != null) getEditor().setActionsOwner(); else Editor.clearBasicActionsOwner(); } public void focusLost(FocusEvent focusEvent) { // do nothing! } } src/core/edu/xtec/jclic/edit/EditorTreePanel.java000066400000000000000000000104261335566474600222450ustar00rootroot00000000000000/* * File : EditorTreePanel.java * Created : 05-jun-2002 17:49 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.edit; import edu.xtec.util.Options; import java.awt.BorderLayout; import java.util.HashMap; import java.util.Map; import javax.swing.*; import javax.swing.event.*; import javax.swing.tree.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class EditorTreePanel extends JPanel implements TreeSelectionListener { Options options; public Editor currentItem; protected Map editPanels; protected boolean onlySelect; protected Class selectable; protected EditorPanel currentPanel; protected JTree tree; protected JPanel edit; protected Editor root; /** Creates new EditorTreePanel */ public EditorTreePanel(Editor root, Options options, boolean onlySelect, Class selectable) { super(new BorderLayout()); this.options = options; this.onlySelect = onlySelect; this.selectable = selectable; this.root = root; editPanels = new HashMap(); init(); } public JTree getTree() { return tree; } public void setRootEditor(Editor root) { this.root = root; tree.setModel(root.getTreeModel()); root.setCurrentTree(tree); } protected void init() { tree = root.createJTree(); if (onlySelect && selectable != null) { tree.setSelectionModel(new DefaultTreeSelectionModel() { @Override public void setSelectionPath(TreePath path) { Object o = path.getLastPathComponent(); if (o instanceof Editor) { Object u = ((Editor) o).getUserObject(); if (selectable.isInstance(u)) { super.setSelectionPath(path); return; } } resetRowSelection(); } }); } tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addTreeSelectionListener(this); if (onlySelect) { JScrollPane scroll = new JScrollPane(tree); scroll.setPreferredSize(new java.awt.Dimension(250, 300)); add(scroll, BorderLayout.CENTER); } else { edit = new JPanel(); edit.setLayout(new java.awt.BorderLayout()); edit.setPreferredSize(new java.awt.Dimension(250, 300)); JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, false, new JScrollPane(tree), edit); split.setResizeWeight(1); split.setPreferredSize(new java.awt.Dimension(520, 300)); add(split, BorderLayout.CENTER); SwingUtilities.invokeLater(new Runnable() { public void run() { tree.setSelectionInterval(0, 0); } }); } } public void valueChanged(TreeSelectionEvent treeSelectionEvent) { currentItem = null; Editor node = (Editor) tree.getLastSelectedPathComponent(); if (node == null) return; currentItem = node; currentItemChanged(); } protected void currentItemChanged() { if (edit != null) { if (currentPanel != null) { currentPanel.removeEditor(true); } Class pc = currentItem.getEditorPanelClass(); EditorPanel ep = editPanels.get(pc); if (ep == null) { ep = currentItem.createEditorPanel(options); editPanels.put(pc, ep); } ep.attachEditor(currentItem, true); if (currentPanel != ep) { if (currentPanel != null) edit.remove(currentPanel); edit.add(ep, BorderLayout.CENTER); edit.revalidate(); edit.repaint(); } currentPanel = ep; } } public EditorPanel getCurrentPanel() { return currentPanel; } } src/core/edu/xtec/jclic/fileSystem/000077500000000000000000000000001335566474600175505ustar00rootroot00000000000000src/core/edu/xtec/jclic/fileSystem/FileBackup.java000066400000000000000000000050771335566474600224310ustar00rootroot00000000000000/* * File : FileBackup.java * Created : 14-nov-2002 15:23 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.fileSystem; import java.io.File; import java.util.ArrayList; import java.util.List; /** @author Francesc Busquets (fbusquets@xtec.cat) */ public class FileBackup { File file; File backup; List createdDirs; static final String BAK_EXT = ".bak"; /** Creates a new instance of FileBackup */ public FileBackup(File file) throws java.io.IOException { this.file = file; if (file.exists() && file.isFile()) { backup = new File(file.getAbsolutePath() + BAK_EXT); if (backup.exists()) backup.delete(); file.renameTo(backup); } else if (!file.exists() && file.getParentFile() != null && !file.getParentFile().exists()) { File f = file.getParentFile(); createdDirs = new ArrayList(2); while (f != null && !f.exists()) { createdDirs.add(f); f = f.getParentFile(); } file.getParentFile().mkdirs(); } } public void rollback() throws java.io.IOException { if (backup != null) { if (file.exists()) file.delete(); backup.renameTo(file); backup = null; } else { file.delete(); file = null; if (createdDirs != null) { for (int i = 0; i < createdDirs.size(); i++) { File f = createdDirs.get(i); if (f.isDirectory()) f.delete(); } createdDirs = null; } } } public void cleanup() throws java.io.IOException { if (backup != null) { backup.delete(); backup = null; } } /** * Getter for property file. * * @return Value of property file. */ public java.io.File getFile() { return file; } /** * Getter for property backup. * * @return Value of property backup. */ public java.io.File getBackup() { return backup; } } src/core/edu/xtec/jclic/fileSystem/FilePCC.java000066400000000000000000000042671335566474600216310ustar00rootroot00000000000000/* * File : FilePCC.java * Created : 12-jul-2000 12:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.fileSystem; import edu.xtec.util.ResourceBridge; import java.io.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class FilePCC extends PCCFileSystem { RandomAccessFile raf; public FilePCC(String rootPath, String fName, ResourceBridge rb) throws Exception { super(rootPath, fName, rb); open(); } @Override protected void open() throws Exception { if (raf == null) { DataInputStream dis = super.getDataInputStream(pccName); initPCC(dis); dis.close(); raf = new RandomAccessFile(sysFn(getCanonicalNameOf(root + pccName)), "r"); } } protected byte[] getBytes(int entryNum) throws IOException { long fileSize = fe[entryNum].size; byte[] b = new byte[(int) fileSize]; raf.seek(fe[entryNum].offset); for (long k = 0; k < fileSize;) k += raf.read(b, (int) k, (int) (fileSize - k)); return b; } @Override protected void changeBase(String newRoot, String newFileName) throws Exception { if (raf != null) throw new Exception("Unable to change base fileName: FileSystem is open!"); super.changeBase(newRoot, newFileName); pccName = getCanonicalNameOf(newFileName); } @Override public void close() { if (raf != null) { try { raf.close(); } catch (Exception ex) { // eat exception } raf = null; } super.close(); } } src/core/edu/xtec/jclic/fileSystem/FileSystem.java000066400000000000000000000544241335566474600225100ustar00rootroot00000000000000/* * File : FileSystem.java * Created : 20-jun-2000 9:45 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.fileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.*; import java.awt.Component; import java.awt.Image; import java.awt.Toolkit; import java.io.*; import java.net.*; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.swing.JFileChooser; /** * Base class for Clic filesystems. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class FileSystem extends Object { public static final String FS = "/", WINFS = "\\"; public static final char FSCH = '/', WINFSCH = '\\'; protected static FileChooserForFiles fileChooser; private static final String FS_BAK = FS + ".."; public static java.util.HashMap altFileNames = new java.util.HashMap(); public String root; protected boolean isURL = false; protected Boolean ISURL = isURL; protected ResourceBridge rb = null; public FileSystem(ResourceBridge rb) { root = ""; this.rb = rb; } public FileSystem(String rootPath, ResourceBridge rb) { root = stdFn(rootPath); this.rb = rb; if (root == null) { root = ""; } if (root.length() > 0) { if (isStrUrl(root)) { isURL = true; ISURL = isURL; if (!root.endsWith(FS)) { root = root + FS; } root = getCanonicalNameOf(root); } else { File f = new File(sysFn(root)); String saveRoot = root; try { root = stdFn(f.getCanonicalPath()); } catch (Exception e) { root = saveRoot; } if (!root.endsWith(FS)) { root = root + FS; } } } } public FileSystem duplicate() throws Exception { return createFileSystem(root, rb); } protected void changeBase(String newRoot, String newFileName) throws Exception { File f = new File(sysFn(newRoot)); String saveRoot = root; try { root = stdFn(f.getCanonicalPath()); } catch (Exception e) { root = saveRoot; } if (!root.endsWith(FS)) { root = root + FS; } } public static String stdFn(String s) { return s == null ? s : s.replace(WINFSCH, FSCH); } public static String sysFn(String s) { String result = s; if (result != null) { result = stdFn(result).replace(FSCH, File.separatorChar); if (result.indexOf("%20") >= 0) { result = StrUtils.replace(result, "%20", " "); } } return result; } public static FileSystem createFileSystem(String rootPath, String fileName, ResourceBridge rb) throws Exception { if (fileName == null) { return new FileSystem(rootPath, rb); } else if (fileName.endsWith(".pcc")) { return PCCFileSystem.createPCCFileSystem(rootPath, fileName, rb); } else if (fileName.endsWith(".zip")) { return ZipFileSystem.createZipFileSystem(rootPath, fileName, rb); } else { throw new Exception("unknown format " + fileName); } } public static FileSystem createFileSystem(String fullPath, ResourceBridge rb) throws Exception { fullPath = getCanonicalNameOf(fullPath, null); String fileName = null; String rootPath = getPathPartOf(fullPath); if (fullPath.endsWith(".pcc") || fullPath.endsWith(".zip")) { fileName = getFileNameOf(fullPath); } return createFileSystem(rootPath, fileName, rb); } public String getFullFileNamePath(String fName) { if (fName == null || fName.length() == 0) { return root.length() > 0 ? root.substring(0, root.length() - 1) : root; } String result = getCanonicalNameOf(fName); if (!isURL) { File f = new File(sysFn(result)); if (!f.isAbsolute()) { result = getCanonicalNameOf(root + result); } } else { if (!isStrUrl(result)) { result = getCanonicalNameOf(root + result); } } return result; } public String getRelativeFileNamePath(String fName) { String s = stdFn(fName); if (s == null || s.length() < root.length() || !s.substring(0, root.length()).equalsIgnoreCase(root)) { return s; } else { return s.substring(root.length()); } } public String getFullRoot() { return root; } public boolean isUrlBased() { return isURL; } public static boolean isStrUrl(String s) { return s != null && (s.startsWith("http:") || s.startsWith("https:") || s.startsWith("ftp:") || s.startsWith("mailto:")); } public String getUrl(String fileName) { String s = stdFn(fileName); if (s == null || isStrUrl(s) || s.startsWith("file:")) { return s; } if (!(s.charAt(1) == ':') && !s.startsWith(FS)) { s = getFullFileNamePath(s); } if (isURL) { return getCanonicalNameOf(s, ISURL); } else { return "file://" + sysFn(getCanonicalNameOf(s, ISURL)); } } public String getCanonicalNameOf(String fileName) { return getCanonicalNameOf(fileName, ISURL); } public static String getCanonicalNameOf(String fileName, Boolean isUrl) { String fn = stdFn(fileName); boolean flagUrl = (isUrl != null ? isUrl.booleanValue() : isStrUrl(fn)); String prefix = ""; int cut = -1; if (fn.startsWith("file:")) { fn = fn.substring(5); } if (isStrUrl(fn)) { int k = fn.indexOf('@'); if (k < 0) { k = 7; } cut = fn.indexOf(FSCH, k); } else if (fn.length() > 2 && fn.charAt(1) == ':') { cut = (fn.charAt(2) == FSCH ? 2 : 1); } else if (fn.startsWith("//")) { int i = fn.indexOf(FSCH, 2); cut = fn.indexOf(FSCH, i + 1); } else if (fn.startsWith(FS)) { cut = 0; } if (cut >= 0) { prefix = fn.substring(0, cut + 1); fn = fn.substring(cut + 1); } // intercept '\...' int r; while ((r = fn.indexOf(FS_BAK)) >= 0) { int p; for (p = r - 1; p >= 0; p--) { if (fn.charAt(p) == FSCH) { break; } } StringBuilder newfn = new StringBuilder(); if (p >= 0) { newfn.append(fn.substring(0, p + 1)); } if (r + 4 < fn.length()) { newfn.append(fn.substring(r + 4)); } fn = newfn.substring(0); } return prefix + fn; } public static String getPathPartOf(String fullPath) { String s = stdFn(fullPath); int i = s.lastIndexOf(FS); return i < 0 ? "" : s.substring(0, i + 1); } public static String getFileNameOf(String fullPath) { String s = stdFn(fullPath); int i = s.lastIndexOf(FS); return i < 0 ? s : s.substring(i + 1); } public byte[] getBytes(String fileName) throws IOException { return StreamIO.readInputStream(getInputStream(fileName)); } public Image getImageFile(String fName) throws Exception { return Toolkit.getDefaultToolkit().createImage(getBytes(fName)); } public long getFileLength(String fName) throws IOException { long length; if (isURL) { // Updated 04-Aug-2014 to solve GitHub issue #5 // https://github.com/projectestac/jclic/issues/5 URL url = new URL(getFullFileNamePath(fName).replace(" ", "%20")); URLConnection c = url.openConnection(); length = c.getContentLength(); } else { File f = new File(sysFn(getFullFileNamePath(fName))); length = f.length(); } return length; } public boolean fileExists(String fName) { boolean result; try { if (isURL) { // Updated 04-Aug-2014 to solve GitHub issue #5 // https://github.com/projectestac/jclic/issues/5 URL url = new URL(getFullFileNamePath(fName).replace(" ", "%20")); URLConnection c = url.openConnection(); result = (c.getContentLength() > 0); } else { File f = new File(sysFn(getFullFileNamePath(fName))); result = f.exists(); } } catch (Exception ex) { // eat exception result = false; } return result; } public boolean realFileExists(String fName) { return fileExists(fName); } public InputStream getInputStream(String fName) throws IOException { InputStream result; int length; if (isURL) { // Updated 04-Aug-2014 to solve GitHub issue #5 // https://github.com/projectestac/jclic/issues/5 URL url = new URL(getFullFileNamePath(fName).replace(" ", "%20")); URLConnection c = url.openConnection(); if(c instanceof HttpURLConnection) { HttpURLConnection hc = (HttpURLConnection)c; int status = hc.getResponseCode(); if(status != HttpURLConnection.HTTP_OK) { // Manually handle redirect from HTTP to HTTPS due to https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4959149 if (status < 300 || status > 308) throw new java.io.FileNotFoundException("HTTP error " + status + ": " + hc.getResponseMessage()); String redirectLocation = hc.getHeaderField("Location"); if(redirectLocation == null || redirectLocation.trim().length() == 0) throw new java.net.UnknownServiceException("Redirect without 'Location'"); if(root.startsWith("http:") && redirectLocation.startsWith("https:")) // HTTP to HTTPS redirection: Change root protocol for future requests root = "https:" + root.substring(5); url = new URL(redirectLocation); c = url.openConnection(); } } length = c.getContentLength(); result = c.getInputStream(); } else { File f = new File(sysFn(getFullFileNamePath(fName))); if (!f.exists()) { String alt = (String) altFileNames.get(fName); if (alt != null) { f = new File(sysFn(getFullFileNamePath(alt))); } } length = (int) f.length(); result = new FileInputStream(f); } if (result != null && rb != null) { result = rb.getProgressInputStream(result, length, fName); } return result; } public Object getMediaDataSource(String fName) throws Exception { if (isURL) { return getExtendedByteArrayInputStream(fName); } return new StringBuilder("file:").append(getFullFileNamePath(fName)).substring(0); } public edu.xtec.util.ExtendedByteArrayInputStream getExtendedByteArrayInputStream(String fName) throws Exception { return new edu.xtec.util.ExtendedByteArrayInputStream(getBytes(fName), fName); } public static org.jdom.Document getXMLDocument(InputStream is) throws Exception { org.jdom.Document doc = JDomUtility.getSAXBuilder().build(is); edu.xtec.util.JDomUtility.clearNewLineElements(doc.getRootElement()); return doc; } public org.jdom.Document getXMLDocument(String fName) throws Exception { org.jdom.Document doc = buildDoc(fName, JDomUtility.getSAXBuilder()); edu.xtec.util.JDomUtility.clearNewLineElements(doc.getRootElement()); return doc; } protected org.jdom.Document buildDoc(String fName, org.jdom.input.SAXBuilder builder) throws Exception { return builder.build(getInputStream(fName)); } public void close() { // nothing to do } protected void open() throws Exception { // nothing to do } @Override protected void finalize() throws Throwable { try { close(); } finally { super.finalize(); } } public static FileChooserForFiles getFileChooser(String root) { if (fileChooser == null) { fileChooser = new FileChooserForFiles(); if (root != null) { fileChooser.setCurrentDirectory(new File(sysFn(root))); } } return fileChooser; } public String chooseFile(String defaultValue, boolean save, int[] filters, Options options, String titleKey, Component dlgOwner, boolean proposeMove) { String result = null; String[] files = chooseFiles(defaultValue, save, filters, options, titleKey, dlgOwner, proposeMove, false); if (files != null && files.length > 0) { result = files[0]; } return result; } public String[] chooseFiles(String defaultValue, boolean save, int[] filters, Options options, String titleKey, Component dlgOwner, boolean proposeMove, boolean multiSelection) { String[] result = null; FileChooserForFiles chooser; if (save) { multiSelection = false; } if (options != null) { Messages msg = options.getMessages(); if (isURL) { if (save) { msg.showErrorWarning(dlgOwner, "filesystem_saveURLerror", null); } else { String s = msg.showInputDlg(dlgOwner, "filesystem_enterURL", "URL", "http://", titleKey != null ? titleKey : "filesystem_openURL", false); if (s != null) { result = new String[]{s}; } } } else if ((chooser = getFileChooser(root)) != null) { chooser.setApproveButtonToolTipText(msg.get(save ? "FILE_SAVE_TOOLTIP" : "FILE_OPEN_TOOLTIP")); chooser.setDialogType(save ? JFileChooser.SAVE_DIALOG : JFileChooser.OPEN_DIALOG); chooser.setApproveButtonText(msg.get(save ? "SAVE" : "OPEN")); chooser.setMultiSelectionEnabled(multiSelection); chooser.setDialogTitle(msg.get(titleKey != null ? titleKey : save ? "FILE_SAVE" : "FILE_OPEN")); chooser.resetChoosableFileFilters(); if (filters != null) { chooser.setAcceptAllFileFilterUsed(false); for (int i = 0; i < filters.length; i++) { if (i == filters.length - 1) { chooser.setFileFilter(Utils.getFileFilter(filters[i], msg)); } else { chooser.addChoosableFileFilter(Utils.getFileFilter(filters[i], msg)); } } } else { chooser.setAcceptAllFileFilterUsed(true); } String s = StrUtils.nullableString(defaultValue); boolean dummyFile = false; if (s == null) { s = "."; dummyFile = true; } chooser.directSetSelectedFile(new File(sysFn(getFullFileNamePath(s)))); if (dummyFile) { chooser.directSetSelectedFile(null); } int retVal; boolean done = false; while (!done) { if (save) { retVal = chooser.showSaveDialog(dlgOwner); } else { retVal = chooser.showOpenDialog(dlgOwner); } if (retVal == JFileChooser.APPROVE_OPTION) { File[] files = multiSelection ? chooser.getSelectedFiles() : new File[]{chooser.getSelectedFile()}; result = new String[files.length]; for (int i = 0; i < files.length; i++) { File f = files[i].getAbsoluteFile(); result[i] = getRelativeFileNamePath(stdFn(f.getAbsolutePath())); if (save) { javax.swing.filechooser.FileFilter filter = chooser.getFileFilter(); if (filter instanceof SimpleFileFilter) { f = ((SimpleFileFilter) filter).checkFileExtension(f); result[i] = getRelativeFileNamePath(stdFn(f.getAbsolutePath())); } done = (msg.confirmOverwriteFile(dlgOwner, f, "yn") == Messages.YES); } else { done = msg.confirmReadableFile(dlgOwner, f); if (done && proposeMove && root.length() > 0 && result[i].indexOf(FS) >= 0 && msg.showQuestionDlgObj(dlgOwner, new String[]{msg.get("filesystem_copyToRoot_1") + " " + result[i], msg.get("filesystem_copyToRoot_2"), msg.get("filesystem_copyToRoot_3"), msg.get("filesystem_copyToRoot_4"),}, "CONFIRM", "yn") == Messages.YES) { String name = stdFn(f.getName()); File destFile = new File(sysFn(getFullFileNamePath(name))); if (msg.confirmOverwriteFile(dlgOwner, destFile, "yn") == Messages.YES) { try { OutputStream os = createSecureFileOutputStream(name, false); InputStream is = getInputStream(result[i]); if (StreamIO.writeStreamDlg(is, os, (int) f.length(), msg.get("filesystem_copyFile"), dlgOwner, options)) { result[i] = name; } else if (destFile.exists()) { destFile.delete(); } } catch (Exception ex) { msg.showErrorWarning(dlgOwner, "ERROR", ex); } } } } if (!done) { break; } } } else { result = null; done = true; } } } } return result; } class SecureFileOutputStream extends FileOutputStream { boolean closed; boolean isZip; File tempFile; File destFile; /** * Creates new SecureFileOutputStream */ private SecureFileOutputStream(File tempFile, File destFile, boolean isZip) throws FileNotFoundException { super(tempFile); this.tempFile = tempFile; this.destFile = destFile; this.isZip = isZip; closed = false; } @Override public void close() throws IOException { super.close(); if (!closed) { closed = true; if (destFile != null) { if (isZip) { // Check ZIP file integrity before continue try { ZipFile zip = new ZipFile(tempFile.getAbsolutePath()); Enumeration entries = zip.entries(); while (entries.hasMoreElements()) { ZipEntry en = (ZipEntry) entries.nextElement(); if (en.getName().length() < 1 || (!en.isDirectory() && en.getSize() < 1)) { throw new IOException("ZIP file has invalid entries!"); } } // Not needed because no input streams requested, but let's enforce security: zip.close(); } catch (Exception ex) { throw new IOException("Error writting ZIP file: " + ex.getMessage()); } } boolean isCurrentFs = getFullRoot().equals(stdFn(destFile.getAbsolutePath())); if (isCurrentFs) { FileSystem.this.close(); } if (destFile.exists()) { destFile.delete(); } boolean renamed = tempFile.renameTo(destFile); if (!renamed) { System.err.println("WARNING: Unable to rename " + tempFile + " to " + destFile.getName()); } if (isCurrentFs) { try { if (!renamed) { // Try to continue using the temp file as base changeBase(tempFile.getParent(), tempFile.getName()); } FileSystem.this.open(); } catch (Exception ex) { throw new IOException(ex.getMessage()); } } } } } } public FileOutputStream createSecureFileOutputStream(String fileName, boolean isZip) throws IOException { FileOutputStream result; File file = new File(sysFn(getFullFileNamePath(fileName))); // 27-Sept-2006: Create parent directories if they don't exists file.getParentFile().mkdirs(); // --------- File tmp = File.createTempFile("tmp", ".tmp", file.getParentFile()); result = new SecureFileOutputStream(tmp, file, isZip); return result; } // 16-Mar-2015: Added maxRecursion and maxFiles to prevent hangs in large file // systems public static void exploreFiles(String prefix, File f, List v, char pathSep, FileFilter filter, int maxRecursion, int maxFiles) { File[] files = filter == null ? f.listFiles() : f.listFiles(filter); StringBuilder sb = new StringBuilder(); for (File file : files) { sb.setLength(0); if (file.isDirectory()) { if (maxRecursion != 0) { if (prefix != null) { sb.append(prefix); } sb.append(file.getName()).append(pathSep); exploreFiles(sb.substring(0), file, v, pathSep, filter, maxRecursion - 1, maxFiles); } } else { if (prefix != null) { sb.append(prefix); } v.add(sb.append(file.getName()).substring(0)); } if (maxFiles > 0 && v.size() >= maxFiles) { break; } } } // Modified 10-Aug-2015 // Allow only plain ASCII characters, dot, numbers and underscore // private static final String FNAME_VALID_CHARS = // "_!~0123456789abcdefghijklmnopqrstuvwxyz"; private static final String FNAME_VALID_CHARS = "_-.0123456789abcdefghijklmnopqrstuvwxyz"; // Modified 26-jul0-2006 // Scope of character conversion limited to the basic ANSI (Latin1) set public static final String FNAME_CONVERTIBLE_CHARS = "\u00e1\u00e0\u00e4\u00e2\u00e3\u00e9\u00e8\u00eb\u00ea\u00ed\u00ec\u00ef\u00ee\u00f3\u00f2\u00f6\u00f4\u00f5\u00fa\u00f9\u00fc\u00fb\u00f1\u00e7\u20ac\u00ba\u00aa\u00e5\u00e6\u00f8\u00fd\u00fe\u00ff\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9"; private static final String FNAME_EQUIVALENT_CHARS = "aaaaaeeeeiiiiooooouuuunceoaaaoypyabgdezhtjklmnkoprsstufxpo"; public static String getValidFileName(String fn) { String result = null; if (fn != null) { StringBuilder sb = new StringBuilder(); for (char ch : fn.toCharArray()) { ch = Character.toLowerCase(ch); if (FNAME_VALID_CHARS.indexOf(ch) < 0) { int p = FNAME_CONVERTIBLE_CHARS.indexOf(ch); if (p >= 0) { ch = FNAME_EQUIVALENT_CHARS.charAt(p); } else { ch = '_'; } } sb.append(ch); } result = sb.substring(0); } return result; } } src/core/edu/xtec/jclic/fileSystem/FileZip.java000066400000000000000000000053501335566474600217600ustar00rootroot00000000000000/* * File : FileZip.java * Created : 25-sep-2001 10:53 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.fileSystem; import edu.xtec.util.ResourceBridge; import edu.xtec.util.StreamIO; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class FileZip extends ZipFileSystem { protected ZipFile zip; /** Creates new ZipFileSystem */ public FileZip(String rootPath, String fName, ResourceBridge rb) throws Exception { super(rootPath, fName, rb); open(); } @Override protected void open() throws Exception { if (zip == null) { zip = new ZipFile(sysFn(root + zipName)); Enumeration en = zip.entries(); ArrayList v = new ArrayList(); while (en.hasMoreElements()) v.add(new FileZipEntry((ZipEntry) en.nextElement())); entries = v.toArray(new FileZipEntry[v.size()]); } } protected class FileZipEntry extends ExtendedZipEntry { FileZipEntry(ZipEntry entry) { super(entry); } public byte[] getBytes() throws IOException { return StreamIO.readInputStream(getInputStream()); } public InputStream getInputStream() throws IOException { InputStream is = zip.getInputStream(this); if (rb != null) is = rb.getProgressInputStream(is, (int) getSize(), getName()); return is; } } @Override public void close() { if (zip != null) { try { zip.close(); } catch (Exception ex) { // eat exception } zip = null; } super.close(); } @Override protected void changeBase(String newRoot, String newFileName) throws Exception { if (zip != null) throw new Exception("Unable to change base fileName: FileSystem is open!"); super.changeBase(newRoot, newFileName); zipName = getCanonicalNameOf(newFileName); entries = null; loaded = false; } } src/core/edu/xtec/jclic/fileSystem/PCCFileSystem.java000066400000000000000000000135461335566474600230360ustar00rootroot00000000000000/* * File : PCCFileSystem.java * Created : 20-jun-2000 10:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.fileSystem; import edu.xtec.jclic.clic3.Clic3; import edu.xtec.util.ResourceBridge; import java.awt.Image; import java.awt.Toolkit; import java.io.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public abstract class PCCFileSystem extends FileSystem { String pccName; public String pccVersion; public String pccDescription; public int numFiles; public int baseOffset; PCCFileEntry[] fe; public PCCFileSystem(ResourceBridge rb) { super("", rb); } public PCCFileSystem(String rootPath, String pccFileName, ResourceBridge rb) { super(rootPath, rb); pccName = getCanonicalNameOf(pccFileName); } public static PCCFileSystem createPCCFileSystem(String rootPath, String pccFileName, ResourceBridge rb) throws Exception { if (isStrUrl(rootPath)) return new UrlPCC(rootPath, pccFileName, rb); else return new FilePCC(rootPath, pccFileName, rb); } @Override public String getFullRoot() { return root + pccName; } protected class PCCFileEntry extends Object { String fileName; long size, offset; public PCCFileEntry(String fName, long o, long s) { fileName = stdFn(fName); size = s; offset = o; } } void initPCC(DataInputStream dis) throws Exception { if ((pccVersion = extractLineFromDIS(dis)) != null && pccVersion.compareTo("PCC00") == 0) { pccDescription = extractLineFromDIS(dis); numFiles = extractShortInt(dis); baseOffset = (int) extractShortLong(dis); fe = new PCCFileEntry[numFiles]; for (int i = 0; i < numFiles; i++) { fe[i] = new PCCFileEntry(Clic3.validFileName(extractSzString(dis)), extractShortLong(dis), extractShortLong(dis)); if (fe[i].fileName.length() == 0) break; } } } public String getEntryInfo(int n) { return (n < 0 || n >= numFiles) ? "OUT OF INDEX!" : fe[n].toString(); } public String getEntryName(int n) { return (n < 0 || n >= numFiles) ? "OUT OF INDEX!" : fe[n].fileName; } public int getEntryNum(String fName) { int i = -1; String normalizedFName = stdFn(fName); if (numFiles > 0) { for (i = 0; i < numFiles; i++) { if (fe[i].fileName.equals(normalizedFName)) break; } } if (i == numFiles && altFileNames.get(fName) != null) { // not found, but found in altFileNames! normalizedFName = stdFn((String) altFileNames.get(fName)); for (i = 0; i < numFiles; i++) { if (fe[i].fileName.equals(normalizedFName)) break; } } return (i == numFiles ? -1 : i); } protected abstract byte[] getBytes(int entryNum) throws IOException; @Override public byte[] getBytes(String fileName) throws IOException { int entryNum; if ((entryNum = getEntryNum(fileName)) == -1) return super.getBytes(fileName); return getBytes(entryNum); } @Override public long getFileLength(String fileName) throws IOException { int entryNum; return (entryNum = getEntryNum(fileName)) == -1 ? super.getFileLength(fileName) : fe[entryNum].size; } @Override public Image getImageFile(String fName) throws Exception { int entryNum; return (entryNum = getEntryNum(fName)) == -1 ? super.getImageFile(fName) : Toolkit.getDefaultToolkit().createImage(getBytes(entryNum)); } public java.io.DataInputStream getDataInputStream(String fName) throws IOException { return new DataInputStream(super.getInputStream(fName)); } public String extractLine(BufferedReader bfr) throws IOException { return bfr.readLine(); } public String extractLineFromDIS(DataInputStream dis) throws IOException { StringBuilder str = new StringBuilder(); boolean skipNext = false; while (true) { byte b = dis.readByte(); if (skipNext) break; else if (b == 0x0D) skipNext = true; else str.append((char) b); } return str.substring(0); } public String extractSzString(BufferedReader bfr) throws IOException { StringBuilder str = new StringBuilder(); char b[] = new char[1]; while (true) { bfr.read(b, 0, 1); if (b[0] == 0) break; else str.append(b[0]); } return str.substring(0); } public String extractSzString(DataInputStream dis) throws IOException { StringBuilder str = new StringBuilder(); while (true) { byte b = dis.readByte(); if (b == 0) break; else str.append((char) b); } return str.substring(0); } public int extractShortInt(DataInputStream bfr) throws IOException { int bt = bfr.readUnsignedByte(); int r = bt; bt = bfr.readUnsignedByte(); r += (bt << 8); return r; } public long extractShortLong(DataInputStream bfr) throws IOException { long bt = bfr.readUnsignedByte(); long r = bt; bt = bfr.readUnsignedByte(); r += (bt << 8); bt = bfr.readUnsignedByte(); r += (bt << 16); bt = bfr.readUnsignedByte(); r += (bt << 24); return r; } @Override public void close() { fe = null; super.close(); } } src/core/edu/xtec/jclic/fileSystem/UrlPCC.java000066400000000000000000000033011335566474600215000ustar00rootroot00000000000000/* * File : UrlPCC.java * Created : 12-jul-2000 12:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.fileSystem; import edu.xtec.util.ResourceBridge; import java.io.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class UrlPCC extends PCCFileSystem { byte[] pccBytes = null; public UrlPCC(String rootPath, String fName, ResourceBridge rb) throws Exception { super(rootPath, fName, rb); pccBytes = super.getBytes(pccName); ByteArrayInputStream bais = new ByteArrayInputStream(pccBytes); DataInputStream dis = new DataInputStream(bais); initPCC(dis); dis.close(); } protected byte[] getBytes(int entryNum) throws IOException { long fileSize = fe[entryNum].size; long offset = fe[entryNum].offset; byte[] b = new byte[(int) fileSize]; if (fileSize > 0) System.arraycopy(pccBytes, (int) offset, b, 0, (int) fileSize); return b; } @Override public void close() { pccBytes = null; super.close(); } } src/core/edu/xtec/jclic/fileSystem/UrlZip.java000066400000000000000000000043131335566474600216410ustar00rootroot00000000000000/* * File : UrlZip.java * Created : 25-sep-2001 10:54 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.fileSystem; import edu.xtec.util.ResourceBridge; import java.io.*; import java.util.ArrayList; import java.util.zip.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class UrlZip extends ZipFileSystem { /** Creates new ZipFileSystem */ public UrlZip(String rootPath, String fName, ResourceBridge rb) throws Exception { super(rootPath, fName, rb); ZipInputStream zis = new ZipInputStream(super.getInputStream(fName)); ArrayList v = new ArrayList(); ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = zis.read(buffer, 0, 1024)) > 0) baos.write(buffer, 0, bytesRead); v.add(new UrlZipEntry(entry, baos.toByteArray())); zis.closeEntry(); } zis.close(); entries = v.toArray(new UrlZipEntry[v.size()]); } protected class UrlZipEntry extends ExtendedZipEntry { byte[] data; UrlZipEntry(ZipEntry entry) { super(entry); data = null; } UrlZipEntry(ZipEntry entry, byte[] setData) { super(entry); data = setData; } public byte[] getBytes() throws IOException { return data; } public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(data); } } } src/core/edu/xtec/jclic/fileSystem/ZipFileSystem.java000066400000000000000000000111041335566474600231570ustar00rootroot00000000000000/* * File : ZipFileSystem.java * Created : 24-sep-2001 19:48 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.fileSystem; import edu.xtec.util.ResourceBridge; import java.awt.Image; import java.awt.Toolkit; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.zip.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public abstract class ZipFileSystem extends FileSystem { String zipName; protected boolean loaded; ExtendedZipEntry[] entries; public ZipFileSystem(ResourceBridge rb) { super("", rb); entries = null; zipName = null; loaded = false; } public ZipFileSystem(String rootPath, String zipFileName, ResourceBridge rb) { super(rootPath, rb); zipName = getCanonicalNameOf(zipFileName); entries = null; loaded = false; } public static ZipFileSystem createZipFileSystem(String rootPath, String zipFileName, ResourceBridge rb) throws Exception { if (isStrUrl(rootPath)) return new UrlZip(rootPath, zipFileName, rb); else return new FileZip(rootPath, zipFileName, rb); } @Override public String getFullRoot() { return root + zipName; } public String getZipName() { return zipName; } public abstract class ExtendedZipEntry extends ZipEntry { public boolean ignore; ExtendedZipEntry(ZipEntry entry) { super(entry); } public abstract byte[] getBytes() throws IOException; public abstract InputStream getInputStream() throws IOException; @Override public String getName() { return stdFn(super.getName()); } } public ExtendedZipEntry getEntry(String fName) { if (fName == null || fName.length() == 0 || entries == null) return null; String name = getCanonicalNameOf(fName); for (ExtendedZipEntry eze : entries) if (!eze.ignore && eze.getName().equals(name)) return eze; return null; } @Override public byte[] getBytes(String fileName) throws IOException { ExtendedZipEntry entry; if ((entry = getEntry(fileName)) == null) return super.getBytes(fileName); else return entry.getBytes(); } @Override public boolean fileExists(String fName) { return getEntry(fName) != null; } @Override public boolean realFileExists(String fName) { return super.fileExists(fName); } @Override public long getFileLength(String fileName) throws IOException { ExtendedZipEntry entry; if ((entry = getEntry(fileName)) == null) return super.getFileLength(fileName); else return entry.getSize(); } @Override public Image getImageFile(String fName) throws Exception { ExtendedZipEntry entry; if ((entry = getEntry(fName)) == null) return super.getImageFile(fName); return Toolkit.getDefaultToolkit().createImage(entry.getBytes()); } @Override public InputStream getInputStream(String fName) throws IOException { ExtendedZipEntry entry; if ((entry = getEntry(fName)) == null) return super.getInputStream(fName); return entry.getInputStream(); } @Override public Object getMediaDataSource(String fName) throws Exception { ExtendedZipEntry entry; if ((entry = getEntry(fName)) == null) return super.getMediaDataSource(fName); return new edu.xtec.util.ExtendedByteArrayInputStream(entry.getBytes(), fName); } public String[] getEntries(String ext) throws Exception { String[] result = null; if (entries != null && entries.length > 0) { ArrayList v = new ArrayList(); for (ExtendedZipEntry eze : entries) { String entryName = eze.getName(); if (ext == null || entryName.endsWith(ext)) v.add(entryName); } if (!v.isEmpty()) result = v.toArray(new String[v.size()]); } return result; } @Override public void close() { entries = null; super.close(); } } src/core/edu/xtec/jclic/media/000077500000000000000000000000001335566474600165035ustar00rootroot00000000000000src/core/edu/xtec/jclic/media/ActiveMediaBag.java000066400000000000000000000062561335566474600221440ustar00rootroot00000000000000/* * File : ActiveMediaBag.java * Created : 02-may-2001 11:28 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.*; import edu.xtec.jclic.bags.MediaBag; import java.util.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ActiveMediaBag extends HashSet { /** Creates new ActiveMediaBag */ public ActiveMediaBag() { } public ActiveMediaPlayer createActiveMediaPlayer(MediaContent mc, MediaBag mb, PlayStation ps) { ActiveMediaPlayer amp = null; switch (mc.mediaType) { case MediaContent.RECORD_AUDIO: if (mc.length <= 0 || mc.length >= AudioBuffer.MAX_RECORD_LENGTH) break; case MediaContent.PLAY_RECORDED_AUDIO: if (mc.recBuffer < 0 || mc.recBuffer >= ActiveMediaPlayer.AUDIO_BUFFERS) break; case MediaContent.PLAY_AUDIO: case MediaContent.PLAY_MIDI: case MediaContent.PLAY_VIDEO: amp = ActiveMediaPlayer.createActiveMediaPlayer(mc, mb, ps); break; } if (amp != null) add(amp); return amp; } public ActiveMediaPlayer getActiveMediaPlayer(MediaContent mc, MediaBag mb, PlayStation ps) { ActiveMediaPlayer amp = null; for (Iterator i = iterator(); i.hasNext();) { amp = (ActiveMediaPlayer) i.next(); if (amp.getMediaContent() == mc || amp.getMediaContent().isEquivalent(mc)) break; amp = null; } if (amp == null) amp = createActiveMediaPlayer(mc, mb, ps); return amp; } public void removeActiveMediaPlayer(MediaContent mc) { ActiveMediaPlayer amp = null; for (Iterator i = iterator(); i.hasNext();) { amp = (ActiveMediaPlayer) i.next(); if (amp.getMediaContent() == mc) break; amp = null; } if (amp != null) { amp.clear(); remove(amp); } } public void realizeAll() { for (Iterator i = iterator(); i.hasNext();) { ActiveMediaPlayer amp = i.next(); amp.realize(); } } public void stopAll() { stopAll(-1); } public void stopAll(int level) { for (Iterator i = iterator(); i.hasNext();) { ActiveMediaPlayer amp = (ActiveMediaPlayer) i.next(); if (level == -1 || amp.getMediaContent().level <= level) amp.stop(); } } public void removeAll() { for (Iterator i = iterator(); i.hasNext();) { ActiveMediaPlayer amp = (ActiveMediaPlayer) i.next(); amp.clear(); } clear(); ActiveMediaPlayer.clearAllAudioBuffers(); } } src/core/edu/xtec/jclic/media/ActiveMediaPlayer.java000066400000000000000000000210141335566474600226740ustar00rootroot00000000000000/* * File : ActiveMediaPlayer.java * Created : 27-may-2002 18:43 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.*; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.boxes.ActiveBox; import edu.xtec.util.GlobalMouseAdapter; import edu.xtec.util.Options; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public abstract class ActiveMediaPlayer { public static final int AUDIO_BUFFERS = 10; protected static final AudioBuffer[] audioBuffer = new AudioBuffer[AUDIO_BUFFERS]; MediaContent mc; PlayStation ps; ActiveBox bx; Component visualComponent; GlobalMouseAdapter mouseAdapter; boolean useAudioBuffer; public static ActiveMediaPlayer createActiveMediaPlayer(MediaContent mc, MediaBag mb, PlayStation ps) { ActiveMediaPlayer result = null; String playerClassName = null; String ms = ps.getOptions().getString(Constants.MEDIA_SYSTEM); switch (mc.mediaType) { case MediaContent.RECORD_AUDIO: case MediaContent.PLAY_RECORDED_AUDIO: if (ps.getOptions().getBoolean(Options.MAC)) { if (Constants.QT61.equals(ms)) { playerClassName = "edu.xtec.jclic.media.QT61ActiveMediaPlayer"; break; } } case MediaContent.PLAY_AUDIO: case MediaContent.PLAY_MIDI: playerClassName = "edu.xtec.jclic.media.JavaSoundActiveMediaPlayer"; break; default: if (Constants.QT61.equals(ms)) playerClassName = "edu.xtec.jclic.media.QT61ActiveMediaPlayer"; else if (Constants.JMF.equals(ms)) playerClassName = "edu.xtec.jclic.media.JMFActiveMediaPlayer"; else CheckMediaSystem.warn(ps.getOptions()); break; } if (playerClassName != null) { try { Class c = Class.forName(playerClassName); java.lang.reflect.Constructor cons = c .getConstructor(new Class[] { edu.xtec.jclic.media.MediaContent.class, edu.xtec.jclic.bags.MediaBag.class, edu.xtec.jclic.PlayStation.class }); result = (ActiveMediaPlayer) cons.newInstance(new Object[] { mc, mb, ps }); } catch (Exception ex) { System.err.println("Error building media player:\n" + ex); } } return result; } /** Creates new MediaContentPlayer */ protected ActiveMediaPlayer(MediaContent mc, MediaBag mb, PlayStation ps) { this.mc = mc; this.ps = ps; bx = null; visualComponent = null; mouseAdapter = null; useAudioBuffer = false; try { switch (mc.mediaType) { case MediaContent.RECORD_AUDIO: clearAudioBuffer(mc.recBuffer); audioBuffer[mc.recBuffer] = createAudioBuffer(mc.length); case MediaContent.PLAY_RECORDED_AUDIO: useAudioBuffer = true; break; default: break; } } catch (Exception ex) { System.err.println("Error:\n" + ex); } } public abstract AudioBuffer createAudioBuffer(int seconds) throws Exception; public abstract void realize(); public void play(final edu.xtec.jclic.boxes.ActiveBox setBx) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { stopAllAudioBuffers(); playNow(setBx); } }); } protected void playNow(edu.xtec.jclic.boxes.ActiveBox setBx) { try { switch (mc.mediaType) { case MediaContent.RECORD_AUDIO: if (audioBuffer[mc.recBuffer] != null) { audioBuffer[mc.recBuffer].record(ps, setBx); } break; case MediaContent.PLAY_RECORDED_AUDIO: if (audioBuffer[mc.recBuffer] != null) audioBuffer[mc.recBuffer].play(); break; default: break; } } catch (Exception e) { System.err.println("Error playing media \"" + mc.mediaFileName + "\":\n" + e); } } public void stop() { if (useAudioBuffer) stopAudioBuffer(mc.recBuffer); } @Override protected void finalize() throws Throwable { clear(); super.finalize(); } public void clear() { stop(); if (useAudioBuffer) clearAudioBuffer(mc.recBuffer); } protected abstract void setTimeRanges(); public static void clearAudioBuffer(int buffer) { if (buffer >= 0 && buffer < AUDIO_BUFFERS && audioBuffer[buffer] != null) { audioBuffer[buffer].clear(); audioBuffer[buffer] = null; } } public static void clearAllAudioBuffers() { for (int i = 0; i < AUDIO_BUFFERS; i++) clearAudioBuffer(i); } public static int countActiveBuffers() { int c = 0; for (AudioBuffer ab : audioBuffer) if (ab != null) c++; return c; } public static void stopAllAudioBuffers() { for (AudioBuffer ab : audioBuffer) if (ab != null) ab.stop(); } public static void stopAudioBuffer(int buffer) { if (buffer >= 0 && buffer < AUDIO_BUFFERS && audioBuffer[buffer] != null) audioBuffer[buffer].stop(); } public void checkVisualComponentBounds(ActiveBox bxi) { if (visualComponent == null) return; Rectangle enclosingRect = new Rectangle(); if (!mc.free) enclosingRect.setBounds(bxi.getBounds()); else enclosingRect.setBounds(ps.getComponent().getBounds()); Point offset = new Point(); Dimension dim = new Dimension(visualComponent.getPreferredSize()); if (mc.absLocation != null) { offset.setLocation(mc.absLocation); if (offset.x + dim.width > enclosingRect.width) offset.x = enclosingRect.width - dim.width; if (offset.y + dim.height > enclosingRect.height) offset.y = enclosingRect.height - dim.height; } if (mc.stretch) { int extraW = enclosingRect.width - offset.x - dim.width; if (extraW < 0) { dim.width = enclosingRect.width - offset.x; extraW = 0; } int extraH = enclosingRect.height - offset.y - dim.height; if (extraH < 0) { dim.height = enclosingRect.height - offset.y; extraH = 0; } if (mc.absLocation == null) { offset.x += extraW / 2; offset.y += extraH / 2; } } Rectangle vRect = new Rectangle(enclosingRect.x + offset.x, enclosingRect.y + offset.y, dim.width, dim.height); visualComponent.setSize(dim); visualComponent.setLocation(vRect.getLocation()); visualComponent.setBounds(vRect); } public void setVisualComponentVisible(boolean state) { if (visualComponent != null) visualComponent.setVisible(state); } protected abstract java.awt.Component getVisualComponent(); public void attachVisualComponent() { if (mc.mediaType != MediaContent.PLAY_VIDEO || bx == null) return; visualComponent = getVisualComponent(); if (visualComponent == null) return; visualComponent.setVisible(false); Container cnt = bx.getContainerResolve(); if (mc.free) cnt = ps.getComponent(); if (cnt != visualComponent.getParent()) { cnt.add(visualComponent); } if (mouseAdapter == null && mc.catchMouseEvents == false) { mouseAdapter = new GlobalMouseAdapter(cnt); mouseAdapter.attachTo(visualComponent, true); } checkVisualComponentBounds(bx); visualComponent.setVisible(true); } protected void destroyVisualComponent() { if (mouseAdapter != null) { mouseAdapter.detach(visualComponent); mouseAdapter = null; } if (visualComponent != null) { visualComponent.setVisible(false); stop(); visualComponent = null; } } public void linkTo(ActiveBox setBx) { if (bx != null && bx != setBx) { bx.setHostedMediaPlayer(null); destroyVisualComponent(); } bx = setBx; if (bx != null) bx.setHostedMediaPlayer(this); else { destroyVisualComponent(); } } public MediaContent getMediaContent() { return mc; } } src/core/edu/xtec/jclic/media/AudioBuffer.java000066400000000000000000000146611335566474600215510ustar00rootroot00000000000000/* * File : AudioBuffer.java * Created : 17-sep-2001 13:47 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.Constants; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.boxes.ActiveBox; import java.awt.Component; import java.awt.Cursor; /** * The abtract class AudioBuffer supplies sound recording and * playing services. Audio data is discarded when the AudioBuffer * object is destroyed. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 * @see JavaSoundAudioBuffer */ public abstract class AudioBuffer { /** Default maximum length of recordings (in seconds). */ public static final int MAX_RECORD_LENGTH = 180; /** Maximum recording length, in seconds. */ protected int m_seconds; /** Cursor displayed when recording. */ protected static Cursor recCursor; /** * Currently running AudioBuffer (static object, because only one * can be running). */ protected static AudioBuffer activeAudioBuffer; /** Owner of the active AudioBuffer. */ protected static Component owner; /** Original Cursor used by the active AudioBuffer. */ protected static Cursor backOwnerCursor; /** * Main owner (usually a {@link java.awt.Frame}) of the active * AudioBuffer. */ protected static Component mainOwner; /** * Original {@link java.awt.Cursor} of the main owner of the active * AudioBuffer. */ protected static Cursor backMainOwnerCursor; /** * Creates new AudioBuffer * * @param seconds Maximum amount of seconds allowed for recording * @throws Exception If something goes wrong... */ public AudioBuffer(int seconds) throws Exception { if (seconds <= 0 || seconds > MAX_RECORD_LENGTH) throw new Exception("Error: Audio buffer length can't exceed " + MAX_RECORD_LENGTH + " seconds"); m_seconds = seconds; } /** * Plays the recorded audio data, if any. * * @throws Exception If something goes wrong */ public abstract void play() throws Exception; /** Stops playing or recording, if running. */ public abstract void stop(); /** Performs cleanup of recorded audio data. */ protected abstract void clear(); /** * Performs explicit cleanup of recorded audio data before destroying the * object. * * @throws Throwable Throwed by Object#finalize */ @Override protected void finalize() throws Throwable { clear(); super.finalize(); } /** * Checks if the AudioBuffer is currently recording or playing * sound. * * @return true if recording or playing, false * otherwise. */ public static boolean busy() { return activeAudioBuffer != null; } /** * Only one AudioBuffer can be "active", because the sound * recording hardware cannot be shared between processes. This method returns * the currently active AudioBuffer, if any. * * @return The currently active AudioBuffer, or null * if none is active. */ protected static AudioBuffer getActiveAudioBuffer() { return activeAudioBuffer; } /** * Starts sound recording with visual indications: the mouse cursor switchs a * microphone. * * @param ps A valid {@link PlayStation}, used to retrieve the recording cursor * image and to determine the main component associated to this * AudioBuffer. * @param bx The {@link ActiveBox} associated to this recording. If * null, the default {@link Component} for the provided * {@link PlayStation} will be used. * @throws Exception If someting goes wrong */ public void record(PlayStation ps, ActiveBox bx) throws Exception { forceStop(); recCursor = ps.getCustomCursor(Constants.REC_CURSOR); owner = (bx == null ? null : bx.getContainerResolve()); mainOwner = javax.swing.JOptionPane.getFrameForComponent(ps.getComponent()); showRecordingCursor(); record(); } /** * Starts the recording of sound, without any visual indication. Subclasses of * AudioBuffer * must implement this method. * * @throws Exception If something goes wrong. */ protected abstract void record() throws Exception; /** * The usual way to stop the recording or playnig processes is to place a flag * in their thread and wait to next cycle. This method allows to force an abrupt * end of this threads. * * @throws Exception If something goes wrong */ protected static void forceStop() throws Exception { if (busy()) { getActiveAudioBuffer().stop(); Thread.yield(); if (busy()) throw new Exception("Unable to stop recorder!"); } } /** * Displays the recording cursor. Prior to call this method, the associated * Component must be specified. */ protected static void showRecordingCursor() { if (recCursor != null) { if (owner != null) { backOwnerCursor = owner.getCursor(); if (backOwnerCursor == Cursor.getDefaultCursor()) backOwnerCursor = null; owner.setCursor(recCursor); } if (mainOwner != null) { backMainOwnerCursor = mainOwner.getCursor(); if (backMainOwnerCursor == Cursor.getDefaultCursor()) backMainOwnerCursor = null; mainOwner.setCursor(recCursor); } } } /** Resets the mouse cursor to its original state. */ protected static void hideRecordingCursor() { if (owner != null) { owner.setCursor(backOwnerCursor); owner = null; } if (mainOwner != null) { mainOwner.setCursor(backMainOwnerCursor); mainOwner = null; } } } src/core/edu/xtec/jclic/media/AudioPlayer.java000066400000000000000000000022411335566474600215630ustar00rootroot00000000000000/* * File : AudioPlayer.java * Created : 26-may-2002 21:21 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.bags.MediaBag; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public interface AudioPlayer { public boolean setDataSource(Object source) throws Exception; public void realize(String fileName, MediaBag mediaBag) throws Exception; public void close(); public void play(); public void stop(); } src/core/edu/xtec/jclic/media/ByteDataSource.java000066400000000000000000000136331335566474600222320ustar00rootroot00000000000000/* * File : ByteDataSource.java * Created : 20-sep-2001 9:14 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.util.ExtendedByteArrayInputStream; import edu.xtec.util.StreamIO; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ByteDataSource extends javax.media.protocol.PullDataSource { protected ByteSourceStream[] pss; protected javax.media.protocol.ContentDescriptor contentType; protected String fName; public ByteDataSource(ExtendedByteArrayInputStream is) throws IOException { super(); this.pss = new ByteSourceStream[1]; init(is); } public ByteDataSource(InputStream is, String name) throws IOException { super(); this.pss = new ByteSourceStream[1]; if (is instanceof ExtendedByteArrayInputStream) init((ExtendedByteArrayInputStream) is); else init(new ExtendedByteArrayInputStream(StreamIO.readInputStream(is), name)); } public ByteDataSource(byte[] src, String name) throws IOException { super(); this.pss = new ByteSourceStream[1]; init(new ExtendedByteArrayInputStream(src, name)); } private void init(ExtendedByteArrayInputStream is) throws IOException { contentType = getContentDescriptor(is.getName()); pss[0] = new ByteSourceStream(is, contentType); fName = null; } private ByteDataSource() { this.pss = new ByteSourceStream[1]; } public ByteDataSource duplicate() throws IOException { ByteDataSource result = new ByteDataSource(); result.contentType = contentType; result.fName = fName; result.pss[0] = ((ByteSourceStream) pss[0]).duplicate(); return result; } public ExtendedByteArrayInputStream getInputStream() { if (pss[0] != null) return pss[0].inputStream; else return null; } public String getFName() { return fName; } public void setFName(String name) { fName = name; } public java.lang.Object[] getControls() { return null; } public void connect() throws IOException { } public void disconnect() { } public void start() throws IOException { } public javax.media.Time getDuration() { return javax.media.Duration.DURATION_UNKNOWN; } public void stop() throws IOException { } public java.lang.Object getControl(java.lang.String str) { return null; } public java.lang.String getContentType() { return contentType.toString(); } public javax.media.protocol.PullSourceStream[] getStreams() { return pss; } static Method getMimeTypeMethod; static { try { Class cl = null; if (ByteDataSource.class.getResource("/com/sun/media/MimeManager.class") != null && (cl = Class.forName("com.sun.media.MimeManager")) != null) { getMimeTypeMethod = cl.getMethod("getMimeType", new Class[] { String.class }); } } catch (Exception ex) { // no com.sun classes available! } } public javax.media.protocol.ContentDescriptor getContentDescriptor(String fName) { String mimeType = null; if (fName != null) { int p = fName.lastIndexOf('.') + 1; String ext = (p > 0 && p < fName.length() ? fName.substring(p) : fName).toLowerCase(); if (getMimeTypeMethod != null) { try { mimeType = (String) getMimeTypeMethod.invoke(null, new Object[] { ext }); } catch (Exception ex) { // } } } if (mimeType == null) { mimeType = "unknown"; } // Todo: implement some standard mime types... return new javax.media.protocol.ContentDescriptor( javax.media.protocol.ContentDescriptor.mimeTypeToPackageName(mimeType)); } class ByteSourceStream implements javax.media.protocol.PullSourceStream, javax.media.protocol.Seekable { protected ExtendedByteArrayInputStream inputStream; javax.media.protocol.ContentDescriptor contentType; public ByteSourceStream(ExtendedByteArrayInputStream in, javax.media.protocol.ContentDescriptor type) throws IOException { inputStream = in; contentType = type; } public ByteSourceStream duplicate() throws IOException { return new ByteSourceStream(inputStream.duplicate(), contentType); } public javax.media.protocol.ContentDescriptor getContentDescriptor() { return contentType; } public long getContentLength() { return inputStream.getCount(); } public boolean willReadBlock() { return inputStream.eosReached(); } public int read(byte[] buffer, int offset, int length) throws IOException { return inputStream.read(buffer, offset, length); } public void close() throws IOException { inputStream.close(); } public boolean endOfStream() { return inputStream.eosReached(); } public Object[] getControls() { return new Object[0]; } public Object getControl(String controlName) { return null; } public boolean isRandomAccess() { return true; } public long seek(long param) { try { return inputStream.seek(param); } catch (Exception ex) { return 0L; } } public long tell() { return inputStream.getPos(); } } } src/core/edu/xtec/jclic/media/CheckMediaSystem.java000066400000000000000000000070501335566474600225320ustar00rootroot00000000000000/* * File : CheckMediaSystem.java * Created : 08-jul-2002 23:06 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.Constants; import edu.xtec.util.Check; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public final class CheckMediaSystem { public static final String QTLOCK = "QTLOCK"; static final String BUNDLE = "messages.CheckMediaSystemMessages"; public static Object qtLock = null; public static Object qt61Lock = null; public static boolean check(Options options, boolean showWarning) { boolean result = false; boolean qt = (qtLock != null); boolean qt61 = (qt61Lock != null); boolean checkQT = (options.getBoolean(Options.MAC) && !options.getBoolean(Options.ARCH64BIT)) || Constants.TRUE.equalsIgnoreCase(System.getProperty("FORCE_USE_QT")); if (checkQT && !qt61) { try { if (CheckMediaSystem.class.getResource("/quicktime/app/view/QTFactory.class") != null) { Class.forName("quicktime.app.view.QTFactory"); qt61 = true; qt = false; } } catch (Exception ex) { // No quicktime 6.1 available } } options.put(Constants.QT61, qt61); options.put(Constants.QT, qt); boolean jmf = false; try { if (CheckMediaSystem.class.getResource("/javax/media/Player.class") != null) { Class.forName("javax.media.Player"); jmf = true; } } catch (Exception ex) { // no JMF available } options.put(Constants.JMF, jmf); String mediaSystem = (String) options.get(Constants.MEDIA_SYSTEM); if (mediaSystem != null) { if (mediaSystem.equals(Constants.QT)) { if (qt61) mediaSystem = Constants.QT61; else if (!qt) mediaSystem = null; } else if (mediaSystem.equals(Constants.JMF)) { if (!jmf) mediaSystem = null; } else mediaSystem = null; } if (mediaSystem == null) mediaSystem = qt61 ? Constants.QT61 : /* qt ? Constants.QT : */ jmf ? Constants.JMF : null; if (mediaSystem != null && mediaSystem.equals(Constants.QT61) && qt61Lock == null) { try { qt61Lock = new edu.xtec.jclic.media.QT61Tools(); options.put(QTLOCK, qt61Lock); } catch (Exception ex) { options.getMessages().showErrorWarning(options.getMainComponent(), "media_qt_error_initializing", ex); mediaSystem = jmf ? Constants.JMF : null; } } options.put(Constants.MEDIA_SYSTEM, mediaSystem); if (showWarning && mediaSystem == null) warn(options); return mediaSystem != null; } public static void warn(Options options) { if (!options.getBoolean(Constants.NO_MEDIASYSTEM_WARN)) { Check.showUrlPane(options, "media_check_url"); options.putBoolean(Constants.NO_MEDIASYSTEM_WARN, true); } } } src/core/edu/xtec/jclic/media/ClipWrapper.java000066400000000000000000000045461335566474600216070ustar00rootroot00000000000000/* * File : ClipWrapper.java * Created : 04-aug-2004 16:20 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.bags.MediaBag; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.Clip; /** @author Francesc Busquets (fbusquets@xtec.cat) */ public class ClipWrapper implements PseudoClip { private Clip clip; private AudioInputStream ais; /** Creates a new instance of ClipWrapper */ private ClipWrapper(AudioInputStream ais, Clip clip) { this.clip = clip; this.ais = ais; } public static ClipWrapper getClipWrapper(MediaBag mb, String mediaFileName) throws Exception { ClipWrapper result = null; JavaSoundAudioPlayer jsap = new JavaSoundAudioPlayer(); jsap.setDataSource(mb.getMediaDataSource(mediaFileName)); AudioInputStream ais = jsap.ais; Clip clip = jsap.getClip(); return (ais == null || clip == null) ? null : new ClipWrapper(ais, clip); } public void close() { clip.close(); } public javax.sound.sampled.AudioFormat getFormat() { return clip.getFormat(); } public boolean isActive() { return clip.isActive(); } public boolean isOpen() { return clip.isOpen(); } public boolean isRunning() { return clip.isRunning(); } public void loop(int count) throws Exception { clip.loop(count); } public void open() throws Exception { clip.open(ais); } public void setFramePosition(int frames) { clip.setFramePosition(frames); } public void setLoopPoints(int start, int end) { clip.setLoopPoints(start, end); } public void start() throws Exception { clip.start(); } public void stop() { clip.stop(); } } src/core/edu/xtec/jclic/media/EventSounds.java000066400000000000000000000164161335566474600216330ustar00rootroot00000000000000/* * File : EventSounds.java * Created : 19-sep-2001 16:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.Constants; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.Options; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class EventSounds extends Object implements Domable, Cloneable { public static boolean globalEnabled = true; public static final String ELEMENT_NAME = "eventSounds"; public static final String ENABLED = "enabled"; public static final int START = 0, CLICK = 1, ACTION_ERROR = 2, ACTION_OK = 3, FINISHED_ERROR = 4, FINISHED_OK = 5, NUM_EVENTS = 6; public static final String[] EVENT_NAMES = { "start", "click", "actionError", "actionOk", "finishedError", "finishedOk" }; protected EventSounds parent; protected EventSoundsElement[] elements; protected int enabled; /** Creates new EventSounds */ public EventSounds(EventSounds setParent) { elements = new EventSoundsElement[NUM_EVENTS]; enabled = JDomUtility.DEFAULT; parent = setParent; } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); org.jdom.Element child; boolean empty = true; if (enabled != JDomUtility.DEFAULT) { e.setAttribute(ENABLED, JDomUtility.triStateString(enabled)); empty = false; } for (EventSoundsElement element : elements) { if (element != null) { child = element.getJDomElement(); if (child != null) { e.addContent(child); empty = false; } } } return empty ? null : e; } public static EventSounds getEventSounds(org.jdom.Element e) throws Exception { EventSounds ev = new EventSounds(null); ev.setProperties(e, null); return ev; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child; enabled = JDomUtility.getTriStateAttr(e, ENABLED, enabled); Iterator it = e.getChildren().iterator(); while (it.hasNext()) { EventSoundsElement ese = EventSoundsElement.getEventSoundsElement((org.jdom.Element) it.next()); if (ese != null) { int index = JDomUtility.getStrIndexAttr(ese.getId(), EVENT_NAMES, -1); if (index >= 0 && index < NUM_EVENTS) elements[index] = ese; } } } public static void listReferences(org.jdom.Element e, Map map) { org.jdom.Element child; // Correction of bug #83 (Custom event sounds ignored in media dependency check) Iterator it = e.getChildren(EventSoundsElement.ELEMENT_NAME).iterator(); while (it.hasNext()) { if ((child = (org.jdom.Element) it.next()) != null) { String s = child.getAttributeValue(EventSoundsElement.FILE); if (s != null) map.put(s, Constants.MEDIA_OBJECT); } } } public HashMap getReferences() { HashMap result = new HashMap(); org.jdom.Element e = getJDomElement(); if (e != null) listReferences(e, result); return result; } public void setParent(EventSounds p) { parent = p; } public boolean realize(Options options, MediaBag mediaBag) { Exception ext = null; try { for (EventSoundsElement element : elements) { if (element != null) element.realize(options, mediaBag); } } catch (Exception ex) { System.err.println("Error realizing event sound:\n" + ex); ex.printStackTrace(System.out); ext = ex; } return (ext == null); } public void setDataSource(int event, Object source, Options options) throws Exception { if (event < 0 || event >= NUM_EVENTS) return; if (elements[event] == null) { elements[event] = new EventSoundsElement(EVENT_NAMES[event]); } elements[event].setDataSource(source, options); } public EventSoundsElement getElement(int event) { if (event < 0 || event >= NUM_EVENTS) return null; return elements[event]; } public EventSoundsElement createElement(int event) { if (event < 0 || event >= NUM_EVENTS) return null; if (elements[event] == null) elements[event] = new EventSoundsElement(EVENT_NAMES[event]); return elements[event]; } public int getEnabledChain(int event) { int st = enabled; if (st == JDomUtility.DEFAULT) { if (event >= 0 && event < NUM_EVENTS) if (elements[event] == null) st = (parent == null ? st : parent.getEnabledChain(event)); else { st = elements[event].getEnabled(); if (st == JDomUtility.DEFAULT && parent != null) st = parent.getEnabledChain(event); } } return st; } public EventSoundsElement getElementChain(int event) { EventSoundsElement ese; if (event < 0 || event >= NUM_EVENTS) return null; ese = elements[event]; if (ese == null && parent != null) return parent.getElementChain(event); return ese; } public void playNow(int event) { if (!globalEnabled) return; EventSoundsElement ese = null; if (getEnabledChain(event) != JDomUtility.FALSE && (ese = getElementChain(event)) != null) ese.play(); } public void play(int event) { if (!globalEnabled) return; EventSoundsElement ese = null; if (getEnabledChain(event) != JDomUtility.FALSE && (ese = getElementChain(event)) != null) { final EventSoundsElement evs = ese; javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { evs.play(); } }); } } public void close() { for (int i = 0; i < NUM_EVENTS; i++) if (elements[i] != null) { elements[i].close(); elements[i] = null; } parent = null; } @Override protected void finalize() throws Throwable { close(); super.finalize(); } @Override public Object clone() { EventSounds ev = new EventSounds(parent); for (int i = 0; i < elements.length; i++) { if (elements[i] != null) ev.elements[i] = (EventSoundsElement) elements[i].clone(); } ev.enabled = enabled; return ev; } /** * Getter for property enabled. * * @return Value of property enabled. */ public int getEnabled() { return enabled; } /** * Setter for property enabled. * * @param enabled New value of property enabled. */ public void setEnabled(int enabled) { this.enabled = enabled; } } src/core/edu/xtec/jclic/media/EventSoundsElement.java000066400000000000000000000104061335566474600231360ustar00rootroot00000000000000/* * File : EventSoundsElement.java * Created : 26-sep-2001 12:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.Constants; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class EventSoundsElement extends Object implements Domable, Cloneable { protected String fileName; protected int enabled; protected AudioPlayer player; protected String id; /** Creates new EventSoundsElement */ public EventSoundsElement(String id) { this.id = id; enabled = JDomUtility.DEFAULT; fileName = null; player = null; } public String getId() { return id; } public static final String ELEMENT_NAME = "sound", ID = "id", FILE = "file"; public org.jdom.Element getJDomElement() { if (id == null || (enabled == JDomUtility.DEFAULT && fileName == null)) return null; org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(ID, id); if (enabled != JDomUtility.DEFAULT) e.setAttribute(EventSounds.ENABLED, JDomUtility.triStateString(enabled)); if (fileName != null) e.setAttribute(FILE, fileName); return e; } public static EventSoundsElement getEventSoundsElement(org.jdom.Element e) throws Exception { String id = JDomUtility.getStringAttr(e, ID, e.getName(), false); if (id == null || id.length() < 1 || ELEMENT_NAME.equals(id)) throw new Exception("Invalid event sound element id: " + id); EventSoundsElement ev = new EventSoundsElement(id); ev.setProperties(e, null); return ev; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { enabled = JDomUtility.getTriStateAttr(e, EventSounds.ENABLED, enabled); fileName = JDomUtility.getStringAttr(e, FILE, fileName, false); } public void setFileName(String fName) { if (player != null) player.close(); fileName = fName; } public String getFileName() { return fileName; } public void setEnabled(int v) { if (JDomUtility.checkTriState(v)) { enabled = v; if (player != null) player.stop(); } } public int getEnabled() { return enabled; } private void buildPlayer(Options options) { close(); String s = options.getString(Constants.MEDIA_SYSTEM); try { Class c = Class.forName("edu.xtec.jclic.media.JavaSoundAudioPlayer"); player = (AudioPlayer) c.newInstance(); } catch (Exception ex) { System.err.println("Error building audio player:\n" + ex); } } public boolean setDataSource(Object source, Options options) throws Exception { buildPlayer(options); return player == null ? false : player.setDataSource(source); } public void realize(Options options, MediaBag mediaBag) throws Exception { if (player == null) buildPlayer(options); player.realize(fileName, mediaBag); } public void close() { if (player != null) { player.close(); player = null; } } public void play() { if (player != null && enabled != edu.xtec.util.JDomUtility.FALSE && EventSounds.globalEnabled == true) player.play(); } public void stop() { if (player != null) player.stop(); } @Override protected void finalize() throws Throwable { close(); super.finalize(); } @Override public Object clone() { EventSoundsElement evs = new EventSoundsElement(id); evs.fileName = fileName; evs.enabled = enabled; evs.player = player; return evs; } } src/core/edu/xtec/jclic/media/FalseClip.java000066400000000000000000000110061335566474600212060ustar00rootroot00000000000000/* * File : FalseClip.java * Created : 04-aug-2004 16:26 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.bags.MediaBag; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class FalseClip implements PseudoClip { private AudioInputStream ais; private AudioFormat af; private MediaBag mb; private String mediaFileName; private PlayThread playThread; private int loopCount; /** Creates a new instance of FalseClip */ private FalseClip(MediaBag mb, String mediaFileName) throws Exception { this.mb = mb; this.mediaFileName = mediaFileName; af = getAudioInputStream().getFormat(); } public static FalseClip getFalseClip(MediaBag mb, String mediaFileName) throws Exception { return new FalseClip(mb, mediaFileName); } private AudioInputStream getAudioInputStream() throws Exception { if (ais == null) { JavaSoundAudioPlayer jsap = new JavaSoundAudioPlayer(); jsap.setDataSource(mb.getMediaDataSource(mediaFileName)); ais = jsap.ais; if (ais == null) throw new Exception("Unable to open audio data!"); } return ais; } public void close() { stop(); } public javax.sound.sampled.AudioFormat getFormat() { return af; } public boolean isActive() { return (playThread != null && playThread.isAlive()); } public boolean isOpen() { return ais != null; } public boolean isRunning() { return isActive(); } public void loop(int count) throws Exception { start(); loopCount = count; } public void open() throws Exception { getAudioInputStream(); } public void setFramePosition(int frames) { // ignore } public void setLoopPoints(int start, int end) { // ignore } public void start() throws Exception { if (playThread == null) { loopCount = 0; playThread = new PlayThread(); playThread.start(); } } public void stop() { if (playThread != null) { if (playThread.isAlive()) { playThread.running = false; while (playThread != null) { Thread.yield(); } } else { playThread = null; ais = null; } } } class PlayThread extends Thread { public boolean running; byte[] buf = new byte[JavaSoundAudioPlayer.INTERNAL_BUFFER_SIZE]; SourceDataLine line = null; public PlayThread() throws Exception { running = false; getAudioInputStream(); DataLine.Info info = new DataLine.Info(SourceDataLine.class, af); line = (SourceDataLine) AudioSystem.getLine(info); if (line != null) line.open(af); } @Override public void run() { if (line != null) { running = true; int nBytesRead = 0; try { line.start(); while (running && nBytesRead >= 0) { nBytesRead = ais.read(buf, 0, buf.length); if (nBytesRead >= 0) { int nBytesWritten = line.write(buf, 0, nBytesRead); } Thread.yield(); } if (running) line.drain(); else line.stop(); } catch (Exception ex) { System.err.println("JavaSound playing error:\n" + ex); } line.close(); } ais = null; playThread = null; if (running && loopCount != 0) { if (loopCount > 0) loopCount--; try { int lc = loopCount; FalseClip.this.start(); loopCount = lc; } catch (Exception ex) { System.err.println("Error looping sound: " + ex); } } running = false; } } } src/core/edu/xtec/jclic/media/JMFActiveMediaPlayer.java000066400000000000000000000175621335566474600232460ustar00rootroot00000000000000/* * File : JMFActiveMediaPlayer.java * Created : 02-may-2001 10:56 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.boxes.ActiveBox; import edu.xtec.util.ExtendedByteArrayInputStream; import edu.xtec.util.StreamIO; import java.awt.Component; import java.io.ByteArrayInputStream; import java.io.InputStream; import javax.media.Player; import javax.sound.midi.MidiSystem; import javax.sound.midi.Sequencer; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class JMFActiveMediaPlayer extends ActiveMediaPlayer implements javax.media.ControllerListener { public static Sequencer sequencer = null; javax.media.Player player; javax.media.protocol.DataSource dataSource; boolean midi; ByteArrayInputStream midiIs; /** Creates new JMFActiveMediaPlayer */ public JMFActiveMediaPlayer(edu.xtec.jclic.media.MediaContent mc, MediaBag mb, PlayStation ps) { super(mc, mb, ps); player = null; dataSource = null; midi = false; midiIs = null; if (!useAudioBuffer) { try { switch (mc.mediaType) { case MediaContent.PLAY_MIDI: midi = true; InputStream is = mb.getInputStream(mc.mediaFileName); if (is instanceof ByteArrayInputStream) midiIs = (ByteArrayInputStream) is; else midiIs = new ExtendedByteArrayInputStream(StreamIO.readInputStream(is), mc.mediaFileName); break; default: Object source = mb.getMediaDataSource(mc.mediaFileName); if (source instanceof ExtendedByteArrayInputStream) { dataSource = new ByteDataSource((ExtendedByteArrayInputStream) source); } else if (source instanceof String) { javax.media.MediaLocator ml = new javax.media.MediaLocator((String) source); dataSource = javax.media.Manager.createDataSource(ml); } } } catch (Exception ex) { System.err.println("Error reading media \"" + mc.mediaFileName + "\":\n" + ex); } } } public AudioBuffer createAudioBuffer(int seconds) throws Exception { return new JavaSoundAudioBuffer(mc.length); } public static void closeMidiSequencer() { if (sequencer != null) { if (sequencer.isRunning()) sequencer.stop(); if (sequencer.isOpen()) sequencer.close(); } } public void realize() { if (!useAudioBuffer) { try { if (midi) { if (sequencer == null) sequencer = MidiSystem.getSequencer(); } else { if (player == null && dataSource != null) { player = javax.media.Manager.createPlayer(dataSource); if (player != null) player.addControllerListener(this); } if (player != null && player.getState() < Player.Realized) player.realize(); } } catch (Exception e) { System.err.println("Error realizing media \"" + mc.mediaFileName + "\"\n" + e); } } } @Override protected void playNow(ActiveBox setBx) { if (useAudioBuffer) super.playNow(setBx); else { try { if (midi) { if (sequencer == null) realize(); if (sequencer != null && midiIs != null) { if (sequencer.isRunning()) sequencer.stop(); if (!sequencer.isOpen()) sequencer.open(); midiIs.reset(); sequencer.setSequence(midiIs); sequencer.stop(); setTimeRanges(); sequencer.start(); } } else { if (player == null && dataSource != null) realize(); if (player != null) { boolean retry = false; if (mc.mediaType == MediaContent.PLAY_VIDEO) linkTo(setBx); if (player.getState() >= Player.Realized) { setTimeRanges(); attachVisualComponent(); } else { retry = true; } player.start(); if (retry) { if (player.getState() >= Player.Realized) { attachVisualComponent(); } } } } } catch (Exception e) { System.err.println("Error playing media \"" + mc.mediaFileName + "\":\n" + e); } } } @Override public void stop() { super.stop(); if (!useAudioBuffer) { try { if (midi && sequencer != null) { closeMidiSequencer(); } else if (player != null && player.getState() == Player.Started) player.stop(); } catch (Exception e) { System.err.println("Error stopping media \"" + mc.mediaFileName + "\":\n" + e); } } } @Override public void clear() { super.clear(); if (!useAudioBuffer) { try { if (midi) { if (sequencer != null) { sequencer.close(); sequencer = null; } if (midiIs != null) { midiIs.close(); midiIs = null; } } else if (player != null) { destroyVisualComponent(); player.close(); } } catch (Exception e) { System.err.println("Error closing media \"" + mc.mediaFileName + "\":\n" + e); } } } public void controllerUpdate(javax.media.ControllerEvent event) { if (player == null) return; try { if (event instanceof javax.media.RealizeCompleteEvent) { setTimeRanges(); attachVisualComponent(); if (player != null) player.prefetch(); } else if (event instanceof javax.media.EndOfMediaEvent) { if (mc.loop) { player.setMediaTime(new javax.media.Time(0)); player.start(); } } else if (event instanceof javax.media.ControllerErrorEvent) { ps.setSystemMessage(ps.getMsg("msg_error_playing_media"), ""); System.err.println("Controller error event:\n" + ((javax.media.ControllerErrorEvent) event).getMessage()); clear(); } else if (event instanceof javax.media.ControllerClosedEvent) { visualComponent = null; destroyVisualComponent(); player.deallocate(); player = null; } } catch (Exception e) { System.err.println("Controller event update error for \"" + mc.mediaFileName + "\":\n" + e); } } protected void setTimeRanges() { if (useAudioBuffer) return; try { if (midi && sequencer != null) { sequencer.setTickPosition(0L); } else if (player != null && player.getState() >= Player.Realized) { if (mc.from != -1) player.setMediaTime(new javax.media.Time(1000000L * mc.from)); else player.setMediaTime(new javax.media.Time(0L)); if (mc.to != -1) player.setStopTime(new javax.media.Time(1000000L * mc.to)); } } catch (Exception e) { System.err.println("Error setting time ranges for \"" + mc.mediaFileName + "\":\n" + e); } } protected Component getVisualComponent() { if (player == null || player.getState() < javax.media.Player.Realized) return null; else return player.getVisualComponent(); } } src/core/edu/xtec/jclic/media/JMFAudioPlayer.java000066400000000000000000000046501335566474600221260ustar00rootroot00000000000000/* * File : JMFAudioPlayer.java * Created : 25-may-2002 19:27 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.util.ExtendedByteArrayInputStream; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class JMFAudioPlayer implements AudioPlayer { protected javax.media.Player player; public static final javax.media.Time zeroTime = new javax.media.Time(0L); /** Creates new JMFAudioPlayer */ public JMFAudioPlayer() { player = null; } public boolean setDataSource(Object source) throws Exception { close(); if (source instanceof ExtendedByteArrayInputStream) { player = javax.media.Manager.createPlayer(new ByteDataSource((ExtendedByteArrayInputStream) source)); } else if (source instanceof String) { javax.media.MediaLocator ml = new javax.media.MediaLocator((String) source); javax.media.protocol.DataSource dataSource = javax.media.Manager.createDataSource(ml); player = javax.media.Manager.createPlayer(dataSource); } return player != null; } public void realize(String fileName, MediaBag mediaBag) throws Exception { if (fileName != null) setDataSource(mediaBag.getMediaDataSource(fileName)); if (player != null) player.realize(); } public void close() { if (player != null) { player.close(); player = null; } } public void play() { try { stop(); player.setMediaTime(zeroTime); player.start(); } catch (Exception ex) { System.err.println("Error playing system sound:\n" + ex); } } public void stop() { if (player != null && player.getState() >= javax.media.Player.Started) player.stop(); } } src/core/edu/xtec/jclic/media/JavaSoundActiveMediaPlayer.java000066400000000000000000000151041335566474600245120ustar00rootroot00000000000000/* * File : JavaSoundActiveMediaPlayer.java * Created : 16-jun-2004 15:59 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.util.ExtendedByteArrayInputStream; import edu.xtec.util.StreamIO; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.ByteArrayInputStream; import java.io.InputStream; import javax.sound.midi.MidiSystem; import javax.sound.sampled.*; import javax.swing.Timer; /** @author Francesc Busquets (fbusquets@xtec.cat) */ public class JavaSoundActiveMediaPlayer extends ActiveMediaPlayer { PseudoClip clip; Timer timer; boolean midi; ByteArrayInputStream midiIs; public static javax.sound.midi.Sequencer sequencer = null; /** Creates a new instance of JavaSoundActiveMediaPlayer */ public JavaSoundActiveMediaPlayer(edu.xtec.jclic.media.MediaContent mc, edu.xtec.jclic.bags.MediaBag mb, edu.xtec.jclic.PlayStation ps) { super(mc, mb, ps); InputStream is; midi = false; midiIs = null; if (!useAudioBuffer) { try { switch (mc.mediaType) { case MediaContent.PLAY_MIDI: midi = true; is = mb.getInputStream(mc.mediaFileName); if (is instanceof ByteArrayInputStream) midiIs = (ByteArrayInputStream) is; else midiIs = new ExtendedByteArrayInputStream(StreamIO.readInputStream(is), mc.mediaFileName); break; case MediaContent.PLAY_AUDIO: if (mc.to > 0 || mc.from > 0) clip = ClipWrapper.getClipWrapper(mb, mc.mediaFileName); else clip = FalseClip.getFalseClip(mb, mc.mediaFileName); if (clip != null && !mc.loop && mc.to > Math.max(0, mc.from)) { timer = new Timer(mc.to - Math.max(0, mc.from), new ActionListener() { public void actionPerformed(ActionEvent ev) { if (clip != null && clip.isRunning()) clip.stop(); } }); timer.setCoalesce(false); timer.setRepeats(false); } break; default: break; } } catch (Exception ex) { System.err.println("Error reading media \"" + mc.mediaFileName + "\":\n" + ex); } } } public AudioBuffer createAudioBuffer(int seconds) throws Exception { return new JavaSoundAudioBuffer(mc.length); } public static void closeMidiSequencer() { if (sequencer != null) { if (sequencer.isRunning()) sequencer.stop(); if (sequencer.isOpen()) sequencer.close(); } } public void realize() { if (!useAudioBuffer) { try { if (midi) { if (sequencer == null) sequencer = MidiSystem.getSequencer(); } else { if (clip != null && !clip.isOpen()) { clip.open(); } } } catch (Exception e) { System.err.println("Error realizing media \"" + mc.mediaFileName + "\"\n" + e); } } } @Override protected void playNow(edu.xtec.jclic.boxes.ActiveBox setBx) { if (useAudioBuffer) super.playNow(setBx); else { try { if (midi) { if (sequencer == null) realize(); if (sequencer != null && midiIs != null) { if (sequencer.isRunning()) sequencer.stop(); if (!sequencer.isOpen()) sequencer.open(); midiIs.reset(); sequencer.setSequence(midiIs); sequencer.stop(); setTimeRanges(); sequencer.start(); } } else if (clip != null) { if (!clip.isOpen()) realize(); setTimeRanges(); attachVisualComponent(); if (mc.loop) { clip.loop(Clip.LOOP_CONTINUOUSLY); } else { clip.start(); if (timer != null) timer.start(); } } } catch (Exception e) { System.err.println("Error playing media \"" + mc.mediaFileName + "\":\n" + e); } } } @Override public void stop() { super.stop(); if (!useAudioBuffer) { try { if (midi && sequencer != null) { closeMidiSequencer(); } else if (clip != null && clip.isActive()) { if (timer != null && timer.isRunning()) timer.stop(); clip.stop(); } } catch (Exception e) { System.err.println("Error stopping media \"" + mc.mediaFileName + "\":\n" + e); } } } @Override public void clear() { super.clear(); if (!useAudioBuffer) { try { if (midi) { if (sequencer != null) { sequencer.close(); sequencer = null; } if (midiIs != null) { midiIs.close(); midiIs = null; } } else if (clip != null) { stop(); clip.close(); destroyVisualComponent(); clip = null; timer = null; } } catch (Exception e) { System.err.println("Error closing media \"" + mc.mediaFileName + "\":\n" + e); } } } protected void setTimeRanges() { if (useAudioBuffer) return; try { if (midi && sequencer != null) { sequencer.setTickPosition(0L); } else if (clip != null && clip.isOpen()) { if (mc.from >= 0 || mc.to >= 0) { int from = mc.from > 0 ? (int) ((clip.getFormat().getFrameRate() * mc.from) / 1000) : 0; int to = mc.to >= 0 ? (int) ((clip.getFormat().getFrameRate() * mc.to) / 1000) : -1; if (mc.loop) clip.setLoopPoints(from, to); clip.setFramePosition(from); } else { clip.setFramePosition(0); } } } catch (Exception e) { System.err.println("Error setting time ranges for \"" + mc.mediaFileName + "\":\n" + e); } } protected java.awt.Component getVisualComponent() { return null; } } src/core/edu/xtec/jclic/media/JavaSoundAudioBuffer.java000066400000000000000000000232601335566474600233570ustar00rootroot00000000000000/* * File : JavaSoundAudioBuffer.java * Created : 29-may-2002 16:24 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Line.Info; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.TargetDataLine; /** * This class extends {@link AudioBuffer} using the javax.sound.sampled package. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class JavaSoundAudioBuffer extends AudioBuffer { /** Default sample rate used in recordings */ public static final float RATE = 11025.0F; /** Default resolution used in recordings */ public static final int BITS = 16; /** Default number of channels used in recordings */ public static final int CHANNELS = 1; /** Default buffer size */ public static final int LINE_BUFFER = 10000; /** Default size for small buffer used in read loops */ public static final int STEP_BUFFER = 5000; /** Line used for recording audio */ private static TargetDataLine m_targetLine; /** Line used for playing recorded audio */ private static SourceDataLine m_sourceLine; /** * Thread used to record audio. Static because only one instance can stay making * use of the sound hardware. */ private static RecordThread recordThread; /** * Thread used to play audio. Static because only one instance can stay making * use of the audio hardware. */ private static PlayThread playThread; /** Timer used to stop the record thread when the maximum time is achieved */ private static Timer recordTimer; /** true only when all {@link Line} members are build */ private static boolean initialized; /** Array that holds the recorded audio data */ private byte[] m_buffer; /** * Creates new JavaSoundAudioBuffer * * @param seconds Maximum amount of seconds allowed for recording * @throws Exception If something goes wrong... */ public JavaSoundAudioBuffer(int seconds) throws Exception { super(seconds); initialize(); } public static void initialize() throws Exception { if (!initialized) buildLines(); } /** * Looks for available formats and lines, and builds m_sourceLine * and * m_targetLine members * * @throws Exception If it was unable to build the lines */ protected static void buildLines() throws Exception { // Get lists of all and optimal audio formats ArrayList vOptimal = new ArrayList(); ArrayList vAll = new ArrayList(); for (Info info : AudioSystem.getTargetLineInfo(new Info(TargetDataLine.class))) { if (info instanceof javax.sound.sampled.DataLine.Info) { for (AudioFormat format : ((javax.sound.sampled.DataLine.Info) info).getFormats()) { if (format.getSampleRate() == AudioSystem.NOT_SPECIFIED || format.getSampleRate() >= 8000.0F) vAll.add(format); if (format.getChannels() == CHANNELS && format.getSampleSizeInBits() == BITS && (format.getSampleRate() == AudioSystem.NOT_SPECIFIED || format.getSampleRate() == RATE)) vOptimal.add(format); } } } if (vAll.isEmpty()) { throw new Exception("Unable to find any available TargetDataLine for recording"); } // Build m_targetLine javax.sound.sampled.DataLine.Info dli; AudioFormat[] af; // try with optimal formats if (!vOptimal.isEmpty()) { af = vOptimal.toArray(new AudioFormat[vOptimal.size()]); dli = new javax.sound.sampled.DataLine.Info(TargetDataLine.class, af, LINE_BUFFER, LINE_BUFFER + 1000); try { m_targetLine = (TargetDataLine) AudioSystem.getLine(dli); m_targetLine.open(); } catch (Exception ex) { m_targetLine = null; } } // optimal failed: try with all formats if (m_targetLine == null) { af = vAll.toArray(new AudioFormat[vAll.size()]); dli = new javax.sound.sampled.DataLine.Info(TargetDataLine.class, af, LINE_BUFFER, LINE_BUFFER + 1000); m_targetLine = (TargetDataLine) AudioSystem.getLine(dli); m_targetLine.open(); } // build m_sourceLine dli = new javax.sound.sampled.DataLine.Info(SourceDataLine.class, m_targetLine.getFormat()); m_sourceLine = (SourceDataLine) AudioSystem.getLine(dli); m_sourceLine.open(); initialized = true; } /** * Used for recording data. The thread stops itself when running is * set to * false. */ class RecordThread extends Thread { /** When false, the thread must be stopped as soon as possible. */ public boolean running; /** Creates new RecordThread */ public RecordThread() { running = false; } /** Thread main method */ @Override public void run() { AudioBuffer.activeAudioBuffer = JavaSoundAudioBuffer.this; running = true; m_buffer = null; ByteArrayOutputStream out = new ByteArrayOutputStream(LINE_BUFFER); try { int avail, numBytesRead; byte[] data = new byte[STEP_BUFFER]; m_targetLine.start(); do { avail = m_targetLine.available(); if (avail > 0) { numBytesRead = m_targetLine.read(data, 0, Math.min(avail, data.length)); out.write(data, 0, numBytesRead); } Thread.yield(); } while (running); if (recordTimer != null) { recordTimer.cancel(); recordTimer = null; } } catch (Exception ex) { System.err.println("JavaSound recording error:\n" + ex); } m_targetLine.stop(); m_targetLine.flush(); m_buffer = out.toByteArray(); AudioBuffer.hideRecordingCursor(); AudioBuffer.activeAudioBuffer = null; recordThread = null; running = false; } } /** * Used for playing data. The thread stops itself when running is * set to false * , or when all audio data was played. */ class PlayThread extends Thread { /** When false, the thread must be stopped as soon as possible. */ public boolean running; /** * In some cases, the data stored in m_buffer was corrupted after * calling to * m_sourceLine.write. A workaround to this JavaSond bug is to make a * duplicate of the data and discard it after used. */ byte[] buf; /** Creates new PlayThread */ public PlayThread() { running = false; buf = new byte[m_buffer.length]; // make a copy of the audio data System.arraycopy(m_buffer, 0, buf, 0, m_buffer.length); } /** Thread main method */ @Override public void run() { running = true; try { m_sourceLine.start(); int l = m_sourceLine.getBufferSize() / 2; int p = 0; int remainingData = buf.length; while (running && remainingData > 0) { int k = m_sourceLine.write(buf, p, Math.min(l, remainingData)); p += k; remainingData -= k; Thread.yield(); } } catch (Exception ex) { System.err.println("JavaSound playing error:\n" + ex); } m_sourceLine.drain(); m_sourceLine.stop(); playThread = null; running = false; } } /** * Starts recording * * @throws Exception If something goes wrong. */ public void record() throws Exception { if (!initialized) { AudioBuffer.hideRecordingCursor(); AudioBuffer.activeAudioBuffer = null; return; } stop(); recordThread = new RecordThread(); recordThread.start(); recordTimer = new Timer(); recordTimer.schedule(new TimerTask() { public void run() { recordTimer = null; if (recordThread != null) { recordThread.running = false; } } }, m_seconds * 1000); } /** * Plays recorded audio data, if any. * * @throws Exception If something goes wrong */ public void play() throws Exception { if (!initialized) return; stop(); if (m_buffer != null && m_buffer.length > 0) { playThread = new PlayThread(); playThread.start(); } } /** * Checks if the AudioBuffer is currently playing or recording sound. * * @return true if playing or recording, false * otherwise */ private boolean isRunning() { return (playThread != null || recordThread != null); } /** If running, gently stops play and record threads */ public void stop() { if (recordThread != null) recordThread.running = false; if (playThread != null) playThread.running = false; while (recordThread != null || playThread != null) { Thread.yield(); } } /** Stops playing or recording and clears all recorded data */ protected void clear() { stop(); m_buffer = null; } } src/core/edu/xtec/jclic/media/JavaSoundAudioPlayer.java000066400000000000000000000157411335566474600234070ustar00rootroot00000000000000/* * File : JavaSoundAudioPlayer.java * Created : 23-jun-2004 11:29 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.util.ExtendedByteArrayInputStream; import edu.xtec.util.StreamIO; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.UnsupportedAudioFileException; import org.tritonus.applet.AppletMpegSPIWorkaround; import org.tritonus.applet.AppletVorbisSPIWorkaround; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class JavaSoundAudioPlayer implements AudioPlayer { private Clip clip; protected AudioInputStream ais; protected boolean isMpeg; protected boolean isOgg; protected boolean isWav; static final int INTERNAL_BUFFER_SIZE = 1024; static final int CHECK_BUFFER_SIZE = 0x60; static final int BIT_SAMPLE_SIZE = 16; static final boolean BIG_ENDIAN = true; /** Creates a new instance of JavaSoundAudioPlayer */ public JavaSoundAudioPlayer() { } public boolean setDataSource(Object source) throws Exception { close(); InputStream is = null; javax.sound.sampled.AudioFileFormat m_audioFileFormat = null; if (source instanceof ExtendedByteArrayInputStream) { is = checkInputStream((InputStream) source, ((ExtendedByteArrayInputStream) source).getName()); } else if (source instanceof InputStream) { is = checkInputStream((InputStream) source, null); } else if (source instanceof File) { is = checkInputStream(new java.io.FileInputStream((File) source), ((File) source).getName()); } else { java.net.URL url = null; if (source instanceof java.net.URL) url = (java.net.URL) source; else if (source instanceof String) { url = new java.net.URL((String) source); } if (url != null) { is = checkInputStream(url.openStream(), source.toString()); } } if (is != null) { if (isMpeg || (!isWav && !isOgg)) { try { m_audioFileFormat = AppletMpegSPIWorkaround.getAudioFileFormat(is); ais = AppletMpegSPIWorkaround.getAudioInputStream(is); isMpeg = true; } catch (IOException ex) { throw ex; } catch (UnsupportedAudioFileException ex) { isMpeg = false; } } if (isOgg || (!isMpeg && !isWav)) { try { m_audioFileFormat = AppletVorbisSPIWorkaround.getAudioFileFormat(is); ais = AppletVorbisSPIWorkaround.getAudioInputStream(is); isOgg = true; } catch (IOException ex) { throw ex; } catch (UnsupportedAudioFileException ex) { isOgg = false; } } if (isWav || (!isMpeg && !isOgg)) { m_audioFileFormat = AudioSystem.getAudioFileFormat(is); ais = AudioSystem.getAudioInputStream(is); } } if (ais != null) { AudioFormat af = ais.getFormat(); DataLine.Info info = new DataLine.Info(SourceDataLine.class, af, INTERNAL_BUFFER_SIZE); if (!AudioSystem.isLineSupported(info)) { AudioFormat sourceFormat = af; AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), BIT_SAMPLE_SIZE, sourceFormat.getChannels(), sourceFormat.getChannels() * (BIT_SAMPLE_SIZE / 8), sourceFormat.getSampleRate(), BIG_ENDIAN); if (isMpeg) ais = AppletMpegSPIWorkaround.getAudioInputStream(targetFormat, ais); else if (isOgg) ais = AppletVorbisSPIWorkaround.getAudioInputStream(targetFormat, ais); else ais = AudioSystem.getAudioInputStream(targetFormat, ais); } } return ais != null; } public Clip getClip() throws Exception { if (clip == null && ais != null) { clip = (Clip) AudioSystem.getLine(new DataLine.Info(Clip.class, ais.getFormat(), INTERNAL_BUFFER_SIZE)); } return clip; } public void realize(String fileName, MediaBag mediaBag) throws Exception { if (fileName != null) setDataSource(mediaBag.getMediaDataSource(fileName)); if (ais != null && getClip() != null) { clip.open(ais); } } // Modified to avoid unexpected exceptions like // "IllegalStateException: line already closed" // launched by org.classpath.icedtea.pulseaudio.PulseAudioClip.close public void close() { if (clip != null && clip.isOpen()) { if (clip.isRunning()) clip.stop(); clip.close(); } clip = null; ais = null; } public void play() { try { stop(); if (getClip() != null) { clip.setFramePosition(0); clip.start(); } } catch (Exception ex) { System.err.println("Error playing sound:\n" + ex); } } public void stop() { if (clip != null && clip.isActive()) clip.stop(); } protected InputStream checkInputStream(InputStream is, String name) throws Exception { String s = (name == null ? null : name.toLowerCase()); if (s != null) { if (s.endsWith(".wav")) isWav = true; else if (s.endsWith(".ogg")) isOgg = true; else if (s.endsWith(".mp3")) isMpeg = true; } if (s == null || isWav) { byte[] data; if (!is.markSupported()) { data = StreamIO.readInputStream(is); is = new ByteArrayInputStream(data); } is.mark(CHECK_BUFFER_SIZE); byte[] b = new byte[CHECK_BUFFER_SIZE]; is.read(b); is.reset(); if (b[0x00] == 'R' && b[0x01] == 'I' && b[0x02] == 'F' && b[0x03] == 'F' && b[0x08] == 'W' && b[0x09] == 'A' && b[0x0A] == 'V' && b[0x0B] == 'E' && b[0x0C] == 'f' && b[0x0D] == 'm' && b[0x0E] == 't' && b[0x0F] == ' ' && b[0x14] == 0x55 && b[0x15] == 0x00) { for (int p = 0x11; p < CHECK_BUFFER_SIZE - 6; p++) { if (b[p] == 'd' && b[p + 1] == 'a' && b[p + 2] == 't' && b[p + 3] == 'a') { int offset = p + 4 + 4; is.skip(offset); isWav = false; isMpeg = true; break; } } } } return is; } } src/core/edu/xtec/jclic/media/JavaSoundClipActiveMediaPlayer.java000066400000000000000000000020511335566474600253170ustar00rootroot00000000000000/* * File : JavaSoundClipActiveMediaPlayer.java * Created : 05-aug-2004 10:07 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; /** @author Francesc Busquets (fbusquets@xtec.cat) */ public class JavaSoundClipActiveMediaPlayer { /** Creates a new instance of JavaSoundClipActiveMediaPlayer */ public JavaSoundClipActiveMediaPlayer() { } } src/core/edu/xtec/jclic/media/MediaContent.java000066400000000000000000000223451335566474600217260ustar00rootroot00000000000000/* * File : MediaContent.java * Created : 25-apr-2001 15:33 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.*; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.*; import java.awt.Point; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class MediaContent extends Object implements Cloneable, Domable { public static final int UNKNOWN = 0, PLAY_AUDIO = 1, PLAY_VIDEO = 2, PLAY_MIDI = 3, PLAY_CDAUDIO = 4, RECORD_AUDIO = 5, PLAY_RECORDED_AUDIO = 6, RUN_CLIC_ACTIVITY = 7, RUN_CLIC_PACKAGE = 8, RUN_EXTERNAL = 9, URL = 10, EXIT = 11, RETURN = 12, NUM_MEDIA_TYPES = 13; public static final String[] mediaName = { "UNKNOWN", "PLAY_AUDIO", "PLAY_VIDEO", "PLAY_MIDI", "PLAY_CDAUDIO", "RECORD_AUDIO", "PLAY_RECORDED_AUDIO", "RUN_CLIC_ACTIVITY", "RUN_CLIC_PACKAGE", "RUN_EXTERNAL", "URL", "EXIT", "RETURN" }; public static final int FROM_BOX = 0, FROM_WINDOW = 1, FROM_FRAME = 2; public static final String[] fromName = { "BOX", "WINDOW", "FRAME" }; public int mediaType = UNKNOWN; public int level = 1; public String mediaFileName = null; public String externalParam = null; public int from = -1; public int to = -1; public int length = 3; public String cdFrom = null; public String cdTo = null; public int recBuffer = 0; public boolean stretch = false; public boolean free = false; public Point absLocation = null; public int absLocationFrom = FROM_BOX; public boolean loop = false; public boolean catchMouseEvents = false; public boolean autoStart = false; /** Creates new MediaContent */ public MediaContent() { } public static final String ELEMENT_NAME = "media"; protected static final String TYPE = "type", LEVEL = "level", FILE = "file", PARAMS = "params", FROM = "from", TO = "to", CDFROM = "cdFrom", CDTO = "cdTo", BUFFER = "buffer", LENGTH = "length", STRETCH = "stretch", FREE = "free", PX = "px", PY = "py", PFROM = "pFrom", LOOP = "loop", CATCH_MOUSE = "catchMouseEvents", AUTOSTART = "autoStart"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(TYPE, mediaName[mediaType]); e.setAttribute(LEVEL, Integer.toString(level)); if (mediaFileName != null) e.setAttribute(FILE, mediaFileName); if (externalParam != null) e.setAttribute(PARAMS, externalParam); if (from != -1) e.setAttribute(FROM, Integer.toString(from)); if (to != -1) e.setAttribute(TO, Integer.toString(to)); if (cdFrom != null) e.setAttribute(CDFROM, cdFrom); if (cdTo != null) e.setAttribute(CDTO, cdTo); if (mediaType == RECORD_AUDIO || mediaType == PLAY_RECORDED_AUDIO) { e.setAttribute(BUFFER, Integer.toString(recBuffer)); if (mediaType == RECORD_AUDIO) e.setAttribute(LENGTH, Integer.toString(length)); } if (mediaType == PLAY_VIDEO) { e.setAttribute(STRETCH, JDomUtility.boolString(stretch)); e.setAttribute(FREE, JDomUtility.boolString(free)); if (catchMouseEvents) e.setAttribute(CATCH_MOUSE, JDomUtility.boolString(catchMouseEvents)); if (absLocation != null) { e.setAttribute(PX, Integer.toString(absLocation.x)); e.setAttribute(PY, Integer.toString(absLocation.y)); e.setAttribute(PFROM, fromName[absLocationFrom]); } } if (loop) e.setAttribute(LOOP, JDomUtility.boolString(loop)); if (autoStart) e.setAttribute(AUTOSTART, JDomUtility.boolString(autoStart)); return e; } public static MediaContent getMediaContent(org.jdom.Element e) throws Exception { MediaContent mc = new MediaContent(); mc.setProperties(e, null); return mc; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); mediaType = JDomUtility.getStrIndexAttr(e, TYPE, mediaName, -1); if (mediaType == -1) throw new IllegalArgumentException("Unknown media type: " + mediaName); level = JDomUtility.getIntAttr(e, LEVEL, level); mediaFileName = FileSystem.stdFn(e.getAttributeValue(FILE)); externalParam = e.getAttributeValue(PARAMS); from = JDomUtility.getIntAttr(e, FROM, from); to = JDomUtility.getIntAttr(e, TO, to); cdFrom = e.getAttributeValue(CDFROM); cdTo = e.getAttributeValue(CDTO); recBuffer = JDomUtility.getIntAttr(e, BUFFER, recBuffer); length = JDomUtility.getIntAttr(e, LENGTH, length); stretch = JDomUtility.getBoolAttr(e, STRETCH, stretch); stretch = JDomUtility.getBoolAttr(e, "retainAspect", stretch); free = JDomUtility.getBoolAttr(e, FREE, free); absLocationFrom = JDomUtility.getStrIndexAttr(e, PFROM, fromName, absLocationFrom); absLocation = JDomUtility.getPointAttr(e, PX, PY, absLocation); loop = JDomUtility.getBoolAttr(e, LOOP, loop); catchMouseEvents = JDomUtility.getBoolAttr(e, CATCH_MOUSE, catchMouseEvents); autoStart = JDomUtility.getBoolAttr(e, AUTOSTART, autoStart); } public static void listReferences(org.jdom.Element e, Map map) { if (e != null) { String s = e.getAttributeValue(FILE); String p = e.getAttributeValue(PARAMS); int k = 0; if (s != null && s.length() > 0) { int type; try { type = JDomUtility.getStrIndexAttr(e, TYPE, mediaName, -1); } catch (Exception ex) { System.err.println("error:\n" + ex); return; } switch (type) { case PLAY_AUDIO: case PLAY_VIDEO: case PLAY_MIDI: map.put(s, Constants.MEDIA_OBJECT); break; case RUN_CLIC_ACTIVITY: k = 1; case RUN_CLIC_PACKAGE: map.put(s, p != null ? Constants.EXTERNAL_OBJECT : k > 0 ? Constants.ACTIVITY_OBJECT : Constants.SEQUENCE_OBJECT); if (p != null) map.put(p, Constants.EXTERNAL_OBJECT); break; case RUN_EXTERNAL: map.put((p == null ? s : s + " " + p), Constants.EXTERNAL_OBJECT); break; case URL: map.put(s, Constants.URL_OBJECT); break; } } } } public String getIconName() { String s = "unknown.gif"; switch (mediaType) { case PLAY_AUDIO: s = "icowave.png"; break; case PLAY_MIDI: s = "icomidi.png"; break; case PLAY_VIDEO: s = "icomci.png"; break; case RETURN: case RUN_CLIC_ACTIVITY: case RUN_CLIC_PACKAGE: s = "ico00.png"; break; case RECORD_AUDIO: s = "icorec.png"; break; case PLAY_RECORDED_AUDIO: s = "icorplay.png"; break; case EXIT: s = "icoexit.png"; break; case URL: case RUN_EXTERNAL: s = "icoexe.png"; break; default: break; } return s; } public void registerContentTo(MediaBag mb) throws Exception { if (mediaFileName != null) { switch (mediaType) { case PLAY_AUDIO: case PLAY_MIDI: case PLAY_VIDEO: mb.registerElement(mediaFileName, null); break; default: break; } } } public boolean isEquivalent(MediaContent mc) { return mc != null && mediaType == mc.mediaType && StrUtils.compareStringsIgnoreCase(mediaFileName, mc.mediaFileName) && StrUtils.compareStringsIgnoreCase(externalParam, mc.externalParam) && from == mc.from && to == mc.to && StrUtils.compareStringsIgnoreCase(cdFrom, mc.cdFrom) && StrUtils.compareStringsIgnoreCase(cdTo, mc.cdTo) && recBuffer == mc.recBuffer && stretch == mc.stretch && free == mc.free && StrUtils.compareObjects(absLocation, mc.absLocation) && absLocationFrom == mc.absLocationFrom && loop == mc.loop && level == mc.level; } public String getDescription() { StringBuilder result = new StringBuilder(); result.append(mediaName[mediaType]); if (mediaFileName != null) { result.append(" ").append(mediaFileName); if (from >= 0) result.append(" ").append("from:").append(from); if (to >= 0) result.append(" ").append("to:").append(to); } else if (externalParam != null) { result.append(" ").append(externalParam); } return result.substring(0); } @Override public Object clone() { MediaContent mc = null; try { mc = (MediaContent) super.clone(); if (absLocation != null) mc.absLocation = (Point) absLocation.clone(); } catch (Exception ex) { System.err.println("Unexpected error cloning MediaContent!"); } return mc; } } src/core/edu/xtec/jclic/media/PseudoClip.java000066400000000000000000000026441335566474600214230ustar00rootroot00000000000000/* * File : PseudoClip.java * Created : 04-aug-2004 16:10 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import javax.sound.sampled.AudioFormat; /** @author Francesc Busquets (fbusquets@xtec.cat) */ public interface PseudoClip { // Methods from Clip public void loop(int count) throws Exception; public void setFramePosition(int frames); public void setLoopPoints(int start, int end); // Methods from DataLine public AudioFormat getFormat(); public boolean isActive(); public boolean isRunning(); public void start() throws Exception; public void stop(); // Methods from Line public void close(); public boolean isOpen(); // Special methods public void open() throws Exception; } src/core/edu/xtec/jclic/media/QT61ActiveMediaPlayer.java000066400000000000000000000104031335566474600233100ustar00rootroot00000000000000/* * File : QT61ActiveMediaPlayer.java * Created : 19-sep-2003 11:02 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.bags.MediaBag; import edu.xtec.jclic.boxes.ActiveBox; import java.awt.Component; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class QT61ActiveMediaPlayer extends ActiveMediaPlayer { quicktime.app.view.MoviePlayer player; quicktime.app.view.QTComponent canvas; boolean realized; /** Creates new QT61ActiveMediaPlayer */ public QT61ActiveMediaPlayer(edu.xtec.jclic.media.MediaContent mc, MediaBag mb, PlayStation ps) { super(mc, mb, ps); player = null; realized = false; if (!useAudioBuffer) { try { player = QT61Tools.getPlayer(mb.getMediaDataSource(mc.mediaFileName)); } catch (Exception ex) { System.err.println("Error reading media \"" + mc.mediaFileName + "\":\n" + ex); } } } public AudioBuffer createAudioBuffer(int seconds) throws Exception { return new QT61AudioBuffer(mc.length); } public void realize() { if (!useAudioBuffer) { try { if (player != null) { attachVisualComponent(); player.getMovie().setTimeScale(1000); setTimeRanges(); realized = true; } } catch (Exception ex) { System.err.println("QuickTime exception:\n" + ex); } } } @Override protected void playNow(ActiveBox setBx) { if (useAudioBuffer) super.playNow(setBx); else if (player != null) { try { stop(); if (!realized) realize(); if (mc.mediaType == MediaContent.PLAY_VIDEO) linkTo(setBx); attachVisualComponent(); player.setTime(Math.max(mc.from, 0)); quicktime.app.time.TaskAllMovies.addMovieAndStart(); player.getMovie().setActive(true); player.setRate(1.0F); } catch (Exception ex) { System.err.println("QuickTime Exception:\n" + ex); } } } @Override public void stop() { super.stop(); if (!useAudioBuffer) { try { if (player != null) { player.setRate(0); player.getMovie().setActive(false); quicktime.app.time.TaskAllMovies.removeMovie(); } } catch (Exception ex) { System.err.println("QuickTime Error:\n" + ex); } } } @Override public void clear() { super.clear(); if (!useAudioBuffer) { try { if (player != null) { destroyVisualComponent(); realized = false; } } catch (Exception ex) { System.err.println("QuickTime Error:\n" + ex); } } } protected void setTimeRanges() { if (useAudioBuffer || player == null) return; try { if (mc.from >= 0 || mc.to >= 0) { int from = Math.max(0, mc.from); int to = mc.to; if (to < 0) { to = player.getDuration(); } player.setTime(Math.max(mc.from, 0)); player.getMovie().setActiveSegment(new quicktime.std.movies.TimeInfo(from, to - from)); } } catch (Exception ex) { System.err.println("QuickTime Error:\n" + ex); } } protected Component getVisualComponent() { if (player == null || mc.mediaType != MediaContent.PLAY_VIDEO) return null; if (canvas == null) { try { canvas = quicktime.app.view.QTFactory.makeQTComponent(player.getMovie()); } catch (Exception ex) { System.err.println("Error building QTCanvas!\n" + ex); } } return (Component) canvas; } } src/core/edu/xtec/jclic/media/QT61AudioBuffer.java000066400000000000000000000102121335566474600221510ustar00rootroot00000000000000/* * File : QT61AudioBuffer.java * Created : 19-sep-2003 11:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import java.io.File; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class QT61AudioBuffer extends AudioBuffer { protected File file; protected quicktime.std.sg.SequenceGrabber mGrabber; protected quicktime.std.sg.SGSoundChannel mAudio; protected quicktime.app.view.MoviePlayer player; protected Thread recordThread; protected boolean initialized; /** Creates new QTAudioBuffer */ public QT61AudioBuffer(int seconds) throws Exception { super(seconds); initialized = false; } public void play() throws Exception { stop(); if (initialized) { if (player == null && file != null) { player = QT61Tools.getPlayer(file); } if (player != null) { player.setTime(0); quicktime.app.time.TaskAllMovies.addMovieAndStart(); player.getMovie().setActive(true); player.setRate(1.0F); } } } protected void clear() { stop(); if (file != null) { try { file.delete(); } catch (Exception ex) { System.err.println("ERROR: Unable to delete file " + file.getPath() + "\n" + ex); } file = null; } } public void stop() { try { if (player != null) { player.setRate(0); player.getMovie().setActive(false); quicktime.app.time.TaskAllMovies.removeMovie(); } for (int i = 0; i < 10; i++) { if (mGrabber != null && mGrabber.isRecordMode()) { mGrabber.stop(); Thread.sleep(50); } else break; } } catch (Exception ex) { System.err.println("QuickTime recording error at STOP:\n" + ex); } } protected void record() throws Exception { stop(); if (player != null) { try { player.getMovie().disposeQTObject(); } catch (Exception ex) { System.err.println("QuickTime error: unable to release player\n" + ex); } player = null; initialized = false; } if (file != null) { file.delete(); file = null; } file = File.createTempFile("rec", ".tmp"); file.deleteOnExit(); mGrabber = new quicktime.std.sg.SequenceGrabber(); mAudio = new quicktime.std.sg.SGSoundChannel(mGrabber); mAudio.setUsage(quicktime.std.StdQTConstants.seqGrabRecord); mAudio.setSoundInputRate(22050); mAudio.setSoundInputParameters(16, 1, 0); mGrabber.setDataOutput(new quicktime.io.QTFile(file), quicktime.std.StdQTConstants.seqGrabToDisk); mGrabber.setMaximumRecordTime(m_seconds * 60); mGrabber.prepare(false, true); activeAudioBuffer = this; recordThread = new Thread("JClic sound record") { @Override public void run() { try { while (mGrabber.isRecordMode() && mGrabber.idleMore()) { mGrabber.idle(); Thread.sleep(20); } if (mGrabber.isRecordMode()) mGrabber.stop(); recordThread = null; if (mAudio != null) { mGrabber.disposeChannel(mAudio); mAudio = null; } mGrabber.release(); mGrabber = null; initialized = true; activeAudioBuffer = null; hideRecordingCursor(); } catch (Exception ex) { System.err.println(ex.getMessage()); } } }; mGrabber.startRecord(); recordThread.start(); } } src/core/edu/xtec/jclic/media/QT61AudioPlayer.java000066400000000000000000000045101335566474600222000ustar00rootroot00000000000000/* * File : QT61AudioPlayer.java * Created : 19-sep-2003 11:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.jclic.bags.MediaBag; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class QT61AudioPlayer implements AudioPlayer { quicktime.app.view.MoviePlayer player; /** Creates new QT61AudioPlayer */ public QT61AudioPlayer() { player = null; } public void play() { if (player != null) { stop(); try { player.setTime(0); quicktime.app.time.TaskAllMovies.addMovieAndStart(); player.getMovie().setActive(true); player.setRate(1.0F); } catch (Exception ex) { System.err.println("QT Exception:\n" + ex); } } } public boolean setDataSource(Object source) throws Exception { close(); player = QT61Tools.getPlayer(source); return player != null; } public void stop() { if (player != null) { try { player.setRate(0); player.getMovie().setActive(false); quicktime.app.time.TaskAllMovies.removeMovie(); } catch (Exception ex) { System.err.println("QT Error:\n" + ex); } } } public void close() { if (player != null) { stop(); if (player != null) { try { player.getMovie().disposeQTObject(); } catch (Exception ex) { System.err.println("QT Error:\n" + ex); } } player = null; } } public void realize(String fileName, MediaBag mediaBag) throws Exception { if (fileName != null) { setDataSource(mediaBag.getMediaDataSource(fileName)); } } } src/core/edu/xtec/jclic/media/QT61Tools.java000066400000000000000000000071001335566474600210600ustar00rootroot00000000000000/* * File : QT61Tools.java * Created : 19-sep-2003 11:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.media; import edu.xtec.util.ExtendedByteArrayInputStream; import edu.xtec.util.StreamIO; import java.io.File; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class QT61Tools extends Object { private static QT61Lock lock; public QT61Tools() throws Exception { if (lock == null) { lock = new QT61Lock(); } } protected class QT61Lock extends Object { protected QT61Lock() throws Exception { if (!quicktime.QTSession.isInitialized()) { quicktime.QTSession.open(); } } @Override protected void finalize() throws Throwable { quicktime.QTSession.close(); super.finalize(); } } public static quicktime.std.movies.Movie getMovie(Object source, boolean midi) throws Exception { quicktime.std.movies.Movie movie; quicktime.util.QTHandle handle = null; String sourceName = ""; if (source instanceof ExtendedByteArrayInputStream) { ExtendedByteArrayInputStream eias = (ExtendedByteArrayInputStream) source; handle = new quicktime.util.QTHandle(eias.getBuffer()); sourceName = eias.getName(); } else if (source instanceof File) { sourceName = ((File) source).getName(); if (midi) { handle = new quicktime.util.QTHandle(StreamIO.readFile((File) source)); } else { handle = new quicktime.std.movies.media.DataRef(new quicktime.io.QTFile((File) source)); } } else if (source instanceof String) { sourceName = (String) source; if (midi) { handle = new quicktime.util.QTHandle(StreamIO.readFile(new File(sourceName))); } else { handle = new quicktime.std.movies.media.DataRef(sourceName); } } if (midi) { quicktime.std.qtcomponents.MovieImporter movieimporter = new quicktime.std.qtcomponents.MovieImporter( quicktime.util.QTUtils.toOSType("Midi")); movie = new quicktime.std.movies.Movie(1); movie.setDefaultDataRef(new quicktime.std.movies.media.DataRef(new quicktime.util.QTHandle())); movieimporter.fromHandle(handle, movie, null, 0, 1); } else { quicktime.std.movies.media.DataRef dr; if (handle instanceof quicktime.std.movies.media.DataRef) dr = (quicktime.std.movies.media.DataRef) handle; else { String extension = sourceName.substring(sourceName.lastIndexOf('.')); dr = new quicktime.std.movies.media.DataRef(handle, quicktime.std.StdQTConstants.kDataRefFileExtensionTag, extension); } movie = quicktime.std.movies.Movie.fromDataRef(dr, 1); } return movie; } public static quicktime.app.view.MoviePlayer getPlayer(Object source) throws Exception { quicktime.std.movies.Movie mv = getMovie(source, false); return new quicktime.app.view.MoviePlayer(mv); } } src/core/edu/xtec/jclic/misc/000077500000000000000000000000001335566474600163575ustar00rootroot00000000000000src/core/edu/xtec/jclic/misc/Gradient.java000066400000000000000000000117111335566474600207600ustar00rootroot00000000000000/* * File : Gradient.java * Created : 06-mar-2002 15:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.misc; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.awt.*; import java.awt.geom.Rectangle2D; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class Gradient extends Object implements Cloneable, Domable { protected Color c1, c2; protected int angle = 0; protected GradientPaint gp = null; protected Rectangle2D lastRect = null; protected boolean transparency = false; protected int cycles = 1; /** Creates new Gradient */ public Gradient(Color c1, Color c2, int angle, int cycles) { setColors(c1, c2); setAngle(angle); setCycles(cycles); } public Gradient() { this(Color.black, Color.white, 0, 1); } @Override public Object clone() { return new Gradient(c1, c2, angle, cycles); } public boolean hasTransparency() { return transparency; } public void setCycles(int cycles) { this.cycles = Math.max(1, cycles); clear(); } public int getCycles() { return cycles; } public void setAngle(int angle) { this.angle = angle % 360; clear(); } public int getAngle() { return angle; } public Color[] getColors() { return new Color[] { c1, c2 }; } public void setColors(Color c1, Color c2) { this.c1 = c1; this.c2 = c2; transparency = (c1.getAlpha() != 255 || c2.getAlpha() != 255); clear(); } public void clear() { gp = null; lastRect = null; } public static final String ELEMENT_NAME = "gradient"; public static final String C1 = "source", C2 = "dest", ANGLE = "angle", CYCLES = "cycles"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(C1, JDomUtility.colorToString(c1)); e.setAttribute(C2, JDomUtility.colorToString(c2)); e.setAttribute(ANGLE, Integer.toString(angle)); if (cycles > 1) e.setAttribute(CYCLES, Integer.toString(cycles)); return e; } public static Gradient getGradient(org.jdom.Element e) throws Exception { Gradient g = new Gradient(); g.setProperties(e, null); return g; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); c1 = JDomUtility.getColorAttr(e, C1, c1); c2 = JDomUtility.getColorAttr(e, C2, c2); setAngle(JDomUtility.getIntAttr(e, ANGLE, angle)); setCycles(JDomUtility.getIntAttr(e, CYCLES, cycles)); } public void paint(Graphics2D g2, Shape shape) { Paint p = g2.getPaint(); g2.setPaint(getGradient(shape)); g2.fill(shape); g2.setPaint(p); } public GradientPaint getGradient(Shape shape) { Rectangle2D r = shape.getBounds2D(); if (gp == null || lastRect == null || !lastRect.equals(r)) { lastRect = r; double rw = r.getWidth(); double rh = r.getHeight(); double radius = rw / 2; // angle in radians double alpha = (Math.PI * angle) / 180.0; switch (angle) { case 0: case 180: break; case 90: case 270: radius = rh / 2; break; default: // diagonal of r radius = Math.sqrt(rw * rw + rh * rh) / 2; // diagonal angle double gamma = toFirstQuadrant(Math.atan2(rh, rw)); // diagonal vs. alpha double beta = Math.abs(toFirstQuadrant(alpha) - gamma); // projected radius radius *= Math.cos(beta); } float cx = (float) (r.getX() + rw / 2); float cy = (float) (r.getY() + rh / 2); float px = (float) (radius * Math.cos(alpha)); float py = (float) (radius * Math.sin(alpha)); gp = new GradientPaint(cx + px, cy - py, c1, cx + px - 2 * px / cycles, cy - py + 2 * py / cycles, c2, cycles > 1); } return gp; } protected double toFirstQuadrant(double a) { if (a > Math.PI) a = 2 * Math.PI - a; if (a > Math.PI / 2) a = Math.PI - a; return a; } @Override public boolean equals(Object obj) { boolean result = false; if (obj != null && obj instanceof Gradient) { Gradient g = (Gradient) obj; result = c1.equals(g.c1) && c2.equals(g.c2) && cycles == g.cycles && angle == g.angle; } return result; } } src/core/edu/xtec/jclic/misc/Utils.java000066400000000000000000000376021335566474600203320ustar00rootroot00000000000000/* * File : Utils.java * Created : 06-feb-2001 18:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.misc; import edu.xtec.jclic.Constants; import edu.xtec.util.Options; import edu.xtec.util.SimpleFileFilter; import java.awt.*; import java.awt.geom.Area; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public abstract class Utils implements Constants { public static final int JCLIC_FF = 0, JCLIC_ZIP_FF = 1, PAC_FF = 2, PCC_FF = 3, ALL_JCLIC_FF = 4, ALL_CLIC_FF = 5, ALL_JCLIC_CLIC_FF = 6, INSTALL_FF = 7, GIF_FF = 8, JPG_FF = 9, PNG_FF = 10, ALL_IMAGES_FF = 11, ALL_FF = 12, ALL_SOUNDS_FF = 13, MIDI_FF = 14, ALL_VIDEO_FF = 15, ALL_ANIM_FF = 16, SKINS_FF = 17, FONTS_FF = 18, ALL_MEDIA_FF = 19, ALL_MULTIMEDIA_FF = 20, ALL_HTML_FF = 21, TEXT_FF = 22, ALL_JCLIC_SCORM_FF = 23, NUM_FILE_FILTERS = 24; private static SimpleFileFilter[] fileFilters = new SimpleFileFilter[NUM_FILE_FILTERS]; public static final String EXT_JCLIC = ".jclic", EXT_JCLIC_ZIP = ".jclic.zip", EXT_SCORM_ZIP = ".scorm.zip", EXT_PAC = ".pac", EXT_PCC = ".pcc", EXT_INSTALL = ".jclic.inst"; public static final String EXT_GIF = ".gif", EXT_JPG = ".jpg", EXT_PNG = ".png", EXT_BMP = ".bmp", EXT_ICO = ".ico"; public static final String EXT_WAV = ".wav", EXT_AU = ".au", EXT_MP3 = ".mp3", EXT_AIFF = ".aiff", EXT_MID = ".mid", EXT_OGG = ".ogg"; public static final String EXT_AVI = ".avi", EXT_MOV = ".mov", EXT_MPEG = ".mpeg"; public static final String EXT_SWF = ".swf", EXT_XML = ".xml", EXT_TTF = ".ttf", EXT_HTM = ".htm", EXT_HTML = ".html", EXT_TXT = ".txt", EXT_ALL = ".*"; public static final String[] EXT_ALL_JCLIC = new String[] { EXT_JCLIC, EXT_JCLIC_ZIP }; public static final String[] EXT_ALL_JCLIC_SCORM = new String[] { EXT_JCLIC, EXT_JCLIC_ZIP, EXT_SCORM_ZIP }; public static final String[] EXT_ALL_CLIC = new String[] { EXT_PAC, EXT_PCC }; public static final String[] EXT_ALL_JCLIC_CLIC = new String[] { EXT_JCLIC, EXT_JCLIC_ZIP, EXT_PAC, EXT_PCC }; public static final String[] EXT_ALL_IMAGES = new String[] { EXT_GIF, EXT_JPG, EXT_PNG, EXT_BMP, EXT_ICO }; public static final String[] EXT_ALL_SOUNDS = new String[] { EXT_WAV, EXT_AU, EXT_MP3, EXT_OGG, EXT_AIFF }; public static final String[] EXT_ALL_VIDEO = new String[] { EXT_AVI, EXT_MOV, EXT_MPEG, EXT_SWF }; public static final String[] EXT_ALL_ANIM = new String[] { EXT_SWF }; public static final String[] EXT_ALL_MEDIA = new String[] { EXT_GIF, EXT_JPG, EXT_PNG, EXT_BMP, EXT_ICO, EXT_WAV, EXT_AU, EXT_MP3, EXT_OGG, EXT_AIFF, EXT_MID, EXT_AVI, EXT_MOV, EXT_MPEG, EXT_SWF, EXT_TTF, EXT_XML }; public static final String[] EXT_ALL_MULTIMEDIA = new String[] { EXT_WAV, EXT_AU, EXT_MP3, EXT_OGG, EXT_AIFF, EXT_MID, EXT_AVI, EXT_MOV, EXT_MPEG, EXT_SWF }; public static final String[] EXT_ALL_HTML = new String[] { EXT_HTM, EXT_HTML }; public static final int TYPE_IMAGE = 0, TYPE_AUDIO = 1, TYPE_MIDI = 2, TYPE_VIDEO = 3, TYPE_ANIM = 4, TYPE_XML = 5, TYPE_FONT = 6, TYPE_JCLIC = 7, TYPE_CLIC = 8, TYPE_INST = 9, TYPE_TEXT = 10, TYPE_UNKNOWN = 11; public static final String[] TYPE_CODES = { "ftype_image", "ftype_audio", "ftype_midi", "ftype_video", "ftype_anim", "ftype_xml", "ftype_font", "ftype_jclic", "ftype_clic", "ftype_inst", "ftype_text", "ftype_unknown" }; public static final int[] T_CODES = { Constants.T_IMAGE, Constants.T_AUDIO, Constants.T_MIDI, Constants.T_VIDEO, Constants.T_ANIM, Constants.T_XML, Constants.T_FONT, Constants.T_JCLIC, Constants.T_CLIC, Constants.T_INST, Constants.T_TEXT, Constants.T_UNKNOWN_MEDIA }; public static int getFileType(String fileName) { int result = TYPE_UNKNOWN; if (fileName != null) { int dot = fileName.lastIndexOf('.'); if (dot > 0) { if (fileName.substring(0, dot).toLowerCase().endsWith(".jclic")) dot -= 6; String fn = fileName.substring(dot).toLowerCase(); if (fn.equals(EXT_GIF) || fn.equals(EXT_JPG) || fn.equals(EXT_PNG) || fn.equals(EXT_BMP) || fn.equals(EXT_ICO)) result = TYPE_IMAGE; else if (fn.equals(EXT_WAV) || fn.equals(EXT_AU) || fn.equals(EXT_MP3) || fn.equals(EXT_OGG) || fn.equals(EXT_AIFF)) result = TYPE_AUDIO; else if (fn.equals(EXT_MID)) result = TYPE_MIDI; else if (fn.equals(EXT_AVI) || fn.equals(EXT_MOV) || fn.equals(EXT_MPEG)) result = TYPE_VIDEO; else if (fn.equals(EXT_SWF)) result = TYPE_ANIM; else if (fn.equals(EXT_XML)) result = TYPE_XML; else if (fn.equals(EXT_TTF)) result = TYPE_FONT; else if (fn.equals(EXT_JCLIC) || fn.equals(EXT_JCLIC_ZIP)) result = TYPE_JCLIC; else if (fn.equals(EXT_PAC) || fn.equals(EXT_PCC)) result = TYPE_CLIC; else if (fn.equals(EXT_INSTALL)) result = TYPE_INST; else if (fn.equals(EXT_TXT)) result = TYPE_TEXT; } } return result; } public static javax.swing.ImageIcon getFileIcon(String forFileName) { String imgKey = "icons/icounknown.png"; switch (getFileType(forFileName)) { case Utils.TYPE_AUDIO: imgKey = "icons/icowave.png"; break; case Utils.TYPE_MIDI: imgKey = "icons/icomidi.png"; break; case Utils.TYPE_ANIM: case Utils.TYPE_VIDEO: imgKey = "icons/icomci.png"; break; case Utils.TYPE_FONT: imgKey = "icons/icottf.png"; break; case Utils.TYPE_XML: imgKey = "icons/icoxml.png"; break; } return edu.xtec.util.ResourceManager.getImageIcon(imgKey); } public static int getFileFilterCode(String forFileName) { int result = ALL_FF; switch (getFileType(forFileName)) { case TYPE_IMAGE: result = ALL_IMAGES_FF; break; case TYPE_AUDIO: result = ALL_SOUNDS_FF; break; case TYPE_MIDI: result = MIDI_FF; break; case TYPE_VIDEO: result = ALL_VIDEO_FF; break; case TYPE_ANIM: result = ALL_ANIM_FF; break; case TYPE_XML: result = SKINS_FF; break; case TYPE_FONT: result = FONTS_FF; break; case TYPE_JCLIC: result = ALL_JCLIC_FF; break; case TYPE_CLIC: result = ALL_CLIC_FF; break; case TYPE_INST: result = INSTALL_FF; break; case TYPE_TEXT: result = TEXT_FF; break; } return result; } public static SimpleFileFilter getFileFilter(int fileFilterCode, edu.xtec.util.Messages msg) { if (fileFilterCode < 0 || fileFilterCode >= NUM_FILE_FILTERS) return null; if (fileFilters[fileFilterCode] == null) { switch (fileFilterCode) { case JCLIC_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_JCLIC, msg.get("filefilter_jclic")); break; case JCLIC_ZIP_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_JCLIC_ZIP, msg.get("filefilter_jclic_zip")); break; case PAC_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_PAC, msg.get("filefilter_pac")); break; case PCC_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_PCC, msg.get("filefilter_pcc")); break; case ALL_JCLIC_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_JCLIC, msg.get("filefilter_all_jclic")); break; case ALL_JCLIC_SCORM_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_JCLIC_SCORM, msg.get("filefilter_all_jclic_scorm")); break; case ALL_CLIC_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_CLIC, msg.get("filefilter_all_clic")); break; case ALL_JCLIC_CLIC_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_JCLIC_CLIC, msg.get("filefilter_all_jclic_clic")); break; case INSTALL_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_INSTALL, msg.get("filefilter_install")); break; case GIF_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_GIF, msg.get("filefilter_gif")); break; case JPG_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_JPG, msg.get("filefilter_jpg")); break; case PNG_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_PNG, msg.get("filefilter_png")); break; case ALL_IMAGES_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_IMAGES, msg.get("filefilter_all_images")); break; case ALL_SOUNDS_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_SOUNDS, msg.get("filefilter_all_sounds")); break; case MIDI_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_MID, msg.get("filefilter_midi")); break; case ALL_VIDEO_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_VIDEO, msg.get("filefilter_all_video")); break; case ALL_ANIM_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_ANIM, msg.get("filefilter_all_anim")); break; case SKINS_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_XML, msg.get("filefilter_skins")); break; case FONTS_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_TTF, msg.get("filefilter_fonts")); break; case ALL_MEDIA_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_MEDIA, msg.get("filefilter_all_media")); break; case ALL_MULTIMEDIA_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_MULTIMEDIA, msg.get("filefilter_all_media")); break; case ALL_HTML_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL_HTML, msg.get("filefilter_all_html")); break; case TEXT_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_TXT, msg.get("filefilter_text")); break; case ALL_FF: fileFilters[fileFilterCode] = new SimpleFileFilter(EXT_ALL, msg.get("filefilter_all")); break; } } return fileFilters[fileFilterCode]; } public static String[] getFileFilterExtensions(int fileFilterCode) { String[] result = null; if (fileFilterCode >= 0 && fileFilterCode < NUM_FILE_FILTERS) { switch (fileFilterCode) { case JCLIC_FF: result = new String[] { EXT_JCLIC }; break; case JCLIC_ZIP_FF: result = new String[] { EXT_JCLIC_ZIP }; break; case PAC_FF: result = new String[] { EXT_PAC }; break; case PCC_FF: result = new String[] { EXT_PCC }; break; case ALL_JCLIC_FF: result = EXT_ALL_JCLIC; break; case ALL_JCLIC_SCORM_FF: result = EXT_ALL_JCLIC_SCORM; break; case ALL_CLIC_FF: result = EXT_ALL_CLIC; break; case ALL_JCLIC_CLIC_FF: result = EXT_ALL_JCLIC_CLIC; break; case INSTALL_FF: result = new String[] { EXT_INSTALL }; break; case GIF_FF: result = new String[] { EXT_GIF }; break; case JPG_FF: result = new String[] { EXT_JPG }; break; case PNG_FF: result = new String[] { EXT_PNG }; break; case ALL_IMAGES_FF: result = EXT_ALL_IMAGES; break; case ALL_SOUNDS_FF: result = EXT_ALL_SOUNDS; break; case MIDI_FF: result = new String[] { EXT_MID }; break; case ALL_VIDEO_FF: result = EXT_ALL_VIDEO; break; case ALL_ANIM_FF: result = EXT_ALL_ANIM; break; case SKINS_FF: result = new String[] { EXT_XML }; break; case FONTS_FF: result = new String[] { EXT_TTF }; break; case ALL_MEDIA_FF: result = EXT_ALL_MEDIA; break; case ALL_MULTIMEDIA_FF: result = EXT_ALL_MULTIMEDIA; break; case TEXT_FF: result = new String[] { EXT_TXT }; break; } } return result; } public static BufferedImage toBufferedImage(Image image, java.awt.Color bgColor, ImageObserver io) { int w = image.getWidth(io); int h = image.getHeight(io); BufferedImage bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics g = bufferedImage.createGraphics(); g.drawImage(image, 0, 0, bgColor, io); g.dispose(); return bufferedImage; } public static void drawImage(Graphics g, Image img, Rectangle dest, Rectangle source, ImageObserver io) { if (g.getClip().intersects(dest)) { g.drawImage(img, dest.x, dest.y, dest.x + dest.width, dest.y + dest.height, source.x, source.y, source.x + source.width, source.y + source.height, io); } } public static void tileImage(Graphics g, Image img, Rectangle dest, Rectangle source, ImageObserver io) { if (g.getClip().intersects(dest)) { int x, y; Area saveClip = new Area(g.getClip()); Area newClip = new Area(saveClip); newClip.intersect(new Area(dest)); g.setClip(newClip); Rectangle floatDest = new Rectangle(dest.x, dest.y, source.width, source.height); for (y = 0; y < dest.height; y += source.height) { for (x = 0; x < dest.width; x += source.width) { floatDest.setLocation(dest.x + x, dest.y + y); drawImage(g, img, floatDest, source, io); } } g.setClip(saveClip); } } public static Point mapPointTo(Component srcCmp, Point offset, Component destCmp) { Point p = new Point(); try { p = new Point(srcCmp.getLocationOnScreen()); } catch (IllegalComponentStateException ex) { // component is not visible! } p.x += offset.x; p.y += offset.y; Point pd = new Point(); try { pd = destCmp.getLocationOnScreen(); } catch (IllegalComponentStateException ex) { // component is not visible! } p.x -= pd.x; p.y -= pd.y; return p; } public static void refreshAnimatedImage(Image img) { if (img != null && (java.awt.Toolkit.getDefaultToolkit().checkImage(img, -1, -1, null) & ImageObserver.ALLBITS) != 0) { img.flush(); } } public static void checkRenderingHints(Options options) { if (DEFAULT_RENDERING_HINTS.isEmpty()) { if (options == null) options = new Options(); boolean win = options.getBoolean(Options.WIN); DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); if (win) { DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); DEFAULT_RENDERING_HINTS.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); } } } public static long getTotalFreeMemory() { Runtime r = Runtime.getRuntime(); return r.maxMemory() - r.totalMemory() + r.freeMemory(); } // Low memory under 4Mb of free RAM public static final long LOW_MEMORY_THRESHOLD = 0x400000L; public static boolean lowMemoryCondition() { return getTotalFreeMemory() < LOW_MEMORY_THRESHOLD; } } src/core/edu/xtec/jclic/project/000077500000000000000000000000001335566474600170725ustar00rootroot00000000000000src/core/edu/xtec/jclic/project/Author.java000066400000000000000000000101661335566474600212030ustar00rootroot00000000000000/* * File : Author.java * Created : 13-jul-2001 11:07 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.util.Domable; import edu.xtec.util.Html; import edu.xtec.util.JDomUtility; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class Author extends Object implements Domable { public String name; public String mail; public String url; public String organization; public String comments; public String rol; /** Creates new Author */ public Author() { name = new String(); mail = null; url = null; organization = null; comments = null; rol = null; } public static final String ELEMENT_NAME = "author"; public static final String NAME = "name", MAIL = "mail", URL = "url", ORGANIZATION = "organization", COMMENTS = "comments", ROL = "rol"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(NAME, name); if (mail != null) e.setAttribute(MAIL, mail); if (url != null) e.setAttribute(URL, url); if (rol != null) e.setAttribute(ROL, rol); if (organization != null) e.setAttribute(ORGANIZATION, organization); if (comments != null) JDomUtility.addParagraphs(e, COMMENTS, comments); return e; } public static Author getAuthor(org.jdom.Element e) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); Author a = new Author(); a.name = JDomUtility.getStringAttr(e, NAME, a.name, true); a.mail = JDomUtility.getStringAttr(e, MAIL, a.mail, false); a.url = JDomUtility.getStringAttr(e, URL, a.url, false); a.rol = JDomUtility.getStringAttr(e, ROL, a.rol, false); a.organization = JDomUtility.getStringAttr(e, ORGANIZATION, a.organization, false); a.comments = JDomUtility.getParagraphs(e.getChild(COMMENTS)); return a; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); name = JDomUtility.getStringAttr(e, NAME, name, true); mail = JDomUtility.getStringAttr(e, MAIL, mail, false); url = JDomUtility.getStringAttr(e, URL, url, false); rol = JDomUtility.getStringAttr(e, ROL, rol, false); organization = JDomUtility.getStringAttr(e, ORGANIZATION, organization, false); comments = JDomUtility.getParagraphs(e.getChild(COMMENTS)); } public String toHtmlString(edu.xtec.util.Messages msg) { Html html = new Html(500); if (rol != null) html.append(rol).append(": "); html.append(name); if (mail != null && mail.length() > 0) html.sp().mailTo(mail, true); if (url != null && url.length() > 0) html.br().linkTo(url, null); if (organization != null && organization.length() > 0) html.br().appendParagraphs(organization); if (comments != null && comments.length() > 0) html.br().appendParagraphs(comments); return html.toString(); } @Override public String toString() { StringBuilder sb = new StringBuilder(name); if (rol != null && rol.length() > 0) sb.append(" (").append(rol).append(")"); return sb.substring(0); } public static Author fromString(String str) { Author result = new Author(); str = str.trim(); int p = str.indexOf(" ("); if (p > 0) { result.name = str.substring(0, p); result.rol = str.substring(p + 2, str.length() - 1); } else result.name = str; return result; } } src/core/edu/xtec/jclic/project/JClicProject.java000066400000000000000000000262341335566474600222570ustar00rootroot00000000000000/* * File : JClicProject.java * Created : 16-aug-2001 1:17 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.PlayStation; import edu.xtec.jclic.bags.*; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.fileSystem.ZipFileSystem; import edu.xtec.jclic.media.EventSounds; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.skins.Skin; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.ProgressDialog; import edu.xtec.util.ResourceBridge; import edu.xtec.util.StrUtils; import java.io.*; import java.util.*; import java.util.zip.*; import org.json.JSONObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class JClicProject extends Object implements Editable, Domable { public static String CURRENT_VERSION = "0.1.3"; protected ResourceBridge bridge; protected FileSystem fileSystem; public ActivityBag activityBag; public ActivitySequence activitySequence; public MediaBag mediaBag; public Skin skin; protected String name; public String version; public ProjectSettings settings; public String type; /** Optional code used in reports for filtering queries by activity */ public String code; protected String fullPath; public boolean isScorm; public static String TYPE = "type"; /** Creates new JClicProject */ public JClicProject(ResourceBridge bridge, FileSystem fileSystem, String fullPath) { this.fileSystem = fileSystem; this.bridge = bridge; this.fullPath = (fullPath == null ? "" : fullPath); isScorm = this.fullPath.endsWith(".scorm.zip"); version = CURRENT_VERSION; settings = new ProjectSettings(); settings.title = bridge.getMsg("UNNAMED"); setName(settings.title); type = null; activityBag = new ActivityBag(this); activitySequence = new ActivitySequence(this); mediaBag = new MediaBag(this /* , fileSystem */); skin = null; } public static String ELEMENT_NAME = "JClicProject"; public static String VERSION = "version", NAME = "name", CODE = "code"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(NAME, name); e.setAttribute(VERSION, CURRENT_VERSION); if (type != null) e.setAttribute(TYPE, type); if (code != null) e.setAttribute(CODE, code); e.addContent(settings.getJDomElement()); e.addContent(activitySequence.getJDomElement()); e.addContent(activityBag.getJDomElement()); e.addContent(mediaBag.getJDomElement()); return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child; name = JDomUtility.getStringAttr(e, NAME, name, false); version = JDomUtility.getStringAttr(e, VERSION, version, false); type = JDomUtility.getStringAttr(e, TYPE, type, false); code = JDomUtility.getStringAttr(e, CODE, code, false); if ((child = e.getChild(ProjectSettings.ELEMENT_NAME)) != null) settings = ProjectSettings.getProjectSettings(child); activitySequence.setProperties(e.getChild(ActivitySequence.ELEMENT_NAME), null); activityBag.setProperties(e.getChild(ActivityBag.ELEMENT_NAME), null); if (version.compareTo("0.1.2") <= 0) activityBag.sortByName(); mediaBag.setProperties(e.getChild(MediaBag.ELEMENT_NAME), null); } public void readJSON(JSONObject json, boolean preserve) throws Exception { settings.readJSON(json, this, preserve); } public static JClicProject getJClicProject(org.jdom.Element e, ResourceBridge rb, FileSystem fs, String fullPath) throws Exception { JClicProject jcp = new JClicProject(rb, fs, fullPath); jcp.setProperties(e, null); return jcp; } public static JClicProject getJClicProject(ResourceBridge rb, String fullPath, ProgressDialog pd) throws Exception { JClicProject result = null; if (pd != null) pd.setText(rb.getMsg("msg_loading") + " " + fullPath); FileSystem fileSystem = FileSystem.createFileSystem(fullPath, rb); fullPath = fileSystem.getUrl(fullPath); if (fullPath.startsWith("file://")) fullPath = fullPath.substring(7); String projectName = null; JSONObject json = null; if (fullPath.endsWith(Utils.EXT_JCLIC_ZIP)) { fileSystem = FileSystem.createFileSystem(fullPath, rb); String[] projects = ((ZipFileSystem) fileSystem).getEntries(".jclic"); if (projects == null) throw new Exception("File " + fullPath + " does not contain any jclic project"); projectName = projects[0]; } else if (fullPath.endsWith(Utils.EXT_SCORM_ZIP)) { fileSystem = FileSystem.createFileSystem(fullPath, rb); if (fileSystem.fileExists("project.json")) { json = new JSONObject(new String(fileSystem.getBytes("project.json"))); projectName = json.optString("mainFile", null); } if (projectName == null) throw new Exception("Invalid JClic SCORM file: " + fullPath); } else { fileSystem = new FileSystem(FileSystem.getPathPartOf(fullPath), rb); projectName = FileSystem.getFileNameOf(fullPath); if (fileSystem.fileExists("project.json")) json = new JSONObject(new String(fileSystem.getBytes("project.json"))); } if (projectName.endsWith(".jclic")) { org.jdom.Document doc = fileSystem.getXMLDocument(projectName); System.gc(); result = getJClicProject(doc.getRootElement(), rb, fileSystem, fullPath); } if (result != null) { if (json != null) result.readJSON(json, false); result.mediaBag.waitForAllImages(); } return result; } public org.jdom.Document getDocument() { return new org.jdom.Document(getJDomElement()); } public void saveDocument(OutputStream out) throws Exception { JDomUtility.saveDocument(out, getDocument()); } public void saveZipDocument(OutputStream out, boolean includeMedia) throws Exception { ZipOutputStream zos = new ZipOutputStream(out); zos.putNextEntry(new ZipEntry(name + ".jclic")); saveDocument(zos); zos.closeEntry(); if (includeMedia) { Set set = Collections.synchronizedSet(new HashSet()); Iterator mbit = mediaBag.getElements().iterator(); while (mbit.hasNext()) { MediaBagElement mbe = mbit.next(); if (mbe.saveFlag) { String fName = mbe.getFileName(); if (fName != null && fName.length() > 0) set.add(fName); } } for (String fName : set) { zos.putNextEntry(new ZipEntry(fName)); zos.write(fileSystem.getBytes(fName)); zos.closeEntry(); } } zos.close(); out.close(); } public void saveZipDocumentPreservingZipContents(OutputStream out, ZipFileSystem zfs) throws Exception { ZipOutputStream zos = new ZipOutputStream(out); zos.putNextEntry(new ZipEntry(name + ".jclic")); saveDocument(zos); zos.closeEntry(); String[] entries = zfs.getEntries(null); if (entries != null) { for (String entry : entries) { if (!entry.endsWith(".jclic")) { zos.putNextEntry(new ZipEntry(entry)); zos.write(zfs.getBytes(entry)); zos.closeEntry(); } } } zos.close(); out.close(); } public void saveProject(String fileName) throws Exception { // Free discardable objects allocated in memory mediaBag.clearData(); System.runFinalization(); System.gc(); // ------------- String fn = fileSystem.getFullFileNamePath(fileName); FileOutputStream fos = fileSystem.createSecureFileOutputStream(fn, true); saveZipDocument(fos, true); fos.close(); setFileSystem(FileSystem.createFileSystem(fn, bridge)); setFullPath(fn); } public void setName(String newName) { int p; name = StrUtils.secureString(newName, bridge.getMsg("UNNAMED")); name = (new File(name)).getName(); if ((p = name.indexOf('.')) >= 0) name = name.substring(0, p); if (name.indexOf(' ') >= 0) name = name.replace(' ', '_'); if (name.length() < 1) name = "NO_NAME"; } public String getName() { return name; } public String getPublicName() { /* * String result=name; if("noName".equals(name) || * bridge.getMsg("UNNAMED").equals(name)) result=settings.title; return result; */ return settings.title; } public void realize(EventSounds parent, PlayStation ps) { if (skin == null && settings.skinFileName != null && settings.skinFileName.length() > 0) skin = mediaBag.getSkinElement(settings.skinFileName, ps); if (settings.eventSounds != null) { settings.eventSounds.setParent(parent); settings.eventSounds.realize(ps.getOptions(), mediaBag); } mediaBag.buildFonts(); } public void end() { if (settings.eventSounds != null) { settings.eventSounds.close(); settings.eventSounds = null; } mediaBag.clearData(); mediaBag.clear(); fileSystem.close(); System.gc(); } @Override protected void finalize() throws Throwable { end(); super.finalize(); } /** * Getter for property resourceBridge. * * @return Value of property resourceBridge. */ public edu.xtec.util.ResourceBridge getBridge() { return bridge; } /** * Setter for property bridge. * * @param bridge New value of property {@link #bridge}. */ public void setBridge(edu.xtec.util.ResourceBridge bridge) { this.bridge = bridge; } /** * Getter for property fileSystem. * * @return Value of property fileSystem. */ public edu.xtec.jclic.fileSystem.FileSystem getFileSystem() { return fileSystem; } /** * Setter for property fileSystem. * * @param fileSystem New value of property fileSystem. */ public void setFileSystem(edu.xtec.jclic.fileSystem.FileSystem fileSystem) { if (this.fileSystem != null && this.fileSystem != fileSystem) this.fileSystem.close(); this.fileSystem = fileSystem; } /** * Getter for property fullPath. * * @return Value of property fullPath. */ public java.lang.String getFullPath() { return fullPath; } /** * Setter for property fullPath. * * @param fullPath New value of property fullPath. */ public void setFullPath(java.lang.String fullPath) { this.fullPath = fullPath; } public Editor getEditor(Editor parent) { return Editor.createEditor("edu.xtec.jclic.project.JClicProjectEditor", this, parent); } } src/core/edu/xtec/jclic/project/LibraryManager.java000066400000000000000000000505261335566474600226440ustar00rootroot00000000000000/* * File : LibraryManager.java * Created : 04-jun-2002 11:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.*; import edu.xtec.jclic.activities.panels.Menu; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.Messages; import edu.xtec.util.PersistentSettings; import edu.xtec.util.ResourceBridge; import edu.xtec.util.ResourceManager; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.*; import java.io.File; import java.util.Iterator; import javax.swing.*; import javax.swing.event.*; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.10.04 */ public class LibraryManager implements Domable { protected DefaultListModel libraries; protected PlayerSettings settings; protected boolean modified; public boolean autoRun; public static final String AUTO_RUN = "autoRun"; public static final String ELEMENT_NAME = "libraryManager"; private static final String MSG_ID = "libraryManager_"; public static final String PROJECT_LIBRARIES = "project.libraries"; /** Creates new LibraryManager */ public LibraryManager(PlayerSettings settings) { this.settings = settings; libraries = new DefaultListModel(); modified = false; autoRun = true; } public static LibraryManager getLibraryManager(PlayerSettings st, org.jdom.Element e) throws Exception { LibraryManager lm = new LibraryManager(st); lm.setProperties(e, null); return lm; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); autoRun = JDomUtility.getBoolAttr(e, AUTO_RUN, autoRun); String[][] sysLibs = getSystemLibraries(); if (sysLibs != null) { for (int i = 0; i < sysLibs.length; i++) { LibraryManagerElement lme = new LibraryManagerElement(sysLibs[i][0], sysLibs[i][1], settings.rb.getOptions()); lme.setSystemLib(true); libraries.addElement(lme); } } Iterator it = e.getChildren(LibraryManagerElement.ELEMENT_NAME).iterator(); while (it.hasNext()) { libraries.addElement( LibraryManagerElement.getLibraryManagerElement((org.jdom.Element) it.next(), settings.rb.getOptions())); } } public void addNewLibrary(String path, String title) throws Exception { File f = new File(path); if (f.exists()) { ProjectLibrary pl = ProjectLibrary.loadProjectLibrary(path, settings.rb); title = pl.settings.title; } else { if (title == null) { title = settings.rb.getMsg("libraryManager_mainLibraryTitle"); } ProjectLibrary pl = ProjectLibrary.createNewProjectLibrary(settings.rb, settings.fileSystem); pl.settings.title = title; pl.save(path); } libraries.addElement(new LibraryManagerElement(title, path, settings.rb.getOptions())); } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(AUTO_RUN, JDomUtility.boolString(autoRun)); for (int i = 0; i < libraries.size(); i++) { LibraryManagerElement lme = (LibraryManagerElement) libraries.get(i); if (!lme.isSystemLib()) { e.addContent(lme.getJDomElement()); } } return e; } public boolean isEmpty() { return libraries.isEmpty(); } public ProjectLibrary getAutoStartProjectLibrary() throws Exception { ProjectLibrary result = null; if (autoRun && !isEmpty()) { if (libraries.size() > 1) { result = selectProjectLibrary(false, false); } else { result = ProjectLibrary.loadProjectLibrary(((LibraryManagerElement) libraries.get(0)).path, settings.rb); if (result != null) { Menu m = result.getRootMenu(); if (m == null || m.getMenuElementCount() < 1) { result = null; } } } } return result; } public ProjectLibrary selectProjectLibrary(boolean allowEdit, boolean selectOnlyEditable) throws Exception { ProjectLibrary result = null; if (!libraries.isEmpty() || allowEdit) { LibraryDialog plDlg = new LibraryDialog(allowEdit, selectOnlyEditable); plDlg.setVisible(true); if (plDlg.result != null) { result = ProjectLibrary.loadProjectLibrary(plDlg.result.path, settings.rb); } } return result; } public int getNumLibraries() { return libraries.getSize(); } public LibraryManagerElement locateNewProjectLibrary(String path) { LibraryManagerElement result = null; ProjectLibrary pl; ResourceBridge rb = settings.rb; if (path == null) { int[] filters = { Utils.JCLIC_FF }; String s = settings.fileSystem.chooseFile(settings.rootPath + File.separator + ".", false, filters, rb.getOptions(), null, rb.getComponent(), false); if (s != null) { path = settings.fileSystem.getFullFileNamePath(s); } } if (path != null && !elementExists(path, true)) { try { pl = ProjectLibrary.loadProjectLibrary(path, rb); result = new LibraryManagerElement(pl.settings.title, path, rb.getOptions()); } catch (Exception ex) { settings.rb.getOptions().getMessages().showErrorWarning(rb.getComponent(), "FILE_ERR_READING", path, ex, null); } } return result; } public LibraryManagerElement createNewProjectLibrary(String path, String name) { LibraryManagerElement result = null; ResourceBridge rb = settings.rb; if (path == null) { int[] filters = { Utils.JCLIC_FF }; String s = settings.fileSystem.chooseFile(settings.rootPath + File.separator + "library.jclic", true, filters, rb.getOptions(), null, rb.getComponent(), false); if (s != null) { path = settings.fileSystem.getFullFileNamePath(s); } } if (path != null && !elementExists(path, true)) { ProjectLibrary pl = ProjectLibrary.createNewProjectLibrary(rb, settings.fileSystem); try { pl.save(path); result = new LibraryManagerElement(pl.settings.title, path, rb.getOptions()); } catch (Exception ex) { settings.rb.getOptions().getMessages().showErrorWarning(rb.getComponent(), "FILE_ERR_SAVING", path, ex, null); } } return result; } public boolean elementExists(String path, boolean warn) { boolean result = false; for (int i = 0; i < libraries.size(); i++) { LibraryManagerElement lme = (LibraryManagerElement) libraries.get(i); if (path.equals(settings.fileSystem.getFullFileNamePath(lme.path))) { result = true; if (warn) { settings.rb.getOptions().getMessages().showAlert(settings.rb.getComponent(), "libraryManager_new_exists"); } break; } } return result; } public LibraryPane getLibraryPane(boolean allowEdit, boolean selectOnlyEditable) { return new LibraryPane(allowEdit, selectOnlyEditable); } public class LibraryPane extends JPanel implements ListSelectionListener { Action editAction, newLibraryAction, deleteAction; JList list; boolean allowEdit, onlyEditable; LibraryManagerElement current = null; LibraryPane(boolean allowEdit, boolean selectOnlyEditable) { super(new BorderLayout()); this.allowEdit = allowEdit; onlyEditable = selectOnlyEditable; buildActions(); list = new JList(libraries); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.addListSelectionListener(this); if (list.getModel().getSize() > 0) { list.setSelectedIndex(0); } list.setCellRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof LibraryManagerElement) { LibraryManagerElement lme = (LibraryManagerElement) value; setIcon(lme.getIcon()); if (!lme.exists || (!lme.editable && onlyEditable) || lme.isSystemLib()) { setForeground(java.awt.SystemColor.textInactiveText); } } return this; } }); add(new JScrollPane(list), BorderLayout.CENTER); if (allowEdit) { JPanel buttonsPanel = new JPanel(); buttonsPanel.setOpaque(false); buttonsPanel.add(new JButton(editAction)); buttonsPanel.add(new JButton(newLibraryAction)); buttonsPanel.add(new JButton(deleteAction)); add(buttonsPanel, BorderLayout.SOUTH); } } void buildActions() { final edu.xtec.util.Options options = settings.rb.getOptions(); editAction = new AbstractAction(options.getMsg(MSG_ID + "edit_caption"), ResourceManager.getImageIcon("icons/edit.gif")) { public void actionPerformed(ActionEvent ev) { LibraryManagerElement lme = (LibraryManagerElement) list.getSelectedValue(); if (lme != null) { try { if (!settings.promptPassword(LibraryPane.this, null)) { return; } ProjectLibrary pl = ProjectLibrary.loadProjectLibrary(lme.path, settings.rb); if (pl.editProjectLibrary(LibraryPane.this)) { if (!pl.settings.title.equals(lme.name)) { lme.name = pl.settings.title; modified = true; list.repaint(); } } } catch (Exception ex) { System.err.println("Unable edit projectLibrary:\n" + ex); } } } }; editAction.putValue(AbstractAction.SHORT_DESCRIPTION, options.getMsg(MSG_ID + "edit_tooltip")); editAction.setEnabled(false); deleteAction = new AbstractAction(options.getMsg(MSG_ID + "delete_caption"), ResourceManager.getImageIcon("icons/delete.gif")) { public void actionPerformed(ActionEvent ev) { LibraryManagerElement lme = (LibraryManagerElement) list.getSelectedValue(); if (lme != null) { int currentIndex = list.getSelectedIndex(); try { if (!settings.promptPassword(LibraryPane.this, null) || !(options.getMessages().showQuestionDlg(null, MSG_ID + "delete_confirm", null, "yn") == Messages.YES)) { return; } libraries.removeElement(lme); modified = true; list.setSelectedIndex(Math.max(0, currentIndex - 1)); } catch (Exception ex) { System.err.println("Unable to delete projectLibrary:\n" + ex); } } } }; deleteAction.putValue(AbstractAction.SHORT_DESCRIPTION, options.getMsg(MSG_ID + "delete_tooltip")); deleteAction.setEnabled(false); newLibraryAction = new AbstractAction(options.getMsg(MSG_ID + "new_caption"), ResourceManager.getImageIcon("icons/database_new.gif")) { public void actionPerformed(ActionEvent ev) { if (!settings.promptPassword(LibraryPane.this, null)) { return; } LibraryManagerElement lme = NewLibraryDlg.getLibraryManagerElement(LibraryManager.this, LibraryPane.this); if (lme != null) { modified = true; libraries.addElement(lme); list.setSelectedValue(lme, true); } } }; newLibraryAction.putValue(AbstractAction.SHORT_DESCRIPTION, options.getMsg(MSG_ID + "new_tooltip")); } public LibraryManagerElement getCurrentSelected() { return current; } public void addListSelectionListener(ListSelectionListener lst) { list.addListSelectionListener(lst); } public void valueChanged(ListSelectionEvent ev) { if (ev != null && !ev.getValueIsAdjusting()) { current = (LibraryManagerElement) list.getSelectedValue(); editAction.setEnabled(current != null && current.editable); deleteAction.setEnabled(current != null && !current.isSystemLib()); } } } class LibraryDialog extends edu.xtec.util.ExtendedJDialog implements ListSelectionListener { LibraryManagerElement result = null; Action selectAction, cancelAction; LibraryPane pane; boolean allowEdit, onlyEditable; LibraryDialog(boolean allowEdit, boolean selectOnlyEditable) { super(settings.rb.getComponent(), settings.rb.getMsg(MSG_ID + "caption"), true); this.allowEdit = allowEdit; onlyEditable = selectOnlyEditable; pane = new LibraryPane(allowEdit, selectOnlyEditable); pane.setOpaque(false); buildActions(); pane.addListSelectionListener(this); getContentPane().add(pane, BorderLayout.CENTER); JPanel buttonsPanel = new JPanel(); buttonsPanel.setOpaque(false); JButton btSelect = new JButton(selectAction); btSelect.setDefaultCapable(true); buttonsPanel.add(btSelect); buttonsPanel.add(new JButton(cancelAction)); getContentPane().add(buttonsPanel, BorderLayout.SOUTH); getRootPane().setDefaultButton(btSelect); pack(); centerOver(settings.rb.getComponent()); pane.list.setSelectedIndex(0); valueChanged(new ListSelectionEvent(pane.list, 0, 0, false)); valueChanged(null); } public void valueChanged(ListSelectionEvent ev) { if (ev != null && !ev.getValueIsAdjusting()) { LibraryManagerElement item = pane.getCurrentSelected(); selectAction.setEnabled(item != null && item.exists && (!onlyEditable || item.editable)); } } void closeDialog() { if (modified) { settings.save(); modified = false; } setVisible(false); } void buildActions() { final edu.xtec.util.Options options = settings.rb.getOptions(); selectAction = new AbstractAction(options.getMsg(MSG_ID + "select_caption"), ResourceManager.getImageIcon("icons/file_open.gif")) { public void actionPerformed(ActionEvent ev) { result = (LibraryManagerElement) pane.list.getSelectedValue(); closeDialog(); } }; selectAction.putValue(AbstractAction.SHORT_DESCRIPTION, options.getMsg(MSG_ID + "select_tooltip")); selectAction.setEnabled(false); cancelAction = new AbstractAction(options.getMsg(MSG_ID + "cancel_caption"), ResourceManager.getImageIcon("icons/cancel.gif")) { public void actionPerformed(ActionEvent ev) { result = null; closeDialog(); } }; cancelAction.putValue(AbstractAction.SHORT_DESCRIPTION, options.getMsg(MSG_ID + "cancel_tooltip")); } } public static String[][] getSystemLibraries() { String[][] result = null; try { String projectLibraries = PersistentSettings.systemPrefs.get(PROJECT_LIBRARIES, "[]"); JSONArray jsa = new JSONArray(projectLibraries); int numLibraries = jsa.length(); if (numLibraries > 0) { result = new String[numLibraries][2]; for (int i = 0; i < numLibraries; i++) { JSONObject jso = jsa.getJSONObject(i); if (jso != null) { result[i][0] = jso.getString("name"); result[i][1] = jso.getString("path"); } if (result[i][0] == null || result[i][1] == null) { throw new Exception("Invalid settings in JClic system libraries."); } } } } catch (Exception ex) { System.err.println("Error reading JClic system libraries: " + ex.getMessage()); result = null; } return result; } public static void main(String[] args) { String command = null; String libName = null; String libPath = null; boolean silent = false; String[][] sysLibs = getSystemLibraries(); boolean err = false; for (String s : args) { if (s.equals("-silent")) { silent = true; } else if (s.startsWith("-")) { if (command != null || s.length() == 1) { err = true; } else { command = s.substring(1); } } else if (libName == null) { libName = s; } else if (libPath == null) { libPath = s; } else { err = true; } } try { if (err || command == null) { printUsage(); } else if (command.equals("add") && libName != null && libPath != null) { JSONArray jsa = new JSONArray(); JSONObject jso; boolean done = false; if (sysLibs != null) { for (int i = 0; i < sysLibs.length; i++) { String name = sysLibs[i][0]; String path = sysLibs[i][1]; if (libName.equals(name)) { path = libPath; done = true; } jso = new JSONObject(); jso.put("name", name); jso.put("path", path); jsa.put(jso); } } if (!done) { jso = new JSONObject(); jso.put("name", libName); jso.put("path", libPath); jsa.put(jso); } try { PersistentSettings.systemPrefs.put(PROJECT_LIBRARIES, jsa.toString()); PersistentSettings.systemPrefs.flush(); } catch (Exception ex) { System.err.println("Unable to write system settings. Check your permissions!"); System.err.println(ex.getMessage()); err = true; } } else if (command.equals("remove") && libName != null) { JSONArray jsa = new JSONArray(); JSONObject jso; boolean done = false; if (sysLibs != null) { for (int i = 0; i < sysLibs.length; i++) { String name = sysLibs[i][0]; String path = sysLibs[i][1]; if (libName.equals(name)) { done = true; continue; } jso = new JSONObject(); jso.put("name", name); jso.put("path", path); jsa.put(jso); } } if (!done) { System.err.println("ERROR: Library \"" + libName + "\" does not exist!"); err = true; } else { try { PersistentSettings.systemPrefs.put(PROJECT_LIBRARIES, jsa.toString()); PersistentSettings.systemPrefs.flush(); } catch (Exception ex) { System.err.println("Unable to write system settings. Check your permissions!"); System.err.println(ex.getMessage()); err = true; } } } else if (command.equals("list")) { if (sysLibs == null || sysLibs.length == 0) { if (!silent) System.out.println("There are no system libraries defined!"); } else if (!silent) { for (int i = 0; i < sysLibs.length; i++) { System.out.println(sysLibs[i][0] + ": " + sysLibs[i][1]); } } } else { printUsage(); } } catch (JSONException ex) { System.err.println("JSON Error: " + ex.getMessage()); err = true; } System.exit(err ? -1 : 0); } protected static void printUsage() { System.out.println("JClic System Libraries Manager\n" + "\n" + "usage: java -cp jclic.jar edu.xtec.jclic.project.LibraryManager -[option] [name] [path]\n" + "\n" + "Valid options are:\n" + "-add name path Adds a new element to the list of system libraries.\n" + " 'path' must point to a library.jclic file.\n" + "-remove name Removes the library from the system list.\n" + "-list Displays a list of the existing system libraries.\n" + "-silent Supresses console output (except for errors).\n" + "-help Displays this message.\n"); } } src/core/edu/xtec/jclic/project/LibraryManagerElement.java000066400000000000000000000070411335566474600241500ustar00rootroot00000000000000/* * File : LibraryManagerElement.java * Created : 17-jun-2002 18:04 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class LibraryManagerElement implements Domable { protected String name; protected String path; protected Options options; protected boolean exists; protected boolean editable; protected boolean isUrl; protected boolean systemLib; public static final String ELEMENT_NAME = "library"; public static final String NAME = "name", PATH = "path"; public LibraryManagerElement(Options options) { this.options = options; name = options.getMsg("UNNAMED"); path = null; exists = false; editable = false; isUrl = false; systemLib = false; } public LibraryManagerElement(String name, String path, Options options) { this.name = name; this.path = path; this.options = options; checkAttributes(); } public static LibraryManagerElement getLibraryManagerElement(org.jdom.Element e, Options options) throws Exception { LibraryManagerElement lme = new LibraryManagerElement(options); lme.setProperties(e, null); return lme; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); name = JDomUtility.getStringAttr(e, NAME, name, false); path = JDomUtility.getStringAttr(e, PATH, path, false); checkAttributes(); } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(NAME, name); e.setAttribute(PATH, path); return e; } public javax.swing.Icon getIcon() { String base = "icons/database"; if (exists) { if (!editable) base = base + "_locked"; } else base = base + "_unavailable"; return edu.xtec.util.ResourceManager.getImageIcon(base + ".gif"); } protected void checkAttributes() { exists = false; editable = false; isUrl = false; if (path != null) { if (path.startsWith("http:") || path.startsWith("https:")) { isUrl = true; try { java.net.URL url = new java.net.URL(path.replace(" ", "%20")); java.net.URLConnection con = url.openConnection(); exists = (con != null); } catch (Exception ex) { // } } else { java.io.File file = new java.io.File(path); exists = file.exists() && !file.isDirectory() && file.canRead(); if (exists) editable = file.canWrite(); } } } public void setSystemLib(boolean setting) { systemLib = setting; } public boolean isSystemLib() { return systemLib; } @Override public String toString() { return name; } } src/core/edu/xtec/jclic/project/NewLibraryDlg.form000066400000000000000000000161311335566474600224660ustar00rootroot00000000000000
src/core/edu/xtec/jclic/project/NewLibraryDlg.java000066400000000000000000000147231335566474600224510ustar00rootroot00000000000000/* * File : NewLibraryDlg.java * Created : 06-sep-2004 17:09 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.PlayerSettings; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import java.io.File; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class NewLibraryDlg extends javax.swing.JPanel { PlayerSettings settings; Options options; /** Creates new form NewLibraryDlg */ public NewLibraryDlg(PlayerSettings settings) { this.settings = settings; this.options = settings.rb.getOptions(); initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.ButtonGroup bg; javax.swing.JLabel fileLabel; java.awt.GridBagConstraints gridBagConstraints; bg = new javax.swing.ButtonGroup(); btOptionNew = new javax.swing.JRadioButton(); btOptionLink = new javax.swing.JRadioButton(); fileLabel = new javax.swing.JLabel(); fileText = new javax.swing.JTextField(); fileBrowseBtn = new javax.swing.JButton(); setLayout(new java.awt.GridBagLayout()); btOptionNew.setSelected(true); btOptionNew.setText(options.getMsg("libraryManager_newLibaryOption")); bg.add(btOptionNew); btOptionNew.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btOptionNewActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(2, 2, 6, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(btOptionNew, gridBagConstraints); btOptionLink.setText(options.getMsg("libraryManager_connectToExistingOption")); bg.add(btOptionLink); btOptionLink.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btOptionLinkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(6, 2, 2, 2); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(btOptionLink, gridBagConstraints); fileLabel.setText(options.getMsg("libraryManager_fileOrUrlCaption")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 20, 2, 2); add(fileLabel, gridBagConstraints); fileText.setPreferredSize(new java.awt.Dimension(200, 20)); fileText.setEnabled(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.weightx = 1.0; add(fileText, gridBagConstraints); fileBrowseBtn.setText("..."); fileBrowseBtn.setToolTipText(options.getMsg("BROWSE_FILES")); fileBrowseBtn.setEnabled(false); fileBrowseBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fileBrowseBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(fileBrowseBtn, gridBagConstraints); } // GEN-END:initComponents private void fileBrowseBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_fileBrowseBtnActionPerformed int[] filters = { Utils.JCLIC_FF }; String result = settings.fileSystem.chooseFile(settings.rootPath + File.separator + ".", false, filters, settings.rb.getOptions(), null, this, false); if (result != null) fileText.setText(settings.fileSystem.getFullFileNamePath(result)); } // GEN-LAST:event_fileBrowseBtnActionPerformed private void btOptionLinkActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btOptionLinkActionPerformed checkEnabled(); } // GEN-LAST:event_btOptionLinkActionPerformed private void btOptionNewActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btOptionNewActionPerformed checkEnabled(); } // GEN-LAST:event_btOptionNewActionPerformed public void checkEnabled() { fileText.setEnabled(btOptionLink.isSelected()); fileBrowseBtn.setEnabled(btOptionLink.isSelected()); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JRadioButton btOptionLink; private javax.swing.JRadioButton btOptionNew; private javax.swing.JButton fileBrowseBtn; private javax.swing.JTextField fileText; // End of variables declaration//GEN-END:variables public static LibraryManagerElement getLibraryManagerElement(LibraryManager lm, Component parent) { NewLibraryDlg dlg = new NewLibraryDlg(lm.settings); Messages msg = lm.settings.rb.getOptions().getMessages(); LibraryManagerElement result = null; while (result == null && msg.showInputDlg(parent, dlg, "libraryManager_newLibraryTitle")) { if (dlg.btOptionNew.isSelected()) { result = lm.createNewProjectLibrary(null, null); break; } else { String path = StrUtils.nullableString(dlg.fileText.getText()); if (path == null) msg.showAlert(parent, "libraryManager_warnNoFileSelected"); else result = lm.locateNewProjectLibrary(path); } } return result; } } src/core/edu/xtec/jclic/project/Organization.java000066400000000000000000000107211335566474600224020ustar00rootroot00000000000000/* * File : Organization.java * Created : 13-jul-2001 11:21 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.util.Domable; import edu.xtec.util.Html; import edu.xtec.util.JDomUtility; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class Organization extends Object implements Domable { public String name; public String mail; public String url; public String address; public String pc; public String city; public String country; public String state; public String comments; /** Creates new Organization */ public Organization() { name = new String(); mail = null; url = null; address = null; pc = null; city = null; country = null; state = null; comments = null; } public static final String ELEMENT_NAME = "organization"; public static final String NAME = "name", MAIL = "mail", URL = "url", ADDRESS = "address", PC = "pc", CITY = "city", COUNTRY = "country", STATE = "state", COMMENTS = "comments"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(NAME, name); if (mail != null) e.setAttribute(MAIL, mail); if (url != null) e.setAttribute(URL, url); if (address != null) e.setAttribute(ADDRESS, address); if (pc != null) e.setAttribute(PC, pc); if (city != null) e.setAttribute(CITY, city); if (country != null) e.setAttribute(COUNTRY, country); if (state != null) e.setAttribute(STATE, state); if (comments != null) JDomUtility.addParagraphs(e, COMMENTS, comments); return e; } public static Organization getOrganization(org.jdom.Element e) throws Exception { Organization o = new Organization(); o.setProperties(e, null); return o; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); name = JDomUtility.getStringAttr(e, NAME, name, true); mail = JDomUtility.getStringAttr(e, MAIL, mail, false); url = JDomUtility.getStringAttr(e, URL, url, false); address = JDomUtility.getStringAttr(e, ADDRESS, address, false); pc = JDomUtility.getStringAttr(e, PC, pc, false); city = JDomUtility.getStringAttr(e, CITY, city, false); state = JDomUtility.getStringAttr(e, STATE, state, false); country = JDomUtility.getStringAttr(e, COUNTRY, country, false); comments = JDomUtility.getParagraphs(e.getChild(COMMENTS)); } public String toHtmlString(edu.xtec.util.Messages msg) { Html html = new Html(300); html.append(name); if (mail != null && mail.length() > 0) html.sp().mailTo(mail, true); if (url != null && url.length() > 0) html.br().linkTo(url, null); if (address != null) html.br().appendParagraphs(address); if (pc != null || city != null) { html.br(); if (pc != null) html.append(pc).nbsp(); if (city != null) html.appendParagraphs(city); } if (state != null) html.br().appendParagraphs(state); if (country != null) html.br().appendParagraphs(country); if (comments != null) html.br().appendParagraphs(comments); return html.toString(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(name); if (city != null && city.length() > 0) sb.append(" (").append(city).append(")"); return sb.toString(); } public static Organization fromString(String str) { Organization result = new Organization(); str = str.trim(); int p = str.indexOf(" ("); if (p > 0) { result.name = str.substring(0, p); result.city = str.substring(p + 2, str.length() - 1); } else result.name = str; return result; } } src/core/edu/xtec/jclic/project/ProjectInstaller.java000066400000000000000000000175771335566474600232420ustar00rootroot00000000000000/* * File : ProjectInstaller.java * Created : 05-aug-2002 15:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.14 */ public class ProjectInstaller implements Domable { public static final String SEP = ";", ITEM_SEP = ",", EQUAL_SEP = ":", FILES = "files"; public static final String ITEM_NAMES = "itemNames", ITEM_PROJECTS = "itemProjects", ITEM_ICONS = "itemIcons", ITEM_DESCRIPTIONS = "itemDescriptions"; public static final String ELEMENT_NAME = "JClicInstall"; public static final String TITLE = "title", AUTHORS = "authors", FROM = "from"; public static final String FILE = "file", SRC = "src", FOLDER = "folder"; public static final String SHORTCUT = "shortcut", ICON = "icon", PROJECT = "project", TEXT = "text", DESCRIPTION = "description"; public static final String INSTALLER_EXTENSION = ".jclic.inst"; public String fName; public String from; public String baseFolder; public String projectTitle; public String authors; public List files; public List iconItems; /** Creates a new instance of ProjectInstaller */ public ProjectInstaller() { files = new ArrayList(); iconItems = new ArrayList(); } public org.jdom.Element getJDomElement() { return getJDomElement(true); } public org.jdom.Element getJDomElement(boolean includeFrom) { org.jdom.Element child; org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); JDomUtility.setStringAttr(e, TITLE, projectTitle, false); JDomUtility.setStringAttr(e, AUTHORS, authors, false); JDomUtility.setStringAttr(e, FOLDER, baseFolder, false); if (includeFrom) JDomUtility.setStringAttr(e, FROM, from, false); if (files != null) { for (int i = 0; i < files.size(); i++) { child = new org.jdom.Element(FILE); child.setAttribute(SRC, getFile(i)); e.addContent(child); } } if (iconItems != null) { for (IconItem ii : iconItems) { child = new org.jdom.Element(SHORTCUT); JDomUtility.setStringAttr(child, PROJECT, ii.project, false); JDomUtility.setStringAttr(child, TEXT, ii.text, false); JDomUtility.setStringAttr(child, DESCRIPTION, ii.description, false); JDomUtility.setStringAttr(child, ICON, ii.icon, false); e.addContent(child); } } return e; } public static ProjectInstaller getProjectInstaller(String fileName) throws Exception { InputStream is; boolean isUrl = FileSystem.isStrUrl(fileName); URL url = null; File f = null; if (isUrl) { url = new URL(fileName); is = url.openStream(); } else { f = new File(fileName); is = new FileInputStream(f); } org.jdom.Document doc = JDomUtility.getSAXBuilder().build(is); edu.xtec.util.JDomUtility.clearNewLineElements(doc.getRootElement()); is.close(); ProjectInstaller result = getProjectInstaller(doc.getRootElement()); String from = null; String fName = null; if (isUrl && url != null) { String s0 = url.toExternalForm(); int k = s0.lastIndexOf('/'); if (k < 0) throw new Exception("Unable to get install store path from " + s0); from = s0.substring(0, k); fName = s0.substring(k + 1); } else if (f != null) { from = f.getParent(); fName = f.getName(); } if (from != null) result.from = from; if (fName != null) result.fName = fName; return result; } public static ProjectInstaller getProjectInstaller(org.jdom.Element e) throws Exception { ProjectInstaller pi = new ProjectInstaller(); pi.setProperties(e, null); return pi; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { org.jdom.Element child; JDomUtility.checkName(e, ELEMENT_NAME); projectTitle = JDomUtility.getStringAttr(e, TITLE, projectTitle, false); authors = JDomUtility.getStringAttr(e, AUTHORS, authors, false); baseFolder = JDomUtility.getStringAttr(e, FOLDER, baseFolder, false); from = JDomUtility.getStringAttr(e, FROM, from, false); Iterator it = e.getChildren(FILE).iterator(); while (it.hasNext()) { child = (org.jdom.Element) it.next(); addFile(JDomUtility.getStringAttr(child, SRC, null, false)); } it = e.getChildren(SHORTCUT).iterator(); while (it.hasNext()) { child = (org.jdom.Element) it.next(); IconItem ii = createIconItem(); ii.project = JDomUtility.getStringAttr(child, PROJECT, ii.project, false); ii.text = JDomUtility.getStringAttr(child, TEXT, ii.text, false); ii.description = JDomUtility.getStringAttr(child, DESCRIPTION, ii.description, false); ii.icon = JDomUtility.getStringAttr(child, ICON, ii.icon, false); } } public void addFile(String s) { if (s != null && !files.contains(s)) files.add(s); } public String getFile(int i) { if (files != null && i < files.size()) return (String) files.get(i); else return null; } public IconItem getIconItem(int i) { if (iconItems != null && i < iconItems.size()) return (IconItem) iconItems.get(i); else return null; } public IconItem createIconItem() { IconItem result = new IconItem(); iconItems.add(result); return result; } public class IconItem { protected String text; protected String description; protected String project; protected String icon; @Override public String toString() { return (project == null ? "--" : project); } /** * Getter for property description. * * @return Value of property description. */ public String getDescription() { return description; } /** * Setter for property description. * * @param description New value of property description. */ public void setDescription(String description) { this.description = description; } /** * Getter for property icon. * * @return Value of property icon. */ public String getIcon() { return icon; } /** * Setter for property icon. * * @param icon New value of property icon. */ public void setIcon(String icon) { this.icon = icon; } /** * Getter for property project. * * @return Value of property project. */ public String getProject() { return project; } /** * Setter for property project. * * @param project New value of property project. */ public void setProject(String project) { this.project = project; } /** * Getter for property text. * * @return Value of property text. */ public String getText() { return text; } /** * Setter for property text. * * @param text New value of property text. */ public void setText(String text) { this.text = text; } } } src/core/edu/xtec/jclic/project/ProjectInstallerDlg.form000066400000000000000000001301031335566474600236700ustar00rootroot00000000000000
src/core/edu/xtec/jclic/project/ProjectInstallerDlg.java000066400000000000000000000732351335566474600236620ustar00rootroot00000000000000/* * File : ProjectInstallerDlg.java * Created : 04-jun-2002 09:55 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.activities.panels.*; import edu.xtec.jclic.edit.EditorTreePanel; import edu.xtec.jclic.fileSystem.FileBackup; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Gradient; import edu.xtec.util.*; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.io.*; import java.util.ArrayList; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class ProjectInstallerDlg extends ExtendedJDialog implements ProgressInputStream.ProgressInputStreamListener, ListSelectionListener { public ProjectLibrary result; public boolean cancel; public boolean launchNow; public String pathToMainProject; Messages msg; LibraryManager lm; FileSystem storeFileSystem; ProjectInstaller pi; ProjectLibrary pl; LibraryManager.LibraryPane libraryPane; EditorTreePanel etp; File installDir; Options options; boolean workerRunning; edu.xtec.util.SwingWorker worker; boolean copyComplete; private Font titleFont, mainFont, itemFont; private Image logo; private Gradient logoGp; private int currentStage = 0; private static final int STAGE_INFO = 0, STAGE_SELECT_LIB = 1, STAGE_COPY_FILES = 2, STAGE_SELECT_FOLDER = 3, STAGE_END = 4, NUM_STAGES = 5; private static final String[] STAGE_TITLES = new String[] { "install_title", "install_step_1", "install_step_2", "install_step_3", "install_step_4", }; private static final String LOGO = "icons/install.png"; /** Creates new form ProjectInstallerDlg */ private ProjectInstallerDlg(Component parent, LibraryManager lm, ProjectInstaller pi) throws Exception { super(parent, null, true); this.lm = lm; options = lm.settings.rb.getOptions(); msg = options.getMessages(); setTitle(msg.get("install_title")); result = null; launchNow = true; pathToMainProject = null; cancel = false; titleFont = new Font("Dialog", Font.BOLD, 18); mainFont = new Font("Dialog", Font.BOLD, 12); itemFont = new Font("Dialog", 0, 12); this.pi = pi; if (pi.from == null) throw new Exception("Path to installer data store not specified!"); storeFileSystem = FileSystem.createFileSystem(pi.from, null, lm.settings.rb); logo = ResourceManager.getImageIcon(LOGO).getImage(); logoGp = new Gradient(Color.white, Color.blue, 90, 1); initComponents(); centerOver(parent); getRootPane().setDefaultButton(nextBtn); } public static ProjectInstallerDlg getProjectInstallerDlg(Component parent, LibraryManager lm, String installerScriptFile) throws Exception { return new ProjectInstallerDlg(parent, lm, ProjectInstaller.getProjectInstaller(installerScriptFile)); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents javax.swing.JTextArea authorLb; javax.swing.JPanel basicPane; javax.swing.JPanel btPane; javax.swing.JLabel destLbHeader; javax.swing.JLabel finishLb; javax.swing.JLabel finishLb2; javax.swing.JLabel finishLb3; java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel infoTitleLb; javax.swing.JLabel libFolderLb; javax.swing.JLabel libLb; javax.swing.JLabel sourceLb; javax.swing.JLabel sourceLbHeader; javax.swing.JLabel sourcePathLb; javax.swing.JLabel sourcePathLbHeader; javax.swing.JLabel statusLbHeader; javax.swing.JTextArea titleLb2; javax.swing.JLabel wizardInfoLb; btPane = new javax.swing.JPanel(); cancelBtn = new javax.swing.JButton(); prevBtn = new javax.swing.JButton(); nextBtn = new javax.swing.JButton(); basicPane = new javax.swing.JPanel(); mainPane = new javax.swing.JPanel(); card00 = new javax.swing.JPanel(); infoTitleLb = new javax.swing.JLabel(); titleLb2 = new javax.swing.JTextArea(); authorLb = new javax.swing.JTextArea(); sourceLbHeader = new javax.swing.JLabel(); sourceLb = new javax.swing.JLabel(); wizardInfoLb = new javax.swing.JLabel(); card01 = new javax.swing.JPanel(); libLb = new javax.swing.JLabel(); selectLibPanel = lm.getLibraryPane(true, true); libraryPane = (LibraryManager.LibraryPane) selectLibPanel; libraryPane.addListSelectionListener(this); card02 = new javax.swing.JPanel(); sourcePathLbHeader = new javax.swing.JLabel(); sourcePathLb = new javax.swing.JLabel(); destLbHeader = new javax.swing.JLabel(); destLb = new javax.swing.JLabel(); statusLbHeader = new javax.swing.JLabel(); statusLb = new javax.swing.JLabel(); itemProgressBar = new javax.swing.JProgressBar(); card03 = new javax.swing.JPanel(); libFolderLb = new javax.swing.JLabel(); libFolderPanel = new javax.swing.JPanel(); card04 = new javax.swing.JPanel(); finishLb = new javax.swing.JLabel(); finishLb2 = new javax.swing.JLabel(); finishLb3 = new javax.swing.JLabel(); launchProjectChk = new javax.swing.JCheckBox(); cardTitleLb = new javax.swing.JLabel(); logoPanel = new javax.swing.JPanel() { public void paintComponent(Graphics g) { Rectangle r = new Rectangle(0, 0, getBounds().width, getBounds().height); if (logoGp != null) logoGp.paint((Graphics2D) g, r); if (logo != null) { int x = (r.width - logo.getWidth(this)) / 2; int y = (r.height - logo.getHeight(this)) / 2; g.drawImage(logo, x, y, this); } } }; addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); btPane.setLayout(new java.awt.GridBagLayout()); cancelBtn.setToolTipText(msg.get("wizard_cancel_tooltip")); cancelBtn.setText(msg.get("wizard_cancel")); cancelBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); btPane.add(cancelBtn, gridBagConstraints); prevBtn.setToolTipText(msg.get("wizard_prev_tooltip")); prevBtn.setText(msg.get("wizard_prev")); prevBtn.setEnabled(false); prevBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { prevBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); btPane.add(prevBtn, gridBagConstraints); nextBtn.setToolTipText(msg.get("wizard_next_tooltip")); nextBtn.setText(msg.get("wizard_next")); nextBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { nextBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); btPane.add(nextBtn, gridBagConstraints); getContentPane().add(btPane, java.awt.BorderLayout.SOUTH); basicPane.setLayout(new java.awt.BorderLayout()); basicPane.setPreferredSize(new java.awt.Dimension(500, 300)); mainPane.setLayout(new java.awt.CardLayout()); mainPane.setBackground(new java.awt.Color(255, 255, 204)); card00.setLayout(new java.awt.GridBagLayout()); card00.setOpaque(false); infoTitleLb.setFont(mainFont); infoTitleLb.setText(msg.get("install_info_info")); infoTitleLb.setPreferredSize(new java.awt.Dimension(300, 17)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card00.add(infoTitleLb, gridBagConstraints); titleLb2.setEditable(false); titleLb2.setFont(mainFont); titleLb2.setLineWrap(true); titleLb2.setText("\"" + pi.projectTitle + "\""); titleLb2.setWrapStyleWord(true); titleLb2.setOpaque(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 0, 3); card00.add(titleLb2, gridBagConstraints); authorLb.setEditable(false); authorLb.setFont(itemFont); authorLb.setLineWrap(true); authorLb.setText(pi.authors != null ? pi.authors : ""); authorLb.setWrapStyleWord(true); authorLb.setOpaque(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 3, 3, 3); card00.add(authorLb, gridBagConstraints); sourceLbHeader.setText(msg.get("install_info_from")); sourceLbHeader.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST; gridBagConstraints.insets = new java.awt.Insets(12, 3, 3, 3); card00.add(sourceLbHeader, gridBagConstraints); sourceLb.setText(storeFileSystem.getFullRoot()); sourceLb.setFont(itemFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST; gridBagConstraints.insets = new java.awt.Insets(0, 3, 3, 3); card00.add(sourceLb, gridBagConstraints); wizardInfoLb.setText(msg.get("wizard_info")); wizardInfoLb.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(12, 3, 3, 3); card00.add(wizardInfoLb, gridBagConstraints); mainPane.add(card00, "card00"); card01.setLayout(new java.awt.GridBagLayout()); card01.setOpaque(false); libLb.setText(msg.get("install_select_library")); libLb.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card01.add(libLb, gridBagConstraints); selectLibPanel.setBorder(new javax.swing.border.TitledBorder(msg.get("library_caption"))); selectLibPanel.setPreferredSize(new java.awt.Dimension(300, 200)); selectLibPanel.setOpaque(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card01.add(selectLibPanel, gridBagConstraints); mainPane.add(card01, "card01"); card02.setLayout(new java.awt.GridBagLayout()); card02.setPreferredSize(new java.awt.Dimension(400, 300)); card02.setOpaque(false); sourcePathLbHeader.setText(msg.get("install_source")); sourcePathLbHeader.setFont(mainFont); sourcePathLbHeader.setLabelFor(sourcePathLb); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card02.add(sourcePathLbHeader, gridBagConstraints); sourcePathLb.setText(storeFileSystem.getFullRoot()); sourcePathLb.setFont(itemFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card02.add(sourcePathLb, gridBagConstraints); destLbHeader.setText(msg.get("install_dest")); destLbHeader.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card02.add(destLbHeader, gridBagConstraints); destLb.setText(pi.baseFolder); destLb.setFont(itemFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card02.add(destLb, gridBagConstraints); statusLbHeader.setText(msg.get("install_status")); statusLbHeader.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(6, 3, 6, 3); card02.add(statusLbHeader, gridBagConstraints); statusLb.setText(msg.get("install_msg_waiting")); statusLb.setFont(itemFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(6, 3, 6, 3); card02.add(statusLb, gridBagConstraints); itemProgressBar.setToolTipText(msg.get("install_progress_tooltip")); itemProgressBar.setStringPainted(true); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card02.add(itemProgressBar, gridBagConstraints); mainPane.add(card02, "card02"); card03.setLayout(new java.awt.GridBagLayout()); card03.setOpaque(false); libFolderLb.setText(msg.get("install_select_folder")); libFolderLb.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card03.add(libFolderLb, gridBagConstraints); libFolderPanel.setLayout(new java.awt.BorderLayout()); libFolderPanel.setBorder(new javax.swing.border.TitledBorder(msg.get("install_library_folders"))); libFolderPanel.setPreferredSize(new java.awt.Dimension(300, 200)); libFolderPanel.setOpaque(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); card03.add(libFolderPanel, gridBagConstraints); mainPane.add(card03, "card03"); card04.setLayout(new java.awt.GridBagLayout()); card04.setOpaque(false); finishLb.setText(msg.get("install_success_1")); finishLb.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 13, 3); card04.add(finishLb, gridBagConstraints); finishLb2.setText(msg.get("install_success_2")); finishLb2.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 0, 3); card04.add(finishLb2, gridBagConstraints); finishLb3.setText(msg.get("install_success_3")); finishLb3.setFont(mainFont); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 3, 3, 3); card04.add(finishLb3, gridBagConstraints); launchProjectChk.setSelected(true); launchProjectChk.setText(msg.get("install_launchProject")); launchProjectChk.setOpaque(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(13, 3, 3, 3); card04.add(launchProjectChk, gridBagConstraints); mainPane.add(card04, "card04"); basicPane.add(mainPane, java.awt.BorderLayout.CENTER); cardTitleLb.setText(msg.get("install_title")); cardTitleLb.setForeground(new java.awt.Color(255, 255, 255)); cardTitleLb.setBackground(new java.awt.Color(255, 153, 51)); cardTitleLb.setFont(new java.awt.Font("SansSerif", 1, 18)); cardTitleLb.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(5, 10, 5, 10))); cardTitleLb.setOpaque(true); basicPane.add(cardTitleLb, java.awt.BorderLayout.NORTH); getContentPane().add(basicPane, java.awt.BorderLayout.CENTER); logoPanel.setPreferredSize(new java.awt.Dimension(75, 230)); getContentPane().add(logoPanel, java.awt.BorderLayout.WEST); pack(); } // GEN-END:initComponents private void nextBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_nextBtnActionPerformed if (currentStage == STAGE_COPY_FILES && !copyComplete) { } else goToStage(currentStage + 1); } // GEN-LAST:event_nextBtnActionPerformed private void goToStage(int stage) { if (stage >= 0 && stage <= NUM_STAGES) { boolean bNext = false, bPrev = false, bCancel = false; currentStage = stage; switch (currentStage) { case STAGE_INFO: bNext = true; bPrev = false; bCancel = true; break; case STAGE_SELECT_LIB: bNext = (libraryPane.getCurrentSelected() != null); bPrev = true; bCancel = true; break; case STAGE_COPY_FILES: initCopyStage(); copyFiles(); bPrev = false; bNext = false; bCancel = true; break; case STAGE_SELECT_FOLDER: bNext = (etp != null && etp.currentItem != null && etp.currentItem instanceof MenuEditor); bPrev = false; bCancel = true; break; case STAGE_END: initEndStage(); bNext = true; bPrev = false; bCancel = false; break; case NUM_STAGES: result = pl; launchNow = launchProjectChk.isSelected(); closeDialog(null); return; } StringBuilder nbs = new StringBuilder("wizard_").append(currentStage < NUM_STAGES - 1 ? "next" : "finish"); nextBtn.setText(msg.get(nbs.substring(0))); nextBtn.setToolTipText(msg.get(nbs.append("_tooltip").substring(0))); nextBtn.setEnabled(bNext); prevBtn.setEnabled(bPrev); cancelBtn.setEnabled(bCancel); if (currentStage < NUM_STAGES) { java.awt.CardLayout cl = (java.awt.CardLayout) mainPane.getLayout(); String s = Integer.toString(stage); if (s.length() == 1) s = "0" + s; cl.show(mainPane, "card" + s); cardTitleLb.setText(msg.get(STAGE_TITLES[stage])); } } } private void initCopyStage() { LibraryManagerElement lme = libraryPane.getCurrentSelected(); if (pl == null || !pl.getFullPath().equals(lme.path)) { try { pl = ProjectLibrary.loadProjectLibrary(lme.path, lm.settings.rb); if (etp != null) libFolderPanel.remove(etp); etp = new EditorTreePanel(pl.getEditor(null), options, true, Menu.class) { @Override protected void currentItemChanged() { if (currentStage == STAGE_SELECT_FOLDER) { nextBtn.setEnabled(currentItem != null && currentItem instanceof MenuEditor); } super.currentItemChanged(); } }; etp.getTree().setSelectionRow(1); libFolderPanel.add(etp, BorderLayout.CENTER); card03.revalidate(); File root = new File(pl.getFileSystem().getFullRoot()); installDir = new File(root, pi.baseFolder); destLb.setText(installDir.getAbsolutePath()); } catch (Exception ex) { msg.showErrorWarning(this, "library_error_reading", ex); closeDialog(null); } } } private void initEndStage() { try { Menu menu = ((MenuEditor) etp.currentItem).getMenu(); for (int i = 0; i < pi.iconItems.size() && !cancel; i++) { ProjectInstaller.IconItem ii = (ProjectInstaller.IconItem) pi.iconItems.get(i); MenuElement me = new MenuElement(); me.caption = ii.text; me.projectPath = pi.baseFolder + File.separator + ii.project; if (ii.icon != null) { if (!ii.icon.startsWith("@")) me.icon = pi.baseFolder + File.separator + ii.icon; else me.icon = ii.icon; } else me.icon = MenuElement.DEFAULT_ICON; if (ii.description != null) { me.description = ii.description; } menu.addMenuElement(me); if (pathToMainProject == null) pathToMainProject = pl.getFileSystem().getFullFileNamePath(me.projectPath); } pl.activityBag.addActivity(menu); pl.save(null); launchProjectChk.setEnabled(pathToMainProject != null); } catch (Exception ex) { msg.showErrorWarning(this, "library_error_creating_icons", ex); closeDialog(null); } } private void prevBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_prevBtnActionPerformed goToStage(currentStage - 1); } // GEN-LAST:event_prevBtnActionPerformed public void valueChanged(ListSelectionEvent ev) { if (ev != null && !ev.getValueIsAdjusting() && currentStage == STAGE_SELECT_LIB) nextBtn.setEnabled(libraryPane.getCurrentSelected() != null); } private void copyFiles() { final String PAUSED = "PAUSED", ERR = "ERROR", OK = "OK", CANCEL = "CANCEL"; final ProjectInstallerDlg cmp = ProjectInstallerDlg.this; prevBtn.setEnabled(false); nextBtn.setEnabled(false); statusLb.setText(msg.get("install_msg_waiting")); worker = new edu.xtec.util.SwingWorker() { @Override public Object construct() { workerRunning = true; ArrayList fileBackups = new ArrayList(); Exception ex = null; String srcFolder = FileSystem.stdFn(storeFileSystem.getFullFileNamePath(null)); String destFolder = FileSystem.stdFn(installDir.getAbsolutePath()); if (srcFolder.equalsIgnoreCase(destFolder)) { itemProgressBar.setValue(itemProgressBar.getMaximum()); statusLb.setText(msg.get("install_toSourceFolder")); } else { try { if (msg.confirmOverwriteFile(cmp, installDir, "yn") != Messages.YES) return PAUSED; boolean overwriteAll = false; boolean overwriteNone = false; for (int i = 0; i < pi.files.size() && !cancel; i++) { String file = pi.getFile(i).replace('/', File.separatorChar); File f = new File(installDir, file); statusLb.setText(msg.get("install_msg_copying") + " " + file); if (f.exists()) { if (overwriteNone) continue; if (!overwriteAll) { boolean next = false; switch (msg.confirmOverwriteFile(cmp, f, "yYnNc")) { case Messages.YES_TO_ALL: overwriteAll = true; case Messages.YES: break; case Messages.NO_TO_ALL: overwriteNone = true; case Messages.NO: next = true; break; default: cancel = true; break; } if (next) continue; if (cancel) break; } } InputStream is = storeFileSystem.getInputStream(pi.getFile(i)); ProgressInputStream pis; if (is instanceof ProgressInputStream) pis = (ProgressInputStream) is; else { pis = new ProgressInputStream(is, -1, file); } pis.addProgressInputStreamListener(cmp); fileBackups.add(new FileBackup(f)); StreamIO.writeStreamTo(pis, new FileOutputStream(f)); } } catch (Exception e) { ex = e; } if (!fileBackups.isEmpty()) { statusLb.setText(msg.get("install_msg_cleanup")); for (int i = fileBackups.size() - 1; i >= 0; i--) { FileBackup fb = (FileBackup) fileBackups.get(i); if (cancel || ex != null) { try { fb.rollback(); } catch (Exception e) { msg.showErrorWarning(cmp, "FILE_ERR_RESTORING", fb.getFile().getAbsolutePath(), e, null); } } else { try { fb.cleanup(); } catch (Exception e) { msg.showErrorWarning(cmp, "FILE_ERR_DELETING", fb.getBackup().getAbsolutePath(), e, null); } } } } } statusLb.setText(msg.get("install_msg_end")); if (ex != null) return ex; return cancel ? CANCEL : OK; } @Override public void finished() { Object result = get(); workerRunning = false; worker = null; if (result != null) { if (cancel) { msg.showAlert(cmp, "install_msg_cancel"); closeDialog(null); } else if (result instanceof Exception) { msg.showErrorWarning(cmp, "install_error", (Exception) result); closeDialog(null); } else if (result.equals(PAUSED)) { statusLb.setText(msg.get("install_msg_waiting")); prevBtn.setEnabled(true); nextBtn.setEnabled(true); } else if (result.equals(OK)) { nextBtn.setEnabled(true); copyComplete = true; nextBtnActionPerformed(null); } } } }; worker.start(); } private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_cancelBtnActionPerformed cancel = true; StreamIO.setCancel(true); if (!workerRunning) { msg.showAlert(this, "install_msg_cancel"); closeDialog(null); } else { worker.interrupt(); } } // GEN-LAST:event_cancelBtnActionPerformed /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt) { // GEN-FIRST:event_closeDialog setVisible(false); dispose(); } // GEN-LAST:event_closeDialog public void setProgressMax(int max) { itemProgressBar.setMaximum(max); } public void setProgressValue(int value) { itemProgressBar.setValue(value); } public void startProgress(String name) { itemProgressBar.setValue(0); } public void endProgress() { } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cancelBtn; private javax.swing.JPanel card00; private javax.swing.JPanel card01; private javax.swing.JPanel card02; private javax.swing.JPanel card03; private javax.swing.JPanel card04; private javax.swing.JLabel cardTitleLb; private javax.swing.JLabel destLb; private javax.swing.JProgressBar itemProgressBar; private javax.swing.JCheckBox launchProjectChk; private javax.swing.JPanel libFolderPanel; private javax.swing.JPanel logoPanel; private javax.swing.JPanel mainPane; private javax.swing.JButton nextBtn; private javax.swing.JButton prevBtn; private javax.swing.JPanel selectLibPanel; private javax.swing.JLabel statusLb; // End of variables declaration//GEN-END:variables } src/core/edu/xtec/jclic/project/ProjectLibrary.java000066400000000000000000000200031335566474600226630ustar00rootroot00000000000000/* * File : ProjectLibrary.java * Created : 04-jun-2002 10:37 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.*; import edu.xtec.jclic.activities.panels.*; import edu.xtec.jclic.bags.*; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.util.ResourceBridge; import edu.xtec.util.ResourceManager; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.io.FileOutputStream; import javax.swing.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ProjectLibrary extends JClicProject implements Editable { public static final String LIBRARY_TYPE = "library"; public static final String MSG_ID = "library_"; /** Creates new ProjectLibrary */ private ProjectLibrary(ResourceBridge rb, FileSystem fileSystem, String fullPath) { super(rb, fileSystem, fullPath); type = LIBRARY_TYPE; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { type = null; super.setProperties(e, aux); if (!LIBRARY_TYPE.equals(type)) throw new Exception(bridge.getMsg("library_badFormat")); } public static ProjectLibrary createNewProjectLibrary(ResourceBridge rb, FileSystem fileSystem) { ProjectLibrary pl = new ProjectLibrary(rb, fileSystem, null); pl.settings.title = rb.getMsg("library_newLibraryName"); Menu m = new Menu(pl); m.name = "main"; String description = rb.getMsg("library_mainMenu"); m.description = description; ActiveBoxContent[] messages = m.getMessages(); messages[Activity.MAIN] = new ActiveBoxContent(); messages[Activity.MAIN].setBoxBase(new BoxBase()); messages[Activity.MAIN].setTextContent(description); pl.activityBag.addActivity(m); pl.activitySequence.add(new ActivitySequenceElement(m.name, true)); return pl; } public static ProjectLibrary getProjectLibrary(org.jdom.Element e, ResourceBridge rb, FileSystem fileSystem, String fullPath) throws Exception { ProjectLibrary pl = new ProjectLibrary(rb, fileSystem, fullPath); pl.setProperties(e, null); return pl; } public static ProjectLibrary loadProjectLibrary(String fullPath, ResourceBridge rb) throws Exception { FileSystem fs = FileSystem.createFileSystem(fullPath, rb); org.jdom.Document doc = fs.getXMLDocument(FileSystem.getFileNameOf(fullPath)); ProjectLibrary pl = new ProjectLibrary(rb, fs, fullPath); pl.setProperties(doc.getRootElement(), null); return pl; } public void save(String path) throws Exception { if (path == null) path = fullPath; FileOutputStream fos = fileSystem.createSecureFileOutputStream(path, false); saveDocument(fos); fos.close(); } @Override public String toString() { return settings.title; } @Override public String getPublicName() { return settings.title; } public Menu getRootMenu() { Menu result = null; if (activitySequence.getSize() > 0) { try { ActivitySequenceElement ase = activitySequence.getElement(0, false); if (ase != null) { Activity act = Activity.getActivity(activityBag.getElement(ase.getActivityName()).getData(), this); if (act instanceof Menu) { result = (Menu) act; } } } catch (Exception ex) { System.err.println("Error reading project library!\n" + ex); } } return result; } @Override public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } public boolean editProjectLibrary(Object parent) { ProjectLibraryDialog pld; if (parent instanceof JDialog) pld = new ProjectLibraryDialog(true, true, (JDialog) parent); else pld = new ProjectLibraryDialog(true, true); pld.setVisible(true); return pld.accept; } protected JComponent getRbComponent() { if (bridge == null) return null; return bridge.getComponent(); } protected String getRbMessage(String msg) { if (bridge == null) { return ""; } return bridge.getMsg(msg); } class ProjectLibraryDialog extends edu.xtec.util.ExtendedJDialog { ProjectLibraryEditor pled; EditorTreePanel etp; Menu result = null; boolean accept = false; boolean allowEdit, allowNewMenu; Action selectAction, cancelAction; ProjectLibraryDialog(boolean allowNewMenu, boolean allowEdit, JDialog parent) { super(parent, bridge.getMsg(MSG_ID + "caption"), true); this.allowEdit = allowEdit; this.allowNewMenu = allowNewMenu; init(); } ProjectLibraryDialog(boolean allowNewMenu, boolean allowEdit) { super(getRbComponent(), getRbMessage(MSG_ID + "caption"), true); this.allowEdit = allowEdit; this.allowNewMenu = allowNewMenu; init(); } protected void init() { buildActions(); pled = (ProjectLibraryEditor) getEditor(null); etp = new EditorTreePanel(pled, bridge.getOptions(), !allowEdit, (allowEdit ? null : Menu.class)) { @Override protected void currentItemChanged() { if (!allowEdit) selectAction.setEnabled(currentItem != null); super.currentItemChanged(); } }; getContentPane().add(etp, BorderLayout.CENTER); JPanel buttonsPanel = new JPanel(); buttonsPanel.add(new JButton(selectAction)); buttonsPanel.add(new JButton(cancelAction)); /* * if(allowNewMenu || allowEdit){ buttonsPanel.add(new * JButton(newFolderAction)); } */ getContentPane().add(buttonsPanel, BorderLayout.SOUTH); pack(); centerOver(bridge.getComponent()); } void buildActions() { String s = allowEdit ? "select_caption_ok" : "select_caption"; selectAction = new AbstractAction(bridge.getMsg(MSG_ID + s), ResourceManager.getImageIcon(allowEdit ? "icons/commit_changes.gif" : "icons/file_open.gif")) { public void actionPerformed(ActionEvent ev) { if (allowEdit && etp.getCurrentPanel() != null) { etp.getCurrentPanel().save(); if (pled.isModified()) { pled.saveMenus(pled); try { save(null); } catch (Exception ex) { bridge.getOptions().getMessages().showErrorWarning(getParent(), "FILE_ERR_SAVING", fullPath, ex, null); } } } if (etp.currentItem != null && etp.currentItem instanceof MenuEditor) { result = ((MenuEditor) etp.currentItem).getMenu(); } else { result = null; if (!allowEdit) return; } accept = true; setVisible(false); } }; selectAction.putValue(AbstractAction.SHORT_DESCRIPTION, bridge.getMsg(MSG_ID + s + "_tooltip")); if (!allowEdit) selectAction.setEnabled(false); cancelAction = new AbstractAction(bridge.getMsg(MSG_ID + "cancel_caption"), ResourceManager.getImageIcon("icons/cancel.gif")) { public void actionPerformed(ActionEvent ev) { result = null; accept = false; setVisible(false); } }; cancelAction.putValue(AbstractAction.SHORT_DESCRIPTION, bridge.getMsg(MSG_ID + "cancel_tooltip")); } } } src/core/edu/xtec/jclic/project/ProjectLibraryEditor.java000066400000000000000000000052011335566474600240350ustar00rootroot00000000000000/* * File : ProjectLibraryEditor.java * Created : 05-jun-2002 17:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.activities.panels.*; import edu.xtec.jclic.edit.*; import edu.xtec.util.Options; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.tree.TreeNode; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ProjectLibraryEditor extends Editor { public static ImageIcon icon; /** Creates new ProjectLibraryEditor */ public ProjectLibraryEditor(ProjectLibrary pl) { super(pl); } protected void createChildren() { ProjectLibrary pl = getProjectLibrary(); Menu m = pl.getRootMenu(); if (m != null) m.getEditor(this); } public Class getEditorPanelClass() { return ProjectLibraryEditorPanel.class; } public EditorPanel createEditorPanel(Options options) { return new ProjectLibraryEditorPanel(options); } public ProjectLibrary getProjectLibrary() { return (ProjectLibrary) getUserObject(); } public static Icon getIcon() { if (icon == null) icon = edu.xtec.util.ResourceManager.getImageIcon("icons/database.gif"); return icon; } @Override public javax.swing.Icon getIcon(boolean leaf, boolean expanded) { return getIcon(); } @Override public String toString() { return getProjectLibrary().settings.title; } protected void saveMenus(TreeNode e) { if (e instanceof MenuEditor) getProjectLibrary().activityBag.addActivity(((MenuEditor) e).getMenu()); for (int i = 0; i < e.getChildCount(); i++) if (e.getChildAt(i) instanceof MenuEditor) saveMenus(e.getChildAt(i)); } @Override public void setActionsOwner() { // no actions } @Override public void clearActionsOwner() { super.clearActionsOwner(); // no actions to clear } public static void createActions(Options options) { createBasicActions(options); } } src/core/edu/xtec/jclic/project/ProjectLibraryEditorPanel.form000066400000000000000000000100001335566474600250300ustar00rootroot00000000000000
src/core/edu/xtec/jclic/project/ProjectLibraryEditorPanel.java000066400000000000000000000077511335566474600250310ustar00rootroot00000000000000/* * File : ProjectLibraryEditorPanel.java * Created : 10-jun-2002 13:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.edit.*; import edu.xtec.util.Options; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ProjectLibraryEditorPanel extends EditorPanel { /** Creates new form ProjectLibraryEditorPanel */ public ProjectLibraryEditorPanel(Options options) { super(options); ProjectLibraryEditor.createActions(options); initComponents(); postInit(250, true, false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel titleLb; mainPanel = new javax.swing.JPanel(); titleLb = new javax.swing.JLabel(); titleText = new javax.swing.JTextField(); titleText.getDocument().addDocumentListener(this); setLayout(new java.awt.BorderLayout()); mainPanel.setLayout(new java.awt.GridBagLayout()); mainPanel.setOpaque(false); titleLb.setText(options.getMsg("edit_name")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2); mainPanel.add(titleLb, gridBagConstraints); titleText.setToolTipText(options.getMsg("library_dlg_name_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 4); mainPanel.add(titleText, gridBagConstraints); add(mainPanel, java.awt.BorderLayout.CENTER); } // GEN-END:initComponents public boolean checkIfEditorValid(Editor e) { return e instanceof ProjectLibraryEditor; } protected ProjectLibrary getProjectLibrary() { if (editor == null) return null; else return ((ProjectLibraryEditor) editor).getProjectLibrary(); } public void fillData() { ProjectLibrary p = getProjectLibrary(); titleText.setText(p == null ? options.getMsg("UNNAMED") : p.settings.title); } public void saveData() { ProjectLibrary p = getProjectLibrary(); if (p != null) { p.settings.title = checkEmptyString(titleText.getText(), true, options.getMsg("UNNAMED")); titleText.setText(p.settings.title); } } /* * public boolean isModified(){ boolean result=super.isModified(); if(!result && * getProjectLibrary()!=null){ result=!(Utils.compareObjects * (titleText.getText() , getProjectLibrary().settings.title)); } return result; * } */ @Override protected javax.swing.Icon getIcon() { return ProjectLibraryEditor.getIcon(); } @Override protected String getTitle() { return options.getMsg("library_dlg_title"); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel mainPanel; private javax.swing.JTextField titleText; // End of variables declaration//GEN-END:variables } src/core/edu/xtec/jclic/project/ProjectSettings.java000066400000000000000000000701441335566474600230720ustar00rootroot00000000000000/* * File : ProjectSettings.java * Created : 09-may-2002 15:57 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.jclic.bags.MediaBagElement; import edu.xtec.jclic.edit.Editable; import edu.xtec.jclic.edit.Editor; import edu.xtec.jclic.media.EventSounds; import edu.xtec.util.Domable; import edu.xtec.util.Html; import edu.xtec.util.JDomUtility; import edu.xtec.util.Messages; import edu.xtec.util.StrUtils; import java.util.*; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ProjectSettings implements Editable, Domable { public String title; public String iconFileName; public String description; public String descriptors; public String area; public String level; public Locale locale; public String[] languages; public Author[] authors; public Organization[] organizations; public Revision[] revisions; public String skinFileName; public EventSounds eventSounds; // --- New fields added 25/07/2017 public String coverFileName; public String thumbnailFileName; public String icon16, icon72, icon192; public Locale[] meta_langs; public String[] descriptions; public List area_codes; public List level_codes; public String[] lang_codes; public int license; public static String UNTITLED = "untitled"; public static String ELEMENT_NAME = "settings"; public static String TITLE = "title", LOCALE = "locale", LANGUAGE = "language", DESCRIPTION = "description", DESCRIPTORS = "descriptors", SKIN = "skin", FILE = "file", AREA = "area", AREA_CODES = "area-codes", LEVEL = "level", LEVEL_CODES = "level-codes", ICON = "icon", COVER = "cover", THUMB = "thumb", ICON16 = "icon16", ICON72 = "icon72", ICON192 = "icon192", META_LANGS = "meta_langs", DESCRIPTIONS = "descriptions", LICENSE = "license", TYPE = "type", URL = "url"; public static String[] KNOWN_META_LANGS = { "ca", "es", "en" }; @SuppressWarnings("unchecked") public static List[] KNOWN_LEVEL_DESCS = (List[]) new List[] { Arrays.asList(new String[] { "Infantil (3-6)", "Infantil (3-6)", "Kindergarten (3-6)" }), Arrays.asList(new String[] { "Primària (6-12)", "Primaria (6-12)", "Primary school (6-12)" }), Arrays.asList(new String[] { "Secundària (12-16)", "Secundaria (12-16)", "Secondary school (12-16)" }), Arrays.asList(new String[] { "Batxillerat (16-18)", "Bachillerato (16-18)", "High school (16-18)" }) }; public static String[] KNOWN_LEVEL_CODES = { "INF", "PRI", "SEC", "BTX" }; @SuppressWarnings("unchecked") public static List[] KNOWN_AREA_DESCS = (List[]) new List[] { Arrays.asList(new String[] { "Llengües", "Lenguas", "Languages" }), Arrays.asList(new String[] { "Matemàtiques", "Matemáticas", "Mathematics" }), Arrays.asList(new String[] { "Ciències socials", "Ciencias sociales", "Social sciences" }), Arrays.asList(new String[] { "Ciències experimentals", "Ciencias experimentales", "Experimental sciences" }), Arrays.asList(new String[] { "Música", "Música", "Music" }), Arrays.asList(new String[] { "Visual i plàstica", "Plástica y visual", "Art & design" }), Arrays.asList(new String[] { "Educació física", "Educación física", "Physical education" }), Arrays.asList(new String[] { "Tecnologies", "Tecnología", "Design & technology" }), Arrays.asList(new String[] { "Diversos", "Diversos", "Miscellaneous" }) }; public static String[] KNOWN_AREA_CODES = { "lleng", "mat", "soc", "exp", "mus", "vip", "ef", "tec", "div" }; public static String[] CC_LICENSES = { "by", "by-sa", "by-nd", "by-nc", "by-nc-sa", "by-nc-nd", "other" }; public static int CC_BY = 0, CC_BY_SA = 1, CC_BY_ND = 2, CC_BY_NC = 3, CC_BY_NC_SA = 4, CC_BY_NC_ND = 5, OTHER = 6; public static String CC_URL = "https://creativecommons.org/licenses/%%CODE%%/4.0", OTHER_URL = "See 'description'"; public static String[] LICENSE_DESC = { "Aquesta obra està sota una llicència de Creative Commons %%CODE%%", "Esta obra está bajo una licencia de Creative Commons %%CODE%%", "Licensed under a Creative Commons license %%CODE%%" }; public static String[] LICENSE_OTHER = { "Els termes de la llicència d'ús s'especifiquen a la descripció del projecte", "Los términos de la licencia de uso se especifican en la descripción del proyecto", "License terms are specified in project description" }; /** Creates new ProjectSettings */ public ProjectSettings() { title = UNTITLED; description = null; area = null; level = null; descriptors = null; locale = null; languages = null; authors = null; organizations = null; revisions = new Revision[] { new Revision(new Date(), "created") }; eventSounds = new EventSounds(null); skinFileName = null; iconFileName = null; // --- New fields added 25/07/2017 coverFileName = null; icon16 = icon72 = icon192 = null; thumbnailFileName = null; meta_langs = new Locale[1]; meta_langs[0] = Locale.getDefault(); descriptions = new String[1]; descriptions[0] = ""; license = CC_BY_NC_SA; } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); org.jdom.Element child, child2; e.addContent(new org.jdom.Element(TITLE).setText(title)); if (revisions != null) { for (Revision revision : revisions) { e.addContent(revision.getJDomElement()); } } if (authors != null) { for (Author author : authors) { e.addContent(author.getJDomElement()); } } if (organizations != null) { for (Organization organization : organizations) { e.addContent(organization.getJDomElement()); } } if (languages != null) { for (String language : languages) { e.addContent(new org.jdom.Element(LANGUAGE).setText(language)); } } if (locale != null) { /* * StringBuilder sb = new StringBuilder(loc.getLanguage()); if (loc.getCountry() * != null && loc.getCountry().length() > 0) { * sb.append('-').append(loc.getCountry()); if (loc.getVariant() != null && * loc.getVariant().length() > 0) { sb.append('-').append(loc.getVariant()); } } * e.setAttribute(LOCALE, sb.substring(0)); */ e.setAttribute(LOCALE, locale.toLanguageTag()); } if (description != null) { JDomUtility.addParagraphs(e, DESCRIPTION, description); } child = new org.jdom.Element(DESCRIPTORS); if (area != null) { child.setAttribute(AREA, area); } if (area_codes != null && area_codes.size() > 0) { child.setAttribute(AREA_CODES, StrUtils.getEnumeration(area_codes)); } if (level != null) { child.setAttribute(LEVEL, level); } if (level_codes != null && level_codes.size() > 0) { child.setAttribute(LEVEL_CODES, StrUtils.getEnumeration(level_codes)); } if (descriptors != null) { child.setText(descriptors); } e.addContent(child); if ((child = eventSounds.getJDomElement()) != null) { e.addContent(child); } if (skinFileName != null) { child = new org.jdom.Element(SKIN); child.setAttribute(FILE, skinFileName); e.addContent(child); } if (iconFileName != null) { child = new org.jdom.Element(ICON); child.setAttribute(FILE, iconFileName); e.addContent(child); } if (coverFileName != null) { child = new org.jdom.Element(COVER); child.setAttribute(FILE, coverFileName); e.addContent(child); } if (thumbnailFileName != null) { child = new org.jdom.Element(THUMB); child.setAttribute(FILE, thumbnailFileName); e.addContent(child); } if (icon16 != null) { child = new org.jdom.Element(ICON16); child.setAttribute(FILE, icon16); e.addContent(child); } if (icon72 != null) { child = new org.jdom.Element(ICON72); child.setAttribute(FILE, icon72); e.addContent(child); } if (icon192 != null) { child = new org.jdom.Element(ICON192); child.setAttribute(FILE, icon192); e.addContent(child); } child = new org.jdom.Element(META_LANGS); StringBuilder sb = new StringBuilder(); for (int i = 0; i < meta_langs.length; i++) { sb.append(i > 0 ? "," : "").append(meta_langs[i].toLanguageTag()); } child.setText(sb.substring(0)); e.addContent(child); child = new org.jdom.Element(DESCRIPTIONS); for (int i = 0; i < meta_langs.length; i++) { child2 = JDomUtility.addParagraphs(child, DESCRIPTION, descriptions[i] == null ? "" : descriptions[i]); child2.setAttribute(LANGUAGE, meta_langs[i].toLanguageTag()); } e.addContent(child); child = new org.jdom.Element(LICENSE); child.setAttribute(TYPE, CC_LICENSES[license]); child.setAttribute(URL, license < OTHER ? CC_URL.replace("%%CODE%%", CC_LICENSES[license]) : OTHER_URL); e.addContent(child); return e; } public static ProjectSettings getProjectSettings(org.jdom.Element e) throws Exception { ProjectSettings st = new ProjectSettings(); st.setProperties(e, null); return st; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); org.jdom.Element child; Iterator itr; String s; StringBuffer sb; StringTokenizer stk; ArrayList al; if ((child = e.getChild(TITLE)) != null) { title = child.getText(); } ArrayList alr = new ArrayList(); itr = e.getChildren(Revision.ELEMENT_NAME).iterator(); while (itr.hasNext()) { alr.add(Revision.getRevision((org.jdom.Element) itr.next())); } if (!alr.isEmpty()) { revisions = alr.toArray(new Revision[alr.size()]); } ArrayList alau = new ArrayList(); itr = e.getChildren(Author.ELEMENT_NAME).iterator(); while (itr.hasNext()) { alau.add(Author.getAuthor((org.jdom.Element) itr.next())); } if (!alau.isEmpty()) { authors = alau.toArray(new Author[alau.size()]); } ArrayList alo = new ArrayList(); itr = e.getChildren(Organization.ELEMENT_NAME).iterator(); while (itr.hasNext()) { alo.add(Organization.getOrganization((org.jdom.Element) itr.next())); } if (!alo.isEmpty()) { organizations = alo.toArray(new Organization[alo.size()]); } ArrayList all = new ArrayList(); itr = e.getChildren(LANGUAGE).iterator(); while (itr.hasNext()) { all.add(((org.jdom.Element) itr.next()).getText()); } if (!all.isEmpty()) { languages = all.toArray(new String[all.size()]); for (int i = 0; i < languages.length; i++) { String lng = Messages.getLanguageFromDescriptive(languages[i]); Locale loc = Locale.forLanguageTag(lng == null ? languages[i] : lng); if (loc.getLanguage().equals("")) { lng = Messages.getKnownLanguageCode(languages[i]); loc = Locale.forLanguageTag(lng == null ? languages[i] : lng); } languages[i] = loc.toLanguageTag(); } } if (languages != null && languages.length > 0 && languages[0].length() > 1 && !languages[0].equals("und")) { meta_langs[0] = Locale.forLanguageTag(languages[0]); } if ((s = JDomUtility.getStringAttr(e, LOCALE, null, false)) != null) { stk = new StringTokenizer(s, "-"); String l = null, c = null, v = null; if (stk.hasMoreTokens()) { l = stk.nextToken(); } if (stk.hasMoreTokens()) { c = stk.nextToken(); } if (stk.hasMoreTokens()) { v = stk.nextToken(); } if (l != null && c != null) { if (v != null) { locale = new Locale(l, c, v); } else { locale = new Locale(l, c); } } } description = JDomUtility.getParagraphs(e.getChild(DESCRIPTION)); if (description != null) { descriptions[0] = description; } if ((child = e.getChild(DESCRIPTORS)) != null) { // check for old format if (!child.getChildren(JDomUtility.P).isEmpty()) { descriptors = JDomUtility.getParagraphs(e.getChild(DESCRIPTORS)); descriptors = edu.xtec.util.StrUtils.replace(descriptors, "\n", ", "); } else { descriptors = StrUtils.nullableString(child.getTextNormalize()); } area = JDomUtility.getStringAttr(child, AREA, area, false); String ac = JDomUtility.getStringAttr(child, AREA_CODES, null, false); if (ac != null) { area_codes = StrUtils.enumerationToList(ac, ","); } else if (area != null) { sb = new StringBuffer(); al = new ArrayList(); stk = new StringTokenizer(area, ","); while (stk.hasMoreElements()) { s = stk.nextToken().trim(); int i = 0; for (; i < KNOWN_AREA_DESCS.length; i++) { if (KNOWN_AREA_DESCS[i].contains(s)) { al.add(KNOWN_AREA_CODES[i]); break; } } if (i == KNOWN_AREA_DESCS.length) { sb.append(sb.length() > 0 ? ", " : "").append(s); } } area = sb.length() > 0 ? sb.toString() : null; if (al.size() > 0) { area_codes = al; } } level = JDomUtility.getStringAttr(child, LEVEL, level, false); String lc = JDomUtility.getStringAttr(child, LEVEL_CODES, null, false); if (lc != null) { level_codes = StrUtils.enumerationToList(lc, ","); } else if (level != null) { sb = new StringBuffer(); al = new ArrayList(); stk = new StringTokenizer(level, ","); while (stk.hasMoreElements()) { s = stk.nextToken().trim(); int i = 0; for (; i < KNOWN_LEVEL_DESCS.length; i++) { if (KNOWN_LEVEL_DESCS[i].contains(s)) { al.add(KNOWN_LEVEL_CODES[i]); break; } } if (i == KNOWN_LEVEL_DESCS.length) { sb.append(sb.length() > 0 ? ", " : "").append(s); } } level = sb.length() > 0 ? sb.toString() : null; if (al.size() > 0) { level_codes = al; } } } if ((child = e.getChild(EventSounds.ELEMENT_NAME)) != null) { eventSounds = EventSounds.getEventSounds(child); } if ((child = e.getChild(SKIN)) != null) { skinFileName = JDomUtility.getStringAttr(child, FILE, skinFileName, false); } if ((child = e.getChild(ICON)) != null) { iconFileName = JDomUtility.getStringAttr(child, FILE, iconFileName, false); } if ((child = e.getChild(COVER)) != null) { coverFileName = JDomUtility.getStringAttr(child, FILE, coverFileName, false); } if ((child = e.getChild(THUMB)) != null) { thumbnailFileName = JDomUtility.getStringAttr(child, FILE, thumbnailFileName, false); } if ((child = e.getChild(ICON16)) != null) { icon16 = JDomUtility.getStringAttr(child, FILE, icon16, false); } if ((child = e.getChild(ICON72)) != null) { icon72 = JDomUtility.getStringAttr(child, FILE, icon72, false); } if ((child = e.getChild(ICON192)) != null) { icon192 = JDomUtility.getStringAttr(child, FILE, icon192, false); } if ((child = e.getChild(META_LANGS)) != null) { String[] ml = child.getTextNormalize().split(","); meta_langs = new Locale[ml.length]; descriptions = new String[ml.length]; for (int i = 0; i < ml.length; i++) { meta_langs[i] = Locale.forLanguageTag(ml[i]); descriptions[i] = (i == 0 && description != null) ? description : ""; } } if ((child = e.getChild(DESCRIPTIONS)) != null) { @SuppressWarnings("unchecked") List descs = (List) child.getChildren(DESCRIPTION); descriptions = new String[Math.max(meta_langs.length, descs.size())]; for (int i = 0; i < descs.size(); i++) { descriptions[i] = JDomUtility.getParagraphs(descs.get(i)); } } if ((child = e.getChild(LICENSE)) != null) { license = JDomUtility.getStrIndexAttr(child, TYPE, CC_LICENSES, CC_BY_NC_SA); } } public String toHtmlString(edu.xtec.util.Messages msg) { String msgBase = "about_window_lb_"; Html html = new Html(1000); html.doubleCell(msg.get(msgBase + "project"), true, title, true); if (area != null) { html.doubleCell(msg.get(msgBase + "area"), true, area, false); } if (level != null) { html.doubleCell(msg.get(msgBase + "level"), true, level, false); } if (authors != null) { int k = authors.length; html.tr(true).td(msg.get(msgBase + "author" + (k > 1 ? "s" : "")), true).td(true); for (int i = 0; i < k; i++) { if (authors[i] != null) { html.append(authors[i].toHtmlString(msg)).br(); } } html.td(false).tr(false); } if (organizations != null) { int k = organizations.length; html.tr(true).td(msg.get(msgBase + "organization" + (k > 1 ? "s" : "")), true).td(true); for (int i = 0; i < organizations.length; i++) { if (i > 0) { html.nbsp().br(); } if (organizations[i] != null) { html.append(organizations[i].toHtmlString(msg)).br(); } } html.td(false).tr(false); } if (revisions != null) { html.tr(true).td(msg.get(msgBase + "history"), true).td(true); for (int i = 0; i < revisions.length; i++) { if (i > 0) { html.nbsp().br(); } if (revisions[i] != null) { html.append(revisions[i].toHtmlString(msg)).br(); } } html.td(false).tr(false); } if (languages != null) { int k = languages.length; html.tr(true).td(msg.get(msgBase + "language" + (k > 1 ? "s" : "")), true).td(true); for (int i = 0; i < k; i++) { if (languages[i] != null) { html.append(languages[i]).sp(); } } html.td(false).tr(false); } if (description != null) { html.doubleCell(msg.get(msgBase + "description"), true, description, false); } if (descriptors != null) { html.doubleCell(msg.get(msgBase + "descriptors"), true, descriptors, false); } return Html.table(html.toString(), null, 1, 5, -1, null, false); } public void readJSON(JSONObject json, JClicProject parent, boolean preserve) throws Exception { // Read title if (json.has("title") && (!preserve || title.length() == 0)) { title = json.getString("title"); } // Read authors if (json.has("author") && (!preserve || authors == null || authors.length == 0)) { String[] authStr = json.getString("author").split(", "); authors = new Author[authStr.length]; for (int i = 0; i < authStr.length; i++) { authors[i] = Author.fromString(authStr[i]); } } // Read organizations if (json.has("school") && (!preserve || organizations == null || organizations.length == 0)) { String[] orgStr = json.getString("school").split(", "); organizations = new Organization[orgStr.length]; for (int i = 0; i < orgStr.length; i++) { organizations[i] = Organization.fromString(orgStr[i]); } } // Load meta-languages if (json.has("meta_langs") && (!preserve || (meta_langs.length == 1 && meta_langs[0] == Locale.getDefault()))) { JSONArray langTags = json.getJSONArray("meta_langs"); meta_langs = new Locale[langTags.length()]; for (int i = 0; i < meta_langs.length; i++) { meta_langs[i] = new Locale(langTags.getString(i)); } } // Load descriptions if (json.has("description") && (!preserve || (descriptions.length == 1 || descriptions[0].length() == 0))) { JSONObject descs = json.getJSONObject("description"); descriptions = new String[meta_langs.length]; for (int i = 0; i < meta_langs.length; i++) { descriptions[i] = descs.optString(meta_langs[i].toLanguageTag()); } description = descriptions[0]; } // Load cover and thumbnail if (json.has("cover") && (!preserve || coverFileName == null)) { coverFileName = json.getString("cover"); parent.mediaBag.addElement(new MediaBagElement(coverFileName)); } if (json.has("thumbnail") && (!preserve || thumbnailFileName == null)) { thumbnailFileName = json.getString("thumbnail"); parent.mediaBag.addElement(new MediaBagElement(thumbnailFileName)); } // Load icons if not defined if (icon16 == null) { icon16 = "favicon.ico"; parent.mediaBag.addElement(new MediaBagElement(icon16)); } if (icon72 == null) { icon72 = "icon-72.png"; parent.mediaBag.addElement(new MediaBagElement(icon72)); } if (icon192 == null) { icon192 = "icon-192.png"; parent.mediaBag.addElement(new MediaBagElement(icon192)); } } public JSONObject toJSON(edu.xtec.util.Messages msg) throws JSONException { // Initialize `langTags` with current codes in meta_langs int numLangs = meta_langs.length; String[] langTags = new String[numLangs]; for (int i = 0; i < numLangs; i++) { langTags[i] = meta_langs[i].toLanguageTag(); } // Prepare an empty JSON object to be filled in with current project settings JSONObject json = new JSONObject(); // Fill in title json.put("title", title); // Fill in authors if (authors != null && authors.length > 0) { StringBuilder sb = new StringBuilder(); for (Author a : authors) { StrUtils.addToEnum(sb, a.toString()); } json.put("author", sb.toString()); } // Fill in organizations if (organizations != null && organizations.length > 0) { StringBuilder sb = new StringBuilder(); for (Organization o : organizations) { StrUtils.addToEnum(sb, o.toString()); } json.put("school", sb.toString()); } // Fill in last revision date if (revisions != null && revisions.length > 0) { json.put("date", msg.getShortDateStr(revisions[0].date)); } // Fill in project languages (codes and names) if (languages != null && languages.length > 0) { String[] langDescs = new String[numLangs]; for (String lang : languages) { String code = null; // Check for full language and code format, like in "Catalan (ca)" int p = lang.lastIndexOf('('); int q = lang.lastIndexOf(')'); if (p > 0 && q > p) { code = lang.substring(p + 1, q); } else { // Check for descriptive language code, like in "Catalan" code = (String) edu.xtec.util.Messages.getNamesToCodes().get(lang.toLowerCase()); if (code == null) // Fallblack: "lang" should be a language code { code = lang; } } // Append code json.append("langCodes", code); // Add language description for each meta_lang Locale loc = new Locale(code); for (int i = 0; i < numLangs; i++) { langDescs[i] = StrUtils.addToEnum(langDescs[i] == null ? "" : langDescs[i], loc.getDisplayName(meta_langs[i])); } } // Build a special object for language descriptions JSONObject jso = new JSONObject(); for (int i = 0; i < numLangs; i++) { jso.put(langTags[i], langDescs[i]); } json.put("languages", jso); } // Fill in project subjects, both as codes and descriptive tags if (area_codes != null && area_codes.size() > 0) { // Fill in area codes json.put("areaCodes", new JSONArray(area_codes)); // Fill in descriptive names JSONObject jso = new JSONObject(); for (String lang : langTags) { String areaDescs = ""; int p = StrUtils.getIndexOf(lang, KNOWN_META_LANGS); if (p >= 0) { StringBuilder sb = new StringBuilder(); Iterator it = area_codes.iterator(); while (it.hasNext()) { String code = it.next(); int j = StrUtils.getIndexOf(code, KNOWN_AREA_CODES); StrUtils.addToEnum(sb, j >= 0 ? KNOWN_AREA_DESCS[j].get(p) : code); } areaDescs = sb.toString(); } else { areaDescs = StrUtils.getEnumeration(area_codes); } // Add additional subjects if (area != null && area.length() > 0) { areaDescs = StrUtils.addToEnum(areaDescs, area); } jso.put(lang, areaDescs); } json.put("areas", jso); } else if (area != null) { JSONObject jso = new JSONObject(); for (String lang : langTags) { jso.put(lang, area); } json.put("areas", jso); } // Fill in project educational levels, both as codes and descriptive names if (level_codes != null && level_codes.size() > 0) { // Fill in level codes json.put("levelCodes", new JSONArray(level_codes)); JSONObject jso = new JSONObject(); for (String lang : langTags) { String levelDescs = ""; int p = StrUtils.getIndexOf(lang, KNOWN_META_LANGS); if (p >= 0) { StringBuilder sb = new StringBuilder(); Iterator it = level_codes.iterator(); while (it.hasNext()) { String level = it.next(); int j = StrUtils.getIndexOf(level, KNOWN_LEVEL_CODES); StrUtils.addToEnum(sb, j >= 0 ? KNOWN_LEVEL_DESCS[j].get(p) : level); } levelDescs = sb.toString(); } else { levelDescs = StrUtils.getEnumeration(level_codes); } // Add additional levels if (level != null && level.length() > 0) { levelDescs = StrUtils.addToEnum(levelDescs, level); } jso.put(lang, levelDescs); } json.put("levels", jso); } else if (level != null) { JSONObject jso = new JSONObject(); for (String lang : langTags) { jso.put(lang, level); } json.put("levels", jso); } // Fill in descriptions JSONObject jso = new JSONObject(); for (int i = 0; i < numLangs && i < descriptions.length; i++) { if (descriptions[i] != null) { jso.put(langTags[i], descriptions[i]); } } json.put("description", jso); // Fill in license jso = new JSONObject(); String url = license < OTHER ? CC_URL.replace("%%CODE%%", CC_LICENSES[license]) : OTHER_URL; for (int i = 0; i < numLangs; i++) { int p = StrUtils.getIndexOf(langTags[i], KNOWN_META_LANGS); if (p < 0) p = 2; String str = license < OTHER ? LICENSE_DESC[p].replace("%%URL%%", url).replace("%%CODE%%", CC_LICENSES[license].toUpperCase()) : LICENSE_OTHER[p]; jso.put(langTags[i], str); } json.put("license", jso); // Fill in meta langs json.put("meta_langs", new JSONArray(langTags)); // Fill in cover and thumbnail images if (coverFileName != null) { json.put("cover", coverFileName); } if (thumbnailFileName != null) { json.put("thumbnail", thumbnailFileName); } return json; } public static String[] getLicensesList(String otherTxt) { ArrayList v = new ArrayList(); for (int i = 0; i < OTHER; i++) { v.add("Creative Commons " + CC_LICENSES[i].toUpperCase()); } v.add(otherTxt); return (String[]) v.toArray(new String[v.size()]); } @Override public Editor getEditor(Editor parent) { return Editor.createEditor(getClass().getName() + "Editor", this, parent); } } src/core/edu/xtec/jclic/project/Revision.java000066400000000000000000000072131335566474600215360ustar00rootroot00000000000000/* * File : Revision.java * Created : 13-jul-2001 11:33 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.project; import edu.xtec.util.Domable; import edu.xtec.util.Html; import edu.xtec.util.JDomUtility; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class Revision extends Object implements Domable { public Date date; public Author[] authors; public String description; public String comments; /** Creates new Revision */ public Revision() { date = new Date(); description = new String(); comments = null; } public Revision(Date setDate, String setDescription) { date = setDate; description = setDescription; authors = null; comments = null; } public static final String ELEMENT_NAME = "revision"; public static final String DATE = "date", /* BY="by", */ DESCRIPTION = "description", COMMENTS = "comments"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(DESCRIPTION, description); e.setAttribute(DATE, JDomUtility.dateToStringShortUS(date)); if (comments != null) JDomUtility.addParagraphs(e, COMMENTS, comments); if (authors != null) for (Author author : authors) e.addContent(author.getJDomElement()); return e; } public static Revision getRevision(org.jdom.Element e) throws Exception { Revision r = new Revision(); r.setProperties(e, null); return r; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); description = JDomUtility.getStringAttr(e, DESCRIPTION, description, true); date = JDomUtility.getDateAttrShortUS(e, DATE, date); comments = JDomUtility.getParagraphs(e.getChild(COMMENTS)); ArrayList al = new ArrayList(); Iterator itr = e.getChildren(Author.ELEMENT_NAME).iterator(); while (itr.hasNext()) al.add(Author.getAuthor((org.jdom.Element) itr.next())); if (!al.isEmpty()) authors = al.toArray(new Author[al.size()]); } public String toHtmlString(edu.xtec.util.Messages msg) { Html html = new Html(300); html.bold(msg.getShortDateStr(date)); if (description != null) html.append(": ").appendParagraphs(description).append(""); if (authors != null) for (Author author : authors) html.br().append(author.toHtmlString(msg)); if (comments != null && comments.length() > 0) html.br().appendParagraphs(comments); return html.toString(); } @Override public String toString() { DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); StringBuilder sb = new StringBuilder(); sb.append(df.format(date)).append(" - "); if (description != null && description.length() > 0) sb.append(description); return sb.substring(0); } } src/core/edu/xtec/jclic/report/000077500000000000000000000000001335566474600167375ustar00rootroot00000000000000src/core/edu/xtec/jclic/report/ActionReg.java000066400000000000000000000052761335566474600214670ustar00rootroot00000000000000/* * File : ActionReg.java * Created : 11-jul-2001 9:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class ActionReg extends Object implements java.io.Serializable, Domable { String type; String source; String dest; long time; boolean isOk; /** Creates new ActionReg */ public ActionReg(String setType, String setSource, String setDest, boolean ok) { type = setType; source = setSource; dest = setDest; isOk = ok; time = System.currentTimeMillis(); } public ActionReg(org.jdom.Element e) throws Exception { setProperties(e, null); } public static final String ELEMENT_NAME = "action"; public static final String TYPE = "type", SOURCE = "source", DEST = "dest", TIME = "time", OK = "ok"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); JDomUtility.setStringAttr(e, TYPE, type, false); JDomUtility.setStringAttr(e, SOURCE, source, false); JDomUtility.setStringAttr(e, DEST, dest, false); e.setAttribute(OK, JDomUtility.boolString(isOk)); e.setAttribute(TIME, Long.toString(time)); return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); type = JDomUtility.getStringAttr(e, TYPE, type, false); source = JDomUtility.getStringAttr(e, SOURCE, source, false); dest = JDomUtility.getStringAttr(e, DEST, dest, false); isOk = JDomUtility.getBoolAttr(e, OK, isOk); time = JDomUtility.getLongAttr(e, TIME, time); } @Override public String toString() { StringBuilder result = new StringBuilder(); result.append(type).append("(OK:").append(isOk).append(")"); if (source != null) result.append(" SOURCE:").append(source); if (dest != null) result.append(" DEST:").append(dest); return result.substring(0); } } src/core/edu/xtec/jclic/report/ActivityReg.java000066400000000000000000000142221335566474600220350ustar00rootroot00000000000000/* * File : ActivityReg.java * Created : 11-jul-2001 9:03 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.jclic.*; import edu.xtec.util.Domable; import edu.xtec.util.Html; import edu.xtec.util.JDomUtility; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class ActivityReg extends Object implements java.io.Serializable, Domable { String name; String code; long startTime; long totalTime; List actions; boolean solved; ActionReg lastAction; int score; int minActions; boolean closed; boolean reportActions; int numActions; /** Creates new ActivityReg */ public ActivityReg(Activity act) { name = act.name; code = act.code; actions = new ArrayList(); startTime = System.currentTimeMillis(); totalTime = 0; solved = false; score = 0; lastAction = null; closed = false; minActions = act.getMinNumActions(); reportActions = act.reportActions; numActions = 0; } public ActivityReg(org.jdom.Element e) throws Exception { actions = new ArrayList(); setProperties(e, null); } public static final String ELEMENT_NAME = "activity"; public static final String NAME = "name", CODE = "code", START = "start", TIME = "time", SOLVED = "solved", SCORE = "score", MIN_ACTIONS = "minActions", CLOSED = "closed", REPORT_ACTIONS = "reportActions", ACTIONS = "actions"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); JDomUtility.setStringAttr(e, NAME, name, false); JDomUtility.setStringAttr(e, CODE, code, false); JDomUtility.setStringAttr(e, START, Long.toString(startTime), false); JDomUtility.setStringAttr(e, TIME, Long.toString(totalTime), false); e.setAttribute(SOLVED, JDomUtility.boolString(solved)); JDomUtility.setStringAttr(e, SCORE, Integer.toString(score), false); JDomUtility.setStringAttr(e, MIN_ACTIONS, Integer.toString(minActions), false); if (!closed) e.setAttribute(CLOSED, JDomUtility.BOOL_STR[JDomUtility.FALSE]); if (reportActions) e.setAttribute(REPORT_ACTIONS, JDomUtility.BOOL_STR[JDomUtility.TRUE]); JDomUtility.setStringAttr(e, ACTIONS, Integer.toString(numActions), false); Iterator it = actions.iterator(); while (it.hasNext()) e.addContent(it.next().getJDomElement()); return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); name = JDomUtility.getStringAttr(e, NAME, name, false); code = JDomUtility.getStringAttr(e, CODE, code, false); startTime = JDomUtility.getLongAttr(e, START, startTime); totalTime = JDomUtility.getLongAttr(e, TIME, totalTime); solved = JDomUtility.getBoolAttr(e, SOLVED, solved); score = JDomUtility.getIntAttr(e, SCORE, score); minActions = JDomUtility.getIntAttr(e, MIN_ACTIONS, minActions); closed = JDomUtility.getBoolAttr(e, CLOSED, true); reportActions = JDomUtility.getBoolAttr(e, REPORT_ACTIONS, false); numActions = JDomUtility.getIntAttr(e, ACTIONS, numActions); Iterator it = e.getChildren(ActionReg.ELEMENT_NAME).iterator(); while (it.hasNext()) { lastAction = new ActionReg((org.jdom.Element) it.next()); actions.add(lastAction); } } private static final String okTd = "BGCOLOR=\"#90FF90\""; private static final String badTd = "BGCOLOR=\"#FF9090\""; public String toHtmlString(edu.xtec.util.Messages msg, String firstTd) { Html html = new Html(300); html.tr(true); if (firstTd != null) html.append(firstTd); html.td(name, false); if (closed) { html.td(msg.get(solved ? "YES" : "NO"), Html.CENTER, true, solved ? okTd : badTd); html.td(msg.getNumber(numActions), Html.RIGHT, false, null); html.td(msg.getPercent(getPrecision()), Html.RIGHT, false, null); html.td(msg.getHmsTime(totalTime), Html.RIGHT, false, null); } else html.append("

"); html.append(""); html.td(msg.get(prefix + "lb_sequence"), Html.CENTER, true, null); html.td(msg.get(prefix + "lb_activity"), Html.CENTER, true, null); html.td(msg.get(prefix + "lb_solved"), Html.CENTER, true, null); html.td(msg.get(prefix + "lb_actions"), Html.CENTER, true, null); html.td(msg.get(prefix + "lb_score"), Html.CENTER, true, null); html.td(msg.get(prefix + "lb_time"), Html.CENTER, true, null); html.tr(false); Iterator it = sequences.iterator(); while (it.hasNext()) html.append(it.next().toHtmlString(msg)); html.append(""); html.td(msg.get(prefix + "lb_totals"), Html.LEFT, true, null); html.td(msg.getNumber(info.nActivities), Html.RIGHT, true, null); html.td(msg.getNumber(info.nActSolved) + " (" + msg.getPercent(info.percentSolved) + ")", Html.RIGHT, true, null); html.td(msg.getNumber(info.nActions), Html.RIGHT, true, null); html.td(msg.getPercent(info.tScore), Html.RIGHT, true, null); html.td(msg.getHmsTime(info.tTime), Html.RIGHT, true, null); html.tr(false); } return html.toString(); } public Info getInfo(boolean recalc) { if (recalc) info.recalc(); return info; } public class Info { public int numSequences, nActivities, nActSolved, nActScore, percentSolved, nActions; public long tScore, tTime; protected Info() { clear(); } protected void clear() { numSequences = nActivities = nActSolved = nActScore = percentSolved = nActions = 0; tScore = tTime = 0L; } public void recalc() { clear(); Iterator it = sequences.iterator(); while (it.hasNext()) { SequenceReg.Info sri = it.next().getInfo(true); if (sri.nActivities > 0) { numSequences++; if (sri.nActClosed > 0) { nActivities += sri.nActClosed; nActions += sri.nActions; if (sri.nActScore > 0) { nActScore += sri.nActScore; tScore += (sri.tScore * sri.nActScore); } tTime += sri.tTime; nActSolved += sri.nActSolved; } } } if (nActScore > 0) tScore /= nActScore; if (nActivities > 0) percentSolved = (nActSolved * 100) / nActivities; } } @Override protected void finalize() throws Throwable { end(); super.finalize(); } public void end() { endSequence(); } public void endSequence() { if (currentSequence != null && currentSequence.totalTime == 0) currentSequence.endSequence(); currentSequence = null; } public void newSequence(ActivitySequenceElement ase) { endSequence(); currentSequence = new SequenceReg(ase); sequences.add(currentSequence); } public void newActivity(Activity act) { if (currentSequence != null) currentSequence.newActivity(act); } public void endActivity(int score, int numActions, boolean solved) { if (currentSequence != null) currentSequence.endActivity(score, numActions, solved); } public void newAction(String type, String source, String dest, boolean ok) { if (currentSequence != null) currentSequence.newAction(type, source, dest, ok); } public String getCurrentSequenceTag() { if (currentSequence == null) return null; return currentSequence.name; } public SequenceReg.Info getCurrentSequenceInfo() { return currentSequence == null ? null : currentSequence.getInfo(true); } } src/core/edu/xtec/jclic/report/TCPReportBean.java000066400000000000000000000065371335566474600222250ustar00rootroot00000000000000/* * File : TCPReportBean.java * Created : 17-feb-2003 13:06 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.util.Domable; import edu.xtec.util.DomableBean; import java.lang.reflect.Constructor; import java.util.ArrayList; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class TCPReportBean extends DomableBean { public static final String GET_PROPERTY = "get property", GET_PROPERTIES = "get_properties", ADD_SESSION = "add session", ADD_ACTIVITY = "add activity", GET_GROUPS = "get groups", GET_USERS = "get users", GET_USER_DATA = "get user data", GET_GROUP_DATA = "get group data", NEW_GROUP = "new group", NEW_USER = "new user", MULTIPLE = "multiple", UNKNOWN_KEY = "unknown"; public static final String ERROR = "error"; public static final Class[] DOMABLES = { TCPReportBean.class, GroupData.class, UserData.class, ActivityReg.class }; public static final String[] DOMABLE_NAMES = { TCPReportBean.ELEMENT_NAME, GroupData.ELEMENT_NAME, UserData.ELEMENT_NAME, ActivityReg.ELEMENT_NAME }; public static final String SESSION = "session", USER = "user", KEY = "key", CONTEXT = "context", TIME = "time", PROJECT = "project", CODE = "code", NUM = "num", DEFAULT = "default", RESULT = "result", GROUP = "group", ACTIVITY = "activity"; /** Creates a new instance of TCPReportBean */ public TCPReportBean() { super(ERROR); } public TCPReportBean(String id) { super(id); } public TCPReportBean(String id, Domable[] data) { super(id); setData(data); } public TCPReportBean(org.jdom.Element e) throws Exception { super(ERROR); setProperties(e, null); } public Domable[] getData() throws Exception { org.jdom.Element[] elements = getElements(); ArrayList v = new ArrayList(elements.length); for (org.jdom.Element element : elements) { String name = element.getName(); for (int j = 0; j < DOMABLES.length; j++) { if (name.equals(DOMABLE_NAMES[j])) { Class cl = DOMABLES[j]; Constructor cons = cl.getConstructor(new Class[] { org.jdom.Element.class }); v.add((Domable) cons.newInstance(new Object[] { element })); break; } } } return v.toArray(new Domable[v.size()]); } public void setData(Domable[] data) { if (data != null) for (Domable d : data) setData(d); } public void setData(Domable data) { if (data != null) addElement(data.getJDomElement()); } public Domable getSingleData() throws Exception { Domable[] dm = getData(); return (dm == null || dm.length < 1) ? null : dm[0]; } } src/core/edu/xtec/jclic/report/TCPReporter.java000066400000000000000000000260141335566474600217560ustar00rootroot00000000000000/* * File : TCPReporter.java * Created : 17-jul-2001 9:39 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.jclic.Activity; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.Messages; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.swing.Timer; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class TCPReporter extends Reporter { protected String currentSessionId; protected ActivityReg lastActivity; protected int actCount; protected URL serviceUrl; protected HashMap dbProperties; protected List tasks; protected Component parent; protected Messages msg; protected Timer timer; protected int timerLap; public static final String SERVER_PATH = "path", DEFAULT_SERVER_PATH = "localhost:9000", SERVER_PROTOCOL = "protocol", DEFAULT_SERVER_PROTOCOL = "http", SERVER_SERVICE = "service", DEFAULT_SERVER_SERVICE = "/JClicReportService", TIMER_LAP = "lap"; public static final int DEFAULT_TIMER_LAP = 20; /** Creates new TCPReporter */ public TCPReporter() { super(); currentSessionId = null; lastActivity = null; actCount = 0; serviceUrl = null; tasks = new ArrayList(); timerLap = DEFAULT_TIMER_LAP; } protected synchronized void flushTasks() { if (!tasks.isEmpty() && serviceUrl != null) { TCPReportBean bean = new TCPReportBean(TCPReportBean.MULTIPLE); TCPReportBean[] items; items = tasks.toArray(new TCPReportBean[tasks.size()]); for (TCPReportBean item : items) bean.addElement(item.getJDomElement()); if (transaction(bean) != null) { for (TCPReportBean item : items) tasks.remove(item); } } } @Override public void end() { super.end(); reportActivity(); flushTasks(); stopReporting(); } protected void checkUrl() throws Exception { if (serviceUrl == null) throw new Exception("Service not available!!"); } protected TCPReportBean transaction(String key, Domable[] data) { return transaction(new TCPReportBean(key, data)); } protected TCPReportBean transaction(TCPReportBean request) { if (serviceUrl == null) return null; TCPReportBean result = null; boolean loop = true; while (result == null && loop) { try { HttpURLConnection con = (HttpURLConnection) serviceUrl.openConnection(); con.setDoOutput(true); con.setRequestProperty("Content-type", "text/xml"); OutputStream out = con.getOutputStream(); JDomUtility.saveDocument(out, request.getJDomElement()); out.flush(); out.close(); InputStream in = con.getInputStream(); org.jdom.Document doc = JDomUtility.getSAXBuilder().build(con.getInputStream()); result = new TCPReportBean(doc.getRootElement()); } catch (Exception ex) { if (msg != null) { int r = msg.showErrorWarning(parent, "report_err_connect", ex, "ric"); switch (r) { case Messages.RETRY: break; case Messages.IGNORE: loop = false; break; default: stopReporting(); loop = false; break; } } else { stopReporting(); loop = false; } } } return result; } protected void stopReporting() { if (serviceUrl != null) { serviceUrl = null; if (description != null && msg != null) description = description + " (" + msg.get("report_not_connected") + ")"; } if (timer != null && timer.isRunning()) { timer.stop(); } initiated = false; } @Override public void init(HashMap properties, Component parent, Messages msg) throws Exception { this.parent = parent; this.msg = msg; boolean success = false; try { super.init(properties, parent, msg); String serverPath = (String) properties.get(SERVER_PATH); if (serverPath == null) serverPath = DEFAULT_SERVER_PATH; description = "TCP/IP " + serverPath; String serverService = (String) properties.get(SERVER_SERVICE); if (serverService == null) serverService = DEFAULT_SERVER_SERVICE; if (serverPath.length() < 1 || serverService.length() < 1) throw new Exception("Bad server specification!"); if (!serverService.startsWith("/")) serverService += "/"; String serverProtocol = (String) properties.get(SERVER_PROTOCOL); if (serverProtocol == null) serverProtocol = DEFAULT_SERVER_PROTOCOL; serviceUrl = new URL(serverProtocol + "://" + serverPath + serverService); if (userId == null) userId = promptUserId(parent, msg); if (userId != null) success = true; } catch (Exception ex) { msg.showErrorWarning(parent, "report_err_init", description, ex, null); } if (success) { String tl = getProperty(TIME_LAP, Integer.toString(timerLap)); timerLap = Math.min(300, Math.max(1, Integer.parseInt(tl))); timer = new Timer(timerLap * 1000, new ActionListener() { public void actionPerformed(ActionEvent ev) { flushTasks(); } }); timer.setRepeats(true); timer.start(); } else { stopReporting(); } } @Override public void newSession(JClicProject jcp, Component parent, Messages msg) { super.newSession(jcp, parent, msg); if (serviceUrl == null) return; if (userId == null) { try { userId = promptUserId(parent, msg); } catch (Exception ex) { msg.showErrorWarning(parent, "error_getting_user", ex); } } if (userId != null) { currentSessionId = null; } } public void createDBSession() { if (initiated && userId != null) { flushTasks(); currentSessionId = null; actCount = 0; TCPReportBean bean = new TCPReportBean(TCPReportBean.ADD_SESSION); bean.setParam(TCPReportBean.PROJECT, currentSession.projectName); bean.setParam(TCPReportBean.TIME, Long.toString(currentSession.timeMillis)); bean.setParam(TCPReportBean.CODE, currentSession.code); bean.setParam(TCPReportBean.USER, userId); bean.setParam(TCPReportBean.KEY, sessionKey); bean.setParam(TCPReportBean.CONTEXT, sessionContext); bean = transaction(bean); if (bean != null) currentSessionId = bean.getParam(TCPReportBean.SESSION); if (currentSessionId == null) stopReporting(); } } protected void reportActivity() { if (lastActivity != null) { if (!lastActivity.closed) lastActivity.closeActivity(); if (currentSessionId == null) createDBSession(); if (currentSessionId != null) { TCPReportBean bean = new TCPReportBean(TCPReportBean.ADD_ACTIVITY); bean.setParam(TCPReportBean.SESSION, currentSessionId); bean.setParam(TCPReportBean.NUM, Integer.toString(actCount++)); bean.setData(lastActivity); tasks.add(bean); } } if (currentSession != null && currentSession.currentSequence != null && currentSession.currentSequence.currentActivity != lastActivity) { lastActivity = currentSession.currentSequence.currentActivity; } else lastActivity = null; } @Override public String getProperty(String key, String defaultValue) throws Exception { if (dbProperties == null) { dbProperties = new HashMap(); TCPReportBean bean = transaction(new TCPReportBean(TCPReportBean.GET_PROPERTIES)); if (bean == null) return defaultValue; dbProperties.putAll(bean.getParams()); } String result = (String) dbProperties.get(key); if (result == null) result = defaultValue; return result; } @Override public List getGroups() throws Exception { TCPReportBean bean = transaction(TCPReportBean.GET_GROUPS, null); if (bean == null) return new ArrayList(); Domable[] data = bean.getData(); ArrayList result = new ArrayList(data.length); for (Domable d : data) if (d instanceof GroupData) result.add((GroupData) d); return result; } @Override public List getUsers(String groupId) throws Exception { TCPReportBean bean = new TCPReportBean(TCPReportBean.GET_USERS); bean.setParam(TCPReportBean.GROUP, groupId); bean = transaction(bean); if (bean == null) return new ArrayList(); Domable[] data = bean.getData(); ArrayList result = new ArrayList(data.length); for (Domable d : data) if (d instanceof UserData) result.add((UserData) d); return result; } @Override public UserData getUserData(String userId) throws Exception { UserData result = null; TCPReportBean bean = new TCPReportBean(TCPReportBean.GET_USER_DATA); bean.setParam(TCPReportBean.USER, userId); if ((bean = transaction(bean)) != null) result = (UserData) bean.getSingleData(); return result; } @Override public GroupData getGroupData(String groupId) throws Exception { GroupData result = null; TCPReportBean bean = new TCPReportBean(TCPReportBean.GET_GROUP_DATA); bean.setParam(TCPReportBean.GROUP, groupId); if ((bean = transaction(bean)) != null) result = (GroupData) bean.getSingleData(); return result; } @Override public String newGroup(GroupData gd) throws Exception { String result = null; TCPReportBean bean = new TCPReportBean(TCPReportBean.NEW_GROUP); bean.setData(gd); if ((bean = transaction(bean)) != null) result = (String) bean.getParam(TCPReportBean.GROUP); return result; } @Override public String newUser(UserData ud) throws Exception { String result = null; TCPReportBean bean = new TCPReportBean(TCPReportBean.NEW_USER); bean.setData(ud); if ((bean = transaction(bean)) != null) result = (String) bean.getParam(TCPReportBean.USER); return result; } @Override public void newActivity(Activity act) { super.newActivity(act); reportActivity(); } } src/core/edu/xtec/jclic/report/UserData.java000066400000000000000000000045101335566474600213120ustar00rootroot00000000000000/* * File : UserData.java * Created : 17-feb-2003 10:17 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.util.CompoundObject; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; /** @author Francesc Busquets (fbusquets@xtec.cat) */ public class UserData extends CompoundObject implements Domable { public String groupId; public String pwd; /** Creates a new instance of UserData */ public UserData(String id, String name, String iconUrl, String pwd, String groupId) { super(id, name, iconUrl); this.groupId = groupId; this.pwd = pwd; } public UserData(org.jdom.Element e) throws Exception { setProperties(e, null); } public static final String ELEMENT_NAME = "user"; public static final String ID = "id", NAME = "name", ICON = "icon", PWD = "pwd", GROUP = "group"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); JDomUtility.setStringAttr(e, ID, id, false); JDomUtility.setStringAttr(e, NAME, text, false); JDomUtility.setStringAttr(e, ICON, iconUrl, false); JDomUtility.setStringAttr(e, PWD, pwd, false); JDomUtility.setStringAttr(e, GROUP, groupId, false); return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); id = JDomUtility.getStringAttr(e, ID, null, false); text = JDomUtility.getStringAttr(e, NAME, null, false); iconUrl = JDomUtility.getStringAttr(e, ICON, null, false); pwd = JDomUtility.getStringAttr(e, PWD, null, false); groupId = JDomUtility.getStringAttr(e, GROUP, null, false); } } src/core/edu/xtec/jclic/shapers/000077500000000000000000000000001335566474600170715ustar00rootroot00000000000000src/core/edu/xtec/jclic/shapers/ClassicJigSaw.java000066400000000000000000000052761335566474600224340ustar00rootroot00000000000000/* * File : ClassicJigSaw.java * Created : 13-may-2001 20:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class ClassicJigSaw extends JigSaw { /** Creates new ClassicJigSaw */ public ClassicJigSaw(int nx, int ny) { super(nx, ny); } @Override protected double getDefaultBaseWidthFactor() { return 3f / 4; } @Override protected double getDefaultToothHeightFactor() { return 3f / 5; } @Override protected int getBaseFactor() { return 85; } @Override protected void hLine(ShapeData sd, int type, double x, double y, double w, double h, boolean inv) { int kx = inv ? -1 : 1; int ky = (type == 1 ? 1 : -1); if (type == 0) { sd.lineTo(x + w * kx, y); } else { double x0 = x + ((w - w * baseWidthFactor) / 2) * kx; double wb = ((w * baseWidthFactor) / 12) * kx; sd.lineTo(x0, y); double hb = ((h * toothHeightFactor) * ky) / 8; sd.cubicTo(x0 + 4 * wb, y, x0 + 6 * wb, y - hb, x0 + 4 * wb, y - 3 * hb); sd.cubicTo(x0 + 2 * wb, y - 5 * hb, x0 + 10 * wb, y - 5 * hb, x0 + 8 * wb, y - 3 * hb); sd.cubicTo(x0 + 6 * wb, y - 1 * hb, x0 + 8 * wb, y, x0 + 12 * wb, y); sd.lineTo(x + w * kx, y); } } @Override protected void vLine(ShapeData sd, int type, double x, double y, double w, double h, boolean inv) { int ky = inv ? -1 : 1; int kx = (type == 1 ? 1 : -1); if (type == 0) { sd.lineTo(x, y + h * ky); } else { double y0 = y + ((h - h * baseWidthFactor) / 2) * ky; double hb = ((h * baseWidthFactor) / 12) * ky; sd.lineTo(x, y0); double wb = ((w * toothHeightFactor) * kx) / 8; sd.cubicTo(x, y0 + 4 * hb, x - wb, y0 + 6 * hb, x - 3 * wb, y0 + 4 * hb); sd.cubicTo(x - 5 * wb, y0 + 2 * hb, x - 5 * wb, y0 + 10 * hb, x - 3 * wb, y0 + 8 * hb); sd.cubicTo(x - 1 * wb, y0 + 6 * hb, x, y0 + 8 * hb, x, y0 + 12 * hb); sd.lineTo(x, y + h * ky); } } } src/core/edu/xtec/jclic/shapers/Holes.java000066400000000000000000000114621335566474600210120ustar00rootroot00000000000000/* * File : Holes.java * Created : 01-oct-2001 9:58 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import edu.xtec.util.JDomUtility; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class Holes extends Shaper { protected double scaleW; protected double scaleH; protected ShapeData enclosingShapeData; protected boolean showEnclosure; public Holes(int nx, int ny) { super(1, 1); scaleW = 1.0; scaleH = 1.0; enclosingShapeData = null; showEnclosure = true; shapeData = new ShapeData[0]; nCols = nx; nRows = ny; } @Override public void reset(int nCols, int nRows) { this.nCols = nCols; this.nRows = nRows; initiated = false; } @Override public String getEditorPanelClassName() { return getClass().getPackage().getName() + ".HolesEditorPanel"; } public static final String SHAPE = "shape"; public static final String SHOW_ENCLOSURE = "showEnclosure"; protected static final String SCALE_W = "scaleX", SCALE_H = "scaleY", ENCLOSING = "enclosing"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); if (!showEnclosure) e.setAttribute(SHOW_ENCLOSURE, JDomUtility.boolString(showEnclosure)); if (scaleW != 1.0) e.setAttribute(SCALE_W, Double.toString(scaleW)); if (scaleH != 1.0) e.setAttribute(SCALE_H, Double.toString(scaleH)); if (enclosingShapeData != null) e.addContent(new org.jdom.Element(ENCLOSING).addContent(enclosingShapeData.getJDomElement(scaleW, scaleH))); if (shapeData != null) for (int i = 0; i < nCells; i++) e.addContent(shapeData[i].getJDomElement(scaleW, scaleH)); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { scaleW = JDomUtility.getDoubleAttr(e, SCALE_W, scaleW); scaleH = JDomUtility.getDoubleAttr(e, SCALE_H, scaleH); showEnclosure = JDomUtility.getBoolAttr(e, SHOW_ENCLOSURE, showEnclosure); org.jdom.Element child = e.getChild(ENCLOSING); if (child != null) { child = child.getChild(ShapeData.ELEMENT_NAME); enclosingShapeData = ShapeData.getShapeData(child, scaleW, scaleH); showEnclosure = true; } java.util.List childs = e.getChildren(ShapeData.ELEMENT_NAME); if (!childs.isEmpty()) { nCells = childs.size(); shapeData = new ShapeData[nCells]; for (int i = 0; i < nCells; i++) shapeData[i] = ShapeData.getShapeData((org.jdom.Element) childs.get(i), scaleW, scaleH); } else { nCells = 0; nCols = nRows = 0; shapeData = null; } } protected void buildShapes() { if (nCells > 0) initiated = true; } @Override public boolean hasRemainder() { return showEnclosure; } @Override protected ShapeData getEnclosingShapeData() { if (!showEnclosure) return null; return enclosingShapeData != null ? enclosingShapeData : super.getEnclosingShapeData(); } @Override public Object clone() throws CloneNotSupportedException { Holes clon = (Holes) super.clone(); if (enclosingShapeData != null) enclosingShapeData = (ShapeData) enclosingShapeData.clone(); return clon; } public void removeShape(int iIndex) { if (shapeData == null || iIndex < 0 || iIndex >= shapeData.length) return; ShapeData[] newShapeData = new ShapeData[shapeData.length - 1]; System.arraycopy(shapeData, 0, newShapeData, 0, iIndex); System.arraycopy(shapeData, iIndex + 1, newShapeData, iIndex, shapeData.length - iIndex - 1); nCells = newShapeData.length; shapeData = newShapeData; } public void addShape(ShapeData sd) { ShapeData[] newShapeData = new ShapeData[shapeData.length + 1]; System.arraycopy(shapeData, 0, newShapeData, 0, shapeData.length); newShapeData[shapeData.length] = sd; nCells = newShapeData.length; shapeData = newShapeData; } public void modifyShape(int iIndex, ShapeData sd) { if (iIndex >= 0 && iIndex < shapeData.length) { sd.comment = (shapeData[iIndex] != null) ? shapeData[iIndex].comment : ""; shapeData[iIndex] = sd; } } } src/core/edu/xtec/jclic/shapers/HolesMaker.java000066400000000000000000000075521335566474600217770ustar00rootroot00000000000000/* * File : HolesMaker.java * Created : 22-oct-2001 12:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import java.awt.Shape; import java.awt.geom.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class HolesMaker { Holes h; int nx, ny; boolean[][] flagDone; int nIds; int[][] ids; int[] newIds; Rectangle2D.Double r; boolean skipOnes; boolean singleCells; public HolesMaker(int setNx, int setNy, int[] setIds, boolean useIds, boolean skipOnes, boolean singleCells) { this.skipOnes = skipOnes; this.singleCells = singleCells; nx = setNx; ny = setNy; h = new Holes(nx, ny); flagDone = new boolean[nx][ny]; ids = new int[nx][ny]; for (int y = 0; y < ny; y++) for (int x = 0; x < nx; x++) { flagDone[x][y] = false; ids[x][y] = setIds[y * nx + x]; } nIds = 0; newIds = new int[nx * ny]; h.scaleW = nx; h.scaleH = ny; r = new Rectangle2D.Double(0, 0, 1, 1); ShapeData[] shapeDataX = new ShapeData[nx * ny]; int j = 0; for (int y = 0; y < ny; y++) for (int x = 0; x < nx; x++) { if (!flagDone[x][y] && ids[x][y] >= 0) { Area a = scan(null, x, y); Shape sh = a; if (a.isRectangular()) sh = a.getBounds2D(); shapeDataX[j] = ShapeData.getShapeData(sh, null); shapeDataX[j].scaleTo(nx, ny); j++; } } if (!useIds) { int maxId = 0; for (int i = 0; i < j; i++) if (newIds[i] > maxId) maxId = newIds[i]; int nCells = maxId + 1; h.nCells = nCells; h.shapeData = new ShapeData[nCells]; for (int i = 0; i < nCells; i++) { int k; for (k = 0; k < j; k++) if (newIds[k] == i) break; if (k == j) { // should not happen! h.shapeData[i] = shapeDataX[0]; System.err.println("HolesMaker error buliding shape for cell: " + i); } else h.shapeData[i] = shapeDataX[k]; } } else { h.nCells = j; h.shapeData = new ShapeData[j]; System.arraycopy(shapeDataX, 0, h.shapeData, 0, j); } h.nCols = nx; h.nRows = ny; h.enclosingShapeData = ShapeData.getShapeData(new Rectangle2D.Double(0, 0, 1, 1), null); } public Holes getShaper() { return h; } public int[] getIds() { int[] result = new int[nIds]; System.arraycopy(newIds, 0, result, 0, nIds); return result; } protected Area scan(Area a, int xx, int y) { int id = ids[xx][y]; for (int x = xx; x < nx; x++) { if (flagDone[x][y] || ids[x][y] != id) break; flagDone[x][y] = true; r.x = x; r.y = y; if (a == null) { a = new Area(r); newIds[nIds++] = id; } else a.add(new Area(r)); if (singleCells || (skipOnes && id == 1)) break; if (x > 0 && !flagDone[x - 1][y] && ids[x - 1][y] == id) scan(a, x - 1, y); if (y > 0 && !flagDone[x][y - 1] && ids[x][y - 1] == id) scan(a, x, y - 1); if (y < (ny - 1) && !flagDone[x][y + 1] && ids[x][y + 1] == id) scan(a, x, y + 1); } return a; } } src/core/edu/xtec/jclic/shapers/JigSaw.java000066400000000000000000000117121335566474600211220ustar00rootroot00000000000000/* * File : JigSaw.java * Created : 10-may-2001 18:31 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import edu.xtec.util.JDomUtility; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class JigSaw extends Shaper { protected double baseWidthFactor; protected double toothHeightFactor; protected boolean randomLines; public JigSaw(int nx, int ny) { super(nx, ny); baseWidthFactor = getDefaultBaseWidthFactor(); toothHeightFactor = getDefaultToothHeightFactor(); randomLines = false; } protected int getBaseFactor() { return 50; } @Override public String getEditorPanelClassName() { return getClass().getPackage().getName() + ".JigSawEditorPanel"; } protected double getDefaultBaseWidthFactor() { return 1f / 3; } protected double getDefaultToothHeightFactor() { return 1f / 6; } protected static final String BASE_WIDTH_FACTOR = "baseWidthFactor", TOOTH_HEIGHT_FACTOR = "toothHeightFactor", RANDOM_LINES = "randomLines"; @Override public org.jdom.Element getJDomElement() { org.jdom.Element e = super.getJDomElement(); if (baseWidthFactor != getDefaultBaseWidthFactor()) { e.setAttribute(BASE_WIDTH_FACTOR, Double.toString(baseWidthFactor)); } if (toothHeightFactor != getDefaultToothHeightFactor()) { e.setAttribute(TOOTH_HEIGHT_FACTOR, Double.toString(toothHeightFactor)); } if (randomLines) e.setAttribute(RANDOM_LINES, JDomUtility.boolString(randomLines)); return e; } @Override public void setProperties(org.jdom.Element e, Object aux) throws Exception { initiated = false; baseWidthFactor = JDomUtility.getDoubleAttr(e, BASE_WIDTH_FACTOR, baseWidthFactor); toothHeightFactor = JDomUtility.getDoubleAttr(e, TOOTH_HEIGHT_FACTOR, toothHeightFactor); randomLines = JDomUtility.getBoolAttr(e, RANDOM_LINES, randomLines); } protected void buildShapes() { int[][] hLineType = new int[nRows + 1][nCols + 1]; int[][] vLineType = new int[nRows + 1][nCols + 1]; for (int row = 0; row < nRows; row++) { for (int col = 0; col < nCols; col++) { if (row == 0) { hLineType[row][col] = 0; } else { hLineType[row][col] = 1 + ((randomLines ? (int) (Math.random() * 9) : row + col) % 2); } if (col == 0) { vLineType[row][col] = 0; } else { vLineType[row][col] = 1 + ((randomLines ? (int) (Math.random() * 9) : col + row + 1) % 2); } if (col == nCols - 1) vLineType[row][col + 1] = 0; if (row == nRows - 1) hLineType[row + 1][col] = 0; } } double w = WIDTH / nCols; double h = HEIGHT / nRows; for (int r = 0; r < nRows; r++) { for (int c = 0; c < nCols; c++) { double x = w * c; double y = h * r; ShapeData sd = shapeData[r * nCols + c]; sd.moveTo(x, y); hLine(sd, hLineType[r][c], x + 0, y + 0, w, h, false); vLine(sd, vLineType[r][c + 1], x + w, y + 0, w, h, false); hLine(sd, hLineType[r + 1][c], x + w, y + h, w, h, true); vLine(sd, vLineType[r][c], x + 0, y + h, w, h, true); sd.closePath(); } } initiated = true; } protected void hLine(ShapeData sd, int type, double x, double y, double w, double h, boolean inv) { int kx = inv ? -1 : 1; int ky = (type == 1 ? 1 : -1); if (type == 0) { sd.lineTo(x + w * kx, y); } else { double x0 = x + ((w - w * baseWidthFactor) / 2) * kx; double wb = w * baseWidthFactor * kx; sd.lineTo(x0, y); double hb = (h * toothHeightFactor) * ky; sd.lineTo(x0, y + hb); sd.lineTo(x0 + wb, y + hb); sd.lineTo(x0 + wb, y); sd.lineTo(x + w * kx, y); } } protected void vLine(ShapeData sd, int type, double x, double y, double w, double h, boolean inv) { int ky = inv ? -1 : 1; int kx = (type == 1 ? 1 : -1); if (type == 0) { sd.lineTo(x, y + h * ky); } else { double y0 = y + ((h - h * baseWidthFactor) / 2) * ky; double hb = h * baseWidthFactor * ky; sd.lineTo(x, y0); double wb = w * toothHeightFactor * kx; sd.lineTo(x + wb, y0); sd.lineTo(x + wb, y0 + hb); sd.lineTo(x, y0 + hb); sd.lineTo(x, y + h * ky); } } } src/core/edu/xtec/jclic/shapers/Rectangular.java000066400000000000000000000030521335566474600222030ustar00rootroot00000000000000/* * File : Rectangular.java * Created : 10-may-2001 16:53 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class Rectangular extends Shaper { public Rectangular(int nx, int ny) { super(nx, ny); } @Override public boolean rectangularShapes() { return true; } protected void buildShapes() { int r, c; double w = WIDTH / nCols; double h = HEIGHT / nRows; double x, y; for (r = 0; r < nRows; r++) { for (c = 0; c < nCols; c++) { ShapeData sh = shapeData[r * nCols + c]; x = c * w; y = r * h; sh.moveTo(x, y); sh.lineTo(x + w, y); sh.lineTo(x + w, y + h); sh.lineTo(x, y + h); sh.lineTo(x, y); sh.closePath(); } } initiated = true; } } src/core/edu/xtec/jclic/shapers/ShapeData.java000066400000000000000000000303231335566474600215670ustar00rootroot00000000000000/* * File : ShapeData.java * Created : 12-may-2001 0:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import edu.xtec.util.JDomUtility; import java.awt.Shape; import java.awt.geom.*; import java.util.StringTokenizer; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class ShapeData extends Object implements Cloneable { public static final int CAPACITY_BLOCK = 6; protected double[] points; protected int pointsIndex; protected int[] descriptors; protected int descriptorsIndex; protected int windingRule; protected int primitiveType; protected double[] primitivePoints; public String comment; /** Creates new ShapeData */ public ShapeData() { points = new double[2 * CAPACITY_BLOCK]; pointsIndex = 0; descriptors = new int[CAPACITY_BLOCK]; descriptorsIndex = 0; windingRule = PathIterator.WIND_NON_ZERO; primitivePoints = null; primitiveType = -1; comment = null; } public static final String ELEMENT_NAME = "shape", COMMENT = "comment"; public static final int RECTANGLE = 0, ELLIPSE = 1, ROUND_RECT = 2, ARC = 3, NUM_PRIMITIVES = 4; public static final String[] PRIMITIVES = { "rectangle", "ellipse", "roundRectangle", "pie" }; public static final String RULE = "rule", MOVE_TO = "M", LINE_TO = "L", QUAD_TO = "Q", CUBIC_TO = "B", CLOSE = "X"; public static final String DELIMS = "|:,"; public static final char[] DELIM_CHAR = DELIMS.toCharArray(); public org.jdom.Element getJDomElement(double scaleW, double scaleH) { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (comment != null && comment.length() > 0) e.setAttribute(COMMENT, comment); StringBuilder sb = new StringBuilder(); int j = 0; if (primitiveType >= 0 && primitivePoints != null) { writeToSb(sb, PRIMITIVES[primitiveType], primitivePoints, j, primitivePoints.length, scaleW, scaleH); } else { if (windingRule != PathIterator.WIND_NON_ZERO) e.setAttribute(RULE, Integer.toString(windingRule)); for (int i = 0; i < descriptorsIndex; i++) { String type = CLOSE; int k = 0; if (i > 0) sb.append(DELIM_CHAR[0]); switch (descriptors[i]) { case PathIterator.SEG_MOVETO: type = MOVE_TO; k = 2; break; case PathIterator.SEG_LINETO: type = LINE_TO; k = 2; break; case PathIterator.SEG_QUADTO: type = QUAD_TO; k = 4; break; case PathIterator.SEG_CUBICTO: type = CUBIC_TO; k = 6; break; default: break; } writeToSb(sb, type, points, j, k, scaleW, scaleH); j += k; } } e.addContent(sb.substring(0)); return e; } public static ShapeData getShapeData(org.jdom.Element e, double scaleW, double scaleH) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); ShapeData sd = new ShapeData(); sd.comment = JDomUtility.getStringAttr(e, COMMENT, sd.comment, false); sd.setWindingRule(JDomUtility.getIntAttr(e, RULE, sd.windingRule)); StringTokenizer st = new StringTokenizer(e.getText(), DELIMS); while (st.hasMoreTokens()) { String s = st.nextToken(); for (int k = 0; k < NUM_PRIMITIVES; k++) { if (s.equals(PRIMITIVES[k])) { double[] data = decodeData(st, k >= ROUND_RECT ? 6 : 4, scaleW, scaleH); Shape sh = null; switch (k) { case RECTANGLE: sh = new Rectangle2D.Double(data[0], data[1], data[2], data[3]); break; case ELLIPSE: sh = new Ellipse2D.Double(data[0], data[1], data[2], data[3]); break; case ROUND_RECT: sh = new RoundRectangle2D.Double(data[0], data[1], data[2], data[3], data[4], data[5]); break; case ARC: sh = new Arc2D.Double(data[0], data[1], data[2], data[3], data[4] * scaleW, data[5] * scaleH, Arc2D.PIE); break; default: throw new Exception("unknown primitive shape!"); } if (sh != null) return getShapeData(sh, sd.comment); } } if (s.equals(MOVE_TO)) { sd.addDescriptor(PathIterator.SEG_MOVETO); sd.addData(decodeData(st, 2, scaleW, scaleH)); } else if (s.equals(LINE_TO)) { sd.addDescriptor(PathIterator.SEG_LINETO); sd.addData(decodeData(st, 2, scaleW, scaleH)); } else if (s.equals(QUAD_TO)) { sd.addDescriptor(PathIterator.SEG_QUADTO); sd.addData(decodeData(st, 4, scaleW, scaleH)); } else if (s.equals(CUBIC_TO)) { sd.addDescriptor(PathIterator.SEG_CUBICTO); sd.addData(decodeData(st, 6, scaleW, scaleH)); } else if (s.equals(CLOSE)) { sd.addDescriptor(PathIterator.SEG_CLOSE); } else { throw new IllegalArgumentException("Unknown ShapeData type: " + s); } } return sd; } private static java.text.DecimalFormat DF; private void writeToSb(StringBuilder sb, String type, double[] values, int j, int k, double scaleW, double scaleH) { sb.append(type); if (k > 0) { if (DF == null) { DF = new java.text.DecimalFormat("0.0#####"); java.text.DecimalFormatSymbols dfs = new java.text.DecimalFormatSymbols(); dfs.setDecimalSeparator('.'); DF.setDecimalFormatSymbols(dfs); } sb.append(DELIM_CHAR[1]); for (int w = 0; w < k; w++) { String s = DF.format(values[j++] * ((j & 1) != 0 ? scaleW : scaleH)); if (s.endsWith(".0")) { s = s.substring(0, s.length() - 2); } if (w > 0) sb.append(DELIM_CHAR[2]); sb.append(s); } } } private void addDescriptor(int descriptor) { if (descriptorsIndex + 1 >= descriptors.length) { int[] d2 = new int[descriptors.length + CAPACITY_BLOCK]; System.arraycopy(descriptors, 0, d2, 0, descriptorsIndex); descriptors = d2; } descriptors[descriptorsIndex++] = descriptor; } private void addData(double[] data) { if (data == null) return; if (pointsIndex + data.length >= points.length) { double[] d2 = new double[points.length + 2 * CAPACITY_BLOCK]; System.arraycopy(points, 0, d2, 0, pointsIndex); points = d2; } for (double d : data) points[pointsIndex++] = d; } private static double[] decodeData(StringTokenizer st, int count, double scaleW, double scaleH) throws Exception { double[] data = new double[count]; for (int i = 0; i < count; i++) { data[i] = Double.parseDouble(st.nextToken()) / ((i & 1) == 0 ? scaleW : scaleH); } return data; } protected void add(int descriptor, double[] data) { addDescriptor(descriptor); if (data != null) addData(data); } public void moveTo(double x, double y) { add(PathIterator.SEG_MOVETO, new double[] { x, y }); } public void lineTo(double x, double y) { add(PathIterator.SEG_LINETO, new double[] { x, y }); } public void quadTo(double x0, double y0, double x1, double y1) { add(PathIterator.SEG_QUADTO, new double[] { x0, y0, x1, y1 }); } public void cubicTo(double x0, double y0, double x1, double y1, double x2, double y2) { add(PathIterator.SEG_CUBICTO, new double[] { x0, y0, x1, y1, x2, y2 }); } public void closePath() { add(PathIterator.SEG_CLOSE, null); } public void setWindingRule(int setRule) { windingRule = setRule; } public void scaleTo(double scaleX, double scaleY) { if (points != null) for (int i = 0; i < points.length; i += 2) { points[i] /= scaleX; points[i + 1] /= scaleY; } if (primitivePoints != null) for (int i = 0; i < primitivePoints.length; i += 2) { primitivePoints[i] /= scaleX; primitivePoints[i + 1] /= scaleY; } } public Shape getShape(Rectangle2D rect) { return getShape(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); } public Shape getShape(double dx, double dy, double scaleX, double scaleY) { GeneralPath gp = new GeneralPath(windingRule, pointsIndex + 1); int j = 0; for (int i = 0; i < descriptorsIndex; i++) { switch (descriptors[i]) { case PathIterator.SEG_MOVETO: gp.moveTo((float) (dx + scaleX * points[j++]), (float) (dy + scaleY * points[j++])); break; case PathIterator.SEG_LINETO: gp.lineTo((float) (dx + scaleX * points[j++]), (float) (dy + scaleY * points[j++])); break; case PathIterator.SEG_QUADTO: gp.quadTo((float) (dx + scaleX * points[j++]), (float) (dy + scaleY * points[j++]), (float) (dx + scaleX * points[j++]), (float) (dy + scaleY * points[j++])); break; case PathIterator.SEG_CUBICTO: gp.curveTo((float) (dx + scaleX * points[j++]), (float) (dy + scaleY * points[j++]), (float) (dx + scaleX * points[j++]), (float) (dy + scaleY * points[j++]), (float) (dx + scaleX * points[j++]), (float) (dy + scaleY * points[j++])); break; default: gp.closePath(); } } return gp; } public static ShapeData getShapeData(Shape sh, String comment) { return getShapeData(sh, comment, true); } public static ShapeData getShapeData(Shape sh, String comment, boolean closeTo) { ShapeData sd = new ShapeData(); sd.comment = comment; if (sh instanceof RectangularShape) { RectangularShape rs = (RectangularShape) sh; if (sh instanceof Rectangle2D) { sd.primitiveType = RECTANGLE; sd.primitivePoints = new double[] { rs.getX(), rs.getY(), rs.getWidth(), rs.getHeight() }; } else if (sh instanceof Ellipse2D) { sd.primitiveType = ELLIPSE; sd.primitivePoints = new double[] { rs.getX(), rs.getY(), rs.getWidth(), rs.getHeight() }; } else if (sh instanceof RoundRectangle2D) { sd.primitiveType = ROUND_RECT; RoundRectangle2D rr = (RoundRectangle2D) sh; sd.primitivePoints = new double[] { rs.getX(), rs.getY(), rs.getWidth(), rs.getHeight(), rr.getArcWidth(), rr.getArcHeight() }; } else if (sh instanceof Arc2D) { Arc2D ar = (Arc2D) sh; if (ar.getArcType() == Arc2D.PIE) { sd.primitiveType = ARC; sd.primitivePoints = new double[] { rs.getX(), rs.getY(), rs.getWidth(), rs.getHeight(), ar.getAngleStart(), ar.getAngleExtent() }; } } } PathIterator it = sh.getPathIterator(null); double[] data = new double[6]; sd.setWindingRule(it.getWindingRule()); while (!it.isDone()) { switch (it.currentSegment(data)) { case PathIterator.SEG_MOVETO: sd.moveTo(data[0], data[1]); break; case PathIterator.SEG_LINETO: sd.lineTo(data[0], data[1]); break; case PathIterator.SEG_QUADTO: sd.quadTo(data[0], data[1], data[2], data[3]); break; case PathIterator.SEG_CUBICTO: sd.cubicTo(data[0], data[1], data[2], data[3], data[4], data[5]); break; case PathIterator.SEG_CLOSE: if (closeTo) sd.closePath(); break; default: System.err.println("ShapeData error: Unknown PathIterator!"); } it.next(); } return sd; } @Override public Object clone() throws CloneNotSupportedException { ShapeData sd = (ShapeData) super.clone(); if (points != null) sd.points = (double[]) points.clone(); if (descriptors != null) sd.descriptors = (int[]) descriptors.clone(); if (primitivePoints != null) sd.primitivePoints = (double[]) primitivePoints.clone(); return sd; } } src/core/edu/xtec/jclic/shapers/Shaper.java000066400000000000000000000146051335566474600211640ustar00rootroot00000000000000/* * File : Shaper.java * Created : 10-may-2001 16:26 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import edu.xtec.util.Options; import edu.xtec.util.TripleString; import java.awt.Component; import java.awt.Dimension; import java.awt.Image; import java.awt.Shape; import java.awt.geom.*; import java.util.ArrayList; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public abstract class Shaper extends Object implements Cloneable, Domable { protected final double WIDTH = 1, HEIGHT = 1; protected static final String DELIM = "|"; protected int nCols, nRows, nCells; protected ShapeData[] shapeData; protected boolean initiated = false; /** Creates new Shaper */ public Shaper(int nx, int ny) { reset(nx, ny); } public void reset(int nCols, int nRows) { this.nCols = nCols; this.nRows = nRows; nCells = nRows * nCols; initiated = false; shapeData = new ShapeData[nCells]; for (int i = 0; i < nCells; i++) shapeData[i] = new ShapeData(); } public void reset() { reset(nCols, nRows); } public static final String ELEMENT_NAME = "shaper"; public static final String COLS = "cols", ROWS = "rows"; public static final String BASE_CLASS = "edu.xtec.jclic.shapers.", BASE_CLASS_TAG = "@"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); e.setAttribute(JDomUtility.CLASS, getClassName()); e.setAttribute(COLS, Integer.toString(nCols)); e.setAttribute(ROWS, Integer.toString(nRows)); return e; } public String getClassName() { String result = getClass().getName(); if (result.startsWith(BASE_CLASS)) result = BASE_CLASS_TAG + result.substring(BASE_CLASS.length()); return result; } public static Shaper getShaper(org.jdom.Element e) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); String className = JDomUtility.getClassName(e); int cw = JDomUtility.getIntAttr(e, COLS, 1); int ch = JDomUtility.getIntAttr(e, ROWS, 1); Shaper sh = createShaper(className, cw, ch); sh.setProperties(e, null); return sh; } public static Shaper createShaper(String className, int cw, int ch) throws Exception { if (className.startsWith(BASE_CLASS_TAG)) className = BASE_CLASS + className.substring(1); Class shaperClass; java.lang.reflect.Constructor con; Class[] cparams = { int.class, int.class }; Object[] initArgs = { new Integer(cw), new Integer(ch) }; shaperClass = Class.forName(className); con = shaperClass.getConstructor(cparams); return (Shaper) con.newInstance(initArgs); } protected abstract void buildShapes(); public boolean rectangularShapes() { return false; } public String getEditorPanelClassName() { return null; } public Shaper edit(Component parent, Options options, Dimension dim, Image img, BoxBase bb) { Shaper result = null; if (getEditorPanelClassName() != null) { try { Class cl = Class.forName(getEditorPanelClassName()); java.lang.reflect.Method m = cl.getMethod("getShaper", new Class[] { Shaper.class, Component.class, Options.class, Dimension.class, Image.class, BoxBase.class }); result = (Shaper) m.invoke(null, new Object[] { this, parent, options, dim, img, bb }); } catch (Exception ex) { options.getMessages().showErrorWarning(parent, "edit_act_shaper_err", ex); } } return result; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { } public Shape getShape(int n, Rectangle2D rect) { if (!initiated) buildShapes(); if (n >= nCells || shapeData[n] == null) return null; return shapeData[n].getShape(rect); } public ShapeData getShapeData(int n) { return (n >= 0 && n < shapeData.length) ? shapeData[n] : null; } protected ShapeData getEnclosingShapeData() { ShapeData sh = new ShapeData(); sh.moveTo(0, 0); sh.lineTo(1.0, 0); sh.lineTo(1.0, 1.0); sh.lineTo(0, 1.0); sh.closePath(); return sh; } public boolean hasRemainder() { return false; } public Shape getRemainderShape(Rectangle2D rect) { if (!hasRemainder()) return null; if (!initiated) buildShapes(); GeneralPath gp = (GeneralPath) (getEnclosingShapeData().getShape(rect)); gp.setWindingRule(GeneralPath.WIND_EVEN_ODD); for (int i = 0; i < nCells; i++) { if (shapeData[i] != null) gp.append(shapeData[i].getShape(rect), false); } return gp; } public int getNumRows() { return nRows; } public void setNumRows(int n) { if (n > 0 && n != nRows) reset(nCols, n); } public int getNumColumns() { return nCols; } public void setNumColumns(int n) { if (n > 0 && n != nCols) reset(nRows, n); } public int getNumCells() { return nCells; } public static final String SYSTEM_LIST = "shapers.listshapers"; public static List getSystemShaperList(Options options) { List result = new ArrayList(); try { result = TripleString.getTripleList(SYSTEM_LIST, options, false, true, true); } catch (Exception ex) { System.err.println("Error reading list of shapers!\n" + ex); } return result; } @Override public Object clone() throws CloneNotSupportedException { Shaper clon = (Shaper) super.clone(); clon.shapeData = (ShapeData[]) shapeData.clone(); for (int i = 0; i < shapeData.length; i++) { if (shapeData[i] != null) clon.shapeData[i] = (ShapeData) shapeData[i].clone(); } return clon; } } src/core/edu/xtec/jclic/shapers/TriangularJigSaw.java000066400000000000000000000041161335566474600231530ustar00rootroot00000000000000/* * File : TriangularJigSaw.java * Created : 14-may-2001 13:51 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class TriangularJigSaw extends JigSaw { /** Creates new TriangularJigSaw */ public TriangularJigSaw(int nx, int ny) { super(nx, ny); } @Override protected void hLine(ShapeData sd, int type, double x, double y, double w, double h, boolean inv) { int kx = inv ? -1 : 1; int ky = (type == 1 ? 1 : -1); if (type == 0) { sd.lineTo(x + w * kx, y); } else { double x0 = x + ((w - w * baseWidthFactor) / 2) * kx; double wb = w * baseWidthFactor * kx; sd.lineTo(x0, y); double hb = (h * toothHeightFactor) * ky; sd.lineTo(x0 + wb / 2, y + hb); sd.lineTo(x0 + wb, y); sd.lineTo(x + w * kx, y); } } @Override protected void vLine(ShapeData sd, int type, double x, double y, double w, double h, boolean inv) { int ky = inv ? -1 : 1; int kx = (type == 1 ? 1 : -1); if (type == 0) { sd.lineTo(x, y + h * ky); } else { double y0 = y + ((h - h * baseWidthFactor) / 2) * ky; double hb = h * baseWidthFactor * ky; sd.lineTo(x, y0); double wb = w * toothHeightFactor * kx; sd.lineTo(x + wb, y0 + hb / 2); sd.lineTo(x, y0 + hb); sd.lineTo(x, y + h * ky); } } } src/core/edu/xtec/jclic/skins/000077500000000000000000000000001335566474600165535ustar00rootroot00000000000000src/core/edu/xtec/jclic/skins/AboutWindow.java000066400000000000000000000211061335566474600216600ustar00rootroot00000000000000/* * File : AboutWindow.java * Created : 07-dec-2001 10:14 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.skins; import edu.xtec.jclic.Constants; import edu.xtec.util.*; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.html.HTMLDocument; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class AboutWindow extends edu.xtec.util.ExtendedJDialog implements HyperlinkListener { protected ResourceBridge rb; protected JTabbedPane tPane; public AboutWindow(Component parent, ResourceBridge rb, Dimension setSize) { super(parent, rb.getMsg("about_window_caption"), true); this.rb = rb; JPanel mainPane = new JPanel(); mainPane.setLayout(new BorderLayout()); mainPane.setPreferredSize(setSize); tPane = new JTabbedPane(); mainPane.add(tPane, BorderLayout.CENTER); JPanel btPanel = new JPanel(); btPanel.setLayout(new java.awt.GridLayout(1, 2)); JButton btClose = new JButton(rb.getMsg("about_window_close_button"), ResourceManager.getImageIcon("icons/exit_small.gif")); btClose.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); } }); btPanel.add(btClose); mainPane.add(btPanel, BorderLayout.SOUTH); getContentPane().add(mainPane); pack(); centerOver(parent); } public JTabbedPane getTabbedPane() { return tPane; } public void addUrlDocumentTab(java.net.URL url, String tabTitle, Icon icon) { try { final JEditorPane ep = new JEditorPane(url); ep.setEditable(false); ep.addHyperlinkListener(this); tPane.addTab(tabTitle, icon, new JScrollPane(ep)); javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { ep.scrollRectToVisible(new Rectangle(0, 0)); } }); } catch (java.io.IOException ex) { System.err.println("Error building about window:\n" + ex); tPane.addTab(tabTitle, new JLabel("ERROR")); } } public void addStrDocumentTab(String src, String tabTitle, java.net.URL base, Icon icon) { final JEditorPane ep = new JEditorPane(); ep.setEditorKit(ep.getEditorKitForContentType("text/html")); if (base == null) base = getAboutUrlBase(); if (base != null) ((HTMLDocument) ep.getDocument()).setBase(base); ep.setText(src); ep.setEditable(false); ep.addHyperlinkListener(this); tPane.addTab(tabTitle, icon, new JScrollPane(ep)); javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { ep.scrollRectToVisible(new Rectangle(0, 0)); } }); } public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { final String sUrl = e.getURL().toString(); SwingUtilities.invokeLater(new Runnable() { public void run() { rb.displayUrl(sUrl, true); } }); } } private static java.net.URL urlBase; public static java.net.URL getAboutUrlBase() { if (urlBase == null) { try { java.net.URL rootDocUrl = ResourceManager.getResource("about/about.html"); String s = rootDocUrl.toString(); urlBase = new java.net.URL(s.substring(0, s.lastIndexOf('/') + 1)); } catch (Exception ex) { System.err.println("Resource missing: about.html"); } } return urlBase; } public void buildAboutTab(String appName, String appVersion, String logoIcon, String creditsDoc, String otherCreditsDoc, String licenseDoc, String sponsorsDoc) throws Exception { String doc = ResourceManager.getResourceText("about/about.html", false); if (appName == null) appName = "JClic"; if (logoIcon == null) logoIcon = "logo_small.png"; if (creditsDoc == null) creditsDoc = "about/credits.html"; String credits = ResourceManager.getResourceText(creditsDoc, false); String translationCredits = rb.getMsg("html_translation_credits"); if (otherCreditsDoc == null) otherCreditsDoc = rb.getMsg("about_otherCreditsDoc"); String otherCredits = ResourceManager.getResourceText(otherCreditsDoc, false); String license = rb.getMsg("html_gpl_license"); if (licenseDoc != null) license = ResourceManager.getResourceText(licenseDoc, false); if (sponsorsDoc == null) sponsorsDoc = rb.getMsg("about_sponsorsDoc"); String sponsors = ResourceManager.getResourceText(sponsorsDoc, false); java.net.URL iconUrl = ResourceManager.getResource("about/" + logoIcon); doc = StrUtils.replace(doc, "%LOGO", iconUrl.toExternalForm()); StringBuilder sb = new StringBuilder(appName); if (appVersion != null) sb.append(" ").append(rb.getMsg("VERSION")).append(" ").append(appVersion); doc = StrUtils.replace(doc, "%APPVERSION", sb.substring(0)); doc = StrUtils.replace(doc, "%CREDITS", credits); doc = StrUtils.replace(doc, "%TRANSLATION", translationCredits); sb.setLength(0); sb.append(rb.getMsg("about_otherCreditsCaption")).append("
 
").append(otherCredits); doc = StrUtils.replace(doc, "%OTHERCREDITS", sb.substring(0)); doc = StrUtils.replace(doc, "%LICENSE", license); sb.setLength(0); if (sponsors != null && sponsors.length() > 0) sb.append(rb.getMsg("about_sponsorsCaption")).append("
").append(sponsors); doc = StrUtils.replace(doc, "%SPONSORS", sb.substring(0)); addStrDocumentTab(doc, rb.getMsg("ABOUT"), getAboutUrlBase(), ResourceManager.getImageIcon("icons/about_small.gif")); } public void buildStandardTab(String htmlContent, String titleKey, String labelKey, String icon) { String htmlBgColor = rb.getMsg("about_window_html_bgcolor"); String htmlStyle = rb.getMsg("about_window_html_style"); String header = rb.getMsg("about_window_html_header"); StringBuilder sb = new StringBuilder(4096); sb.append(header); if (titleKey != null) { sb.append("
").append(rb.getMsg(titleKey)).append("
"); } sb.append(htmlContent); String s = Html.table(sb.substring(0), "100%", 0, 5, -1, htmlStyle, true); addStrDocumentTab(Html.getHtmlDoc(s, htmlBgColor), rb.getMsg(labelKey), getAboutUrlBase(), ResourceManager.getImageIcon(icon)); } public String getHtmlSystemInfo() { Messages msg = rb.getOptions().getMessages(); Html html = new Html(3000); html.doubleCell(msg.get("about_window_lb_os"), true, System.getProperty("os.name") + " " + System.getProperty("os.version") + " - " + System.getProperty("os.arch"), false); html.doubleCell(msg.get("about_window_lb_java_version"), true, System.getProperty("java.version"), false); html.doubleCell(msg.get("about_window_lb_java_vm"), true, System.getProperty("java.vm.name") + " " + System.getProperty("java.vm.version") + "\n" + System.getProperty("java.vm.vendor"), false); html.doubleCell(msg.get("about_window_lb_java_home"), true, System.getProperty("java.home"), false); html.doubleCell(msg.get("about_window_lb_free_mem"), true, msg.kValue(Runtime.getRuntime().freeMemory()), false); html.doubleCell(msg.get("about_window_lb_total_mem"), true, msg.kValue(Runtime.getRuntime().totalMemory()), false); Object o = rb.getOptions().get(Constants.MEDIA_SYSTEM); String s = Constants.JMF.equals(o) ? "Java Media Framework" : Constants.QT61.equals(o) ? "QuickTime for Java 6.1+" : "-"; html.doubleCell(msg.get("about_window_lb_mediaSystem"), true, s, false); if (rb.getOptions().getBoolean(Constants.TRACE)) { java.util.Iterator it = System.getProperties().keySet().iterator(); while (it.hasNext()) { String k = (String) it.next(); html.doubleCell(k, true, System.getProperty(k), false); } } return Html.table(html.toString(), null, 0, 5, -1, null, false); } } src/core/edu/xtec/jclic/skins/BasicSkin.java000066400000000000000000000450271335566474600212740ustar00rootroot00000000000000/* * File : BasicSkin.java * Created : 10-oct-2001 18:19 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.skins; import edu.xtec.jclic.*; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.*; import edu.xtec.util.*; import java.awt.*; import java.awt.image.*; import javax.swing.*; import javax.swing.border.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public class BasicSkin extends Skin { BufferedImage img; Color fillColor; int initiated; Rectangle frame; int leftSlicer, rightSlicer, topSlicer, bottomSlicer; Rectangle playerRect; Rectangle msgRect; Rectangle[] msgAreaRect = new Rectangle[NUM_MSG_AREAS]; Color textColor; Rectangle[] buttonsRect = new Rectangle[Constants.NUM_ACTIONS]; Rectangle[][] countersRect = new Rectangle[Constants.NUM_COUNTERS][]; ActiveBox[] countersLabel = new ActiveBox[Constants.NUM_COUNTERS]; AbstractBox[] boxes = new AbstractBox[NUM_BOXES]; JProgressBar progressBar; Rectangle progressBarRect; Rectangle progressAnimationRect; AnimatedActiveBox progressAnimation; boolean hideProgressBar, hideProgressAnim; static final int NUM_BOXES = 2 * Constants.NUM_COUNTERS + 5; /** Creates new BasicSkin */ protected BasicSkin() { super(); for (int i = 0; i < Constants.NUM_COUNTERS; i++) countersRect[i] = new Rectangle[2]; progressBar = null; progressAnimation = null; hideProgressBar = true; hideProgressAnim = true; initiated = 0; } public static final String IMAGE = "image", PREFERRED_SIZE = "preferredSize", FRAME = "frame", PLAYER = "player", FILL = "fill", SLICER = "slicer", MESSAGES = "messages", STATUS_BAR = "statusBar", SETTINGS = "settings", STYLE = "style", FOREGROUND = "foreground", BACKGROUND = "background", MSG_AREA = "msgArea", BORDER = "border", BUTTONS = "buttons", BUTTON = "button", ACTIVE = "active", OVER = "over", DISABLED = "disabled", POS = "pos", SOURCE = "source", COUNTERS = "counters", COUNTER = "counter", LABEL = "label", DIGITS = "digits", TOGGLE = "toggle", PROGRESS_BAR = "progressBar", AUTO_HIDE = "autoHide", SHOW_PERCENT = "showPercent", PROGRESS_ANIMATION = "progressAnimation", FRAMES = "frames", DELAY = "delay", STEP = "step"; protected void setProperties(org.jdom.Element e, FileSystem fs) throws Exception { org.jdom.Element child, child2, child3, child4; BoxBase bb; setPreferredSize(JDomUtility.getDimension(e, PREFERRED_SIZE, new Dimension(640, 480))); fillColor = JDomUtility.getColorByPoint(e, FILL, img, Color.white); String imageFile = JDomUtility.getStringAttr(e, IMAGE, null, true); if (imageFile == null || imageFile.length() == 0) throw new Exception("BasicSkin properties without image name!"); if (fs == null) { ImageIcon imgIcon = ResourceManager.getImageIcon(RESOURCE_FOLDER + "/" + imageFile); img = Utils.toBufferedImage(imgIcon.getImage(), fillColor, this); } else { ImageIcon imgi = new ImageIcon(fs.getBytes(imageFile)); img = Utils.toBufferedImage(imgi.getImage(), fillColor, this); } // re-check color (may be specified by point) fillColor = JDomUtility.getColorByPoint(e, FILL, img, Color.gray); setBackground(fillColor); frame = JDomUtility.getRectangle(e, FRAME, null); setMinimumSize(frame.getSize()); child = e.getChild(SLICER); leftSlicer = JDomUtility.getIntAttr(child, JDomUtility.LEFT, 0); rightSlicer = JDomUtility.getIntAttr(child, JDomUtility.RIGHT, 0); topSlicer = JDomUtility.getIntAttr(child, JDomUtility.TOP, 0); bottomSlicer = JDomUtility.getIntAttr(child, JDomUtility.BOTTOM, 0); playerRect = JDomUtility.getRectangle(e, PLAYER, null); msgRect = JDomUtility.getRectangle(e, MESSAGES, null); bb = new BoxBase(); bb.transparent = true; msgBox = new ActiveBox(null, this, 0, msgRect, bb); if ((child = e.getChild(PROGRESS_BAR)) != null) { hideProgressBar = JDomUtility.getBoolAttr(child, AUTO_HIDE, true); BoxBase bbProgres = getBoxBase(child, null); progressBarRect = JDomUtility.getRectangle(child, null, null); if (progressBarRect != null) { progressBar = new JProgressBar(); BoxBase bbProgress = getBoxBase(child, null); progressBar.setBackground(bbProgress.backColor); progressBar.setForeground(bbProgress.textColor); progressBar.setFont(bbProgress.getFont()); progressBar.setStringPainted(JDomUtility.getBoolAttr(child, SHOW_PERCENT, true)); progressBar.setOpaque(false); progressBar.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); add(progressBar); progressBar.setVisible(!hideProgressBar); hasProgress = true; } } if ((child = e.getChild(PROGRESS_ANIMATION)) != null) { Dimension d = JDomUtility.getDimension(child, null, null); Point source = JDomUtility.getPoint(child, SOURCE, null); Point pos = JDomUtility.getPoint(child, POS, null); int frames = JDomUtility.getIntAttr(child, FRAMES, 0); int delay = JDomUtility.getIntAttr(child, DELAY, 0); int direction = JDomUtility.getDirection(child, JDomUtility.DIRECTION_DOWN); hideProgressAnim = JDomUtility.getBoolAttr(child, AUTO_HIDE, true); if (d != null && source != null && frames > 0 && delay >= AnimatedActiveBox.MIN_DELAY) { int dx, dy; switch (direction) { case JDomUtility.DIRECTION_RIGHT: dx = 1; dy = 0; break; case JDomUtility.DIRECTION_LEFT: dx = -1; dy = 0; break; case JDomUtility.DIRECTION_UP: dx = 0; dy = -1; break; default: dx = 0; dy = 1; } int sx = JDomUtility.getIntAttr(child, STEP, d.width); int sy = JDomUtility.getIntAttr(child, STEP, d.height); progressAnimationRect = new Rectangle(pos, d); progressAnimation = new AnimatedActiveBox(null, this, 0, progressAnimationRect, getBoxBase(child, null)); progressAnimation.setDelay(delay); ActiveBagContent abc = new ActiveBagContent(1, frames); for (int i = 0; i < frames; i++) { ActiveBoxContent ab = new ActiveBoxContent(); ab.setImgContent(img, new Rectangle(source.x + (dx * i * sx), source.y + (dy * i * sy), d.width, d.height)); abc.addActiveBoxContent(ab); } progressAnimation.setContent(abc); progressAnimation.setVisible(!hideProgressAnim); } } if ((child = e.getChild(STATUS_BAR)) != null) { BoxBase bbMsgDef = getBoxBase(child, null); textColor = bbMsgDef.textColor; for (int i = 0; i < NUM_MSG_AREAS; i++) if ((child2 = JDomUtility.getChildWithId(child, MSG_AREA, msgAreaNames[i])) != null) { msgAreaRect[i] = JDomUtility.getRectangle(child2, null, null); bb = getBoxBase(child2, bbMsgDef); bb.textMargin = 0; msgArea[i] = new ActiveBox(null, this, 0, msgAreaRect[i], bb); ActiveBoxContent abc = new ActiveBoxContent(); abc.setBoxBase(bb); abc.setTxtAlign(JDomUtility.getAlignment(child2, null, null)); msgArea[i].setContent(abc); } } if ((child = e.getChild(BUTTONS)) != null) { child2 = child.getChild(SETTINGS); Dimension dDef = JDomUtility.getDimension(child2, null, new Dimension()); Point activeDef = JDomUtility.getOffset(child2, ACTIVE, null); Point overDef = JDomUtility.getOffset(child2, OVER, null); Point disabledDef = JDomUtility.getOffset(child2, DISABLED, null); for (int i = 0; i < Constants.NUM_ACTIONS; i++) if ((child2 = JDomUtility.getChildWithId(child, BUTTON, Constants.ACTION_NAME[i])) != null) { Point pos = JDomUtility.getPoint(child2, POS, null); boolean toggle = JDomUtility.getBoolAttr(child2, TOGGLE, false); if (pos != null) { child3 = child2.getChild(SETTINGS); Dimension d = JDomUtility.getDimension(child3, null, dDef); buttonsRect[i] = new Rectangle(pos, d); Point source = JDomUtility.getPoint(child2, SOURCE, null); Point active = JDomUtility.getOffset(child3, ACTIVE, activeDef); Point over = JDomUtility.getOffset(child3, OVER, overDef); Point disabled = JDomUtility.getOffset(child3, DISABLED, disabledDef); buttons[i] = createButton(i, d, source, active, over, disabled, toggle); } } } if ((child = e.getChild(COUNTERS)) != null) { child2 = child.getChild(SETTINGS); Dimension dCounterDef = JDomUtility.getDimension(child2, COUNTER, new Dimension()); Dimension dLabelDef = JDomUtility.getDimension(child2, LABEL, new Dimension()); int[] dLabelAlign = JDomUtility.getAlignment(child2, LABEL, null); BoxBase bbCountersDef = getBoxBase(child, null); child2 = child.getChild(DIGITS); Dimension dSizeDef = JDomUtility.getDimension(child2, null, null); Point dOriginDef = JDomUtility.getPoint(child2, SOURCE, null); for (int i = 0; i < Constants.NUM_COUNTERS; i++) if ((child2 = JDomUtility.getChildWithId(child, COUNTER, Constants.counterNames[i])) != null) { child3 = child.getChild(SETTINGS); bb = getBoxBase(child2, bbCountersDef); bb.textMargin = 0; Point counterPos = JDomUtility.getPoint(child2, COUNTER, null); if (counterPos != null) { Dimension dCounter = JDomUtility.getDimension(child3, COUNTER, dCounterDef); countersRect[i][0] = new Rectangle(counterPos, dCounter); child4 = child2.getChild(DIGITS); Dimension dSize = JDomUtility.getDimension(child4, null, dSizeDef); Point dOrigin = JDomUtility.getPoint(child4, SOURCE, dOriginDef); counters[i] = new Counter(null, this, countersRect[i][0], bb); counters[i].setSource(img, dOrigin, dSize); } Point labelPos = JDomUtility.getPoint(child2, LABEL, null); if (labelPos != null) { Dimension dLabel = JDomUtility.getDimension(child3, LABEL, dLabelDef); countersRect[i][1] = new Rectangle(labelPos, dLabel); countersLabel[i] = new ActiveBox(null, this, 0, countersRect[i][1], bb); ActiveBoxContent abc = new ActiveBoxContent(); abc.setBoxBase(bb); abc.setTxtAlign(JDomUtility.getAlignment(child2, LABEL, dLabelAlign)); abc.setTextContent(ps.getMsg("label_" + Constants.counterNames[i])); countersLabel[i].setContent(abc); } } } int c, l, k = 0; for (c = 0; c < Constants.NUM_COUNTERS; c++) { boxes[k++] = counters[c]; boxes[k++] = countersLabel[c]; } for (l = 0; l < NUM_MSG_AREAS; l++) { boxes[k++] = msgArea[l]; } boxes[k++] = msgBox; boxes[k++] = progressAnimation; initiated = 1; } protected BoxBase getBoxBase(org.jdom.Element e, BoxBase defaultValue) throws Exception { org.jdom.Element child; if (e == null || (child = e.getChild(STYLE)) == null) return defaultValue; BoxBase bb = defaultValue == null ? new BoxBase() : BoxBase.getBoxBase(defaultValue.getJDomElement()); org.jdom.Element child2 = child.getChild(JDomUtility.FONT); if (child2 != null) bb.setFont(JDomUtility.elementToFont(child2)); bb.textColor = JDomUtility.getColorByPoint(child, FOREGROUND, img, bb.textColor); bb.backColor = JDomUtility.getColorByPoint(child, BACKGROUND, img, bb.backColor); if (bb.backColor == BoxBase.DEFAULT_BACK_COLOR) bb.transparent = true; else bb.transparent = JDomUtility.getBoolAttr(child, BoxBase.TRANSPARENT, bb.transparent); bb.textMargin = JDomUtility.getIntAttr(child, BoxBase.MARGIN, bb.textMargin); return bb; } @Override public void doLayout() { if (initiated < 1) { invalidate(); return; } super.doLayout(); if (player != null) player.setBounds(translateRect(playerRect)); if (progressBar != null) progressBar.setBounds(translateRect(progressBarRect)); for (int i = 0; i < buttons.length; i++) if (buttons[i] != null) buttons[i].setBounds(translateRect(buttonsRect[i])); for (int i = 0; i < Constants.NUM_COUNTERS; i++) { if (counters[i] != null) counters[i].setLocation(translatePoint(countersRect[i][0].getLocation())); if (countersLabel[i] != null) countersLabel[i].setLocation(translatePoint(countersRect[i][1].getLocation())); } if (msgBox != null) msgBox.setBounds(translateRect(msgRect)); if (progressAnimation != null) progressAnimation.setBounds(translateRect(progressAnimationRect)); for (int i = 0; i < NUM_MSG_AREAS; i++) if (msgArea[i] != null) msgArea[i].setBounds(translateRect(msgAreaRect[i])); if (player != null) initiated = 2; } @Override public void startAnimation() { if (progressAnimation != null) { if (hideProgressAnim) progressAnimation.setStartDelay(DEFAULT_PROGRESS_WAKE_ON); progressAnimation.start(); } } @Override public void stopAnimation() { if (progressAnimation != null) { if (hideProgressAnim) progressAnimation.setVisible(false); progressAnimation.stop(false); } } public void render(Graphics2D g2, Rectangle clip) { if (player == null || initiated < 2) return; if (!readyToPaint) readyToPaint = true; if (counters != null) for (int i = 0; i < Constants.NUM_COUNTERS; i++) { if (counters[i] != null && counters[i].getBounds().equals(clip)) { Utils.drawImage(g2, img, counters[i].getBounds(), countersRect[i][0], this); counters[i].update(g2, clip, this); return; } } drawSlicedFrame(g2, getBounds(), frame, img, leftSlicer, rightSlicer, topSlicer, bottomSlicer); if (boxes != null) for (int i = 0; i < NUM_BOXES; i++) { if (boxes[i] != null) { boxes[i].update(g2, clip, this); if (boxes[i].getBounds().equals(clip)) { return; } } } } @Override public void setLocale(java.util.Locale l) { super.setLocale(l); if (ps != null && countersLabel != null) for (int i = 0; i < Constants.NUM_COUNTERS; i++) if (countersLabel[i] != null) countersLabel[i].setTextContent(ps.getMsg("label_" + Constants.counterNames[i])); } protected AbstractButton createButton(int buttonId, Dimension d, Point source, Point active, Point over, Point disabled, boolean toggle) { final AbstractButton button; Action action = ps.getAction(buttonId); if (source != null) { ImageIcon icon; icon = new ImageIcon(img.getSubimage(source.x, source.y, d.width, d.height)); if (!toggle) button = new JButton(action); else button = new JToggleButton(action); button.setIcon(icon); button.setText(null); if (active != null) { icon = new ImageIcon(img.getSubimage(source.x + active.x, source.y + active.y, d.width, d.height)); if (!toggle) button.setPressedIcon(icon); else button.setSelectedIcon(icon); } if (over != null) { icon = new ImageIcon(img.getSubimage(source.x + over.x, source.y + over.y, d.width, d.height)); button.setRolloverIcon(icon); } if (disabled != null) { icon = new ImageIcon(img.getSubimage(source.x + disabled.x, source.y + disabled.y, d.width, d.height)); button.setDisabledIcon(icon); } button.setFocusPainted(false); button.setBorderPainted(false); button.setBorder(new EmptyBorder(0, 0, 0, 0)); button.setContentAreaFilled(false); button.setMargin(new Insets(0, 0, 0, 0)); } else { button = new JButton(action); } button.setPreferredSize(buttonsRect[buttonId].getSize()); button.setVisible(true); if (toggle) { Object o = action.getValue(AbstractAction.DEFAULT); button.setSelected(o != null && o.equals(Boolean.FALSE)); action.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { if (evt.getPropertyName().equals("selected")) { button.setSelected(evt.getNewValue().equals(Boolean.FALSE)); } } }); } add(button); return button; } Point translatePoint(Point pt) { Rectangle bounds = getBounds(); Dimension extra = new Dimension(bounds.width - frame.width, bounds.height - frame.height); Point result = new Point(pt); if (pt.x > rightSlicer) result.x += extra.width; if (pt.y > bottomSlicer) result.y += extra.height; return result; } Rectangle translateRect(Rectangle r) { Rectangle bounds = getBounds(); Dimension extra = new Dimension(bounds.width - frame.width, bounds.height - frame.height); Rectangle result = new Rectangle(r.x, r.y, r.width, r.height); if (r.x > rightSlicer) { result.x += extra.width; } else { if (r.x + r.width > leftSlicer) result.width += extra.width; } if (r.y > bottomSlicer) { result.y += extra.height; } else { if (r.y + r.height > topSlicer) result.height += extra.height; } return result; } @Override public void setProgressMax(int max) { super.setProgressMax(max); if (progressBar != null) progressBar.setMaximum(max); } @Override public void setProgressValue(int value) { super.setProgressValue(value); if (progressBar != null) { progressBar.setValue(value); if (!progressBar.isVisible() && (System.currentTimeMillis() - progressStartTime) >= DEFAULT_PROGRESS_WAKE_ON) progressBar.setVisible(true); } } @Override public void endProgress() { super.endProgress(); if (progressBar != null && hideProgressBar == true) progressBar.setVisible(false); } } src/core/edu/xtec/jclic/skins/Skin.java000066400000000000000000000355211335566474600203300ustar00rootroot00000000000000/* * File : Skin.java * Created : 11-oct-2001 16:09 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.skins; import edu.xtec.jclic.*; import edu.xtec.jclic.boxes.*; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.util.*; import java.awt.*; import java.awt.event.*; import java.io.InputStream; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import javax.swing.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public abstract class Skin extends JPanel implements ProgressInputStream.ProgressInputStreamListener { public static final int DEFAULT_PROGRESS_WAKE_ON = 1000; public static final String RESOURCE_FOLDER = "skins"; public static final String RESOURCE_LIST_FILE = "listskins.properties"; public static final int MAIN = 0, AUX = 1, MEM = 2, NUM_MSG_AREAS = 3; public static final String[] msgAreaNames = { "main", "aux", "mem" }; public String name; public String fileName; protected AbstractButton[] buttons = new AbstractButton[Constants.NUM_ACTIONS]; protected Counter[] counters = new Counter[Constants.NUM_COUNTERS]; protected ActiveBox[] msgArea = new ActiveBox[NUM_MSG_AREAS]; protected Component player; protected PlayStation ps; protected ActiveBox msgBox; long mem; private static int waitCursorCount; protected boolean readyToPaint; public JDialog currentHelpWindow, currentAboutWindow; protected int progressMax, progress; protected boolean hasProgress, progressActive; protected long progressStartTime = 0L; protected static HashSet skinStack = new HashSet(); /** Creates new Skin */ protected Skin() { super(); name = null; fileName = null; setEnabled(false); readyToPaint = false; setLayout(null); player = null; ps = null; currentHelpWindow = null; currentAboutWindow = null; progress = 0; progressMax = 100; progressActive = false; hasProgress = false; skinStack.add(this); enableEvents(AWTEvent.MOUSE_EVENT_MASK); } public void emptySkinStack() { skinStack = new HashSet(); } public void attach(Component setPlayer) { if (player != null) detach(); player = setPlayer; add(player); /* * if(player instanceof ActionListener) for(int i=0; i getActiveBoxes() { ArrayList v = new ArrayList(); if (msgBox != null) v.add(msgBox); return v.iterator(); } public void setProgressMax(int max) { progressMax = max; } public void setProgressValue(int value) { progress = value; } public void setProgressName(String name) { setSystemMessage(null, name == null ? null : ps.getMsg("LOADING_FILE") + " " + FileSystem.getFileNameOf(name)); } public void startProgress(String name) { progressStartTime = System.currentTimeMillis(); setProgressValue(0); progressActive = true; } public void endProgress() { progressActive = false; } public InputStream getProgressInputStream(InputStream is, int expectedLength, String fName) { InputStream result; if (hasProgress && !progressActive) { ProgressInputStream pi = new ProgressInputStream(is, expectedLength, fName); pi.addProgressInputStreamListener(this); result = pi; } else { result = is; } return result; } public ActiveBox getMsgBox() { return msgBox; } public Counter getCounter(int counterId) { return ((counterId < 0 || counterId >= Constants.NUM_COUNTERS) ? null : counters[counterId]); } public void enableCounter(int counterId, boolean bEnabled) { Counter counter = getCounter(counterId); if (counter != null) counter.setEnabled(bEnabled); } public void resetAllCounters(boolean bEnabled) { for (int i = 0; i < Constants.NUM_COUNTERS; i++) if (counters[i] != null) { counters[i].setValue(0); counters[i].setCountDown(0); counters[i].setEnabled(bEnabled); } } public AbstractButton getButton(int buttonId) { return ((buttonId < 0 || buttonId >= Constants.NUM_ACTIONS) ? null : buttons[buttonId]); } /* * public void enableButton(int buttonId, boolean state){ AbstractButton * button=getButton(buttonId); if(button!=null) button.setEnabled(state); } */ public Object[] getCurrentSettings() { Object[] settings = new Object[4]; settings[0] = buttons; settings[1] = msgBox; settings[2] = counters; settings[3] = new Integer(waitCursorCount); return settings; } public void setCurrentSettings(Object[] settings) { if (settings.length > 0 && settings[0] != null) { AbstractButton[] buttonSettings = (AbstractButton[]) settings[0]; for (int i = 0; i < Constants.NUM_ACTIONS; i++) { if (i < buttonSettings.length && buttonSettings[i] != null && buttons[i] != null) { buttons[i].setVisible(buttonSettings[i].isVisible()); } } } if (settings.length > 1 && settings[1] != null && msgBox != null) { ActiveBox abSettings = (ActiveBox) settings[1]; msgBox.copyContent(abSettings); msgBox.setBoxBase((abSettings.getBoxBaseResolve())); } if (settings.length > 2 && settings[2] != null && counters != null) { Counter[] counterSettings = (Counter[]) settings[2]; for (int i = 0; i < Constants.NUM_COUNTERS; i++) { if (i < counterSettings.length && counterSettings[i] != null && counters[i] != null) { counters[i].setEnabled(counterSettings[i].isEnabled()); counters[i].setValue(counterSettings[i].getValue()); } } } if (settings.length > 3 && settings[3] != null) { waitCursorCount = ((Integer) settings[3]).intValue(); setWaitCursor(); } } protected void drawSlicedFrame(Graphics g, Rectangle dest, Rectangle source, Image img, int leftSlicer, int rightSlicer, int topSlicer, int bottomSlicer) { Rectangle rs = new Rectangle(); Rectangle rd = new Rectangle(); // first row rs.setBounds(source.x, source.y, leftSlicer, topSlicer); rd.setBounds(dest.x, dest.y, rs.width, rs.height); Utils.drawImage(g, img, rd, rs, this); rs.x += leftSlicer; rs.width = rightSlicer - leftSlicer; rd.x += leftSlicer; rd.width = dest.width - leftSlicer - (source.width - rightSlicer); Utils.tileImage(g, img, rd, rs, this); rs.x = source.x + rightSlicer; rs.width = source.width - rightSlicer; rd.x = dest.x + dest.width - (source.width - rightSlicer); rd.width = rs.width; Utils.drawImage(g, img, rd, rs, this); // second row rs.setBounds(source.x, source.y + topSlicer, leftSlicer, bottomSlicer - topSlicer); rd.setBounds(dest.x, dest.y + topSlicer, leftSlicer, dest.height - topSlicer - (source.height - bottomSlicer)); Utils.tileImage(g, img, rd, rs, this); rs.x += leftSlicer; rs.width = rightSlicer - leftSlicer; rd.x += leftSlicer; rd.width = dest.width - leftSlicer - (source.width - rightSlicer); Utils.tileImage(g, img, rd, rs, this); rs.x = source.x + rightSlicer; rs.width = source.width - rightSlicer; rd.x = dest.x + dest.width - (source.width - rightSlicer); rd.width = rs.width; Utils.tileImage(g, img, rd, rs, this); // third row rs.setBounds(source.x, source.y + bottomSlicer, leftSlicer, source.height - bottomSlicer); rd.setBounds(dest.x, dest.y + dest.height - (source.height - bottomSlicer), rs.width, rs.height); Utils.drawImage(g, img, rd, rs, this); rs.x += leftSlicer; rs.width = rightSlicer - leftSlicer; rd.x += leftSlicer; rd.width = dest.width - leftSlicer - (source.width - rightSlicer); Utils.tileImage(g, img, rd, rs, this); rs.x = source.x + rightSlicer; rs.width = source.width - rightSlicer; rd.x = dest.x + dest.width - (source.width - rightSlicer); rd.width = rs.width; Utils.drawImage(g, img, rd, rs, this); } public boolean hasMemMonitor() { return msgArea[MEM] != null; } public void setMem(long newMem) { mem = newMem; if (msgArea[MEM] != null) { String s = new StringBuilder(Long.toString(mem / 1000)).append(" Kb").substring(0); msgArea[MEM].setTextContent(s); } } public void setSystemMessage(String msg1, String msg2) { if (/* !isEnabled() || */ !isVisible()) return; if (msgArea[MAIN] != null && msg1 != null) { msgArea[MAIN].setTextContent(msg1); } if (msgArea[AUX] != null) { msgArea[AUX].setTextContent(msg2 == null ? "" : msg2); } } public void startAnimation() { } public void stopAnimation() { } public void setWaitCursor(boolean status) { if (status) { waitCursorCount++; } else { waitCursorCount--; if (waitCursorCount < 0) { waitCursorCount = 0; } } setWaitCursor(); } public void setWaitCursor() { setCursor( waitCursorCount > 0 ? Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR) : /* Cursor.getDefaultCursor() */ null); } public void showHelp(JComponent solution, String msg) { currentHelpWindow = new HelpWindow(this, solution, msg); currentHelpWindow.setVisible(true); currentHelpWindow = null; requestFocus(); } class HelpWindow extends ExtendedJDialog { HelpWindow(Component parent, JComponent solution, String msg) { super(parent, ps.getMsg("help_window_caption"), true); getContentPane().setLayout(new BorderLayout()); if (solution != null) getContentPane().add(solution, BorderLayout.CENTER); else { JLabel lb = new JLabel(msg == null || msg.trim().length() == 0 ? "?" : msg.trim()); getContentPane().add(lb, BorderLayout.NORTH); } JButton btClose = new JButton(ps.getMsg("help_window_close_button"), ResourceManager.getImageIcon("icons/exit_small.gif")); btClose.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); } }); getContentPane().add(btClose, BorderLayout.SOUTH); pack(); Point p = null; if (solution != null) { p = (Point) solution.getClientProperty(HelpActivityComponent.PREFERRED_LOCATION); if (p != null) { p = new Point(p); int dx = (getWidth() - getContentPane().getWidth()) / 2; int dy = getHeight() - getContentPane().getHeight() - dx; p.translate(-dx, -dy); } } if (p == null) p = parent.getLocationOnScreen(); setLocation(p); } } public AboutWindow buildAboutWindow() { return new AboutWindow(this, ps, new Dimension(500, 400)); } public void showAboutWindow(AboutWindow aw) { currentAboutWindow = aw; currentAboutWindow.setVisible(true); currentAboutWindow = null; requestFocus(); } @Override public void requestFocus() { if (player != null) player.requestFocus(); } public static String[] getSystemSkinList(boolean withEmptyEntry) { ArrayList v = new ArrayList(); java.util.Properties prop = new java.util.Properties(); try { prop.load(ResourceManager.getResourceAsStream(RESOURCE_FOLDER + "/" + RESOURCE_LIST_FILE)); } catch (Exception e) { System.err.println( "Unable to open " + ResourceManager.RESOURCE_ROOT + RESOURCE_FOLDER + "/" + RESOURCE_LIST_FILE + ":\n" + e); } if (withEmptyEntry) v.add(""); for (java.util.Enumeration e = prop.propertyNames(); e.hasMoreElements();) { String key = (String) e.nextElement(); String value = "@" + prop.getProperty(key).trim(); v.add(value); } if (v.size() > 0) return (String[]) v.toArray(new String[v.size()]); else return new String[0]; } } src/core/edu/xtec/resources/000077500000000000000000000000001335566474600163525ustar00rootroot00000000000000src/core/edu/xtec/resources/about/000077500000000000000000000000001335566474600174645ustar00rootroot00000000000000src/core/edu/xtec/resources/about/about.html000066400000000000000000000013321335566474600214630ustar00rootroot00000000000000 JClic
").append(msg.get("report_not_finished")).td(false); html.tr(false); return html.toString(); } public void newAction(String type, String source, String dest, boolean ok) { if (!closed) { lastAction = new ActionReg(type, source, dest, ok); actions.add(lastAction); } } public ActionReg getActionReg(int index) { return index >= actions.size() ? null : actions.get(index); } public void closeActivity() { if (!closed) { if (lastAction != null) { totalTime = lastAction.time - startTime; } else { totalTime = System.currentTimeMillis() - startTime; } closed = true; } } public int getPrecision() { int result = 0; if (closed && minActions > 0 && numActions > 0) { if (solved) { if (numActions < minActions) result = 100; else result = (minActions * 100) / numActions; } else { result = 100 * (score * score) / (minActions * numActions); } } return result; } public void endActivity(int setScore, int setNumActions, boolean isSolved) { if (!closed) { solved = isSolved; numActions = setNumActions; score = setScore; closeActivity(); } } @Override public String toString() { StringBuilder result = new StringBuilder("ACTIVITY: "); result.append(name); return result.substring(0); } } src/core/edu/xtec/jclic/report/BasicJDBCBridge.java000066400000000000000000000465101335566474600223710ustar00rootroot00000000000000/* * File : BasicJDBCBridge.java * Created : 16-jul-2001 19:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.util.StrUtils; import edu.xtec.util.db.ConnectionBean; import edu.xtec.util.db.ConnectionBeanProvider; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.23 */ public class BasicJDBCBridge extends Object { public static final String DEFAULT_ODBC_BRIDGE = "sun.jdbc.odbc.JdbcOdbcDriver"; public static final String DEFAULT_DB = "jdbc:odbc:JClicUserReports"; public static final String TABLE_PREFIX_KEY = "tablePrefix"; public static final String CREATE_TABLES_KEY = "createTables"; public static final String TRUST_CLIENT_DATETIME = "trustClientDateTime"; public static final int OTHER = 0; public static final int MYSQL = 1; public static final int ORACLE = 2; public static final int ACCESS = 3; protected String driver; protected String url; public String DBMSName; public int DBMSType; protected ConnectionBeanProvider cbp; protected boolean createTables; protected String tablePrefix; /** Creates new BasicJDBCBridge */ public BasicJDBCBridge(ConnectionBeanProvider cbp, boolean createTables, String tablePrefix) throws Exception { this.cbp = cbp; this.createTables = createTables; this.tablePrefix = (tablePrefix == null ? "" : tablePrefix); if (createTables) checkTables(); } public String getTableName(String tableName) { return getTableName(tableName, null); } public String getTableName(String tableName, String alias) { StringBuilder result = new StringBuilder(); if (tablePrefix != null && tablePrefix.length() > 0) result.append(tablePrefix); result.append(tableName); if (alias != null) result.append(" ").append(alias); return result.substring(0); } public ConnectionBeanProvider getConnectionBeanProvider() { return cbp; } public static final Object[][] TABLE_DEFS = { { "SETTINGS", new String[] { "SETTING_KEY VARCHAR(255) NOT NULL", "SETTING_VALUE VARCHAR(255)", "PRIMARY KEY (SETTING_KEY)" } }, { "GROUPS", new String[] { "GROUP_ID VARCHAR(50) NOT NULL", "GROUP_NAME VARCHAR(80) NOT NULL", "GROUP_DESCRIPTION VARCHAR(255)", "GROUP_ICON VARCHAR(255)", "GROUP_CODE VARCHAR(50)", "GROUP_KEYWORDS VARCHAR(255)", "PRIMARY KEY (GROUP_ID)" } }, { "USERS", new String[] { "USER_ID VARCHAR(50) NOT NULL", "GROUP_ID VARCHAR(50) NOT NULL", "USER_NAME VARCHAR(80) NOT NULL", "USER_PWD VARCHAR(255)", "USER_ICON VARCHAR(255)", "USER_CODE VARCHAR(50)", "USER_KEYWORDS VARCHAR(255)", "PRIMARY KEY (USER_ID)" } }, { "SESSIONS", new String[] { "SESSION_ID VARCHAR(50) NOT NULL", "USER_ID VARCHAR(50) NOT NULL", "SESSION_DATETIME TIMESTAMP NOT NULL", "PROJECT_NAME VARCHAR(100) NOT NULL", "SESSION_KEY VARCHAR(50)", "SESSION_CODE VARCHAR(50)", "SESSION_CONTEXT VARCHAR(50)", "PRIMARY KEY (SESSION_ID)" } }, { "ACTIVITIES", new String[] { "SESSION_ID VARCHAR(50) NOT NULL", "ACTIVITY_ID INTEGER(5) NOT NULL", "ACTIVITY_NAME VARCHAR(50) NOT NULL", "NUM_ACTIONS INTEGER(4)", "SCORE INTEGER(4)", "ACTIVITY_SOLVED INTEGER(1)", "QUALIFICATION INTEGER(3)", "TOTAL_TIME INTEGER(5)", "ACTIVITY_CODE VARCHAR(50)", "PRIMARY KEY (SESSION_ID,ACTIVITY_ID)" } }, { "ACTIONS", new String[] { "SESSION_ID VARCHAR(50) NOT NULL", "ACTIVITY_ID INTEGER(5) NOT NULL", "ACTION_ID INTEGER(4) NOT NULL", "ACTION_TYPE VARCHAR(20) NOT NULL", "ACTION_SOURCE VARCHAR(255)", "ACTION_DEST VARCHAR(255)", "ACTION_OK INTEGER(1)", "PRIMARY KEY (SESSION_ID,ACTIVITY_ID,ACTION_ID)" } } }; public static final String[][] DEFAULT_SETTINGS = { { "ALLOW_CREATE_GROUPS", "false" }, { "ALLOW_CREATE_USERS", "false" }, { "SHOW_GROUP_LIST", "true" }, { "SHOW_USER_LIST", "true" }, { "USER_TABLES", "true" }, { "TIME_LAP", "10" } }; protected void checkTables() throws Exception { Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); try { Connection con = cb.getConnection(); java.sql.DatabaseMetaData dbmd = con.getMetaData(); DBMSName = dbmd.getDatabaseProductName(); if (DBMSName != null) { DBMSName = DBMSName.toLowerCase(); if (DBMSName.indexOf("oracle") >= 0) DBMSType = ORACLE; else if (DBMSName.indexOf("mysql") >= 0) DBMSType = MYSQL; else if (DBMSName.indexOf("access") >= 0) DBMSType = ACCESS; else DBMSType = OTHER; } for (int i = 0; i < TABLE_DEFS.length; i++) { String tName = getTableName((String) TABLE_DEFS[i][0]); ResultSet rsx = dbmd.getTables(null, null, tName, null); boolean tableExists = rsx.next(); rsx.close(); if (!tableExists) { Statement stmt = con.createStatement(); StringBuilder sb = new StringBuilder("CREATE TABLE "); sb.append(tName).append("("); String[] fields = (String[]) TABLE_DEFS[i][1]; for (String sf : fields) { if (DBMSType == ACCESS) { // Change INTEGER(x) for INTEGER int intP = sf.indexOf("INTEGER("); if (intP > 0) { int intP2 = sf.indexOf(')', intP); sf = sf.substring(0, intP + 7) + (intP2 > 0 && sf.length() > intP2 + 1 ? sf.substring(intP2 + 1) : ""); } } else if (DBMSType == ORACLE) { // Change TIMESTAMP for DATE int intP = sf.indexOf("TIMESTAMP"); if (intP > 0) { sf = sf.substring(0, intP) + "DATE" + (sf.length() > intP + 9 ? sf.substring(intP + 9) : ""); } intP = sf.indexOf("INTEGER"); if (intP > 0) { sf = sf.substring(0, intP) + "NUMBER" + sf.substring(intP + 7); } } sb.append(sf).append(","); } sb.deleteCharAt(sb.length() - 1); sb.append(")"); stmt.executeUpdate(sb.substring(0)); if (i == 0) { for (String[] setting : DEFAULT_SETTINGS) { sb.setLength(0); sb.append("INSERT INTO ").append(tName).append(" VALUES(").append("'").append(setting[0]).append("','") .append(setting[1]).append("')"); stmt.executeUpdate(sb.substring(0)); } } stmt.close(); } } } catch (Exception e) { ex = e; } finally { cbp.freeConnectionBean(cb); if (ex != null) throw ex; } } public void end() { if (cbp != null) ConnectionBeanProvider.freeConnectionBeanProvider(cbp); cbp = null; } @Override protected void finalize() throws Throwable { end(); super.finalize(); } public String getProperty(String key, String defaultValue) throws Exception { String result = defaultValue; Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement("SELECT SETTING_VALUE FROM " + getTableName("SETTINGS") + " WHERE SETTING_KEY=?"); stmt.setString(1, key); ResultSet rs = stmt.executeQuery(); if (rs.next()) result = trimStr(rs.getString(1)); rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return result; } public Map getProperties() throws Exception { Map result = new HashMap(); Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement("SELECT * FROM " + getTableName("SETTINGS")); ResultSet rs = stmt.executeQuery(); while (rs.next()) { result.put(rs.getString("SETTING_KEY"), rs.getString("SETTING_VALUE")); } rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return result; } public List getGroups() throws Exception { ArrayList result = new ArrayList(); Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement( "SELECT GROUP_ID,GROUP_NAME,GROUP_ICON,GROUP_DESCRIPTION" + " FROM " + getTableName("GROUPS")); ResultSet rs = stmt.executeQuery(); while (rs.next()) { String[] s = new String[4]; for (int i = 0; i < 3; i++) { s[i] = trimStr(rs.getString(i + 1)); } result.add(new GroupData(s[0], s[1], s[2], s[3])); } rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return result; } public List getUsers(String groupId) throws Exception { ArrayList result = new ArrayList(); Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { StringBuilder sb = new StringBuilder("SELECT USER_NAME,USER_ICON,USER_ID,USER_PWD,GROUP_ID"); sb.append(" FROM ").append(getTableName("USERS")); if (groupId != null) sb.append(" WHERE GROUP_ID=?"); stmt = cb.getPreparedStatement(sb.substring(0)); if (groupId != null) stmt.setString(1, groupId); ResultSet rs = stmt.executeQuery(); while (rs.next()) { String[] s = new String[5]; for (int i = 0; i < 5; i++) { s[i] = trimStr(rs.getString(i + 1)); } result.add(new UserData(s[2], s[0], s[1], s[3], s[4])); } rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw (ex); } return result; } public UserData getUserData(String userId) throws Exception { UserData result = null; Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement("SELECT *" + " FROM " + getTableName("USERS") + " WHERE USER_ID=?"); stmt.setString(1, userId); ResultSet rs = stmt.executeQuery(); if (rs.next()) { result = new UserData(trimStr(rs.getString("USER_ID")), trimStr(rs.getString("USER_NAME")), trimStr(rs.getString("USER_ICON")), trimStr(rs.getString("USER_PWD")), trimStr(rs.getString("GROUP_ID"))); } rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw (ex); } return result; } public GroupData getGroupData(String groupId) throws Exception { GroupData result = null; Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement("SELECT *" + " FROM " + getTableName("GROUPS") + " WHERE GROUP_ID=?"); stmt.setString(1, groupId); ResultSet rs = stmt.executeQuery(); if (rs.next()) { result = new GroupData(trimStr(rs.getString("GROUP_ID")), trimStr(rs.getString("GROUP_NAME")), trimStr(rs.getString("GROUP_ICON")), trimStr(rs.getString("GROUP_DESCRIPTION"))); } rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return result; } public String addSession(String userId, long time, String projectName, String sessionCode, String sessionKey, String sessionContext) throws Exception { String sessionId = null; Exception ex = null; if (userId == null) throw new Exception("Invalid UserId"); if (projectName == null) throw new Exception("Invalid ProjectName"); sessionId = StrUtils.limitStrLen(userId, 36).concat("_").concat(Long.toString(time)); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement("INSERT INTO " + getTableName("SESSIONS") + " (SESSION_ID,USER_ID,SESSION_DATETIME,PROJECT_NAME,SESSION_KEY,SESSION_CODE,SESSION_CONTEXT)" + " VALUES(?,?,?,?,?,?,?)"); stmt.setString(1, sessionId); stmt.setString(2, userId); stmt.setTimestamp(3, new Timestamp(time)); stmt.setString(4, StrUtils.limitStrLen(projectName, 100)); stmt.setString(5, StrUtils.limitStrLen(sessionKey, 50)); stmt.setString(6, StrUtils.limitStrLen(sessionCode, 50)); stmt.setString(7, StrUtils.limitStrLen(sessionContext, 50)); stmt.executeUpdate(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return sessionId; } public int addActivity(int activityId, String sessionId, ActivityReg ar) throws Exception { return addActivity(activityId, sessionId, ar.name, ar.numActions, ar.score, ar.solved, ar.getPrecision(), (int) (ar.totalTime / 1000), ar.code); } public int addActivity(int activityId, String sessionId, String name, int actions, int score, boolean solved, int precision, int time, String activityCode) throws Exception { if (sessionId == null) throw new Exception("Invalid sessionId"); if (name == null) throw new Exception("Invalid activity name"); int actId = activityId; Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement("INSERT INTO " + getTableName("ACTIVITIES") + " (SESSION_ID,ACTIVITY_ID,ACTIVITY_NAME,NUM_ACTIONS,SCORE,ACTIVITY_SOLVED,QUALIFICATION,TOTAL_TIME,ACTIVITY_CODE)" + " VALUES(?,?,?,?,?,?,?,?,?)"); stmt.setString(1, sessionId); stmt.setInt(2, activityId); stmt.setString(3, StrUtils.limitStrLen(name, 50)); stmt.setInt(4, actions); stmt.setInt(5, score); stmt.setInt(6, solved ? 1 : 0); stmt.setInt(7, precision); stmt.setInt(8, time); stmt.setString(9, StrUtils.limitStrLen(activityCode, 50)); stmt.executeUpdate(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return actId; } public int addAction(int activityId, String sessionId, int actionId, ActionReg actReg) throws Exception { return addAction(activityId, sessionId, actionId, actReg.type, actReg.source, actReg.dest, actReg.isOk); } public int addAction(int activityId, String sessionId, int actionId, String type, String source, String dest, boolean isOk) throws Exception { if (sessionId == null) throw new Exception("Invalid sessionId"); if (type == null) throw new Exception("Invalid action type"); int actId = actionId; Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement("INSERT INTO " + getTableName("ACTIONS") + " (SESSION_ID,ACTIVITY_ID,ACTION_ID,ACTION_TYPE,ACTION_SOURCE,ACTION_DEST,ACTION_OK)" + " VALUES(?,?,?,?,?,?,?)"); stmt.setString(1, sessionId); stmt.setInt(2, activityId); stmt.setInt(3, actionId); stmt.setString(4, type); stmt.setString(5, StrUtils.limitStrLen(source, 255)); stmt.setString(6, StrUtils.limitStrLen(dest, 255)); stmt.setInt(7, isOk ? 1 : 0); stmt.executeUpdate(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return actId; } public String newGroup(GroupData gd) throws Exception { Exception ex = null; StringBuilder sb = new StringBuilder("INSERT INTO " + getTableName("GROUPS") + " (GROUP_ID,GROUP_NAME"); int n = 0; if (gd.hasIcon()) { sb.append(",GROUP_ICON"); n++; } if (gd.description != null && gd.description.length() > 0) { sb.append(",GROUP_DESCRIPTION"); n++; } sb.append(") VALUES(?,?"); for (int i = 0; i < n; i++) sb.append(",?"); sb.append(")"); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement(sb.substring(0)); n = 1; stmt.setString(n++, StrUtils.limitStrLen(gd.getId(), 50)); stmt.setString(n++, StrUtils.limitStrLen(gd.getText(), 80)); if (gd.hasIcon()) stmt.setString(n++, StrUtils.limitStrLen(gd.getIconUrl(), 255)); if (gd.description != null && gd.description.length() > 0) stmt.setString(n++, StrUtils.limitStrLen(gd.description, 255)); stmt.executeUpdate(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return gd.getId(); } public String newUser(UserData ud) throws Exception { Exception ex = null; StringBuilder sb = new StringBuilder("INSERT INTO " + getTableName("USERS") + " (GROUP_ID,USER_ID,USER_NAME"); int n = 0; if (ud.hasIcon()) { sb.append(",USER_ICON"); n++; } if (ud.pwd != null && ud.pwd.length() > 0) { sb.append(",USER_PWD"); n++; } sb.append(") VALUES(?,?,?"); for (int i = 0; i < n; i++) sb.append(",?"); sb.append(")"); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement(sb.substring(0)); n = 1; stmt.setString(n++, ud.groupId); stmt.setString(n++, StrUtils.limitStrLen(ud.getId(), 50)); stmt.setString(n++, StrUtils.limitStrLen(ud.getText(), 80)); if (ud.hasIcon()) stmt.setString(n++, StrUtils.limitStrLen(ud.getIconUrl(), 255)); if (ud.pwd != null && ud.pwd.length() > 0) stmt.setString(n++, StrUtils.limitStrLen(ud.pwd, 255)); stmt.executeUpdate(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return ud.getId(); } public static String trimStr(String s) { String result = s; if (result != null) result = result.trim(); return result; } } src/core/edu/xtec/jclic/report/GroupData.java000066400000000000000000000043161335566474600214740ustar00rootroot00000000000000/* * File : GroupData.java * Created : 17-feb-2003 9:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.util.CompoundObject; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; /** @author Francesc Busquets (fbusquets@xtec.cat) */ public class GroupData extends CompoundObject implements Domable { public String description; /** Creates a new instance of GroupData */ public GroupData(String id, String name, String iconUrl, String description) { super(id, name, iconUrl); this.description = description; } public GroupData(org.jdom.Element e) throws Exception { setProperties(e, null); } public static final String ELEMENT_NAME = "group"; public static final String ID = "id", NAME = "name", ICON = "icon", DESCRIPTION = "description"; public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); JDomUtility.setStringAttr(e, ID, id, false); JDomUtility.setStringAttr(e, NAME, text, false); JDomUtility.setStringAttr(e, ICON, iconUrl, false); JDomUtility.setStringAttr(e, DESCRIPTION, description, false); return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); id = JDomUtility.getStringAttr(e, ID, null, false); text = JDomUtility.getStringAttr(e, NAME, null, false); iconUrl = JDomUtility.getStringAttr(e, ICON, null, false); description = JDomUtility.getStringAttr(e, DESCRIPTION, null, false); } } src/core/edu/xtec/jclic/report/JDBCReporter.java000066400000000000000000000141651335566474600220360ustar00rootroot00000000000000/* * File : JDBCReporter.java * Created : 12-jul-2001 18:56 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.jclic.Activity; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Messages; import edu.xtec.util.db.ConnectionBeanProvider; import java.awt.Component; import java.util.HashMap; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.13 */ public class JDBCReporter extends Reporter { protected String currentSessionId; protected int actCount; protected ActivityReg lastActivity; protected BasicJDBCBridge bridge; public static final String DRIVER = "driver", URL = "url", SYSTEM_USER = "system_user", SYSTEM_PWD = "system_pwd"; /** Creates new ODBCReporter */ public JDBCReporter() { super(); bridge = null; currentSessionId = null; lastActivity = null; actCount = 0; } @Override public void end() { super.end(); reportActivity(); if (bridge != null) { bridge.end(); bridge = null; } } @Override public void init(HashMap properties, Component parent, Messages msg) throws Exception { super.init(properties, parent, msg); boolean success = false; try { bridge = null; String driver = (String) properties.get(DRIVER); String url = (String) properties.get(URL); description = "JDBC " + url; String system_user = (String) properties.get(SYSTEM_USER); String system_pwd = (String) properties.get(SYSTEM_PWD); String tablePrefix = (String) properties.get(BasicJDBCBridge.TABLE_PREFIX_KEY); boolean createTables = !"false".equalsIgnoreCase((String) properties.get(BasicJDBCBridge.CREATE_TABLES_KEY)); ConnectionBeanProvider cbp = ConnectionBeanProvider.getConnectionBeanProvider(false, driver, url, system_user, system_pwd, true); bridge = new BasicJDBCBridge(cbp, createTables, tablePrefix); if (userId == null) userId = promptUserId(parent, msg); if (userId == null) success = true; } catch (Exception ex) { msg.showErrorWarning(parent, "report_err_init", description, ex, null); } if (!success) { if (bridge != null) { bridge.end(); bridge = null; } description = description + " (" + msg.get("report_not_connected") + ")"; initiated = false; } } @Override public String getProperty(String key, String defaultValue) throws Exception { checkBridge(); return bridge.getProperty(key, defaultValue); } @Override public List getGroups() throws Exception { checkBridge(); return bridge.getGroups(); } @Override public List getUsers(String groupId) throws Exception { checkBridge(); return bridge.getUsers(groupId); } @Override public String newGroup(GroupData gd) throws Exception { checkBridge(); return bridge.newGroup(gd); } @Override public String newUser(UserData ud) throws Exception { checkBridge(); return bridge.newUser(ud); } @Override public UserData getUserData(String userId) throws Exception { checkBridge(); return bridge.getUserData(userId); } @Override public GroupData getGroupData(String groupId) throws Exception { checkBridge(); return bridge.getGroupData(groupId); } protected void checkBridge() throws Exception { if (bridge == null) throw new Exception("Not connected!"); } @Override public void newSession(JClicProject jcp, Component parent, Messages msg) { super.newSession(jcp, parent, msg); if (bridge == null || userId == null) return; reportActivity(); currentSessionId = null; } public void createDBSession() { if (bridge == null || userId == null) return; try { actCount = 0; currentSessionId = bridge.addSession(userId, currentSession.timeMillis, currentSession.projectName, currentSession.code, sessionKey, sessionContext); } catch (Exception ex) { currentSessionId = null; bridge.end(); bridge = null; initiated = false; System.err.println("Error creating report of session:\n" + ex); } } protected void reportActivity() { if (lastActivity != null && bridge != null) { if (!lastActivity.closed) lastActivity.closeActivity(); if (currentSessionId == null) createDBSession(); if (currentSessionId != null) { try { int actId; ActionReg ar; actId = bridge.addActivity(actCount++, currentSessionId, lastActivity.name, lastActivity.numActions, lastActivity.score, lastActivity.solved, lastActivity.getPrecision(), (int) (lastActivity.totalTime / 1000), lastActivity.code); for (int arc = 0; (ar = lastActivity.getActionReg(arc)) != null; arc++) bridge.addAction(actId, currentSessionId, arc, ar.type, ar.source, ar.dest, ar.isOk); } catch (Exception ex) { bridge.end(); bridge = null; initiated = false; System.err.println("Error reporting activity:\n" + ex); } } } if (currentSession != null && currentSession.currentSequence != null && currentSession.currentSequence.currentActivity != lastActivity) { lastActivity = currentSession.currentSequence.currentActivity; } else lastActivity = null; } @Override public void newActivity(Activity act) { super.newActivity(act); reportActivity(); } } src/core/edu/xtec/jclic/report/Reporter.java000066400000000000000000000452101335566474600214060ustar00rootroot00000000000000/* * File : Reporter.java * Created : 09-jul-2001 17:04 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.jclic.Activity; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.project.JClicProject; import edu.xtec.jclic.report.SessionReg.Info; import edu.xtec.util.CompoundListCellRenderer; import edu.xtec.util.Encryption; import edu.xtec.util.Html; import edu.xtec.util.JDomUtility; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JPasswordField; import javax.swing.JScrollPane; import javax.swing.JTextField; /** * This class implements the basic operations related with the process of the * results obtained by users playing JClic activities. These operations include * users identification, compilation of data coming from the activities, storage * of this data for a posterior use and presentation of summarized results. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class Reporter extends Object { String userId; String sessionKey; String sessionContext; String groupCodeFilter; String userCodeFilter; String description; Date started; List sessions; SessionReg currentSession; /** * true if the system was successfully initiated, false otherwise */ public boolean initiated; /** * true when the system is connected to a database with user's data. When * false, a generic user id will be used. */ protected Boolean bUserBased; public static final String ALLOW_CREATE_GROUPS = "ALLOW_CREATE_GROUPS", ALLOW_CREATE_USERS = "ALLOW_CREATE_USERS", SHOW_GROUP_LIST = "SHOW_GROUP_LIST", SHOW_USER_LIST = "SHOW_USER_LIST", USER_TABLES = "USER_TABLES", TIME_LAP = "TIME_LAP"; /** Creates new Reporter */ public Reporter() { sessions = new CopyOnWriteArrayList(); started = new Date(); initiated = false; } /** * Method use to retrieve specific properties of the reports system * * @param key Property key * @param defaultValue Default value for this key * @throws Exception Throwed when the system was unable to read the specified * property * @return The value related to this property */ public String getProperty(String key, String defaultValue) throws Exception { return defaultValue; } /** * Retrieves boolean properties of the reports system * * @param key * @param defaultValue * @throws Exception * @return */ public boolean getBooleanProperty(String key, boolean defaultValue) throws Exception { String s = getProperty(key, new Boolean(defaultValue).toString()); return key == null ? defaultValue : Boolean.valueOf(s).booleanValue(); } public List getGroups() throws Exception { return null; } public List getUsers(String groupId) throws Exception { return null; } public UserData getUserData(String userId) throws Exception { return null; } public GroupData getGroupData(String groupId) throws Exception { return null; } public boolean userBased() throws Exception { if (bUserBased == null) bUserBased = getBooleanProperty(USER_TABLES, true); return bUserBased.booleanValue(); } protected GroupData promptForNewGroup(Component parent, Messages msg) throws Exception { JTextField gName = new JTextField(20); JTextField gId = new JTextField(20); JComponent[] jc = new JComponent[] { gName, gId }; String[] ps = new String[] { "report_name_prompt", "report_id_prompt" }; String name; String id; GroupData result = null; while (result == null) { boolean dlgResult = msg.showInputDlg(parent, new String[] { "report_new_group_data" }, ps, jc, "report_new_group"); if (!dlgResult) return null; name = StrUtils.nullableString(gName.getText()); id = StrUtils.nullableString(gId.getText()); if (id == null) msg.showAlert(parent, "report_err_bad_id"); else if (getGroupData(id) != null) msg.showAlert(parent, "report_err_duplicate_id"); else if (name == null) msg.showAlert(parent, "report_err_bad_name"); else { result = new GroupData(id, name, null, null); result.setId(newGroup(result)); } } return result; } protected UserData promptForNewUser(Component parent, Messages msg, String groupId) throws Exception { if (groupId == null) { groupId = promptGroupId(parent, msg); if (groupId == null) return null; } JTextField gName = new JTextField(20); JTextField gId = new JTextField(20); JPasswordField pwf1 = new JPasswordField(Messages.MAX_PASSWORD_LENGTH); JPasswordField pwf2 = new JPasswordField(Messages.MAX_PASSWORD_LENGTH); JComponent[] jc = new JComponent[] { gName, gId, pwf1, pwf2 }; String[] ps = new String[] { "report_name_prompt", "report_id_prompt", "report_pw_prompt", "report_pw_prompt_confirm" }; String name; String id; String pw; UserData result = null; while (result == null) { if (!msg.showInputDlg(parent, new String[] { "report_new_user_data" }, ps, jc, "report_new_user")) return null; name = StrUtils.nullableString(gName.getText()); id = StrUtils.nullableString(gId.getText()); pw = StrUtils.nullableString(String.copyValueOf(pwf1.getPassword())); boolean pwOk = true; if (pw != null) { pwOk = pw.equals(StrUtils.nullableString(String.copyValueOf(pwf2.getPassword()))); pw = Encryption.Encrypt(pw); } if (!pwOk) msg.showAlert(parent, "report_err_bad_pwd"); else if (id == null) msg.showAlert(parent, "report_err_bad_id"); else if (getUserData(id) != null) msg.showAlert(parent, "report_err_duplicate_id"); else if (name == null) msg.showAlert(parent, "report_err_bad_name"); else { result = new UserData(id, name, null, pw, groupId); result.setId(newUser(result)); } } return result; } protected String promptGroupId(Component parent, final Messages msg) throws Exception { String groupId = null; if (getGroups().isEmpty()) { String s = msg.get("report_generic_group_name"); newGroup(new GroupData(s, s, null, null)); if (getGroups().isEmpty()) return groupId; } final List vg = getGroups(); final JList list = new JList(); list.setCellRenderer(new CompoundListCellRenderer()); list.setListData(vg.toArray()); list.setSelectedValue(vg.get(0), false); JScrollPane listScroll = new JScrollPane(list); JComponent[] jc; if (getBooleanProperty(ALLOW_CREATE_GROUPS, false)) { JButton btn = new JButton(msg.get("report_new_group")); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Component cmp = null; if (evt.getSource() != null && evt.getSource() instanceof Component) cmp = (Component) evt.getSource(); try { GroupData gd = promptForNewGroup(cmp, msg); if (gd != null) { vg.add(gd); list.setListData(vg.toArray()); list.setSelectedValue(gd, true); } } catch (Exception ex) { msg.showErrorWarning(cmp, "report_err_creating_group", ex); } } }); jc = new JComponent[] { listScroll, btn }; } else { jc = new JComponent[] { listScroll }; } if (msg.showInputDlg(parent, new String[] { "report_grouplist_title" }, null, jc, "report_ident_user")) { GroupData gd = (GroupData) list.getSelectedValue(); if (gd != null) { groupId = gd.getId(); } } return groupId; } public String promptUserId(Component parent, final Messages msg) throws Exception { if (!userBased()) throw new Exception("No users defined in the database!"); boolean cancel = false; int tries = 0; while (userId == null && !cancel && tries++ < 3) { if (getBooleanProperty(SHOW_USER_LIST, true)) { String gi = null; if (getBooleanProperty(SHOW_GROUP_LIST, true)) { gi = promptGroupId(parent, msg); if (gi == null) return null; } final String groupId = gi; final List v = getUsers(groupId); boolean allow_create_users = getBooleanProperty(ALLOW_CREATE_USERS, false); if (v.isEmpty() && !allow_create_users) { msg.showErrorWarning(parent, groupId == null ? "report_err_no_users" : "report_err_no_users_in_group", null); break; } final JList list = new JList(); list.setCellRenderer(new CompoundListCellRenderer()); list.setListData(v.toArray()); if (!v.isEmpty()) list.setSelectedValue(v.get(0), false); JScrollPane listScroll = new JScrollPane(list); JComponent[] jc; if (allow_create_users) { JButton btn = new JButton(msg.get("report_new_user")); btn.setToolTipText(msg.get("report_new_user_tooltip")); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Component cmp = null; if (evt.getSource() != null && evt.getSource() instanceof Component) cmp = (Component) evt.getSource(); try { UserData ud = promptForNewUser(cmp, msg, groupId); if (ud != null) { v.add(ud); list.setListData(v.toArray()); list.setSelectedValue(ud, true); } } catch (Exception ex) { msg.showErrorWarning(cmp, "report_err_creating_user", ex); } } }); jc = new JComponent[] { listScroll, btn }; } else { jc = new JComponent[] { listScroll }; } if (!msg.showInputDlg(parent, new String[] { "report_userlist_title" }, null, jc, "report_ident_user")) break; UserData ud = (UserData) list.getSelectedValue(); if (ud == null) break; if (ud.pwd != null && ud.pwd.length() > 0) { String pwd = Encryption.Decrypt(ud.pwd); String inputPwd = msg.showInputDlg(parent, "report_user_has_pwd", "report_pw_prompt", null, "report_ident_user", true); if (pwd.equals(inputPwd)) userId = ud.getId(); else msg.showErrorWarning(parent, "report_err_invalid_user", null); } else userId = ud.getId(); } else { JTextField textField = new JTextField(); JPasswordField pwdField = new JPasswordField(Messages.MAX_PASSWORD_LENGTH); if (!msg.showInputDlg(parent, new String[] { "report_select_user" }, new String[] { "report_id_prompt", "report_pw_prompt" }, new JComponent[] { textField, pwdField }, "report_ident_user")) break; String s = StrUtils.nullableString(textField.getText()); if (s == null) break; UserData ud = getUserData(s); boolean userOk = false; if (ud != null) { String uPwd = StrUtils.nullableString(ud.pwd); if (uPwd == null || Encryption.Decrypt(uPwd).equals(String.copyValueOf(pwdField.getPassword()))) userOk = true; } if (!userOk) msg.showErrorWarning(parent, "report_err_invalid_user", null); else userId = ud == null ? "" : ud.getId(); } } return userId; } public String toHtmlString(Messages msg) { String prefix = "report_"; Html html = new Html(3000); Html tb; tb = new Html(3000); tb.doubleCell(msg.get(prefix + "started"), true, msg.getShortDateTimeStr(started), false); tb.doubleCell(msg.get(prefix + "system"), true, description == null ? msg.get(prefix + "system_standard") : description, false); if (userId != null) tb.doubleCell(msg.get(prefix + "user"), true, userId, false); int numSessions = 0; int numSequences = 0; int nActivities = 0; int nActSolved = 0; int nActScore = 0; int nActions = 0; int percentSolved = 0; long tScore = 0; long tTime = 0L; Iterator it = sessions.iterator(); while (it.hasNext()) { Info inf = it.next().getInfo(true); if (inf.numSequences > 0) { numSessions++; numSequences += inf.numSequences; if (inf.nActivities > 0) { nActivities += inf.nActivities; nActSolved += inf.nActSolved; nActions += inf.nActions; if (inf.nActScore > 0) { tScore += (inf.tScore * inf.nActScore); nActScore += inf.nActScore; } tTime += inf.tTime; } } } if (numSequences > 0) { if (numSessions > 1) tb.doubleCell(msg.get(prefix + "num_projects"), true, msg.getNumber(numSessions), false); tb.doubleCell(msg.get(prefix + "num_sequences"), true, msg.getNumber(numSequences), false); tb.doubleCell(msg.get(prefix + "num_activities"), true, msg.getNumber(nActivities), false); if (nActivities > 0) { tb.doubleCell(msg.get(prefix + "num_activities_solved"), true, msg.getNumber(nActSolved) + " (" + msg.getPercent(nActSolved * 100 / nActivities) + ")", false); if (nActScore > 0) tb.doubleCell(msg.get(prefix + "global_score"), true, msg.getPercent(tScore / nActScore), false); tb.doubleCell(msg.get(prefix + "total_time"), true, msg.getHmsTime(tTime), false); tb.doubleCell(msg.get(prefix + "num_actions"), true, msg.getNumber(nActions), false); } html.append(Html.table(tb.toString(), null, 0, 2, -1, null, false)).append(Html.NBSP); StringBuilder tbs = new StringBuilder(); it = sessions.iterator(); while (it.hasNext()) { SessionReg sr = it.next(); if (sr.getInfo(false).numSequences > 0) tbs.append(sr.toHtmlString(msg, false, numSessions > 1)); } html.append(Html.table(tbs.substring(0), null, 1, 2, -1, null, false)); } else { html.append(Html.table(tb.toString(), null, 0, 2, -1, null, false)); html.br().bold(msg.get(prefix + "no_activities")); } return html.toString(); } public static final String ELEMENT_NAME = "reporter"; public static final String USER_ID = "user", KEY = "key", CONTEXT = "context", GROUP_CODE_FILTER = "groupCodeFilter", USER_CODE_FILTER = "userCodeFilter"; public void init(HashMap properties, Component parent, Messages msg) throws Exception { userId = (String) properties.get(USER_ID); sessionKey = (String) properties.get(KEY); sessionContext = (String) properties.get(CONTEXT); groupCodeFilter = (String) properties.get(GROUP_CODE_FILTER); userCodeFilter = (String) properties.get(USER_CODE_FILTER); initiated = true; } public static Reporter getReporter(HashMap properties, Component parent, Messages msg) throws Exception { String className; if (properties == null) throw new IllegalArgumentException("Null properties passed to \"getReporter\""); if ((className = (String) properties.get(JDomUtility.CLASS)) == null) throw new IllegalArgumentException("Properties passed to \"getReporter\" with null class name"); Class reporterClass = Class.forName(className); Reporter rep = (Reporter) reporterClass.newInstance(); rep.init(properties, parent, msg); return rep; } public static Reporter getReporter(String className, String strProperties, Component parent, Messages msg) throws Exception { if (className == null || className.length() == 0) throw new IllegalArgumentException("Properties passed to \"getReporter\" with null class name"); if (className.indexOf('.') < 0) { className = "edu.xtec.jclic.report." + className; } HashMap properties = new HashMap(); properties.put(JDomUtility.CLASS, className); Options.strToMap(strProperties, properties, ";", '=', false); return getReporter(properties, parent, msg); } @Override protected void finalize() throws Throwable { try { end(); } finally { super.finalize(); } } public void end() { endSession(); } public void endSequence() { if (currentSession != null) currentSession.endSequence(); } public void endSession() { endSequence(); currentSession = null; } public String newGroup(GroupData gd) throws Exception { throw new Exception("No database!"); } public String newUser(UserData ud) throws Exception { throw new Exception("No database!"); } public void newSession(JClicProject jcp, Component parent, Messages msg) { endSession(); currentSession = new SessionReg(jcp); sessions.add(currentSession); } public void newSequence(ActivitySequenceElement ase) { if (currentSession != null) currentSession.newSequence(ase); } public void newActivity(Activity act) { if (currentSession != null) currentSession.newActivity(act); } public void endActivity(int score, int numActions, boolean solved) { if (currentSession != null) currentSession.endActivity(score, numActions, solved); } public void newAction(String type, String source, String dest, boolean ok) { if (currentSession != null) currentSession.newAction(type, source, dest, ok); } public edu.xtec.jclic.report.SequenceReg.Info getCurrentSequenceInfo() { return currentSession == null ? null : currentSession.getCurrentSequenceInfo(); } public String getCurrentSequenceTag() { return currentSession == null ? null : currentSession.getCurrentSequenceTag(); } } src/core/edu/xtec/jclic/report/SequenceReg.java000066400000000000000000000101311335566474600220040ustar00rootroot00000000000000/* * File : SequenceReg.java * Created : 11-jul-2001 9:08 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.jclic.Activity; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.util.Html; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.13 */ public class SequenceReg extends Object implements java.io.Serializable { String name; String description; List activities; ActivityReg currentActivity; long totalTime; boolean closed; protected transient Info info; /** Creates new SequenceReg */ public SequenceReg(ActivitySequenceElement ase) { name = ase.getTag(); description = ase.getDescription(); activities = new CopyOnWriteArrayList(); currentActivity = null; totalTime = 0; closed = false; info = new Info(); } public String toHtmlString(edu.xtec.util.Messages msg) { Html html = new Html(3000); String fh = new Html(200).td(name, Html.LEFT, false, "ROWSPAN=\"" + msg.getNumber(activities.size()) + "\"") .toString(); Iterator it = activities.iterator(); while (it.hasNext()) { html.append(it.next().toHtmlString(msg, fh)); fh = null; } return html.toString(); } public Info getInfo(boolean recalc) { if (recalc) info.recalc(); return info; } public class Info { public int nActivities, nActClosed, nActSolved, nActScore, percentSolved, nActions; public long tScore, tTime; protected Info() { clear(); } protected void clear() { nActivities = nActClosed = nActSolved = nActScore = percentSolved = nActions = 0; tScore = tTime = 0L; } public void recalc() { clear(); nActivities = activities.size(); if (nActivities > 0) { Iterator it = activities.iterator(); while (it.hasNext()) { ActivityReg ar = it.next(); if (ar.closed) { nActClosed++; tTime += ar.totalTime; nActions += ar.numActions; if (ar.solved) nActSolved++; int r = ar.getPrecision(); if (r >= 0) { tScore += r; nActScore++; } } } if (nActClosed > 0) percentSolved = (nActSolved * 100) / nActClosed; if (nActScore > 0) tScore /= nActScore; } } } void newActivity(Activity act) { if (!closed) { currentActivity = new ActivityReg(act); activities.add(currentActivity); } } void newAction(String type, String source, String dest, boolean ok) { if (currentActivity != null) { currentActivity.newAction(type, source, dest, ok); } } void endActivity(int score, int numActions, boolean solved) { if (currentActivity != null) currentActivity.endActivity(score, numActions, solved); } void endSequence() { if (currentActivity != null && !activities.isEmpty()) { if (!currentActivity.closed) currentActivity.closeActivity(); ActivityReg firstActivity = activities.get(0); totalTime = currentActivity.startTime + currentActivity.totalTime - firstActivity.startTime; } } @Override public String toString() { return new StringBuilder("SEQUENCE: ").append(name).substring(0); } } src/core/edu/xtec/jclic/report/SessionReg.java000066400000000000000000000137301335566474600216670ustar00rootroot00000000000000/* * File : SessionReg.java * Created : 29-jan-2002 11:06 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.jclic.Activity; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.Html; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class SessionReg implements java.io.Serializable { List sequences; SequenceReg currentSequence = null; public java.util.Date started; protected long timeMillis; String projectName; protected transient Info info; String code; /** Creates new SessionReg */ public SessionReg(JClicProject jcp) { this(jcp.getName(), jcp.code); } public SessionReg(String projectName, String code) { sequences = new CopyOnWriteArrayList(); currentSequence = null; started = new java.util.Date(); timeMillis = System.currentTimeMillis(); this.projectName = projectName; this.code = code; info = new Info(); } public String toHtmlString(edu.xtec.util.Messages msg, boolean recalcInfo, boolean writeProjectName) { String prefix = "report_"; Html html = new Html(3000); if (recalcInfo) info.recalc(); if (info.numSequences > 0) { if (writeProjectName) { html.append("
"); html.bold(msg.get(prefix + "project") + Html.NBSP + projectName); html.td(false).tr(false); } html.append("
Generalitat de Catalunya
%APPVERSION
http://clic.xtec.cat
 
%CREDITS  
%TRANSLATION
 

 
%OTHERCREDITS  

 
%LICENSE  

 
%SPONSORS
src/core/edu/xtec/resources/about/credits.html000066400000000000000000000004341335566474600220100ustar00rootroot00000000000000Francesc Busquets (fbusquets@xtec.cat)
Generalitat de Catalunya
Departament d'Ensenyament
 
With the collaboration of:
Mònica Grau
Sara Arjona
Fernando Cuartero
Albert Llastarri
Jordi Lagares
src/core/edu/xtec/resources/about/gencat.png000066400000000000000000000170241335566474600214370ustar00rootroot00000000000000PNG  IHDR } EiCCPICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ5bKGD pHYs.#.#x?vtIME SPIDATxyՕǿni$B.!B8DMbt0Ƹh1fkDWܗoAQ'J@D\7nhh^+v^/`&SWuֹE(BP"EH"6v.zDJ̽зbe"ckgFf,uA4ksv "}5RϚs{d["P s6(ʜerAusk ZijV4Xhcfδ(zz[_ pJ nmLnT.BRBlnL'̍'b& n>s:ǧ0xԙ}AkV e\ ~ XqT JI{ GO$D lQC\K}A`.`W;5t|hAk-bKŝd%cE<1BhL. Q; ;cQ@k70k^mMǞ¾A-{Rv.;ؼ UjBYxe4h"ÈB{bE/DXl 237 ΍ps8w#}Ykr%؈Dd wu>z߿Uc?ߒz}$.Wd:Ǖ"j ֤0([zO`;F`okk&[zӥvˀ_qO \$}  \Mz0T v@){BgO:赍8ˣoe<8/6Q[Kw]N ywPKXkhTRl..8)"te,胹m6{r>l<Wd<<"ai*434%g/q,CR8/ {*'ű\{K*@-Œs&^}̅ERr{>-c>Fh ֡r. B.vs9XkN5u_T3uK?1 %N"1) 6PA;xn*柖Vg#;==@qZNwڔd5w & %JKVp ܩ'HVeri}eWݤ` j4`}g|)z?)S  ygxa<'{Ѕ+ٖ7a;iz-i9{RgaFጣ( a*8!Smzɉɪ=/w3Ak.pTʥ,Di?~ :B[nU'z&PUc%ty3mp,W)6Rch{<$劯]qyp72m':8DạjHwn'y|rhMOȖ0]pG/ycs-_]v EK'Dw+bTR1QI|3z1AƋuw 㯻,(C?#ov>4HHA%yxBzmoԫj1tYKS 7ɋ,Kfl<3 ,*pclN`M|n}RlrΪ(t-OK{a_K⽟:{\sS\~m qڽ+#7xm#\YTr"'k_ny ꛁA_}LqNr|r9mۅn(F~(/DqfVW|VK^d+`qu9DT TVqh1^4׾^*Z[ZFJ"$CQ0Z/.pw Yޞ/Dփ X'# \nRk5r8V{c{[*gDIdפ )A=.XDBx?bM{{NX뙦K}QK-qa4Ǜoxr#7o*>Z"\pysd{3;kIbȧ|"]!,__i&%qF|(AjxËmk 5//8BVQK RbzDy7) h8]n )Q*/CyUc {;O#]{3D-z.gvZ nt9X 11U 3D w<asyɸ}>}bA-raÃEMeҢ5f'heUi060sCLcP8t}^` mϒձQp:SyqA %8_-[m̕]ݽ:am‚vz՞, :T>_n(4Pe:3Yɐ9K.R?_%^zuO$mP+{4}ҸQiektPOf?D_y܅cO+qd|p"? VWF 'k!^芎 M\Pp7quĕ7*V`.~ gJO8Cnb@Ӗ5gM~#:6 #t;8cwDLB[Ʋ޺ trC?w_=}gB#i._HȐ1,nteٲa64s7/$wٗd7Ӿ4R୲zO3+k-!NI/'N˯"IH{;x_8Yo4g &1 %N'cm/Q"{GW&<4I܍lN"^ˉd*[^+k%2ûWK\v$8%5Ѧ^#mqAmK9}+ᱜjEԻuzUc/ܥt`gWg}; kRU|5n&S V0 *j\c:rc S폨}"qѧ!#/;[&~΍xmig'[rhMċ{z%ZפFi2x ΉLK=މ1Z(ﻚx]X$IYo riR0VX} fӚql^;EBbS.X{IC&34n<ڽL\u F[%&~ûEs;{lr} 񎇄p' 97~f']ޔo1y^M#^[6[V;X4oc5JڊO:ZTg 9Ne/J7Ҿ\P [T<1y(&jn =mƗlMpC/4-^ "7 X~zE@)yE$YR~_h-zo%*m V2yRk}ܮBr?]惯.&CgBpǞ?G_6ou6گ~<;[:Ԏp잙{;uIla//hۋ zR8OuE!ěZ.gCM_IENDB`src/core/edu/xtec/resources/about/license.html000066400000000000000000000014451335566474600220000ustar00rootroot00000000000000Copyright © 2000-2005 Francesc Busquets (fbusquets@xtec.net) ∧ Departament d'Educació de la Generalitat de Catalunya (info@xtec.net).
 
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 
src/core/edu/xtec/resources/about/logo_small.png000066400000000000000000000040401335566474600223200ustar00rootroot00000000000000PNG  IHDRÄGsBITO&PLTEnY3ffnY3ffnY3ffnY3ffnY3ffnY3ffnY3ffnY3ffnY3ffnY3ffnY3ffqn\Y3ffxuqc_\3ff|xuqfc_\3ffޅׁ{|xuurlifc_3fflE&btRNS"""333DDDUUUffffwwwv* pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$IDATxVXh Bac5R˙fH_Ox^7 ɗ=%J|>s|6ɕ3gϟóR?ől6< \9}d\+?%\~jjJ%1GiBvdvGfiѷr]+Fy9t{-):FqtG;.üۏqqͥ0,VW*(w?bN s-Љ9R+Ǡ|y B2X:vMwniłQR2j,wK.hmFglwDS2:x楦>Cy+%>qo?Mi){LSmj%TLO+`(,`ATDT&nDe OmGMKp$v 3 YI^-NKUtj/iG``A"[pS.O. +W{o(-s GFa48ՏҒ!PcZGhaQ`}6PS9+ƢZG[q$^R}_*#kY5٢ JpnE\cF|[yp$ImS;Uc5 mGZjebsES8@@$c(fAT:j~T:|Gż)r"\ \fY%-**UI8RSXըSShFbj_7\Ho #)fu6Gh$.0*۷cmR@i 2x?vȘn!#;"@ƢJzا2*wȣ8n"#i%Pg{ PZɪR2\0@M)J $L&Ts T"g(N<{TY5BzlO/6k/WSpi~GQs=Z.YR=HH.gpr!ɴ:->U"bf.-gֳ3xSBI"ԠE6Áyb^6i*`]nPfY&޲' 0;v< 4*& ̦]`y~T4u8ݻdػB6P/jzP" 1vIpjNϥt h[K@ DIENDB`src/core/edu/xtec/resources/about/otherCredits.html000066400000000000000000000023151335566474600230120ustar00rootroot00000000000000JDom
The JDOM Project (http://www.jdom.org)
Apache-like license
 
BareBonesBrowserLauncher
By Dem Pilafian, enhanced by Williem van Engen (http://goo.gl/T3CFQ)
Public Domain Software
 
JavaLayer and MP3 JavaSound SPI
JavaZOOM (http://www.javazoom.net)
GNU Lesser General Public License (LGPL)
 
JOrbis
ymnk - JCraft (http://www.jcraft.com/jorbis)
GNU Lesser General Public License (LGPL)
 
Tritonus
Tritonus project (http://www.tritonus.org)
GNU Lesser General Public License (LGPL)
 
Image4j
Ian McDonagh (http://image4j.sourceforge.net)
GNU Lesser General Public License (LGPL)
 
JSON-java
The Android Open Source Project (https://android.googlesource.com/platform/libcore/+/master/json/)
Apache License, Version 2.0
src/core/edu/xtec/resources/about/sponsors.html000066400000000000000000000001171335566474600222370ustar00rootroot00000000000000Sun
src/core/edu/xtec/resources/about/sun.gif000066400000000000000000000046451335566474600207710ustar00rootroot00000000000000GIF89aJ.RZS\TZU\X^Y`[bafdihkhmfminlrrvuzvz{~xzy}x~}} %#/+2/95=8Ap#hSâpFa( ']8Ĵ]0D2хUE 7 &Ȓ;BUu %0,H%.(!"W}I~`1c.肆 ;#DBIՐ/thCѤƀ"ܶ:6Bth"@o/5L3@=Gpn7$wp"`B#7!O'?vN4Q d9O 808$3mH|A X0԰5#P<8D;(8CPA,@ $36*C0A.@7B36,f @ - PڂPB800;N i1|O $S 4g81/ ?  s ˨ C$ӂ1`*\3N* B}@@" 3Pv5.QP8x R*@`@%0x< K8X!2+ C `9P40T0 )1z+QfN2J>XQ1kǖpG0sJ`H ֤->H(p@CVŀ au@U"0Ix+qD  qT%"b5p!RD$ d# Y@q0#7@l! !#^@(ȥk`BDW (񐰀@YŁ`=6q#f`(`bPB,@T+!(TPBX Dq p"t АE! [ ' Q ,|>!.)^O|fo`c\&P@ @FpmX+U@"Jx[` UDTj &']C 1b Xq( \+b Q("mІi w$Q Pm4vO6#@W \ d ֊CkBT:!+ @v@( \q@ @pxx;@[C 7t" 8 JA^Xa jE!ȃ z0HaP. :b# @B'@TΐJЃ.@* Q- lpEjQ }l xM( `?(C,pgI!;pD;src/core/edu/xtec/resources/activities/000077500000000000000000000000001335566474600205165ustar00rootroot00000000000000src/core/edu/xtec/resources/activities/listactivities.properties000066400000000000000000000070271335566474600257020ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Complex association|In this activity there are also two sets of information, but these may have a different number of parts and there may be different types of relation between them e.g.: one-to-one, various to one, parts without a relation, etc. @associations.SimpleAssociation=Simple association|There are two sets of information that have the same number of parts. Each part from the original set corresponds to one, and only one, part of the image set. @memory.MemoryGame=Finding pairs|Each of the pieces appear twice, but face down. In each go two pieces are turned over and are turned back over if they are not the same. The objective is to find all the pairs. @panels.Explore=Explore activity|An initial piece of information is shown and, upon clicking on it, a given piece of information is shown for each element. @panels.Identify=Identify cells|There is just one set of information and you have to click on those parts that meet a certain condition. @panels.InformationScreen=Information screen|One set of information is shown and there is the option of activating the multimedia content for each piece of information. @puzzles.DoublePuzzle=Double puzzle|Two grids are shown. One contains the disordered information and the other is empty. The object has to be rearranged in the empty grid by dragging the pieces one by one. @puzzles.ExchangePuzzle=Exchange puzzle|The information is swapped within the same panel. In each go two pieces swap position until the object is reordered. @puzzles.HolePuzzle=Hole puzzle|In the same panel one piece is missing and the others are shuffled. In each go one of the pieces next to the empty space is moved until they are back in the original order. @text.WrittenAnswer=Written answer|A set of information is shown and the corresponding text for each of its parts must be written. @text.FillInBlanks=Text: Fill-in blanks|The user has to complete certain words, letters and phrases that have been hidden or camouflaged in a text. The solution of each of the elements may be set up in different ways: writing in a blank space; correcting a phrase that contains errors; or selecting from a list of various possible answers. @text.Identify=Text: Identify elements|The user has to point out some words, letters, numbers, symbols or punctuation marks with a click of the mouse. @text.Order=Text: Order elements|When designing this activity some of the words or paragraphs of a text are selected to be shuffled around. The user has to put them back in order. @text.Complete=Text: Complete text|Various parts of a text (letters, words, punctuation signs, or phrases) are taken out and the user has to complete it. @textGrid.CrossWord=Crosswords|The word table has to be completed according to its definitions. The definitions may be text, graphics or sound. The programme automatically shows the definitions of the two words which cross in the cursor position. @textGrid.WordSearch=Word search|The hidden words have to be found in a grid of letters. The neutral cells in the grid (those with no word) are completed with characters chosen at random. src/core/edu/xtec/resources/activities/listactivities_ar.properties000066400000000000000000000070271335566474600263640ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Complex association|In this activity there are also two sets of information, but these may have a different number of parts and there may be different types of relation between them e.g.: one-to-one, various to one, parts without a relation, etc. @associations.SimpleAssociation=Simple association|There are two sets of information that have the same number of parts. Each part from the original set corresponds to one, and only one, part of the image set. @memory.MemoryGame=Finding pairs|Each of the pieces appear twice, but face down. In each go two pieces are turned over and are turned back over if they are not the same. The objective is to find all the pairs. @panels.Explore=Explore activity|An initial piece of information is shown and, upon clicking on it, a given piece of information is shown for each element. @panels.Identify=Identify cells|There is just one set of information and you have to click on those parts that meet a certain condition. @panels.InformationScreen=Information screen|One set of information is shown and there is the option of activating the multimedia content for each piece of information. @puzzles.DoublePuzzle=Double puzzle|Two grids are shown. One contains the disordered information and the other is empty. The object has to be rearranged in the empty grid by dragging the pieces one by one. @puzzles.ExchangePuzzle=Exchange puzzle|The information is swapped within the same panel. In each go two pieces swap position until the object is reordered. @puzzles.HolePuzzle=Hole puzzle|In the same panel one piece is missing and the others are shuffled. In each go one of the pieces next to the empty space is moved until they are back in the original order. @text.WrittenAnswer=Written answer|A set of information is shown and the corresponding text for each of its parts must be written. @text.FillInBlanks=Text: Fill-in blanks|The user has to complete certain words, letters and phrases that have been hidden or camouflaged in a text. The solution of each of the elements may be set up in different ways: writing in a blank space; correcting a phrase that contains errors; or selecting from a list of various possible answers. @text.Identify=Text: Identify elements|The user has to point out some words, letters, numbers, symbols or punctuation marks with a click of the mouse. @text.Order=Text: Order elements|When designing this activity some of the words or paragraphs of a text are selected to be shuffled around. The user has to put them back in order. @text.Complete=Text: Complete text|Various parts of a text (letters, words, punctuation signs, or phrases) are taken out and the user has to complete it. @textGrid.CrossWord=Crosswords|The word table has to be completed according to its definitions. The definitions may be text, graphics or sound. The programme automatically shows the definitions of the two words which cross in the cursor position. @textGrid.WordSearch=Word search|The hidden words have to be found in a grid of letters. The neutral cells in the grid (those with no word) are completed with characters chosen at random. src/core/edu/xtec/resources/activities/listactivities_ast.properties000066400000000000000000000101151335566474600265410ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Asociaci\u00F3n complexa|Nesta triba de xera pres\u00E9ntense tami\u00E9n dos conxuntos d'informaci\u00F3n, pero \u00E9stos puen tener un n\u00FAmberu estrem\u00E1u d'elementos y ente ellos pueden dase delles tribes de rellaci\u00F3n: \u00DAn a \u00FAn, dellos a \u00FAn, elementos ensin asociar... @associations.SimpleAssociation=Asociaci\u00F3n simple|Pres\u00E9ntense dos conxuntos d'informaci\u00F3n que tienen el mesmu n\u00FAmberu d'elementos. A cada elementu del conxuntu imaxe correspuende nam\u00E1s qu'un elementu del conxuntu orixe. @memory.MemoryGame=Guetar pareyes|Cada una de las pieces que formen l' oxetu apaez anubrida dos vegaes dientro de la ventana de xuegu. En cada xugada dest\u00E1pense un par de pieces, que se'escuende otra vuelta si nun son id\u00E9ntiques. L'oxetivu ya atopar toles pareyes. @panels.Explore=Xera d'esploraci\u00F3n|Amu\u00E9sase una informaci\u00F3n d'aniciu y al facer clic nella apaez, pa cada elementu, una determinada pieza d'informaci\u00F3n. @panels.Identify=Xera d'identificaci\u00F3n|Pres\u00E9ntase nam\u00E1s qu'un conxuntu d'informaci\u00F3n y hai que calcar naquellos elementos que cumplan un condici\u00F3n determinada. @panels.InformationScreen=Pantalla d'informaci\u00F3n|Amu\u00E9sase un conxuntu d'informaci\u00F3ny, opcionalmente, \u00FAfrese la posibilid\u00E1 d'activar el conten\u00EDu multimedia arrey\u00E1u a cada elementu. @puzzles.DoublePuzzle=Puzzle doble|Amu\u00E9sense dos paneles. N\u00FAn apaez la informaci\u00F3n desordenada y l'otru ta ermu. Hai que reconstruyir l'oxetu nel panel ermu arrastrando les pieces d'una nuna. @puzzles.ExchangePuzzle=Puzzle d'intercambiu|Nun panel \u00FAnicu m\u00E9cese tola informaci\u00F3n. En cada xugada se intercambien les posiciones de dos pieces fasta ordenar l'oxetu. @puzzles.HolePuzzle=Puzzle de furacu|Nun panel \u00FAnicu faise desapaecer una pieza y m\u00E9cense les dem\u00E1s. En cada xugada pue movese una de les pieces que llenden col furacu, fasta teneles toes nel orde orixinal. @text.WrittenAnswer=Rempuesta escrita|Amu\u00E9sase un conxuntu d'informaci\u00F3n y, pa ca\u00FAn de los elementos, hai qu'escribir el testu que correspuenda. @text.FillInBlanks=Testu: enllenar furacos|Nun testu escu\u00E9yense delles pallabres, lletres y/o frases que s'escuende o camuflen. La resoluci\u00F3n de ca\u00FAn de los elementos escond\u00EDos pue plantegase de menes estremaes: escribiendo nun espaciu ermu, corrixiendo una espresi\u00F3n que conti\u00E9n errores o seleicionando nuna llista ente posibles rempuestes. @text.Identify=Testu: identificar elementos|L'usuariu tien de se\u00F1alar calcando col mur determinaes pallabres, lletres, cifres, s\u00EDmbolos o signod de puntuaci\u00F3n. @text.Order=Testu: ordenar elementos|Nel intre de dise\u00F1ar la xera seleici\u00F3nense nel testu delles pallabres o p\u00E1rrafos que se van mecer ente ellos. L'usuariu tien de volver a ponelo n'orde. @text.Complete=Testu: completar testu|Nun testu faense desapaecer dellos elementos (lletres, pallabres, signos de puntuaci\u00F3n, frases) y l'usuariu tien de completalu. @textGrid.CrossWord=Crucigrama|Hai que dir enllenando el panel de pallabres a partir de les definiciones. Les definiciones puen ser testuales, gr\u00E1fiques o sonores. El programa amuesa autom\u00E1ticamente les definiciones de les dos pallabres que se crucen na posici\u00F3n onde s'atope'l cursor en cada momentu. @textGrid.WordSearch=Sopa de lletres|Hai qu'atopar les pallabres escond\u00EDes nuna caxella de lletres. Les celdes neutres de la caxella (les que nun pertenecen a pallabra denguna) enll\u00E9nense con carauteres seleicionaos al azar en cada xugada. src/core/edu/xtec/resources/activities/listactivities_ca.properties000066400000000000000000000101311335566474600263330ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Associaci\u00F3 complexa|En aquest tipus d'activitat es presenten tamb\u00E9 dos conjunts d'informaci\u00F3, per\u00F2 aquests poden tenir un nombre diferent d'elements i entre ells es poden donar diversos tipus de relaci\u00F3, p. ex.: un a un, diversos a un, elements sense assignar... @associations.SimpleAssociation=Associaci\u00F3 simple|Es presenten dos conjunts d'informaci\u00F3 que tenen el mateix nombre d'elements. A cada element del conjunt origen correspon un i nom\u00E9s un element del conjunt imatge. @memory.MemoryGame=Joc de mem\u00F2ria|Cada una de les peces que formen l'objecte apareix amagat dues vegades dins de la finestra de joc. En cada tirada es destapen un parell de peces, que es tornen a amagar si no s\u00F3n id\u00E8ntiques. L'objectiu \u00E9s destapar totes les parelles. @panels.Explore=Activitat d'exploracio|Es mostra una informaci\u00F3 inicial i en fer clic damunt seu es mostra, per a cada element, una determinada pe\u00E7a d'informaci\u00F3. @panels.Identify=Activitat d'identificaci\u00F3|Es presenta nom\u00E9s un conjunt d'informaci\u00F3 i cal fer clic damunt aquells elements que compleixin una determinada condici\u00F3. @panels.InformationScreen=Pantalla d'informaci\u00F3|Es mostra un conjunt d'informaci\u00F3 i, opcionalment, s'ofereix la possibilitat d'activar el contingut multim\u00E8dia que porti cada element. @puzzles.DoublePuzzle=Puzzle doble|Es mostren dos plafons. En un hi ha la informaci\u00F3 desordenada i l'altre est\u00E0 buit. Cal reconstruir l'objecte en el plaf\u00F3 buit portant-hi les peces una per una. @puzzles.ExchangePuzzle=Puzzle d'intercanvi|En un \u00FAnic plaf\u00F3 es barreja la informaci\u00F3. En cada tirada es commuten les posicions de dues peces, fins a ordenar l'objecte. @puzzles.HolePuzzle=Puzzle de forat|En un \u00FAnic plaf\u00F3 es fa desapar\u00E8ixer una pe\u00E7a i es barregen les restants. En cada tirada es pot despla\u00E7ar una de les peces ve\u00EFnes al forat, fins a tenir-les totes en l'ordre original. @text.WrittenAnswer=Resposta escrita|Es mostra un conjunt d'informaci\u00F3 i, per a cadascun dels seus elements, cal escriure el text corresponent. @text.FillInBlanks=Text: Omplir forats|En un text se seleccionen determinades paraules, lletres i frases que s'amaguen o es camuflen i l'usuari ha de completar. La resoluci\u00F3 de cadascun dels elements amagats es pot plantejar de maneres diferents: escrivint en un espai buit, corregint una expressi\u00F3 que cont\u00E9 errades o seleccionant en una llista de diverses respostes possibles. @text.Identify=Text: Identificar elements|L'usuari ha d'assenyalar amb un clic de ratol\u00ED determinades paraules, lletres, xifres, s\u00EDmbols o signes de puntuaci\u00F3. @text.Order=Text: Ordenar elements|En el moment de dissenyar l'activitat se seleccionen en el text algunes paraules o par\u00E0grafs que es barrejaran entre si. L'usuari ha de tornar a posar-ho en ordre. @text.Complete=Text: Completar text|En un text es fan desapar\u00E8ixer determinades parts (lletres, paraules, signes de puntuaci\u00F3, frases) i l'usuari ha de completar-lo. @textGrid.CrossWord=Mots encreuats|Cal anar omplint el tauler de paraules a partir de les seves definicions. Les definicions poden ser textuals, gr\u00E0fiques o sonores. El programa mostra autom\u00E0ticament les definicions de les dues paraules que es creuen en la posici\u00F3 on es trobi el cursor en cada moment. @textGrid.WordSearch=Sopa de lletres|Cal trobar les paraules amagades en una graella de lletres. Les caselles neutres de la graella (aquelles que no pertanyen a cap paraula) s'omplen amb car\u00E0cters seleccionats a l'atzar en cada jugada. src/core/edu/xtec/resources/activities/listactivities_cs.properties000066400000000000000000000112701335566474600263620ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Komplexn\u00ED asociace|V t\u00E9to aktivit\u011B jsou dv\u011B sady informac\u00ED, kter\u00E9 mohou m\u00EDt rozd\u00EDln\u00FD po\u010Det \u010D\u00E1st\u00ED a rozd\u00EDln\u00E9 vztahy mezi nimi, nap\u0159.: jeden-k-jedn\u00E9, n\u011Bkolik k jedn\u00E9, \u010D\u00E1sti bez vztahu apod. @associations.SimpleAssociation=Jednoduch\u00E1 asociace|V t\u00E9to aktivit\u011B jsou dv\u011B sady informac\u00ED, kter\u00E9 maj\u00ED stejn\u00FD po\u010Det \u010D\u00E1st\u00ED. Ka\u017Ed\u00E1 \u010D\u00E1st p\u016Fvodn\u00ED sady odpov\u00EDd\u00E1 jedn\u00E9 a pouze jedn\u00E9 \u010D\u00E1sti obr\u00E1zkov\u00E9 sady. @memory.MemoryGame=Hled\u00E1n\u00ED p\u00E1r\u016F|Pexeso. Ka\u017Ed\u00E1 z \u010D\u00E1st\u00ED se objev\u00ED dvakr\u00E1t, ale l\u00EDcem dol\u016F. V ka\u017Ed\u00E9m kole se obr\u00E1t\u00ED dv\u011B karty a oto\u010D\u00ED se l\u00EDcem dolu, kdy\u017E nejsou stejn\u00E9. C\u00EDlem je naj\u00EDt v\u0161echny p\u00E1ry. @panels.Explore=Prozkoumat aktivity|Po\u010D\u00E1te\u010Dn\u00ED \u00FAdaj je zobrazen, po kliknut\u00ED na n\u011Bj bude dan\u00FD \u00FAdaj uveden u ka\u017Ed\u00E9 polo\u017Eky. @panels.Identify=Identifikovat bu\u0148ky|Existuje jen jeden soubor informac\u00ED a mus\u00EDte kliknout na ty \u010D\u00E1sti, kter\u00E9 spl\u0148uj\u00ED ur\u010Dit\u00E9 podm\u00EDnky. @panels.InformationScreen=Informa\u010Dn\u00ED obrazovka|Jedna sada informac\u00ED je zobrazena s mo\u017Enost\u00ED aktivace multimedi\u00E1ln\u00EDho obsahu ka\u017Ed\u00E9 \u010D\u00E1sti informace. @puzzles.DoublePuzzle=\u017Ed\u00E9ho z prvk\u016FDvojit\u00E1 skl\u00E1da\u010Dka|Jsou zobrazeny dv\u011B m\u0159\u00ED\u017Eky. Jedna obsahuje zp\u0159eh\u00E1zen\u00E9 informace a druh\u00E1 je pr\u00E1zdn\u00E1. Objekt mus\u00ED b\u00FDt v pr\u00E1zdn\u00E9 m\u0159\u00ED\u017Ece sestaven p\u0159eta\u017Een\u00EDm jednotliv\u00FDch kousk\u016F. @puzzles.ExchangePuzzle=V\u00FDm\u011Bna puzzl\u00ED| Tyto informace jsou prohozeny ve stejn\u00E9m panelu.V ka\u017Ed\u00E9m jsou dv\u011B pozice prohozeny, ne\u017E jsou objekty se\u0159azeny. @puzzles.HolePuzzle=Skl\u00E1da\u010Dka s d\u00EDrou|Ve stejn\u00E9m panelu chyb\u00ED jeden kousek a ostatn\u00ED jsou zam\u00EDch\u00E1ny. V ka\u017Ed\u00E9m tahu je jeden kousek vedle pr\u00E1zdn\u00E9ho m\u00EDsta posunut, dokud nejsou v\u0161echny zp\u00E1tky v p\u016Fvodn\u00EDm po\u0159ad\u00ED. @text.WrittenAnswer=P\u00EDsemn\u00E1 odpov\u011B\u010F|Soubor informac\u00ED je zobrazen a odpov\u00EDdaj\u00EDc\u00ED text pro ka\u017Edou \u010D\u00E1st mus\u00ED b\u00FDt v p\u00EDsemn\u00E9 form\u011B. @text.FillInBlanks=Text: Vyplnit mezery|U\u017Eivatel mus\u00ED dokon\u010Dit jist\u00E1 slova, p\u00EDsmena a fr\u00E1ze, kter\u00E9 byly v textu skryty \u010Di zamaskov\u00E1ny. \u0158e\u0161en\u00ED ka\u017Ed\u00E9ho z prvk\u016F m\u016F\u017Ee b\u00FDt nastaveno r\u016Fzn\u011B: z\u00E1pisem do pr\u00E1zdn\u00E9ho m\u00EDsta; opravou fr\u00E1ze, kter\u00E1 obsahuje chybu; nebo v\u00FDb\u011Brem ze seznamu r\u016Fzn\u00FDch mo\u017En\u00FDch odpov\u011Bd\u00ED. @text.Identify=Text: Ur\u010Dit prvky|U\u017Eivatel mus\u00ED kliknut\u00EDm my\u0161i pouk\u00E1zat jist\u00E1 slova, p\u00EDsmena, \u010D\u00EDslice, symboly, nebo interpunk\u010Dn\u00ED znam\u00E9nka. @text.Order=Text: Po\u0159ad\u00ED prvk\u016F|P\u0159i v\u00FDb\u011Bru navrhov\u00E1n\u00ED t\u00E9to \u010Dinnosti n\u011Bkter\u00E9 ze slov nebo odstavc\u016F textu jsou vybran\u00E9 pro zam\u00EDch\u00E1n\u00ED dokola. U\u017Eivatel je m\u00E1 d\u00E1t do po\u0159\u00E1dku. @text.Complete=Text: Doplnit text | R\u016Fzn\u00E9 \u010D\u00E1sti textu (p\u00EDsmena, slova, interpunk\u010Dn\u00ED znam\u00E9nka, nebo fr\u00E1ze) jsou vy\u0159azeny a u\u017Eivatel ho mus\u00ED dokon\u010Dit. @textGrid.CrossWord=K\u0159\u00ED\u017Eovky|Tabulka slov mus\u00ED b\u00FDt dokon\u010Dena podle jejich definic. Definic\u00ED m\u016F\u017Ee b\u00FDt text, grafika nebo zvuk. Program automaticky zobraz\u00ED definice dvou slov, kter\u00E1 se prot\u00EDnaj\u00ED v pozici kurzoru. @textGrid.WordSearch=Hled\u00E1n\u00ED slov|Skryt\u00E1 slova lze nal\u00E9zt v m\u0159\u00ED\u017Ece p\u00EDsmen. Neutr\u00E1ln\u00ED bu\u0148ky v m\u0159\u00ED\u017Ece (ty bez slov) jsou dopln\u011Bny n\u00E1hodn\u011B vybran\u00FDmi znaky. src/core/edu/xtec/resources/activities/listactivities_de.properties000066400000000000000000000074331335566474600263530ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Mehrfache Zuordnung|Zwei Informationstafeln mit einer unterschiedlichen Anzahl von Elementen zwischen denen verschiedene Arten von Beziehungen bestehen. z.B: eins-zu-eins; mehrere zu eins; Elemente ohne Bezug usw. @associations.SimpleAssociation=Einfache Zuordnung|Zwei Informationstafeln die aus gleich vielen Elementen bestehen. Jedes Element auf Tafel 1 entspricht einem Bild auf Tafel 2 @memory.MemoryGame=Paare finden|Jedes Element kommt 2 Mal vor. Bei jedem Spielgang m\u00FCssen zwei verdeckte Spielkarten umgedreht und wieder zur\u00FCckgelegt werden, wenn sie nicht zusammenpassen. Ziel ist, alle zusammengeh\u00F6rigen Paare zu finden. @panels.Explore=Forschendes Lernen|Ein kleiner Teil der Information ist zu sehen, beim Anklicken jedes Elements wird ein weiteres Element angezeigt @panels.Identify=Such\u00FCbung|Eine einzige Informationstafel. Die \u00DCbenden m\u00FCssen die Teile davon anklicken, die eine bestimmte Bedingung erf\u00FCllen. @panels.InformationScreen=Darstellung von Information|Eine Informationstafel wird angezeigt. Zu jedem einzelnen Element k\u00F6nnen Multimediaelemente aktiviert werden. @puzzles.DoublePuzzle=Puzzle: Ordnen|Zwei Spielfelder werden angezeigt. Eines enth\u00E4lt vermischte Puzzlesteine, die andere ist leer. Das Bild soll auf dem leeren Spielfeld durch Ziehen der Steine mit der Maus richtig rekonstruiert werden. @puzzles.ExchangePuzzle=Puzzle: Austauschen| Die Puzzlesteine innerhalb selben Spielfelds sind ertauscht. Man muss so lange jeweils zwei Steine gegenander austauschen, bis das Bild richtig erscheint. @puzzles.HolePuzzle=Puzzle: Verschieben|Auf dem Spielfeld fehlt ein Stein, die anderen Steine sind vermischt. In jedem Spielgang muss einer der Steine neben dem Leerfeld verschoben werden, bis sich alle Steine wieder an der richtigen Stelle befinden. @text.WrittenAnswer=Begriff eingeben|Ein Informationsblock wird angezeigt. Fehlende Textteile m\u00FCssen schriftlich erg\u00E4nzt werden. @text.FillInBlanks=Text: L\u00FCckentext|Der Spieler/die Spielerin muss in einem Text fehlende oder verborgene W\u00F6rter, Buchstaben und S\u00E4tze erg\u00E4nzen. Es gibt verschiedene L\u00F6sungsm\u00F6glichkeiten: Fehlende Elemente eintragen, Fehler korrigieren oder Auswahl aus mehreren m\u00F6glichen Antworten auf einer Liste. @text.Identify=Text: W\u00F6rter finden| Der Spieler/die Spielerin muss W\u00F6rter, Buchstaben, Zahlen, Symbole oder Satztzeichen mit der Maus anklicken. @text.Order=Text: W\u00F6rter ordnen| Beim Erstellen dieser \u00DCbung werden W\u00F6rter oder Abs\u00E4tze vertauscht. Die Spieler/in muss sie wieder in die richtige Reihenfolge bringen. @text.Complete=Text: Text erg\u00E4nzen|Verschiedene Elemente eines Textes (Buchstaben, W\u00F6rter, Satzzeichen oder S\u00E4tze) fehlen. Der/die \u00DCbende muss sie erg\u00E4nzen. @textGrid.CrossWord=Kreuzwortr\u00E4tsel|Das R\u00E4tsel muss anhand von Definitionen gel\u00F6st werden. Diese k\u00F6nnen aus Text, Grafiken oder Sounddateien bestehen. Die Definition der beiden Begriffe, die sich an der Stelle, wo sich der Cursor befindet kreuzen, wird vom Programm automatisch angezeigt. @textGrid.WordSearch=Wortsuch\u00FCbung|In einer Tabelle m\u00FCssen versteckte Begriffe gesucht werden. Leerzellen (ohne Worter) in der Tabelle werden mit durch Zufallsprinzip ausgew\u00E4hlten Buchstaben gef\u00FCllt. src/core/edu/xtec/resources/activities/listactivities_el.properties000066400000000000000000000401301335566474600263520ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=\u03A3\u03CD\u03BD\u03B8\u03B5\u03C4\u03B7 \u03C3\u03C7\u03AD\u03C3\u03B7|\u03A3\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03C5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03BD \u03B4\u03CD\u03BF \u03C3\u03CD\u03BD\u03BF\u03BB\u03B1 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD, \u03B1\u03BB\u03BB\u03AC \u03B5\u03BD\u03B4\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03AD\u03C7\u03BF\u03C5\u03BD \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC \u03C4\u03BC\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03AE \u03BD\u03B1 \u03C3\u03C7\u03B5\u03C4\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03BF\u03CD\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C5\u03C2 \u03C3\u03C7\u03AD\u03C3\u03B5\u03C9\u03BD, \u03B3\u03B9\u03B1 \u03C0\u03B1\u03C1\u03AC\u03B4\u03B5\u03B9\u03B3\u03BC\u03B1: \u03AD\u03BD\u03B1 \u03C0\u03C1\u03BF\u03C2 \u03AD\u03BD\u03B1, \u03C0\u03BF\u03BB\u03BB\u03AC \u03C0\u03C1\u03BF\u03C2 \u03AD\u03BD\u03B1, \u03C4\u03BC\u03AE\u03BC\u03B1\u03C4\u03B1 \u03C7\u03C9\u03C1\u03AF\u03C2 \u03C3\u03C7\u03AD\u03C3\u03B5\u03B9\u03C2, \u03BA\u03BB\u03C0. @associations.SimpleAssociation=\u0391\u03C0\u03BB\u03AE \u03C3\u03C7\u03AD\u03C3\u03B7|\u03A5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03BD \u03B4\u03CD\u03BF \u03C3\u03CD\u03BD\u03BF\u03BB\u03B1 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03C0\u03BF\u03C5 \u03AD\u03C7\u03BF\u03C5\u03BD \u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC \u03C4\u03BC\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD. \u039A\u03AC\u03B8\u03B5 \u03C4\u03BC\u03AE\u03BC\u03B1 \u03B1\u03C0\u03CC \u03C4\u03BF \u03B1\u03C1\u03C7\u03B9\u03BA\u03CC \u03C3\u03CD\u03BD\u03BF\u03BB\u03BF \u03B1\u03BD\u03C4\u03B9\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF \u03C3\u03B5 \u03AD\u03BD\u03B1, \u03BA\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF\u03BD \u03AD\u03BD\u03B1, \u03C4\u03BC\u03AE\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03AC\u03BB\u03BB\u03BF\u03C5 \u03C3\u03C5\u03BD\u03CC\u03BB\u03BF\u03C5. @memory.MemoryGame=\u0395\u03CD\u03C1\u03B5\u03C3\u03B7 \u03B6\u03B5\u03C5\u03B3\u03CE\u03BD|\u039A\u03AC\u03B8\u03B5 \u03AD\u03BD\u03B1 \u03B1\u03C0\u03CC \u03C4\u03BF \u03BA\u03BF\u03BC\u03BC\u03AC\u03C4\u03B9\u03B1 \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03B4\u03CD\u03BF \u03C6\u03BF\u03C1\u03AD\u03C2, \u03B1\u03BB\u03BB\u03AC \u03B3\u03C5\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03B1\u03C0\u03CC \u03C4\u03B7\u03BD \u03C0\u03AF\u03C3\u03C9 \u03CC\u03C8\u03B7. \u03A3\u03B5 \u03BA\u03AC\u03B8\u03B5 \u03B2\u03AE\u03BC\u03B1 \u03B4\u03CD\u03BF \u03BA\u03BF\u03BC\u03BC\u03AC\u03C4\u03B9\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03C5\u03BD\u03B1\u03C4\u03CC\u03BD \u03BD\u03B1 \u03B1\u03BD\u03B1\u03C0\u03BF\u03B4\u03BF\u03B3\u03C5\u03C1\u03B9\u03C3\u03C4\u03BF\u03CD\u03BD, \u03B1\u03BB\u03BB\u03AC \u03B1\u03BD \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C4\u03B1 \u03AF\u03B4\u03B9\u03B1 \u03B5\u03C0\u03B9\u03C3\u03C4\u03C1\u03AD\u03C6\u03BF\u03C5\u03BD \u03C3\u03C4\u03B7\u03BD \u03B1\u03C1\u03C7\u03B9\u03BA\u03AE \u03C4\u03BF\u03C5\u03C2 \u03B8\u03AD\u03C3\u03B7. @panels.Explore=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B5\u03BE\u03B5\u03C1\u03B5\u03CD\u03BD\u03B7\u03C3\u03B7\u03C2| \u0395\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03B1\u03C1\u03C7\u03B9\u03BA\u03CC \u03C4\u03BC\u03AE\u03BC\u03B1 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03B1\u03BD \u03BA\u03AC\u03BD\u03BF\u03C5\u03BC\u03B5 \u03BA\u03BB\u03B9\u03BA \u03C3\u03B5 \u03B1\u03C5\u03C4\u03CC \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03C4\u03BC\u03AE\u03BC\u03B1 \u03B4\u03BF\u03C3\u03BC\u03AD\u03BD\u03B7\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03BA\u03AC\u03B8\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF. @panels.Identify=\u03A4\u03B1\u03CD\u03C4\u03B9\u03C3\u03B7 \u03BA\u03B5\u03BB\u03B9\u03CE\u03BD|\u03A5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03BC\u03CC\u03BD\u03BF \u03AD\u03BD\u03B1 \u03C3\u03CD\u03BD\u03BF\u03BB\u03BF \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD, \u03CC\u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 \u03BA\u03BB\u03B9\u03BA \u03C3\u03B5 \u03BA\u03AC\u03B8\u03B5 \u03AD\u03BD\u03B1 \u03C4\u03BC\u03AE\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03C3\u03C5\u03BD\u03CC\u03BB\u03BF\u03C5 \u03CE\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03BD\u03B1\u03B4\u03B9\u03B1\u03C4\u03B1\u03C7\u03B8\u03BF\u03CD\u03BD \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03C4\u03BC\u03AE\u03BC\u03B1\u03C4\u03B1 \u03C3\u03C4\u03B7 \u03C3\u03C9\u03C3\u03C4\u03AE \u03C4\u03BF\u03C5\u03C2 \u03B8\u03AD\u03C3\u03B7. @panels.InformationScreen=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 \u03BF\u03B8\u03CC\u03BD\u03B7\u03C2|\u0395\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03C3\u03C5\u03BD\u03BF\u03BB\u03BF \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD, \u03CC\u03C0\u03BF\u03C5 \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03B7 \u03B4\u03C5\u03BD\u03B1\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 \u03C0\u03BF\u03BB\u03C5\u03BC\u03B5\u03C3\u03B9\u03BA\u03BF\u03CD \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03BA\u03AC\u03B8\u03B5 \u03C4\u03BC\u03AE\u03BC\u03B1 \u03C4\u03B7\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B1\u03C2. @puzzles.DoublePuzzle=\u0394\u03B9\u03C0\u03BB\u03CC \u03C0\u03B1\u03B6\u03BB|\u0395\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03B4\u03CD\u03BF \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03B1. \u03A4\u03BF \u03AD\u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03C4\u03B1 \u03C4\u03BC\u03AE\u03BC\u03B1\u03C4\u03B1 \u03C4\u03B7\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B1\u03C2 \u03B1\u03BD\u03B1\u03BA\u03B1\u03C4\u03B5\u03BC\u03AD\u03BD\u03B1, \u03B5\u03BD\u03CE \u03C4\u03BF \u03AC\u03BB\u03BB\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AC\u03B4\u03B5\u03B9\u03BF. \u03A3\u03BA\u03BF\u03C0\u03CC\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B7 \u03B1\u03BD\u03B1\u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C4\u03C9\u03BD \u03C4\u03BC\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03C3\u03C4\u03BF \u03AC\u03B4\u03B5\u03B9\u03BF \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1 \u03BC\u03B5 \u03BC\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03AE \u03C4\u03BF\u03C5\u03C2 \u03C3\u03B5 \u03B1\u03C5\u03C4\u03CC. @puzzles.ExchangePuzzle=\u03A0\u03B1\u03B6\u03BB \u03B1\u03BD\u03C4\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE\u03C2|\u03A4\u03B1 \u03C4\u03BC\u03AE\u03BC\u03B1\u03C4\u03B1 \u03C4\u03B7\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B1\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03BD\u03B1\u03BA\u03B1\u03C4\u03C9\u03BC\u03AD\u03BD\u03B1 \u03C3\u03C4\u03BF \u03AF\u03B4\u03B9\u03BF \u03C0\u03BB\u03B1\u03AF\u03C3\u03B9\u03BF. \u03A3\u03B5 \u03BA\u03AC\u03B8\u03B5 \u03B2\u03AE\u03BC\u03B1, \u03B4\u03CD\u03BF \u03C4\u03BC\u03AE\u03BC\u03B1\u03C4\u03B1 \u03B1\u03BD\u03C4\u03B1\u03BB\u03BB\u03AC\u03C3\u03C3\u03BF\u03C5\u03BD \u03C4\u03B9\u03C2 \u03B8\u03AD\u03C3\u03B5\u03B9\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03BC\u03AD\u03C7\u03C1\u03B9 \u03BD\u03B1 \u03B2\u03C1\u03B5\u03B8\u03B5\u03AF \u03B7 \u03C3\u03C9\u03C3\u03C4\u03AE \u03C4\u03BF\u03C5\u03C2 \u03B8\u03AD\u03C3\u03B7. @puzzles.HolePuzzle=\u03A0\u03B1\u03B6\u03BB \u03BC\u03B5 \u03AD\u03BD\u03B1 \u03BA\u03B5\u03BD\u03CC|\u039C\u03AD\u03C3\u03B1 \u03C3\u03C4\u03BF \u03C0\u03BB\u03B1\u03AF\u03C3\u03B9\u03BF \u03C4\u03B7\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B1\u03C2 \u03BB\u03B5\u03AF\u03C0\u03B5\u03B9 \u03AD\u03BD\u03B1 \u03C4\u03BC\u03AE\u03BC\u03B1 \u03C4\u03B7\u03C2, \u03B5\u03BD\u03CE \u03C4\u03B1 \u03AC\u03BB\u03BB\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03BD\u03B1\u03BA\u03B1\u03C4\u03C9\u03BC\u03AD\u03BD\u03B1. \u03A3\u03B5 \u03BA\u03AC\u03B8\u03B5 \u03B2\u03AE\u03BC\u03B1 \u03AD\u03BD\u03B1 \u03B1\u03C0\u03CC \u03C4\u03B1 \u03BA\u03BF\u03BC\u03BC\u03AC\u03C4\u03B9\u03B1 \u03C0\u03BF\u03C5 \u03B2\u03C1\u03AF\u03C3\u03BA\u03BF\u03BD\u03C4\u03B1\u03B9 \u03B3\u03CD\u03C1\u03C9 \u03B1\u03C0\u03CC \u03C4\u03BF \u03BA\u03B5\u03BD\u03CC \u03BC\u03B5\u03C4\u03B1\u03BA\u03B9\u03BD\u03B5\u03AF\u03C4\u03B1\u03B9, \u03BC\u03AD\u03C7\u03C1\u03B9 \u03BD\u03B1 \u03B2\u03C1\u03B5\u03B8\u03B5\u03AF \u03B7 \u03C3\u03C9\u03C3\u03C4\u03AE \u03B8\u03AD\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C4\u03BC\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD. @text.WrittenAnswer=\u0393\u03C1\u03B1\u03C0\u03C4\u03AE \u03B1\u03C0\u03AC\u03BD\u03C4\u03B7\u03C3\u03B7|\u0395\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03C3\u03CD\u03BD\u03BF\u03BB\u03BF \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03BA\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03BA\u03AC\u03B8\u03B5 \u03C4\u03BC\u03AE\u03BC\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B4\u03BF\u03B8\u03B5\u03AF \u03B7 \u03B1\u03BD\u03C4\u03AF\u03C3\u03C4\u03BF\u03B9\u03C7\u03B7 \u03B3\u03C1\u03B1\u03C0\u03C4\u03AE \u03B1\u03C0\u03AC\u03BD\u03C4\u03B7\u03C3\u03B7. @text.FillInBlanks=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: \u03C3\u03C5\u03BC\u03C0\u03BB\u03AE\u03C1\u03C9\u03C3\u03B7 \u03BA\u03B5\u03BD\u03CE\u03BD|\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C3\u03C5\u03BC\u03C0\u03BB\u03B7\u03C1\u03CE\u03C3\u03B5\u03B9 \u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2, \u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1 \u03AE \u03C6\u03C1\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C0\u03BF\u03C5 \u03BB\u03B5\u03AF\u03C0\u03BF\u03C5\u03BD \u03AE \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03B1\u03C1\u03B1\u03BB\u03BB\u03B1\u03B3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03C3\u03B5 \u03AD\u03BD\u03B1 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF. \u0397 \u03BB\u03CD\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03BA\u03AC\u03B8\u03B5 \u03AD\u03BD\u03B1 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03BF\u03C1\u03B9\u03C3\u03C4\u03B5\u03AF \u03BC\u03B5 \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03BF\u03CD\u03C2 \u03C4\u03C1\u03CC\u03C0\u03BF\u03C5\u03C2: \u03BC\u03B5 \u03B3\u03C1\u03AC\u03C8\u03B9\u03BC\u03BF \u03C3\u03B5 \u03AD\u03BD\u03B1 \u03BA\u03B5\u03BD\u03CC \u03B4\u03B9\u03AC\u03C3\u03C4\u03B7\u03BC\u03B1, \u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 \u03BC\u03B9\u03B1\u03C2 \u03C6\u03C1\u03AC\u03C3\u03B7\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BB\u03AC\u03B8\u03B7, \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B1\u03C0\u03CC \u03BC\u03B9\u03B1 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03BC\u03B5 \u03C0\u03B9\u03B8\u03B1\u03BD\u03AD\u03C2 \u03B1\u03C0\u03B1\u03BD\u03C4\u03AE\u03C3\u03B5\u03B9\u03C2. @text.Identify=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: \u03C4\u03B1\u03C5\u03C4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD|\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B4\u03B5\u03AF\u03BE\u03B5\u03B9 \u03BC\u03B5 \u03BA\u03BB\u03B9\u03BA \u03C4\u03BF\u03C5 \u03C0\u03BF\u03BD\u03C4\u03B9\u03BA\u03B9o\u03CD \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2, \u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1, \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03CD\u03C2 \u03AE \u03C3\u03B7\u03BC\u03B5\u03AF\u03B1 \u03C3\u03C4\u03AF\u03BE\u03B7\u03C2. @text.Order=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: \u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD|\u039A\u03B1\u03C4\u03AC \u03C4\u03BF \u03C3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03BC\u03CC \u03B1\u03C5\u03C4\u03AE\u03C2 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03BC\u03B5\u03C1\u03B9\u03BA\u03AD\u03C2 \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2 \u03AE \u03C0\u03B1\u03C1\u03AC\u03B3\u03C1\u03B1\u03C6\u03BF\u03B9 \u03C4\u03BF\u03C5 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03AD\u03C7\u03B8\u03B7\u03BA\u03B1\u03BD \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03BD\u03B1\u03BA\u03B1\u03C4\u03B5\u03BC\u03AD\u03BD\u03B5\u03C2. \u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03B9\u03C2 \u03B2\u03AC\u03BB\u03B5\u03B9 \u03C3\u03C4\u03B7 \u03C3\u03C9\u03C3\u03C4\u03AE \u03C3\u03B5\u03B9\u03C1\u03AC. @text.Complete=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: \u03C3\u03C5\u03BC\u03C0\u03BB\u03AE\u03C1\u03C9\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5| \u03A4\u03BC\u03AE\u03BC\u03B1\u03C4\u03B1 \u03B5\u03BD\u03CC\u03C2 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 (\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1, \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2, \u03C3\u03B7\u03BC\u03B5\u03AF\u03B1 \u03C3\u03C4\u03AF\u03BE\u03B7\u03C2, \u03C6\u03C1\u03AC\u03C3\u03B5\u03B9\u03C2) \u03AD\u03C7\u03BF\u03C5\u03BD \u03B5\u03BE\u03B1\u03B9\u03C1\u03B5\u03B8\u03B5\u03AF \u03BA\u03B1\u03B9 \u03BF \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03B1 \u03C3\u03C5\u03BC\u03C0\u03BB\u03B7\u03C1\u03CE\u03C3\u03B5\u03B9. @textGrid.CrossWord=\u03A3\u03C4\u03B1\u03C5\u03C1\u03CC\u03BB\u03B5\u03BE\u03B1|\u03A4\u03BF \u03C3\u03C4\u03B1\u03C5\u03C1\u03CC\u03BB\u03B5\u03BE\u03BF \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C3\u03C5\u03BC\u03C0\u03BB\u03B7\u03C1\u03C9\u03B8\u03B5\u03AF \u03C3\u03CD\u03BC\u03C6\u03C9\u03BD\u03B1 \u03BC\u03B5 \u03C4\u03BF\u03C5\u03C2 \u03BF\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD\u03C2 \u03C4\u03C9\u03BD \u03BB\u03AD\u03BE\u03B5\u03C9\u03BD. \u039F\u03B9 \u03BF\u03C1\u03B9\u03C3\u03BC\u03BF\u03AF \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF, \u03B3\u03C1\u03B1\u03C6\u03B9\u03BA\u03CC \u03AE \u03AE\u03C7\u03BF\u03C2. \u03A4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03B4\u03B5\u03AF\u03C7\u03BD\u03B5\u03B9 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C4\u03BF\u03C5\u03C2 \u03BF\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD\u03C2 \u03C4\u03C9\u03BD \u03B4\u03C5\u03BF \u03BB\u03AD\u03BE\u03B5\u03C9\u03BD \u03C0\u03BF\u03C5 \u03C4\u03AD\u03BC\u03BD\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF \u03C3\u03B7\u03BC\u03B5\u03AF\u03BF \u03C0\u03BF\u03C5 \u03B2\u03C1\u03AF\u03C3\u03BA\u03B5\u03C4\u03B1\u03B9 \u03BF \u03BA\u03AD\u03C1\u03C3\u03BF\u03C1\u03B1\u03C2. @textGrid.WordSearch=\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BB\u03AD\u03BE\u03B5\u03C9\u03BD|\u039F\u03B9 \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B2\u03C1\u03B5\u03B8\u03BF\u03CD\u03BD \u03C3\u03C4\u03BF \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1 \u03C4\u03C9\u03BD \u03B3\u03C1\u03B1\u03BC\u03BC\u03AC\u03C4\u03C9\u03BD. \u03A4\u03B1 \u03BF\u03C5\u03B4\u03AD\u03C4\u03B5\u03C1\u03B1 \u03BA\u03B5\u03BB\u03B9\u03AC \u03C4\u03BF\u03C5 \u03C0\u03BB\u03AD\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2 (\u03B1\u03C5\u03C4\u03AC \u03C0\u03BF\u03C5 \u03B4\u03B5\u03BD \u03AD\u03C7\u03BF\u03C5\u03BD \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2) \u03C3\u03C5\u03BC\u03C0\u03BB\u03B7\u03C1\u03CE\u03BD\u03BF\u03BD\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03C4\u03C5\u03C7\u03B1\u03AF\u03BF\u03C5\u03C2 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B5\u03C2. src/core/edu/xtec/resources/activities/listactivities_es.properties000066400000000000000000000102771335566474600263720ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Asociaci\u00F3n compleja|En este tipo de activitat se presentan tambi\u00E9n dos conjuntos de informaci\u00F3n, pero \u00E9stos pueden tener un n\u00FAmero diferente de elementos y entre ellos se pueden dar diversos tipos de relaci\u00F3n: Uno a uno, diversos a uno, elementos sin asignar... @associations.SimpleAssociation=Asociaci\u00F3n simple|Se presentan dos conjuntos de informaci\u00F3n que tienen el mismo n\u00FAmero de elementos. A cada elemento del conjunto imagen corresponde s\u00F3lo un elemento del conjunto origen. @memory.MemoryGame=Juego de memoria|Cada una de las piezas que forman el objeto aparece escondido dos veces dentro de la ventana de juego. En cada jugada se destapan un par de piezas, que se vuelven a esconder si no son id\u00E9nticas. El objetivo es localizar todas las parejas. @panels.Explore=Actividad de exploraci\u00F3n|Se muestra una informaci\u00F3n inicial y al hacer clic en ella aparece, para cada elemento, una determinada pieza de informaci\u00F3n. @panels.Identify=Actividad de identificaci\u00F3n|Se presenta s\u00F3lo un conjunto de informaci\u00F3n y hay que hacer clic en aquellos elementos que cumplan una determinada condici\u00F3n. @panels.InformationScreen=Pantalla de informaci\u00F3n|Se muestra un conjunto de informaci\u00F3n y, opcionalmente, se ofrece la posibilidad de activar el contenido multimedia asociado a cada elemento. @puzzles.DoublePuzzle=Puzzle doble|Se muestran dos paneles. En uno aparece la informaci\u00F3n desordenada y el otro est\u00E1 vac\u00EDo. Hay que reconstruir el objeto en el panel vac\u00EDo arrastrando las piezas una por una. @puzzles.ExchangePuzzle=Puzzle de intercambio|En un \u00FAnico panel se mezcla la informaci\u00F3n. En cada jugada se conmutan las posiciones de dos piezas hasta ordenar el objeto. @puzzles.HolePuzzle=Puzzle de agujero|En un \u00FAnico panel se hace desaparecer una pieza y se mezclan las restantes. En cada jugada se puede desplazar una de las piezas que limitan con el agujero, hasta tenerlas todas en el orden original. @text.WrittenAnswer=Respuesta escrita|Se muestra un conjunto de informaci\u00F3n y, para cada uno de sus elementos, hay que escribir el texto correspondiente. @text.FillInBlanks=Texto: rellenar agujeros|En un texto se seleccionan determinadas palabras, letras y frases que se esconden o se camuflan. La resoluci\u00F3n de cada uno de los elementos escondidos se puede plantear de maneras diferentes: Escribiendo en un espacio vac\u00EDo, corrigiendo una expresi\u00F3n que contiene errores o seleccionando en una lista entre distintas respuestas posibles. @text.Identify=Texto: identificar elementos|El usuario debe se\u00F1alar con un clic del rat\u00F3n determinadas palabras, letras, cifras, s\u00EDmbolos o signos de puntuaci\u00F3n. @text.Order=Texto: ordenar elementos|En el momento de dise\u00F1ar la actividad se seleccionan en el texto algunas palabras o p\u00E1rrafos que se mezclar\u00E1n entre s\u00ED. El usuario ha de intentar volver a ponerlo en orden. @text.Complete=Texto: completar texto|En un texto se hacen desaparecer determinados elementos (letras, palabras, signos de puntuaci\u00F3n, frases) y el usuario debe completarlo. @textGrid.CrossWord=Crucigrama|Hay que ir rellenando el panel de palabras a partir de sus definiciones. Las definiciones pueden ser textuales, gr\u00E1ficas o sonoras. El programa muestra autom\u00E1ticamente las definiciones de las dos palabras que se cruzan en la posici\u00F3n donde se encuentre el cursor en cada momento. @textGrid.WordSearch=Sopa de letras|Hay que encontrar las palabras escondidas en una parrilla de letras. Las casillas neutras de la parrilla (aqu\u00E9llas que no pertenecen a ninguna palabra) se rellenan con caracteres seleccionados al azar en cada jugada. src/core/edu/xtec/resources/activities/listactivities_eu.properties000066400000000000000000000070761335566474600263770ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Elkarketa berezia|Honek ere bi informazio multzo ditu baina zati kopuru ezberdina izan dezakete eta zatien harteko lotura ere ezberdina izan daiteke: lehenengoko bati bigarreneko bakarra, lehenengoko bati bigarreneko hainbat, loturarik gabeak, e.a. @associations.SimpleAssociation=Elkarketa arrunta|Zati kopuru bera duten bi informazio multzo daude. Lehenengoaren zati bakoitzari bigarrenaren zati bakarra dagokio eta ez gehiago. @memory.MemoryGame=Bikoteak egin| Zati bakoitza bi aldiz agertuko da buruz behera. Bakoitzean bi zati giratuko dira gora eta berriz ere buruz bera jarriko dira ez badute bikotea osatzen. Helburua bikote guztiak aurkitzea da. @panels.Explore=Ikertu-jarduera| Informazioaren lehen zatia ematen da eta horretan sakatuta elementu bakoitzerako informazio zati zehatz bat erakusten da. @panels.Identify=Identifikazu atalak| Informazio atal batzuk daude eta berauetan sakatuta adierazi behar duzu zeintzuk betetzen duten baldintza zehatz bat. @panels.InformationScreen=Informazioa pantailan| Informazio atal batzuk daude eta aukera dago atal bakoitzerako multimedia edukia aktibatzeko bertan sakatuta. @puzzles.DoublePuzzle=Puzzle bikoitza| Bi taula erakusten dira. Lehenengoak informazioa nahastuta du eta bigarrena hutsik dago. Helburua hutsik dagoen taula osatzea da lehenengoko piezak banan banan arrastaka eramanda. @puzzles.ExchangePuzzle=Zatiak ordenatu|Informazioa nahastuta dago panel berean. Saiakera bakoitzean bi zati mugituko dira guztiak ordenatuta geratu arte. @puzzles.HolePuzzle=Puzzle mugikorra|Panel batean informazio-piezak nahastuta daude eta bat kanpoan dago gainera. Piezak hutsik dagoen tartea erabilita mugitu egin behar dira bere posiziora eramateko eta kanpoan dagoen piezarentzat bere lekua libre uzteko. @text.WrittenAnswer=Idatzi erantzuna|Informazio atalak erakusten dira eta horiei dagokien testua idatzi egin behar da. @text.FillInBlanks=Testua: hutsuneak bete|Erabiltzaileak testuan ezkutatu edo kamuflatu diren hitzak, letrak edo esaldiak osatu behar ditu. Elementu bakoitzaren soluzioa era ezberdinetan eman daiteke: hutsunea bete, akatsak dituen esaldia zuzendu edo erantzun multzo batetik aukeratu. @text.Identify=Testua: Identifikatu elementuak|Erabiltzaileak hitzak, hizkiak, zenbakiak, sinboloak edo puntuazio-markak identifikatu behar ditu saguarekin markatuta. @text.Order=Testua: Elementuak ordenatu|Jarduera hau diseinatzean, hainbat hitz edo paragrafo aukeratzen dira testutik eta nahastu egiten dira bertan. Erabiltzaileak berriz ere bere lekura eraman beharko ditu. @text.Complete=Testua: Testua osatu|Testuaren hainbat zati (hizkiak, hitzak, puntuazio-markak edo esaldiak) testutik ateratzen dira eta erabiltzaileak osatu egin behar du. @textGrid.CrossWord=Hitz gurutzatuak|Hitzen taula definizioen bitartez osatu behar da. Definizioa testua, grafikoa edo soinu bidezkoa izan daiteke. Programak automatikoki erakusten ditu kurtsorearen kokapenean gurutzatzen diren bi hitzen definizioak. @textGrid.WordSearch=Bilatu hitza|Ezkutuko hitzak letra taula batean daude. Taulako laukitxoetan dauden hizki neutralak (hitzarenak ez direnak) ausaz aukeratuko dira. src/core/edu/xtec/resources/activities/listactivities_fr.properties000066400000000000000000000100571335566474600263660ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Association complexe|Dans cette activit\u00E9 il y a aussi deux jeux d'information, mais ils peuvent avoir des nombres de cases diff\u00E9rentes et peuvent avoir des relations diff\u00E9rentes entre elles ex : un vers un, plusieurs vers un, parties sans relations etc... @associations.SimpleAssociation=Association simple|Il y a deux jeux d'information qui ont le m\u00EAme nombre de cellules. A chaque partie correspond une et une seule concordance dans le second jeu. @memory.MemoryGame=Jeu m\u00E9mory|Chaque pi\u00E8ce appara\u00EEt deux fois, mais face cach\u00E9e. A chaque fois que deux pi\u00E8ces sont retourn\u00E9es and are turned back over if they are not the same. L'objectif est de retrouver toutes les paires. @panels.Explore=Activit\u00E9 d'exploration|Une pi\u00E8ce initiale d'information est montr\u00E9e et, en cliquant dessus, une pi\u00E8ce donn\u00E9e d'information est montr\u00E9e pour chaque \u00E9l\u00E9ment. @panels.Identify=Identification de cellules|Il y a juste un jeu d'information et vous avez juste \u00E0 cliquer sur les parties qui remplissent certaines conditions. @panels.InformationScreen=Ecran d'information|Un jeu d'information est mmontr\u00E9 et il y a une option d'activation de contenu multim\u00E9dia pour chaque pi\u00E8ce d'information. @puzzles.DoublePuzzle=Double puzzle| Deux grilles sont montr\u00E9es. Une contient les informations en d\u00E9sordre et la seconde est vide. L'objectif est de r\u00E9arranger la grille vide en prenant les pi\u00E8ces une \u00E0 une. @puzzles.ExchangePuzzle=Puzzle d'\u00E9change|The information is swapped within the same panel. In each go two pieces swap position until the object is reordered. @puzzles.HolePuzzle=Puzzle \u00E0 trou|In the same panel one piece is missing and the others are shuffled. In each go one of the pieces next to the empty space is moved until they are back in the original order. @text.WrittenAnswer=R\u00E9ponse \u00E9crite|Un jeu d'information est montr\u00E9 et le texte correspondant \u00E0 chaque partie doit \u00EAtre \u00E9crit. @text.FillInBlanks=Text: Remplir les blancs|L'utilisateur doit compl\u00E9ter certains mots, lettres et phrases qui ont \u00E9t\u00E9 cach\u00E9s ou camoufl\u00E9s dans le texte. La solution pour chaque \u00E9l\u00E9ment peut \u00EAtre d\u00E9finie de diff\u00E9rentes mani\u00E8res : remplir un champ vide, corriger une phrase contenant des erreurs, ou en s\u00E9lectionnant une r\u00E9ponse dans une liste de r\u00E9ponses possibles. @text.Identify=Text: Identifier des \u00E9l\u00E9ments|L'utilisateur doit pointer ceratains mots, lettres, nombres, symboles ou marques de ponctuation en cliquant avec la souris. @text.Order=Text: Mise en ordre d'\u00E9l\u00E9ments|Dans cette activit\u00E9, certains mots ou paragraphes d'un texte sont s\u00E9lectionn\u00E9s et m\u00E9lang\u00E9s. L'utilisateur doit les remettre en ordre. @text.Complete=Text: Texte \u00E0 compl\u00E9ter|Diff\u00E9rentes parties d'un texte (lettres, mots, signes de ponctuation, ou phrases) sont retir\u00E9es et l'utilisateur doit le compl\u00E9ter. @textGrid.CrossWord=Mots crois\u00E9s|Le tableau de mots doit \u00EAtre compl\u00E9t\u00E9 en accord avec les d\u00E9finitions. Les d\u00E9finitions peuvent \u00EAtre du texte, graphique ou son. Le programme montre automatiquement les d\u00E9finitions des deux mots qui croisent une position du curseur. @textGrid.WordSearch=Recherche de mots|Les mots cach\u00E9s doivent \u00EAtre trouv\u00E9s dans une grille de lettres. Les cellules neutres dans la grille(celles qui n'ont pas de mots) sont compl\u00E9t\u00E9es avec des lettres choisie au hasard. src/core/edu/xtec/resources/activities/listactivities_gl.properties000066400000000000000000000101471335566474600263610ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Asociaci\u00F3n complexa|Neste tipo de actividade pres\u00E9ntanse tam\u00E9n dous conxuntos de informaci\u00F3n, pero estes poden ter un n\u00FAmero diferente de elementos e entre eles p\u00F3dense dar diversos tipos de relaci\u00F3ns: Un a un, varios a un, elementos sen asignar... @associations.SimpleAssociation=Asociaci\u00F3n simple|Pres\u00E9ntanse dous conxuntos de informaci\u00F3n que te\u00F1en o mesmo n\u00FAmero de elementos. A cada elemento do conxunto orixe corresponde un e s\u00F3 un elemento do conxunto imaxe. @memory.MemoryGame=Xogo de memoria|Cada unha das pezas que forman o obxecto pres\u00E9ntase d\u00FAas veces e agochadas na xanela de xogo. En cada tirada desc\u00F3brense un par de pezas, que se volven a agochar se non foren id\u00E9nticas. O obxectivo \u00E9 descobrir todas as parellas. @panels.Explore=Actividade de exploraci\u00F3n|M\u00F3strase unha informaci\u00F3n inicial e cando se preme nela aparece, para cada elemento, unha determinada peza de informaci\u00F3n. @panels.Identify=Actividade de identificaci\u00F3n|Pres\u00E9ntase s\u00F3 un conxunto de informaci\u00F3n e hai que premer nos elementos que cumpriren unha determinada condici\u00F3n. @panels.InformationScreen=Pantalla de informaci\u00F3n|M\u00F3strase un conxunto de informaci\u00F3n e, opcionalmente, ofr\u00E9cese a posibilidade de activar o contido multimedia asociado a cada elemento. @puzzles.DoublePuzzle=Quebracabezas dobre|M\u00F3stranse dous paneis. Nun aparece a informaci\u00F3n desordenada e o outro est\u00E1 baleiro. Hai que reconstru\u00EDr o obxecto neste \u00FAltimo arrastrando as pezas unha a unha. @puzzles.ExchangePuzzle=Quebracabezas de intercambio|Nun \u00FAnico panel mest\u00FArase a informaci\u00F3n. En cada xogada interc\u00E1mbianse as posici\u00F3ns de d\u00FAas pezas ata ordenar o obxecto. @puzzles.HolePuzzle=Quebracabezas de burato|Nun \u00FAnico panel faise desaparecer unha peza e mest\u00FAranse as restantes. En cada xogada p\u00F3dese desprazar unha das pezas veci\u00F1as do burato, ata telas todas na orde orixinal. @text.WrittenAnswer=Resposta escrita|M\u00F3strase un conxunto de informaci\u00F3n e, para cada elemento, hai que escribir o texto correspondente ou de resposta. @text.FillInBlanks=Texto: encher buratos|Nun texto esc\u00F3llense determinadas palabras, letras e frases que se agochan ou camuflan. A resoluci\u00F3n de cada un dos elementos agochados p\u00F3dese efectuar de xeitos diferentes: Escribindo nun espacio baleiro, corrixindo unha expresi\u00F3n que cont\u00E9n erros ou escoll\u00E9ndoa nunha lista entre distintas respostas pos\u00EDbeis. @text.Identify=Texto: identificar elementos|O usuario ten que sinalar cun clic do rato palabras, letras, cifras, s\u00EDmbolos ou signos de puntuaci\u00F3n. @text.Order=Texto: ordenar elementos|No dese\u00F1o da actividade esc\u00F3llense no texto palabras ou par\u00E1grafos que se barallan. O usuario ten de intentar volver a p\u00F3lo en orde. @text.Complete=Texto: completar texto|Nun texto fanse desaparecer alg\u00FAns elementos (letras, palabras, signos de puntuaci\u00F3n, frases) e o usuario ten de completalo. @textGrid.CrossWord=Encrucillado|Hai que ir enchendo o panel de palabras a partir das definici\u00F3ns. As definici\u00F3ns poden ser textuais, gr\u00E1ficas ou sonoras. O programa mostra automaticamente as definici\u00F3ns das d\u00FAas palabras que se cruzan na posici\u00F3n actual do cursor. @textGrid.WordSearch=Sopa de letras|Hai que encontrar as palabras escondidas nunha cuadr\u00EDcula de letras. As celas neutras desta grella (as que non pertencen a ningunha palabra) \u00E9nchense con caracteres escolleitos ao chou en cada xogada. src/core/edu/xtec/resources/activities/listactivities_it.properties000066400000000000000000000066461335566474600264040ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Associazione complessa|In questa attivit\u00E0 ci sono due serie di informazioni, ma queste possono avere un diverso numero di parti e possono esserci differenti tipi di relazioni tra esse; es.: uno ad uno, vari con uno, parti con una relazione, etc. @associations.SimpleAssociation=Associazione semplice|Ci sono due serie di informazioni che hanno lo stesso numero di parti. Ciascuna parte della serie originale corrisponde a una, e solo una, parte dell'altra serie. @memory.MemoryGame=Memory|Ciascuno dei pezzi appare due volte, ma in fase di preparazione basta specificare una sola volta il contenuto di ogni cella. L'obiettivo del gioco \u00E8 trovare le coppie. @panels.Explore=Esplorazione|Un pezzo iniziale dell'informazione \u00E8 mostrato e, cliccando su essa, un atro pezzo di informazione \u00E8 mostrato per ciascun elemento. @panels.Identify=Identificare celle|C'\u00E8 una sola serie di informazioni: bisogna cliccare su quelle parti che rispondono a specifiche condizioni. @panels.InformationScreen=Schermata informativa|Una serie di informazioni viene mostrata e si possono attivare contenuti multimediali per ciascun pezzo di informazione. @puzzles.DoublePuzzle=Puzzle doppio|Sono mostrate due griglie. Una contiene le informazioni in disordine e l'altra \u00E8 vuota. L'obiettivo del gioco \u00E8 ricostruire le informazioni nella griglia vuota trascinando i pezzi uno ad uno. @puzzles.ExchangePuzzle=Puzzle a scambio|Le informazioni sono inserite in un unico pannello. I pezzi vengono scambiati di posizione, fino al riordino completo delle informazioni. @puzzles.HolePuzzle=Puzzle a buchi|Trascinamento di pezzi tagliati dal pannello originale. @text.WrittenAnswer=Scrivi la risposta|Una serie di informazioni viene mostrata e deve essere scritto un testo corrispondente per ciascuna parte di essa. @text.FillInBlanks=Testo: Riempi gli spazi|L'utente deve completare determinate parole, lettere e frasi che sono state nascoste o camuffate in un testo. La soluzione di ciascun elemento pu\u00F2 avvenire in diversi modi: scrittura nello spazio bianco; correzione di una frase con errori; selezione da una lista di possibili risposte. @text.Identify=Testo: Identifica gli elementi|L'utente deve cliccare su parole, lettere, numeri, simboli o segni di punteggiatura. @text.Order=Testo: Ordina gli elementi|L'utente deve mettere in ordine le parole o i paragrafi presentati in disordine. @text.Complete=Testo: Completa il testo|L'utente deve completare un testo nel quale alcune parti (lettere, parole, segni di punteggiatura o frasi) sono state tolte. @textGrid.CrossWord=Cruciverba|La tabella delle parole viene completata secondo le relative definizioni. Le definizioni possono essere testi, immagini o suoni. Il programma mostra automaticamente le definizioni alla selezione delle caselle. @textGrid.WordSearch=Crucipuzzle|Ricerca di parole nascoste in una griglia di lettere. Le celle neutre della griglia vengono completate con caratteri scelti a caso. src/core/edu/xtec/resources/activities/listactivities_nl.properties000066400000000000000000000067331335566474600263760ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Complexe associatie|In deze activiteit zijn er ook twee groepen informatie, maar deze kunnen verschillen in aantal en er kunnen verschillende type relaties zijn tussen de twee groepen zoals: een op een, verschillende op een, geen relatie, enzovoorts. @associations.SimpleAssociation=Simpele associatie|Er zijn twee groepen informatie, met evenveel elementen in elke groep. Elk element van de ene groep komt precies overeen met een element in de andere groep. @memory.MemoryGame=Duo's zoeken|Elk element komt twee keer voor, je ziet alleen de achterkant. Bij elke beurt worden er twee elementen zichtbaar gemaakt en terug onzichtbaar als ze niet gelijk zijn. Je moet alle duo's vinden. @panels.Explore=Exploreren activiteit|Er wordt een lijst met informatie getoond, en als je op een element klikt, wordt er bijkomende uitleg gegeven. @panels.Identify=Identificeer cellen|Er is een lijst met informatie en je moet op deze delen klikken die aan een bepaalde voorwaarde voldoen. @panels.InformationScreen=Informatie scherm|Er is een lijst met informatie en er is de optie om multimedia te vertonen voor elk element. @puzzles.DoublePuzzle=Dubbele puzzel|Er worden twee tabellen getoond. Een bevat de informatie die doorheen is geschud en de ander is leeg. Het doel is de lege tabel te vullen in de juiste volgorde door de stukken een voor een te verslepen. @puzzles.ExchangePuzzle=Verwissel puzzel|De informatie is in dezelfde tabel door elkaar gehaald. Bij elke beurt moet je twee delen omwisselen totdat de puzzel is opgelost. @puzzles.HolePuzzle=Gat puzzel|In dezelfde tabel ontbreekt een stukje en de andere zijn door elkaar geschud. Bij elke beurt wordt een stukje in de opening geschoven tot de puzzel gemaakt is.. @text.WrittenAnswer=Geschreven antwoord|Er wordt informatie getoond en de overeenstemmende tekst moet geschreven worden. @text.FillInBlanks=Tekst: Invuloefening|De gebruiker moet sommige woorden, letters en zinnen die weggelaten zijn vervolledigen. De oplossing kan op verschillende manieren gegeven worden: invullen op een lege plaats, verbeteren van fouten of kiezen uit een aantal oplossingen. @text.Identify=Tekst: Identifier elementen|De gebruiker moet sommige woorden, letters, cijfers, symbolen of leestekens aanklikken met de muis. @text.Order=Tekst: Elementen ordenen|Sommige woorden of alinea's zijn door elkaar gezet. De gebruiker moet ze weer in de juiste volgorde zetten. @text.Complete=Tekst: Vervolledig tekst|Verschillende delen van een tekst (letters, woorden, leestekens of zinnen) zijn weggelaten en de gebruiker moet de tekst vervolledigen. @textGrid.CrossWord=Kruiswoordraadsel|Het kruiswoordraadsel moet ingevuld worden door gebruik te maken van de definities. De definities mogen met tekst, afbeeldingen of geluiden. Het programma geeft de twee definities van de woorden waar er een letter wordt ingevuld. @textGrid.WordSearch=Woordzoeker|De verborgen woorden moeten gezocht worden in een rooster met letters. De cellen die geen letters van woorden bevatten, worden willekeurig opgevuld. src/core/edu/xtec/resources/activities/listactivities_pt.properties000066400000000000000000000100051335566474600263730ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Associa\u00E7\u00E3o complexa|Neste tipo de actividade dois conjuntos (pain\u00E9is) s\u00E3o associados entre si. Cada painel pode conter uma quantidade distinta de c\u00E9lulas e as rela\u00E7\u00F5es podem ser: um-para-um, muitos para um, partes sem uma rela\u00E7\u00E3o, etc. @associations.SimpleAssociation=Associa\u00E7\u00E3o simples|Dois conjuntos de informa\u00E7\u00E3o (pain\u00E9is) com a mesma quantidade de c\u00E9lulas. Cada parte do conjunto original corresponde a uma - e somente uma - parte do segundo conjunto. @memory.MemoryGame=Jogo de mem\u00F3ria|Cada uma das pe\u00E7as (de uma imagem escolhida) possui o seu par, todas com as faces voltadas para baixo. A cada tentativa, duas pe\u00E7as ser\u00E3o mostradas. Caso n\u00E3o formem um par (n\u00E3o sejam iguais), voltam-se de face para baixo. O objectivo \u00E9 encontrar todos os pares. @panels.Explore=Explora\u00E7\u00E3o|Clicar sobre partes do painel mostra informa\u00E7\u00F5es. @panels.Identify=Identificar c\u00E9lulas|Existe um painel de informa\u00E7\u00F5es. Clique nas partes que correspondem a determinada condi\u00E7\u00E3o. @panels.InformationScreen=Ecr\u00E3 de informa\u00E7\u00E3o|Um conjunto de informa\u00E7\u00F5es \u00E9 mostrado. Existe a op\u00E7\u00E3o de activar um conte\u00FAdo da mediateca para cada parte da informa\u00E7\u00E3o. @puzzles.DoublePuzzle=Quebra-cabe\u00E7as duplo|S\u00E3o exibidos dois pain\u00E9is. Um cont\u00E9m a informa\u00E7\u00E3o desordenada e o outro est\u00E1 vazio. O objecto deve ser reorganizado no painel vazio arrastando cada pe\u00E7a. @puzzles.ExchangePuzzle=Quebra-cabe\u00E7as de troca|A informa\u00E7\u00E3o \u00E9 baralhada dentro do mesmo painel. A cada tentativa, duas pe\u00E7as trocam de posi\u00E7\u00E3o at\u00E9 que o utilizador consiga colocar tudo em ordem. @puzzles.HolePuzzle=Quebra-cabe\u00E7as com lacuna|As pe\u00E7as (menos uma) surgem baralhadas num mesmo painel. Uma das pe\u00E7as cont\u00EDgua ao espa\u00E7o vazio \u00E9 movida at\u00E9 que todas sejam colocadas em ordem. @text.WrittenAnswer=Resposta escrita|Um painel de informa\u00E7\u00F5es \u00E9 mostrado e o texto correspondente para cada uma das partes deve ser escrito. @text.FillInBlanks=Texto: Preencher lacunas|O utilizador completa palavras, letras e frases que foram escondidas ou camufladas num texto. A resolu\u00E7\u00E3o de cada um dos elementos pode ser feita de diferentes modos: escrever num espa\u00E7o em branco (lacuna); corrigir a frase que cont\u00E9m erros; ou seleccionar a resposta correcta a partir de uma lista. @text.Identify=Texto: Identificar elementos|O utilizador destaca algumas palavras, letras, n\u00FAmeros, s\u00EDmbolos ou pontua\u00E7\u00E3o com um clique. @text.Order=Texto: Ordenar elementos|O utilizador ordena correctamente as palavras (ou par\u00E1grafos inteiros) de um texto previamente desordenadas. @text.Complete=Texto: Completar texto|V\u00E1rias partes de um texto (letras, palavras, pontua\u00E7\u00E3o, ou frases) s\u00E3o retiradas e o utilizador deve complet\u00E1-las. @textGrid.CrossWord=Palavras Cruzadas|Completar a grelha de acordo com as defini\u00E7\u00F5es. As defini\u00E7\u00F5es podem ser mostradas como texto, imagens ou som. O jClic exibe automaticamente as defini\u00E7\u00F5es de duas palavras que cruzam a posi\u00E7\u00E3o do cursor. @textGrid.WordSearch=Sopa de letras|As palavras escondidas devem ser encontradas numa grelha de letras. As c\u00E9lulas neutras na grelha (as que n\u00E3o t\u00EAm palavras) s\u00E3o completadas com caracteres escolhidos aleatoriamente ou definidos pelo autor. src/core/edu/xtec/resources/activities/listactivities_pt_BR.properties000066400000000000000000000105621335566474600267660ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Associa\u00E7\u00E3o complexa|Nesta atividade h\u00E1 dois conjuntos de informa\u00E7\u00E3o, mas estes conjuntos podem ter um n\u00FAmero diferente de elementos e podem existir diferentes tipos de rela\u00E7\u00E3o entre eles, por exemplo: um-para-um, v\u00E1rios para um, partes sem uma rela\u00E7\u00E3o, etc. @associations.SimpleAssociation=Associa\u00E7\u00E3o simples|H\u00E1 dois conjuntos de informa\u00E7\u00E3o que possuem o mesmo n\u00FAmero de partes. Cada parte do conjunto original corresponde a uma, e somente uma, parte do segundo conjunto. @memory.MemoryGame=Jogo da mem\u00F3ria|Cada um dos peda\u00E7os (de uma imagem selecionada) aparece duas vezes, mas com a face voltada para baixo. A cada tentativa dois peda\u00E7os s\u00E3o revelados e t\u00EAm sua face novamente voltada para baixo se n\u00E3o forem iguais. O objetivo \u00E9 encontrar todos os pares. @panels.Explore=Atividade de explora\u00E7\u00E3o|Um peda\u00E7o inicial de informa\u00E7\u00E3o \u00E9 mostrado e, ao clique do mouse, uma pequena informa\u00E7\u00E3o \u00E9 fornecida para cada elemento. @panels.Identify=Atividade de identifica\u00E7\u00E3o|H\u00E1 somente um conjunto de informa\u00E7\u00F5es e voc\u00EA deve clicar nas partes que corresponderem a uma certa condi\u00E7\u00E3o. @panels.InformationScreen=Tela de informa\u00E7\u00E3o|Um conjunto de informa\u00E7\u00F5es \u00E9 exibido e existe a op\u00E7\u00E3o de ativar um conte\u00FAdo de multim\u00EDdia para cada parte da informa\u00E7\u00E3o. @puzzles.DoublePuzzle=Quebra-cabe\u00E7as duplo|Duas grades s\u00E3o exibidas. Uma cont\u00E9m a informa\u00E7\u00E3o desordenada e outra est\u00E1 vazia. O objeto tem de ser reorganizado na grade vazia arrastando-se as partes da informa\u00E7\u00E3o, uma a uma. @puzzles.ExchangePuzzle=Quebra-cabe\u00E7as de troca|A informa\u00E7\u00E3o \u00E9 embaralhada dentro do mesmo painel. A cada tentativa dois peda\u00E7os trocam de posi\u00E7\u00E3o at\u00E9 que o objeto estiver reordenado. @puzzles.HolePuzzle=Quebra-cabe\u00E7as de lacuna|Num mesmo painel um peda\u00E7o est\u00E1 faltando e os outros est\u00E3o embaralhados. A cada tentativa um dos peda\u00E7os pr\u00F3ximo \u00E0 lacuna \u00E9 movido at\u00E9 que todos os peda\u00E7os retornem \u00E0 ordem original. @text.WrittenAnswer=Resposta escrita|Um conjunto de informa\u00E7\u00F5es \u00E9 exibido e o texto correspondente para cada uma das partes deve ser escrito. @text.FillInBlanks=Texto: Preencha as lacunas|O usu\u00E1rio deve completar certas palavras, letras e frases que foram escondidas ou camufladas em um texto. A solu\u00E7\u00E3o para cada um dos elementos deve ser estabelecida de diferentes maneiras: escrita em um espa\u00E7o em branco; corrigindo a frase que cont\u00E9m erros; ou selecionando a partir de uma lista de v\u00E1rias poss\u00EDveis respostas. @text.Identify=Texto: Identifique os elementos|O usu\u00E1rio deve destacar algumas palavras, letras, n\u00FAmeros, s\u00EDmbolos ou pontua\u00E7\u00E3o com o clique do mouse. @text.Order=Texto: Ordenar elementos|Ao preparar esta atividade algumas das palavras ou par\u00E1grafos de um texto s\u00E3o selecionadas para serem embaralhadas. O usu\u00E1rio deve orden\u00E1-las corretamente. @text.Complete=Texto: Completar o texto|V\u00E1rias partes de um texto (letras, palavras, pontua\u00E7\u00E3o, ou frases) s\u00E3o retiradas e o usu\u00E1rio deve complet\u00E1-las. @textGrid.CrossWord=Palavras Cruzadas|A tabela de palavras deve ser completada de acordo com suas defini\u00E7\u00F5es. As defini\u00E7\u00F5es podem ser exibidas na forma de texto, imagens ou som. O programa automaticamente exibe as defini\u00E7\u00F5es de duas palavras que cruzam a posi\u00E7\u00E3o do cursor. @textGrid.WordSearch=Ca\u00E7a-palavras|As palavras escondidas devem ser encontradas em uma grade de letras. As c\u00E9lulas neutras na grade (aquelas sem palavras) s\u00E3o completadas com caracteres escolhidos aleatoriamente. src/core/edu/xtec/resources/activities/listactivities_ru.properties000066400000000000000000000347321335566474600264130ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=\u0421\u043B\u043E\u0436\u043D\u044B\u0435 \u0430\u0441\u0441\u043E\u0446\u0438\u0430\u0446\u0438\u0438|\u0412 \u044D\u0442\u043E\u043C \u0437\u0430\u0434\u0430\u043D\u0438\u0438 \u0442\u0430\u043A\u0436\u0435 \u0435\u0441\u0442\u044C \u0434\u0432\u0430 \u043D\u0430\u0431\u043E\u0440\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438, \u043D\u043E \u044D\u0442\u0438 \u043C\u043E\u0433\u0443\u0442 \u0438\u043C\u0435\u0442\u044C \u0440\u0430\u0437\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0447\u0430\u0441\u0442\u0435\u0439, \u0430 \u0442\u0430\u043A\u0436\u0435 \u043C\u043E\u0433\u0443\u0442 \u0438\u043C\u0435\u0442\u044C \u0440\u0430\u0437\u043D\u044B\u0439 \u0442\u0438\u043F \u0441\u0432\u044F\u0437\u0438 (\u043E\u0434\u0438\u043D \u043A \u043E\u0434\u043D\u043E\u043C\u0443, \u043C\u043D\u043E\u0433\u043E \u043A \u043E\u0434\u043D\u043E\u043C\u0443, \u043B\u0438\u0448\u043D\u044F\u044F \u0447\u0430\u0441\u0442\u044C \u0438 \u0442.\u0434.). @associations.SimpleAssociation=\u041F\u0440\u043E\u0441\u0442\u044B\u0435 \u0430\u0441\u0441\u043E\u0446\u0438\u0430\u0446\u0438\u0438|\u0415\u0441\u0442\u044C \u0434\u0432\u0430 \u043D\u0430\u0431\u043E\u0440\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0441 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u043C \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\u043C \u0447\u0430\u0441\u0442\u0435\u0439. \u041A\u0430\u0436\u0434\u0430\u044F \u0447\u0430\u0441\u0442\u044C \u0438\u0437 \u043E\u0440\u0438\u0433\u0438\u043D\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043D\u0430\u0431\u043E\u0440\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043E\u0434\u043D\u043E\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437 \u043D\u0430\u0431\u043E\u0440\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439. @memory.MemoryGame=\u041D\u0430\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0435 \u043F\u0430\u0440|\u041A\u0430\u0436\u0434\u044B\u0439 \u0438\u0437 \u043A\u0443\u0441\u043A\u043E\u0432 \u043F\u043E\u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0434\u0432\u0430\u0436\u0434\u044B, \u043D\u043E \u0432\u0435\u0440\u0445 \u043D\u043E\u0433\u0430\u043C\u0438. \u041F\u0440\u0438 \u043A\u0430\u0436\u0434\u043E\u0439 \u043F\u043E\u043F\u044B\u0442\u043A\u0435 \u0434\u0432\u0430 \u043A\u0443\u0441\u043A\u0430 \u043F\u0435\u0440\u0435\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0438, \u0435\u0441\u043B\u0438 \u043E\u043D\u0438 \u043D\u0435 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B, \u043F\u0435\u0440\u0435\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u043D\u0430\u0437\u0430\u0434. \u041D\u0443\u0436\u043D\u043E \u043D\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u043F\u0430\u0440\u044B @panels.Explore=\u0418\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438| \u041D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u0447\u0430\u0441\u0442\u044C \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u043F\u043E\u043A\u0430\u0437\u0430\u043D\u0430 \u0438 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043D\u0430 \u043D\u0435\u0451, \u0434\u0430\u043D\u043D\u0430\u044F \u0447\u0430\u0441\u0442\u044C \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043F\u043E\u043A\u0430\u0437\u0430\u043D\u0430 \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430. @panels.Identify=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u043A\u0430\u0446\u0438\u044F \u044F\u0447\u0435\u0439\u043A\u0438|\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u043E\u0434\u0438\u043D \u043D\u0430\u0431\u043E\u0440 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438, \u0438 \u0432\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043D\u0430\u0436\u0430\u0442\u044C \u043D\u0430 \u0442\u0435 \u0447\u0430\u0441\u0442\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0442 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u043C\u0443 \u0443\u0441\u043B\u043E\u0432\u0438\u044E. @panels.InformationScreen=\u042D\u043A\u0440\u0430\u043D \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438| \u041F\u043E\u043A\u0430\u0437\u0430\u043D\u0430 \u0447\u0430\u0441\u0442\u044C \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438, \u0442\u0430\u043A\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0430 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438. @puzzles.DoublePuzzle=\u0414\u0432\u043E\u0439\u043D\u0430\u044F \u0433\u043E\u043B\u043E\u0432\u043E\u043B\u043E\u043C\u043A\u0430|\u041F\u043E\u043A\u0430\u0437\u0430\u043D\u044B \u043F\u043E\u043B\u044F.\u041E\u0434\u043D\u043E \u0438\u0437 \u043D\u0438\u0445 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043D\u0435\u0443\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u0435\u043D\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E, \u0434\u0440\u0443\u0433\u043E\u0435 \u043F\u0443\u0441\u0442\u043E. \u041E\u0431\u044A\u0435\u043A\u0442 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D \u0432 \u043F\u0443\u0441\u0442\u043E\u0435 \u043F\u043E\u043B\u0435 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435\u043C \u0447\u0430\u0441\u0442\u0435\u0439 \u043E\u0434\u043D\u0430 \u0437\u0430 \u0434\u0440\u0443\u0433\u043E\u0439. @puzzles.ExchangePuzzle=\u0413\u043E\u043B\u043E\u0432\u043E\u043B\u043E\u043C\u043A\u0430 \u0441 \u0437\u0430\u043C\u0435\u0449\u0435\u043D\u0438\u0435\u043C| \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u0430\u0441\u044C \u0432 \u043F\u0440\u0435\u0434\u0435\u043B\u0430\u0445 \u043E\u0434\u043D\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438. \u041A\u0430\u0436\u0434\u0430\u044F \u0438\u0437 \u0447\u0430\u0441\u0442\u0435\u0439 \u043F\u043E\u043C\u0435\u043D\u044F\u0435\u0442 \u043F\u043E\u0437\u0438\u0446\u0438\u044E, \u043F\u043E\u043A\u0430 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u043F\u0435\u0440\u0435\u0443\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u0435\u043D\u0430. @puzzles.HolePuzzle=\u0413\u043E\u043B\u043E\u0432\u043E\u043B\u043E\u043C\u043A\u0430 \u0441 \u043F\u0443\u0441\u0442\u043E\u0442\u0430\u043C\u0438 | \u0412 \u0442\u043E\u0439 \u0436\u0435 \u0441\u0430\u043C\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438 \u043E\u0434\u043D\u0430 \u0447\u0430\u0441\u0442\u044C \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 , \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B. \u041A\u0430\u0436\u0434\u0430\u044F \u0438\u0437 \u043D\u0438\u0445 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u0438 \u043F\u0435\u0440\u0435\u0434\u0432\u0438\u043D\u0443\u0442\u0430, \u043F\u043E\u043A\u0430 \u043E\u043D\u0438 \u043D\u0435 \u0432\u0435\u0440\u043D\u0443\u0442\u0441\u044F \u0432 \u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A. @text.WrittenAnswer=\u041F\u0438\u0441\u044C\u043C\u0435\u043D\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442 | \u043D\u0430\u0431\u043E\u0440 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u043F\u043E\u043A\u0430\u0437\u0430\u043D \u0438 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0439 \u0438\u0437 \u0435\u0433\u043E \u0447\u0430\u0441\u0442\u0435\u0439 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0430\u043F\u0438\u0441\u0430\u043D. @text.FillInBlanks=\u0422\u0435\u043A\u0441\u0442: \u0432\u043E\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u044B| \u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0434\u043E\u043B\u0436\u0435\u043D \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u0441\u043B\u043E\u0432\u0430, \u0431\u0443\u043A\u0432\u044B \u0438 \u0444\u0440\u0430\u0437\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u044B\u043B\u0438 \u0441\u043A\u0440\u044B\u0442\u044B \u0438\u043B\u0438 \u0437\u0430\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u044B \u0432 \u0442\u0435\u043A\u0441\u0442\u0435. \u0420\u0435\u0448\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0438\u0437 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u043F\u043E-\u0440\u0430\u0437\u043D\u043E\u043C\u0443: \u0437\u0430\u043F\u0438\u0441\u044C \u0432 \u043F\u0440\u043E\u0431\u0435\u043B\u0435; \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0444\u0440\u0430\u0437\u044B, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043E\u0448\u0438\u0431\u043A\u0438; \u0438\u043B\u0438 \u0432\u044B\u0431\u043E\u0440 \u0438\u0437 \u0441\u043F\u0438\u0441\u043A\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u044B\u0445 \u043E\u0442\u0432\u0435\u0442\u043E\u0432. @text.Identify=\u0422\u0435\u043A\u0441\u0442: \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 | \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0434\u043E\u043B\u0436\u0435\u043D \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043D\u0430 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0441\u043B\u043E\u0432\u0430, \u0431\u0443\u043A\u0432\u044B, \u0446\u0438\u0444\u0440\u044B, \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0438 \u0437\u043D\u0430\u043A\u0438 \u043F\u0440\u0435\u043F\u0438\u043D\u0430\u043D\u0438\u044F \u0441 \u0449\u0435\u043B\u0447\u043A\u043E\u043C \u043C\u044B\u0448\u0438. @text.Order=\u0422\u0435\u043A\u0441\u0442: \u0423\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u044C\u0442\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B | \u041F\u0440\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0438 \u044D\u0442\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u0437 \u0441\u043B\u043E\u0432 \u0438\u043B\u0438 \u0430\u0431\u0437\u0430\u0446\u044B \u0442\u0435\u043A\u0441\u0442\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u044B, \u0447\u0442\u043E\u0431\u044B \u0431\u044B\u0442\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0448\u0430\u043D\u043D\u044B\u043C\u0438 \u0432\u043E\u043A\u0440\u0443\u0433. \u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0434\u043E\u043B\u0436\u0435\u043D \u043E\u0442\u043B\u043E\u0436\u0438\u0442\u044C \u0438\u0445 \u0432 \u043F\u043E\u0440\u044F\u0434\u043A\u0435. @text.Complete=\u0422\u0435\u043A\u0441\u0442: \u041F\u043E\u043B\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 | \u0420\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u0447\u0430\u0441\u0442\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 (\u0431\u0443\u043A\u0432\u044B, \u0441\u043B\u043E\u0432\u0430, \u0437\u043D\u0430\u043A\u0438 \u043F\u0440\u0435\u043F\u0438\u043D\u0430\u043D\u0438\u044F, \u0438\u043B\u0438 \u0444\u0440\u0430\u0437\u044B) \u0441\u0442\u0438\u0440\u0430\u044E\u0442\u0441\u044F, \u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0434\u043E\u043B\u0436\u0435\u043D \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0435\u0435. @textGrid.CrossWord=\u041F\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 | \u0422\u0430\u0431\u043B\u0438\u0446\u0430 \u0441\u043B\u043E\u0432 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 \u0441\u043E\u0433\u043B\u0430\u0441\u043D\u043E \u0435\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F\u043C. \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u0442\u0435\u043A\u0441\u0442\u043E\u043C, \u0433\u0440\u0430\u0444\u0438\u043A\u043E\u0439 \u0438\u043B\u0438 \u0437\u0432\u0443\u043A\u043E\u043C. \u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u0432\u0443\u0445 \u0441\u043B\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u0435\u0440\u0435\u0441\u0435\u043A\u0430\u044E\u0442\u0441\u044F \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430. @textGrid.WordSearch=\u041F\u043E\u0438\u0441\u043A \u0441\u043B\u043E\u0432\u0430| \u0421\u043A\u0440\u044B\u0442\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 \u0434\u043E\u043B\u0436\u043D\u044B \u0431\u044B\u0442\u044C \u043D\u0430\u0439\u0434\u0435\u043D\u044B \u0432 \u043F\u043E\u043B\u0435 \u0431\u0443\u043A\u0432. \u041F\u0443\u0441\u0442\u044B\u0435 \u043F\u043E\u043B\u044F (\u0431\u0435\u0437 \u0441\u043B\u043E\u0432) \u0437\u0430\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u043C\u0438 \u0437\u043D\u0430\u043A\u0430\u043C\u0438. src/core/edu/xtec/resources/activities/listactivities_vec.properties000066400000000000000000000107361335566474600265400ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=Sociasion conpl\u00E8sa|Inte sta ativit\u00E0 ghe x\u00E9 anca do set de inforamsion, ma cuesti i pol ver un n\u00F9maro de parte difarente e ghe pol ser tipi difarenti de re\u019Aasion fra de \u019Aori, ex.: uno-a-uno, parte sensa re\u019Aasion, ect... @associations.SimpleAssociation=Sociasion s\u00F2lia|Ghe x\u00E9 do set de informasion che i g\u00E0 el steso n\u00F9maro de parte. \u00D2gni parte da 'l set de or\u00ECxene \u019Aa coresponde a una, e n\u00F2ma che una, parte de 'l set im\u00E0xene. @memory.MemoryGame=Catar p\u00E8ri|Ognun de i t\u00F2chi i vien mostr\u00E0i do v\u00F2lte, ma sotosora. A \u00F2gni turno, se rabalta do t\u00F2chi e i torna sotosora se no i x\u00E9 conpagni. 'L obietivo el x\u00E9 de catar tuti i p\u00E8ri. @panels.Explore=Ativit\u00E0 de esplorasion|Se mostra inanso na s\u010Dianta de informasion e, co se clica un elemento, altra informasion \u019Aa vien mostrada par \u00E0gni elemento. @panels.Identify=Intiva cax\u00E8\u019Ae|Ghe x\u00E9 n\u00F2ma che un set de informasion e se g\u00E0 da clicar so che\u019Ae parte che \u019Ae conbina co' na condision precixa. @panels.InformationScreen=Schermada de informasion|Se mostra un set de informasion e ghe x\u00E9 l'opsion de ativar el contenudo multimedial par \u00F2gni parte de informasion. @puzzles.DoublePuzzle=Dopio puzzle|Se mostra do gr\u00E8\u019Ae. Una \u019Aa g\u00E0 drento \u019Aa informasion dexordenada, e che\u019Aaltra \u019Aa x\u00E9 voda. El og\u00E8to el g\u00E0 da ser resistem\u00E0 inte \u019Aa gr\u00E8\u019Aa voda a strasinando i t\u00F2chi uno par v\u00F2lta. @puzzles.ExchangePuzzle=Puzzle a sostitusion|\u023Da informasion \u019Aa x\u00E9 spostada inte 'l steso pan\u00E8\u019Ao. A \u00F2gni turno do t\u00F2chi i se scanbia poxision un co' staltro fin che el og\u00E8to el x\u00E9 orden\u00E0 @puzzles.HolePuzzle=Puzzle a vodo|Inte 'l steso pan\u00E8\u019Ao manca un t\u00F2co e che\u019Aaltri i x\u00E9 smisi\u00E0i. A \u00F2gni turno un de i t\u00F2chi darente el vodo el vien spost\u00E0 ffinch\u00E9 tuti i x\u00E9 in \u00F3rdene. @text.WrittenAnswer=Resp\u00F2sta scrita|Se mostra un set de informasion e se g\u00E0 da scr\u00ECvar el t\u00E8sto corispondente a ognuna de \u019Ae so parte. @text.FillInBlanks=T\u00E8sto: Inpenisi i vodi|'L utente el g\u00E0 da conpletar de \u019Ae par\u00F2\u019Ae, l\u00E9tare e fraxe che \u019Ae x\u00E9 st\u00E0e sconte o imascar\u00E0e inte un t\u00E8sto. \u023Da so\u019Ausion de ognun de i elementi \u019Aa pol ser mesa insenbre in m\u00F2di difarenti: a scrivendo inte un spasio vodo; a coreexindo na fraxa che \u019Aa g\u00E0 indrento erori; o desernindo da na lista de varie resp\u00F2ste alternadive. @text.Identify=T\u00E8sto: Ident\u00ECfega elementi|'L utente el g\u00E0 da pontar calche par\u00F2\u019Aa, l\u00E9tare, n\u00F9mari, glifi, o segni de puntexadura co' un clik de 'l mouse. @text.Order=T\u00E8sto: Meti in \u00F3rdene|Co se dixegna sta ativit\u00E0 calcheduna de \u019Ae par\u00F2\u019Ae o par\u00E0grafi de un t\u00E8sto i vien se\u019Aesion\u00E0i par \u00E8sar insenbr\u00E0i a caxo. El utente el g\u00E0 da rim\u00E9tarli da novo in s\u00E8sto. @text.Complete=T\u00E8sto: Conpl\u00E8ta el t\u00E8sto|Varie parte de un t\u00E8sto (l\u00E9tare, par\u00F2\u019Ae, segni de pontexadura, o fraxe) i x\u00E9 cav\u00E0i fora e el utente el g\u00E0 da conpletarlo. @textGrid.CrossWord=Par\u00F2\u019Ae in croxe|\u023Da tav\u00E8\u019Aa de par\u00F2\u019Ae \u019Aa g\u00E0 da ser conpletada drio \u019Ae so pr\u00F2pie definision. \u023De definision \u019Ae pol \u00E8sar t\u00E8sti, gr\u00E0feghe o son\u00F2ri. El programa el mostra da so p\u00F2sta \u019Ae definision de \u019Ae do par\u00F2\u019Ae che \u019Ae se incroxa inte \u019Aa poxision de 'l cursor. @textGrid.WordSearch=Serca de par\u00F2\u019Ae|\u023De par\u00F2\u019Ae sconte \u019Ae g\u00E0 da ser cat\u00E0e inte na gr\u00E8\u019Aa de l\u00E9tare. \u023De cax\u00E8\u019Ae neutra\u019Ai inte \u019Aa gr\u00E8\u019Aa (cue\u019Ae sensa par\u00F2\u019Ae) \u019Ae vien conplet\u00E0e co' car\u00E0teri a caxo. src/core/edu/xtec/resources/activities/listactivities_zh_TW.properties000066400000000000000000000117671335566474600270230ustar00rootroot00000000000000# List of currently registered types of JClic activities. # All JClic Activity classes must extend edu.xtec.jclic.Activity # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=activity_type_name[|activity_type_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.activities." # Example: # com.acme.jclic.TestActivity=Acme test activity|This JClic activity is just a test... @associations.ComplexAssociation=\u8907\u96DC\u7684\u95DC\u4FC2|\u5728\u9019\u500B\u6D3B\u52D5\u4E2D\u4E5F\u6709\u5169\u7D44\u8CC7\u8A0A\uFF0C\u4F46\u9019\u4E9B\u53EF\u80FD\u6709\u4E0D\u540C\u7684\u9078\u9805\u6578\uFF0C\u800C\u4E14\u4ED6\u5011\u4E4B\u9593\u7684\u95DC\u4FC2\u53EF\u80FD\u6709\u4E0D\u540C\u7684\u985E\u578B\r\n\uFF0C\u4F8B\u5982\uFF1A\u4E00\u5C0D\u4E00\uFF0C\u591A\u5C0D\u4E00\uFF0C\u90E8\u5206\u7121\u95DC\uFF0C\u7B49\u7B49\u3002 @associations.SimpleAssociation=\u7C21\u55AE\u7684\u95DC\u4FC2|\u5728\u9019\u500B\u6D3B\u52D5\u4E2D\u6709\u5169\u7D44\u76F8\u540C\u6578\u76EE\u7684\u8CC7\u8A0A\u3002\u6BCF\u500B\u90E8\u5206\u5F9E\u5C0D\u61C9\u5230\u76F8\u95DC\u7684\u53E6\u4E00\u500B\uFF0C\u4E26\u4E14\u53EA\u6709\u4E00\u500B\uFF0C\u5716\u50CF\u7684\u4E00\u90E8\u5206\u3002 @memory.MemoryGame=\u914D\u5C0D|\u9019\u4E9B\u788E\u7247\u6210\u96D9\u6210\u5C0D\uFF0C\u4F46\u662F\u662F\u8986\u84CB\u7684\u3002\u5047\u82E5\u76F8\u540C\u7684\u8A71\u5C31\u6703\u7FFB\u958B\uFF0C\u4E0D\u540C\u7684\u8A71\u5C31\u6703\u84CB\u56DE\u53BB\u3002\u76EE\u6A19\u662F\u627E\u51FA\u6240\u6709\u914D\u5C0D\u3002 @panels.Explore=\u63A2\u7D22\u6D3B\u52D5|\u4E00\u500B\u521D\u59CB\u4FE1\u606F\u6703\u88AB\u986F\u793A\uFF0C\u9EDE\u64CA\u5F8C\uFF0C\u986F\u793A\u6BCF\u500B\u5143\u7D20\u7684\u4FE1\u606F\u3002 @panels.Identify=\u78BA\u8A8D\u7D30\u80DE|\u9019\u53EA\u662F\u4E00\u7D44\u8CC7\u8A0A\u4E26\u4E14\u4F60\u9700\u8981\u9EDE\u64CA\u9019\u4E9B\u90E8\u4EFD\u4F86\u6EFF\u8DB3\u7279\u5B9A\u7684\u689D\u4EF6\u3002 @panels.InformationScreen=\u8CC7\u8A0A\u5C4F\u5E55|\u5176\u4E2D\u4E00\u7D44\u8CC7\u6599\u986F\u793A\uFF0C\u4E26\u6709\u904B\u4F5C\u4E2D\u591A\u5A92\u9AD4\u5167\u5BB9\u7684\u6BCF\u4E00\u689D\u8CC7\u8A0A\u7684\u9078\u9805\u3002 @puzzles.DoublePuzzle=\u96D9\u5C64\u62FC\u5716|\u986F\u793A\u5169\u500B\u7DB2\u683C\u3002\u4E00\u500B\u5305\u542B\u7121\u5E8F\u7684\u8A0A\u606F\uFF0C\u53E6\u4E00\u500B\u662F\u7A7A\u7684\u3002\u7269\u4EF6\u5FC5\u9808\u4E00\u500B\u4E00\u500B\u62D6\u66F3\u5230\u7A7A\u7684\u7DB2\u683C\u4E2D\u91CD\u65B0\u6392\u5E8F\u3002 @puzzles.ExchangePuzzle=\u4E92\u63DB\u62FC\u5716|\u5728\u540C\u4E00\u500B\u7248\u9762\u4E0A\u4EA4\u63DB\u8CC7\u8A0A\u3002\u4E00\u6B21\u4EA4\u63DB\u5169\u500B\u8A0A\u606F\u7684\u4F4D\u5B50\u76F4\u5230\u5B83\u88AB\u91CD\u65B0\u6392\u5E8F\u6574\u9F4A\u3002 @puzzles.HolePuzzle=\u62FC\u5716\u586B\u7A7A|\u5C11\u4E86\u4E00\u584A\u7684\u9762\u677F\u88AB\u6253\u4E82\u3002\u628A\u6BCF\u4E00\u584A\u62FC\u5728\u7A7A\u683C\u65C1\u908A\uFF0C\u76F4\u5230\u6062\u5FA9\u539F\u4F86\u7684\u9806\u5E8F\u3002 @text.WrittenAnswer=\u66F8\u9762\u56DE\u7B54|\u986F\u793A\u51FA\u4E00\u7D44\u8A0A\u606F\uFF0C\u5FC5\u9808\u5BEB\u5165\u5B83\u6BCF\u90E8\u5206\u76F8\u5C0D\u61C9\u7684\u6587\u5B57\u3002 @text.FillInBlanks=\u6587\u5B57\uFF1A\u586B\u7A7A|\u4F7F\u7528\u8005\u9700\u5B8C\u6210\u5728\u672C\u6587\u5167\u88AB\u96B1\u85CF\u6216\u507D\u88DD\u7684\u7279\u5B9A\u55AE\u8A5E\uFF0C\u5B57\u6BCD\uFF0C\u7247\u8A9E\u3002\u6BCF\u984C\u7684\u89E3\u6CD5\u53EF\u80FD\u6709\u591A\u7A2E\u65B9\u6CD5\uFF1A\u586B\u7A7A\u683C;\u66F4\u6B63\u542B\u932F\u7684\u7247\u8A9E;\u6216\u662F\u5F9E\u4E00\u5217\u53EF\u80FD\u7684\u7B54\u6848\u4E2D\u9078\u51FA\u6700\u4F73\u7684\u7B54\u6848\u3002 @text.Identify=\u6587\u5B57\uFF1A\u8FA8\u8A8D\u5143\u7D20| \u4F7F\u7528\u8005\u5229\u7528\u6ED1\u9F20\u9EDE\u64CA\u55AE\u8A5E\uFF0C\u5B57\u6BCD\uFF0C\u6578\u5B57\uFF0C\u7B26\u865F\u6216\u6A19\u9EDE\u7B26\u865F\u3002 @text.Order=\u6587\u5B57\uFF1A\u6392\u5E8F\u5143\u7D20| \u5728\u8A2D\u8A08\u9019\u9805\u6D3B\u52D5\u6642\uFF0C\u9078\u53D6\u6587\u7AE0\u5167\u7684\u4E00\u4E9B\u5B57\u6216\u662F\u6BB5\u843D\u4E26\u6253\u4E82\u4ED6\u5011\u3002\u8B93\u4F7F\u7528\u8005\u91CD\u65B0\u6392\u51FA\u6B63\u78BA\u7684\u9806\u5E8F\u3002 @text.Complete=\u6587\u5B57\uFF1A\u5B8C\u6210\u6587\u7AE0|\u6587\u7AE0\u7684\u6578\u500B\u90E8\u4EFD\uFF08\u6587\u5B57\uFF0C\u55AE\u8A5E\uFF0C\u6A19\u9EDE\u7B26\u865F\u6216\u662F\u7247\u8A9E\uFF09\u88AB\u62FF\u51FA\uFF0C\u8B93\u4F7F\u7528\u8005\u53BB\u5B8C\u6210\u5B83\u3002 @textGrid.CrossWord=\u586B\u5B57|\u8A5E\u5F59\u8868\u5FC5\u9808\u7531\u6BCF\u500B\u8FAD\u5F59\u7684\u5B9A\u7FA9\u4F86\u5B8C\u6210\u3002\u5B9A\u7FA9\u53EF\u80FD\u662F\u6587\u5B57\uFF0C\u5716\u7247\u6216\u8072\u97F3\u3002\u7A0B\u5F0F\u6703\u81EA\u52D5\u986F\u793A\u6E38\u6A19\u6240\u6307\u5169\u500B\u8A5E\u7684\u5B9A\u7FA9 @textGrid.WordSearch=\u5C0B\u627E\u6587\u5B57|\u96B1\u85CF\u7684\u6587\u5B57\u5FC5\u9808\u5728\u4EA4\u932F\u7684\u5B57\u6BCD\u4E2D\u3002\u5728\u7DB2\u683C\u4E2D\u7684\u7A7A\u683C\uFF08\u7121\u5B57\u7684\u683C\u5B50\uFF09\u5DF2\u7D93\u7528\u96A8\u6A5F\u9078\u64C7\u7684\u5B57\u5143\u586B\u5BEB\u5B8C\u6210\u3002 src/core/edu/xtec/resources/automation/000077500000000000000000000000001335566474600205325ustar00rootroot00000000000000src/core/edu/xtec/resources/automation/contentproviders.properties000066400000000000000000000013361335566474600262630ustar00rootroot00000000000000# List of currently registered types of content providers for JClic activities. # All JClic content providers must extend edu.xtec.jclic.automation.AutoContentProvider # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=content_provider_name[|content_provider_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.automation." # Example: # com.acme.jclic.TestContentProvider=Acme test content|This JClic content provider is just a test... @arith.Arith=Arith|Automatic creation of menthal arithmetics exercises @tagreplace.TagReplace=TagReplace|Replaces tags inside text expressions with values taken from a external file or data source src/core/edu/xtec/resources/automation/contentproviders_ca.properties000066400000000000000000000013651335566474600267300ustar00rootroot00000000000000# List of currently registered types of content providers for JClic activities. # All JClic content providers must extend edu.xtec.jclic.automation.AutoContentProvider # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=content_provider_name[|content_provider_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.automation." # Example: # com.acme.jclic.TestContentProvider=Acme test content|This JClic content provider is just a test... @arith.Arith=Arith|Creaci\u00F3 autom\u00E0tica d'exercicis de c\u00E0lcul mental @tagreplace.TagReplace=TagReplace|Substitueix determinades etiquetes de text per valors especificats en un fitxer o font de dades externa src/core/edu/xtec/resources/automation/contentproviders_de.properties000066400000000000000000000001211335566474600267220ustar00rootroot00000000000000 @arith.Arith=Arith|Arithmetik\ufffdbungen zum Kopfrechnen automatisch erstellen src/core/edu/xtec/resources/automation/contentproviders_es.properties000066400000000000000000000013761335566474600267560ustar00rootroot00000000000000# List of currently registered types of content providers for JClic activities. # All JClic content providers must extend edu.xtec.jclic.automation.AutoContentProvider # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=content_provider_name[|content_provider_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.automation." # Example: # com.acme.jclic.TestContentProvider=Acme test content|This JClic content provider is just a test... @arith.Arith=Arith|Creaci\u00F3n autom\u00E1tica de ejercicios de c\u00E1lculo mental @tagreplace.TagReplace=TagReplace|Substituye determinadas etiquetas de texto por valores especificados en un archivo o fuente de datos externa src/core/edu/xtec/resources/automation/contentproviders_gl.properties000066400000000000000000000001271335566474600267420ustar00rootroot00000000000000 @arith.Arith=Arith|Creaci\ufffdn autom\ufffdtica de exercicios de c\ufffdlculo mental src/core/edu/xtec/resources/automation/contentproviders_pt_BR.properties000066400000000000000000000013751335566474600273540ustar00rootroot00000000000000# List of currently registered types of content providers for JClic activities. # All JClic content providers must extend edu.xtec.jclic.automation.AutoContentProvider # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=content_provider_name[|content_provider_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.automation." # Example: # com.acme.jclic.TestContentProvider=Acme test content|This JClic content provider is just a test... #Tradu\ufffd\ufffdo para o Portugu\ufffds brasileiro #Author: Hugo Sunayama #Email: hugocogeae@yahoo.com.br #Creative Commons license @arith.Arith=Arith|Cria\ufffd\ufffdo autom\ufffdtica de exerc\ufffdcios de c\ufffdlculo mental src/core/edu/xtec/resources/buttons/000077500000000000000000000000001335566474600200505ustar00rootroot00000000000000src/core/edu/xtec/resources/buttons/textdown.png000066400000000000000000000010661335566474600224350ustar00rootroot00000000000000PNG  IHDR sBIT|d pHYs  ~tEXtCreation Time09/15/04( tEXtSoftwareMacromedia Fireworks MX*$IDATxQ0Dz|O: @ Irs.$BLI`)ygX~iqI!` ͊C*@wxo31j3@ \r<[``1A|Gs0ʨ h2 XρpfVr3N^C(L[֛ X(0ZrT+xF$j! w)y~ڟD7 Pup/k:fV~O˕ؾ8)`V$4n4O] ̀ pFN+٥q'=jGdx_֒K,Tr%;hAJG"3bE_dOɀ {ovf;0gH:ނKro1|͓`z oUWI oZbCex"(/Iv brW}*V#IENDB`src/core/edu/xtec/resources/commonSettings.properties000066400000000000000000000012601335566474600235000ustar00rootroot00000000000000about_window_img=about/logo_small.png about_window_html_style_table_header=background-color\:Navy;color\:White; about_window_html_style_table_totals=background-color\:\#FBCF57;color\:Black; about_window_html_style_table_header2=background-color\:Teal;color\:White; about_window_html_header=
about_window_html_bgcolor=EFF7DD about_window_html_style=font-family\: Helvetica, sans-serif; font-size\: 12; about_window_lb_jclic=JClic about_otherCreditsDoc=about/otherCredits.html about_sponsorsDoc=about/sponsors.html JCLIC_VERSION=@JCLIC_VERSION@ (@JCLIC_DATE@) AUTHOR_VERSION=@AUTHOR_VERSION@ (@AUTHOR_DATE@) REPORTS_VERSION=@REPORTS_VERSION@ (@REPORTS_DATE@) src/core/edu/xtec/resources/cursors/000077500000000000000000000000001335566474600200525ustar00rootroot00000000000000src/core/edu/xtec/resources/cursors/big.gif000066400000000000000000000003311335566474600212770ustar00rootroot00000000000000GIF89a ! , I8;m#di(왪@+Scsan Ɔ4mC&LsTM@u֤W˖/a{v}ϸȲBfuU+/kJQLnQ0GE7|PA6;src/core/edu/xtec/resources/cursors/bigHand.gif000066400000000000000000000003231335566474600220730ustar00rootroot00000000000000GIF89a ! , I 8Y_x`Ojfۢj,nmZ<CT"t9k":}rFqKk{L$U|Y/2QiyqaoxvGZHZA;src/core/edu/xtec/resources/cursors/bigRev.gif000066400000000000000000000002551335566474600217610ustar00rootroot00000000000000GIF89a ! , ZI-˻Ԛ'R`8yrV~6O< ׾_+(,:b1'.tJKےr;M0^ 7 ;src/core/edu/xtec/resources/icons/cancel.gif000066400000000000000000000003761335566474600214070ustar00rootroot00000000000000GIF89a FFSS__llюޛ ! ,XIk]keB  G}q@H[n))-@@9Ԏ.k!ka;*MM߱%f[KX@WQ~-| (!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/commit_changes.gif000066400000000000000000000006511335566474600231360ustar00rootroot00000000000000GIF89a濾侽ֲٱؿʡ̩Եവ޲ܯ׸ᗙâͨö !,s@pH,GLɔ`F+01"ke*: KhT!F]>ʨ@ 2BCREJCW tBR   MCTkHFDA!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/copy.gif000066400000000000000000000004401335566474600211240ustar00rootroot00000000000000GIF89a泳̳̲̲̱˰ɬƪĨ¥!,@J 'd9n*Tn%mtmH֠&B]PPvxYJ!Q6 cM S#$|k!!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/cut.gif000066400000000000000000000012141335566474600207450ustar00rootroot00000000000000GIF89a00xx򗗗 !,LPI+P͙jUwRY(Ȋ|iz<dp *'t)@ 5ĔFK))2M";٤ !,upH,kȤVў' :1'LBMGLdT\%Gfm2UC:/)&$!}5 TGKL~ T3 K`FDA;𣝛POOwvvݯDDD !,wwn|Somvovzo|v~kw"~{o"#~k{w~D"~wu{uvkDyŰyB!HÇ#!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/database.gif000066400000000000000000000002561335566474600217230ustar00rootroot00000000000000GIF89a北̑RRRNNNU!,@[pId,{bKpqEPBPq\ TQa D.$ϨeJ(ZX(Raq0zC;v3hl{V;src/core/edu/xtec/resources/icons/database_locked.gif000066400000000000000000000016541335566474600232470ustar00rootroot00000000000000GIF89a𽽽RJJJRRRƜΥﵵ𠠤!,H#0!0ŅT ,P\0!Ï!;BX`>B 6ҥI+[a@) >m ѤH)$,K*邰%/JTS~*BhV Kp[ " ;src/core/edu/xtec/resources/icons/database_unavailable.gif000066400000000000000000000016371335566474600242720ustar00rootroot00000000000000GIF89a3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f̙333f3̙333f3fff̙fff3f̙̙3f̙3f̙3f333f3333f3ffffff3f̙3f3f!,|Y H@ Dx!Z 0aCנeXq k%"РU$Yk%˘JA K$Y͠9DĖ*QjD@YA9E$`þ5ᵳhzU6 ;src/core/edu/xtec/resources/icons/delete.gif000066400000000000000000000003201335566474600214110ustar00rootroot00000000000000GIF89a̙fff333!,Bhn$>d5fB02m7\7@̷C u@0sROU8vU$!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/down.gif000066400000000000000000000002711335566474600211230ustar00rootroot00000000000000GIF89a!,+H0IƳm4 p @ciѶS!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/edit.gif000066400000000000000000000006711335566474600211050ustar00rootroot00000000000000GIF89aATNa濾侽ֲٱؿʡ̩Եവ޲ܯ׸ᗙâͨFSMٯ漺ö((( !,@pH, :RWpP7 T@ ͎Ukl\YNJH' `)`r/O_S3*!"8.kCY l w`/ET DY VK96UFVV8kWFDA!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/exit_small.gif000066400000000000000000000002411335566474600223120ustar00rootroot00000000000000GIF89a00a==nžž !,NPILl(N8 P}* 0KI)`hZYd;ErO# F Rߒ;src/core/edu/xtec/resources/icons/file_open.gif000066400000000000000000000003441335566474600221150ustar00rootroot00000000000000GIF89a̴̳̽{f33! ,@>Id k "cqIڨR)!r;_ & R"!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/file_save.gif000066400000000000000000000003161335566474600221110ustar00rootroot00000000000000GIF89afff!,@HoIA8 ,_H&\Z'9%,3٬?P2Nmu-  C,8 e GeuEDP'(*Ք X^L)t1[E}1m`D\UpѭYR[\RݴIK9㜒k/"LUJ IENDB`src/core/edu/xtec/resources/icons/ico01.png000066400000000000000000000016071335566474600211120ustar00rootroot00000000000000PNG  IHDR DsBITOPLTE۸ܹܿڶٵٷٹ׮ض׵իԮҬУϡΤ͢͡˘ɔȖȘșÇÍ{}}vvssooppoollkkx|bb^^^^tvswZZ\\nrVVmoLLdgGG_bEE[^[]::SSIL%%;;--\tRNSm pHYs  ~tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$TIDATxR@FF`)rU@ CQl{ûK؉&;29'gMb}1 Hag~yv7 =C活^ PP`. | @D o!{q$IENDB`src/core/edu/xtec/resources/icons/ico02.png000066400000000000000000000011621335566474600211070ustar00rootroot00000000000000PNG  IHDR DsBITOPLTEܹ۸ܿڶٵٹٷض׮׵իԮҬУϡΤ͢͡˘ɔȖșȘÇÍ{.tRNSsU pHYs  ~tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$IDATxn0EM(۰uC"’i B=:IdUe6|TrVo k@( !4|[6*8<7dS!g\ۚy>njG`3GDr|g@+t3zi^"0O:ǠMol^rVh7!b6bW n0`+Yfɓ*q@ͯfP|gIENDB`src/core/edu/xtec/resources/icons/ico03.png000066400000000000000000000012771335566474600211170ustar00rootroot00000000000000PNG  IHDR DsBITOPLTEܹ۸ܿڶٵٹٷض׮׵իԮҬУϡΤ͢͡˘ɔȘșȖÇÍ{|{t*0tRNSbx pHYs  ~tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$*q~Ny3z~ kc}~3?=of!_269nYiyckQU?~ƕ*ɶVOԴ"<3ZpzHQ%T5mbfo(j5Fd->)3Wci(>ҟoEv$ik G Hމ_ZQσL_glz"b5B^Oq9C}K-dzi1 8/8\CZUjmCٸ5?+rًU9(>MTbAPW AR@8fpv/A~A~B|" -.j_QkuGIENDB`src/core/edu/xtec/resources/icons/icorec.png000066400000000000000000000012641335566474600214420ustar00rootroot00000000000000PNG  IHDR?'ڐ)sBIT|d pHYs B4tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$IDATxan0 7ý{`4(RAį8AHSk#v`D!IJӑDG=[/䭵f,x"Bw;\`fy@r zTE PU;<߾F4-A+ț+x ᪀ٝzDpx{"Iw̪VO"B ]Dɗ^˪!2:0 뺲Zvl W>jYvh? ^E|pdeUovp59jTڑѸɧW'qaU_}=}*cVfMgtF>MD3&ɇU})<^FƲ,锺/I3(3.CH;<#l֞vxNROu鈳ێĜLg-;9NSoQ?j$%B |V, O;&tQ>Tkg)GٿO_UXWIENDB`src/core/edu/xtec/resources/icons/icorplay.png000066400000000000000000000027771335566474600220320ustar00rootroot00000000000000PNG  IHDR?'ڐ)sBIT|d pHYs B4tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$SIDATxAh\EӸiyd1E1у^"JC%/*EE)^ړK+}At bP!)n xț۷e߾ma'37}Zk*=6aAtBh}߶}p]Z@O\tvgfm]<077T*r3c;s Umc6.A`jj*{gyw\._/Jccc53Ggk5< \TJR}uuÇGQq]\V{7\FfggY[[,lg̛xG܀#?99:ů:vťFMy!Z ffCq׭qC< /..&4sQ|ffFgyx7:pbaWWכῥZNoa.W < `ן4&e[" 7燀C^^^~\J6Rꨔ80i2QܶƠI׮y6p&/) #S;)RcFAVR KJqMJMxqJ|;w| WƦiS=J< $tlֵ#pee۷կei\cwgWK Yf46I¯I]?@NJ(4AF MC 'u`PJr|s}\dÌM|TqS=.c&6)7`:ʓ;$p@J,)7zONN s7obNQ޽8\. 244ʞ=/?Scv'plJ^]I&G>])RzRZwl-ˢQG矦f~~RP}0@ΐ#aD6Dϝ;b('PJ 6Q$)gcz{{|,5!!"Z$mZ#l$@$Ȳě]wwJ[R .TnoӺkp:O>ܼy+W޽cǎQJ}S<‡SVmqql===M]) HXlZqe6\.GP,Oi拍)uùbL \.vqgZnw0Yv畁wxxڞg'&&H;O8pVk}Rp]h3;AugqYv-[?3'Udq$3IENDB`src/core/edu/xtec/resources/icons/icottf.png000066400000000000000000000006601335566474600214650ustar00rootroot00000000000000PNG  IHDRVgsBIT|d pHYs B4tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$IDATx1N0D6:"6֞11gx*^-Z,tMv+f*#9$N_l9ǡx$*f0l9F)"hJ xmYԫ @U |?ȠMgoUӇZ/sҚ"u67Y'_k)*Gց_6FNvۦ:|^ㄪ&5^g5$b:e]?f<њ1>:L/Ӄ~=T!jIENDB`src/core/edu/xtec/resources/icons/icounknown.png000066400000000000000000000010651335566474600223670ustar00rootroot00000000000000PNG  IHDR'sBIT|d pHYs B4tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$IDATx헱N0CH 6:0J@b(3( Xl Юa:Rڎm"eH)پ|QUJk%Љ" v*CSW1pk53۪p3e TdyNsf ւ1@5 ;1`j/`vGbr`3V[3ۡOۑo\􀯪=,}߂>/ڤ_ fب-@b-hx- Zluǫ~E֜J޹9G]$x~O~É>V͆R޹ LʊJ{Q`Gñ_6p |b$MUl;jM*j玏ɨ.? ݅ZMފ4 MIENDB`src/core/edu/xtec/resources/icons/icowave.png000066400000000000000000000036011335566474600216300ustar00rootroot00000000000000PNG  IHDR4'@:ksBIT|d pHYs B4tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$IDATxݙl\?}S B4B[PZ!ԠD!BjaKU[!@n $TZZx4ABQ5ic'w}wUN^"T'+"_k\S͞=fd2\.YiU.h^d<L&YMU_DFBe~?`XmXd"s;w~ Ff?=)"-d΄<l].+LOO'{zzI%"wΨρvDcn3pԆ!z~|<1irxX[p yEp.T*-"g_U_+u]&JD,Y8!Vڳl08s.KD>t`EHUXvHdlwMMMdxGB5\g2`1!ĀH"oc2|QSSd\+"؄^. |Xf+ DߣĆL& {l/|FGgٍqN9vIl_UEqm% kC&c09y9|LN*k3?Ag"K>,ڄl9}|8@U(iggl{3|0f[p% ӣ@&t"lqzK8)GΪ BSSG%:=K^-9#v@c1 m47U]DzN')KX OTω$D8?rtlɂm]*u'HUD$_cٜ 5Kt~&$!Cj=><F,X[DmmS |%~ `5w ^2jִ MZ@ⴋ鬮.? \ TUuGex޴ز?`uߠLiNchnn;Uu3Sx0g u]z\ cND9N---mܸw!{G,:EUr^ t\䁉e\` ܮ9V%ĩt+7Hrl6~ǧIvu=pIENDB`src/core/edu/xtec/resources/icons/icoxml.png000066400000000000000000000024401335566474600214660ustar00rootroot00000000000000PNG  IHDR5@6sBIT|d pHYs B4tEXtCreation Time09/08/04INE tEXtSoftwareMacromedia Fireworks MX*$tIDATx_lSU?¶Y˲:@郛ɀdg&nMUEcD h.H k/ e)a[F"!L=>{l:79ߟ!I8Hj`B\B[ qm)0px@^d-uxCJ-%N6! LJ}0RTϷ쒔"$OGBH~LJ@JmG-Hi^fVUwBJn;6nތFF·P>RgS?u= խK`Ѻu46O&KN!Qzxnݾ^X]^~CoCCoPII]>ik;_NOdEE]]D봴6 [[|KӔS<+WΝ1fj` RWW{_P| \KJ+Uu_jhXw_>4eeK^`YG.{Ѽl.'ժ(…J>;' 4U) f0%_;0̵5x.YQX=jA[<⎎M}$;;;GKvRǏ$sMA~EJ![8\Y ck/b6807gП8yr졄l'> ]lߛ"j =+Pgd>C2ӔSCCi5[043s[|&vDb'p67 '67yNG ü|&r U[q0:'70"O#}VsmuG!~Bw~$OYj 1XDe_`,a9@O `c"DI\$PHj|[IENDB`src/core/edu/xtec/resources/icons/info_small.gif000066400000000000000000000017141335566474600223020ustar00rootroot00000000000000GIF89a锍ɡc]sަɳƳŞľƿžڭok}žۭᄌҬſvsSSS !,HA  PP4(0 bL@d)†! 4Р… 1X2@0D /\@@#@@'X0@84mA* 2tlr2`(" YUEx#T*B,0 1X0ǐ6 ;src/core/edu/xtec/resources/icons/install.png000066400000000000000000000041111335566474600216360ustar00rootroot00000000000000PNG  IHDRKsBITOPLTE '},k2a6Z8S;lY k2lY*},s0a6Z8S;lY},k2lYx.f3S;lY$*f3lY$'s0a6Z8S;lY},k2Z8lY "$'k2lY s0S;lY },x.a6Z8S;lY 'k2a6lY'},k2lY*},s0a6Z8 ְǼ˳ķțģ"$'*i},x.݄s0؂k2{f3a6vZ8qS;llhf` rQtRNS""""""""3333333333333DDDDDDDDDUUUUUUUUUUUfffffffffwwwwwwwwwww4 pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$IDATx[Uiv]2(즐WAZjLj]/y-Pb)\66EWhpY([Xq?3̙<y9sf 0 0 0 0 .RmɉY펥f#.A3w3`VzS \*FU,&Y'-SZ3KN ;’nM2~cTY:i->ə?]F6/Y'S"}̎J:Ǭ=^JR:NPGژrXzI%!L%aF!pP&!H=Ro}8[%qXQ=R]l\Z#ksi gXs6M⢈HKDa#/w,brQAi6yE e \/hQ-WD.S)qB5SZ $XaC)%@2hg f_Y+jjQGS ^ޯmU5B߬k7+O(˫siRй|%OKA#:y/X|ְNlM)v匿]YQ鮭_pZ(huvj~U'x.T.wKw*\0 0 0 0 ð+,k2P2IENDB`src/core/edu/xtec/resources/icons/logo.png000066400000000000000000000117271335566474600211430ustar00rootroot00000000000000PNG  IHDRT sBITOPLTEmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffޅ؂{|xxuurrmlifc_\Y3fftńZtRNS"""333DDDUUUfffwwwCD pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$IDATxiC;q߅JUTZj]ufa$ Py?+9''!)R$ƠGLc kk S5vp{cm-=7˳42bSjjۂj@;?l5fl`#'0>xkdBڼ{k "O޽ˏ߷4(~xt Dր6L9Mlqpo.Y'-%!K};NF1`@uj9 "^ǖ "Il`k9 xMuTSRc)T z3Qu^꘷X@ub/ib[R`O8_*[*+ C׼fXh"e?zrnO I!~~uFa?ɿ1bUi~TT?FPmR}B=OK Ej{P-DnQ@EK祓RYͪ TC}ARe?>|Xj<=87~dO9j|:[(V榓ksTl\訰 _)Xl? ,Rs)YN0G~PT_)@lߩosp>9:'e?wV}m`I(GE"X] }a,p5/$3h^KJ~@\ a9jzBmվCM8AuYqߎTF%8A-t]5R:~R@ܔ;ذ[n?>tKY 1AP9RyŲN2~nzZ*Bl*t0[z~"Qe?Lu`+Rs.\8sK=uPm-՚(ڜqǖzWQj;g#Meε 4ZOGje?:--T,p+vAjjMѱTX0`pH5;>9겳nj գݹa1U3mM!p/3\c"n?aORz2!s1R@e?Rٲ7Q_-ugz`LtO5GuUK 5eǣ짢Ug-&zhM!;);PRg>41?9*0X*_N}ZS|稶Rs#m@ j׷'5\)~sT5ԕԱ fy{KQWp:ʖ BC&J0`_t娝+ 娣m@SRe?Xj,ug?[,t ~&9*ўDcSo`\kԞ؅7Wd^N@~Vk .Zh稬\[gb'pP"4^t #_sb`vO5SaQ46615[ŪuT A*b$%K-5 9'[S~2U''Ia}b^)& &29؂/c;.䨶;xlt6`/T9*Ze[/l>GrԐY}:>ьlnL9~;)$G sv䬾m xMwR(GEKq| Y,:_rT|}o\nucqt-S^86hKK Ak %~}Y i~Y*O~| ̻BWBc#|uJncyGn0КsmvKwG&[6D$.Ϩ}T{u;RdҸ/$)Yz/N@N@eYFuޑ^ n?J̈uԚдR娬v}C)uu ЉPTZU?|9j,h [Պ+Y,L7t7'X!B j)|e?|hPˡ+ņ?Rך>bCl|6Gf'yK_rH~Gd֡%oJnUZMߗpYJS j`Y'[ښas+#U't F4ƹrT h&դJe,oԫB;P^P{R@m PMw z@L}`6HqdQ@3P Ui@*6SCdKnP 1@V:~i *BAtym6;H jTUmA]*5581k)ȷPSW=~ jjbơ`o'*3RPR~~ l/\,s}7>Oj)!T,%bʍ"ڀF)B)J>"4.2(uHJIA]'HJz^~}Uu?>_(11Tjb]tMyT硦1RY64++ o+z}L Ϋ X? 18uRֽPWk@g߽uu JmV.R/z Rrg9P'* |T*i|@Uk䡦q&P%l"x6:*ښVҖ:Ҫ82vVүzg v;z5 -/*dW=:CWejP* BnPb*ZQbP%ɔr4/@9߃%o*Y qP-UQ֯+8TW8T˸<ޓA5TꈣJ\pǪ`YPHҵRoy UJ;J7O*N15QvUT:]Je7 J]rWIp?k~R1ggU;7&G"Lʯ1ZU(R@kU? D~#>_Y$S|Uj+a D9#*[.hIR^b! :w}tFE^b!R2 OZ58?;#U%J-z"1~j U:.i*̡Z@ՏĪTQAPc_Ԡ`,VS%L"T,Y3O/j,m5xӳE Jwx>yn;j|:vj"b?*]G\p uPb4R0u_33uT_gc$5Ryj/$\ǩX9LۨxL]3)gIyǤS=eM/N j,B\)3QM P~T.-M Vm;zL+W(dYŠ^PTdV ~k2q=IX˵F/YY{Ig?L庱IM@װtiTQ T{Nw>:=!\rId-`k2 s5O镊gDtgE< $sh(\~C֨RiaH JOXI8X nq]ȸ(n:XVBDtۥU&Լ_),9 np]s%rMu XjoQjdb1|8ykqwU#O8 N_~m4*S *Nji#kOc%&lm5Z[+$;m ԨuԪkz`,hv;vn?u0O? 9M1ypUS ŃRqHJoz?NiLB24egnPKH^ JjfKl%<+'<< {D&ˑ=>7Q(ףSXiMu9tRG`N/ Y#Kww6!PXUPq]d'VE%ZӰG'?'ٹŕL&mnnri +Ƀ%Z:$b*`Oj8dKh|Qwjf];_K4;=']@"E)RH"E)RH"E)RH"gVe @IENDB`src/core/edu/xtec/resources/icons/logo_applet.png000066400000000000000000000134141335566474600225030ustar00rootroot00000000000000PNG  IHDR|isBITOPLTEmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffޅ؂{|xxuurrmlifc_\Y3fftńZtRNS"""333DDDUUUfffwwwCD pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$IDATx]y_JE(.R ֶ־>źֺ@U~/2Kْd/,OLνsI&c``````0HH)&&g^HkwX ?&eX|o~ren %7 ̤QaC;0$sPuzw^]@ʮ7w&P{?~~S (߾}/uGIBh|}bNI2I0fK~[ghsz𖂭@8g$JrBɁEhwH@f $ U t | Fk?*0 ]4G-6Cw@1G$>l'!#&_H`>}!빤h'.,\#ɽ__$[{fGUj&_³/_$K>L`{ R3 j*Ka4x|C2!o?B0i:]G׌+_K X.QƋ5UoŇL rvrGŜw0t%?MMߓExHk,٩)32)Ax vU^#oITW0e HՐ|-@o\_(8г(o!Z` vӒ?UQ  ;Y[vMC1-@GfvO۳G8L0зwp_[-5αPҘU'@[`%O$t/uIhv2)eW . ]J/H;z XD ޜO Hu_wdw `vS2Ppսth c@JCs`+\뫩 _:U"o01~oa%kO;YT K~~;w*ibFd,̿xɯe$Nv%UѾ<%ى:Yh'+IlČqɲނ/N&m2h]#[БCT FN4a"~|QxsΣ{ $w?O)PjgP˩|bݯ|>8lZTou %5?1\n~@%(ѽo[-ATspyv2&!6^̬lu.(;y :{ x19@a!@h'x Hӡ:/fV^"*=7 W|e$_,|EC@a;)UCv[`@7vz(V (H =s+xIf=:Yɾ B DW'˔"MB&&&g$rɲh[ Cm'kK~'v8|:U-:9 (K4mdCg].|?Kt$>_,)a}X [p]ڪ&̀5@*wvr*-`}nA:C6)ou@r7o6fH;Yc{ ||N[rVvw7L bOЦ C~LJ\vr tNhP)e'o!4p/qQSjSD OQQ9(!~Z%{b.m> _Z;YmʂZeN)qۦW'TƼohS_Z;:(puʺ7 *;;eksVvurJ8!x!x}+&;9/鳫0xNKv|_H@B)U(e"x Q1qȳF,|Nl(:!{y]u-d2K %=D>vz K4W''N>$H~%?i[鵓voN$?[Iəɏ:yzj0W N ->o*h4eQ!a;] ɷHJk·,Q-,/WFɗC_ng'-y !?G{q5!WL>M"l5xy AvBAD"VFB!ó?^66h@ncEv:]_X+%:X~=F8YFh@HٽOۘ"ƌ|quNČ(U&("džgbBfOHq%D^PD\eKZ)ȑБL3b)Ai~txS nSjr 6+.|t 7394H oʪ1vFYv@:rRi xٱX N+p|i򧃜#~Uy탢'\a8O~*?VǴWpaHӒc%u+@3Bg:gj$rKT(wFgTG'B~R;J7\I_ė !_\F)N>|fjkVY5[(&J3<+b6?}OJֈɧVphbȗʃn,D仰FL>z1UWC\=tDgSN4 Z1w+Og\d/ *!䫅P=: |6|ycmbx0L+㵾ONOt,T5} cÍ5*i,RZuX)ÜgzcK<'(Ǡth3hp ysqҘ%|`Iqi;):`tU!' m$=n•BֵtNMs"LKV|Oa3)J|cS0o+[tzC1r\cwX fT`ʑ骕a,~0ﯔoف}}3(b\z59әm'?[ t92QGz0*⃩Ӿ,tRJri\M E[$gX*f&U*+Bvj M~HٱGj*e!30YqR^>gʔ u*my01I'0gj?+u"E%%*GQD__̄aw_Fyп<-{1B{Pqdy0<^ؔ*grT1oн8w@srvI>AkZMcl-;7I:S$nø=..l'x+S/ Mfv~ᱏxwW.+R o&2s4ɆP!;5M< 煂'v+S a3zjNΌrwji} bX-c2\gi@Aџ.oF`yHzd|[ 7)sB*j=6U!"Y 3Qr%FWt' ټ=Kryss\^__]y%P2ި,KM²EPըY?]w2LKAY061?pP,9,!LC 㕅injA ĸU@5.%3qa&mugD>8̐?D! t/X\E|;%zvQVLJ^YC/U&aK vn/;h`sp @7B`V00!N" w;4I_8B/?Px)h3t9Vh~~3%oߋE4>teC EI"R X# spX، ߻ 4p+ cԐ| %bTX 蝆|yA>A"2Cr VE4@,_emC~8 u]| KZɐ?R YCXt+Eӆp= x+|/A/hL1L|å@Of;v8C~h=6\,:7\ղ섃&Fi!XTbEq2jjm &uѐi6Ùx"CMu/lY@)·{ߋEafܓ'48)cQ?J^%z[Н{@ 1u#=p 6sHckrG-ċXjP74Wֈv"iw~T(1 !, 7 aOaOaO˖şf!h````````.Ѡ(IENDB`src/core/edu/xtec/resources/icons/logo_button.gif000066400000000000000000000001771335566474600225140ustar00rootroot00000000000000GIF89a<!,DX  Z.@E(֕&*BXq6  }94 #2sA9ޕx;src/core/edu/xtec/resources/icons/logo_player.png000066400000000000000000000136321335566474600225140ustar00rootroot00000000000000PNG  IHDR|isBITOPLTEmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffmY3ffޅ؂{|xxuurrmlifc_\Y3fftńZtRNS"""333DDDUUUfffwwwCD pHYs  ~tEXtCreation Time09/05/04 tEXtSoftwareMacromedia Fireworks MX*$oIDATx]kCHE(((R ֶֶZZXG6H2$3@fΧ-{̽L9` ?"]\|a /xjyqal?yq3#ċ?4FFW,LCչq`c((06a}}5 #w8}) ߾}/}MIBh^~}bH2I0hKͯ+ЍQab|[ m|y*IBc? c Ѽ}ϓ(Ю@āH?@&@,`'& ~/T a:;n[mn }9i؏-I>->'CF||B(ЛIN.,\#7I>7ܘ NVT#@ɤ_NOp|/0%_-H/@7M ,;$?P @ނ%٤@v_4 l'.[`;kTG/U6f4A6ӲvDӕl67J,@_cNLMO%O[NZT$y H'j 3@coJ~vf` Ҝ@Ig =; G`V@l'=-50ll'O?Z|hfp0:>>Ȅÿ };y x1'^wowioab{wpxz޳h`BvϿo&w Ի*PʗTMKv-}'iOBëa'c?~g@&B[I>?N`( ]w;ۉ恐|8BJcV,e'Co|?b%qɤ|$_$t.5>"d- zboC2xe&%f'#A/C@\XJðg/@TR%2ZHR5 }܁_x ,/={o$M(ɺjXK-d'G%I3 W' dewgM~k)0/#ALv+CZvN%M(,-.m_j,i?=!JUDL4S$7G;G.aytoB$b?_>ET-J~-6Rs`-U-tϠ/B&onn.y[9(ѽW[H۩쫍7 p_d-O5M-Cm_D:Pv24${|%?0b|rvq57@BNCu0^LNϿ|ET {oK:H*]| vSd]OG.$tG@Q*oA{.{Hu*.c'LK+],S4y A^P:U'ˢ{"o! p}h;Y[-> Cԩja؇DF6 ;tpB#TMGo*hgbٹh Q Įh'[iPև9_UsB6@$i'k bo!} qCqC,R D,)`|ڔaƏINN ; 6eӺ$yBvu-:9'zԔڔxQCSTF:DTJ:VǞ˄W'Nxbn~lcB)s}i*U1[ڔuEW'NƢ:JC0NֲSY&;Ae~Gb*׮NNY8.@8/d'P7>}v1Ր~Ɏ0S S?3j0 [Sx`&Z5 das*d|D 誓^o!l(F~tk';k4xHsur#;9,PAY&^;mIəg~zK2ɓ^;98V'˖Մr1K N χ NZ?#/V2*$L~OB-Ҧ#vIʨ0Rvr(zyD9o!RpO?'u\MmȕO+Ddy6S~伅 s "JFB^66h@nbG{gEv{Ru sȗ,nb/m<+!\N&PԆ(XKϋBa@Nuȯr{vB|VgTu.&~-:|:W"+H,;(bY,1.O$9yuČ H/Į鱸%N~V3Rdvo6{nwkό|quNČ(U&("Hc31yn'$8_x:/("B2j.ެW>9%|JP:_jm*BCnbSN=EЕBr?CJ_3:jFב+ONki*˓)=НaO4)1X.7.#~Uy탢'\a8O~*?VǴWpaHӒ_V䇺E R3xi5V9%v J;3p#z˓Og!JU|.QM}gKօ/.\ӶkmgG4V'{E2Sh.3+zTv$S{]J?U|d F[쏉N=dgskd2ُ̥Il~oG[{}ؒȧɧLRx/2\it3Kr|3ʨɧL&زMCS҅5b/26:X/5p )A+.O^ kn30s39T7>/`tJs+ Cv : H ϰd{x_x|UX(mt;v Z]?n)'E;{ !l3%b)鷟/ $=8lxJ@,PjCN wjx-v|w hOnw1NTZu_掂:cYAz{qe{(ϱ]ْV-;t(PO珘L< 9'¸=_GDKo)ϩ_:$F;J=O6@7zG O_7u4ăaXy/~ZD8@q+Xӷ1y{'= sr @<0LW66pK7wȱJH's;8ÒZ 1)}#.ͳs3eB*D⤸S\ ;ߋwWpewFىv䷕?P?mb( 6I#%6Щ@#U+ Y,`ߞ+ߵ-VJPŠjs^3mO~ -*A>)rdQGz0*⃩Ӿ,tRA%z94_& eJ-3y,qP3*!;1&?@r#_]_ l69 )es_ 3Ke:Yl 6 <]p?0;gj?%u"E%%*GQD_̄aw_Cyп:;]16Pqdy0<^ؔ*grT1o׻8=w@}|&*V٤[}ouH܆qЏʏ=3{\ڼߒOV^IAZ~xwZ)R o&2s4ɆP!;1M< 煂'v+S a3akH'|Ngπ;1 ?1,ďG1E.p4wĠχVp#<$=2- _;^9z!jnFƦVWU!"S3QrUF7t' ټ=3s KKZmeeV[ZZy%Pm2ޮW&ZbTxgx]J߮RFz)Ae>"0^Y(?fgt?8j w.   ?ZUv|b aEɘ˹y#T!3E_^҉X踯w]45@-OnUp=7ō ӂ+x+n- I&n6UŌG>~y "5Vk I"Bp `𜅻Q ` ;ֳtǝ9qI%uQ? pm7&Nr)uP`\Tua!U2 IM_m|47C:RFd@HW!ҁ! Vu0EOw1li!L CRhET|r/1ݿ IvB;ATzK`H* ^U^| "=/1:38Ǫ6BHp4, N"#|nB bȹi ZQ0zJD[ U^We=\G~U~C|OYcA=) n [l *6)@N]Jh{k_|4 {&q%4؄?%_ 9]-?/D>C)?y{#H1&ɶsB-KURpRu˂KUw'JcaA~C.ڱtg R v\MfTu0{uA$9x1C6mq*Y6҉.vAI^o6ΒRT$, ^g(kRh;ޚO "f0_*3JӠnJ~XHhv+6Fs ,u$X'IENDB`src/core/edu/xtec/resources/icons/miniclic.png000066400000000000000000000011751335566474600217660ustar00rootroot00000000000000PNG  IHDR(-SsBITOPLTElYlYlYYlYl`YYr\ys{uz~kl`\{h`xud\{xulfd`rld`\|xtrlh\([*su>]'' ,2ͦ1Ŋ gXa)ϦtjH;src/core/edu/xtec/resources/icons/security.gif000066400000000000000000000002051335566474600220200ustar00rootroot00000000000000GIF89a!,2I8ƹn2 `Qn2$G5}FI nC tt0;src/core/edu/xtec/resources/icons/settings.gif000066400000000000000000000002271335566474600220150ustar00rootroot00000000000000GIF89afffff!,DIKp@W,;ya:n*9H `8U4ѦNв+n-q<;src/core/edu/xtec/resources/icons/system_small.gif000066400000000000000000000016711335566474600226750ustar00rootroot00000000000000GIF89aӬ˳훏ܥķˏi聲㷵 !,@ V0ABÇ#Tp 3b0Q  8H )A4#H$B (P0 0X@ʎ=1JhXXPׂ+ @+`mN@n=ȷ E  ;src/core/edu/xtec/resources/icons/unknown.gif000066400000000000000000000017761335566474600216660ustar00rootroot00000000000000GIF89a?' "#%&12468:<=@AKMZ\adehmotw|ȋ̋Ӌ׋ߌ𠠤!0,?'aH*\ȰÇ#JHŋ3B Y.({ڶsͻ;src/core/edu/xtec/resources/icons/up.gif000066400000000000000000000002701335566474600205770ustar00rootroot00000000000000GIF89a!,*H0!^!2\z 8fib[%7k"!OCopyright 2000 by Sun Microsystems, Inc. All Rights Reserved. JLF GR Ver 1.0 ;src/core/edu/xtec/resources/icons/warning.gif000066400000000000000000000017601335566474600216250ustar00rootroot00000000000000GIF89af^|ŝƨЩЪүֲٲٴ۷ݷ޼Ἴ⽾便忿𠠤! ,H*$`B:D` VPBbƁ4 q@ R北 f|"1KN&/fRgL))8ԅʔ3 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. levels_INF=Kindergarten (3-6) levels_PRI=Primary school (6-12) levels_SEC=Secondary school (12-16) levels_BTX=High school (16-18) levels_other=Other levels: areas_lleng=Languages areas_mat=Mathematics areas_soc=Social sciences areas_exp=Experimental sciences areas_mus=Music areas_vip=Art & design areas_ef=Physical education areas_tec=Design & technology areas_div=Miscellaneous areas_other=Other subjects: src/core/edu/xtec/resources/messages/JClicMessages_ar.properties000066400000000000000000000247261335566474600254500ustar00rootroot00000000000000#JClic main messages label_time=\u0627\u0644\u0648\u0642\u062A label_actions=\u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0627\u062A label_score=\u0627\u0644\u0646\u062A\u064A\u062C\u0629 Skin = \u0627\u0644\u0643\u0633\u0648\u0629 action_next_caption=\u0627\u0644\u062A\u0627\u0644\u064A action_next_tooltip=\u0627\u0644\u0646\u0634\u0627\u0637 \u0627\u0644\u062A\u0627\u0644\u064A action_prev_caption=\u0627\u0644\u0633\u0627\u0628\u0642 action_prev_tooltip=\u0627\u0644\u0646\u0634\u0627\u0637 \u0627\u0644\u0633\u0627\u0628\u0642 action_reset_caption=\u0627\u0633\u062A\u0626\u0646\u0641 action_reset_tooltip=\u0627\u0633\u062A\u0626\u0646\u0641 \u0627\u0644\u0646\u0634\u0627\u0637 action_info_caption=\u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0629 about_window_lb_project=\u0627\u0644\u0645\u0634\u0631\u0648\u0639 about_window_lb_languages=\u0627\u0644\u0644\u063A\u0627\u062A about_window_lb_language=\u0627\u0644\u0644\u063A\u0629 about_window_close_button=\u0639\u064F\u062F about_window_caption=\u0639\u0646\u0652 action_about_tooltip=\u062A\u0642\u0627\u0631\u064A\u0631 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 about_window_lb_report=\u0627\u0644\u062A\u0642\u0631\u064A\u0631 about_window_browser_button=\u0627\u0639\u0631\u0636 \u0641\u064A \u0645\u062A\u0635\u0641\u062D report_no_activities=No activities reported! report_system_standard=Report not registered in any DB report_lb_time=\u0627\u0644\u0648\u0642\u062A msg_error_loading_sequence=Error loading sequence media_qt_error_initializing=Error initializing QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=Open URL... filesystem_openFile=\u0625\u0641\u062A\u062D \u0645\u0644\u0641\u0627... filesystem_enterURL=Please enter the URL to the resource to be loaded. msg_error_executing_external=Error executing the command: editor_moveDown_tooltip=Move the selected element down editor_moveUp_tooltip=Move the selected element up editor_moveDown=\u062D\u0631\u0651\u0643 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644 editor_moveUp=\u062D\u0631\u0651\u0643 \u0625\u0644\u0649 \u0627\u0644\u0623\u0639\u0644\u0649 filefilter_all_images=Image files (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG images filefilter_jpg=JPG images filefilter_gif=GIF images filesystem_saveURLerror=URL-based files are read-only. filefilter_all_clic=Clic 3.0 packages (*.pac, *.pcc) filefilter_all=\u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062A filefilter_all_jclic_clic=JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic projects (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 compact packages (*.pcc) filefilter_pac=Clic 3.0 open packages (*.pac) filefilter_jclic_zip=JClic compressed projects (*.jclic.zip) filefilter_jclic=JClic projects (*.jclic) about_window_lb_mediaSystem=Multimedia system about_window_lb_level=\u0627\u0644\u0645\u0633\u062A\u0648\u0649 about_window_lb_area=\u0627\u0644\u0645\u0633\u0627\u062D\u0629 report_num_actions=Actions done: report_project=\u0627\u0644\u0645\u0634\u0631\u0648\u0639: report_lb_totals=\u0627\u0644\u0645\u062C\u0645\u0648\u0639: report_num_projects=\u0627\u0644\u0645\u0634\u0627\u0631\u064A\u0639: report_session=\u0627\u0644\u062C\u0644\u0633\u0629: msg_warn_no_exec_in_applets=For security reasons, execution of external programs is disabled in JClic applets. msg_error_starting_activity=Error starting activity! msg_error_loading_project=Error loading project msg_error_playing_media=Error playing media! msg_activity_finished=Activity finished! msg_playing_media=Playing media msg_activity_running=Activity running msg_activity_ready=Activity ready msg_initializing=Initializing... msg_preparing_media=Preparing media msg_error_loading_activity=Error loading activity msg_loading_activity=Loading activity msg_loading_project=Loading project... msg_ready=\u062C\u0627\u0647\u0632 err_reading_data=Error loading file err_file_save=Error saving file! err_file_open=Error opening file! report_started=Session started: report_lb_score=\u0627\u0644\u0646\u062A\u064A\u062C\u0629 report_lb_actions=\u0627\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A report_lb_solved=\u0645\u0648\u0627\u0641\u0642 report_lb_activity=\u0627\u0644\u0646\u0634\u0627\u0637 report_lb_sequence=\u0627\u0644\u062A\u0633\u0644\u0633\u0644 report_global_score=Global score: report_total_time=Total time on activities: report_num_activities_solved=Activities ok: report_num_activities=Activities done: report_num_sequences=Sequences: report_system=Report system: report_user=\u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645: report_not_finished=Activity not finished action_info_tooltip=\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0625\u0636\u0627\u0641\u064A\u0629 action_help_caption=\u0627\u0644\u0645\u0633\u0627\u0639\u062F\u0629 action_help_tooltip=Help about this activity action_audio_caption=\u0627\u0644\u0623\u0635\u0648\u0627\u062A action_audio_tooltip=Enable/disable sounds about_window_lb_system=\u0627\u0644\u0646\u0651\u0638\u0627\u0645 about_window_lb_total_mem=Total memory about_window_lb_free_mem=Free memory about_window_lb_java_home=Java home about_window_lb_java_vm=Java virtual machine about_window_lb_java_version=Java version about_window_lb_os=\u0646\u0638\u0627\u0645 \u0627\u0644\u062A\u0634\u063A\u064A\u0644 about_window_lb_version=\u0627\u0644\u0625\u0635\u062F\u0627\u0631 about_window_lb_descriptors=Descriptors about_window_lb_description=\u0627\u0644\u0648\u0635\u0641 about_window_lb_history=\u0627\u0644\u062A\u0623\u0631\u064A\u062E about_window_lb_organizations=\u0627\u0644\u0645\u0646\u0638\u0645\u0627\u062A about_window_lb_organization=\u0627\u0644\u0645\u0646\u0638\u0645\u0629 about_window_lb_authors=\u0627\u0644\u0645\u0624\u0644\u0641\u0648\u0646 about_window_lb_author=\u0627\u0644\u0645\u0624\u0644\u0641 about_window_lb_activity=\u0627\u0644\u0646\u0634\u0627\u0637 help_window_close_button=Return to activity help_window_caption=\u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u0645\u0633\u0627\u0639\u062F\u0629 action_about_caption=\u0627\u0644\u062A\u0642\u0627\u0631\u064A\u0631 action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic project installers (*.jclic.inst) report_err_no_users=No users defined in the reports database! report_err_no_users_in_group=No users defined for this group in the reports database! report_new_user=\u0645\u0633\u062A\u062E\u062F\u0645 \u062C\u062F\u064A\u062F... report_new_user_tooltip=Create a new user in the reports database report_err_creating_user=Error creating new user! report_select_user=User identification for the reports database report_userlist_title=Please select your name: report_ident_user=User identification report_name_prompt=\u0627\u0644\u0625\u0633\u0645: report_id_prompt=\u0627\u0644\u0648\u0644\u0648\u062C: report_pw_prompt=\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0651\u0631: report_pw_prompt_confirm=\u0623\u0643\u062F \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631: report_new_user_data=Creation of a new user: report_err_bad_data=Incorrect data! report_generic_group_name=\u0639\u0627\u0645 report_new_group=Create a new group... report_err_creating_group=Error creating the new group! report_grouplist_title=Please select your group: report_new_group_data=Creation of a new users group: report_err_invalid_user=Missing user ID or incorrect password. report_user_has_pwd=This account is password-protected. report_err_init=Error initializing report system. report_not_connected=\u063A\u064A\u0631 \u0645\u062A\u0635\u0644 report_err_creating=Error creating reports agent action_return_caption=\u0639\u064F\u062F action_return_tooltip=Return to the last menu action_return_keys=T* filefilter_all_sounds=Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI files (*.mid) filefilter_all_video=Video files (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 files (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=\u0643\u0644 \u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629 filesystem_copyToRoot_1=\u0627\u0644\u0645\u0644\u0641 filesystem_copyToRoot_2=is out of the current project's folder. filesystem_copyToRoot_3=It's advisable to have all the files in the same folder. filesystem_copyToRoot_4=Do you want to copy the selected file to the project's folder? filesystem_copyFile=Copying file msg_loading=Loading report_err_bad_id=Bad identifier! report_err_duplicate_id=This identifier already exists in the database! report_err_bad_name=Bad name! report_err_bad_pw=Passwords don't match! report_err_connect=Error connecting to the reports database! test_alert_exit=EXIT: At this point, the program will exit. test_alert_jump_to=At this point the program will jump to the project: ftype_image=\u0627\u0644\u0635\u0648\u0631\u0629 ftype_audio=Digital audio ftype_midi=MIDI file ftype_xml=XML file ftype_anim=\u0627\u0644\u062D\u0631\u0643\u0629 ftype_video=Digital video ftype_font=TrueType font ftype_jclic=JClic project ftype_inst=JClic project installer script ftype_unknown=\u0645\u062C\u0647\u0648\u0644 ftype_animated=\u0645\u062A\u062D\u0631\u0643\u0629 filefilter_fonts=Fonts (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML documents (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=With the support of: about_window_systemInfo=\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u0646\u0638\u0627\u0645 about_window_projectInfo=Current project info about_window_reportInfo=Current session results about_otherCreditsCaption=This product includes software developed by: msg_saving_project=Saving project... filefilter_text=Text files (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=English version, by The JClic team #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. src/core/edu/xtec/resources/messages/JClicMessages_ast.properties000066400000000000000000000215431335566474600256270ustar00rootroot00000000000000#JClic main messages label_time=tiempu label_actions=intentos label_score=marcador Skin = pelleyu action_next_caption=Siguiente action_next_tooltip=xera siguiente action_prev_caption=Anterior action_prev_tooltip=Xera anterior action_reset_caption=Reaniciar action_reset_tooltip=Reaniciar xera action_info_caption=Informaci\u00F3n about_window_lb_project=Proyeutu about_window_lb_languages=lling\u00FCes about_window_lb_language=llingua about_window_close_button=Tornar about_window_caption=Al rodiu action_about_tooltip=Informes d'usuariu about_window_lb_report=Informe about_window_browser_button=Ver nel navegador report_no_activities=\u00A1Nenguna informaci\u00F3n sobre xeres! report_system_standard=L'informe nun ta rexistr\u00E1u en nenguna base de datos report_lb_time=Tiempu msg_error_loading_sequence=Error cargando la secuencia media_qt_error_initializing=\u00A1Error al entamar QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=Abrir URL... filesystem_openFile=Abrir ficheru... filesystem_enterURL=Escribe la URL del recursu al que quier acceder. msg_error_executing_external=Error executando'l comandu: editor_moveDown_tooltip=Mover l'elementu seleicion\u00E1u p'abaxo editor_moveUp_tooltip=Mover l'elementu seleicion\u00E1u p'arriba editor_moveDown=Mover p'abaxo editor_moveUp=Mover p'arriba filefilter_all_images=Im\u00E1xenes (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=Im\u00E1xenes PNG filefilter_jpg=Im\u00E1xenes JPG filefilter_gif=Im\u00E1xenes GIF filesystem_saveURLerror=Los ficheros encontaos nuna URL son nam\u00E1s de llectura. filefilter_all_clic=Paquetes Clic 3.0 (*.pac, *.pcc) filefilter_all=Tolos ficheros filefilter_all_jclic_clic=Proyeutos JClic y Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=Proyeutos JClic (*.jclic, *.jclic.zip) filefilter_pcc=Paquetes compactos Clic 3.0 (*.pcc) filefilter_pac=Paquetes abiertos Clic 3.0 (*.pac) filefilter_jclic_zip=Proyectos JClic comprim\u00EDos (*.jclic.zip) filefilter_jclic=Proyeutos JClic (*.jclic) about_window_lb_mediaSystem=Sistema multimedia about_window_lb_level=Nivel about_window_lb_area=\u00C1rea report_num_actions=Aiciones feches: report_project=Proyeutu: report_lb_totals=Total: report_num_projects=Proyeutos: report_session=Sesi\u00F3n: msg_warn_no_exec_in_applets=Por razones de segurid\u00E1, la execuci\u00F3n de programes esternos nun ta deshabilitada nos applets JClic. msg_error_starting_activity=\u00A1Error al entamar la xera! msg_error_loading_project=Error al cargar el proyeutu msg_error_playing_media=\u00A1Error del recursu multimedia! msg_activity_finished=\u00A1Xera finada! msg_playing_media=Reproduciendo multimedia msg_activity_running=Xera en marcha msg_activity_ready=Xera preparada msg_initializing=Entamando... msg_preparing_media=Preparando multimedia msg_error_loading_activity=Error al cargar la xera msg_loading_activity=Cargando xera msg_loading_project=Cargando proyeutu... msg_ready=Llistu err_reading_data=Error al lleer l'archivu err_file_save=\u00A1Error al guardar l'archivu! err_file_open=\u00A1Error al abrir l'archivu! report_started=Entamu de sesi\u00F3n: report_lb_score=Puntuaci\u00F3n report_lb_actions=Aiciones report_lb_solved=Val report_lb_activity=Activid\u00E1 report_lb_sequence=Secuencia report_global_score=Puntuaci\u00F3n global: report_total_time=Tiempu total en xeres: report_num_activities_solved=Xeres correctes: report_num_activities=Xeres feches: report_num_sequences=Secuencies: report_system=Sistema d'informes: report_user=Usuariu: report_not_finished=Xera nun finada action_info_tooltip=Otres informaciones action_help_caption=Aida action_help_tooltip=Gabitos al rodiu de la xera action_audio_caption=Son\u00EDos action_audio_tooltip=Activar/desactivar los son\u00EDos about_window_lb_system=Sistema about_window_lb_total_mem=Memoria total about_window_lb_free_mem=Memoria llibre about_window_lb_java_home=Allugamientu de Java about_window_lb_java_vm=M\u00E1quina virtual Java about_window_lb_java_version=Versi\u00F3n Java about_window_lb_os=Sistema operativu about_window_lb_version=Versi\u00F3n about_window_lb_descriptors=Descriptores about_window_lb_description=Descripci\u00F3n about_window_lb_history=Hestorial about_window_lb_organizations=Organizaciones about_window_lb_organization=Organizaci\u00F3n about_window_lb_authors=Autores about_window_lb_author=Autor about_window_lb_activity=Xera help_window_close_button=Tornar pa la xera help_window_caption=Ventana d'aida action_about_caption=Informes action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=Instaladores de proyeutos JClic (*.jclic.inst) report_err_no_users=\u00A1Neng\u00FAn usuariu defin\u00EDu na base de datos d'informes! report_err_no_users_in_group=Neng\u00FAn usuariu defin\u00EDu pa esti grupu na base de datos d'informes! report_new_user=Usuariu nuevu... report_new_user_tooltip=Crear un usuariu nuevu na base de datos d'informes report_err_creating_user=\u00A1Error al crear l'usuariu nuevu! report_select_user=Identificaci\u00F3n d'usuariu pa la base de datos d'informes report_userlist_title=Escueya'l so nome: report_ident_user=Identificaci\u00F3n d'usuariu report_name_prompt=Nome: report_id_prompt=Identificar: report_pw_prompt=Contrase\u00F1a: report_pw_prompt_confirm=Confirmar contrase\u00F1a: report_new_user_data=Creaci\u00F3n d'un nuevu usuariu: report_err_bad_data=\u00A1Datos incorrectos! report_generic_group_name=Xen\u00E9ricu report_new_group=Crear un grupu nuevu... report_err_creating_group=\u00A1Error al crear el grupu nuevu! report_grouplist_title=Escueya'l so grupu: report_new_group_data=Creaci\u00F3n d'un grupu nuevu d'usuarios: report_err_invalid_user=Usuariu inesistente o contrase\u00F1a incorrecta. report_user_has_pwd=Esta cuenta d'usuariu ta protexida por contrase\u00F1a report_err_init=Error al entamar el sistema d'informes. report_not_connected=nun conect\u00E1u report_err_creating=Error al crear l'axente d'informes action_return_caption=Tornar action_return_tooltip=Tornar al men\u00FA postreru action_return_keys=T* filefilter_all_sounds=Son\u00EDos (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=Archivos MIDI (*.mid) filefilter_all_video=Archivos de video (*.avi, *.mov, *.mpeg) filefilter_all_anim=Archivos Flash 2.0 (*.swf) filefilter_skins=Pelleyos (*.xml) filefilter_all_media=Tolos recursos filesystem_copyToRoot_1=L'archivu filesystem_copyToRoot_2=at\u00F3pase nuna carpeta estremada de la del proyeutu actual. filesystem_copyToRoot_3=Encami\u00E9ntase tener tolos archivos nuna mesma carpeta filesystem_copyToRoot_4=\u00BFQuier copiar l'archivu escoy\u00EDu a la carpeta del proyeutu? filesystem_copyFile=Copiando ficheru msg_loading=Cargando report_err_bad_id=\u00A1Identificador incorrectu! report_err_duplicate_id=\u00A1Esti identificador y\u00E1 esiste na base de datos! report_err_bad_name=\u00A1Nome incorrectu! report_err_bad_pw=\u00A1Les contrase\u00F1as nun coinciden! report_err_connect=\u00A1Error al conectar cola base de datos d'informes! test_alert_exit=EXIT: Nesti puntu'l programa va cerrase. test_alert_jump_to=Nesti puntu va producise un altu al proyeutu: ftype_image=Imaxe ftype_audio=Son\u00EDu dixital ftype_midi=Ficheru MIDI ftype_xml=Ficheru XML ftype_anim=Animaci\u00F3n ftype_video=Video dixital ftype_font=Fonte TrueType ftype_jclic=Proyeutu JClic ftype_inst=Script d'instalaci\u00F3n de proyeutos JClic ftype_unknown=Desconoc\u00EDu ftype_animated=animada filefilter_fonts=Fontes (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=Documentos HTML (*.htm, *.html) about_creditsDoc=about/credits_ast.html about_licenseDoc=about/license_ast.html about_sponsorsCaption=Col sofitu de: about_window_systemInfo=Informaci\u00F3n del sistema about_window_projectInfo=Informaci\u00F3n del proyeutu actual about_window_reportInfo=Resultaos de la sesi\u00F3n actual about_otherCreditsCaption=Esti productu incl\u00FAi software desendolc\u00E1u por: msg_saving_project=Guardando'l proyeutu... filefilter_text=Ficheros de testu (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Versi\u00F3n n'asturianu, pol Equipu JClic #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Esti programa ye software llibre; ust\u00E9 pue redistribuyilu y/o camudalu embaxo los t\u00E9rminos de la Llicencia P\u00FAblica Xeneral GNU (GPL), tal y como ta espublizada pola Free Software Foundation; y\u00E1 seya la versi\u00F3n 2 de la Llicencia, o (a la so escoyeta) cualesquier versi\u00F3n posterior.
 
Esti programa distrib\u00FAyese col env\u00EDs de ser \u00FAtil, pero ENSIN NENGUNA GARANT\u00CDA; inclusive ensin la garant\u00EDa impl\u00EDcita d'USABILID\u00C1 O UTILID\u00C1 PA UN FIN PARTICULAR. Vea la Llicencia P\u00FAblica Xeneral GNU pa m\u00E1s detalles. src/core/edu/xtec/resources/messages/JClicMessages_bs.properties000066400000000000000000000212041335566474600254360ustar00rootroot00000000000000#JClic main messages label_time=vrijeme label_actions=poku\u0161aji label_score=rezultat Skin = Tema action_next_caption=Sljede\u0107e action_next_tooltip=Sljede\u0107a aktivnost action_prev_caption=Prethodno action_prev_tooltip=Prethodna aktivnost action_reset_caption=Ponovo pokrenuti action_reset_tooltip=Ponovno pokreni aktivnost action_info_caption=Informacije about_window_lb_project=Projekt about_window_lb_languages=jezici about_window_lb_language=jezik about_window_close_button=Vrati se about_window_caption=O action_about_tooltip=Izvje\u0161\u0107a korisnika about_window_lb_report=Izvje\u0161taj about_window_browser_button=Pogledaj u pregledniku report_no_activities=No activities reported! report_system_standard=Report not registered in any DB report_lb_time=Vrijeme msg_error_loading_sequence=Error loading sequence media_qt_error_initializing=Gre\u0161ka prilikom inicijalizacije QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=Otvori URL... filesystem_openFile=Otvori datoteku... filesystem_enterURL=Please enter the URL to the resource to be loaded. msg_error_executing_external=Gre\u0161ka pri izvr\u0161avanju naredbe: editor_moveDown_tooltip=Pomjeri odabrani element dolje editor_moveUp_tooltip=Pomjeri odabrani element gore editor_moveDown=Pomjeri dolje editor_moveUp=Pomjeri gore filefilter_all_images=Image files (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG slike filefilter_jpg=JPG slike filefilter_gif=GIF slike filesystem_saveURLerror=URL-based files are read-only. filefilter_all_clic=Clic 3.0 paketi (*.pac, *.pcc) filefilter_all=Sve datoteke filefilter_all_jclic_clic=JClic i Clic 3.0 projekti (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic projekti (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 compact packages (*.pcc) filefilter_pac=Clic 3.0 open packages (*.pac) filefilter_jclic_zip=JClic kompresovani projekti (*.jclic.zip) filefilter_jclic=JClic projekti (*.jclic) about_window_lb_mediaSystem=Multimedia sistem about_window_lb_level=Nivo about_window_lb_area=Podru\u010Dje report_num_actions=Ura\u0111ene aktivnosti: report_project=Projekt: report_lb_totals=Ukupno: report_num_projects=Projekti: report_session=Sesije msg_warn_no_exec_in_applets=For security reasons, execution of external programs is disabled in JClic applets. msg_error_starting_activity=Gre\u0161ka prilikom pokretanja aktivnosti! msg_error_loading_project=Gre\u0161ka prilikom u\u010Ditavanja projekta msg_error_playing_media=Error playing media! msg_activity_finished=Aktivnost zavr\u0161ena! msg_playing_media=Playing media msg_activity_running=Izvo\u0111enje aktivnosti msg_activity_ready=Activity ready msg_initializing=Inicijalizacija... msg_preparing_media=Preparing media msg_error_loading_activity=Gre\u0161ka prilikom u\u010Ditavanja aktivnosti msg_loading_activity=U\u010Ditavanje aktivnosti msg_loading_project=U\u010Ditavanje projekta... msg_ready=Spremno err_reading_data=Gre\u0161ka prilikom u\u010Ditavanje datoteke err_file_save=Gre\u0161ka prilikom spa\u0161avanja datoteke! err_file_open=Gre\u0161ka prilikom otvaranja datoteke! report_started=Sesija zapo\u010Deta: report_lb_score=Rezultat report_lb_actions=Radnje report_lb_solved=Uredu report_lb_activity=Aktivnost report_lb_sequence=Sekvenca report_global_score=Ukupan rezultat: report_total_time=Ukupno vrijeme aktivnosti: report_num_activities_solved=Aktivnosti ok: report_num_activities=Ura\u0111ene aktivnosti: report_num_sequences=Sequences: report_system=Report system: report_user=Korisnik: report_not_finished=Aktivnost nije zavr\u0161ena action_info_tooltip=Dodatne informacije action_help_caption=Pomo\u0107 action_help_tooltip=Pomo\u0107 oko aktivnosti action_audio_caption=Zvukovi action_audio_tooltip=Omogu\u0107i/onemogu\u0107i zvukove about_window_lb_system=Sistem about_window_lb_total_mem=Ukupna memorija about_window_lb_free_mem=Slobodna memorija about_window_lb_java_home=Java home about_window_lb_java_vm=Java virtualna ma\u0161ina about_window_lb_java_version=Java verzija about_window_lb_os=Operativni sistem about_window_lb_version=Verzija about_window_lb_descriptors=Descriptors about_window_lb_description=Opis about_window_lb_history=Historija about_window_lb_organizations=Organizacije about_window_lb_organization=Organizacija about_window_lb_authors=Autori about_window_lb_author=Autor about_window_lb_activity=Aktivnost help_window_close_button=Vrati se na aktivnost help_window_caption=Pomo\u0107 action_about_caption=Izvje\u0161taji action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic project installers (*.jclic.inst) report_err_no_users=Nema korisnika definiranih u izvje\u0161\u0107ima baze podataka! report_err_no_users_in_group=Nema korisnika definiranih za ovu grupu u izvje\u0161\u0107ima baze podataka! report_new_user=Novi korisnik report_new_user_tooltip=Kreiraj novog korisnika u izvje\u0161tajima baze podataka report_err_creating_user=Gre\u0161ka prilikom kreiranja novog korisnika! report_select_user=Identifikacija korisnika za izvje\u0161taje baze podataka report_userlist_title=Molimo odaberite va\u0161e ime: report_ident_user=Identifikacija korisnika report_name_prompt=Naziv: report_id_prompt=Prijava: report_pw_prompt=Lozinka: report_pw_prompt_confirm=Potvrdi lozinku: report_new_user_data=Kreiranje novog korisnika: report_err_bad_data=Neta\u010Dni podaci! report_generic_group_name=Op\u0107e report_new_group=Kreiraj novu grupu report_err_creating_group=Gre\u0161ka prilikom kreiranja nove grupe! report_grouplist_title=Molimo odaberite va\u0161u grupu: report_new_group_data=Kreiranje grupe novih korisnika: report_err_invalid_user=Nedostajanje korisni\u010Dkog ID ili neta\u010Dna lozinka. report_user_has_pwd=Ovaj ra\u010Dun je za\u0161ti\u0107en lozinkom. report_err_init=Error initializing report system. report_not_connected=nije povezano report_err_creating=Error creating reports agent action_return_caption=Vrati se action_return_tooltip=Vrati se na zadnji izbornik action_return_keys=T* filefilter_all_sounds=Zvukovi (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI datoteke (*.mid) filefilter_all_video=Video datoteke (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 datoteke (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=Sve medija datoteke filesystem_copyToRoot_1=Datoteka filesystem_copyToRoot_2=is out of the current project's folder. filesystem_copyToRoot_3=Preporu\u010Duje se da su sve datoteke u istom folderu. filesystem_copyToRoot_4=Da li \u017Eelite kopirati odabrane datoteke u folder projekta? filesystem_copyFile=Kopiranje datoteke msg_loading=U\u010Ditavam report_err_bad_id=Bad identifier! report_err_duplicate_id=This identifier already exists in the database! report_err_bad_name=Pogre\u0161an naziv! report_err_bad_pw=Pristupne \u0161ifre se ne poklapaju! report_err_connect=Gre\u0161ka prilikom povezivanja s izvje\u0161tajima baze podataka! test_alert_exit=IZLAZ: U ovom trenutku, program \u0107e se zavr\u0161iti. test_alert_jump_to=At this point the program will jump to the project: ftype_image=Slika ftype_audio=Digital audio ftype_midi=MIDI datoteka ftype_xml=XML datoteka ftype_anim=Animacija ftype_video=Digitalni video ftype_font=TrueType font ftype_jclic=JClic projekt ftype_inst=JClic project installer script ftype_unknown=Nepoznato ftype_animated=animirano filefilter_fonts=Fonts (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML documenti (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=Uz podr\u0161ku: about_window_systemInfo=Informacije o sistemu about_window_projectInfo=Info o trenutnom projektu about_window_reportInfo=Rezultati trenutne sesije about_otherCreditsCaption=Ovaj proizvod uklju\u010Duje softver razvijen od strane: msg_saving_project=Spa\u0161avanje projekta... filefilter_text=Tekstualne datoteke (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=English version, by The JClic team #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. src/core/edu/xtec/resources/messages/JClicMessages_ca.java000066400000000000000000000001121335566474600241350ustar00rootroot00000000000000package edu.xtec.resources.messages; public class JClicMessages_ca {} src/core/edu/xtec/resources/messages/JClicMessages_ca.properties000066400000000000000000000226611335566474600254250ustar00rootroot00000000000000#JClic main messages label_time=temps label_actions=intents label_score=encerts Skin = Entorn visual action_next_caption=Seg\u00fcent action_next_tooltip=Activitat seg\u00fcent action_prev_caption=Anterior action_prev_tooltip=Activitat anterior action_reset_caption=Reinicia action_reset_tooltip=Reinicia l'activitat action_info_caption=Informaci\u00f3 about_window_lb_project=Projecte about_window_lb_languages=Idiomes about_window_lb_language=Idioma about_window_close_button=Torna about_window_caption=Quant a... action_about_tooltip=Informes d'usuari about_window_lb_report=Informes about_window_browser_button=Veure-ho en el navegador report_no_activities=No hi ha cap activitat reportada! report_system_standard=L'informe no s'est\u00e0 enregistrant en cap base de dades report_lb_time=Temps msg_error_loading_sequence=Error en carregar la seq\u00fc\u00e8ncia media_qt_error_initializing=Error en inicialitzar el QuickTime! media_check_url=messages/checkmedia_ca.html filesystem_openURL=Obre una ubicaci\u00f3 web... filesystem_openFile=Obre el fitxer... filesystem_enterURL=Escriviu l'URL del recurs al qual voleu accedir. msg_error_executing_external=Error en executar l'ordre: editor_moveDown_tooltip=Mou l'element seleccionat avall editor_moveUp_tooltip=Mou l'element seleccionat amunt editor_moveDown=Mou avall editor_moveUp=Mou amunt filefilter_all_images=Imatges (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=Imatges PNG filefilter_jpg=Imatges JPG filefilter_gif=Imatges GIF filesystem_saveURLerror=Els fitxers obtinguts d'un URL s\u00f3n nom\u00e9s de lectura. filefilter_all_clic=Paquets Clic 3.0 (*.pac, *.pcc) filefilter_all=Tots els fitxers filefilter_all_jclic_clic=Projectes JClic i Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=Projectes JClic (*.jclic, *.jclic.zip) filefilter_all_jclic_scorm=Projectes JClic i fitxers SCORM (*.jclic, *.jclic.zip, *.scorm.zip) filefilter_pcc=Paquets compactes Clic 3.0 (*.pcc) filefilter_pac=Paquets oberts Clic 3.0 (*.pac) filefilter_jclic_zip=Projectes JClic comprimits (*.jclic.zip) filefilter_jclic=Projectes JClic (*.jclic) about_window_lb_mediaSystem=Sistema multim\u00e8dia about_window_lb_level=Nivell about_window_lb_area=\u00c0rea report_num_actions=Accions fetes: report_project=Projecte: report_lb_totals=Totals: report_num_projects=Projectes: report_session=Sessi\u00f3: msg_warn_no_exec_in_applets=Per raons de seguretat l'execuci\u00f3 de programes externs est\u00e0 deshabilitada en els applets JClic. msg_error_starting_activity=Error en iniciar l'activitat! msg_error_loading_project=Error en carregar el projecte msg_error_playing_media=Error del recurs multim\u00e8dia! msg_activity_finished=Activitat acabada! msg_playing_media=Interpretant multim\u00e8dia msg_activity_running=Activitat en marxa msg_activity_ready=Activitat preparada msg_initializing=Inicialitzant... msg_preparing_media=Preparant multim\u00e8dia msg_error_loading_activity=Error en carregar l'activitat msg_loading_activity=Carregant l'activitat... msg_loading_project=Carregant el projecte... msg_ready=Fet err_reading_data=Error en llegir el fitxer err_file_save=Error en desar el fitxer! err_file_open=Error en obrir el fitxer! report_started=Inici de sessi\u00f3: report_lb_score=Puntuaci\u00f3 report_lb_actions=Accions report_lb_solved=Correcta report_lb_activity=Activitat report_lb_sequence=Seq\u00fc\u00e8ncia report_global_score=Puntuaci\u00f3 global: report_total_time=Temps total en activitats: report_num_activities_solved=Activitats correctes: report_num_activities=Activitats realitzades: report_num_sequences=Seq\u00fc\u00e8ncies: report_system=Sistema d'informes: report_user=Usuari: report_not_finished=Activitat encara no acabada action_info_tooltip=Informaci\u00f3 addicional action_help_caption=Ajuda action_help_tooltip=Ajuda sobre l'activitat action_audio_caption=Sons action_audio_tooltip=Activar/desactivar els sons about_window_lb_system=Sistema about_window_lb_total_mem=Mem\u00f2ria total about_window_lb_free_mem=Mem\u00f2ria lliure about_window_lb_java_home=Ubicaci\u00f3 de Java about_window_lb_java_vm=M\u00e0quina virtual Java about_window_lb_java_version=Versi\u00f3 de Java about_window_lb_os=Sistema operatiu about_window_lb_version=Versi\u00f3 about_window_lb_descriptors=Descriptors about_window_lb_description=Descripci\u00f3 about_window_lb_history=Revisions about_window_lb_organizations=Organitzacions about_window_lb_organization=Organitzaci\u00f3 about_window_lb_authors=Autors/es about_window_lb_author=Autor/a about_window_lb_activity=Activitat help_window_close_button=Torna a l'activitat help_window_caption=Finestra d'ajuda action_about_caption=Informes action_about_keys=II action_audio_keys=OS action_help_keys=JJ action_info_keys=NN action_next_keys=S* action_prev_keys=A* action_reset_keys=R* filefilter_install=Instal\u00b7ladors de projectes JClic (*.jclic.inst) report_err_no_users=No hi ha cap usuari definit a la base de dades d'informes! report_err_no_users_in_group=No hi ha cap usuari definit en aquest grup a la base de dades d'informes! report_new_user=Usuari nou... report_new_user_tooltip=Crea un nou usuari a la base de dades d'informes report_err_creating_user=Error en crear el nou usuari! report_select_user=Identificaci\u00f3 d'usuari per la base de dades d'informes report_userlist_title=Seleccioneu el vostre nom: report_ident_user=Identificaci\u00f3 d'usuari report_name_prompt=Nom: report_id_prompt=Identificador: report_pw_prompt=Contrasenya: report_pw_prompt_confirm=Confirmaci\u00f3 de la contrasenya: report_new_user_data=Creaci\u00f3 d'un nou usuari: report_err_bad_data=Dades incorrectes! report_generic_group_name=Gen\u00e8ric report_new_group=Crea un nou grup... report_err_creating_group=Error en crear el nou grup! report_grouplist_title=Seleccioneu el vostre grup: report_new_group_data=Creaci\u00f3 d'un nou grup d'usuaris: report_err_invalid_user=Usuari inexistent o contrasenya incorrecta. report_user_has_pwd=El compte d'aquest usuari est\u00e0 protegit per contrasenya. report_err_init=Error en inicialitzar el sistema d'informes. report_not_connected=no connectat report_err_creating=Error en crear l'agent d'informes action_return_caption=Torna action_return_tooltip=Torna al darrer men\u00fa action_return_keys=T* filefilter_all_sounds=Sons (*.wav, *.mp3, *.au, *.aiff) filefilter_midi=Fitxers MIDI (*.mid) filefilter_all_video=V\u00eddeo (*.avi, *.mov, *.mpeg) filefilter_all_anim=Fitxers Flash 2.0 (*.swf) filefilter_skins=Entorns visuals (*.xml) filefilter_all_media=Tots els recursos filesystem_copyToRoot_1=El fitxer filesystem_copyToRoot_2=es troba en una carpeta diferent de la de l'actual projecte. filesystem_copyToRoot_3=Es recomana tenir tots els fitxers en la mateixa carpeta. filesystem_copyToRoot_4=Voleu copiar el fitxer seleccionat a la carpeta del projecte? filesystem_copyFile=Copiant el fitxer msg_loading=Carregant report_err_bad_id=Identificador incorrecte! report_err_duplicate_id=Aquest identificador ja existeix a la base de dades! report_err_bad_name=Nom incorrecte! report_err_bad_pw=Les contrasenyes no coincideixen! report_err_connect=Error en connectar amb la base de dades d'informes! test_alert_exit=EXIT: En aquest punt el JClic es tancaria. test_alert_jump_to=En aquest punt es produiria un salt al projecte: ftype_image=Imatge ftype_audio=So digital ftype_midi=Fitxer MIDI ftype_xml=Fitxer XML ftype_anim=Animaci\u00f3 ftype_video=V\u00eddeo digital ftype_font=Tipus de lletra TrueType ftype_jclic=Projecte JClic ftype_inst=Seq\u00fc\u00e8ncia d'instal\u00b7laci\u00f3 de projectes JClic ftype_unknown=Desconegut ftype_animated=animada filefilter_fonts=Tipus de lletra (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=V#40 filefilter_all_html=Documents HTML (*.htm, *.html) about_creditsDoc=about/credits_ca.html about_licenseDoc=about/license_ca.html about_sponsorsCaption=Amb el suport de: about_window_systemInfo=Informaci\u00f3 del sistema about_window_projectInfo=Informaci\u00f3 del projecte actual about_window_reportInfo=Resultats de la sessi\u00f3 actual about_otherCreditsCaption=Aquest producte inclou programari desenvolupat per: msg_saving_project=Desant el projecte... filefilter_text=Fitxers de text (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Versi\u00f3 en catal\u00e0, per l'Equip Clic #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Aquest programa és lliure. Podeu distribuir-lo i/o modificar-lo conforme a les disposicions de la Llicència Pública General de GNU (GPL), publicada per la Free Software Foundation, ja sigui la versió 2 de la llicència o qualsevol versió posterior.
 
Aquest programa es distribueix amb la intenció de resultar útil, però SENSE CAP GARANTIA, fins i tot sense la garantia implícita de COMERCIABILITAT o CONVENIÈNCIA PER A UN PROPÒSIT PARTICULAR. Per a més detalls, vegeu la Llicència Pública General de GNU. levels_INF=Infantil (3-6) levels_PRI=Prim\u00e0ria (6-12) levels_SEC=Secund\u00e0ria (12-16) levels_BTX=Batxillerat/FP (16-18) levels_other=Altres nivells: areas_lleng=Lleng\u00fces areas_mat=Matem\u00e0tiques areas_soc=Ci\u00e8ncies socials areas_exp=Ci\u00e8ncies experimentals areas_mus=M\u00fasica areas_vip=Visual i pl\u00e0stica areas_ef=Educaci\u00f3 f\u00edsica areas_tec=Tecnologies areas_div=Diversos areas_other=Altres \u00e0rees: src/core/edu/xtec/resources/messages/JClicMessages_ca@valencia.properties000066400000000000000000000017231335566474600272240ustar00rootroot00000000000000#JClic main messages label_time=temps label_score=puntuaci\u00F3 Skin = Aparen\u00E7a action_next_caption=Seg\u00FCent action_next_tooltip=Activitat seg\u00FCent action_prev_caption=Anterior action_prev_tooltip=Activitat anterior action_reset_caption=Reinicia action_reset_tooltip=Reinicia l'activitat action_info_caption=Informaci\u00F3 about_window_lb_project=Projecte about_window_lb_languages=lleng\u00FCes about_window_lb_language=llengua about_window_close_button=Retorn about_window_caption=Quant a about_window_lb_report=Informe about_window_browser_button=Veure-ho al navegador report_no_activities=Activitats no registrades report_lb_time=Temps media_qt_error_initializing=Error inicialitzant QuickTime filesystem_openURL=Obri l'URL... filesystem_openFile=Obri el fitxer... filesystem_enterURL=Per favor, introdueix l'URL del recurs que vols baixar msg_error_executing_external=Error executant el comandament editor_moveDown_tooltip=Mou l'element seleccionat cap avall src/core/edu/xtec/resources/messages/JClicMessages_cs.properties000066400000000000000000000235761335566474600254550ustar00rootroot00000000000000#JClic main messages label_time=\u010Das label_actions=pokus\u016F label_score=sk\u00F3re Skin = Motiv action_next_caption=Dal\u0161\u00ED action_next_tooltip=Dal\u0161\u00ED aktivita action_prev_caption=P\u0159edchoz\u00ED action_prev_tooltip=P\u0159edchoz\u00ED aktivita action_reset_caption=Spustit znovu action_reset_tooltip=Restartovat aktivitu action_info_caption=Informace about_window_lb_project=Projekt about_window_lb_languages=jazyky about_window_lb_language=jazyk about_window_close_button=N\u00E1vrat about_window_caption=O aplikaci action_about_tooltip=U\u017Eivatelsk\u00E1 sestava about_window_lb_report=Sestava about_window_browser_button=Zobrazit v prohl\u00ED\u017Ee\u010Di report_no_activities=Nebyly nahl\u00E1\u0161eny \u017E\u00E1dn\u00E9 aktivity! report_system_standard=Zpr\u00E1va nen\u00ED zaregistrov\u00E1na v \u017E\u00E1dn\u00E9 DB report_lb_time=\u010Cas msg_error_loading_sequence=Chyba p\u0159i na\u010D\u00EDt\u00E1n\u00ED sekvence media_qt_error_initializing=Chyba p\u0159i inicializaci QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=Otev\u0159\u00EDt URL... filesystem_openFile=Otev\u0159\u00EDt soubor... filesystem_enterURL=Zadejte pros\u00EDm URL zdroje, kter\u00FD m\u00E1 b\u00FDt na\u010Dten. msg_error_executing_external=Chyba p\u0159i prov\u00E1d\u011Bn\u00ED p\u0159\u00EDkazu: editor_moveDown_tooltip=P\u0159esunout vybran\u00FD prvek dol\u016F editor_moveUp_tooltip=P\u0159esunout vybran\u00FD prvek nahoru editor_moveDown=Posunout dol\u016F editor_moveUp=Posunout nahoru filefilter_all_images=Soubory obr\u00E1zk\u016F (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG obr\u00E1zky filefilter_jpg=JPG obr\u00E1zky filefilter_gif=GIF obr\u00E1zky filesystem_saveURLerror=Soubory zalo\u017Een\u00E9 na URL jsou ur\u010Deny pouze pro \u010Dten\u00ED. filefilter_all_clic=Clic 3.0 bal\u00ED\u010Dky (*.pac, *.pcc) filefilter_all=V\u0161echny soubory filefilter_all_jclic_clic=JClic a Clic 3.0 projekty (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic projekty (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 kompaktn\u00ED bal\u00ED\u010Dky (*.pcc) filefilter_pac=Clic 3.0 otev\u0159en\u00E9 bal\u00ED\u010Dky (*.pac) filefilter_jclic_zip=JClic zkomprimovan\u00E9 projekty (*.jclic.zip) filefilter_jclic=JClic projekty (*.jclic) about_window_lb_mediaSystem=Syst\u00E9m multim\u00E9di\u00ED about_window_lb_level=\u00DArove\u0148 about_window_lb_area=Oblast report_num_actions=Proveden\u00E9 akce: report_project=Projekt: report_lb_totals=Celkem: report_num_projects=Projekty: report_session=Sezen\u00ED: msg_warn_no_exec_in_applets=Spou\u0161t\u011Bn\u00ED extern\u00EDch aplikac\u00ED je v appletech JClic zak\u00E1z\u00E1no z bezpe\u010Dnostn\u00EDch d\u016Fvod\u016F. msg_error_starting_activity=Chyba p\u0159i spou\u0161t\u011Bn\u00ED aktivity! msg_error_loading_project=Chyba p\u0159i na\u010D\u00EDt\u00E1n\u00ED projektu msg_error_playing_media=Chyba p\u0159i p\u0159ehr\u00E1v\u00E1n\u00ED m\u00E9dia! msg_activity_finished=Aktivita dokon\u010Dena! msg_playing_media=P\u0159ehr\u00E1van\u00E1 m\u00E9dia msg_activity_running=B\u011B\u017E\u00EDc\u00ED aktivita msg_activity_ready=Aktivita p\u0159ipravena msg_initializing=Prob\u00EDh\u00E1 inicializace... msg_preparing_media=P\u0159ipravuje se m\u00E9dium msg_error_loading_activity=Chyba p\u0159i na\u010D\u00EDt\u00E1n\u00ED msg_loading_activity=Na\u010D\u00EDt\u00E1 se aktivita msg_loading_project=Na\u010D\u00EDt\u00E1 se projekt... msg_ready=P\u0159ipraven err_reading_data=Chyba p\u0159i na\u010D\u00EDt\u00E1n\u00ED souboru err_file_save=Chyba p\u0159i ukl\u00E1d\u00E1n\u00ED souboru! err_file_open=Chyba p\u0159i otev\u00EDr\u00E1n\u00ED souboru! report_started=Sezen\u00ED spu\u0161t\u011Bno: report_lb_score=Sk\u00F3re report_lb_actions=Akce report_lb_solved=Ok report_lb_activity=Aktivita report_lb_sequence=Sekvence report_global_score=Celkov\u00E9 sk\u00F3re: report_total_time=Celkov\u00FD \u010Das aktivit: report_num_activities_solved=Aktivity ok: report_num_activities=Dokon\u010Den\u00E9 aktivity: report_num_sequences=Sekvence: report_system=Syst\u00E9m zpr\u00E1vy: report_user=U\u017Eivatel: report_not_finished=\u010Cinnost nebyla dokon\u010Dena action_info_tooltip=Dal\u0161\u00ED informace action_help_caption=N\u00E1pov\u011Bda action_help_tooltip=N\u00E1pov\u011Bda k t\u00E9to \u010Dinnosti action_audio_caption=Zvuky action_audio_tooltip=Zapnout/vypnout zvuky about_window_lb_system=Syst\u00E9m about_window_lb_total_mem=Celkov\u00E1 pam\u011B\u0165 about_window_lb_free_mem=Voln\u00E1 pam\u011B\u0165 about_window_lb_java_home=Java domov about_window_lb_java_vm=Virtu\u00E1ln\u00ED stroj Java about_window_lb_java_version=Verze Javy about_window_lb_os=Opera\u010Dn\u00ED syst\u00E9m about_window_lb_version=Verze about_window_lb_descriptors=Popisova\u010De about_window_lb_description=Popisek about_window_lb_history=Historie about_window_lb_organizations=Organizace about_window_lb_organization=Organizace about_window_lb_authors=Auto\u0159i about_window_lb_author=Tv\u016Frce about_window_lb_activity=Aktivita help_window_close_button=N\u00E1vrat k aktivit\u011B help_window_caption=Okno n\u00E1pov\u011Bdy action_about_caption=Sestavy action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic instal\u00E1tory projekt\u016F (*jclic.inst) report_err_no_users=V datab\u00E1zi sestav nejsou vytvo\u0159eni \u017E\u00E1dn\u00ED u\u017Eivatel\u00E9! report_err_no_users_in_group=V t\u00E9to datab\u00E1zi sestav nejsou vytvo\u0159eni \u017E\u00E1dn\u00ED u\u017Eivatel\u00E9! report_new_user=Nov\u00FD u\u017Eivatel... report_new_user_tooltip=Vytvo\u0159it nov\u00E9ho u\u017Eivatele v datab\u00E1zi sestav report_err_creating_user=Chyba p\u0159i vytv\u00E1\u0159n\u00ED nov\u00E9ho u\u017Eivatele! report_select_user=Identifikace u\u017Eivatele v datab\u00E1zi sestav report_userlist_title=Pros\u00EDm, zadejte sv\u00E9 jm\u00E9no: report_ident_user=Identifikace u\u017Eivatele report_name_prompt=Jm\u00E9no: report_id_prompt=P\u0159ihla\u0161ovac\u00ED jm\u00E9no: report_pw_prompt=Heslo: report_pw_prompt_confirm=Potvrdit heslo: report_new_user_data=Vytvo\u0159en\u00ED nov\u00E9ho u\u017Eivatele: report_err_bad_data=Chybn\u00E1 data! report_generic_group_name=Obecn\u00FD report_new_group=Vytvo\u0159it novou skupinu... report_err_creating_group=Chyba p\u0159i vytv\u00E1\u0159en\u00ED nov\u00E9 skupiny! report_grouplist_title=Pros\u00EDm, vyberte svou skupinu: report_new_group_data=Vytvo\u0159en\u00ED nov\u00E9 skupiny u\u017Eivatel\u016F: report_err_invalid_user=Chyb\u00ED ID u\u017Eivatele nebo heslo je chybn\u00E9. report_user_has_pwd=Tento \u00FA\u010Det je chr\u00E1n\u011Bn heslem. report_err_init=Chyba p\u0159i inicializaci syst\u00E9mu sestav. report_not_connected=nep\u0159ipojeno report_err_creating=Chyba p\u0159i vytv\u00E1\u0159en\u00ED agenta sestav action_return_caption=Zp\u011Bt action_return_tooltip=Zp\u011Bt do posledn\u00ED nab\u00EDdky action_return_keys=T* filefilter_all_sounds=Zvuky (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI soubory (*.mid) filefilter_all_video=Video soubory (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 soubory (*.swf) filefilter_skins=Motivy (*.xml) filefilter_all_media=V\u0161echny soubory m\u00E9di\u00ED filesystem_copyToRoot_1=Soubor filesystem_copyToRoot_2=je mimo aktu\u00E1ln\u00ED slo\u017Eku projektu. filesystem_copyToRoot_3=Doporu\u010Duje se m\u00EDt v\u0161echny soubory ve stejn\u00E9 slo\u017Ece. filesystem_copyToRoot_4=Chce zkop\u00EDrovat vybran\u00E9 soubory do projektov\u00E9 slo\u017Eky? filesystem_copyFile=Kop\u00EDruje se soubor msg_loading=Na\u010D\u00EDt\u00E1 se report_err_bad_id=\u0160patn\u00FD identifik\u00E1tor! report_err_duplicate_id=Tento identifik\u00E1tor v datab\u00E1zi ji\u017E existuje! report_err_bad_name=\u0160patn\u00E9 jm\u00E9no! report_err_bad_pw=Hesla nesouhlas\u00ED! report_err_connect=Chyba p\u0159i p\u0159ipojov\u00E1n\u00ED se k datab\u00E1zi sestav! test_alert_exit=KONEC: Nyn\u00ED bude program ukon\u010Den. test_alert_jump_to=Nyn\u00ED program p\u0159ejde k projektu: ftype_image=Obr\u00E1zek ftype_audio=Digit\u00E1ln\u00ED zvuk ftype_midi=MIDI soubor ftype_xml=XML soubor ftype_anim=Animace ftype_video=Digit\u00E1ln\u00ED video ftype_font=P\u00EDsmo TrueType ftype_jclic=JClic projekt ftype_inst=JClic skript instal\u00E1toru projektu ftype_unknown=Nezn\u00E1m\u00FD ftype_animated=animovan\u00FD filefilter_fonts=P\u00EDsma (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML dokumenty (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=S podporou: about_window_systemInfo=Informace o syst\u00E9mu about_window_projectInfo=Informace o aktu\u00E1ln\u00EDm projektu about_window_reportInfo=V\u00FDsledky aktu\u00E1ln\u00EDho sezen\u00ED about_otherCreditsCaption=Tento produkt obsahuje software vyvinut\u00FD: msg_saving_project=Ukl\u00E1d\u00E1n\u00ED projektu... filefilter_text=Textov\u00E9 soubory (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Anglick\u00E1 verze od JClic t\u00FDmu #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Tento program je svobodn\u00FD software; m\u016F\u017Eete ho p\u0159ed\u00E1vat a/nebo upravovat podle podm\u00EDnek GNU General Public License, kterou vydala Free Software Foundation; bu\u010F verze 2 t\u00E9to licence, nebo (podle va\u0161\u00ED volby) n\u011Bkterou dal\u0161\u00ED verz\u00ED.
 \r\n
Tento program je \u0161\u00ED\u0159en v nad\u011Bji, \u017Ee bude u\u017Eite\u010Dn\u00FD, ale BEZ JAK\u00C9KOLI Z\u00C1RUKY; neposkytuje se ani odvozen\u00E1 z\u00E1ruka\r\nPRODEJNOSTI nebo VHODNOSTI PRO UR\u010CIT\u00DD \u00DA\u010CEL. Pod\u00EDvejte se na GNU General Public License pro dal\u0161\u00ED detaily. src/core/edu/xtec/resources/messages/JClicMessages_da.properties000066400000000000000000000202121335566474600254140ustar00rootroot00000000000000#JClic main messages label_time=tid label_actions=fors\u00F8g label_score=score Skin = Skin action_next_caption=N\u00E6ste action_next_tooltip=N\u00E6ste aktivitet action_prev_caption=Forrige action_prev_tooltip=Forrige aktivitet action_reset_caption=Genstart action_reset_tooltip=Genstart aktivitet action_info_caption=Information about_window_lb_project=Projekt about_window_lb_languages=sprog about_window_lb_language=sprog about_window_close_button=Retur about_window_caption=Om action_about_tooltip=Bruger rapport about_window_lb_report=Rapport about_window_browser_button=Vis i browser report_no_activities=Ingen aktiviteter rapporteret! report_system_standard=Report not registered in any DB report_lb_time=Tid msg_error_loading_sequence=Error loading sequence media_qt_error_initializing=Error initializing QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=\u00C5bn URL... filesystem_openFile=\u00C5bn fil... filesystem_enterURL=Please enter the URL to the resource to be loaded. msg_error_executing_external=Error executing the command: editor_moveDown_tooltip=Flyt det valgte element ned editor_moveUp_tooltip=Flyt det valgte element op editor_moveDown=Flyt ned editor_moveUp=Flyt op filefilter_all_images=Billed filer (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG billed filefilter_jpg=JPG billed filefilter_gif=GIF billed filesystem_saveURLerror=URL-based files are read-only. filefilter_all_clic=Clic 3.0 packages (*.pac, *.pcc) filefilter_all=Alle filer filefilter_all_jclic_clic=JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic projects (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 compact packages (*.pcc) filefilter_pac=Clic 3.0 open packages (*.pac) filefilter_jclic_zip=JClic compressed projects (*.jclic.zip) filefilter_jclic=JClic projects (*.jclic) about_window_lb_mediaSystem=Multimedia system about_window_lb_level=Niveau about_window_lb_area=Omr\u00E5de report_num_actions=Actions done: report_project=Projekt: report_lb_totals=Total: report_num_projects=Projekter: report_session=Session: msg_warn_no_exec_in_applets=For security reasons, execution of external programs is disabled in JClic applets. msg_error_starting_activity=Fejl ved start af aktivitet! msg_error_loading_project=Fejl ved indl\u00E6sning af projekt msg_error_playing_media=Fejl ved afspilning af medie! msg_activity_finished=Aktivitet afsluttet! msg_playing_media=Afspiller medie msg_activity_running=Aktivitet k\u00F8rer msg_activity_ready=Aktivitet klar msg_initializing=Initierer... msg_preparing_media=Forbereder medie msg_error_loading_activity=Fejl ved indl\u00E6sning af aktivitet msg_loading_activity=Indl\u00E6ser aktivitet... msg_loading_project=Indl\u00E6ser projekt... msg_ready=Klar err_reading_data=Fejl ved indl\u00E6sning af fil err_file_save=Fejl ved gemning af fil! err_file_open=Fejl ved \u00E5bning af fil! report_started=Session started: report_lb_score=Score report_lb_actions=Handlinger report_lb_solved=Ok report_lb_activity=Aktivitet report_lb_sequence=Sekvens report_global_score=Global score: report_total_time=Total time on activities: report_num_activities_solved=Aktiviteter OK: report_num_activities=Aktiviteter udf\u00F8rt: report_num_sequences=Sekvenser: report_system=Report system: report_user=Bruger: report_not_finished=Aktivitet ikke afsluttet action_info_tooltip=Yderligere oplysninger action_help_caption=Hj\u00E6lp action_help_tooltip=Hj\u00E6lp til denne aktivitet action_audio_caption=Lyde action_audio_tooltip=Enable/disable sounds about_window_lb_system=System about_window_lb_total_mem=Total hukommelse about_window_lb_free_mem=Fri hukommelse about_window_lb_java_home=Java home about_window_lb_java_vm=Java virtual machine about_window_lb_java_version=Java version about_window_lb_os=Operativ system about_window_lb_version=Version about_window_lb_descriptors=Descriptors about_window_lb_description=Beskrivelse about_window_lb_history=Historie about_window_lb_organizations=Organisationer about_window_lb_organization=Organisation about_window_lb_authors=Forfattere about_window_lb_author=Forfatter about_window_lb_activity=Aktivitet help_window_close_button=Tilbage til aktivitet help_window_caption=Hj\u00E6lpe vindue action_about_caption=Rapporter action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic project installers (*.jclic.inst) report_err_no_users=No users defined in the reports database! report_err_no_users_in_group=No users defined for this group in the reports database! report_new_user=Ny bruger... report_new_user_tooltip=Create a new user in the reports database report_err_creating_user=Error creating new user! report_select_user=User identification for the reports database report_userlist_title=V\u00E6lg venligst dit navn: report_ident_user=Bruger identifikation report_name_prompt=Navn: report_id_prompt=Logind: report_pw_prompt=Adgangskode: report_pw_prompt_confirm=Bekr\u00E6ft adgangskode: report_new_user_data=Oprettelse af ny bruger: report_err_bad_data=Ukorrekte data! report_generic_group_name=Generisk report_new_group=Opret en ny gruppe... report_err_creating_group=Fejl ved oprettelse af ny gruppe! report_grouplist_title=V\u00E6lg venligst din gruppe: report_new_group_data=Creation of a new users group: report_err_invalid_user=Missing user ID or incorrect password. report_user_has_pwd=Denne konto er beskyttet af en adgangskode. report_err_init=Error initializing report system. report_not_connected=ikke forbundet report_err_creating=Error creating reports agent action_return_caption=Retur action_return_tooltip=Retur til sidste menu action_return_keys=T* filefilter_all_sounds=Lyde (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI filer (*.mid) filefilter_all_video=Video filer (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 filer (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=Alle mediefiler filesystem_copyToRoot_1=Filen filesystem_copyToRoot_2=is out of the current project's folder. filesystem_copyToRoot_3=Det er tilr\u00E5deligt at have alle filer i samme mappe. filesystem_copyToRoot_4=Do you want to copy the selected file to the project's folder? filesystem_copyFile=Kopierer fil msg_loading=Indl\u00E6ser report_err_bad_id=Bad identifier! report_err_duplicate_id=This identifier already exists in the database! report_err_bad_name=Ugyldigt navn! report_err_bad_pw=Adgangskoderne er ikke ens! report_err_connect=Error connecting to the reports database! test_alert_exit=EXIT: At this point, the program will exit. test_alert_jump_to=At this point the program will jump to the project: ftype_image=Billede ftype_audio=Digital audio ftype_midi=MIDI fil ftype_xml=XML fil ftype_anim=Animation ftype_video=Digital video ftype_font=TrueType skrifttype ftype_jclic=JClic project ftype_inst=JClic project installer script ftype_unknown=Ukendt ftype_animated=animeret filefilter_fonts=Fonte (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML dokumenter (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=om/licens.html about_sponsorsCaption=Med st\u00F8tte fra: about_window_systemInfo=System information about_window_projectInfo=Aktuel projekt info about_window_reportInfo=Current session results about_otherCreditsCaption=Dette produkt inkluderer software udviklet af: msg_saving_project=Gemmer projekt... filefilter_text=Tekst filer (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Danish version by carson #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. src/core/edu/xtec/resources/messages/JClicMessages_de.java000066400000000000000000000001071335566474600241460ustar00rootroot00000000000000package edu.xtec.resources.messages; public class JClicMessages_de {} src/core/edu/xtec/resources/messages/JClicMessages_de.properties000066400000000000000000000213071335566474600254260ustar00rootroot00000000000000#JClic main messages label_time=Zeit label_actions=Versuche label_score=Ergebnis Skin = Design action_next_caption=Weiter action_next_tooltip=N\u00E4chste \u00DCbung action_prev_caption=Zur\u00FCck action_prev_tooltip=Vorherige \u00DCbung action_reset_caption=Neu starten action_reset_tooltip=\u00DCbung neu starten action_info_caption=Information about_window_lb_project=Sammlung about_window_lb_languages=Sprachen about_window_lb_language=Sprache about_window_close_button=Zur\u00FCck about_window_caption=Info action_about_tooltip=Benutzerberichte about_window_lb_report=\u00DCbungsbericht about_window_browser_button=Ansicht im Browser report_no_activities=Keine \u00DCbungsberichte vorhanden! report_system_standard=Bericht in keiner Datenbank eingetragen report_lb_time=Zeit msg_error_loading_sequence=Fehler beim Laden der Sequenz media_qt_error_initializing=Fehler beim Starten von QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=URL \u00F6ffnen... filesystem_openFile=Datei \u00F6ffnen... filesystem_enterURL=URL der zu ladenden Datei hier eintragen. msg_error_executing_external=Fehler beim Ausf\u00FChren des Befehls: editor_moveDown_tooltip=Ausgew\u00E4hltes Element hinunter verschieben editor_moveUp_tooltip=Ausgew\u00E4hltes Element nach oben verschieben editor_moveDown=Abw\u00E4rts editor_moveUp=Aufw\u00E4rts filefilter_all_images=Grafikdateien (*.gif, *.jpg, *.png) filefilter_png=PNG-Grafiken filefilter_jpg=JPG-Grafiken filefilter_gif=GIF-Dateien filesystem_saveURLerror=URL-basierte Dateien k\u00F6nnen nicht \u00FCberschrieben werden. filefilter_all_clic=Click 3.0 Pakete (*.pac, *.pcc) filefilter_all=Alle Dateien filefilter_all_jclic_clic=JClic und Clic 3.0.Projekte (*.jclic, *.jclic.zip, *.pac. *.pcc) filefilter_all_jclic=JClic-Projekte (*.jclic, *.jclic.zip) filefilter_pcc=Komprimierte Clic 3.0.-Pakete (*.pcc) filefilter_pac=Offene Clic 3.0-Pakete (*.pac) filefilter_jclic_zip=Gezippte JClic-Projekte (*.jclic.zip) filefilter_jclic=JClic-Projekte (*.jclic) about_window_lb_mediaSystem=Multimediasystem about_window_lb_level=Stufe about_window_lb_area=Bereich report_num_actions=Durchgef\u00FChrte Aktionen: report_project=Projekt: report_lb_totals=Gesamt: report_num_projects=Projekte: report_session=Sitzung: msg_warn_no_exec_in_applets=Aus Sicherheitsgr\u00FCnden wurde das Ausf\u00FChren externer Programme in JClic-Applets deaktiviert. msg_error_starting_activity=Fehler beim Starten der \u00DCbung! msg_error_loading_project=Fehler beim Laden der Sammlung msg_error_playing_media=Fehler beim Abspielen des Mediums! msg_activity_finished=\u00DCbung beendet! msg_playing_media=Multimediadatei wird abgespielt msg_activity_running=\u00DCbung l\u00E4uft msg_activity_ready=\u00DCbung bereit msg_initializing=Wird gestartet... msg_preparing_media=Multimediadatei wird geladen msg_error_loading_activity=Fehler beim Laden der \u00DCbung msg_loading_activity=\u00DCbung wird geladen msg_loading_project=Sammlung wird geladen... msg_ready=Bereit err_reading_data=Fehler beim Laden der Datei err_file_save=Fehler beim Speichern der Datei! err_file_open=Fehler beim \u00D6ffnen der Datei! report_started=Sitzung gestartet: report_lb_score=Ergebnis report_lb_actions=Aktionen report_lb_solved=OK report_lb_activity=\u00DCbung report_lb_sequence=Sequenz report_global_score=Gesamtpunktezahl: report_total_time=\u00DCbungs-Gesamtzeit: report_num_activities_solved=Korrekte \u00DCbungen: report_num_activities=Beendete \u00DCbungen: report_num_sequences=Sequenzen: report_system=Report System: report_user=User: report_not_finished=\u00DCbung nicht beendet action_info_tooltip=Zusatzinfos action_help_caption=Hilfe action_help_tooltip=Hilfe zu dieser \u00DCbung action_audio_caption=Sounds action_audio_tooltip=Sound ein/aus about_window_lb_system=System about_window_lb_total_mem=Gesamter Speicherplatz about_window_lb_free_mem=Freier Speicherplatz about_window_lb_java_home=Java Home about_window_lb_java_vm=Java Virtual Machine about_window_lb_java_version=Java Version about_window_lb_os=Betriebssystem about_window_lb_version=Version about_window_lb_descriptors=Deskriptoren about_window_lb_description=Beschreibung about_window_lb_history=History about_window_lb_organizations=Organisationen about_window_lb_organization=Organisation about_window_lb_authors=Autor/innen about_window_lb_author=Autor/in about_window_lb_activity=\u00DCbung help_window_close_button=Zur\u00FCck zur \u00DCbung help_window_caption=Hilfe-Fenster action_about_caption=\u00DCbungsberichte action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic-Projekt-Installer (*.jclic.inst) report_err_no_users=Keine Usereintr\u00E4ge in der Datenbank. report_err_no_users_in_group=Keine Usereintr\u00E4ge f\u00FCr diese Gruppe in der Datenbank. report_new_user=Neuer User... report_new_user_tooltip=Neuen User in der Benutzerdatenbank anlegen report_err_creating_user=Fehler beim Anlegen des neuen Users! report_select_user=User-ID f\u00FCr die Berichtsdatenbank report_userlist_title=Namen ausw\u00E4hlen: report_ident_user=User-ID report_name_prompt=Name: report_id_prompt=Login: report_pw_prompt=Passwort: report_pw_prompt_confirm=Passwort best\u00E4tigen: report_new_user_data=Neuer User wird angelegt: report_err_bad_data=Falsche Eingabe! report_generic_group_name=Allgemein report_new_group=Neue Gruppe anlegen... report_err_creating_group=Fehler beim Anlegen der neuen Gruppe! report_grouplist_title=Bitte Gruppe ausw\u00E4hlen: report_new_group_data=Neue Usergruppe wird angelegt: report_err_invalid_user=Falsche User-ID oder falsches Passwort. report_user_has_pwd=Dieser Account ist passwortgesch\u00FCtzt. report_err_init=Fehler beim Starten des Report Systems. report_not_connected=keine Verbindung report_err_creating=Fehler beim Erstellen des \u00DCbungsberichts action_return_caption=Zur\u00FCck action_return_tooltip=Zur\u00FCck zu vorherigem Men\u00FC action_return_keys=T* filefilter_all_sounds=Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI-Files (*.mid) filefilter_all_video=Videodateien (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 files (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=Alle Mediendateien filesystem_copyToRoot_1=Datei filesystem_copyToRoot_2=befindet sich nicht im aktuellen Projektordner. filesystem_copyToRoot_3=Es wird empfohlen, alle Dateien im gleichen Ordner abzuspeichern. filesystem_copyToRoot_4=M\u00F6chten Sie die ausgew\u00E4hlte Datei in den Projektordner hineinkopieren? filesystem_copyFile=Datei wird kopiert msg_loading=Wird geladen report_err_bad_id=Falsche Bezeichnung! report_err_duplicate_id=User existiert bereits in der Datenbank! report_err_bad_name=Falscher Name! report_err_bad_pw=Falsches Passwort! report_err_connect=Fehler beim \u00DCbermitteln des \u00DCbungsberichts an die Datenbank! test_alert_exit=EXIT: Programm wird geschlossen test_alert_jump_to=\u00DCbergang vom Programm zum Projekt: ftype_image=Grafik ftype_audio=Sounddatei ftype_midi=MIDI-File ftype_xml=XML-Datei ftype_anim=Animation ftype_video=Digitale Video-Datei ftype_font=True-Type Schrift ftype_jclic=JClic Projekt ftype_inst=JClicProjekt-Installer Skript ftype_unknown=Unbekannt ftype_animated=animiert filefilter_fonts=Fonts (*.tff) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML-Dokumente (*.htm, *.html) about_creditsDoc=about/credits_de.html about_licenseDoc=about/license_de.html about_sponsorsCaption=Unterst\u00FCtzt von: about_window_systemInfo=Systeminformationen about_window_projectInfo=Info \u00FCber aktuelle Sammlung about_window_reportInfo=\u00DCbungsbericht about_otherCreditsCaption=Dieses Produkt basiert auf Software von: msg_saving_project=Projekt wird gespeichert... filefilter_text=Textdateien (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Deutsche Fassung:
EDUCATION HIGHWAY
Innovationszentrum für Schule und Neue Technologie GmbH
Linz/Austria, http://www.eduhi.at
Gemeinsam mit:
Astrid Leeb
Ingeborg Kanz
Monika Andraschko
Caroline Weigner #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Dieses Programm ist eine kostenlose Software, es kann unter den Bedingungen der GNU General Public License (veröffentlicht von der Free Software Foundation - entweder Version 2 der Lizenz oder eine andere spätere Version) vertrieben und/oder modifiziert werden.
 
Dieses Programm wird OHNE JEGLICHE GEWÄHR; GEBRAUCHSTAUGLICHKEIT oder TAUGLICHKEIT FÜR EINEN BESTIMMTEN ZWECK vertrieben. Nähere Information unter GNU General Public License src/core/edu/xtec/resources/messages/JClicMessages_el.properties000066400000000000000000000661151335566474600254440ustar00rootroot00000000000000#JClic main messages label_time=\u03C7\u03C1\u03CC\u03BD\u03BF\u03C2 label_actions=\u03C0\u03C1\u03BF\u03C3\u03C0\u03AC\u03B8\u03B5\u03B9\u03B5\u03C2 label_score=\u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1 Skin = \u0398\u03AD\u03BC\u03B1 action_next_caption=\u0395\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF action_next_tooltip=\u0395\u03C0\u03CC\u03BC\u03B5\u03BD\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 action_prev_caption=\u03A0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF action_prev_tooltip=\u03A0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 action_reset_caption=\u0395\u03C0\u03B1\u03BD\u03B5\u03BA\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 action_reset_tooltip=\u0395\u03C0\u03B1\u03BD\u03B5\u03BA\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 action_info_caption=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 about_window_lb_project=\u0388\u03C1\u03B3\u03BF about_window_lb_languages=\u03B3\u03BB\u03CE\u03C3\u03C3\u03B5\u03C2 about_window_lb_language=\u03B3\u03BB\u03CE\u03C3\u03C3\u03B1 about_window_close_button=\u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE about_window_caption=\u03A3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC action_about_tooltip=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 about_window_lb_report=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC about_window_browser_button=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03C3\u03C4\u03BF\u03BD \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE report_no_activities=\u0393\u03B9\u03B1 \u03BA\u03B1\u03BC\u03BC\u03AF\u03B1 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03C5\u03C0\u03BF\u03B2\u03BB\u03B7\u03B8\u03B5\u03AF \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC! report_system_standard=\u0397 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC \u03B4\u03B5\u03BD \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03B7\u03BA\u03B5 \u03C3\u03C4\u03B9\u03C2 \u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD report_lb_time=\u03A7\u03C1\u03CC\u03BD\u03BF\u03C2 msg_error_loading_sequence=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7\u03C2 \u03B1\u03BB\u03BB\u03B7\u03BB\u03BF\u03C5\u03C7\u03AF\u03B1\u03C2 media_qt_error_initializing=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B9\u03BA\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 \u03C4\u03BF\u03C5 QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 URL... filesystem_openFile=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5... filesystem_enterURL=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C4\u03BF URL \u03C3\u03C4\u03BF\u03BD \u03C0\u03CC\u03C1\u03BF \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03C6\u03BF\u03C1\u03C4\u03C9\u03B8\u03B5\u03AF msg_error_executing_external=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B5\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7\u03C2 \u03C4\u03B7\u03C2 \u03B5\u03BD\u03C4\u03BF\u03BB\u03AE\u03C2: editor_moveDown_tooltip=\u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BA\u03AC\u03C4\u03C9 editor_moveUp_tooltip=\u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C0\u03AC\u03BD\u03C9 editor_moveDown=\u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03BA\u03AC\u03C4\u03C9 editor_moveUp=\u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03C0\u03AC\u03BD\u03C9 filefilter_all_images=\u0391\u03C1\u03C7\u03B5\u03AF\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=\u0395\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 PNG filefilter_jpg=\u0395\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 JPG filefilter_gif=\u0395\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 GIF filesystem_saveURLerror=\u03A4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03C3\u03C4\u03B7\u03C1\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03B5 URL \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03B3\u03B9\u03B1 \u03B1\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7. filefilter_all_clic=\u03A0\u03B1\u03BA\u03AD\u03C4\u03B1 \u03C4\u03BF\u03C5 Clic 3.0 (*.pac, *.pcc) filefilter_all=\u038C\u03BB\u03B1 \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 filefilter_all_jclic_clic=\u0388\u03C1\u03B3\u03B1 \u03C4\u03BF\u03C5 JClic \u03BA\u03B1\u03B9 \u03C4\u03BF\u03C5 Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=\u0388\u03C1\u03B3\u03B1 \u03C4\u03BF\u03C5 JClic (*.jclic, *.jclic.zip) filefilter_pcc=\u03A3\u03C5\u03BC\u03C0\u03B9\u03B5\u03C3\u03BC\u03AD\u03BD\u03B1 \u03C0\u03B1\u03BA\u03AD\u03C4\u03B1 \u03C4\u03BF\u03C5 Clic 3.0 (*.pcc) filefilter_pac=To Clic 3.0 \u03B1\u03BD\u03BF\u03AF\u03B3\u03B5\u03B9 \u03C0\u03B1\u03BA\u03AD\u03C4\u03B1 (*.pac) filefilter_jclic_zip=\u03A3\u03C5\u03BC\u03C0\u03B9\u03B5\u03C3\u03BC\u03AD\u03BD\u03B1 \u03AD\u03C1\u03B3\u03B1 \u03C4\u03BF\u03C5 JClic (*.jclic.zip) filefilter_jclic=\u0388\u03C1\u03B3\u03B1 \u03C4\u03BF\u03C5 JClic (*.jclic) about_window_lb_mediaSystem=\u03A3\u03CD\u03C3\u03C4\u03B7\u03BC\u03B1 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD about_window_lb_level=\u0395\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF about_window_lb_area=\u03A0\u03B5\u03C1\u03B9\u03BF\u03C7\u03AE report_num_actions=\u039F\u03B9 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B5\u03C2 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B1\u03BD: report_project=\u0388\u03C1\u03B3\u03BF: report_lb_totals=\u03A3\u03CD\u03BD\u03BF\u03BB\u03BF: report_num_projects=\u0388\u03C1\u03B3\u03B1: report_session=\u03A3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B5\u03C2: msg_warn_no_exec_in_applets=\u0393\u03B9\u03B1 \u03BB\u03CC\u03B3\u03BF\u03C5\u03C2 \u03B1\u03C3\u03C6\u03B1\u03BB\u03B5\u03AF\u03B1\u03C2, \u03B7 \u03B5\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7 \u03B5\u03BE\u03C9\u03C4\u03B5\u03C1\u03B9\u03BA\u03CE\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03CE\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03B7 \u03C3\u03C4\u03B9\u03C2 \u03BC\u03B9\u03BA\u03C1\u03BF\u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AD\u03C2 \u03C4\u03BF\u03C5 JClic. msg_error_starting_activity=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03AD\u03BD\u03B1\u03C1\u03BE\u03B7\u03C2 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2! msg_error_loading_project=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 msg_error_playing_media=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B1\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03C4\u03BF\u03C5 \u03BC\u03AD\u03C3\u03BF\u03C5! msg_activity_finished=\u0397 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5! msg_playing_media=\u0391\u03BD\u03B1\u03C0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03AE \u03BC\u03AD\u03C3\u03C9\u03BD msg_activity_running=\u0397 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B5\u03BA\u03C4\u03B5\u03BB\u03B5\u03AF\u03C4\u03B1\u03B9 msg_activity_ready=\u0397 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03C4\u03BF\u03B9\u03BC\u03B7 msg_initializing=\u0391\u03C1\u03C7\u03B9\u03BA\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7... msg_preparing_media=\u03A0\u03C1\u03BF\u03B5\u03C4\u03BF\u03B9\u03BC\u03B1\u03C3\u03AF\u03B1 \u03C4\u03C9\u03BD \u03BC\u03AD\u03C3\u03C9\u03BD msg_error_loading_activity=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7\u03C2 \u03C4\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 msg_loading_activity=\u03A6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 msg_loading_project=\u03A6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 \u03AD\u03C1\u03B3\u03BF\u03C5... msg_ready=\u0388\u03C4\u03BF\u03B9\u03BC\u03BF err_reading_data=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 err_file_save=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5! err_file_open=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B1\u03BD\u03BF\u03AF\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5! report_started=\u0388\u03BD\u03B1\u03C1\u03BE\u03B7 \u03C3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B1\u03C2: report_lb_score=\u0392\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1 report_lb_actions=\u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B5\u03C2 report_lb_solved=\u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9 report_lb_activity=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 report_lb_sequence=\u0391\u03BB\u03BB\u03B7\u03BB\u03BF\u03C5\u03C7\u03AF\u03B1 report_global_score=\u03A3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03AE \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1: report_total_time=\u03A3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03CC\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD: report_num_activities_solved=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2, \u03B5\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9: report_num_activities=\u039F\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03C9\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2: report_num_sequences=\u0391\u03BB\u03BB\u03B7\u03BB\u03BF\u03C5\u03C7\u03AF\u03B5\u03C2 report_system=\u03A3\u03CD\u03C3\u03C4\u03B7\u03BC\u03B1 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD: report_user=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2: report_not_finished=\u0397 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B4\u03B5\u03BD \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5 action_info_tooltip=\u03A0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C4\u03B5\u03C2 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 action_help_caption=\u0392\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1 action_help_tooltip=\u0392\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1 \u03B3\u03B9\u03B1 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 action_audio_caption=\u0389\u03C7\u03BF\u03B9 action_audio_tooltip=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7/\u0391\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03AE\u03C7\u03C9\u03BD about_window_lb_system=\u03A3\u03CD\u03C3\u03C4\u03B7\u03BC\u03B1 about_window_lb_total_mem=\u03A3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03AE \u03BC\u03BD\u03AE\u03BC\u03B7 about_window_lb_free_mem=\u0395\u03BB\u03B5\u03CD\u03B8\u03B5\u03C1\u03B7 \u03BC\u03BD\u03AE\u03BC\u03B7 about_window_lb_java_home=\u03A6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2 Java about_window_lb_java_vm=\u0395\u03B9\u03BA\u03BF\u03BD\u03B9\u03BA\u03AE \u03BC\u03B7\u03C7\u03B1\u03BD\u03AE Java about_window_lb_java_version=\u0388\u03BA\u03B4\u03BF\u03C3\u03B7 Java about_window_lb_os=\u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03B9\u03BA\u03CC \u03C3\u03CD\u03C3\u03C4\u03B7\u03BC\u03B1 about_window_lb_version=\u0388\u03BA\u03B4\u03BF\u03C3\u03B7 about_window_lb_descriptors=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF\u03C2 about_window_lb_description=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE about_window_lb_history=\u0399\u03C3\u03C4\u03BF\u03C1\u03B9\u03BA\u03CC about_window_lb_organizations=\u03A6\u03BF\u03C1\u03B5\u03AF\u03C2 about_window_lb_organization=\u03A6\u03BF\u03C1\u03AD\u03B1\u03C2 about_window_lb_authors=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03BF\u03AF about_window_lb_author=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03CC\u03C2 about_window_lb_activity=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 help_window_close_button=\u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C3\u03C4\u03B7 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 help_window_caption=\u03A0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF \u03B2\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1\u03C2 action_about_caption=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 action_about_keys=RR action_audio_keys=SS action_help_keys=\u03A9\u03A9 action_info_keys=\u0399\u0399 action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=\u0395\u03B3\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AC\u03C4\u03B5\u03C2 \u03AD\u03C1\u03B3\u03C9\u03BD JClic (*.jclic.inst) report_err_no_users=\u0394\u03B5\u03BD \u03BF\u03C1\u03AF\u03C3\u03C4\u03B7\u03BA\u03B1\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 \u03C3\u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD! report_err_no_users_in_group=\u0394\u03B5\u03BD \u03B5\u03BD\u03C4\u03BF\u03C0\u03AF\u03C3\u03C4\u03B7\u03BA\u03B1\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 \u03B3\u03B9\u03B1 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7\u03BD \u03BF\u03BC\u03AC\u03B4\u03B1 \u03C3\u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD! report_new_user=\u039D\u03AD\u03BF\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2... report_new_user_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03C3\u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD report_err_creating_user=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7! report_select_user=\u0391\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD report_userlist_title=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03AC \u03C3\u03B1\u03C2: report_ident_user=\u0391\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 report_name_prompt=\u038C\u03BD\u03BF\u03BC\u03B1 report_id_prompt=\u0395\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2: report_pw_prompt=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2: report_pw_prompt_confirm=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2: report_new_user_data=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7: report_err_bad_data=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1! report_generic_group_name=\u0393\u03B5\u03BD\u03B9\u03BA\u03CC report_new_group=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03B1\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2... report_err_creating_group=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03B1\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2! report_grouplist_title=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03B7\u03BD \u03BF\u03BC\u03AC\u03B4\u03B1 \u03C3\u03B1\u03C2: report_new_group_data=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BC\u03B9\u03B1\u03C2 \u03BD\u03AD\u03B1\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD: report_err_invalid_user=\u0395\u03BB\u03BB\u03B9\u03C0\u03AD\u03C2 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03AE \u03BB\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2. report_user_has_pwd=\u0391\u03C5\u03C4\u03CC\u03C2 \u03BF \u03BB\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03CC\u03C2 \u03AD\u03C7\u03B5\u03B9 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B1\u03C3\u03AF\u03B1 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 report_err_init=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03AD\u03BD\u03B1\u03C1\u03BE\u03B7\u03C2 \u03C3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD. report_not_connected=\u03B4\u03B5\u03BD \u03C3\u03C5\u03BD\u03B4\u03AD\u03B8\u03B7\u03BA\u03B5 report_err_creating=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C3\u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03C3\u03C5\u03BD\u03C4\u03B5\u03BB\u03B5\u03C3\u03C4\u03AE \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD action_return_caption=\u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE action_return_tooltip=\u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C3\u03C4\u03BF \u03C4\u03B5\u03BB\u03B5\u03C5\u03C4\u03B1\u03AF\u03BF \u03BC\u03B5\u03BD\u03BF\u03CD action_return_keys=T* filefilter_all_sounds=\u0389\u03C7\u03BF\u03B9 (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=\u0391\u03C1\u03C7\u03B5\u03AF\u03B1 MIDI (*.mid) filefilter_all_video=\u0391\u03C1\u03C7\u03B5\u03AF\u03B1 \u03B2\u03AF\u03BD\u03C4\u03B5\u03BF (*.avi, *.mov, *.mpeg) filefilter_all_anim=\u0391\u03C1\u03C7\u03B5\u03AF\u03B1 Flash 2.0 (*.swf) filefilter_skins=\u0398\u03AD\u03BC\u03B1\u03C4\u03B1 (*.xml) filefilter_all_media=\u038C\u03BB\u03B1 \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD filesystem_copyToRoot_1=\u03A4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF filesystem_copyToRoot_2=\u03B2\u03C1\u03AF\u03C3\u03BA\u03B5\u03C4\u03B1\u03B9 \u03B5\u03BA\u03C4\u03CC\u03C2 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 \u03C4\u03BF\u03C5 \u03C0\u03B1\u03C1\u03CC\u03BD\u03C4\u03BF\u03C2 \u03AD\u03C1\u03B3\u03BF\u03C5. filesystem_copyToRoot_3=\u03A0\u03C1\u03BF\u03C4\u03B5\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03CD\u03BF\u03BD\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF. filesystem_copyToRoot_4=\u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03BD\u03C4\u03B9\u03B3\u03C1\u03AC\u03C8\u03B5\u03C4\u03B5 \u03C4\u03BF \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03C3\u03C4\u03BF\u03BD \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5; filesystem_copyFile=\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 msg_loading=\u03A6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 report_err_bad_id=\u0395\u03C3\u03C6\u03B1\u03BB\u03BC\u03AD\u03BD\u03BF \u03B1\u03BD\u03B1\u03B3\u03BD\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC! report_err_duplicate_id=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B1\u03BD\u03B1\u03B3\u03BD\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03AE\u03B4\u03B7 \u03C3\u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD! report_err_bad_name=\u0395\u03C3\u03C6\u03B1\u03BB\u03BC\u03AD\u03BD\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1! report_err_bad_pw=\u039F\u03B9 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03AF \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B4\u03B5\u03BD \u03C4\u03B1\u03B9\u03C1\u03B9\u03AC\u03B6\u03BF\u03C5\u03BD! report_err_connect=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD test_alert_exit=\u0395\u039E\u039F\u0394\u039F\u03A3: \u03A3\u03B5 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03B7\u03BC\u03B5\u03AF\u03BF, \u03C4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03B8\u03B1 \u03BA\u03BB\u03B5\u03AF\u03C3\u03B5\u03B9. test_alert_jump_to=\u03A3\u03B5 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03B7\u03BC\u03B5\u03AF\u03BF \u03C4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03B8\u03B1 \u03BC\u03B5\u03C4\u03B1\u03B2\u03B5\u03AF \u03C3\u03C4\u03BF \u03AD\u03C1\u03B3\u03BF: ftype_image=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 ftype_audio=\u03A8\u03B7\u03C6\u03B9\u03B1\u03BA\u03CC\u03C2 \u03AE\u03C7\u03BF\u03C2 ftype_midi=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF MIDI ftype_xml=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF XML ftype_anim=\u039A\u03B9\u03BD\u03BF\u03CD\u03BC\u03B5\u03BD\u03B7 \u03B1\u03C0\u03B5\u03B9\u03BA\u03CC\u03BD\u03B9\u03C3\u03B7 ftype_video=\u03A8\u03B7\u03C6\u03B9\u03B1\u03BA\u03CC \u03B2\u03AF\u03BD\u03C4\u03B5\u03BF ftype_font=\u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC TrueType ftype_jclic=\u0388\u03C1\u03B3\u03BF \u03C4\u03BF\u03C5 JClic ftype_inst=\u03A3\u03B5\u03BD\u03AC\u03C1\u03B9\u03BF \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2 \u03AD\u03C1\u03B3\u03BF\u03C5 \u03C4\u03BF\u03C5 JClic ftype_unknown=\u0386\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF ftype_animated=\u03BA\u03B9\u03BD\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF filefilter_fonts=\u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AD\u03C2 (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=\u0391\u03C1\u03C7\u03B5\u03AF\u03B1 HTML (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=\u039C\u03B5 \u03C4\u03B7\u03BD \u03C5\u03C0\u03BF\u03C3\u03C4\u03AE\u03C1\u03B9\u03BE\u03B7: about_window_systemInfo=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 \u03C3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 about_window_projectInfo=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 \u03C4\u03C1\u03AD\u03C7\u03BF\u03BD\u03C4\u03BF\u03C2 \u03AD\u03C1\u03B3\u03BF\u03C5 about_window_reportInfo=\u0391\u03C0\u03BF\u03C4\u03B5\u03BB\u03AD\u03C3\u03BC\u03B1\u03C4\u03B1 \u03C4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1\u03C2 \u03C3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B1\u03C2 about_otherCreditsCaption=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03C0\u03C1\u03BF\u03CA\u03CC\u03BD \u03C0\u03B5\u03C1\u03B9\u03BB\u03B1\u03BC\u03B2\u03AC\u03BD\u03B5\u03B9 \u03BB\u03BF\u03B3\u03B9\u03C3\u03BC\u03B9\u03BA\u03CC \u03C0\u03BF\u03C5 \u03AD\u03C7\u03B5\u03B9 \u03B1\u03BD\u03B1\u03C0\u03C4\u03C5\u03C7\u03B8\u03B5\u03AF \u03B1\u03C0\u03CC: msg_saving_project=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03AD\u03C1\u03B3\u03BF\u03C5... filefilter_text=\u0391\u03C1\u03C7\u03B5\u03AF\u03B1 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AE \u03AD\u03BA\u03B4\u03BF\u03C3\u03B7, \u03B1\u03C0\u03CC \u03C4\u03BF\u03C5\u03C2: \u0393\u03B9\u03AC\u03BD\u03BD\u03B7 \u039A\u03B1\u03C3\u03BA\u03B1\u03BC\u03B1\u03BD\u03AF\u03B4\u03B7 (ttnfy17@yahoo.gr), \u039A\u03C5\u03C1\u03B9\u03AC\u03BA\u03BF \u039C\u03AE\u03C4\u03BA\u03B1, \u0393\u03B9\u03CE\u03C1\u03B3\u03BF \u039C\u03B1\u03BA\u03B1\u03C1\u03B1\u03C4\u03B6\u03AE, \u0393\u03B9\u03AC\u03BD\u03BD\u03B7 \u039A\u03AF\u03BA\u03B1 #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=\u0391\u03C5\u03C4\u03AE \u03B7 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03B1\u03BD\u03AE\u03BA\u03B5\u03B9 \u03C3\u03C4\u03BF \u0395\u03BB\u03B5\u03CD\u03B8\u03B5\u03C1\u03BF \u039B\u03BF\u03B3\u03B9\u03C3\u03BC\u03B9\u03BA\u03CC. \u039C\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03C4\u03B7\u03BD \u03B1\u03BD\u03B1\u03B4\u03B9\u03B1\u03BD\u03B5\u03AF\u03BC\u03B5\u03C4\u03B5 \u03AE/\u03BA\u03B1\u03B9 \u03BD\u03B1 \u03C4\u03B7\u03BD \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03C4\u03B5 \u03C5\u03C0\u03CC \u03C4\u03BF\u03C5\u03C2 \u03CC\u03C1\u03BF\u03C5\u03C2 \u03C4\u03B7\u03C2 \u0393\u03B5\u03BD\u03B9\u03BA\u03AE\u03C2 \u0386\u03B4\u03B5\u03B9\u03B1\u03C2 \u03A7\u03C1\u03AE\u03C3\u03B7\u03C2 GNU (\u03AD\u03BA\u03B4\u03BF\u03C3\u03B7 2 \u03AE \u03B5\u03C0\u03CC\u03BC\u03B5\u03BD\u03B7), \u03C0\u03BF\u03C5 \u03B5\u03BA\u03B4\u03CC\u03B8\u03B7\u03BA\u03B5 \u03B1\u03C0\u03CC \u03C4\u03BF \u038A\u03B4\u03C1\u03C5\u03BC\u03B1 \u0395\u03BB\u03B5\u03CD\u03B8\u03B5\u03C1\u03BF\u03C5 \u039B\u03BF\u03B3\u03B9\u03C3\u03BC\u03B9\u03BA\u03BF\u03CD (Free Software Foundation).
 
\u0397 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03B4\u03B9\u03B1\u03BD\u03AD\u03BC\u03B5\u03C4\u03B1\u03B9 \u03BC\u03B5 \u03C4\u03B7\u03BD \u03C0\u03C1\u03BF\u03C3\u03B4\u03BF\u03BA\u03AF\u03B1 \u03CC\u03C4\u03B9 \u03B8\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C7\u03C1\u03AE\u03C3\u03B9\u03BC\u03B7, \u03C7\u03C9\u03C1\u03AF\u03C2 \u03CC\u03BC\u03C9\u03C2 \u03B5\u03B3\u03B3\u03CD\u03B7\u03C3\u03B7 \u03C0\u03BF\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03AE \u03BA\u03B1\u03BB\u03AE\u03C2 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2 \u03BA\u03B1\u03B9, \u03B1\u03BA\u03CC\u03BC\u03B7, \u03C7\u03C9\u03C1\u03AF\u03C2 \u03C5\u03C0\u03BF\u03B4\u03B7\u03BB\u03BF\u03CD\u03BC\u03B5\u03BD\u03B7 \u03B5\u03B3\u03B3\u03CD\u03B7\u03C3\u03B7 \u03B5\u03BC\u03C0\u03BF\u03C1\u03B5\u03C5\u03C3\u03B9\u03BC\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03AE \u03BA\u03B1\u03C4\u03B1\u03BB\u03BB\u03B7\u03BB\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03C3\u03C5\u03B3\u03BA\u03B5\u03BA\u03C1\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2 \u03C3\u03BA\u03BF\u03C0\u03BF\u03CD\u03C2. \u0394\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B7 \u0393\u03B5\u03BD\u03B9\u03BA\u03AE \u0386\u03B4\u03B5\u03B9\u03B1 \u03A7\u03C1\u03AE\u03C3\u03B7\u03C2 GNU \u03B3\u03B9\u03B1 \u03C0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03BB\u03B5\u03C0\u03C4\u03BF\u03BC\u03AD\u03C1\u03B5\u03B9\u03B5\u03C2. src/core/edu/xtec/resources/messages/JClicMessages_en.java000066400000000000000000000001121335566474600241540ustar00rootroot00000000000000package edu.xtec.resources.messages; public class JClicMessages_en {} src/core/edu/xtec/resources/messages/JClicMessages_es.java000066400000000000000000000001071335566474600241650ustar00rootroot00000000000000package edu.xtec.resources.messages; public class JClicMessages_es {} src/core/edu/xtec/resources/messages/JClicMessages_es.properties000066400000000000000000000230641335566474600254470ustar00rootroot00000000000000#JClic main messages label_time=tiempo label_actions=intentos label_score=aciertos Skin = Aspecto action_next_caption=Siguiente action_next_tooltip=Actividad siguiente action_prev_caption=Anterior action_prev_tooltip=Actividad anterior action_reset_caption=Reiniciar action_reset_tooltip=Reiniciar la actividad action_info_caption=Informaci\u00f3n about_window_lb_project=Proyecto about_window_lb_languages=Idiomas about_window_lb_language=Idioma about_window_close_button=Volver about_window_caption=Acerca de... action_about_tooltip=informes de usuario about_window_lb_report=Informes about_window_browser_button=Verlo en el navegador report_no_activities=\u00a1No hay ninguna actividad reportada! report_system_standard=Los datos del informe no se est\u00e1n guardando report_lb_time=Tiempo msg_error_loading_sequence=Error al cargar la secuencia media_qt_error_initializing=\u00a1Error al inicializar QuickTime! media_check_url=messages/checkmedia_es.html filesystem_openURL=Abrir URL... filesystem_openFile=Abrir archivo... filesystem_enterURL=Escriba la URL del recurso al que desea acceder. msg_error_executing_external=Error al ejecutar la orden: editor_moveDown_tooltip=Mover el elemento seleccionado hacia abajo editor_moveUp_tooltip=Mover el elemento seleccionado hacia arriba editor_moveDown=Mover hacia abajo editor_moveUp=Mover hacia arriba filefilter_all_images=Im\u00e1genes (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=Im\u00e1genes PNG filefilter_jpg=Im\u00e1genes JPG filefilter_gif=Im\u00e1genes GIF filesystem_saveURLerror=Los archivos basados en una URL son de solo lectura. filefilter_all_clic=Paquetes Clic 3.0 (*.pac, *.pcc) filefilter_all=Todos los archivos filefilter_all_jclic_clic=Proyectos JClic y Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=Proyectos JClic (*.jclic, *.jclic.zip) filefilter_all_jclic_scorm=Proyectos JClic y archivos SCORM (*.jclic, *.jclic.zip, *.scorm.zip) filefilter_pcc=Paquetes compactos Clic 3.0 (*.pcc) filefilter_pac=Paquetes abiertos Clic 3.0 (*.pac) filefilter_jclic_zip=Proyectos JClic comprimidos (*.jclic.zip) filefilter_jclic=Proyectos JClic (*.jclic) about_window_lb_mediaSystem=Sistema multimedia about_window_lb_level=Nivel about_window_lb_area=\u00c1rea report_num_actions=Acciones efectuadas: report_project=Proyecto: report_lb_totals=Totales: report_num_projects=Proyectos: report_session=Sesi\u00f3n: msg_warn_no_exec_in_applets=Por razones de seguridad la invocaci\u00f3n a programas externos est\u00e1 deshabilitada en los applets JClic. msg_error_starting_activity=\u00a1Error al iniciar la actividad! msg_error_loading_project=Error al cargar el proyecto msg_error_playing_media=\u00a1Error del recurso multimedia! msg_activity_finished=\u00a1Actividad terminada! msg_playing_media=Reproduciendo multimedia msg_activity_running=Actividad en marcha msg_activity_ready=Actividad preparada msg_initializing=Inicializando... msg_preparing_media=Preparando multimedia msg_error_loading_activity=Error al cargar la actividad msg_loading_activity=Cargando actividad msg_loading_project=Cargando proyecto... msg_ready=Listo err_reading_data=Error al leer el archivo err_file_save=\u00a1Error al guardar el archivo! err_file_open=\u00a1Error al abrir el archivo! report_started=Inicio de sessi\u00f3n: report_lb_score=Puntuaci\u00f3n report_lb_actions=Acciones report_lb_solved=Correcta report_lb_activity=Actividad report_lb_sequence=Secuencia report_global_score=Puntuaci\u00f3n global: report_total_time=Tiempo total en actividades: report_num_activities_solved=Actividades correctas: report_num_activities=Actividades realizadas: report_num_sequences=Secuencias: report_system=Sistema de informes: report_user=Usuario: report_not_finished=Actividad aun no acabada action_info_tooltip=Informaci\u00f3n adicional action_help_caption=Ayuda action_help_tooltip=Ayuda sobre la actividad action_audio_caption=Sonidos action_audio_tooltip=Activar/desactivar los sonidos about_window_lb_system=Sistema about_window_lb_total_mem=Memoria total about_window_lb_free_mem=Memoria libre about_window_lb_java_home=Ubicaci\u00f3n de Java about_window_lb_java_vm=M\u00e1quina virtual Java about_window_lb_java_version=Versi\u00f3n Java about_window_lb_os=Sistema operativo about_window_lb_version=Versi\u00f3n about_window_lb_descriptors=Descriptores about_window_lb_description=Descripci\u00f3n about_window_lb_history=Revisiones about_window_lb_organizations=Organizaciones about_window_lb_organization=Organizaci\u00f3n about_window_lb_authors=Autores/as about_window_lb_author=Autor/a about_window_lb_activity=Actividad help_window_close_button=Volver a la actividad help_window_caption=Ventana de ayuda action_about_caption=Informes action_about_keys=II action_audio_keys=OS action_help_keys=YY action_info_keys=NN action_next_keys=S* action_prev_keys=A* action_reset_keys=R* filefilter_install=Instaladores de proyectos JClic (*.jclic.inst) report_err_no_users=No hay ning\u00fan usuario definido en la base de datos de informes. report_err_no_users_in_group=No hay ning\u00fan usuario definido para este grupo en la base de datos de informes! report_new_user=Nuevo usuario... report_new_user_tooltip=Crear un nuevo usuario en la base de datos de informes report_err_creating_user=\u00a1Error al crear el nuevo usuario! report_select_user=Identificaci\u00f3n de usuario para la base de datos de informes report_userlist_title=Seleccione su nombre: report_ident_user=Identificaci\u00f3n de usuario report_name_prompt=Nombre: report_id_prompt=Identificador: report_pw_prompt=Contrase\u00f1a: report_pw_prompt_confirm=Confirmar contrase\u00f1a: report_new_user_data=Creaci\u00f3n de un nuevo usuario: report_err_bad_data=Datos incorrectos! report_generic_group_name=Gen\u00e9rico report_new_group=Crear un nuevo grupo... report_err_creating_group=\u00a1Error al crear el nuevo grupo! report_grouplist_title=Seleccione su grupo: report_new_group_data=Creaci\u00f3n de un nuevo grupo de usuarios: report_err_invalid_user=Usuario inexistente o contrase\u00f1a incorrecta. report_user_has_pwd=La cuenta de este usuario est\u00e1 protegida por contrase\u00f1a: report_err_init=Error al inicializar el sistema de informes. report_not_connected=no conectado report_err_creating=Error al crear el agente de informes action_return_caption=Volver action_return_tooltip=Volver al \u00faltimo men\u00fa action_return_keys=V* filefilter_all_sounds=Sonidos (*.wav, *.mp3, *.au, *.aiff) filefilter_midi=Archivos MIDI (*.mid) filefilter_all_video=Video (*.avi, *.mov, *.mpeg) filefilter_all_anim=Archivos Flash 2.0 (*.swf) filefilter_skins=Entornos visuales (*.xml) filefilter_all_media=Todos los recursos filesystem_copyToRoot_1=El archivo filesystem_copyToRoot_2=se encuentra en una carpeta distinta a la del proyecto actual. filesystem_copyToRoot_3=Se recomienda tener todos los archivos en la misma carpeta. filesystem_copyToRoot_4=\u00bfDesea copiar el archivo seleccionado a la carpeta del proyecto? filesystem_copyFile=Copiando el archivo msg_loading=Cargando report_err_bad_id=\u00a1Identificador incorrecto! report_err_duplicate_id=\u00a1Este identificador ya existe en la base de datos! report_err_bad_name=\u00a1Nombre incorrecto! report_err_bad_pw=\u00a1Las contrase\u00f1as no coinciden! report_err_connect=\u00a1Error al conectar con la base de datos de informes! test_alert_exit=EXIT: En este punto el programa se cerrar\u00eda. test_alert_jump_to=En este punto se producir\u00eda un salto al proyecto: ftype_image=Imagen ftype_audio=Sonido digital ftype_midi=Archivo MIDI ftype_xml=Archivo XML ftype_anim=Animaci\u00f3n ftype_video=Video digital ftype_font=Tipo de letra TrueType ftype_jclic=Proyecto JClic ftype_inst=Script de instalaci\u00f3n de proyectos JClic ftype_unknown=Desconocido ftype_animated=animada filefilter_fonts=Tipos de letra (*.ttf) editor_moveUp_keys=R#38 editor_moveDown_keys=B#40 filefilter_all_html=Documentos HTML (*.htm, *.html) about_creditsDoc=about/credits_es.html about_licenseDoc=about/license_es.html about_sponsorsCaption=Con el apoyo de: about_window_systemInfo=Informaci\u00f3n del sistema about_window_projectInfo=Informaci\u00f3n del proyecto actual about_window_reportInfo=Resultados de la sesi\u00f3n actual about_otherCreditsCaption=Este producto incluye software desarrollado por: msg_saving_project=Guardando el proyecto... filefilter_text=Archivos de texto (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Versi\u00f3n en espa\u00f1ol, por el Equipo Clic #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Este programa es software libre; usted puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU (GPL), tal y como está publicada por la Free Software Foundation; ya sea la versión 2 de la Licencia, o (a su elección) cualquier versión posterior.
 
Este programa se distribuye con la intención de ser útil, pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de USABILIDAD O UTILIDAD PARA UN FIN PARTICULAR. Vea la Licencia Pública General GNU para más detalles. levels_INF=Infantil (3-6) levels_PRI=Primaria (6-12) levels_SEC=Secundaria (12-16) levels_BTX=Bachillerato/FP (16-18) levels_other=Otros niveles: areas_lleng=Lenguas areas_mat=Matem\u00e1ticas areas_soc=Ciencias sociales areas_exp=Ciencias experimentales areas_mus=M\u00fasica areas_vip=Pl\u00e1stica y visual areas_ef=Educaci\u00f3n f\u00edsica areas_tec=Tecnolog\u00eda areas_div=Diversos areas_other=Otras \u00e1reas: src/core/edu/xtec/resources/messages/JClicMessages_eu.properties000066400000000000000000000212411335566474600254440ustar00rootroot00000000000000#JClic main messages label_time=denbora label_actions=saiakerak label_score=puntuazioa Skin = Itxura action_next_caption=Hurrengoa action_next_tooltip=Hurrengo jarduera action_prev_caption=Aurrekoa action_prev_tooltip=Aurreko jarduera action_reset_caption=Hasi berriro action_reset_tooltip=Jarduera berriro hasi action_info_caption=Informazioa about_window_lb_project=Proiektua about_window_lb_languages=hizkuntzak about_window_lb_language=hizkuntza about_window_close_button=Itzuli about_window_caption=Honi buruz action_about_tooltip=Erabiltzailearen txostenak about_window_lb_report=Txostena about_window_browser_button=Nabigatzailean ikusi report_no_activities=Ez da jardueren txostenik! report_system_standard=Txostena ez dago ezein datu-basetan report_lb_time=Denbora msg_error_loading_sequence=Errorea sekuentzia kargatzean media_qt_error_initializing=Errorea Quick Time abiaraztean! media_check_url=messages/checkmedia_eu.html filesystem_openURL=Ireki URL-a... filesystem_openFile=Ireki fitxategia... filesystem_enterURL=Mesedez, sartu bilatu behar den baliabidearen URL-aa msg_error_executing_external=Errorea komandoa exekutatzean editor_moveDown_tooltip=Eraman behera aukeratutako elementua editor_moveUp_tooltip=Mugitu gora aukeratutako elementua editor_moveDown=Eraman behera editor_moveUp=Eraman gora filefilter_all_images=Irudi-fitxategiak (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG irudiak filefilter_jpg=JPG irudiak filefilter_gif=GIF irudiak filesystem_saveURLerror=UR-Letan oinarritutako fitxategiak irakurtzeko dira bakarrik filefilter_all_clic=Clic 3.0 paketeak (*.pac, *.pcc) filefilter_all=Fitxategi guztiak filefilter_all_jclic_clic=JClic eta Clic 3.0 proiektuak (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic proiektuak (*.jclic, *.jclic.zip) filefilter_pcc=Konpaktatutako Clic 3.0 paketeak (*.pcc) filefilter_pac=Clic 3.0 pakete irekiak (*.pac) filefilter_jclic_zip=Konprimitutako JClic proiektuak (*.jclic.zip) filefilter_jclic=JClic proiektuak (*.jclic) about_window_lb_mediaSystem=Multimedia-sistema about_window_lb_level=Maila about_window_lb_area=Eremua report_num_actions=Burututako ekintzak: report_project=Proiektua: report_lb_totals=Guztira: report_num_projects=Proiektuak report_session=Saioa: msg_warn_no_exec_in_applets=Segurtasun-arazoak direla-eta, ezgaituta dago kanpoko programen exekutatzea JClic aplikazioetan msg_error_starting_activity=Errorea jarduera hastean! msg_error_loading_project=Errorea proiektua kargatzean msg_error_playing_media=Errorea media erreproduzitzean! msg_activity_finished=Jarduera amaitu da msg_playing_media=Media erreproduzitzen msg_activity_running=Jarduera martxan msg_activity_ready=Jarduera prest msg_initializing=Abiarazten... msg_preparing_media=Media prestatzen msg_error_loading_activity=Errorea jarduera kargatzean msg_loading_activity=Jarduera kargatzen msg_loading_project=Proiektua kargatzen msg_ready=Prest err_reading_data=Errorea fitxategia kargatzean err_file_save=Errorea fitxategia gordetzean err_file_open=Errorea fitxategia zabaltzean! report_started=Saio-hasiera: report_lb_score=Puntuazioa report_lb_actions=Ekintzak report_lb_solved=Ados report_lb_activity=Jarduera report_lb_sequence=Sekuentzia report_global_score=Puntuazio orokorra: report_total_time=Jardueretan emandako denbora guztira: report_num_activities_solved=Jarduera zuzenak: report_num_activities=Burututako ekinzak: report_num_sequences=Sekuentziak: report_system=Txosten-sistema: report_user=Erabiltzailea: report_not_finished=Bukatu gabeko jarduera action_info_tooltip=Informazio gehigarria action_help_caption=Laguntza action_help_tooltip=Laguntza jarduera honetarako action_audio_caption=Soinuak action_audio_tooltip=Soinuak gaitu/desgaitu about_window_lb_system=Sistema about_window_lb_total_mem=Memoria guztira about_window_lb_free_mem=Memoria libre about_window_lb_java_home=Java-ren kokapena about_window_lb_java_vm=Java makina birtuala about_window_lb_java_version=Java bertsioa about_window_lb_os=Sistema eragilea about_window_lb_version=Bertsioa about_window_lb_descriptors=Deskribatzaileak about_window_lb_description=Deskribapena about_window_lb_history=Historia about_window_lb_organizations=Erakundeak about_window_lb_organization=Erakundea about_window_lb_authors=Egileak about_window_lb_author=Egilea about_window_lb_activity=Jarduera help_window_close_button=Itzuli jarduerara help_window_caption=Laguntza-leihoa action_about_caption=Txostenak action_about_keys=RR action_audio_keys=HH action_help_keys=OO action_info_keys=II action_next_keys=U* action_prev_keys=A* action_reset_keys=B* filefilter_install=JClic proiektuen instalatzaileak (*.jclic.inst) report_err_no_users=Ez dago definitutako erabiltzailerik txostenen datu-basean! report_err_no_users_in_group=Ez dago talde honetarako definitutako erabiltzailerik txostenen datu-basean! report_new_user=Erabiltzaile berria... report_new_user_tooltip=Erabiltzaile berria sortu txostenen datu-basean report_err_creating_user=Errorea erabiltzaile berria sortzean! report_select_user=Txostenen datu-baserako erabiltzaile-identifikazioa report_userlist_title=Mesedez, aukera ezazu zeure izena: report_ident_user=Erabiltzailearen identifikazioa report_name_prompt=Izena: report_id_prompt=Erabiltzaile-izena: report_pw_prompt=Pasahitza: report_pw_prompt_confirm=Pasahitza berretsi: report_new_user_data=Erabiltzaile berria sortu: report_err_bad_data=Datuak ez dira zuzenak! report_generic_group_name=Generikoa report_new_group=Talde berria sortu... report_err_creating_group=Errorea talde berria sortzean! report_grouplist_title=Mesedez, aukera ezazu zeure taldea: report_new_group_data=Erabiltzaile-talde berria sortu: report_err_invalid_user=Erabiltzailearen ID-a falta da edo pasahitza ez da zuzena. report_user_has_pwd=Erabiltzaile honen kontua pasahitz batek babesten du. report_err_init=Errorea txosten sistema abiaraztean. report_not_connected=konektatu gabe report_err_creating=Errorea txosten-agentea sortzean action_return_caption=Itzuli action_return_tooltip=Itzuli azken menura action_return_keys=I* filefilter_all_sounds=Soinuak (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI fitxategiak (*.mid) filefilter_all_video=Bideo-fitxategiak (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 fitxategiak (*.swf) filefilter_skins=Itxurak (*.xml) filefilter_all_media=Media fitxategi guztiak filesystem_copyToRoot_1=Fitxategia filesystem_copyToRoot_2=oraingo proiektuaren direktoriotik kanpo dago. filesystem_copyToRoot_3=Ez da gomendagarria fitxategi guztiak direktorio berean edukitzea. filesystem_copyToRoot_4=Aukeratutako fitxategia proiektuaren direktoriora kopiatu nahi al duzu? filesystem_copyFile=Fitxategia kopiatzen msg_loading=Kargatzen report_err_bad_id=Okerreko identifikatzailea! report_err_duplicate_id=Identifikatzaile hori dagoeneko badago datu-basean! report_err_bad_name=Okerreko izena! report_err_bad_pw=Pasahitzak ez datoz bat! report_err_connect=Errorea txostenen datu-basearekin konektatzean! test_alert_exit=IRTEN: Hemendik aurrera, programatik irten egingo zara. test_alert_jump_to=Hemen programak ondorengo proiektu honetara egingo du jauzi: ftype_image=Irudia ftype_audio=Audio digitala ftype_midi=MIDI fitxategia ftype_xml=XML fitxategia ftype_anim=Animazioa ftype_video=Bideo digitala ftype_font=TrueType letra-tipoa ftype_jclic=JClic proiektua ftype_inst=JClic proiektua instalatzeko script-a ftype_unknown=Ezezaguna ftype_animated=animatua filefilter_fonts=Fonts (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML dokumentuak (*.htm, *.html) about_creditsDoc=honi buruz/kredituak.html about_licenseDoc=honi buruz/lizentzia.html about_sponsorsCaption=Honen laguntzarekin: about_window_systemInfo=Sistemaren informazioa about_window_projectInfo=Oraingo proiektuaren informazioa about_window_reportInfo=Oraingo saioaren emaitzak about_otherCreditsCaption=Produktu honek ondorengoak/ek garatutako softwarea du: msg_saving_project=Proiektua gordetzen... filefilter_text=Testu-fitxategiak (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Itzultzaileak: Abel Camacho, Pedro Lonbide #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Programa hau software librea da; zabaldu edota aldatu egin dezakezu Free Software Foundation-ek argitaratutako GNU General Public License-n ezarritakoaren arabera; lizentziaren edozein 2. bertsio edo (zure aukera) ondorengo bertsioren bat.
 
Programa hau erabilgarri izango delakoan banatzen da, baina INONGO BERMERIK GABE; ezta KOMERTZIALIZAZIO edo HELBURU JAKIN BATERAKO EGOKITASUNerako berme inpliziturik gabe. Begiratu GNU General Public License zehaztasun gehiagorako. src/core/edu/xtec/resources/messages/JClicMessages_fr.java000066400000000000000000000001121335566474600241610ustar00rootroot00000000000000package edu.xtec.resources.messages; public class JClicMessages_fr {} src/core/edu/xtec/resources/messages/JClicMessages_fr.properties000066400000000000000000000224611335566474600254470ustar00rootroot00000000000000#JClic main messages label_time=temps label_actions=essais label_score=r\u00E9sultat Skin = Th\u00E8me action_next_caption=Suivant action_next_tooltip=Activit\u00E9 suivante action_prev_caption=Pr\u00E9c\u00E9dent action_prev_tooltip=Activit\u00E9 pr\u00E9c\u00E9dente action_reset_caption=Recommencer action_reset_tooltip=Recommencer l'activit\u00E9 action_info_caption=Information about_window_lb_project=Projet about_window_lb_languages=langages about_window_lb_language=langage about_window_close_button=Retour about_window_caption=A propos de action_about_tooltip=Rapports utilisateur about_window_lb_report=Rapport about_window_browser_button=Voir dans l'explorateur report_no_activities=Pas d'activit\u00E9s rapport\u00E9es\\! report_system_standard=Le rapport n'est enregistr\u00E9 dans aucune base de donn\u00E9es report_lb_time=Temps msg_error_loading_sequence=Erreur au chargement de la s\u00E9quence media_qt_error_initializing=Erreur \u00E0 l'initialisation de QuickTime\\! media_check_url=messages/checkmedia_fr.html filesystem_openURL=Ouvrir URL... filesystem_openFile=Ouvrir fichier... filesystem_enterURL=Entrez l'URL de la ressource \u00E0 charger. msg_error_executing_external=Erreur \u00E0 l'ex\u00E9cution de la commande: editor_moveDown_tooltip=D\u00E9placer l'\u00E9l\u00E9ment s\u00E9lectionn\u00E9 vers le bas editor_moveUp_tooltip=D\u00E9placer l'\u00E9l\u00E9ment s\u00E9lectionn\u00E9 vers le haut editor_moveDown=D\u00E9placer vers le bas editor_moveUp=D\u00E9placer vers le haut filefilter_all_images=Fichiers images (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG images filefilter_jpg=JPG images filefilter_gif=GIF images filesystem_saveURLerror=Les fichiers URL-based sont en lecture seule. filefilter_all_clic=Clic 3.0 packages (*.pac, *.pcc) filefilter_all=Tous les fichiers filefilter_all_jclic_clic=Projets JClic et Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=Projets JClic (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 compact compact\u00E9s (*.pcc) filefilter_pac=Clic 3.0 packages ouverts (*.pac) filefilter_jclic_zip=Projets JClic compress\u00E9s (*.jclic.zip) filefilter_jclic=Projets JClic (*.jclic) about_window_lb_mediaSystem=Syst\u00E8me multimedia about_window_lb_level=Niveau about_window_lb_area=Domaine report_num_actions=Actions faites: report_project=Projet: report_lb_totals=Total: report_num_projects=Projets: report_session=Session: msg_warn_no_exec_in_applets=Pour des raisons de s\u00E9curit\u00E9, l'ex\u00E9cution de programmes externes est d\u00E9sassembl\u00E9e dans JClic applet. msg_error_starting_activity=Erreur au d\u00E9mmarrage de l'activit\u00E9\\! msg_error_loading_project=Erreur de chargement du projet msg_error_playing_media=Erreur de lecture du m\u00E9dia\\! msg_activity_finished=Activit\u00E9 termin\u00E9e\\! msg_playing_media=Lecture du m\u00E9dia msg_activity_running=Activit\u00E9 en cours msg_activity_ready=Activit\u00E9 pr\u00EAte msg_initializing=Initialisation... msg_preparing_media=Pr\u00E9paration du m\u00E9dia msg_error_loading_activity=Erreur au chargement de l'activit\u00E9 msg_loading_activity=Chargement de l'activit\u00E9 msg_loading_project=Chargement du projet... msg_ready=Pr\u00EAt err_reading_data=Erreur de chargement du fichier err_file_save=Erreur de sauvegarde du fichier\\! err_file_open=Erreur \u00E0 l'ouverture du fichier\\! report_started=Session d\u00E9marr\u00E9e: report_lb_score=Score report_lb_actions=Actions report_lb_solved=Ok report_lb_activity=Activit\u00E9 report_lb_sequence=S\u00E9quence report_global_score=Score global: report_total_time=Temps total sur l'activit\u00E9: report_num_activities_solved=Activit\u00E9s ok: report_num_activities=Activit\u00E9s faites: report_num_sequences=S\u00E9quences: report_system=Report syst\u00E8me: report_user=Utilisateur: report_not_finished=Activit\u00E9 non termin\u00E9e action_info_tooltip=Information additionnelle action_help_caption=Aide action_help_tooltip=Aide \u00E0 propos de cette activit\u00E9 action_audio_caption=Sons action_audio_tooltip=Activer/D\u00E9sactiver sons about_window_lb_system=Syst\u00E8me about_window_lb_total_mem=M\u00E9moire totale about_window_lb_free_mem=M\u00E9moire libre about_window_lb_java_home=Java home about_window_lb_java_vm=Java virtual machine about_window_lb_java_version=Java version about_window_lb_os=Syst\u00E8me d'exploitation about_window_lb_version=Version about_window_lb_descriptors=Descripteurs about_window_lb_description=Description about_window_lb_history=Historique about_window_lb_organizations=Organisations about_window_lb_organization=Organisation about_window_lb_authors=Auteurs about_window_lb_author=Auteur about_window_lb_activity=Activit\u00E9 help_window_close_button=Retour \u00E0 l'activit\u00E9 help_window_caption=Fen\u00EAtre d'aide action_about_caption=Rapports action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=Installateurs de projets JClic (*.jclic.inst) report_err_no_users=Aucun utilisateur n'est d\u00E9fini dans la base de rapports\\! report_err_no_users_in_group=Aucun utiliateur n'est d\u00E9fini pour ce groupe dans la base de donn\u00E9es\\! report_new_user=Nouvel utiliateur... report_new_user_tooltip=Cr\u00E9er un nouvel utilisateur dans la base de rapports report_err_creating_user=Erreur \u00E0 la cr\u00E9ation d'un nouvel utilisateur\\! report_select_user=Identification de l'utilisateur pour la base de rapports report_userlist_title=S\u00E9lectionnez votre nom: report_ident_user=Identification de l'utilisateur report_name_prompt=Nom: report_id_prompt=Login: report_pw_prompt=Mot de passe: report_pw_prompt_confirm=Confirmer mot de passe: report_new_user_data=Cr\u00E9ation d'un nouvel utilisateur: report_err_bad_data=Donn\u00E9e incorrecte\\! report_generic_group_name=G\u00E9n\u00E9rique report_new_group=Cr\u00E9er un nouveau groupe... report_err_creating_group=Erreur \u00E0 la cr\u00E9ation d'un nouveau groupe\\! report_grouplist_title=S\u00E9lectionnez votre groupe: report_new_group_data=Cr\u00E9ation d'un nouveau groupe d'utilisateurs: report_err_invalid_user=ID utilisateur absente ou mot de passe incorrect. report_user_has_pwd=Ce compte est prot\u00E9g\u00E9 par un mot de passe. report_err_init=Erreur \u00E0 l'initialisation du syst\u00E8me de rapports. report_not_connected=non connect\u00E9 report_err_creating=Erreur \u00E0 la cr\u00E9ation d'un agent de rapports action_return_caption=Retour action_return_tooltip=Retour au dernier menu action_return_keys=T* filefilter_all_sounds=Sons (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=Fichiers MIDI (*.mid) filefilter_all_video=Fichiers Video (*.avi, *.mov, *.mpeg) filefilter_all_anim=Fichiers Flash 2.0 (*.swf) filefilter_skins=Habillages (*.xml) filefilter_all_media=Tous les fichiers m\u00E9dia filesystem_copyToRoot_1=Le fichier filesystem_copyToRoot_2=est en dehors du dossier du projet courant. filesystem_copyToRoot_3=Il est conseill\u00E9 de placer tous les fichiers dans le m\u00EAme dossier. filesystem_copyToRoot_4=Voulez-vous copier les fichiers s\u00E9lectionn\u00E9s dans le dossier du projets ? filesystem_copyFile=Copie de fichier msg_loading=Chargement report_err_bad_id=Mauvais identifiant\\! report_err_duplicate_id=Cet identifiant existe d\u00E9j\u00E0 dans la base de donn\u00E9es\\! report_err_bad_name=Mauvais nom\\! report_err_bad_pw=Les mots de passe ne fonctionnent pas\\! report_err_connect=Erreur de connexion \u00E0 la base de rapports\\! test_alert_exit=QUITTER: A ce point, le programme se termine. test_alert_jump_to=A ce point le programme sautera vers le projet: ftype_image=Image ftype_audio=Digital audio ftype_midi=Fichier MIDI ftype_xml=Fichier XML ftype_anim=Animation ftype_video=Digital video ftype_font=Type de police TrueType ftype_jclic=Projet JClic ftype_inst=Script d'installateur de projet JClic ftype_unknown=Inconnu ftype_animated=anim\u00E9 filefilter_fonts=Styles (*.ttf) editor_moveUp_keys=U\\#38 editor_moveDown_keys=W\\#40 filefilter_all_html=HTML documents (*.htm, *.html) about_creditsDoc=about/credits_fr.html about_licenseDoc=about/license_fr.html about_sponsorsCaption=Avec le support de: about_window_systemInfo=Syst\u00E8me information about_window_projectInfo=Info projet courant about_window_reportInfo=R\u00E9sultats de session courante about_otherCreditsCaption=Ce produit inclus les logiciels d\u00E9velopp\u00E9s par: msg_saving_project=Enregistrement du projet... filefilter_text=Fichiers textes(*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Version Fran\u00E7aise: Gilles Parenna et Ahmet Yavuz #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier conform\u00E9ment aux dispositions de la Licence Publique G\u00E9n\u00E9rale GNU, telle que publi\u00E9e par la Free Software Foundation ; version 2 de la licence, ou encore (\u00E0 votre choix) toute version ult\u00E9rieure.
 
Ce programme est distribu\u00E9 dans l\u2019espoir qu\u2019il sera utile, mais SANS AUCUNE GARANTIE ; sans m\u00EAme la garantie implicite de COMMERCIALISATION ou D\u2019ADAPTATION A UN OBJET PARTICULIER. Pour plus de d\u00E9tails, voir la Licence Publique G\u00E9n\u00E9rale GNU. src/core/edu/xtec/resources/messages/JClicMessages_gl.java000066400000000000000000000001121335566474600241540ustar00rootroot00000000000000package edu.xtec.resources.messages; public class JClicMessages_gl {} src/core/edu/xtec/resources/messages/JClicMessages_gl.properties000066400000000000000000000223751335566474600254460ustar00rootroot00000000000000#JClic main messages label_time=hora label_actions=intentos label_score=acertos Skin = Tema visual action_next_caption=Seguinte action_next_tooltip=Seguinte actividade action_prev_caption=Anterior action_prev_tooltip=Anterior actividade action_reset_caption=Reiniciar action_reset_tooltip=Reiniciar a actividade action_info_caption=Informaci\u00F3n about_window_lb_project=Proxecto about_window_lb_languages=Idiomas about_window_lb_language=idioma about_window_close_button=Volver about_window_caption=Sobre action_about_tooltip=Informes de usuario about_window_lb_report=Informe about_window_browser_button=Ver no navegador report_no_activities=Non hai informada ningunha actividade! report_system_standard=O informe non est\u00E1 rexistrado en ningunha base de datos report_lb_time=Hora msg_error_loading_sequence=Produciuse un erro ao cargar a secuencia media_qt_error_initializing=Produciuse un erro ao inicializar QuickTime! media_check_url=messages/checkmedia_gl.html filesystem_openURL=Abrir un URL... filesystem_openFile=Abrir ficheiro... filesystem_enterURL=Escriba o URL do recurso ao que desexa acceder. msg_error_executing_external=Produciuse un erro ao executar a orde: editor_moveDown_tooltip=Mover o elemento seleccionado cara abaixo editor_moveUp_tooltip=Mover o elemento seleccionado cara arriba editor_moveDown=Mover cara abaixo editor_moveUp=Mover cara arriba filefilter_all_images=Imaxes (*.gif, *.jpg, *.png) filefilter_png=Imaxes PNG filefilter_jpg=Imaxes JPG filefilter_gif=Imaxes GIF filesystem_saveURLerror=Os ficheiros baseados nun URL son s\u00F3 de lectura. filefilter_all_clic=Paquetes Clic 3.0 (*.pac, *.pcc) filefilter_all=Todos os ficheiros filefilter_all_jclic_clic=Proxectos JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=Proxectos JClic (*.jclic, *.jclic.zip) filefilter_pcc=Paquetes compactos Clic 3.0 (*.pcc) filefilter_pac=Paquetes abertos Clic 3.0 (*.pac) filefilter_jclic_zip=Proxectos JClic comprimidos (*.jclic.zip) filefilter_jclic=Proxectos JClic (*.jclic) about_window_lb_mediaSystem=Sistema multimedia about_window_lb_level=Nivel about_window_lb_area=\u00C1rea report_num_actions=Acci\u00F3ns efectuadas: report_project=Proxecto: report_lb_totals=Total: report_num_projects=Proxectos: report_session=Sesi\u00F3n: msg_warn_no_exec_in_applets=Por raz\u00F3ns de seguridade a invocaci\u00F3n a programas externos est\u00E1 desactivada nos miniaplicativos JClic msg_error_starting_activity=Erro ao iniciar a actividade! msg_error_loading_project=Produciuse un erro ao cargar o proxecto msg_error_playing_media=Produciuse un erro no recurso multimedia! msg_activity_finished=Actividade rematada! msg_playing_media=Reproducindo multimedia msg_activity_running=Actividade en execuci\u00F3n msg_activity_ready=Actividade preparada msg_initializing=Inicializando... msg_preparing_media=Preparando multimedia msg_error_loading_activity=Produciuse un erro ao cargar a actividade msg_loading_activity=Abrindo actividade msg_loading_project=Abrindo proxecto... msg_ready=Listo err_reading_data=Produciuse un erro ao cargar o ficheiro err_file_save=Produciuse un erro ao gardar o ficheiro! err_file_open=Produciuse un erro ao abrir o ficheiro! report_started=Inicio de sesi\u00F3n: report_lb_score=Puntuaci\u00F3n report_lb_actions=Acci\u00F3ns report_lb_solved=Correcta report_lb_activity=Actividade report_lb_sequence=Secuencia report_global_score=Puntuaci\u00F3n global: report_total_time=Tempo total nas actividades: report_num_activities_solved=Actividades correctas: report_num_activities=Actividades realizadas: report_num_sequences=Secuencias: report_system=Sistema de informes: report_user=Usuario: report_not_finished=Actividade a\u00EDnda non rematada action_info_tooltip=Informaci\u00F3n adicional action_help_caption=Axuda action_help_tooltip=Axuda sobre a actividade action_audio_caption=Sons action_audio_tooltip=Activar/desactivar os sons about_window_lb_system=Sistema about_window_lb_total_mem=Memoria total about_window_lb_free_mem=Memoria libre about_window_lb_java_home=Situaci\u00F3n de Java about_window_lb_java_vm=M\u00E1quina virtual Java about_window_lb_java_version=Versi\u00F3n de Java about_window_lb_os=Sistema operativo about_window_lb_version=Versi\u00F3n about_window_lb_descriptors=Descritores about_window_lb_description=Descrici\u00F3n about_window_lb_history=Revisi\u00F3ns about_window_lb_organizations=Organizaci\u00F3ns about_window_lb_organization=Organizaci\u00F3n about_window_lb_authors=Autores/as about_window_lb_author=Autor/a about_window_lb_activity=Actividade help_window_close_button=Volver \u00E1 actividade help_window_caption=Xanela de axuda action_about_caption=Informes action_about_keys=II action_audio_keys=OS action_help_keys=YY action_info_keys=NN action_next_keys=S* action_prev_keys=A* action_reset_keys=R* filefilter_install=Instaladores de proxectos JClic (*.jclic.inst) report_err_no_users=Non hai ning\u00FAn usuario definido na base de datos de informes. report_err_no_users_in_group=Non hai ning\u00FAn usuario definido para este grupo na base de datos de informes! report_new_user=Novo usuario... report_new_user_tooltip=Crear un novo usuario na base de datos de informes report_err_creating_user=Produciuse un erro ao crear o novo usuario! report_select_user=Identificaci\u00F3n de usuario para a base de datos de informes report_userlist_title=Seleccione o seu nome: report_ident_user=Identificaci\u00F3n de usuario report_name_prompt=Nome: report_id_prompt=Identificador: report_pw_prompt=Contrasinal: report_pw_prompt_confirm=Confirmar contrasinal: report_new_user_data=Creaci\u00F3n dun novo usuario: report_err_bad_data=Datos incorrectos! report_generic_group_name=Xen\u00E9rico report_new_group=Crear un novo grupo... report_err_creating_group=Produciuse un erro ao crear o novo grupo! report_grouplist_title=Seleccione o seu grupo: report_new_group_data=Creaci\u00F3n dun novo grupo de usuarios: report_err_invalid_user=Usuario inexistente ou contrasinal incorrecto. report_user_has_pwd=A conta deste usuario est\u00E1 protexida por contrasinal: report_err_init=Produciuse un erro ao inicializar o sistema de informes. report_not_connected=non conectado report_err_creating=Produciuse un erro ao crear o axente de informes action_return_caption=Volver action_return_tooltip=Volver ao \u00FAltimo men\u00FA action_return_keys=V* filefilter_all_sounds=Sons (*.wav, *.mp3, *.au, *.aiff) filefilter_midi=Ficheiros MIDI (*.mid) filefilter_all_video=Ficheiros de v\u00EDdeo (*.avi, *.mov, *.mpeg) filefilter_all_anim=Ficheiros Flash 2.0 (*.swf) filefilter_skins=Temas visuais (*.xml) filefilter_all_media=Todos os ficheiros multinm\u00E9dia filesystem_copyToRoot_1=O ficheiro filesystem_copyToRoot_2=atopase nun cartafol distinto ao do proxecto actual. filesystem_copyToRoot_3=Recom\u00E9ndase ter todos os ficheiros no mesmo cartafol. filesystem_copyToRoot_4=Desexa copiar o ficheiro seleccionado ao cartafol do proxecto? filesystem_copyFile=Copiando o ficheiro msg_loading=Cargando report_err_bad_id=Identificador incorrecto! report_err_duplicate_id=Este identificador xa existe na base de datos! report_err_bad_name=Nome incorrecto! report_err_bad_pw=Os contrsinais non coinciden! report_err_connect=Produciuse un erro ao conectar coa base de datos de informes! test_alert_exit=EXIT: Neste punto o programa pechar\u00EDase. test_alert_jump_to=Neste punto producir\u00EDase un salto ao proxecto: ftype_image=Imaxe ftype_audio=Son dixital ftype_midi=Ficheiro MIDI ftype_xml=Ficheiro XML ftype_anim=Animaci\u00F3n ftype_video=V\u00EDdeo dixital ftype_font=Tipo de letra TrueType ftype_jclic=Proxecto JClic ftype_inst=Script de instalaci\u00F3n de proxectos JClic ftype_unknown=Desco\u00F1ecido ftype_animated=animada filefilter_fonts=Tipos de letra (*.ttf) editor_moveUp_keys=R#38 editor_moveDown_keys=B#40 filefilter_all_html=Documentos HTML (*.htm, *.html) about_creditsDoc=about/credits_gl.html about_licenseDoc=about/license_gl.html about_sponsorsCaption=Coa axuda de: about_window_systemInfo=Informaci\u00F3n do sistema about_window_projectInfo=Informaci\u00F3n do proxecto actual about_window_reportInfo=Resultados da sesi\u00F3n actual about_otherCreditsCaption=Este produto incl\u00FAe software desenvolvido por: msg_saving_project=Gardando o proxecto... filefilter_text=Ficheiros de texto (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=A traduci\u00F3n ao galego foi realizada por Edugaliza e por Proxecto Trasno #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Este programa \u00E9 software libre; pode distribu\u00EDlo e/ou modificalo baixo os termos da Licenza P\u00FAblica Xeral de GNU (GNU General Public License) tal e como \u00E9 publicada pola Free Software Foundation, ben sexa a versi\u00F3n 2 da licenza ou (\u00E1 s\u00FAa escolla) calquera outra versi\u00F3n posterior.
 
Este programa distrib\u00FAese coa esperanza de que sexa \u00FAtil, pero SEN NINGUNHA GARANT\u00CDA; mesmo sen as garant\u00EDas impl\u00EDcitas de COMERCIABILIZACI\u00D3N ou IDONEIDADE PARA UN PROP\u00D3SITO PARTICULAR. Para obter m\u00E1is informaci\u00F3n, consulte a Licenza P\u00FAblica Xeral de GNU. src/core/edu/xtec/resources/messages/JClicMessages_he.properties000066400000000000000000000357341335566474600254430ustar00rootroot00000000000000#JClic main messages label_time=\u05D6\u05DE\u05DF label_actions=\u05E0\u05E1\u05D9\u05D5\u05E0\u05D5\u05EA label_score=\u05E0\u05D9\u05E7\u05D5\u05D3 Skin = \u05DE\u05E2\u05D8\u05E4\u05EA action_next_caption=\u05D4\u05D1\u05D0 action_next_tooltip=\u05D4\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D4\u05D1\u05D0\u05D4 action_prev_caption=\u05D4\u05E7\u05D5\u05D3\u05DD action_prev_tooltip=\u05D4\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D4\u05E7\u05D5\u05D3\u05DE\u05EA action_reset_caption=\u05D4\u05EA\u05D7\u05DC \u05DE\u05D7\u05D3\u05E9 action_reset_tooltip=\u05D4\u05EA\u05D7\u05DC \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05DE\u05D7\u05D3\u05E9 action_info_caption=\u05DE\u05D9\u05D3\u05E2 about_window_lb_project=\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8 about_window_lb_languages=\u05E9\u05E4\u05D5\u05EA about_window_lb_language=\u05E9\u05E4\u05D4 about_window_close_button=Return about_window_caption=\u05D0\u05D5\u05D3\u05D5\u05EA action_about_tooltip=\u05D3\u05D5\u05D7\u05D5\u05EA \u05DE\u05E9\u05EA\u05DE\u05E9 about_window_lb_report=\u05D3\u05D5\u05D7 about_window_browser_button=\u05D4\u05E6\u05D2 \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF report_no_activities=\u05DC\u05D0 \u05D3\u05D5\u05D5\u05D7\u05D5 \u05E4\u05E2\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA! report_system_standard=\u05D4\u05D3\u05D9\u05D5\u05D5\u05D7 \u05D0\u05D9\u05E0\u05D5 \u05E8\u05E9\u05D5\u05DD \u05D1\u05DE\u05E1\u05D3 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DB\u05DC\u05E9\u05D4\u05D5 report_lb_time=\u05E9\u05E2\u05D4 msg_error_loading_sequence=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05D8\u05E2\u05D9\u05E0\u05EA \u05D4\u05E8\u05E6\u05E3 media_qt_error_initializing=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05D4\u05E4\u05E2\u05DC\u05EA QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=\u05E4\u05EA\u05D7 \u05E7\u05D9\u05E9\u05D5\u05E8... filesystem_openFile=\u05E4\u05EA\u05D7 \u05E7\u05D5\u05D1\u05E5... filesystem_enterURL=\u05E0\u05D0 \u05D4\u05D6\u05DF \u05D0\u05EA \u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05DE\u05E9\u05D0\u05D1 \u05DC\u05D8\u05E2\u05D9\u05E0\u05D4 msg_error_executing_external=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05D4\u05E4\u05E2\u05DC\u05EA \u05D4\u05E4\u05E7\u05D5\u05D3\u05D4: editor_moveDown_tooltip=\u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05D4\u05E8\u05DB\u05D9\u05D1 \u05D4\u05E0\u05D1\u05D7\u05E8 \u05DE\u05D8\u05D4 editor_moveUp_tooltip=\u05D4\u05E2\u05D1\u05E8 \u05D0\u05EA \u05D4\u05E8\u05DB\u05D9\u05D1 \u05D4\u05E0\u05D1\u05D7\u05E8 \u05DE\u05E2\u05DC\u05D4 editor_moveDown=\u05D4\u05E2\u05D1\u05E8 \u05DE\u05D8\u05D4 editor_moveUp=\u05D4\u05E2\u05D1\u05E8 \u05DE\u05E2\u05DC\u05D4 filefilter_all_images=\u05E7\u05D1\u05E6\u05D9 \u05EA\u05DE\u05D5\u05E0\u05D4 (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA PNG filefilter_jpg=\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA JPG filefilter_gif=\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA GIF filesystem_saveURLerror=\u05E7\u05D1\u05E6\u05D9\u05DD \u05DE\u05D1\u05D5\u05E1\u05E1\u05D9 \u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05D9\u05E0\u05DD \u05DC\u05E7\u05E8\u05D9\u05D0\u05D4 \u05D1\u05DC\u05D1\u05D3. filefilter_all_clic=\u05D7\u05D1\u05D9\u05DC\u05D5\u05EA Clic 3.0 (*.pac, *.pcc) filefilter_all=\u05DB\u05DC \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD filefilter_all_jclic_clic=\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8\u05D9\u05DD \u05E9\u05DC JClic \u05D5-Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8\u05D9\u05DD \u05E9\u05DC JClic (*.jclic, *.jclic.zip) filefilter_pcc=\u05D7\u05D1\u05D9\u05DC\u05D5\u05EA \u05D7\u05E1\u05DB\u05D5\u05E0\u05D9\u05D5\u05EA \u05E9\u05DC Clic 3.0 (*.pcc) filefilter_pac=\u05D7\u05D1\u05D9\u05DC\u05D5\u05EA \u05E4\u05EA\u05D5\u05D7\u05D5\u05EA \u05E9\u05DC Clic 3.0 (*.pac) filefilter_jclic_zip=\u05D7\u05D1\u05D9\u05DC\u05D5\u05EA \u05D3\u05D7\u05D5\u05E1\u05D5\u05EA \u05E9\u05DC JClic (*.jclic.zip) filefilter_jclic=\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8\u05D9\u05DD \u05E9\u05DC JClic (*.jclic) about_window_lb_mediaSystem=\u05DE\u05E2\u05E8\u05DB\u05EA \u05DE\u05D5\u05DC\u05D8\u05D9\u05DE\u05D3\u05D9\u05D4 about_window_lb_level=\u05E8\u05DE\u05D4 about_window_lb_area=\u05D0\u05D6\u05D5\u05E8 report_num_actions=\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05E9\u05D1\u05D5\u05E6\u05E2\u05D5: report_project=\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8: report_lb_totals=\u05E1\u05DA \u05D4\u05DB\u05DC: report_num_projects=\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8\u05D9\u05DD: report_session=\u05D4\u05E4\u05E2\u05DC\u05D4: msg_warn_no_exec_in_applets=\u05DE\u05D8\u05E2\u05DE\u05D9 \u05D1\u05D8\u05D9\u05D7\u05D5\u05EA, \u05D4\u05E4\u05E2\u05DC\u05EA \u05EA\u05D5\u05DB\u05E0\u05D5\u05EA \u05D7\u05D9\u05E6\u05D5\u05E0\u05D9\u05D5\u05EA \u05DE\u05D1\u05D5\u05D8\u05DC\u05EA \u05D1\u05D9\u05D9\u05E9\u05D5\u05DE\u05D5\u05E0\u05D9 JClic. msg_error_starting_activity=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05D4\u05EA\u05D7\u05DC\u05EA \u05D4\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA! msg_error_loading_project=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05D8\u05E2\u05D9\u05E0\u05EA \u05D4\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8 msg_error_playing_media=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05E0\u05D2\u05D9\u05E0\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4! msg_activity_finished=\u05D4\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D4\u05E1\u05EA\u05D9\u05D9\u05DE\u05D4! msg_playing_media=\u05DE\u05E0\u05D2\u05DF \u05DE\u05D3\u05D9\u05D4 msg_activity_running=\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05E9\u05E8\u05E6\u05D4 msg_activity_ready=\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05DE\u05D5\u05DB\u05E0\u05D4 msg_initializing=\u05DE\u05EA\u05D7\u05D9\u05DC... msg_preparing_media=\u05DE\u05DB\u05D9\u05DF \u05D0\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 msg_error_loading_activity=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05D8\u05E2\u05D9\u05E0\u05EA \u05D4\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA msg_loading_activity=\u05D8\u05D5\u05E2\u05DF \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA msg_loading_project=\u05D8\u05D5\u05E2\u05DF \u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8... msg_ready=\u05DE\u05D5\u05DB\u05DF err_reading_data=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05D8\u05E2\u05D9\u05E0\u05EA \u05E7\u05D5\u05D1\u05E5 err_file_save=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05E9\u05DE\u05D9\u05E8\u05EA \u05E7\u05D5\u05D1\u05E5! err_file_open=\u05E9\u05D2\u05D9\u05D0\u05D4 \u05D1\u05E4\u05EA\u05D9\u05D7\u05EA \u05E7\u05D5\u05D1\u05E5! report_started=\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D4\u05D7\u05DC\u05D4: report_lb_score=\u05E0\u05D9\u05E7\u05D5\u05D3 report_lb_actions=\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA report_lb_solved=\u05D0\u05D9\u05E9\u05D5\u05E8 report_lb_activity=\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA report_lb_sequence=\u05E8\u05E6\u05E3 report_global_score=\u05E0\u05D9\u05E7\u05D5\u05D3 \u05DB\u05DC\u05DC\u05D9: report_total_time=\u05DE\u05E9\u05DA \u05D4\u05E4\u05E2\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05E6\u05D8\u05D1\u05E8: report_num_activities_solved=\u05E4\u05E2\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05DE\u05D0\u05D5\u05E9\u05E8\u05D5\u05EA: report_num_activities=\u05E4\u05E2\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05E9\u05D4\u05D5\u05E9\u05DC\u05DE\u05D5: report_num_sequences=\u05E8\u05E6\u05E4\u05D9\u05DD: report_system=\u05DE\u05E2\u05E8\u05DB\u05EA \u05D3\u05D5\u05D7\u05D5\u05EA: report_user=\u05DE\u05E9\u05EA\u05DE\u05E9: report_not_finished=\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05DC\u05D0 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DE\u05D4 action_info_tooltip=\u05DE\u05D9\u05D3\u05E2 \u05E0\u05D5\u05E1\u05E3 action_help_caption=\u05E2\u05D6\u05E8\u05D4 action_help_tooltip=\u05E2\u05D6\u05E8\u05D4 \u05E2\u05DC \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D6\u05D5 action_audio_caption=\u05E6\u05DC\u05D9\u05DC\u05D9\u05DD action_audio_tooltip=\u05D4\u05E4\u05E2\u05DC/\u05D1\u05D8\u05DC \u05E6\u05DC\u05D9\u05DC\u05D9\u05DD about_window_lb_system=\u05DE\u05E2\u05E8\u05DB\u05EA about_window_lb_total_mem=\u05D6\u05DB\u05E8\u05D5\u05DF \u05DB\u05D5\u05DC\u05DC about_window_lb_free_mem=\u05D6\u05DB\u05E8\u05D5\u05DF \u05E4\u05E0\u05D5\u05D9 about_window_lb_java_home=\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D1\u05D9\u05EA \u05E9\u05DC \u05D2'\u05D0\u05D5\u05D5\u05D4 about_window_lb_java_vm=\u05E1\u05D1\u05D9\u05D1\u05EA \u05D2'\u05D0\u05D5\u05D5\u05D4 \u05D5\u05D9\u05E8\u05D8\u05D0\u05D5\u05DC\u05D9\u05EA about_window_lb_java_version=\u05D2\u05D9\u05E8\u05E1\u05EA \u05D4\u05D2'\u05D0\u05D5\u05D5\u05D4 about_window_lb_os=\u05DE\u05E2\u05E8\u05DB\u05EA \u05D4\u05E4\u05E2\u05DC\u05D4 about_window_lb_version=\u05D2\u05D9\u05E8\u05E1\u05D4 about_window_lb_descriptors=\u05D4\u05DE\u05EA\u05D0\u05E8\u05D9\u05DD about_window_lb_description=\u05EA\u05D9\u05D0\u05D5\u05E8 about_window_lb_history=\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4 about_window_lb_organizations=\u05D0\u05E8\u05D2\u05D5\u05E0\u05D9\u05DD about_window_lb_organization=\u05D0\u05E8\u05D2\u05D5\u05DF about_window_lb_authors=\u05DE\u05D7\u05D1\u05E8\u05D9\u05DD about_window_lb_author=\u05DE\u05D7\u05D1\u05E8 about_window_lb_activity=\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA help_window_close_button=\u05D7\u05D6\u05D5\u05E8 \u05DC\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA help_window_caption=\u05D7\u05DC\u05D5\u05DF \u05E2\u05D6\u05E8\u05D4 action_about_caption=\u05D3\u05D5\u05D7\u05D5\u05EA action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=\u05D7\u05D1\u05D9\u05DC\u05D5\u05EA \u05D4\u05EA\u05E7\u05E0\u05EA \u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8 JClic (*.jclic.inst) report_err_no_users=\u05D0\u05D9\u05DF \u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05E9\u05D4\u05D5\u05D2\u05D3\u05E8\u05D5 \u05D1\u05D1\u05E1\u05D9\u05E1 \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D3\u05D5\u05D7\u05D5\u05EA! report_err_no_users_in_group=\u05D0\u05D9\u05DF \u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05E9\u05D4\u05D5\u05D2\u05D3\u05E8\u05D5 \u05D1\u05E7\u05D1\u05D5\u05E6\u05D4 \u05D6\u05D5 \u05E9\u05DC \u05D1\u05E1\u05D9\u05E1 \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D3\u05D5\u05D7\u05D5\u05EA! report_new_user=\u05DE\u05E9\u05EA\u05DE\u05E9 \u05D7\u05D3\u05E9... report_new_user_tooltip=\u05E6\u05D5\u05E8 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D7\u05D3\u05E9 \u05D1\u05D1\u05E1\u05D9\u05E1 \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D3\u05D5\u05D7\u05D5\u05EA report_err_creating_user=\u05EA\u05E7\u05DC\u05D4 \u05D1\u05D9\u05E6\u05D9\u05E8\u05EA \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D7\u05D3\u05E9! report_select_user=\u05D6\u05D9\u05D4\u05D5\u05D9 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05DC\u05D1\u05E1\u05D9\u05E1 \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D3\u05D5\u05D7\u05D5\u05EA report_userlist_title=\u05D0\u05E0\u05D0 \u05D1\u05D7\u05E8 \u05D0\u05EA \u05E9\u05DE\u05DA: report_ident_user=\u05D6\u05D9\u05D4\u05D5\u05D9 \u05DE\u05E9\u05EA\u05DE\u05E9 report_name_prompt=\u05E9\u05DD: report_id_prompt=\u05D4\u05EA\u05D7\u05D1\u05E8: report_pw_prompt=\u05E1\u05D9\u05E1\u05DE\u05D0: report_pw_prompt_confirm=\u05D0\u05D9\u05DE\u05D5\u05EA \u05E1\u05D9\u05E1\u05DE\u05D0: report_new_user_data=\u05D9\u05E6\u05D9\u05E8\u05EA \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D7\u05D3\u05E9: report_err_bad_data=\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05D2\u05D5\u05D9\u05D9\u05DD! report_generic_group_name=\u05DB\u05DC\u05DC\u05D9 report_new_group=\u05E6\u05D5\u05E8 \u05E7\u05D1\u05D5\u05E6\u05D4 \u05D7\u05D3\u05E9\u05D4... report_err_creating_group=\u05EA\u05E7\u05DC\u05D4 \u05D1\u05D9\u05E6\u05D9\u05E8\u05EA \u05E7\u05D1\u05D5\u05E6\u05D4 \u05D7\u05D3\u05E9\u05D4! report_grouplist_title=\u05D0\u05E0\u05D0 \u05D1\u05D7\u05E8 \u05D0\u05EA \u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 \u05E9\u05DC\u05DA: report_new_group_data=\u05D9\u05E6\u05D9\u05E8\u05EA \u05E7\u05D1\u05D5\u05E6\u05EA \u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05D7\u05D3\u05E9\u05D4: report_err_invalid_user=\u05D7\u05E1\u05E8 \u05E7\u05D5\u05D3 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D0\u05D5 \u05E1\u05D9\u05E1\u05DE\u05D0 \u05DC\u05D0 \u05E0\u05DB\u05D5\u05E0\u05D4. report_user_has_pwd=\u05D7\u05E9\u05D1\u05D5\u05DF \u05D6\u05D4 \u05DE\u05D5\u05D2\u05DF \u05E2\u05DC \u05D9\u05D3\u05D9 \u05E1\u05D9\u05E1\u05DE\u05D0. report_err_init=\u05EA\u05E7\u05DC\u05D4 \u05D1\u05D0\u05EA\u05D7\u05D5\u05DC \u05DE\u05E2\u05E8\u05DB\u05EA \u05D4\u05D3\u05D5\u05D7\u05D5\u05EA. report_not_connected=\u05DC\u05D0 \u05DE\u05D7\u05D5\u05D1\u05E8 report_err_creating=Error creating reports agent action_return_caption=\u05D7\u05D6\u05D5\u05E8 action_return_tooltip=\u05D7\u05D6\u05D5\u05E8 \u05DC\u05EA\u05E4\u05E8\u05D9\u05D8 \u05D4\u05D0\u05D7\u05E8\u05D5\u05DF action_return_keys=T* filefilter_all_sounds=\u05E6\u05DC\u05D9\u05DC\u05D9\u05DD (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=\u05E7\u05D1\u05E6\u05D9 MIDI (*.mid) filefilter_all_video=\u05E7\u05D1\u05E6\u05D9 \u05D5\u05D9\u05D3\u05D0\u05D5 (*.avi, *.mov, *.mpeg) filefilter_all_anim=\u05E7\u05D1\u05E6\u05D9 Flash (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=All media files filesystem_copyToRoot_1=The file filesystem_copyToRoot_2=is out of the current project's folder. filesystem_copyToRoot_3=It's advisable to have all the files in the same folder. filesystem_copyToRoot_4=Do you want to copy the selected file to the project's folder? filesystem_copyFile=Copying file msg_loading=Loading report_err_bad_id=Bad identifier! report_err_duplicate_id=This identifier already exists in the database! report_err_bad_name=Bad name! report_err_bad_pw=Passwords don't match! report_err_connect=Error connecting to the reports database! test_alert_exit=EXIT: At this point, the program will exit. test_alert_jump_to=At this point the program will jump to the project: ftype_image=Image ftype_audio=Digital audio ftype_midi=MIDI file ftype_xml=XML file ftype_anim=Animation ftype_video=Digital video ftype_font=TrueType font ftype_jclic=JClic project ftype_inst=JClic project installer script ftype_unknown=Unknown ftype_animated=animated filefilter_fonts=Fonts (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML documents (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=With the support of: about_window_systemInfo=System information about_window_projectInfo=Current project info about_window_reportInfo=Current session results about_otherCreditsCaption=This product includes software developed by: msg_saving_project=Saving project... filefilter_text=Text files (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=English version, by The JClic team #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. src/core/edu/xtec/resources/messages/JClicMessages_it.properties000066400000000000000000000214201335566474600254460ustar00rootroot00000000000000#JClic main messages label_time=tempo label_actions=tentativi label_score=punteggio Skin = Skin action_next_caption=Avanti action_next_tooltip=Attivit\u00E0 successiva action_prev_caption=Precedente action_prev_tooltip=Attivit\u00E0 precedente action_reset_caption=Riavvia action_reset_tooltip=Riavvia l'attivit\u00E0 action_info_caption=Informazioni about_window_lb_project=Progetto about_window_lb_languages=lingue about_window_lb_language=lingua about_window_close_button=Torna al programma about_window_caption=Informazioni su... action_about_tooltip=Rapporti utente about_window_lb_report=Rapporto about_window_browser_button=Vedi nel browser report_no_activities=Nessuna attivit\u00E0 a rapporto! report_system_standard=Rapporto non registrato in alcun database report_lb_time=Tempi msg_error_loading_sequence=Errore al caricamento della sequenza media_qt_error_initializing=Errore nell'inizializzazione di Quick Time! media_check_url=messages/checkmedia_it.html filesystem_openURL=Apri URL filesystem_openFile=Apri file... filesystem_enterURL=Per favore, inserisci l'URL della risorsa da caricare. msg_error_executing_external=Errore nell'esecuzione del comando: editor_moveDown_tooltip=Sposta in basso l'elemento selezionato editor_moveUp_tooltip=Sposta in alto l'elemento selezionato editor_moveDown=Sposta in basso editor_moveUp=Sposta in alto filefilter_all_images=Immagini (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=Immagini PNG filefilter_jpg=Immagini JPG filefilter_gif=Immagini GIF filesystem_saveURLerror=I files a base URL sono in sola lettura. filefilter_all_clic=Pacchetti di Clic 3.0 filefilter_all=Tutti i file filefilter_all_jclic_clic=Progetti di JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=Progetti di JClic (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 pacchetti compattati (*.pcc) filefilter_pac=Clic 3.0 pacchetti aperti (*.pac) filefilter_jclic_zip=Progetti di JClic compressi (*.jclic.zip) filefilter_jclic=Progetti di JClic (*.jclic) about_window_lb_mediaSystem=Sistema multimediale about_window_lb_level=Livello about_window_lb_area=Dominio report_num_actions=Azioni compiute: report_project=Progetto: report_lb_totals=Totale: report_num_projects=Progetti: report_session=Sessione: msg_warn_no_exec_in_applets=Per ragioni di sicurezza, l'esecuzione di programmi esterni nelle applet di JClic \u00E8 disabilitata. msg_error_starting_activity=Errore nell'avvio dell'attivit\u00E0! msg_error_loading_project=Errore nel caricamento del progetto msg_error_playing_media=Errore nella riproduzione del file multimediale! msg_activity_finished=Attivit\u00E0 terminata! msg_playing_media=Lettura del file multimediale msg_activity_running=Attivit\u00E0 in corso msg_activity_ready=Attivit\u00E0 pronta msg_initializing=Inizializzazione... msg_preparing_media=Preparazione del file multimediale msg_error_loading_activity=Errore nel caricamento dell'attivit\u00E0 msg_loading_activity=Caricamento dell'attivit\u00E0 msg_loading_project=Caricamento del progetto... msg_ready=Pronto err_reading_data=Errore durante il caricamento del file err_file_save=Errore durante il salvataggio del file! err_file_open=Errore durante l'apertura del file! report_started=Sessione avviata: report_lb_score=Punteggio report_lb_actions=Azioni report_lb_solved=Ok report_lb_activity=Attivit\u00E0 report_lb_sequence=Sequenza report_global_score=Punteggio globale: report_total_time=Tempo totale nelle attivit\u00E0: report_num_activities_solved=Attivit\u00E0 ok: report_num_activities=Attivit\u00E0 eseguite: report_num_sequences=Sequenze: report_system=Sistema dei rapporti: report_user=Utente: report_not_finished=Attivit\u00E0 non conclusa action_info_tooltip=Informazioni aggiuntive action_help_caption=Aiuto action_help_tooltip=Aiuto su questa attivit\u00E0 action_audio_caption=Suoni action_audio_tooltip=Abilita/disabilita suoni about_window_lb_system=Sistema about_window_lb_total_mem=Memoria totale about_window_lb_free_mem=Memoria libera about_window_lb_java_home=Java home about_window_lb_java_vm=Java virtual machine about_window_lb_java_version=Versione di Java about_window_lb_os=Sistema operativo about_window_lb_version=Versione about_window_lb_descriptors=Descrittori about_window_lb_description=Descrizione about_window_lb_history=Cronologia about_window_lb_organizations=Organizzazioni about_window_lb_organization=Organizzazione about_window_lb_authors=Autori about_window_lb_author=Autore about_window_lb_activity=Attivit\u00E0 help_window_close_button=Ritorna all'attivit\u00E0 help_window_caption=Finestra di aiuto action_about_caption=Rapporti action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=Installatori di progetti JClic (*.jclic.inst) report_err_no_users=Nessun utente \u00E8 stato definito nel database dei rapporti! report_err_no_users_in_group=Nessun utente \u00E8 stato definito per questo gruppo nel database dei rapporti! report_new_user=Nuovo utente... report_new_user_tooltip=Crea un nuovo utente nel database dei rapporti report_err_creating_user=Errore nella creazione di un nuovo utente! report_select_user=Identificazione dell'utente per il database dei rapporti report_userlist_title=Per favore, seleziona il tuo nome: report_ident_user=Identificazione dell'utente report_name_prompt=Nome: report_id_prompt=Login: report_pw_prompt=Password: report_pw_prompt_confirm=Conferma password: report_new_user_data=Creazione di un nuovo utente: report_err_bad_data=Dati inesatti! report_generic_group_name=Generico report_new_group=Crea un nuovo gruppo... report_err_creating_group=Errore nella creazione del nuovo gruppo! report_grouplist_title=Per favore, seleziona il tuo gruppo: report_new_group_data=Creazione di un nuovo gruppo di utenti: report_err_invalid_user=Manca la user ID oppure la password \u00E8 sbagliata. report_user_has_pwd=L'accesso \u00E8 protetto da password. report_err_init=Errore nell'inizializzazione del sistema dei rapporti. report_not_connected=non connesso report_err_creating=Errore nella creazione di un agente dei rapporti action_return_caption=Torna al programma action_return_tooltip=Ritorna all'ultimo menu action_return_keys=T* filefilter_all_sounds=Suoni (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI (*.mid) filefilter_all_video=Video (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=Tutti i file multimediali filesystem_copyToRoot_1=Il file filesystem_copyToRoot_2=\u00E8 fuori dalla cartella del progetto corrente. filesystem_copyToRoot_3=E' consigliabile tenere tutti i file nella stessa cartella. filesystem_copyToRoot_4=Vuoi copiare i file selezionati nella cartella del progetto? filesystem_copyFile=Copia del file msg_loading=Caricamento report_err_bad_id=Identificatore non corretto! report_err_duplicate_id=Questo identificatore gi\u00E0 esiste nel database! report_err_bad_name=Nome non corretto! report_err_bad_pw=Le password non coincidono! report_err_connect=Errore di connessione al database dei rapporti! test_alert_exit=ESCI: A questo punto termina il programma. test_alert_jump_to=A questo punto il programma salter\u00E0 verso il progetto: ftype_image=Immagine ftype_audio=Audio digitale ftype_midi=File MIDI ftype_xml=File XML ftype_anim=Animazione ftype_video=Video digitale ftype_font=Carattere TrueType ftype_jclic=Progetto JClic ftype_inst=Script d'installatore di progetto JClic ftype_unknown=Sconosciuto ftype_animated=animato filefilter_fonts=Caratteri (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=Documenti HTML (*.htm, *.html) about_creditsDoc=about/credits_it.html about_licenseDoc=about/license_it.html about_sponsorsCaption=Con l'aiuto di: about_window_systemInfo=Informazioni sul sistema about_window_projectInfo=Informazioni sul progetto corrente about_window_reportInfo=Risultati della sessione corrente about_otherCreditsCaption=Questo prodotto contiene software sviluppato da: msg_saving_project=Salvataggio del progetto... filefilter_text=Testi (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Version Italiana: Roberto Marcolin e Giorgio Musilli #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. src/core/edu/xtec/resources/messages/JClicMessages_nl.properties000066400000000000000000000205301335566474600254440ustar00rootroot00000000000000#JClic main messages label_time=tijd label_actions=pogingen label_score=punten Skin = Achtergrond action_next_caption=Volgende action_next_tooltip=Volgende activiteit action_prev_caption=Vorige action_prev_tooltip=Vorige activiteit action_reset_caption=Herstarten action_reset_tooltip=Herstart activiteit action_info_caption=Informatie about_window_lb_project=Project about_window_lb_languages=talen about_window_lb_language=taal about_window_close_button=Terug about_window_caption=Informatie action_about_tooltip=Gebruikers rapport about_window_lb_report=Rapport about_window_browser_button=Bekijken in browser report_no_activities=Geen activiteiten gerapporteerd! report_system_standard=Rapport niet geregistreerd in een DB report_lb_time=Tijd msg_error_loading_sequence=Fout tijdens het laden media_qt_error_initializing=Fout bij starten QuickTime! media_check_url=berichten/testmedia.html filesystem_openURL=URL-adres openen... filesystem_openFile=Bestand openen... filesystem_enterURL=Voer URL van de bron in. msg_error_executing_external=Fout tijdens de uitvoering van het commando: editor_moveDown_tooltip=Het geselecteerd element omlaag editor_moveUp_tooltip=Het geselecteerd element omhoog editor_moveDown=Omlaag editor_moveUp=Omhoog filefilter_all_images=Afbeeldingen (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG afbeeldingen filefilter_jpg=JPG afbeeldingen filefilter_gif=GIF afbeeldingen filesystem_saveURLerror=URL-bestanden zijn read-only. filefilter_all_clic=Clic 3.0 packages (*.pac, *.pcc) filefilter_all=Alle bestanden filefilter_all_jclic_clic=JClic en Clic 3.0 projecten (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic projecten (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 compact packages (*.pcc) filefilter_pac=Clic 3.0 open packages (*.pac) filefilter_jclic_zip=JClic compressed projecten (*.jclic.zip) filefilter_jclic=JClic projecten (*.jclic) about_window_lb_mediaSystem=Multimedia systeem about_window_lb_level=Niveau about_window_lb_area=Gebied report_num_actions=Einde activiteiten: report_project=Project: report_lb_totals=Totaal: report_num_projects=Projecten: report_session=Reeks: msg_warn_no_exec_in_applets=Starten van externe programma's is uitgeschakeld om veiligheidsredenen. msg_error_starting_activity=Fout bij het starten van een activiteit! msg_error_loading_project=Fout bij laden van het project msg_error_playing_media=Fout bij het afspelen van media! msg_activity_finished=Einde activiteit! msg_playing_media=Madia afspelen msg_activity_running=Activiteit gestart msg_activity_ready=Activiteit klaar msg_initializing=Initialiseren... msg_preparing_media=Media voorbereiden msg_error_loading_activity=Fout bij het laden van een activiteit msg_loading_activity=Activiteit laden msg_loading_project=Project laden... msg_ready=Gereed err_reading_data=Fout tijdens laden bestand err_file_save=Fout tijdens opslaan bestand! err_file_open=Fout bij openen bestand! report_started=Reeks gestart: report_lb_score=Punten report_lb_actions=Acties report_lb_solved=Ok report_lb_activity=Activiteit report_lb_sequence=Volgorde report_global_score=Puntentotaal: report_total_time=Totale tijd activiteiten: report_num_activities_solved=Activiteiten ok: report_num_activities=Activiteiten klaar: report_num_sequences=Reeksen: report_system=Rapporteer systeem: report_user=Gebruiker: report_not_finished=Activiteit nog niet gedaan action_info_tooltip=Verdere informatie action_help_caption=Help action_help_tooltip=Help bij deze activiteit action_audio_caption=Geluiden action_audio_tooltip=Geluid aan/uit about_window_lb_system=Systeem about_window_lb_total_mem=Totaal geheugen about_window_lb_free_mem=Beschikbaar geheugen about_window_lb_java_home=Java home about_window_lb_java_vm=Java virtual machine about_window_lb_java_version=Java-versie about_window_lb_os=Besturingssysteem about_window_lb_version=Versie about_window_lb_descriptors=Beschrijvingen about_window_lb_description=Beschrijving about_window_lb_history=Geschiedenis about_window_lb_organizations=Organisaties about_window_lb_organization=Organisatie about_window_lb_authors=Auteurs about_window_lb_author=Auteur about_window_lb_activity=Activiteit help_window_close_button=Terug naar activiteit help_window_caption=Help venster action_about_caption=Rapporten action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic project installers (*.jclic.inst) report_err_no_users=Geen gebruikers gedefinieerd in de rapporten database! report_err_no_users_in_group=Geen gebruikers gedefinieerd voor deze groep in de rapporten database! report_new_user=Nieuwe gebruiker... report_new_user_tooltip=Maak een nieuwe gebruiker in de rapporten database report_err_creating_user=Fout bij het maken van een gebruiker! report_select_user=Identificatie van de gebruiker in de rapporten database report_userlist_title=Kies uw naam: report_ident_user=Identificatie van de gebruiker report_name_prompt=Naam: report_id_prompt=Gebruikersnaam: report_pw_prompt=Wachtwoord: report_pw_prompt_confirm=Bevestig wachtwoord: report_new_user_data=Aanmaken nieuwe gebruiker: report_err_bad_data=Verkeerde gegevens! report_generic_group_name=Algemeen report_new_group=Maak een nieuwe groep... report_err_creating_group=Fout bij het maken van een nieuwe groep report_grouplist_title=Kies groep: report_new_group_data=Maken van een nieuwe gebruikersgroep: report_err_invalid_user=Gebruikers identificatie verkeerd of ontbreekt. report_user_has_pwd=Deze aanmelding is beveiligd met een wachtwoord. report_err_init=Fout bij het initialiseren van het rapport systeem. report_not_connected=Niet verbonden report_err_creating=Fout bij het aanmaken van het rapport action_return_caption=Vorige action_return_tooltip=Vorig menu action_return_keys=T* filefilter_all_sounds=Geluiden (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI bestanden (*.mid) filefilter_all_video=Video bestanden (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 bestanden (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=Alle mediabestanden filesystem_copyToRoot_1=Het bestand filesystem_copyToRoot_2=is buiten de map van het huidig project. filesystem_copyToRoot_3=Het is gemakkelijk als alle bestanden in dezelfde map zitten. filesystem_copyToRoot_4=Wil je een kopie van het gekozen bestand in de map van het project? filesystem_copyFile=Bestand kopi\u00EBren msg_loading=Laden report_err_bad_id=Verkeerde identificatie! report_err_duplicate_id=Deze identificatie bestaat reeds in de database! report_err_bad_name=Verkeerde naam! report_err_bad_pw=De wachtwoorden komen niet overeen! report_err_connect=Fout bij het verbinden met de rapporten database! test_alert_exit=EXIT: Nu zal het programma stoppen. test_alert_jump_to=Nu zal het programma naar het project gaan: ftype_image=Afbeelding ftype_audio=Digital audio ftype_midi=MIDI bestand ftype_xml=XML-bestand ftype_anim=Animatie ftype_video=Digital video ftype_font=TrueType lettertype ftype_jclic=JClic project ftype_inst=JClic project installeer script ftype_unknown=Onbekend ftype_animated=geanimeerd filefilter_fonts=Lettertypen (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML documenten (*.htm, *.html) about_creditsDoc=info/credits.html about_licenseDoc=info/license.html about_sponsorsCaption=Met ondersteuning van: about_window_systemInfo=Systeem informatie about_window_projectInfo=Huidig project informatie about_window_reportInfo=Huidige reeksresultaten about_otherCreditsCaption=Dit product bevat software ontwikkeld door: msg_saving_project=Project bewaren... filefilter_text=Tekst bestanden (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Engelse versie, door Het JClic team #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. src/core/edu/xtec/resources/messages/JClicMessages_pt.java000066400000000000000000000001121335566474600241750ustar00rootroot00000000000000package edu.xtec.resources.messages; public class JClicMessages_pt {} src/core/edu/xtec/resources/messages/JClicMessages_pt.properties000066400000000000000000000221641335566474600254630ustar00rootroot00000000000000#JClic main messages label_time=tempo label_actions=tentativas label_score=acertos Skin = Aspecto action_next_caption=Seguinte action_next_tooltip=Actividade seguinte action_prev_caption=Anterior action_prev_tooltip=Actividade anterior action_reset_caption=Reiniciar action_reset_tooltip=Reiniciar a actividade action_info_caption=Informa\u00E7\u00E3o about_window_lb_project=Projecto about_window_lb_languages=Idiomas about_window_lb_language=Idioma about_window_close_button=Voltar about_window_caption=Sobre... action_about_tooltip=Relat\u00F3rios do utilizador about_window_lb_report=Relat\u00F3rios about_window_browser_button=Ver no navegador report_no_activities=Nenhuma actividade registada! report_system_standard=O relat\u00F3rio n\u00E3o est\u00E1 registado em nenhuma base de dados report_lb_time=Tempo msg_error_loading_sequence=Erro ao carregar a sequ\u00EAncia media_qt_error_initializing=Erro ao iniciar QuickTime! media_check_url=messages/checkmedia_pt.html filesystem_openURL=Abrir URL... filesystem_openFile=Abrir ficheiro... filesystem_enterURL=Escreva URL do recurso a que deseja aceder msg_error_executing_external=Erro ao executar o comando: editor_moveDown_tooltip=Mover para baixo o elemento seleccionado editor_moveUp_tooltip=Mover para cima o elemento seleccionado editor_moveDown=Mover para baixo editor_moveUp=Mover para cima filefilter_all_images=Imagens (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=Imagens PNG filefilter_jpg=Imagens JPG filefilter_gif=Imagens GIF filesystem_saveURLerror=Ficheiros de URL s\u00F3 de leitura. filefilter_all_clic=Pacotes Clic 3.0 (*.pac, *.pcc) filefilter_all=Todos os ficheiros filefilter_all_jclic_clic=Projectos JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=Projectos JClic (*.jclic, *.jclic.zip) filefilter_pcc=Pacotes compactos Clic 3.0 (*.pcc) filefilter_pac=Pacotes abertos Clic 3.0 (*.pac) filefilter_jclic_zip=Projectos JClic comprimidos (*.jclic.zip) filefilter_jclic=Projectos JClic (*.jclic) about_window_lb_mediaSystem=Sistema multim\u00E9dia about_window_lb_level=N\u00EDvel about_window_lb_area=\u00C1rea report_num_actions=Ac\u00E7\u00F5es efectuadas: report_project=Projecto: report_lb_totals=Total: report_num_projects=Projectos: report_session=Sess\u00E3o: msg_warn_no_exec_in_applets=Por raz\u00F5es de seguran\u00E7a, a execu\u00E7\u00E3o de programas externos est\u00E1 desactivada nos applets JClic msg_error_starting_activity=Erro ao iniciar a actividade! msg_error_loading_project=Erro ao carregar o projecto msg_error_playing_media=Erro do recurso multim\u00E9dia! msg_activity_finished=Actividade terminada! msg_playing_media=Multim\u00E9dia em execu\u00E7\u00E3o msg_activity_running=Actividade em execu\u00E7\u00E3o msg_activity_ready=Actividade preparada msg_initializing=A iniciar... msg_preparing_media=A preparar multim\u00E9dia msg_error_loading_activity=Erro ao carregar a actividade msg_loading_activity=A carregar actividade msg_loading_project=A carregar projecto... msg_ready=Pronto err_reading_data=Erro ao carregar ficheiro err_file_save=Erro ao guardar o ficheiro! err_file_open=Erro ao abrir o ficheiro! report_started=In\u00EDcio da sess\u00E3o: report_lb_score=Pontua\u00E7\u00E3o report_lb_actions=Ac\u00E7\u00F5es report_lb_solved=Correcta report_lb_activity=Actividade report_lb_sequence=Sequ\u00EAncia report_global_score=Pontua\u00E7\u00E3o global: report_total_time=Tempo total das actividades: report_num_activities_solved=Actividades correctas: report_num_activities=Actividades realizadas: report_num_sequences=Sequ\u00EAncias: report_system=Sistema de relat\u00F3rios: report_user=Utilizador: report_not_finished=Actividade n\u00E3o conclu\u00EDda action_info_tooltip=Informa\u00E7\u00E3o adicional action_help_caption=Ajuda action_help_tooltip=Ajuda sobre a actividade action_audio_caption=Sons action_audio_tooltip=Activar/desactivar sons about_window_lb_system=Sistema about_window_lb_total_mem=Mem\u00F3ria total about_window_lb_free_mem=Mem\u00F3ria livre about_window_lb_java_home=P\u00E1gina do Java about_window_lb_java_vm=M\u00E1quina virtual Java about_window_lb_java_version=Vers\u00E3o Java about_window_lb_os=Sistema operativo about_window_lb_version=Vers\u00E3o about_window_lb_descriptors=Descritores about_window_lb_description=Descri\u00E7\u00E3o about_window_lb_history=Hist\u00F3rico about_window_lb_organizations=Organiza\u00E7\u00F5es about_window_lb_organization=Organiza\u00E7\u00E3o about_window_lb_authors=Autores/as about_window_lb_author=Autor/a about_window_lb_activity=Actividade help_window_close_button=Voltar \u00E0 actividade help_window_caption=Janela de ajuda action_about_caption=Relat\u00F3rios action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=Instaladores de projectos JClic (*.jclic.inst) report_err_no_users=Nenhum utilizador definido na base de dados de relat\u00F3rios! report_err_no_users_in_group=Nenhum utilizador definido para este grupo na base de dados de relat\u00F3rios! report_new_user=Novo utilizador... report_new_user_tooltip=Criar um novo utilizador na base de dados de relat\u00F3rios! report_err_creating_user=Erro ao criar um novo utilizador! report_select_user=Identifica\u00E7\u00E3o de utilizador para base de dados de relat\u00F3rios report_userlist_title=Seleccione seu nome: report_ident_user=Identifica\u00E7\u00E3o de utilizador report_name_prompt=Nome: report_id_prompt=Nome de Utilizador: report_pw_prompt=Palavra-passe: report_pw_prompt_confirm=Confirmar palavra-chave: report_new_user_data=Cria\u00E7\u00E3o de novo utilizador: report_err_bad_data=Dados incorrectos! report_generic_group_name=Gen\u00E9rico report_new_group=Criar un novo grupo... report_err_creating_group=Erro ao criar o novo grupo! report_grouplist_title=Seleccione grupo: report_new_group_data=Cria\u00E7\u00E3o de novo grupo de utilizadores: report_err_invalid_user=Utilizador inexistente ou palavra-passe incorrecta. report_user_has_pwd=A conta deste utilizador est\u00E1 protegida por palavra-chave: report_err_init=Erro ao iniciar o sistema de relat\u00F3rios. report_not_connected=n\u00E3o conectado report_err_creating=Erro ao criar o agente de relat\u00F3rios action_return_caption=Voltar action_return_tooltip=Voltar ao \u00FAltimo menu action_return_keys=V* filefilter_all_sounds=Sons (*.wav, *.mp3, *.au, *.aiff) filefilter_midi=Ficheiros MIDI (*.mid) filefilter_all_video=Video (*.avi, *.mov, *.mpeg) filefilter_all_anim=Ficheiros Flash 2.0 (*.swf) filefilter_skins=Ambientes visuais (*.xml) filefilter_all_media=Todos os ficheiros multim\u00E9dia filesystem_copyToRoot_1=O ficheiro filesystem_copyToRoot_2=n\u00E3o se encontra na pasta do projecto actual. filesystem_copyToRoot_3=Recomenda-se ter todos os ficheiros na mesma pasta. filesystem_copyToRoot_4=Deseja copiar o ficheiro seleccionado para a pasta do projecto? filesystem_copyFile=A copiar o ficheiro msg_loading=A carregar report_err_bad_id=Identificador incorrecto! report_err_duplicate_id=Este identificador j\u00E1 existe na base de dados! report_err_bad_name=Nome incorrecto! report_err_bad_pw=As palavras-chave n\u00E3o coincidem! report_err_connect=Erro ao ligar \u00E0 base de dados de relat\u00F3rios! test_alert_exit=SAIR: O programa vai ser encerrado. test_alert_jump_to=O programa vai ligar-se a outro projecto: ftype_image=Imagem ftype_audio=Som digital ftype_midi=Ficheiro MIDI ftype_xml=Ficheiro XML ftype_anim=Anima\u00E7\u00E3o ftype_video=V\u00EDdeo digital ftype_font=Tipo de letra TrueType ftype_jclic=Projecto JClic ftype_inst=Script de instala\u00E7\u00E3o de projectos JClic ftype_unknown=Desconhecido ftype_animated=animada filefilter_fonts=Tipos de letra (*.ttf) editor_moveUp_keys=R#38 editor_moveDown_keys=B#40 filefilter_all_html=Documentos HTML (*.htm, *.html) about_creditsDoc=Sobre/Cr\u00E9ditos_pt.html about_licenseDoc=Sobre/Licen\u00E7a_pt.html about_sponsorsCaption=Com o suporte de: about_window_systemInfo=Informa\u00E7\u00F5es do sistema about_window_projectInfo=Informa\u00E7\u00E3o sobre projecto actual about_window_reportInfo=Resultados da sess\u00E3o actual about_otherCreditsCaption=Este produto inclui software desenvolvido por: msg_saving_project=A guardar projecto... filefilter_text=Ficheiros de texto (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Revis\u00E3o do portugu\u00EAs por Rui Fernandes #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Este programa \u00E9 software livre ("free software"); voc\u00EA pode redistribui-lo e/ou modific\u00E1-lo de acordo com os termos da Licen\u00E7a P\u00FAblica Geral GNU como publicada pela Free Software Foundation; tanto segundo a vers\u00E3o 2 dessa licen\u00E7a quanto (por sua op\u00E7\u00E3o) por uma vers\u00E3o posterior.
 
Este programa \u00E9 distribu\u00EDdo na expectativa de ser \u00FAtil, mas SEM QUALQUER GARANTIA; sem mesmo a garantia impl\u00EDcita de COMERCIALIZA\u00C7\u00C3O ou de ADEQUA\u00C7\u00C3O A QUALQUER PROP\u00D3SITO EM PARTICULAR. Consulte GNU General Public License para obter mais detalhes. src/core/edu/xtec/resources/messages/JClicMessages_pt_BR.java000066400000000000000000000001151335566474600245630ustar00rootroot00000000000000package edu.xtec.resources.messages; public class JClicMessages_pt_BR {} src/core/edu/xtec/resources/messages/JClicMessages_pt_BR.properties000066400000000000000000000222261335566474600260450ustar00rootroot00000000000000#JClic main messages label_time=tempo label_actions=tentativas label_score=acertos Skin = Aspecto action_next_caption=Pr\u00F3ximo action_next_tooltip=atividade seguinte action_prev_caption=Anterior action_prev_tooltip=atividade anterior action_reset_caption=Reiniciar action_reset_tooltip=Reiniciar a atividade action_info_caption=Informa\u00E7\u00E3o about_window_lb_project=projeto about_window_lb_languages=Idiomas about_window_lb_language=Idioma about_window_close_button=Voltar about_window_caption=Sobre... action_about_tooltip=relat\u00F3rios de usu\u00E1rio about_window_lb_report=Relat\u00F3rios about_window_browser_button=Ver no navegador report_no_activities=Nenhuma atividade registrada! report_system_standard=O relat\u00F3rio n\u00E3o est\u00E1 registrando em nenhuma base de dados report_lb_time=Tempo msg_error_loading_sequence=Erro ao carregar a seq\u00FC\u00EAncia media_qt_error_initializing=Erro ao inicializar QuickTime! media_check_url=messages/checkmedia_pt_BR.html filesystem_openURL=Abrir URL... filesystem_openFile=Abrir arquivo... filesystem_enterURL=Escreva a URL do recurso que deseja acessar. msg_error_executing_external=Erro ao executar o comando: editor_moveDown_tooltip=Mover para baixo o elemento selecionado editor_moveUp_tooltip=Mover para cima o elemento selecionado editor_moveDown=Mover para baixo editor_moveUp=Mover para cima filefilter_all_images=Imagens (*.gif, *.jpg, *.png) filefilter_png=Imagens PNG filefilter_jpg=Imagens JPG filefilter_gif=Imagens GIF filesystem_saveURLerror=Os arquivos baseados na URL s\u00E3o de leitura apenas. filefilter_all_clic=Pacotes Clic 3.0 (*.pac, *.pcc) filefilter_all=Todos os arquivos filefilter_all_jclic_clic=projetos JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=projetos JClic (*.jclic, *.jclic.zip) filefilter_pcc=Pacotes compactos Clic 3.0 (*.pcc) filefilter_pac=Pacotes abertos Clic 3.0 (*.pac) filefilter_jclic_zip=projetos JClic comprimidos (*.jclic.zip) filefilter_jclic=projetos JClic (*.jclic) about_window_lb_mediaSystem=Sistema multimeio about_window_lb_level=N\u00EDvel about_window_lb_area=\u00C1rea report_num_actions=A\u00E7\u00F5es efetuadas: report_project=projeto: report_lb_totals=Total: report_num_projects=projetos: report_session=Sess\u00E3o: msg_warn_no_exec_in_applets=Por raz\u00F5es de seguran\u00E7a a chamada de programas externos est\u00E1 desabilitada nos applets JClic. msg_error_starting_activity=Erro ao iniciar a atividade! msg_error_loading_project=Erro ao carregar o projeto msg_error_playing_media=Erro ao executar a m\u00EDdia! msg_activity_finished=atividade terminada! msg_playing_media=Interpretando m\u00EDdia msg_activity_running=atividade em andamento msg_activity_ready=atividade pronta msg_initializing=A inicializar... msg_preparing_media=Preparando m\u00EDdia msg_error_loading_activity=Erro ao carregar a atividade msg_loading_activity=A carregar atividade msg_loading_project=A carregar projeto... msg_ready=Pronto err_reading_data=Erro ao ler o arquivo err_file_save=Erro ao salvar o arquivo! err_file_open=Erro ao abrir o arquivo! report_started=In\u00EDcio da sess\u00E3o: report_lb_score=Pontua\u00E7\u00E3o report_lb_actions=A\u00E7\u00F5es report_lb_solved=Correta report_lb_activity=atividade report_lb_sequence=Sequ\u00EAncia report_global_score=Pontua\u00E7\u00E3o geral: report_total_time=Tempo total das atividades: report_num_activities_solved=atividades corretas: report_num_activities=atividades realizadas: report_num_sequences=Sequ\u00EAncias: report_system=Sistema de relat\u00F3rios: report_user=Usu\u00E1rio: report_not_finished=atividade ainda n\u00E3o acabada action_info_tooltip=Informa\u00E7\u00E3o adicional action_help_caption=Ajuda action_help_tooltip=Ajuda sobre a atividade action_audio_caption=Sons action_audio_tooltip=Ativar/desativar sons about_window_lb_system=Sistema about_window_lb_total_mem=Mem\u00F3ria total about_window_lb_free_mem=Mem\u00F3ria livre about_window_lb_java_home=Local do Java about_window_lb_java_vm=M\u00E1quina virtual Java about_window_lb_java_version=Vers\u00E3o Java about_window_lb_os=Sistema operacional about_window_lb_version=Vers\u00E3o about_window_lb_descriptors=Descritores about_window_lb_description=Descri\u00E7\u00E3o about_window_lb_history=Revis\u00F5es about_window_lb_organizations=Organiza\u00E7\u00F5es about_window_lb_organization=Organiza\u00E7\u00E3o about_window_lb_authors=Autores/as about_window_lb_author=Autor/a about_window_lb_activity=atividade help_window_close_button=Voltar \u00E0 atividade help_window_caption=Janela de ajuda action_about_caption=relat\u00F3rios action_about_keys=II action_audio_keys=OS action_help_keys=YY action_info_keys=NN action_next_keys=S* action_prev_keys=A* action_reset_keys=R* filefilter_install=Instaladores de projetos JClic (*.jclic.inst) report_err_no_users=N\u00E3o h\u00E1 nenhum usu\u00E1rio definido na base de dados de relat\u00F3rios. report_err_no_users_in_group=N\u00E3o h\u00E1 nenhum usu\u00E1rio definido para este grupo na base de dados de relat\u00F3rios! report_new_user=Novo usu\u00E1rio... report_new_user_tooltip=Criar um novo usu\u00E1rio na base de dados de relat\u00F3rios report_err_creating_user=Erro ao criar o novo usu\u00E1rio! report_select_user=Identifica\u00E7\u00E3o de usu\u00E1rio para a base de dados de relat\u00F3rios report_userlist_title=Selecione seu nome: report_ident_user=Identifica\u00E7\u00E3o de usu\u00E1rio report_name_prompt=Nome: report_id_prompt=Identificador: report_pw_prompt=Senha: report_pw_prompt_confirm=Confirmar senha: report_new_user_data=Cria\u00E7\u00E3o de um novo usu\u00E1rio: report_err_bad_data=Dados incorretos! report_generic_group_name=Gen\u00E9rico report_new_group=Criar um novo grupo... report_err_creating_group=Erro ao criar o novo grupo! report_grouplist_title=Selecione seu grupo: report_new_group_data=Cria\u00E7\u00E3o de um novo grupo de usu\u00E1rios: report_err_invalid_user=Usu\u00E1rio inexistente ou senha incorreta. report_user_has_pwd=A conta deste usu\u00E1rio est\u00E1 protegida por senha. report_err_init=Erro ao inicializar o sistema de relat\u00F3rios. report_not_connected=n\u00E3o conectado report_err_creating=Erro ao criar o agente de relat\u00F3rios action_return_caption=Voltar action_return_tooltip=Voltar ao \u00FAltimo menu action_return_keys=V* filefilter_all_sounds=Sons (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=Arquivos MIDI (*.mid) filefilter_all_video=Video (*.avi, *.mov, *.mpeg) filefilter_all_anim=Arquivos Flash 2.0 (*.swf) filefilter_skins=Entornos visuais (*.xml) filefilter_all_media=Todos os recursos filesystem_copyToRoot_1=O arquivo filesystem_copyToRoot_2=se encontra numa pasta diferente do projeto atual. filesystem_copyToRoot_3=Recomenda-se ter todos os arquivos na mesma pasta. filesystem_copyToRoot_4=Deseja copiar o arquivo seleccionado para a pasta do projeto? filesystem_copyFile=Copiando o arquivo msg_loading=Carregando report_err_bad_id=Identificador incorreto! report_err_duplicate_id=Este identificador j\u00E1 existe na base de dados! report_err_bad_name=Nome incorreto! report_err_bad_pw=As senhas n\u00E3o coincidem! report_err_connect=Erro ao conectar com a base de dados de relat\u00F3rios! test_alert_exit=SAIR: Neste ponto o programa seria fechado. test_alert_jump_to=Neste ponto, saltaria ao projeto: ftype_image=Imagem ftype_audio=Som digital ftype_midi=Arquivo MIDI ftype_xml=Arquivo XML ftype_anim=Anima\u00E7\u00E3o ftype_video=Video digital ftype_font=Tipo de letra TrueType ftype_jclic=projeto JClic ftype_inst=Script de instala\u00E7\u00E3o de projetos JClic ftype_unknown=Desconhecido ftype_animated=animada filefilter_fonts=Tipos de letra (*.ttf) editor_moveUp_keys=R#38 editor_moveDown_keys=B#40 filefilter_all_html=Documentos HTML (*.htm, *.html) about_creditsDoc=about/credits_pt_BR.html about_licenseDoc=about/license_pt_BR.html about_sponsorsCaption=Com o suporte de: about_window_systemInfo=Informa\u00E7\u00E3o do sistema about_window_projectInfo=Informa\u00E7\u00E3o do projeto atual about_window_reportInfo=Resultados da sess\u00E3o atual about_otherCreditsCaption=Este producto inclui software desenvolvido por: msg_saving_project=Salvando projeto... filefilter_text=Documentos de texto (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Brazilian Portuguese version, by The JClic team contributors (http://sites.google.com/site/boatecp/jclic) #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Este programa \u00E9 software livre ("free software"); voc\u00EA pode redistribu\u00ED-lo e/ou modific\u00E1-lo de acordo com os termos da Licen\u00E7a P\u00FAblica Geral GNU como publicada pela Free Software Foundation; tanto segundo a vers\u00E3o 2 dessa licen\u00E7a quanto (por sua op\u00E7\u00E3o) por uma vers\u00E3o posterior.
 
Este programa \u00E9 distribu\u00EDdo na expectativa de ser \u00FAtil, mas SEM QUALQUER GARANTIA; sem mesmo a garantia impl\u00EDcita de COMERCIALIZA\u00C7\u00C3O ou de ADEQUA\u00C7\u00C3O A QUALQUER PROP\u00D3SITO EM PARTICULAR. Consulte GNU General Public License para obter mais detalhes. src/core/edu/xtec/resources/messages/JClicMessages_ru.properties000066400000000000000000000604341335566474600254700ustar00rootroot00000000000000#JClic main messages label_time=\u0432\u0440\u0435\u043C\u044F label_actions=\u043F\u043E\u043F\u044B\u0442\u043A\u0438 label_score=\u0441\u0447\u0451\u0442 Skin = \u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 action_next_caption=\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 action_next_tooltip=\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 action_prev_caption=\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 action_prev_tooltip=\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 action_reset_caption=\u041F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C action_reset_tooltip=\u041F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F action_info_caption=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F about_window_lb_project=\u041F\u0440\u043E\u0435\u043A\u0442 about_window_lb_languages=\u044F\u0437\u044B\u043A\u0438 about_window_lb_language=\u044F\u0437\u044B\u043A about_window_close_button=\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F about_window_caption=\u041E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0435 action_about_tooltip=\u041E\u0442\u0447\u0451\u0442\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F about_window_lb_report=\u041E\u0442\u0447\u0435\u0442 about_window_browser_button=\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 report_no_activities=\u041D\u0435\u0442 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439! report_system_standard=\u041E\u0442\u0447\u0451\u0442 \u043D\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D \u0432 \u0411\u0414 report_lb_time=\u0412\u0440\u0435\u043C\u044F msg_error_loading_sequence=\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438 media_qt_error_initializing=\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=\u041E\u0442\u043A\u0440\u044B\u0442\u044C URL... filesystem_openFile=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0444\u0430\u0439\u043B... filesystem_enterURL=\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 URL \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438. msg_error_executing_external=\u041E\u0448\u0438\u0431\u043A\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u044B: editor_moveDown_tooltip=\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0432\u043D\u0438\u0437 editor_moveUp_tooltip=\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0432\u0432\u0435\u0440\u0445 editor_moveDown=\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u043D\u0438\u0437 editor_moveUp=\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u0432\u0435\u0440\u0445 filefilter_all_images=\u0424\u0430\u0439\u043B\u044B \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F filefilter_jpg=JPG \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F filefilter_gif=GIF \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F filesystem_saveURLerror=URL-\u0444\u0430\u0439\u043B\u044B \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F. filefilter_all_clic=\u041F\u0430\u043A\u0435\u0442\u044B Clic 3.0 (*.pac, *.pcc) filefilter_all=\u0412\u0441\u0435 \u0444\u0430\u0439\u043B\u044B filefilter_all_jclic_clic=\u041F\u0440\u043E\u0435\u043A\u0442\u044B JClic \u0438 Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=\u041F\u0440\u043E\u0435\u043A\u0442\u044B JClic (*.jclic, *.jclic.zip) filefilter_pcc=\u0421\u0436\u0430\u0442\u044B\u0435 \u043F\u0430\u043A\u0435\u0442\u044B Clic 3.0 (*.pcc) filefilter_pac=\u041E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u044B Clic 3.0 (*.pac) filefilter_jclic_zip=\u0421\u0436\u0430\u0442\u044B\u0435 \u043F\u0430\u043A\u0435\u0442\u044B JClic (*.jclic.zip) filefilter_jclic=\u041F\u0440\u043E\u0435\u043A\u0442\u044B JClic (*.jclic) about_window_lb_mediaSystem=\u041C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 about_window_lb_level=\u0423\u0440\u043E\u0432\u0435\u043D\u044C about_window_lb_area=\u041E\u0431\u043B\u0430\u0441\u0442\u044C report_num_actions=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: report_project=\u041F\u0440\u043E\u0435\u043A\u0442: report_lb_totals=\u0418\u0442\u043E\u0433\u043E: report_num_projects=\u041F\u0440\u043E\u0435\u043A\u0442\u044B: report_session=\u0421\u0435\u0441\u0441\u0438\u044F: msg_warn_no_exec_in_applets=\u0412 \u0446\u0435\u043B\u044F\u0445 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438, \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u0432\u043D\u0435\u0448\u043D\u0438\u0445 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u043E \u0432 \u0430\u043F\u043F\u043B\u0435\u0442\u0430\u0445 JClic. msg_error_starting_activity=\u041E\u0448\u0438\u0431\u043A\u0430 \u043D\u0430\u0447\u0430\u043B\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F! msg_error_loading_project=\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 msg_error_playing_media=\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u043E\u0438\u0433\u0440\u044B\u0432\u0430\u043D\u0438\u044F \u043C\u0435\u0434\u0438\u0430! msg_activity_finished=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E! msg_playing_media=\u041F\u0440\u043E\u0438\u0433\u0440\u044B\u0432\u0430\u043D\u0438\u0435 \u043C\u0435\u0434\u0438\u0430 msg_activity_running=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F msg_activity_ready=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0433\u043E\u0442\u043E\u0432\u043E msg_initializing=\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F... msg_preparing_media=\u041F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u043A\u0430 \u043C\u0435\u0434\u0438\u0430 msg_error_loading_activity=\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F msg_loading_activity=\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F msg_loading_project=\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430... msg_ready=\u0413\u043E\u0442\u043E\u0432\u043E err_reading_data=\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0444\u0430\u0439\u043B\u0430 err_file_save=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u0444\u0430\u0439\u043B\u0430! err_file_open=\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u044F \u0444\u0430\u0439\u043B\u0430! report_started=\u0421\u0435\u0441\u0441\u0438\u044F \u043D\u0430\u0447\u0430\u0442\u0430: report_lb_score=\u0421\u0447\u0451\u0442 report_lb_actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044F report_lb_solved=Ok report_lb_activity=\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C report_lb_sequence=\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C report_global_score=\u041E\u0431\u0449\u0438\u0439 \u0441\u0447\u0451\u0442: report_total_time=\u041E\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438: report_num_activities_solved=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0432 \u043F\u043E\u0440\u044F\u0434\u043A\u0435: report_num_activities=\u0421\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F: report_num_sequences=\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438: report_system=\u0421\u0438\u0441\u0442\u0435\u043C\u0430 \u043E\u0442\u0447\u0451\u0442\u043E\u0432: report_user=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C: report_not_finished=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043D\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E action_info_tooltip=\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F action_help_caption=\u0421\u043F\u0440\u0430\u0432\u043A\u0430 action_help_tooltip=\u041F\u043E\u043C\u043E\u0449\u044C \u043F\u043E \u044D\u0442\u043E\u043C\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044E action_audio_caption=\u0417\u0432\u0443\u043A\u0438 action_audio_tooltip=\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C/\u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0437\u0432\u0443\u043A\u0438 about_window_lb_system=\u0421\u0438\u0441\u0442\u0435\u043C\u0430 about_window_lb_total_mem=\u0412\u0441\u0435\u0433\u043E \u043F\u0430\u043C\u044F\u0442\u0438 about_window_lb_free_mem=\u0421\u0432\u043E\u0431\u043E\u0434\u043D\u0430\u044F \u043F\u0430\u043C\u044F\u0442\u044C about_window_lb_java_home=Java home about_window_lb_java_vm=\u0412\u0438\u0440\u0442\u0443\u0430\u043B\u044C\u043D\u0430\u044F \u043C\u0430\u0448\u0438\u043D\u0430 Java about_window_lb_java_version=\u0412\u0435\u0440\u0441\u0438\u044F Java about_window_lb_os=\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 about_window_lb_version=\u0412\u0435\u0440\u0441\u0438\u044F about_window_lb_descriptors=\u0414\u0435\u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0440\u044B about_window_lb_description=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 about_window_lb_history=\u0418\u0441\u0442\u043E\u0440\u0438\u044F about_window_lb_organizations=\u041E\u0440\u0433\u0430\u043D\u0438\u0437\u0430\u0446\u0438\u0438 about_window_lb_organization=\u041E\u0440\u0433\u0430\u043D\u0438\u0437\u0430\u0446\u0438\u044F about_window_lb_authors=\u0410\u0432\u0442\u043E\u0440\u044B about_window_lb_author=\u0410\u0432\u0442\u043E\u0440 about_window_lb_activity=\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C help_window_close_button=\u0412\u043E\u0437\u0432\u0440\u0430\u0442 \u043A \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044E help_window_caption=\u041E\u043A\u043D\u043E \u0441\u043F\u0440\u0430\u0432\u043A\u0438 action_about_caption=\u041E\u0442\u0447\u0451\u0442\u044B action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043E\u0447\u043D\u044B\u0435 \u0444\u0430\u0439\u043B\u044B \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432 JClic (*.jclic.inst) report_err_no_users=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 \u043D\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u044B \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0447\u0451\u0442\u043E\u0432! report_err_no_users_in_group=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 \u043D\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u044B \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u044B \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0447\u0451\u0442\u043E\u0432! report_new_user=\u041D\u043E\u0432\u044B\u0439 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C... report_new_user_tooltip=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 report_err_creating_user=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F! report_select_user=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0434\u043B\u044F \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 report_userlist_title=\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0448\u0435 \u0438\u043C\u044F: report_ident_user=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F report_name_prompt=\u0418\u043C\u044F: report_id_prompt=\u041B\u043E\u0433\u0438\u043D: report_pw_prompt=\u041F\u0430\u0440\u043E\u043B\u044C: report_pw_prompt_confirm=\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u043F\u0430\u0440\u043E\u043B\u044F: report_new_user_data=\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F: report_err_bad_data=\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435! report_generic_group_name=\u0420\u043E\u0434\u043E\u0432\u043E\u0439 report_new_group=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0433\u0440\u0443\u043F\u043F\u0443... report_err_creating_group=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043D\u043E\u0432\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u044B! report_grouplist_title=\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0412\u0430\u0448\u0443 \u0433\u0440\u0443\u043F\u043F\u0443: report_new_group_data=\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043D\u043E\u0432\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 report_err_invalid_user=ID \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043B\u0438 \u043F\u0430\u0440\u043E\u043B\u044C \u043D\u0435\u0432\u0435\u0440\u043D\u044B\u0439. report_user_has_pwd=\u042D\u0442\u043E\u0442 \u0430\u043A\u043A\u0430\u0443\u043D\u0442 \u0437\u0430\u0449\u0438\u0449\u0435\u043D \u043F\u0430\u0440\u043E\u043B\u0435\u043C. report_err_init=\u041E\u0448\u0438\u0431\u043A\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u044B \u043E\u0442\u0447\u0435\u0442\u043E\u0432. report_not_connected=\u043D\u0435 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u043E. report_err_creating=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0430\u0433\u0435\u043D\u0442\u0430 \u043E\u0442\u0447\u0435\u0442\u043E\u0432 action_return_caption=\u0412\u043E\u0437\u0432\u0440\u0430\u0442 action_return_tooltip=\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u0432 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u043C\u0435\u043D\u044E action_return_keys=T* filefilter_all_sounds=\u0417\u0432\u0443\u043A\u0438 (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI \u0444\u0430\u0439\u043B\u044B (*.mid) filefilter_all_video=\u0412\u0438\u0434\u0435\u043E\u0444\u0430\u0439\u043B\u044B (*.avi, *.mov, *.mpeg) filefilter_all_anim=\u0424\u0430\u0439\u043B\u044B Flash 2.0 (*.swf) filefilter_skins=\u0421\u043A\u0438\u043D\u044B (*.xml) filefilter_all_media=\u0412\u0441\u0435 \u043C\u0435\u0434\u0438\u0430\u0444\u0430\u0439\u043B\u044B filesystem_copyToRoot_1=\u0424\u0430\u0439\u043B filesystem_copyToRoot_2=\u0432\u043D\u0435 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u043F\u0430\u043F\u043A\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430. filesystem_copyToRoot_3=\u0426\u0435\u043B\u0435\u0441\u043E\u043E\u0431\u0440\u0430\u0437\u043D\u043E \u0438\u043C\u0435\u0442\u044C \u0432\u0441\u0435 \u0444\u0430\u0439\u043B\u044B \u0432 \u043E\u0434\u043D\u043E\u0439 \u043F\u0430\u043F\u043A\u0435. filesystem_copyToRoot_4=\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0444\u0430\u0439\u043B \u0432 \u043F\u0430\u043F\u043A\u0443 \u043F\u0440\u043E\u0435\u043A\u0442\u0430? filesystem_copyFile=\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u0430 msg_loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 report_err_bad_id=\u041F\u043B\u043E\u0445\u043E\u0439 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440! report_err_duplicate_id=\u042D\u0442\u043E\u0442 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0431\u0430\u0437\u0435! report_err_bad_name=\u041F\u043B\u043E\u0445\u043E\u0435 \u0438\u043C\u044F! report_err_bad_pw=\u041F\u0430\u0440\u043E\u043B\u0438 \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442! report_err_connect=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F \u0441 \u0431\u0430\u0437\u043E\u0439 \u043E\u0442\u0447\u0435\u0442\u043E\u0432! test_alert_exit=\u0412\u042B\u0425\u041E\u0414: \u0432 \u044D\u0442\u043E\u0439 \u0442\u043E\u0447\u043A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044F. test_alert_jump_to=\u0412 \u044D\u0442\u043E\u0439 \u0442\u043E\u0447\u043A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u043F\u0440\u044B\u0433\u043D\u0435\u0442 \u0432 \u043F\u0440\u043E\u0435\u043A\u0442: ftype_image=\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 ftype_audio=\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0435 \u0430\u0443\u0434\u0438\u043E ftype_midi=MIDI \u0444\u0430\u0439\u043B ftype_xml=XML \u0444\u0430\u0439\u043B ftype_anim=\u0410\u043D\u0438\u043C\u0430\u0446\u0438\u044F ftype_video=\u0426\u0438\u0444\u0440\u043E\u0432\u043E\u0435 \u0432\u0438\u0434\u0435\u043E ftype_font=\u0428\u0440\u0438\u0444\u0442 TrueType ftype_jclic=\u041F\u0440\u043E\u0435\u043A\u0442 JClic ftype_inst=\u0421\u043A\u0440\u0438\u043F\u0442-\u0438\u043D\u0441\u0442\u0430\u043B\u043B\u044F\u0442\u043E\u0440 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 JClic ftype_unknown=\u041D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0439 ftype_animated=\u0430\u043D\u0438\u043C\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 filefilter_fonts=\u0428\u0440\u0438\u0444\u0442\u044B (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=\u041F\u0440\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0435: about_window_systemInfo=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0435 about_window_projectInfo=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u0435 about_window_reportInfo=\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 about_otherCreditsCaption=\u042D\u0442\u043E\u0442 \u043F\u0440\u043E\u0434\u0443\u043A\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u041F\u041E, \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043D\u043E\u0435: msg_saving_project=\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u0430... filefilter_text=\u0422\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0435 \u0444\u0430\u0439\u043B\u044B (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=\u0410\u043D\u043B\u0438\u0439\u0441\u043A\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0439 JClic #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=\u0414\u0430\u043D\u043D\u0430\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u044B\u043C \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u044B\u043C \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0435\u043D\u0438\u0435\u043C. \u0412\u044B \u0432\u043F\u0440\u0430\u0432\u0435 \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u044F\u0442\u044C \u0435\u0435 \u0438/\u0438\u043B\u0438 \u043C\u043E\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0443\u0441\u043B\u043E\u0432\u0438\u044F\u043C\u0438 \u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u043E\u0439 \u041E\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0439 \u041B\u0438\u0446\u0435\u043D\u0437\u0438\u0438 GNU, \u043E\u043F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u043D\u043D\u043E\u0439 Free Software Foundation; \u043B\u0438\u0431\u043E \u0441 \u0443\u0441\u043B\u043E\u0432\u0438\u044F\u043C\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 2 \u043B\u0438\u0446\u0435\u043D\u0437\u0438\u0438, \u043B\u0438\u0431\u043E (\u043F\u043E \u0432\u0430\u0448\u0435\u043C\u0443 \u0432\u044B\u0431\u043E\u0440\u0443) \u043B\u044E\u0431\u044B\u043C\u0438 \u0431\u043E\u043B\u0435\u0435 \u043F\u043E\u0437\u0434\u043D\u0438\u043C\u0438 \u0432\u0435\u0440\u0441\u0438\u044F\u043C\u0438.
 
\u041C\u044B \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u044F\u0435\u043C \u0434\u0430\u043D\u043D\u0443\u044E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0443 \u0432 \u043D\u0430\u0434\u0435\u0436\u0434\u0435 \u043D\u0430 \u0442\u043E, \u0447\u0442\u043E \u043E\u043D\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0430\u043C \u043F\u043E\u043B\u0435\u0437\u043D\u043E\u0439, \u043E\u0434\u043D\u0430\u043A\u043E \u041D\u0415 \u041F\u0420\u0415\u0414\u041E\u0421\u0422\u0410\u0412\u041B\u042F\u0415\u041C \u041D\u0410 \u041D\u0415\u0415 \u041D\u0418\u041A\u0410\u041A\u0418\u0425 \u0413\u0410\u0420\u0410\u041D\u0422\u0418\u0419; \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0433\u0430\u0440\u0430\u043D\u0442\u0438\u0438 \u0422\u041E\u0412\u0410\u0420\u041D\u041E\u0413\u041E \u0421\u041E\u0421\u0422\u041E\u042F\u041D\u0418\u042F \u041F\u0420\u0418 \u041F\u0420\u041E\u0414\u0410\u0416\u0415 \u0438 \u041F\u0420\u0418\u0413\u041E\u0414\u041D\u041E\u0421\u0422\u0418 \u0414\u041B\u042F \u0418\u0421\u041F\u041E\u041B\u042C\u0417\u041E\u0412\u0410\u041D\u0418\u042F \u0412 \u041A\u041E\u041D\u041A\u0420\u0415\u0422\u041D\u042B\u0425 \u0426\u0415\u041B\u042F\u0425. \u0421\u043C\u043E\u0442\u0440\u0438\u0442\u0435 GNU General Public License \u0434\u043B\u044F \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0431\u043E\u043B\u0435\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438. src/core/edu/xtec/resources/messages/JClicMessages_tr.properties000066400000000000000000000230111335566474600254550ustar00rootroot00000000000000#JClic main messages label_time=zaman label_actions=Denemeler label_score=sonu\u00E7 Skin = G\u00F6r\u00FCn\u00FCm action_next_caption=Sonraki action_next_tooltip=Bir sonraki etkinlik action_prev_caption=\u00D6nceki action_prev_tooltip=Bir \u00F6nceki etkinlik action_reset_caption=Yeniden Ba\u015Fla action_reset_tooltip=Etkinli\u011Fi tekrar ba\u015Flat action_info_caption=Bilgi about_window_lb_project=Proje about_window_lb_languages=Diller about_window_lb_language=dil about_window_close_button=Geri about_window_caption=Hakk\u0131nda action_about_tooltip=Kullan\u0131c\u0131 raporlar\u0131 about_window_lb_report=Rapor about_window_browser_button=Taray\u0131c\u0131da g\u00F6r report_no_activities=Etkinlik raporu yok! report_system_standard=Rapor herhangi bir veritaban\u0131nda kaydedilmedi report_lb_time=Zaman msg_error_loading_sequence=Etkinlik dizisi y\u00FCklenirken hata olu\u015Ftu media_qt_error_initializing=QuickTime ba\u015Flat\u0131lam\u0131yor! media_check_url=messages/checkmedia.html filesystem_openURL=URL A\u00E7... filesystem_openFile=Dosya a\u00E7... filesystem_enterURL=Y\u00FCklenecek URL'yi giriniz. msg_error_executing_external=Komut \u00E7al\u0131\u015Ft\u0131r\u0131lamad\u0131: editor_moveDown_tooltip=Se\u00E7ilen \u00F6\u011Feyi a\u015Fa\u011F\u0131ya kayd\u0131r editor_moveUp_tooltip=Se\u00E7ilen \u00F6\u011Feyi yukar\u0131ya kayd\u0131r editor_moveDown=A\u015Fa\u011F\u0131 Kayd\u0131r editor_moveUp=Yukar\u0131 kayd\u0131r filefilter_all_images=Resim dosyalar\u0131 *.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG resim dosyas\u0131 filefilter_jpg=JPG resim dosyas\u0131 filefilter_gif=GIF resim dosyas\u0131 filesystem_saveURLerror=Salt okunur URL dosyalar\u0131 filefilter_all_clic=Clic 3.0 paketi (*.pac, *.pcc) filefilter_all=T\u00FCm dosyalar filefilter_all_jclic_clic=JClic ve Clic 3.0 projeleri (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic projeleri(*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 kompakt paket (*.pcc) filefilter_pac=Clic 3.0 open packages (*.pac) filefilter_jclic_zip=JClic s\u0131k\u0131\u015Ft\u0131r\u0131lm\u0131\u015F projeleri (*.jclic.zip) filefilter_jclic=JClic projeleri (*.jclic) about_window_lb_mediaSystem=\u00C7oklu ortam sistemi about_window_lb_level=Seviye about_window_lb_area=Alan report_num_actions=Eylem ger\u00E7ekle\u015Ftiriliyor: report_project=Proje: report_lb_totals=Toplam: report_num_projects=Projeler: report_session=Oturum: msg_warn_no_exec_in_applets=G\u00FCvenlik nedeniyle d\u0131\u015F programlar JClic i\u00E7erisinde \u00E7al\u0131\u015Ft\u0131r\u0131lm\u0131yor. msg_error_starting_activity=Etkinlik ba\u015Flat\u0131lam\u0131yor! msg_error_loading_project=Proje y\u00FCklenemiyor msg_error_playing_media=\u00C7oklu ortam oynatma hatas\u0131! msg_activity_finished=Etkinlik tamamland\u0131! msg_playing_media=\u00C7oklu ortam oynat\u0131l\u0131yor msg_activity_running=Etkinlik ba\u015Flat\u0131ld\u0131 msg_activity_ready=Etkinlik haz\u0131r msg_initializing=Ba\u015Flat\u0131l\u0131yor... msg_preparing_media=\u00C7oklu ortam haz\u0131rlan\u0131yor msg_error_loading_activity=Etkinlik y\u00FCkleme hatas\u0131 msg_loading_activity=Etkinlik y\u00FCkleniyor msg_loading_project=Proje y\u00FCkleniyor... msg_ready=Haz\u0131r err_reading_data=Dosya y\u00FCkleme hatas\u0131 err_file_save=Dosya kaydetme hatas\u0131! err_file_open=Dosya a\u00E7\u0131lam\u0131yor! report_started=Oturum ba\u015Flat\u0131ld\u0131 report_lb_score=Skor report_lb_actions=Eylemler report_lb_solved=Tamam report_lb_activity=Etkinlik report_lb_sequence=Etkinlik dizisi report_global_score=Genel sonu\u00E7: report_total_time=Etkinlikde ge\u00E7irilen toplam zaman: report_num_activities_solved=Etkinlikler tamam: report_num_activities=Etkinlikler ba\u015Flat\u0131l\u0131yor: report_num_sequences=Etkinlik dizisi report_system=Sistem raporu: report_user=Kullan\u0131c\u0131: report_not_finished=Etkinlik tamamlanmad\u0131 action_info_tooltip=Ek bilgi action_help_caption=Yard\u0131m action_help_tooltip=Bu etkinlik hakk\u0131nda yard\u0131m action_audio_caption=Sesler action_audio_tooltip=Ses a\u00E7/kapa about_window_lb_system=Sistem about_window_lb_total_mem=Toplam bellek about_window_lb_free_mem=Bo\u015F bellek about_window_lb_java_home=Java anasayfa about_window_lb_java_vm=Java sanal makine about_window_lb_java_version=Java s\u00FCr\u00FCm about_window_lb_os=\u0130\u015Fletim sistemi about_window_lb_version=S\u00FCr\u00FCm about_window_lb_descriptors=A\u00E7\u0131klay\u0131c\u0131lar about_window_lb_description=A\u00E7\u0131klama about_window_lb_history=Ge\u00E7mi\u015F about_window_lb_organizations=Kurumlar about_window_lb_organization=Kurum about_window_lb_authors=Yazarlar about_window_lb_author=Yazar about_window_lb_activity=Etkinlik help_window_close_button=Etkinli\u011Fe geri d\u00F6n help_window_caption=Yard\u0131m penceresi action_about_caption=Raporlar action_about_keys=RR action_audio_keys=SS action_help_keys=HT action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic proje kurucusu (*.jclic.inst) report_err_no_users=Rapor veritaban\u0131nda kullan\u0131c\u0131lar tan\u0131mlanmad\u0131! report_err_no_users_in_group=Rapor veritaban\u0131nda bu grup i\u00E7in kullan\u0131c\u0131lar tan\u0131mlanmad\u0131! report_new_user=Yeni kullan\u0131c\u0131... report_new_user_tooltip=Rapor veritaban\u0131nda yeni kullan\u0131c\u0131 olu\u015Ftur report_err_creating_user=Yeni kullan\u0131c\u0131 olu\u015Fturma hatas\u0131 report_select_user=Veri taban\u0131 raporlar\u0131 i\u00E7in kullan\u0131c\u0131 tan\u0131mlanmas\u0131 report_userlist_title=L\u00FCtfen isminizi se\u00E7iniz: report_ident_user=Kullan\u0131c\u0131 kimli\u011Fi report_name_prompt=\u0130sim: report_id_prompt=Giri\u015F: report_pw_prompt=\u015Eifre report_pw_prompt_confirm=\u015Eifreyi onaylay\u0131n\u0131z: report_new_user_data=Yeni kullan\u0131c\u0131 olu\u015Fturma report_err_bad_data=Hatal\u0131 veri! report_generic_group_name=Genel report_new_group=Yeni grup olu\u015Ftur... report_err_creating_group=yeni grup olu\u015Ftururken hata meydana geldi! report_grouplist_title=L\u00FCtfen grubunuzu se\u00E7iniz: report_new_group_data=Yeni kullan\u0131c\u0131lar grubu olu\u015Ftur report_err_invalid_user=B\u00F6yle bir kullan\u0131c\u0131 yok veya hatal\u0131 \u015Fifre. report_user_has_pwd=Bu hesap \u015Fifreyle korunmaktad\u0131r. report_err_init=Rapor sistemi ba\u015Flat\u0131l\u0131rken hata olu\u015Ftu. report_not_connected=ba\u011Fl\u0131 de\u011Fil report_err_creating=Rapor olu\u015Fturulurken hata olu\u015Ftu action_return_caption=Geri action_return_tooltip=Son men\u00FCye geri d\u00F6n action_return_keys=T* filefilter_all_sounds=Sesler (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI dosyalar\u0131 (*.mid) filefilter_all_video=Video dosyalar\u0131 (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 dosyalar\u0131 (*.swf) filefilter_skins=D\u0131\u015F g\u00F6r\u00FCn\u00FCmler (*.xml) filefilter_all_media=T\u00FCm ortam dosyalar\u0131 filesystem_copyToRoot_1=Dosya filesystem_copyToRoot_2=Ge\u00E7erli proje klas\u00F6r\u00FCn\u00FCn d\u0131\u015F\u0131nda filesystem_copyToRoot_3=T\u00FCm dosyalar\u0131n ayn\u0131 klas\u00F6rde olmas\u0131 \u00F6nerilir filesystem_copyToRoot_4=Se\u00E7ili dosyalar\u0131 proje klas\u00F6r\u00FCne kopyalamak istiyormusunuz? filesystem_copyFile=Dosya kopyalan\u0131yor msg_loading=Y\u00FCkleniyor report_err_bad_id=Hatal\u0131 kullan\u0131c\u0131! report_err_duplicate_id=Veri taban\u0131nda mevcut! report_err_bad_name=\u0130sim hatal\u0131! report_err_bad_pw=\u015Eifre kullan\u0131c\u0131 ad\u0131na kar\u015F\u0131l\u0131k gelmiyor! report_err_connect=Rapor veritaban\u0131na ba\u011Flanma hatas\u0131! test_alert_exit=\u00C7IK: Bu noktada program kapat\u0131lacakt\u0131r. test_alert_jump_to=Bu noktada program projeye ge\u00E7i\u015F yapacakt\u0131r: ftype_image=Resim ftype_audio=Dijital ses ftype_midi=Midi dosyas\u0131 ftype_xml=XML dosyas\u0131 ftype_anim=Canland\u0131rma ftype_video=Dijital video ftype_font=TrueType yaz\u0131tipi ftype_jclic=JClic projesi ftype_inst=JClic proje kurulum skripti ftype_unknown=Bilinmeyen ftype_animated=canland\u0131r\u0131ld\u0131 filefilter_fonts=Yaz\u0131tipleri (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML belgeleri (*.htm, *.html) about_creditsDoc=hakk\u0131nda/katk\u0131da bulunanlar.html about_licenseDoc=hakk\u0131nda/lisans.html about_sponsorsCaption=Katk\u0131da bulunanlar: about_window_systemInfo=Sistem bilgisi about_window_projectInfo=Ge\u00E7erli proje bilgisi about_window_reportInfo=Ge\u00E7erli oturum sonu\u00E7lar\u0131 about_otherCreditsCaption=Bu \u00FCr\u00FCn a\u015Fa\u011F\u0131daki ki\u015Filer veya kurumlar taraf\u0131ndan geli\u015Ftirilen yaz\u0131l\u0131mlar\u0131 i\u00E7ermektedir: msg_saving_project=Proje kaydediliyor... filefilter_text=Metin dosyalar\u0131 *.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Turkish version by Ahmet YAVUZ #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. src/core/edu/xtec/resources/messages/JClicMessages_vec.properties000066400000000000000000000227061335566474600256170ustar00rootroot00000000000000#JClic main messages label_time=tenpo label_actions=tentadivi label_score=pontexio Skin = Skin action_next_caption=Invanti action_next_tooltip=Pr\u00F2sima ativit\u00E0 action_prev_caption=Indr\u00ECo action_prev_tooltip=Ativit\u00E0 presedente action_reset_caption=Inv\u00ECa da novo action_reset_tooltip=Inv\u00ECa ativit\u00E0 da novo action_info_caption=Informasion about_window_lb_project=Proj\u00E8to about_window_lb_languages=lengue about_window_lb_language=lengua about_window_close_button=Torna a programa about_window_caption=Altre informasion action_about_tooltip=Reports utenti about_window_lb_report=Report about_window_browser_button=Vedi inte 'l navegador report_no_activities=No x\u00E9 st\u00E0 report\u00E0 ativit\u00E0! report_system_standard=Report no registr\u00E0 inte nisun database report_lb_time=Tenpo msg_error_loading_sequence=Ghe x\u00E9 st\u00E0 un eror a cargando \u019Aa secuensa media_qt_error_initializing=Ghe x\u00E9 st\u00E0 un eror a inviando QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=V\u00E8rxi URL... filesystem_openFile=V\u00E8rxi file... filesystem_enterURL=Inserisi el indriso URL de \u019Aa resorsa da cargar msg_error_executing_external=Ghe x\u00E9 st\u00E0 un eror a exeguindo el comando editor_moveDown_tooltip=Sp\u00F2sta 'l elemento se\u019Aesion\u00E0 in xoxo editor_moveUp_tooltip=Sp\u00F2sta 'l elemento se\u019Aesion\u00E0 in suxo editor_moveDown=Sp\u00F2sta in xoxo editor_moveUp=Sp\u00F2sta in suxo filefilter_all_images=Files de im\u00E0xene (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=Im\u00E0jine PNG filefilter_jpg=Ima\u00E0jine JPG filefilter_gif=Im\u00E0xine GIF filesystem_saveURLerror=I file bax\u00E0i so URL i x\u00E9 a letura nemech\u00E9 filefilter_all_clic=Pacheti de Cloc 3.0 (*.pac, *.pcc) filefilter_all=Tuti i files filefilter_all_jclic_clic=Prox\u00E8ti JClic e Clic 3.0 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=Prox\u00E8ti JClic(*.jclic, *.jclic.zip) filefilter_pcc=Pacheti conpat\u00E0i Clic 3.0 (*.pcc) filefilter_pac=Pacheti open de JClic (*.pac) filefilter_jclic_zip=Proj\u00E8ti zip\u00E0i de JClic (*.jclic.zip) filefilter_jclic=Prox\u00E8ti JClic (*.jclic) about_window_lb_mediaSystem=Sist\u00E8ma multimedial about_window_lb_level=Liv\u00E8\u019Ao about_window_lb_area=Area report_num_actions=Asion exegu\u00ECe report_project=Prox\u00E8to: report_lb_totals=Total: report_num_projects=Prox\u00E8ti: report_session=Sesion: msg_warn_no_exec_in_applets=Par motivi de seguresa, inte \u019Ae applet JClic x\u00E9 dexativ\u00E0 \u019Aa execusion de programi est\u00E8rni msg_error_starting_activity=Ghe x\u00E9 st\u00E0 un eror a inviando \u019Aa ativit\u00E0! msg_error_loading_project=Ghe x\u00E9 st\u00E0 un eror a cargando un prox\u00E8to msg_error_playing_media=Ghe x\u00E9 st\u00E0 un eror a exegiondo el media! msg_activity_finished=Ativit\u00E0 terminada! msg_playing_media=Drio exeguir el media msg_activity_running=Ativit\u00E0 in corso msg_activity_ready=Ativit\u00E0 pronta msg_initializing=Inv\u00ECo... msg_preparing_media=Drio parecial el media msg_error_loading_activity=Ghe x\u00E9 st\u00E0 un eror a cargando \u019Aa ativit\u00E0 msg_loading_activity=Drio cargar \u019Aa ativit\u00E0 msg_loading_project=Drio cargar el poj\u00E8to msg_ready=Pronto err_reading_data=Ghe x\u00E9 st\u00E0 un eror a cargando el file err_file_save=Ghe x\u00E9 st\u00E0 un eror a salvando el file err_file_open=Ghe x\u00E9 st\u00E0 un aror a verxindo el file report_started=Sesion inviada: report_lb_score=Pontexio report_lb_actions=Asion report_lb_solved=OK report_lb_activity=Ativit\u00E0 report_lb_sequence=Secuensa report_global_score=Pontexio global report_total_time=Tenpo total so \u019Ae ativit\u00E0 report_num_activities_solved=Ativit\u00E0 ok: report_num_activities=Ativit\u00E0 fate: report_num_sequences=Secuense: report_system=Sist\u00E8ma de report report_user=Utente: report_not_finished=Ativit\u00E0 gnancora terminada action_info_tooltip=Informasion de xonta action_help_caption=\u00C0ida action_help_tooltip=\u00C0ida so sta ativit\u00E0 action_audio_caption=Son\u00F2ri action_audio_tooltip=Ativa/dexativa son\u00F2ri about_window_lb_system=Sist\u00E8ma about_window_lb_total_mem=Mem\u00F2ria total about_window_lb_free_mem=Mem\u00F2ria \u019A\u00ECbara about_window_lb_java_home=Home de Java about_window_lb_java_vm=Visrtual machine Java about_window_lb_java_version=Version de Java about_window_lb_os=Sist\u00E8ma operadivo about_window_lb_version=Version about_window_lb_descriptors=Descritori about_window_lb_description=Descrision about_window_lb_history=Crono\u019Aox\u00ECa about_window_lb_organizations=Organexasion about_window_lb_organization=Organexasion about_window_lb_authors=Autori about_window_lb_author=Autor about_window_lb_activity=Ativit\u00E0 help_window_close_button=Indr\u00ECo a ativit\u00E0 help_window_caption=Fen\u00E8stra de \u00E0ida action_about_caption=Reports action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R** filefilter_install=Ista\u019Aadori de prox\u00E8ti JClic (*.jclic.inst) report_err_no_users=No x\u00E9 st\u00E0 defin\u00ECo nisun utente inte 'l database de i reports! report_err_no_users_in_group=No x\u00E9 st\u00E0 defin\u00ECo nisun utente par sto grupo inte 'l database de i reports! report_new_user=Utente niovo... report_new_user_tooltip=Definisi utente niovo inte 'l database de i reports report_err_creating_user=Ghe x\u00E9 st\u00E0 un eror a definindo 'l utente niovo report_select_user=Identifegasion de 'l utente par el database de i reports report_userlist_title=Desernisi el to n\u00F2me report_ident_user=Identifegasion utente report_name_prompt=N\u00F2me: report_id_prompt=Login: report_pw_prompt=Password: report_pw_prompt_confirm=Conferma password: report_new_user_data=Definision utente niovo: report_err_bad_data=Dati sbali\u00E0i! report_generic_group_name=X\u00E8n\u00E8rico report_new_group=Inv\u00ECa un grupo niovo... report_err_creating_group=Ghe x\u00E9 st\u00E0 un eror a inviando el grupo niovo! report_grouplist_title=Desernisi el to grupo: report_new_group_data=Definision de un novo grupo de utenti: report_err_invalid_user=Manca ID utente o \u019Aa password \u019Aa x\u00E9 sbaliada report_user_has_pwd=Sto account el x\u00E9 protexesto da password report_err_init=Ghe x\u00E9 st\u00E0 un eror a inviando el sist\u00E8ma de report. report_not_connected=no conet\u00E0 report_err_creating=Ghe x\u00E9 st\u00E0 un eror definindo 'l agente de reports action_return_caption=Torna a programa action_return_tooltip=Indr\u00ECo a \u00F9ltimo menu action_return_keys=T* filefilter_all_sounds=Son\u00F2ri (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=Files MIDI (*.mid) filefilter_all_video=Files video (*.avi, *.mov, *.mpeg) filefilter_all_anim=Files Flash 2.0 (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=Tutii files media filesystem_copyToRoot_1=El file filesystem_copyToRoot_2=el x\u00E9 fora de \u019Aa cart\u00E8\u019Aa de 'l proj\u00E8to in corso. filesystem_copyToRoot_3=X\u00E8 ben aver tuti i files inte \u019Aa stesa cart\u00E8\u019Aa filesystem_copyToRoot_4=Vusto copiar el file desern\u00ECo inte \u019Aa cart\u00E8\u019Aa de 'l proj\u00E8to? filesystem_copyFile=C\u00F2pia de 'l file msg_loading=Cargamento report_err_bad_id=Identifegador no cor\u00E8to! report_err_duplicate_id=Ghe x\u00E9 x\u00E0 sto identifegador inte 'l database! report_err_bad_name=N\u00F2me no cor\u00E8to! report_err_bad_pw=\u023De passwords no \u019Ae conbina! report_err_connect=Ghe x\u00E9st\u00E0 un eror de conesion a 'l database de i reports! test_alert_exit=INSIDA: a sto ponto fenise el programa. test_alert_jump_to=A sto ponto el programa el saltar\u00E0 a 'l proj\u00E8to: ftype_image=Im\u00E0xene ftype_audio=Audio digital ftype_midi=File MIDI ftype_xml=File XML ftype_anim=Anemasion ftype_video=Video digital ftype_font=Font True Type ftype_jclic=Proj\u00E8to de JClic ftype_inst=Script de ista\u019Aador de proj\u00E8to JClic ftype_unknown=Desconosesto ftype_animated=anem\u00E0 filefilter_fonts=Fonts (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=Documenti HTML (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=Co' el sup\u00F2rto de: about_window_systemInfo=Informasion so 'l sist\u00E8ma about_window_projectInfo=Informasion proj\u00E8to corente about_window_reportInfo=Rexultadi sesion corente about_otherCreditsCaption=Sto prodoto el g\u00E0 indrento software svi\u019Aup\u00E0 da: msg_saving_project=Drio salvar proj\u00E8to... filefilter_text=Files de t\u00E8sto (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=Version v\u00E8neta (tfo) de Fabio Lazarin #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=Sto programa el x\u00E9 un software l\u00ECbaro; te pol redistribuirlo e/o modifegarlo soto i t\u00E8rmini de \u019Aa licensa GNU General Public License come public\u00E0 da \u019Aa Free Software Foundation; version 2 de \u019Aa Licensa o (a to discresion) \u00F2gni version sucesiva.
 
Sto programa el x\u00E9 destribu\u00ECo inte \u019Aa speransa che el p\u00F2se deventar \u00F9ti\u019Ae, ma SENSA NISUNA GARANS\u00CCA; anca sensa \u019Aa garans\u00ECa sotointexa de prodoto de utilit\u00E0 e destinasion a un sc\u00F2po partico\u019Aar. Vedi el documento GNU General Public License par altri detali. src/core/edu/xtec/resources/messages/JClicMessages_wo.properties000066400000000000000000000176631335566474600254750ustar00rootroot00000000000000#JClic main messages label_time=time label_actions=tries label_score=score Skin = Skin action_next_caption=Next action_next_tooltip=Next activity action_prev_caption=Previous action_prev_tooltip=Previous activity action_reset_caption=Restart action_reset_tooltip=Restart activity action_info_caption=Information about_window_lb_project=Project about_window_lb_languages=languages about_window_lb_language=language about_window_close_button=Return about_window_caption=About action_about_tooltip=User reports about_window_lb_report=Report about_window_browser_button=View in browser report_no_activities=No activities reported! report_system_standard=Report not registered in any DB report_lb_time=Time msg_error_loading_sequence=Error loading sequence media_qt_error_initializing=Error initializing QuickTime! media_check_url=messages/checkmedia.html filesystem_openURL=Open URL... filesystem_openFile=Open file... filesystem_enterURL=Please enter the URL to the resource to be loaded. msg_error_executing_external=Error executing the command: editor_moveDown_tooltip=Move the selected element down editor_moveUp_tooltip=Move the selected element up editor_moveDown=Move down editor_moveUp=Move up filefilter_all_images=Image files (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG images filefilter_jpg=JPG images filefilter_gif=GIF images filesystem_saveURLerror=URL-based files are read-only. filefilter_all_clic=Clic 3.0 packages (*.pac, *.pcc) filefilter_all=All files filefilter_all_jclic_clic=JClic and Clic 3.0 projects (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic projects (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 compact packages (*.pcc) filefilter_pac=Clic 3.0 open packages (*.pac) filefilter_jclic_zip=JClic compressed projects (*.jclic.zip) filefilter_jclic=JClic projects (*.jclic) about_window_lb_mediaSystem=Multimedia system about_window_lb_level=Level about_window_lb_area=Area report_num_actions=Actions done: report_project=Project: report_lb_totals=Total: report_num_projects=Projects: report_session=Session: msg_warn_no_exec_in_applets=For security reasons, execution of external programs is disabled in JClic applets. msg_error_starting_activity=Error starting activity! msg_error_loading_project=Error loading project msg_error_playing_media=Error playing media! msg_activity_finished=Activity finished! msg_playing_media=Playing media msg_activity_running=Activity running msg_activity_ready=Activity ready msg_initializing=Initializing... msg_preparing_media=Preparing media msg_error_loading_activity=Error loading activity msg_loading_activity=Loading activity msg_loading_project=Loading project... msg_ready=Ready err_reading_data=Error loading file err_file_save=Error saving file! err_file_open=Error opening file! report_started=Session started: report_lb_score=Score report_lb_actions=Actions report_lb_solved=Ok report_lb_activity=Activity report_lb_sequence=Sequence report_global_score=Global score: report_total_time=Total time on activities: report_num_activities_solved=Activities ok: report_num_activities=Activities done: report_num_sequences=Sequences: report_system=Report system: report_user=User: report_not_finished=Activity not finished action_info_tooltip=Additional information action_help_caption=Help action_help_tooltip=Help about this activity action_audio_caption=Sounds action_audio_tooltip=Enable/disable sounds about_window_lb_system=System about_window_lb_total_mem=Total memory about_window_lb_free_mem=Free memory about_window_lb_java_home=Java home about_window_lb_java_vm=Java virtual machine about_window_lb_java_version=Java version about_window_lb_os=Operating system about_window_lb_version=Version about_window_lb_descriptors=Descriptors about_window_lb_description=Description about_window_lb_history=History about_window_lb_organizations=Organizations about_window_lb_organization=Organization about_window_lb_authors=Authors about_window_lb_author=Author about_window_lb_activity=Activity help_window_close_button=Return to activity help_window_caption=Help window action_about_caption=Reports action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic project installers (*.jclic.inst) report_err_no_users=No users defined in the reports database! report_err_no_users_in_group=No users defined for this group in the reports database! report_new_user=New user... report_new_user_tooltip=Create a new user in the reports database report_err_creating_user=Error creating new user! report_select_user=User identification for the reports database report_userlist_title=Please select your name: report_ident_user=User identification report_name_prompt=Name: report_id_prompt=Login: report_pw_prompt=Password: report_pw_prompt_confirm=Confirm password: report_new_user_data=Creation of a new user: report_err_bad_data=Incorrect data! report_generic_group_name=Generic report_new_group=Create a new group... report_err_creating_group=Error creating the new group! report_grouplist_title=Please select your group: report_new_group_data=Creation of a new users group: report_err_invalid_user=Missing user ID or incorrect password. report_user_has_pwd=This account is password-protected. report_err_init=Error initializing report system. report_not_connected=not connected report_err_creating=Error creating reports agent action_return_caption=Return action_return_tooltip=Return to the last menu action_return_keys=T* filefilter_all_sounds=Sounds (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI files (*.mid) filefilter_all_video=Video files (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 files (*.swf) filefilter_skins=Skins (*.xml) filefilter_all_media=All media files filesystem_copyToRoot_1=The file filesystem_copyToRoot_2=is out of the current project's folder. filesystem_copyToRoot_3=It's advisable to have all the files in the same folder. filesystem_copyToRoot_4=Do you want to copy the selected file to the project's folder? filesystem_copyFile=Copying file msg_loading=Loading report_err_bad_id=Bad identifier! report_err_duplicate_id=This identifier already exists in the database! report_err_bad_name=Bad name! report_err_bad_pw=Passwords don't match! report_err_connect=Error connecting to the reports database! test_alert_exit=EXIT: At this point, the program will exit. test_alert_jump_to=At this point the program will jump to the project: ftype_image=Image ftype_audio=Digital audio ftype_midi=MIDI file ftype_xml=XML file ftype_anim=Animation ftype_video=Digital video ftype_font=TrueType font ftype_jclic=JClic project ftype_inst=JClic project installer script ftype_unknown=Unknown ftype_animated=animated filefilter_fonts=Fonts (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML documents (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=With the support of: about_window_systemInfo=System information about_window_projectInfo=Current project info about_window_reportInfo=Current session results about_otherCreditsCaption=This product includes software developed by: msg_saving_project=Saving project... filefilter_text=Text files (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=English version, by The JClic team #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. src/core/edu/xtec/resources/messages/JClicMessages_zh_TW.properties000066400000000000000000000245671335566474600261040ustar00rootroot00000000000000#JClic main messages label_time=\u6642\u9593 label_actions=\u5617\u8A66\u6B21\u6578 label_score=\u5206\u6578 Skin = \u5916\u89C0 action_next_caption=\u4E0B\u4E00\u9996 action_next_tooltip=\u4E0B\u4E00\u500B\u6D3B\u52D5 action_prev_caption=\u4E0A\u4E00\u9801 action_prev_tooltip=\u4E0A\u4E00\u500B\u6D3B\u52D5 action_reset_caption=\u91CD\u65B0\u958B\u59CB action_reset_tooltip=\u91CD\u8A2D\u6D3B\u52D5 action_info_caption=\u76F8\u95DC\u8CC7\u8A0A about_window_lb_project=\u5C08\u6848 about_window_lb_languages=\u8A9E\u8A00 about_window_lb_language=\u8A9E\u8A00 about_window_close_button=\u8FD4\u56DE about_window_caption=\u95DC\u65BC action_about_tooltip=\u4F7F\u7528\u8005\u5831\u544A about_window_lb_report=\u5831\u544A about_window_browser_button=\u5728\u700F\u89BD\u5668\u6AA2\u8996 report_no_activities=\u6C92\u6709\u6D3B\u52D5\u5831\u544A report_system_standard=\u56DE\u5831\u5728DB\u4E2D\u7121\u8A3B\u518A report_lb_time=\u6642\u9593 msg_error_loading_sequence=\u8F09\u5165\u9806\u5E8F\u932F\u8AA4 media_qt_error_initializing=QuickTime \u521D\u59CB\u5316\u932F\u8AA4\uFF01 media_check_url=messages/checkmedia.html filesystem_openURL=\u958B\u555F URL... filesystem_openFile=\u958B\u555F\u6A94\u6848... filesystem_enterURL=\u8ACB\u9032\u5165URL\u4F86\u8F09\u5165\u8CC7\u6E90 msg_error_executing_external=\u57F7\u884C\u6307\u4EE4\u932F\u8AA4\uFF1A editor_moveDown_tooltip=\u5411\u4E0B\u79FB\u52D5\u9078\u53D6\u7684\u5143\u4EF6 editor_moveUp_tooltip=\u5411\u4E0A\u79FB\u52D5\u9078\u53D6\u7684\u5143\u4EF6 editor_moveDown=\u4E0B\u79FB editor_moveUp=\u4E0A\u79FB filefilter_all_images=\u5F71\u50CF\u6A94 (*.gif, *.jpg, *.png, *.bmp, *.ico) filefilter_png=PNG \u6A94 filefilter_jpg=JPG \u6A94 filefilter_gif=GIF \u6A94 filesystem_saveURLerror=URL-based\u6A94\u50C5\u53EF\u552F\u8B80 filefilter_all_clic=Clic 3.0 \u5957\u4EF6 (*.pac, *.pcc) filefilter_all=\u6240\u6709\u6A94\u6848 filefilter_all_jclic_clic=JClic \u8207 Clic 3.0 \u5C08\u6848 (*.jclic, *.jclic.zip, *.pac, *.pcc) filefilter_all_jclic=JClic \u5C08\u6848 (*.jclic, *.jclic.zip) filefilter_pcc=Clic 3.0 \u7D44\u88DD\u5305 (*.pcc) filefilter_pac=Clic 3.0 \u958B\u653E\u5305 (*.pac) filefilter_jclic_zip=JClic \u58D3\u7E2E\u5C08\u6848 (*.jclic.zip) filefilter_jclic=JClic \u5C08\u6848 (*.jclic) about_window_lb_mediaSystem=\u591A\u5A92\u9AD4\u7CFB\u7D71 about_window_lb_level=\u7B49\u7D1A about_window_lb_area=\u5340\u57DF report_num_actions=\u6D3B\u52D5\u5B8C\u6210\uFF1A report_project=\u5C08\u6848\uFF1A report_lb_totals=\u7E3D\u8A08\uFF1A report_num_projects=\u5C08\u6848\uFF1A report_session=\u4F5C\u696D\u968E\u6BB5\uFF1A msg_warn_no_exec_in_applets=\u57FA\u65BC\u5B89\u5168\u8003\u91CF\uFF0C\u57F7\u884C\u5728JClic applet\u7684\u5916\u90E8\u7A0B\u5E8F\u88AB\u7981\u7528\u3002 msg_error_starting_activity=\u6D3B\u52D5\u958B\u59CB\u932F\u8AA4 msg_error_loading_project=\u8F09\u5165\u5C08\u6848\u932F\u8AA4 msg_error_playing_media=\u64AD\u653E\u5A92\u9AD4\u932F\u8AA4 msg_activity_finished=\u6D3B\u52D5\u5B8C\u6210\uFF01 msg_playing_media=\u64AD\u653E\u5A92\u9AD4 msg_activity_running=\u6D3B\u52D5\u9032\u884C\u4E2D msg_activity_ready=\u6D3B\u52D5\u6E96\u5099 msg_initializing=\u6B63\u5728\u521D\u59CB\u5316... msg_preparing_media=\u5A92\u9AD4\u6E96\u5099\u4E2D msg_error_loading_activity=\u6D3B\u52D5\u8F09\u5165\u932F\u8AA4 msg_loading_activity=\u6D3B\u52D5\u8F09\u5165\u4E2D msg_loading_project=\u5C08\u6848\u8F09\u5165\u4E2D... msg_ready=\u6E96\u5099\u5C31\u7DD2 err_reading_data=\u6A94\u6848\u8F09\u5165\u932F\u8AA4 err_file_save=\u6A94\u6848\u5132\u5B58\u932F\u8AA4\uFF01 err_file_open=\u958B\u59CB\u6A94\u6848\u932F\u8AA4\uFF01 report_started=\u5DE5\u4F5C\u958B\u59CB\uFF1A report_lb_score=\u5206\u6578 report_lb_actions=\u52D5\u4F5C report_lb_solved=\u78BA\u5B9A report_lb_activity=\u6D3B\u52D5 report_lb_sequence=\u9806\u5E8F report_global_score=\u7E3D\u6210\u7E3E report_total_time=\u6D3B\u52D5\u7E3D\u6642\u9593 report_num_activities_solved=\u6D3B\u52D5\u5B8C\u6210 report_num_activities=\u6D3B\u52D5\u7D50\u675F report_num_sequences=\u9806\u5E8F\uFF1A report_system=\u5831\u544A\u7CFB\u7D71 report_user=\u4F7F\u7528\u8005: report_not_finished=\u6D3B\u52D5\u6C92\u6709\u5B8C\u6210 action_info_tooltip=\u984D\u5916\u8CC7\u8A0A action_help_caption=\u8AAA\u660E action_help_tooltip=\u6D3B\u52D5\u5E6B\u52A9 action_audio_caption=\u97F3\u6548 action_audio_tooltip=\u555F\u7528/\u505C\u7528 \u97F3\u6548 about_window_lb_system=\u7CFB\u7D71 about_window_lb_total_mem=\u5168\u90E8\u8A18\u61B6\u9AD4 about_window_lb_free_mem=\u672A\u7528\u8A18\u61B6\u9AD4 about_window_lb_java_home=Java \u9996\u9801 about_window_lb_java_vm=Java \u865B\u64EC\u6A5F\u5668 about_window_lb_java_version=Java\u7248\u672C about_window_lb_os=\u4F5C\u696D\u7CFB\u7D71 about_window_lb_version=\u7248\u672C about_window_lb_descriptors=\u63CF\u8FF0 about_window_lb_description=\u63CF\u8FF0 about_window_lb_history=\u6B77\u53F2\u7D00\u9304 about_window_lb_organizations=\u7D44\u7E54 about_window_lb_organization=\u7D44\u7E54 about_window_lb_authors=\u4F5C\u8005 about_window_lb_author=\u958B\u767C\u8005 about_window_lb_activity=\u6D3B\u52D5 help_window_close_button=\u8FD4\u56DE\u6D3B\u52D5 help_window_caption=\u8AAA\u660E\u8996\u7A97 action_about_caption=\u5831\u544A action_about_keys=RR action_audio_keys=SS action_help_keys=HH action_info_keys=II action_next_keys=N* action_prev_keys=P* action_reset_keys=R* filefilter_install=JClic \u5B89\u88DD\u5C08\u6848 (*.jclic.inst) report_err_no_users=\u5728\u5831\u544A\u8CC7\u6599\u5EAB\u4E2D\u6C92\u6709\u4F7F\u7528\u8005\u88AB\u5B9A\u7FA9 report_err_no_users_in_group=\u5728\u5831\u544A\u8CC7\u6599\u5EAB\u7FA4\u7D44\u4E2D\u6C92\u6709\u4F7F\u7528\u8005\u88AB\u5B9A\u7FA9 report_new_user=\u65B0\u4F7F\u7528\u8005... report_new_user_tooltip=\u5728\u5831\u544A\u8CC7\u6599\u5EAB\u5EFA\u7ACB\u65B0\u4F7F\u7528\u8005 report_err_creating_user=\u5EFA\u7ACB\u65B0\u4F7F\u7528\u8005\u932F\u8AA4\uFF01 report_select_user=\u5831\u544A\u8CC7\u6599\u5EAB\u7684\u4F7F\u7528\u8005\u8A8D\u8B49 report_userlist_title=\u8ACB\u9078\u53D6\u60A8\u7684\u59D3\u540D\uFF1A report_ident_user=\u4F7F\u7528\u8005\u8A8D\u8B49 report_name_prompt=\u540D\u7A31: report_id_prompt=\u5E33\u865F\uFF1A report_pw_prompt=\u5BC6\u78BC\uFF1A report_pw_prompt_confirm=\u78BA\u8A8D\u5BC6\u78BC\uFF1A report_new_user_data=\u5EFA\u7ACB\u65B0\u4F7F\u7528\u8005\uFF1A report_err_bad_data=\u4E0D\u6B63\u78BA\u7684\u8CC7\u6599\uFF01 report_generic_group_name=\u4E00\u822C report_new_group=\u5EFA\u7ACB\u65B0\u7684\u7FA4\u7D44 report_err_creating_group=\u5EFA\u7ACB\u65B0\u7FA4\u7D44\u932F\u8AA4\uFF01 report_grouplist_title=\u8ACB\u9078\u64C7\u60A8\u7684\u7FA4\u7D44 report_new_group_data=\u5EFA\u7ACB\u65B0\u7684\u4F7F\u7528\u8005\u7FA4\u7D44 report_err_invalid_user=\u932F\u8AA4\u7684\u4F7F\u7528\u8005\u5E33\u865F\u6216\u4E0D\u6B63\u78BA\u7684\u5BC6\u78BC\u3002 report_user_has_pwd=\u9019\u500B\u5E33\u865F\u6709\u5BC6\u78BC\u4FDD\u8B77\u3002 report_err_init=\u5831\u544A\u7CFB\u7D71\u521D\u59CB\u5316\u932F\u8AA4\u3002 report_not_connected=\u672A\u9023\u7DDA report_err_creating=\u5EFA\u7ACB\u5831\u544A\u6642\u767C\u751F\u932F\u8AA4 action_return_caption=\u8FD4\u56DE action_return_tooltip=\u8FD4\u56DE\u5230\u6700\u5F8C\u7684\u9078\u55AE action_return_keys=T* filefilter_all_sounds=\u97F3\u6548 (*.wav, *.mp3, *.ogg, *.au, *.aiff) filefilter_midi=MIDI \u6A94 (*.mid) filefilter_all_video=\u5F71\u7247\u6A94 (*.avi, *.mov, *.mpeg) filefilter_all_anim=Flash 2.0 \u6A94 (*.swf) filefilter_skins=\u6A21\u677F (*.xml) filefilter_all_media=\u6240\u6709\u5A92\u9AD4\u6A94\u6848 filesystem_copyToRoot_1=\u6A94\u6848 filesystem_copyToRoot_2=\u4E0D\u5728\u76EE\u524D\u7684\u5C08\u6848\u8CC7\u6599\u593E filesystem_copyToRoot_3=\u5728\u540C\u4E00\u6587\u4EF6\u593E\u4E0B\u7684\u6240\u6709\u6587\u4EF6\u662F\u53EF\u4F7F\u7528\u7684\u3002 filesystem_copyToRoot_4=\u60A8\u8981\u8907\u88FD\u6240\u9078\u53D6\u7684\u6A94\u6848\u5230\u5C08\u6848\u8CC7\u6599\u593E\u55CE\uFF1F filesystem_copyFile=\u8907\u88FD\u6A94\u6848 msg_loading=\u8F09\u5165\u4E2D report_err_bad_id=\u8FA8\u8B58\u78BC\u6709\u8AA4\uFF01 report_err_duplicate_id=\u9019\u500B\u9A57\u8B49\u78BC\u5DF2\u7D93\u51FA\u73FE\u5728\u8CC7\u6599\u5EAB\u4E2D\uFF01 report_err_bad_name=\u540D\u7A31\u6709\u8AA4\uFF01 report_err_bad_pw=\u5169\u6B21\u8F38\u5165\u7684\u5BC6\u78BC\u4E0D\u7B26\uFF01 report_err_connect=\u9023\u7DDA\u5230\u5831\u544A\u8CC7\u6599\u5EAB\u932F\u8AA4\uFF01 test_alert_exit=\u96E2\u958B:\u5728\u9019\u60C5\u6CC1\uFF0C\u7A0B\u5F0F\u5C07\u6703\u7D50\u675F test_alert_jump_to=\u5728\u9019\u60C5\u6CC1\uFF0C\u7A0B\u5F0F\u5C07\u6703\u8DF3\u81F3\u5C08\u6848 ftype_image=\u5F71\u50CF ftype_audio=\u6578\u4F4D\u97F3\u6A02 ftype_midi=MIDI \u6A94 ftype_xml=XML \u6A94 ftype_anim=\u52D5\u756B ftype_video=\u6578\u4F4D\u5F71\u7247 ftype_font=TrueType \u5B57\u578B\u6A94 ftype_jclic=JClic \u5C08\u6848 ftype_inst=JClic\u5C08\u6848\u5B89\u88DD\u8173\u672C ftype_unknown=\u672A\u77E5 ftype_animated=\u52D5\u756B filefilter_fonts=\u5B57\u578B (*.ttf) editor_moveUp_keys=U#38 editor_moveDown_keys=W#40 filefilter_all_html=HTML \u6587\u4EF6 (*.htm, *.html) about_creditsDoc=about/credits.html about_licenseDoc=about/license.html about_sponsorsCaption=\u652F\u6301: about_window_systemInfo=\u7CFB\u7D71\u8CC7\u8A0A about_window_projectInfo=\u76EE\u524D\u5C08\u6848\u8CC7\u8A0A about_window_reportInfo=\u672C\u6B21\u57F7\u884C\u7D50\u679C about_otherCreditsCaption=\u672C\u7522\u54C1\u5305\u542B\u8EDF\u9AD4\u88FD\u4F5C: msg_saving_project=\u5132\u5B58\u5C08\u6848\u4E2D... filefilter_text=\u6587\u5B57\u6A94 (*.txt) #Translation credits displayed on the about window, in HTML format html_translation_credits=\u82F1\u6587\u7248\uFF0C\u7531The JClic team\u88FD\u4F5C #Abstract of the GPL license, version 2.0, as shown on the About window html_gpl_license=\u672C\u7A0B\u5F0F\u662F\u81EA\u7531\u8EDF\u9AD4\uFF0C\u60A8\u53EF\u4EE5\u85C9\u7531\u81EA\u7531\u8EDF\u9AD4\u57FA\u91D1\u6703\u7684GNU\u901A\u7528\u516C\u5171\u6388\u6B0A\u689D\u6B3E\u4E0B\uFF0C\u91CD\u65B0\u88FD\u4F5C\u6216\u4FEE\u6539\u5B83\uFF1B\u5F9E\u7B2C\u4E8C\u7248\u7684\u8A31\u53EF\uFF0C\u6216\uFF08\u7531\u4F60\u9078\u64C7\uFF09\u4EFB\u4F55\u66F4\u65B0\u7684\u7248\u672C\u3002
 
\u6B64\u7A0B\u5F0F\u5206\u914D\u5E0C\u671B\u9019\u5C07\u662F\u6709\u76CA\u7684\uFF0C\u4F46\u6C92\u6709\u4EFB\u4F55\u4FDD\u8B49;\u4E5F\u6C92\u6709\u5546\u696D\u6027\u6216\u7279\u5B9A\u76EE\u7684\u7684\u96B1\u85CF\u4FDD\u8B49\u3002\u53C3\u898B GNU\u901A\u7528\u516C\u5171\u6388\u6B0A\u689D\u6B3E\u7372\u5F97\u66F4\u591A\u7D30\u7BC0\u3002 src/core/edu/xtec/resources/messages/PersistentPathsMessages.properties000066400000000000000000000004621335566474600271310ustar00rootroot00000000000000cl_alert=You are running "$" for first time in this computer.\nPlease enter a folder name where to store\nthe data files and program settings. cl_err_unableToCreateDir=Unable to create this folder!\nPlease enter a valid location where you have administrative rights. cl_prompt_title=Installation directory src/core/edu/xtec/resources/messages/PersistentPathsMessages_ar.properties000066400000000000000000000004621335566474600276130ustar00rootroot00000000000000cl_alert=You are running "$" for first time in this computer.\nPlease enter a folder name where to store\nthe data files and program settings. cl_err_unableToCreateDir=Unable to create this folder!\nPlease enter a valid location where you have administrative rights. cl_prompt_title=Installation directory src/core/edu/xtec/resources/messages/PersistentPathsMessages_ast.properties000066400000000000000000000005451335566474600300020ustar00rootroot00000000000000cl_alert=Tas executando "$" per primer vegada nesta computadora.\nInxerta'l nome d'una carpeta pa guardar\nlos datos de los ficheros y les preferencies del programa. cl_err_unableToCreateDir=\u00A1Nun se peu crear esta carpeta!\nPor favor, inxerta un allugamientu v\u00E1lidu onde tengas permisos alministrativos. cl_prompt_title=Carpeta d'instalaci\u00F3n src/core/edu/xtec/resources/messages/PersistentPathsMessages_bs.properties000066400000000000000000000005051335566474600276130ustar00rootroot00000000000000cl_alert=Pokre\u0107ete "$" prvi put na ovom ra\u010Dunalu.\nUnesite naziv foldera gdje \u0107ete pohraniti\ndatoteke s podacima i postavke programa. cl_err_unableToCreateDir=Nije mogu\u0107e kreirati ovaj folder!\nMolimo unesite ispravnu lokaciju gdje imate administratorska prava. cl_prompt_title=Direktorij za instalaciju src/core/edu/xtec/resources/messages/PersistentPathsMessages_ca.properties000066400000000000000000000006271335566474600275770ustar00rootroot00000000000000cl_alert=Esteu utilitzant el programa "$" per primera vegada en aquest ordinador.\nSi us plau, indiqueu la carpeta on desitgeu emmagatzemar els fitxers\nde configuraci\u00F3 i les dades del programa. cl_err_unableToCreateDir=S'ha produit un error en intentar crear la carpeta!\nSi us plau, indiqueu una ubicaci\u00F3 on tingueu drets d'administraci\u00F3. cl_prompt_title=Directori d'instal\u00B7laci\u00F3 src/core/edu/xtec/resources/messages/PersistentPathsMessages_cs.properties000066400000000000000000000006631335566474600276210ustar00rootroot00000000000000cl_alert=Spou\u0161t\u00EDte "$" na tomto po\u010D\u00EDta\u010Di poprv\u00E9.\nZadejte pros\u00EDm jm\u00E9no slo\u017Eky, ve kter\u00E9 budou ulo\u017Eeny\ndatov\u00E9 soubory a nastaven\u00ED programu. cl_err_unableToCreateDir=Nelze vytvo\u0159it tuto slo\u017Eku!\nZadejte pros\u00EDm platn\u00E9 um\u00EDst\u011Bn\u00ED, ke kter\u00E9mu m\u00E1te spr\u00E1vcovsk\u00E1 pr\u00E1va. cl_prompt_title=Instala\u010Dn\u00ED slo\u017Eka src/core/edu/xtec/resources/messages/PersistentPathsMessages_da.properties000066400000000000000000000005171335566474600275760ustar00rootroot00000000000000cl_alert=Du k\u00F8rer "$" for f\u00F8rste gang p\u00E5 denne computer.\nAngiv venligst et mappenavn, hvor der kan gemmes\ndatafiler og programops\u00E6tninger. cl_err_unableToCreateDir=Kunne ikke oprette denne mappe!\nAngiv venligst et gyldigt omr\u00E5de, hvor du har administrative rettigheder. cl_prompt_title=Installationskatalog src/core/edu/xtec/resources/messages/PersistentPathsMessages_de.properties000066400000000000000000000005231335566474600275770ustar00rootroot00000000000000cl_alert=Sie f\u00FChren "$" erstmals auf Ihrem Computer aus.\nBitte Zielordner zum Speichern der Dateien und Einstellungen angeben. cl_err_unableToCreateDir=Ordner kann nicht erstellt werden!\nSie m\u00FCssen einen g\u00FCltigen Installationspfad angeben, f\u00FCr den Sie Administratorenrechte besitzen. cl_prompt_title=Intallationspfad src/core/edu/xtec/resources/messages/PersistentPathsMessages_el.properties000066400000000000000000000031621335566474600276110ustar00rootroot00000000000000cl_alert=\u0397 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE "$" \u03B5\u03BA\u03C4\u03B5\u03BB\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C0\u03C1\u03CE\u03C4\u03B7 \u03C6\u03BF\u03C1\u03AC \u03C3\u03B5 \u03B1\u03C5\u03C4\u03CC\u03BD \u03C4\u03BF\u03BD \u03C5\u03C0\u03BF\u03BB\u03BF\u03B3\u03B9\u03C3\u03C4\u03AE.\n\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C4\u03C9\u03BD\n\u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03BA\u03B1\u03B9 \u03C4\u03C9\u03BD \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03C4\u03BF\u03C5 \u03C0\u03C1\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2. cl_err_unableToCreateDir=\u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2 \u03C4\u03BF\u03C5 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5!\n\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03C4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C3\u03AF\u03B1 \u03CC\u03C0\u03BF\u03C5 \u03B8\u03B1 \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B4\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 \u03B4\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE. cl_prompt_title=\u03A6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2 \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2 src/core/edu/xtec/resources/messages/PersistentPathsMessages_es.properties000066400000000000000000000006371335566474600276240ustar00rootroot00000000000000cl_alert=Est\u00E1 utilizando el programa "$" por primera vez en este ordenador.\nPor favor, indique la carpeta en la que desea almacenar los archivos\nde configuraci\u00F3n y los datos del programa. cl_err_unableToCreateDir=Se ha producido un error al intentar crear la carpeta.\nPor favor, indique una ubicaci\u00F3n en la que tenga derechos de administraci\u00F3n. cl_prompt_title=Directorio de instalaci\u00F3n src/core/edu/xtec/resources/messages/PersistentPathsMessages_eu.properties000066400000000000000000000004731335566474600276240ustar00rootroot00000000000000cl_alert=Lehehengo aldiz ari zara ordenagailu honetan "$" abiarazten.\nMesedez, sartu datu-fitxategiak eta programaren\nezarpenak gordetzeko direktorioaren izena. cl_err_unableToCreateDir=Ezinezkoa da direktorio hori sortzea!\nMesedez, sartu kudeaketa baimena duzun gune bat. cl_prompt_title=Instalazio-direktorioa src/core/edu/xtec/resources/messages/PersistentPathsMessages_fr.properties000066400000000000000000000005621335566474600276210ustar00rootroot00000000000000cl_alert=Vous lancez "$" pour la premi\u00E8re fois sur cet ordinateur. Entrez un nom de dossier o\u00F9 stocker les fichiers de donn\u00E9es et les param\u00E8tres de programme. cl_err_unableToCreateDir=Impossible de cr\u00E9er ce dossier \\! Entrez une localisation valide o\u00F9 vous avez des droits d'administrateurs. cl_prompt_title=R\u00E9pertoire d'installation src/core/edu/xtec/resources/messages/PersistentPathsMessages_gl.properties000066400000000000000000000005541335566474600276150ustar00rootroot00000000000000cl_alert=Est\u00E1 a usar \u00AB$\u00BB por primeira vez neste computador.\nPor favor, introduza un nome de cartafol no que\nalmacenar os ficheiros de datos e configuraci\u00F3n. cl_err_unableToCreateDir=Non se puido crear o cartafol!\nPor favor, introduza unha localizaci\u00F3n v\u00E1lida na que conte con permisos. cl_prompt_title=Cartafol de instalaci\u00F3n src/core/edu/xtec/resources/messages/PersistentPathsMessages_it.properties000066400000000000000000000005301335566474600276210ustar00rootroot00000000000000cl_alert=Avviate "$" la prima volta in questo computer.\nPer favore inserite un nome di cartella dove depositare\ni file dei dati e i parametri del programma. cl_err_unableToCreateDir=Impossibile creare questa cartella!\nPer favore inserisci una posizione valida dove hai i diritti di amministrazione. cl_prompt_title=Cartella di installazione src/core/edu/xtec/resources/messages/PersistentPathsMessages_nl.properties000066400000000000000000000005341335566474600276220ustar00rootroot00000000000000cl_alert=Je gebruikt "$" voor de eerste keer op deze computer.\nGelieve een map naam te kieizen om de gegevens-\nbestanden en de programmavoorkeuren op te slaan. cl_err_unableToCreateDir=Ik kan deze map niet aanmaken!\nGelieven een geldige bestandslocatie op te geven waar je de nodige administratieve rechten hebt. cl_prompt_title=Installatie map src/core/edu/xtec/resources/messages/PersistentPathsMessages_pt.properties000066400000000000000000000006141335566474600276330ustar00rootroot00000000000000cl_alert=Est\u00E1 a utilizar o programa "$" pela primeira vez neste computador.\nPor favor, indique a pasta onde deve guardar os ficheiros\nde dados e as configura\u00E7\u00F5es do programa. cl_err_unableToCreateDir=Imposs\u00EDvel criar esta pasta!\nPor favor, introduza uma localiza\u00E7\u00E3o v\u00E1lida onde possua direitos de administrador. cl_prompt_title=Pasta de instala\u00E7\u00E3o src/core/edu/xtec/resources/messages/PersistentPathsMessages_pt_BR.properties000066400000000000000000000005451335566474600302210ustar00rootroot00000000000000cl_alert=Essa \u00E9 a primeira vez que usa o programa "$" neste computador.\nPor favor, indique a pasta onde guardar\u00E1 os arquivos\nde configura\u00E7\u00E3o e de dados do programa. cl_err_unableToCreateDir=Houve um erro ao tentar criar a pasta.\nPor favor, indique um local com direitos de administrador. cl_prompt_title=Pasta de Instala\u00E7\u00E3o src/core/edu/xtec/resources/messages/PersistentPathsMessages_ru.properties000066400000000000000000000024341335566474600276400ustar00rootroot00000000000000cl_alert=\u0412\u044B \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u043B\u0438 "$" \u0432\u043F\u0435\u0440\u0432\u044B\u0435 \u043D\u0430 \u044D\u0442\u043E\u043C \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435.\n\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0443\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u0434\u043B\u044F \u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F\n\u0444\u0430\u0439\u043B\u043E\u0432 \u0434\u0430\u043D\u043D\u044B\u0445 \u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B. cl_err_unableToCreateDir=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u044D\u0442\u0443 \u043F\u0430\u043F\u043A\u0443!\n\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0443\u043A\u0430\u0436\u0438\u0442\u0435 \u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435, \u0433\u0434\u0435 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u044B\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F. cl_prompt_title=\u041F\u0430\u043F\u043A\u0430 \u0434\u043B\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 src/core/edu/xtec/resources/messages/PersistentPathsMessages_vec.properties000066400000000000000000000006351335566474600277700ustar00rootroot00000000000000cl_alert=Te si drio doparar "$" par \u019Aa prima v\u00F2lta so sto ordenaor.\nSpes\u00ECfega un n\u00F2me de cart\u00E8\u019Aa indove memorixar\ni file co' i dati e \u019Ae inpostasion de 'l programa. cl_err_unableToCreateDir=No se pol prod\u00F9xer sta cart\u00E8\u019Aa!\nInserisi un percorso v\u00E0\u019Aido indove che te g\u00E0 parmesi de ministrasion. cl_prompt_title=Cart\u00E8\u019Aa de ista\u019Aasion src/core/edu/xtec/resources/messages/PersistentPathsMessages_zh_TW.properties000066400000000000000000000006321335566474600302430ustar00rootroot00000000000000cl_alert=\u4F60\u6B63\u7B2C\u4E00\u6B21\u5728\u9019\u53F0\u96FB\u8166\u4E0A\u57F7\u884C"$"\n\u8ACB\u9032\u5165\u60F3\u8981\u5132\u5B58\u8CC7\u6599\u8207\u7A0B\u5F0F\u8A2D\u5B9A\n\u7684\u8CC7\u6599\u593E cl_err_unableToCreateDir=\u7121\u6CD5\u5EFA\u7ACB\u8CC7\u6599\u593E\uFF01\n\u8ACB\u8F38\u5165\u60A8\u6709\u7BA1\u7406\u6B0A\u9650\u7684\u5408\u6CD5\u8DEF\u9032 cl_prompt_title=\u5B89\u88DD\u8CC7\u6599\u593E src/core/edu/xtec/resources/messages/PlayerMessages.properties000066400000000000000000000205461335566474600252320ustar00rootroot00000000000000# JClic player messages m_File=File settings_passwordRequired=JClic admin password is required in order to perform this operation. m_Help=Help m_Skin=Skin action_helpAbout_caption=About... libraryManager_mainLibraryTitle=Main library library_badFormat=This JClic file is not a project library!\nLibraries are a special type of JClic projects. library_mainMenu=Main menu library_newLibraryName=New project library libraryManager_new_prompt=Do you want to create a new library or connect to a existing one? libraryManager_connectToLibrary=Connect libraryManager_createNewLibrary=New libraryManager_new_tooltip=Create or connect to a new library libraryManager_new_caption=New menuElement_dlg_icon_tooltip=Button icon menuElement_dlg_description_tooltip=Description of the button, used as a tooltip text. menuElement_dlg_description=Description: edit_find_image=Find image... menuElement_dlg_icon=Icon: edit_find_file=Find file... menuElement_dlg_project_tooltip=Path to JClic project menuElement_dlg_project=Project: menuElement_dlg_text_tooltip=Button text edit_text=Text: menu_dlg_name_tooltip=Folder name library_dlg_name_tooltip=Library name edit_name=Name: edit_title=Title: library_dlg_title=Library properties menu_dlg_title=Folder properties menuElement_dlg_title=Button properties menu_delete_tooltip=Delete current menu menu_delete_caption=Delete menuElement_delete_tooltip=Delete current menu element action_libraries_caption=Libraries... dlg_save_title=Save file... error_propertiesFile_beg=Error opening " error_propertiesFile_end=". Defaults will be used. menuElement_delete_caption=Delete menu_newMenuElement_tooltip=Create a new shortcut to a project menu_newMenuName=New folder menu_newMenu_tooltip=Create a new folder for project buttons menu_newMenu_caption=New button's folder menu_newMenuElement_caption=New project button menu_newMenuElementName=New button library_cancel_tooltip=Cancel changes library_cancel_caption=Cancel libraryManager_edit_tooltip=Edit selected library libraryManager_edit_caption=Edit library_select_caption_ok_tooltip=Save changes library_select_caption_tooltip=Choose selected folder library_select_caption_ok=Ok library_select_caption=Select library_caption=JClic projects library libraryManager_select_tooltip=Open the selected library libraryManager_cancel_tooltip=Cancel libraryManager_cancel_caption=Cancel libraryManager_select_caption=Select libraryManager_caption=Select library library_error_reading=Error reading project library! wizard_next=Next > wizard_prev=< Previous wizard_finish=Finish library_error_creating_icons=Error creating library icons! install_title=Installation of JClic projects install_info_description=Installation of a new JClic project install_info_from=From: wizard_cancel=Cancel wizard_cancel_tooltip=Cancel the operation wizard_finish_tooltip=Finish the operation wizard_next_tooltip=Next step of the operation wizard_prev_tooltip=Previous step of the operation install_select_library=Select the library where to install the project: install_copy_files=File copy install_source=Source: install_dest=Destination: install_status=Status: install_start=Start the installation install_start_tooltip=Start the copy of files to your computer install_progress_tooltip=Progress of the installation install_msg_waiting=Waiting for confirmation. install_msg_creating_dirs=Creating directories install_msg_copying=Copying file install_msg_end=Finished! install_msg_cleanup=Performing cleanup... install_msg_cancel=Installation cancelled! install_error=Install error! install_select_folder=Select the folder where to place the project icons: install_library_folders=Library folders: install_success_1=The project are now installed on your system! install_success_2=In order to run it, select its install_success_3=icon on the project library. wizard_info=Press "Next" to start. install_step_1=1. Selection of JClic library install_step_2=2. Download files install_step_3=3. Creation of icons install_step_4=Installation finished! install_info_info=You request to install the project: settings_title=Settings library_error_clone=Unable to clone library! settings_security=Security settings_password_protect=Protect settings with password settings_new_password=New password: settings_new_password_confirm=Confirm new password: settings_general=General settings_look=Look & Feel: settings_skin=Skin: settings_language=Language: settings_reports=Reports settings_report_use=Write scores to a database settings_report_engine=Reporter class: settings_report_params=Parameters: settings_media=Multimedia settings_media_enabled=Multimedia enabled settings_media_system=Multimedia system: settings_media_event_sounds=Event sounds enabled settings_library=Libraries settings_library_autorun=Automatically go to libraries when JClic starts m_Tools=Tools m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Activity m_Activity_Mnemonic=A action_openFile_caption=Open file... action_openFile_tooltip=Open a JClic project file action_openFile_keys=OO action_openUrl_caption=Open URL... action_openUrl_tooltip=Open a JClic project directly form Internet action_openUrl_keys=UU action_exit_caption=Exit action_exit_tooltip=Close JClic action_exit_keys=XX action_settings_caption=Settings... action_settings_tooltip=Adjust global program settings action_settings_keys=T action_libraries_tooltip=Open or edit a JClic library. action_libraries_keys=LL action_helpAbout_tooltip=Information about JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=This image is too large to be used as an icon! settings_report_tcp=Connect to JClic report server: settings_report_jdbc=Direct JDBC connection: settings_report_other=Other: settings_report_address=Host: settings_report_port=Port: settings_report_driver=Driver: settings_report_url=URL: settings_report_user=User: settings_report_pwd=Password: settings_report_options=Reporter params:: settings_report_err_server=Bad report server name! settings_report_err_port=Incorrect port number! Please enter a value between 1000 and 65000. settings_report_err=Incorrect report system data! settings_report_type=Reporting engine: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Auto-detect settings_security_tooltip=Security settings settings_report_tooltip=Report system settings settings_media_tooltip=Multimedia system options settings_general_tooltip=Language and aspect settings settings_library_tooltip=Library settings and editor settings_look_tooltip=User interface look & feel settings_skin_tooltip=Selection of the graphic aspect of JClic settings_language_tooltip=Language selection settings_report_use_tooltip=Enables/disables the connection to a JClic reports database settings_report_tcp_tooltip=Reporting engine based on a TCP/IP connection settings_report_jdbc_tooltip=Reporting engine based on a direct connection to a database settings_report_other_tooltip=Other reporting engines... settings_report_address_tooltip=Report server name or IP address settings_report_port_tooltip=Port used for connection (default is 5510) edit_file=File: error_launchLibrary=Error launching library install_toSourceFolder=Installing to source folder! edit_find_media=Find media file... libraryManager_delete_caption=Delete libraryManager_delete_tooltip=Delete the reference to the selected library libraryManager_delete_confirm=Do you really want to delete the reference to the selected library? libraryManager_new_exists=This library is already linked to the system. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Create new project library libraryManager_connectToExistingOption=Add a link to an exisiting project library libraryManager_fileOrUrlCaption=File or URL\: libraryManager_newLibraryTitle=New project library libraryManager_warnNoFileSelected=Please enter thr URL or file name of the project library\! install_launchProject=Open the project now settings_browser=Preferred browser\: settings_browser_tooltip=Command used to launch the browser (firefox, iexplore, mozilla, opera...) settings_country=Country code\: settings_country_tooltip=Optional two-letter code corresponding to the country-specific variant of the language (ex.\: BR for Brazilian Portuguese) settings_variant=Variant\: settings_variant_tooltip=Optional variant code of the language src/core/edu/xtec/resources/messages/PlayerMessages_ar.properties000066400000000000000000000205421335566474600257100ustar00rootroot00000000000000# JClic player messages m_File=File settings_passwordRequired=JClic admin password is required in order to perform this operation. m_Help=Help m_Skin=Skin action_helpAbout_caption=About... libraryManager_mainLibraryTitle=Main library library_badFormat=This JClic file is not a project library!\nLibraries are a special type of JClic projects. library_mainMenu=Main menu library_newLibraryName=New project library libraryManager_new_prompt=Do you want to create a new library or connect to a existing one? libraryManager_connectToLibrary=Connect libraryManager_createNewLibrary=New libraryManager_new_tooltip=Create or connect to a new library libraryManager_new_caption=New menuElement_dlg_icon_tooltip=Button icon menuElement_dlg_description_tooltip=Description of the button, used as a tooltip text. menuElement_dlg_description=Description: edit_find_image=Find image... menuElement_dlg_icon=Icon: edit_find_file=Find file... menuElement_dlg_project_tooltip=Path to JClic project menuElement_dlg_project=Project: menuElement_dlg_text_tooltip=Button text edit_text=Text: menu_dlg_name_tooltip=Folder name library_dlg_name_tooltip=Library name edit_name=Name: edit_title=Title: library_dlg_title=Library properties menu_dlg_title=Folder properties menuElement_dlg_title=Button properties menu_delete_tooltip=Delete current menu menu_delete_caption=Delete menuElement_delete_tooltip=Delete current menu element action_libraries_caption=Libraries... dlg_save_title=Save file... error_propertiesFile_beg=Error opening " error_propertiesFile_end=". Defaults will be used. menuElement_delete_caption=Delete menu_newMenuElement_tooltip=Create a new shortcut to a project menu_newMenuName=New folder menu_newMenu_tooltip=Create a new folder for project buttons menu_newMenu_caption=New button's folder menu_newMenuElement_caption=New project button menu_newMenuElementName=New button library_cancel_tooltip=Cancel changes library_cancel_caption=Cancel libraryManager_edit_tooltip=Edit selected library libraryManager_edit_caption=Edit library_select_caption_ok_tooltip=Save changes library_select_caption_tooltip=Choose selected folder library_select_caption_ok=Ok library_select_caption=Select library_caption=JClic projects library libraryManager_select_tooltip=Open the selected library libraryManager_cancel_tooltip=Cancel libraryManager_cancel_caption=Cancel libraryManager_select_caption=Select libraryManager_caption=Select library library_error_reading=Error reading project library! wizard_next=Next > wizard_prev=< Previous wizard_finish=Finish library_error_creating_icons=Error creating library icons! install_title=Installation of JClic projects install_info_description=Installation of a new JClic project install_info_from=From: wizard_cancel=Cancel wizard_cancel_tooltip=Cancel the operation wizard_finish_tooltip=Finish the operation wizard_next_tooltip=Next step of the operation wizard_prev_tooltip=Previous step of the operation install_select_library=Select the library where to install the project: install_copy_files=File copy install_source=Source: install_dest=Destination: install_status=Status: install_start=Start the installation install_start_tooltip=Start the copy of files to your computer install_progress_tooltip=Progress of the installation install_msg_waiting=Waiting for confirmation. install_msg_creating_dirs=Creating directories install_msg_copying=Copying file install_msg_end=Finished! install_msg_cleanup=Performing cleanup... install_msg_cancel=Installation cancelled! install_error=Install error! install_select_folder=Select the folder where to place the project icons: install_library_folders=Library folders: install_success_1=The project are now installed on your system! install_success_2=In order to run it, select its install_success_3=icon on the project library. wizard_info=Press "Next" to start. install_step_1=1. Selection of JClic library install_step_2=2. Download files install_step_3=3. Creation of icons install_step_4=Installation finished! install_info_info=You request to install the project: settings_title=Settings library_error_clone=Unable to clone library! settings_security=Security settings_password_protect=Protect settings with password settings_new_password=New password: settings_new_password_confirm=Confirm new password: settings_general=General settings_look=Look & Feel: settings_skin=Skin: settings_language=Language: settings_reports=Reports settings_report_use=Write scores to a database settings_report_engine=Reporter class: settings_report_params=Parameters: settings_media=Multimedia settings_media_enabled=Multimedia enabled settings_media_system=Multimedia system: settings_media_event_sounds=Event sounds enabled settings_library=Libraries settings_library_autorun=Automatically go to libraries when JClic starts m_Tools=Tools m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Activity m_Activity_Mnemonic=A action_openFile_caption=Open file... action_openFile_tooltip=Open a JClic project file action_openFile_keys=OO action_openUrl_caption=Open URL... action_openUrl_tooltip=Open a JClic project directly form Internet action_openUrl_keys=UU action_exit_caption=Exit action_exit_tooltip=Close JClic action_exit_keys=XX action_settings_caption=Settings... action_settings_tooltip=Adjust global program settings action_settings_keys=T action_libraries_tooltip=Open or edit a JClic library. action_libraries_keys=LL action_helpAbout_tooltip=Information about JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=This image is too large to be used as an icon! settings_report_tcp=Connect to JClic report server: settings_report_jdbc=Direct JDBC connection: settings_report_other=Other: settings_report_address=Host: settings_report_port=Port: settings_report_driver=Driver: settings_report_url=URL: settings_report_user=User: settings_report_pwd=Password: settings_report_options=Reporter params:: settings_report_err_server=Bad report server name! settings_report_err_port=Incorrect port number! Please enter a value between 1000 and 65000. settings_report_err=Incorrect report system data! settings_report_type=Reporting engine: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Auto-detect settings_security_tooltip=Security settings settings_report_tooltip=Report system settings settings_media_tooltip=Multimedia system options settings_general_tooltip=Language and aspect settings settings_library_tooltip=Library settings and editor settings_look_tooltip=User interface look & feel settings_skin_tooltip=Selection of the graphic aspect of JClic settings_language_tooltip=Language selection settings_report_use_tooltip=Enables/disables the connection to a JClic reports database settings_report_tcp_tooltip=Reporting engine based on a TCP/IP connection settings_report_jdbc_tooltip=Reporting engine based on a direct connection to a database settings_report_other_tooltip=Other reporting engines... settings_report_address_tooltip=Report server name or IP address settings_report_port_tooltip=Port used for connection (default is 5510) edit_file=File: error_launchLibrary=Error launching library install_toSourceFolder=Installing to source folder! edit_find_media=Find media file... libraryManager_delete_caption=Delete libraryManager_delete_tooltip=Delete the reference to the selected library libraryManager_delete_confirm=Do you really want to delete the reference to the selected library? libraryManager_new_exists=This library is already linked to the system. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Create new project library libraryManager_connectToExistingOption=Add a link to an exisiting project library libraryManager_fileOrUrlCaption=File or URL: libraryManager_newLibraryTitle=New project library libraryManager_warnNoFileSelected=Please enter thr URL or file name of the project library\\! install_launchProject=Open the project now settings_browser=Preferred browser: settings_browser_tooltip=Command used to launch the browser (firefox, iexplore, mozilla, opera...) settings_country=Country code: settings_country_tooltip=Optional two-letter code corresponding to the country-specific variant of the language (ex.: BR for Brazilian Portuguese) settings_variant=Variant: settings_variant_tooltip=Optional variant code of the language src/core/edu/xtec/resources/messages/PlayerMessages_ast.properties000066400000000000000000000232261335566474600260770ustar00rootroot00000000000000# JClic player messages m_File=Ficheru settings_passwordRequired=Pa facer esta operaci\u00F3n hai qu'inxertar la contrase\u00F1a d'alministraci\u00F3n de JClic. m_Help=Aida m_Skin=Apariencia action_helpAbout_caption=Tocante a... libraryManager_mainLibraryTitle=Biblioteca principal library_badFormat=\u00A1Esti ficheru JClic nun ye una biblioteca de proyeutos!\nLes biblioteques son una triba especial de ficheros JClic. library_mainMenu=Men\u00FA principal library_newLibraryName=Biblioteca de proyeutos nueva libraryManager_new_prompt=\u00BFQuies criar una biblioteca nueva o coneutate a una y\u00E1 esistente? libraryManager_connectToLibrary=Coneutarse libraryManager_createNewLibrary=Nueva libraryManager_new_tooltip=Criar o coneutase a una biblioteca nueva libraryManager_new_caption=Nueva menuElement_dlg_icon_tooltip=Imaxe del bot\u00F3n menuElement_dlg_description_tooltip=Testu flotante que va aparecer cuando se pose'l punteru sobro'l bot\u00F3n. menuElement_dlg_description=Descripci\u00F3n: edit_find_image=Guetar imaxe... menuElement_dlg_icon=Iconu: edit_find_file=Guetar ficheru... menuElement_dlg_project_tooltip=Allugamientu del proyeutu JClic menuElement_dlg_project=Proyeutu: menuElement_dlg_text_tooltip=Testu del bot\u00F3n edit_text=Testu: menu_dlg_name_tooltip=Nome de la carpeta library_dlg_name_tooltip=Nome de la biblioteca edit_name=Nome: edit_title=T\u00EDtulu: library_dlg_title=Propiedaes de la biblioteca menu_dlg_title=Propiedaes de la carpeta menuElement_dlg_title=Propiedaes del bot\u00F3n menu_delete_tooltip=Esborrar el men\u00FA escoy\u00EDu menu_delete_caption=Esborrar menuElement_delete_tooltip=Esborrar l'elementu de men\u00FA escoy\u00EDu action_libraries_caption=Biblioteques... dlg_save_title=Guardar ficheru... error_propertiesFile_beg=Error al abrir " error_propertiesFile_end=". Van emplegase los valores por defeutu. menuElement_delete_caption=Esborrar menu_newMenuElement_tooltip=Criar un bot\u00F3n de proyeutu nuevu menu_newMenuName=Carpeta Nueva menu_newMenu_tooltip=Criar una carpeta de botones de proyeutu nueva menu_newMenu_caption=Carpeta d'iconos nueva menu_newMenuElement_caption=Bot\u00F3n nuevu de proyeutu menu_newMenuElementName=Bot\u00F3n nuevu library_cancel_tooltip=Encaboxar les modificaciones library_cancel_caption=Encaboxar libraryManager_edit_tooltip=Editar la biblioteca escoyida libraryManager_edit_caption=Editar library_select_caption_ok_tooltip=Guardar los cambeos library_select_caption_tooltip=Escoyer la carpeta seleicionada library_select_caption_ok=Aceutar library_select_caption=Seleicionar library_caption=Biblioteca de proyeutos JClic libraryManager_select_tooltip=Abrir la biblioteca seleicionada libraryManager_cancel_tooltip=Encaboxar libraryManager_cancel_caption=Encaboxar libraryManager_select_caption=Seleicionar libraryManager_caption=Seleici\u00F3n de la biblioteca de proyeutos library_error_reading=\u00A1Error al lleer la biblioteca de proyeutos! wizard_next=Siguiente > wizard_prev=< Anterior wizard_finish=Finar library_error_creating_icons=\u00A1Error al criar l'iconu na biblioteca! install_title=Instalaci\u00F3n de proyeutos JClic install_info_description=Instalaci\u00F3n de un proyeutu JClic nuevu install_info_from=Dende: wizard_cancel=Encaboxar wizard_cancel_tooltip=Encaboxar la operaci\u00F3n wizard_finish_tooltip=Acabar la operaci\u00F3n wizard_next_tooltip=Siguiente pasu de la operaci\u00F3n wizard_prev_tooltip=Pasu anterior de la operaci\u00F3n install_select_library=Seleiciona la biblioteca na que se va instalar el proyeutu: install_copy_files=Copia de ficheros install_source=Orixe: install_dest=Dest\u00EDn: install_status=Est\u00E1u: install_start=Entamar la instalaci\u00F3n install_start_tooltip=Entamar la copia de ficheros al ordenador install_progress_tooltip=Progresu de la instalaci\u00F3n install_msg_waiting=Esperando confirmaci\u00F3n. install_msg_creating_dirs=Criando carpetes install_msg_copying=Copiando'l ficheru install_msg_end=\u00A1Fin\u00E1u! install_msg_cleanup=Llimpiando... install_msg_cancel=\u00A1Instalaci\u00F3n encaboxada! install_error=\u00A1Hebo un fallu durante la instalaci\u00F3n! install_select_folder=Seleiciona la carpeta na que se van crear los iconos del proyeutu: install_library_folders=Carpetes de la biblioteca: install_success_1=El proyeutu instal\u00F3se dafechu! install_success_2=Pa arrancalu seleiciona'l so install_success_3=iconu na biblioteca de proyeutos. wizard_info=Fai clic en "Siguiente" pa entamar. install_step_1=1. Seleici\u00F3n de la biblioteca JClic install_step_2=2. Descarga de ficheros install_step_3=3. Creaci\u00F3n d'iconos install_step_4=\u00A1Instalaci\u00F3n finada! install_info_info=Solicit\u00F3 instalar el proyeutu: settings_title=Configuraci\u00F3n library_error_clone=\u00A1Nun se pudo clonar la biblioteca! settings_security=Segurid\u00E1 settings_password_protect=Protexer los cambeos de configuraci\u00F3n con contrase\u00F1a settings_new_password=Contrase\u00F1a nueva: settings_new_password_confirm=Confirmar contrase\u00F1a nueva: settings_general=Xeneral settings_look=Aspeutu: settings_skin=Piel: settings_language=Llingua: settings_reports=Informes settings_report_use=Guardar los resultaos de les xeres nuna base de datos settings_report_engine=Clas: settings_report_params=Par\u00E1metros: settings_media=Multimedia settings_media_enabled=Multimedia activao settings_media_system=Sistema multimedia: settings_media_event_sounds=Son\u00EDos d'eventu activaos settings_library=Biblioteques settings_library_autorun=Amosar autom\u00E1ticamente la biblioteca nel aniciu m_Tools=Ferramientes m_File_Mnemonic=F m_Tools_Mnemonic=F m_Help_Mnemonic=A m_Activity=Xera m_Activity_Mnemonic=X action_openFile_caption=Abrir el ficheru... action_openFile_tooltip=Abrir un ficheru de proyeutu JClic action_openFile_keys=AO action_openUrl_caption=Abrir una web... action_openUrl_tooltip=Abrir un proyeutu JClic direutamente dende Internet action_openUrl_keys=UU action_exit_caption=Colar action_exit_tooltip=Zarrar JClic action_exit_keys=XC action_settings_caption=Configuraci\u00F3n... action_settings_tooltip=Axustar la configuraci\u00F3n global del programa action_settings_keys=C action_libraries_tooltip=Abrir o camudar una biblioteca JClic action_libraries_keys=BB action_helpAbout_tooltip=Informaci\u00F3n sobro JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=\u00A1Esta imaxe ye enforma grande pa ser emplegada como iconu! settings_report_tcp=Conectase a un sirvidor d'informes JClic: settings_report_jdbc=Conex\u00F3n direuta a una base de datos JDBC: settings_report_other=Otros: settings_report_address=Sirvidor: settings_report_port=Puertu: settings_report_driver=Controlador: settings_report_url=URL: settings_report_user=Usuariu: settings_report_pwd=Contrase\u00F1a: settings_report_options=Par\u00E1metros: settings_report_err_server=\u00A1El nome del sirvidor d'informes ye incorreutu! settings_report_err_port=\u00A1Valor incorreutu del puertu! Por favor, conse\u00F1a un valor ente 1000 y 65000. settings_report_err=\u00A1Datos incorreutos pal sistema d'informes! settings_report_type=Motor d'informes: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Deteici\u00F3n autom\u00E1tica settings_security_tooltip=Opciones de segurid\u00E1 settings_report_tooltip=Configuraci\u00F3n del sistema d'informes settings_media_tooltip=Configuraci\u00F3n del sistema multimedia settings_general_tooltip=Opciones de llingua y aspeutu settings_library_tooltip=Configuraci\u00F3n y edici\u00F3n de biblioteques settings_look_tooltip=Aspeutu del interfaz d'usuariu settings_skin_tooltip=Seleici\u00F3n del dise\u00F1u gr\u00E1ficu de JClic settings_language_tooltip=Seleici\u00F3n de la llingua settings_report_use_tooltip=Activa o desactiva la conex\u00F3n a una base de datos d'informes JClic settings_report_tcp_tooltip=Motor d'informes bas\u00E1u nuna conex\u00F3n TCP/IP settings_report_jdbc_tooltip=Motor d'informes bas\u00E1u nuna conex\u00F3n direuta a una base de datos settings_report_other_tooltip=Otros motores d'informes... settings_report_address_tooltip=Nome o direici\u00F3n IP del sirvidor d'informes settings_report_port_tooltip=Puertu us\u00E1u pa la conex\u00F3n (por defeutu: 5510) edit_file=Ficheru: error_launchLibrary=Error al abrir la biblioteca install_toSourceFolder=\u00A1Instalando na carpeta orixe! edit_find_media=Guetar recursu... libraryManager_delete_caption=Esborrar libraryManager_delete_tooltip=Esborrar la referencia a la biblioteca seleicionada libraryManager_delete_confirm=\u00BFDe xuru que quies esborrar la referencia a la biblioteca seleicionada? libraryManager_new_exists=\u00A1Esta biblioteca y\u00E1 s'alcuentra conectada al sistema! edit_find_image_keys=G* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Criar una biblioteca de proyeutos nueva libraryManager_connectToExistingOption=Amestar un enllaz a una biblioteca y\u00E1 esistente libraryManager_fileOrUrlCaption=Ficheru o URL: libraryManager_newLibraryTitle=Biblioteca de proyeutos nueva libraryManager_warnNoFileSelected=\u00A1Por favor, escribi la URL o nome de ficheru de la biblioteca de proyeutos\\! install_launchProject=Abrir agora'l proyeutu settings_browser=Restolador prefer\u00EDu: settings_browser_tooltip=Comandu utiliz\u00E1u p'arrancar el restolador (firefox, iexplore, mozilla, opera...) settings_country=C\u00F3digu de pa\u00EDs: settings_country_tooltip=C\u00F3digu opcional de dos lletres correspondiente a la variante lling\u00FC\u00EDstica d'un territoriu (ex.: BR pa portugu\u00E9s del Brasil) settings_variant=Variante: settings_variant_tooltip=C\u00F3digu opcional de variante de la llingua src/core/edu/xtec/resources/messages/PlayerMessages_bs.properties000066400000000000000000000220661335566474600257150ustar00rootroot00000000000000# JClic player messages m_File=Datoteka settings_passwordRequired=JClic lozinka administratora je je potrebna za izvo\u0111enje ove operacije. m_Help=Pomo\u0107 m_Skin=Tema action_helpAbout_caption=O... libraryManager_mainLibraryTitle=Glavna biblioteka library_badFormat=Ova JClic datoteka nije projekt biblioteke!\nBiblioteke su posebna vrsta JClic projekata. library_mainMenu=Glavni izbornik library_newLibraryName=Novi projekat biblioteke libraryManager_new_prompt=\u017Delite li kreirati novu biblioteku ili se povezati s postoje\u0107eom? libraryManager_connectToLibrary=Pove\u017Ei se libraryManager_createNewLibrary=Novo libraryManager_new_tooltip=Kreiraj ili se pove\u017Ei s novom bibliotekom libraryManager_new_caption=Novo menuElement_dlg_icon_tooltip=Button icon menuElement_dlg_description_tooltip=Description of the button, used as a tooltip text. menuElement_dlg_description=Opis: edit_find_image=Na\u0111i sliku... menuElement_dlg_icon=Ikona: edit_find_file=Na\u0111i datoteku... menuElement_dlg_project_tooltip=Put do JClic projekta menuElement_dlg_project=Projekt: menuElement_dlg_text_tooltip=Button text edit_text=Tekst: menu_dlg_name_tooltip=Naziv foldera library_dlg_name_tooltip=Naziv biblioteke edit_name=Naziv: edit_title=Naslov: library_dlg_title=Karakteristike biblioteke menu_dlg_title=Karakteristike foldera menuElement_dlg_title=Button properties menu_delete_tooltip=Obri\u0161i trenutni izbornik menu_delete_caption=Obrisati menuElement_delete_tooltip=Obri\u0161ite trenutni element izbornika action_libraries_caption=Biblioteke... dlg_save_title=Spremii datoteku... error_propertiesFile_beg=Gre\u0161ka pri otvaranju" error_propertiesFile_end=". Standardne vrijednosti \u0107e biti upotrebljivane. menuElement_delete_caption=Obrisati menu_newMenuElement_tooltip=Kreirati novu pre\u010Dicu za projekt menu_newMenuName=Novi folder menu_newMenu_tooltip=Create a new folder for project buttons menu_newMenu_caption=New button's folder menu_newMenuElement_caption=New project button menu_newMenuElementName=New button library_cancel_tooltip=Otka\u017Ei promjene library_cancel_caption=Odustani libraryManager_edit_tooltip=Uredi odabranu biblioteku libraryManager_edit_caption=Uredi library_select_caption_ok_tooltip=Spremi promjene library_select_caption_tooltip=Izaberi odabrani folder library_select_caption_ok=Uredu library_select_caption=Odaberi library_caption=JClic biblioteka projekata libraryManager_select_tooltip=Otvori odabranu biblioteku libraryManager_cancel_tooltip=Odustani libraryManager_cancel_caption=Odustani libraryManager_select_caption=Odaberi libraryManager_caption=Odaberi biblioteku library_error_reading=Gre\u0161ka prilikom \u010Ditanja projekta biblioteke! wizard_next=Sljede\u0107i > wizard_prev=< Prethodni wizard_finish=Zavr\u0161i library_error_creating_icons=Gre\u0161ka prilikom kreiranja ikona biblioteke! install_title=Instalacija JClic projekata install_info_description=Instalacija novog JClic projekata install_info_from=Od: wizard_cancel=Odustani wizard_cancel_tooltip=Otka\u017Ei radnju wizard_finish_tooltip=Zavr\u0161i radnju wizard_next_tooltip=Sljede\u0107i korak operacije wizard_prev_tooltip=Prethodni korak operacije install_select_library=Odaberite biblioteku gdje \u017Eelite instalirati projekt: install_copy_files=Kopija datoteke install_source=Izvor: install_dest=Odredi\u0161te: install_status=Stanje: install_start=Zapo\u010Dni instalaciju install_start_tooltip=Zapo\u010Dnite kopiranje datoteka na va\u0161 ra\u010Dunar install_progress_tooltip=Tok instalacije install_msg_waiting=\u010Cekanje potvrde install_msg_creating_dirs=Kreiranje direktorija install_msg_copying=Kopiranje datoteke install_msg_end=Zavr\u0161eno! install_msg_cleanup=Performing cleanup... install_msg_cancel=Instalacija otkazana! install_error=Gre\u0161ka pri instalaciji! install_select_folder=Odaberite folder gdje \u0107ete smjestiti ikone projekta: install_library_folders=Folderi biblioteke: install_success_1=Projekt je instaliran na va\u0161 sistem! install_success_2=In order to run it, select its install_success_3=ikona u biblioteci projekta wizard_info=Pritisni "Sljede\u0107e" da po\u010Detak install_step_1=1. Izbor JClic biblioteke install_step_2=2. Preuzimanje datoteka install_step_3=3. Kreiranje ikona install_step_4=Instalacija zavr\u0161ena! install_info_info=Zatra\u017Eili ste instalaciju projekta: settings_title=Pode\u0161avanja library_error_clone=Nije mogu\u0107e kopirati biblioteku! settings_security=Sigurnost settings_password_protect=Za\u0161titite pode\u0161avanja s lozinkom settings_new_password=Nova lozinka: settings_new_password_confirm=Potvrdi novu lozinku: settings_general=Op\u0107enito settings_look=Look & Feel: settings_skin=Maska: settings_language=Jezik: settings_reports=Izvje\u0161taji settings_report_use=Zapi\u0161ite rezultate u bazu podataka settings_report_engine=Reporter class: settings_report_params=Parametri: settings_media=Multimedija settings_media_enabled=Multimedia omogu\u0107ena settings_media_system=Multimedia sistem: settings_media_event_sounds=Zvukovi doga\u0111aja omogu\u0107eni settings_library=Biblioteke settings_library_autorun=Automatski idi u biblioteke kada JClic zapo\u010Dne m_Tools=Alati m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Aktivnost m_Activity_Mnemonic=A action_openFile_caption=Otvori datoteku... action_openFile_tooltip=Otvori datoteku JClic projekta action_openFile_keys=OO action_openUrl_caption=Otvori URL... action_openUrl_tooltip=Otvori JClic projekt direktno s Interneta action_openUrl_keys=UU action_exit_caption=Izlaz action_exit_tooltip=Zatvori JClic action_exit_keys=XX action_settings_caption=Pode\u0161avanja... action_settings_tooltip=Podesite globalne postavke programa action_settings_keys=T action_libraries_tooltip=Otvori ili uredi JClic biblioteku. action_libraries_keys=LL action_helpAbout_tooltip=Informacije o JClic-u action_helpAbout_keys=AA menuElement_err_iconTooLarge=Ova slika je previ\u0161e velika da bi se koristila kao ikona! settings_report_tcp=Pove\u017Ei se s JClic serverom izvje\u0161taja: settings_report_jdbc=Direktna JDBC konekcija: settings_report_other=Ostalo: settings_report_address=Host: settings_report_port=Priklju\u010Dak: settings_report_driver=Drajver: settings_report_url=URL: settings_report_user=Korisnik: settings_report_pwd=Lozinka: settings_report_options=Reporter params:: settings_report_err_server=Pogre\u0161an izvje\u0161taj imena poslu\u017Eitelja! settings_report_err_port=Neta\u010Dan broj za priklju\u010Dak! Molimo unesite vrijednost izme\u0111u 1000 i 65000. settings_report_err=Neta\u010Dan izvje\u0161taj sistemskih podataka! settings_report_type=Reporting engine: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Automatsko detektiranje settings_security_tooltip=Pode\u0161avanja sigurnosti settings_report_tooltip=Izvje\u0161taj o postavkama sistema settings_media_tooltip=Multimedija sistem opcije settings_general_tooltip=Language and aspect settings settings_library_tooltip=Pode\u0161avanja biblioteke i urednik settings_look_tooltip=User interface look & feel settings_skin_tooltip=Odabir grafi\u010Dkog aspekta JClic-a settings_language_tooltip=Odabir jezika settings_report_use_tooltip=Omogu\u0107i/onemogu\u0107i konekciju za JClic bazu podataka o izvje\u0161tajima settings_report_tcp_tooltip=Reporting engine based on a TCP/IP connection settings_report_jdbc_tooltip=Reporting engine based on a direct connection to a database settings_report_other_tooltip=Other reporting engines... settings_report_address_tooltip=Izvje\u0161taj naziva poslu\u017Eitelja ili IP adrese settings_report_port_tooltip=Priklju\u010Dak upotrebljavan za konekciju (standarno je 5510) edit_file=Datoteka: error_launchLibrary=Gre\u0161ka pri pokretanju biblioteke install_toSourceFolder=Instaliranje izvornog foldera edit_find_media=Na\u0111i media datoteku... libraryManager_delete_caption=Obrisati libraryManager_delete_tooltip=Obri\u0161i napomenu odabrane biblioteke libraryManager_delete_confirm=Da li zaista \u017Eelite obrisati napomenu odabrane biblioteke? libraryManager_new_exists=Ova biblioteka je ve\u0107 povezana na sistem. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Kreiraj novi projekt biblioteke libraryManager_connectToExistingOption=Dodaj poveznicu za postoje\u0107i projekt biblioteke libraryManager_fileOrUrlCaption=Datoteka ili URL: libraryManager_newLibraryTitle=Novi projekat biblioteke libraryManager_warnNoFileSelected=Molimo unesite URL ili naziv datoteke od projekta biblioteke\\! install_launchProject=Otvori projekt sada settings_browser=Omiljeni preglednik: settings_browser_tooltip=Komande upotrebljene za pokretanje preglednika (firefox, iexplore, mozilla, opera...) settings_country=Country code: settings_country_tooltip=Dodatna dva slova koda odgovaraju specifi\u010Dnim varijantama jezika za svaku zemlju (npr. : BR za brazilski portugalski) settings_variant=Varijanta: settings_variant_tooltip=Dodatna varijanta koda jezika src/core/edu/xtec/resources/messages/PlayerMessages_ca.properties000066400000000000000000000233521335566474600256730ustar00rootroot00000000000000# JClic player messages m_File=Fitxers settings_passwordRequired=Per a efectuar aquesta operaci\u00F3 cal introduir la contrasenya d'administraci\u00F3 del JClic. m_Help=Ajuda m_Skin=Aparen\u00E7a action_helpAbout_caption=Quant a... libraryManager_mainLibraryTitle=Biblioteca principal library_badFormat=Aquest fitxer JClic no \u00E9s del tipus "biblioteca de projectes".\nLes biblioteques s\u00F3n un tipus especial de fitxers JClic. library_mainMenu=Men\u00FA principal library_newLibraryName=Nova biblioteca de projectes libraryManager_new_prompt=Voleu crear una nova biblioteca de projectes o connectar-vos a una llibreria existent? libraryManager_connectToLibrary=Connectar-se a... libraryManager_createNewLibrary=Nova libraryManager_new_tooltip=Crea una nova biblioteca o connecta't a una existent libraryManager_new_caption=Nova menuElement_dlg_icon_tooltip=Imatge que es mostra al bot\u00F3 menuElement_dlg_description_tooltip=Text flotant que apareixer\u00E0 quan es deixi el punter quiet sobre el bot\u00F3. menuElement_dlg_description=Descripci\u00F3: edit_find_image=Cerca imatge... menuElement_dlg_icon=Icona: edit_find_file=Cerca fitxer... menuElement_dlg_project_tooltip=Ubicaci\u00F3 del projecte JClic menuElement_dlg_project=Projecte: menuElement_dlg_text_tooltip=Text del bot\u00F3 edit_text=Text: menu_dlg_name_tooltip=Nom de la carpeta library_dlg_name_tooltip=Nom de la biblioteca edit_name=Nom: edit_title=T\u00EDtol: library_dlg_title=Propietats de la biblioteca menu_dlg_title=Propietats de la carpeta menuElement_dlg_title=Propietats del bot\u00F3 menu_delete_tooltip=Elimina el men\u00FA seleccionat menu_delete_caption=Elimina menuElement_delete_tooltip=Elimina l'element de men\u00FA seleccionat action_libraries_caption=Biblioteques... dlg_save_title=Desa el fitxer... error_propertiesFile_beg=Error en obrir " error_propertiesFile_end=". S'utilitzaran els valors per defecte. menuElement_delete_caption=Elimina menu_newMenuElement_tooltip=Crea un nou bot\u00F3 de projecte menu_newMenuName=Nova carpeta menu_newMenu_tooltip=Crea una nova carpeta de botons de projecte menu_newMenu_caption=Nova carpeta d'icones menu_newMenuElement_caption=Nou bot\u00F3 de projecte menu_newMenuElementName=Nou bot\u00F3 library_cancel_tooltip=Cancel\u00B7la les modificacions library_cancel_caption=Cancel\u00B7la libraryManager_edit_tooltip=Edita la biblioteca seleccionada libraryManager_edit_caption=Edita library_select_caption_ok_tooltip=Desa els canvis library_select_caption_tooltip=Escull la carpeta seleccionada library_select_caption_ok=D'acord library_select_caption=Selecciona library_caption=Biblioteca de projectes JClic libraryManager_select_tooltip=Obre la biblioteca seleccionada libraryManager_cancel_tooltip=Cancel\u00B7la libraryManager_cancel_caption=Cancel\u00B7la libraryManager_select_caption=Selecciona libraryManager_caption=Selecci\u00F3 de la biblioteca de projectes library_error_reading=Error en llegir la biblioteca de projectes! wizard_next=Endavant > wizard_prev=< Enrere wizard_finish=Finalitza library_error_creating_icons=Error en crear la icona a la biblioteca! install_title=Instal\u00B7laci\u00F3 de projectes JClic install_info_description=Instal\u00B7laci\u00F3 d'un nou projecte JClic install_info_from=Des de: wizard_cancel=Cancel\u00B7la wizard_cancel_tooltip=Cancel\u00B7la l'operaci\u00F3 wizard_finish_tooltip=Finalitza l'operaci\u00F3 wizard_next_tooltip=Pas seg\u00FCent de l'operaci\u00F3 wizard_prev_tooltip=Pas anterior de l'operaci\u00F3 install_select_library=Seleccioneu la biblioteca on s'instal\u00B7lar\u00E0 el projecte: install_copy_files=C\u00F2pia de fitxers install_source=Origen: install_dest=Dest\u00ED: install_status=Estat: install_start=Inicia la instal\u00B7laci\u00F3 install_start_tooltip=Inicia la c\u00F2pia de fitxers al vostre ordinador install_progress_tooltip=Progr\u00E9s de la instal\u00B7laci\u00F3 install_msg_waiting=Esperant confirmaci\u00F3. install_msg_creating_dirs=Creant carpetes install_msg_copying=Copiant el fitxer install_msg_end=Acabat! install_msg_cleanup=Fent neteja... install_msg_cancel=Instal\u00B7laci\u00F3 cancel\u00B7lada! install_error=S'ha produ\u00EFt un error durant la instal\u00B7laci\u00F3! install_select_folder=Seleccioneu la carpeta on es crearan les icones del projecte: install_library_folders=Carpetes de la biblioteca: install_success_1=El projecte s'ha instal\u00B7lat correctament! install_success_2=Per a posar-lo en marxa seleccioneu la seva install_success_3=icona a la biblioteca de projectes. wizard_info=Feu clic a "Endavant" per comen\u00E7ar. install_step_1=1. Selecci\u00F3 de la biblioteca install_step_2=2. Desc\u00E0rrega de fitxers install_step_3=3. Creaci\u00F3 d'icones install_step_4=Instal\u00B7laci\u00F3 acabada! install_info_info=Heu sol\u00B7licitat instal\u00B7lar el projecte: settings_title=Configuraci\u00F3 library_error_clone=No s'ha pogut clonar la biblioteca! settings_security=Seguretat settings_password_protect=Protegeix els canvis de configuraci\u00F3 amb contrasenya settings_new_password=Nova contrasenya: settings_new_password_confirm=Confirmaci\u00F3 de la nova contrasenya: settings_general=General settings_look=Aspecte: settings_skin=Pell: settings_language=Idioma: settings_reports=Informes settings_report_use=Enregistra els resultats de les activitats en una base de dades settings_report_engine=Classe: settings_report_params=Par\u00E0metres: settings_media=Multim\u00E8dia settings_media_enabled=Multim\u00E8dia activat settings_media_system=Sistema multim\u00E8dia: settings_media_event_sounds=Sons d'esdeveniment activats settings_library=Biblioteques settings_library_autorun=Mostra autom\u00E0ticament la biblioteca a l'inici m_Tools=Eines m_File_Mnemonic=F m_Tools_Mnemonic=E m_Help_Mnemonic=J m_Activity=Activitat m_Activity_Mnemonic=A action_openFile_caption=Obre el fitxer... action_openFile_tooltip=Obre un fitxer de projecte JClic action_openFile_keys=OO action_openUrl_caption=Obre una ubicaci\u00F3 web... action_openUrl_tooltip=Obre un projecte JClic directament des d'Internet action_openUrl_keys=UU action_exit_caption=Surt action_exit_tooltip=Tanca el JClic action_exit_keys=RX action_settings_caption=Configuraci\u00F3... action_settings_tooltip=Ajusta les opcions globals del programa action_settings_keys=C action_libraries_tooltip=Obre o modifica una biblioteca JClic. action_libraries_keys=BB action_helpAbout_tooltip=Informaci\u00F3 sobre el JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Aquesta imatge \u00E9s massa gran per fer-la servir com a icona! settings_report_tcp=Connecta't a un servidor d'informes JClic: settings_report_jdbc=Connecta't directament a una base de dades JDBC: settings_report_other=Altres: settings_report_address=Servidor: settings_report_port=Port: settings_report_driver=Controlador: settings_report_url=URL: settings_report_user=Usuari: settings_report_pwd=Contrasenya: settings_report_options=Par\u00E0metres: settings_report_err_server=El nom del servidor d'informes \u00E9s incorrecte! settings_report_err_port=Valor incorrecte del port en el sistema d'informes! Si us plau, indiqueu un valor entre 1000 i 65000. settings_report_err=Dades incorrectes per al sistema d'informes! settings_report_type=Sistema d'informes: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Detecci\u00F3 autom\u00E0tica settings_security_tooltip=Opcions de seguretat settings_report_tooltip=Configuraci\u00F3 del sistema d'informes settings_media_tooltip=Configuraci\u00F3 del sistema multim\u00E8dia settings_general_tooltip=Opcions d'idioma i aspecte settings_library_tooltip=Configuraci\u00F3 i edici\u00F3 de biblioteques settings_look_tooltip=Aspecte de la interf\u00EDcie d'usuari settings_skin_tooltip=Selecci\u00F3 del disseny gr\u00E0fic del JClic settings_language_tooltip=Selecci\u00F3 d'idioma settings_report_use_tooltip=Activa o desactiva la connexi\u00F3 a una base de dades d'informes JClic settings_report_tcp_tooltip=Motor d'informes basat en una connexi\u00F3 TCP/IP settings_report_jdbc_tooltip=Motor d'informes basat en una connexi\u00F3 directa a una base de dades settings_report_other_tooltip=Altres motors d'informes... settings_report_address_tooltip=Nom o adre\u00E7a IP del servidor d'informes settings_report_port_tooltip=Port utilitzat en la connexi\u00F3 (per defecte: 5510) edit_file=Fitxer: error_launchLibrary=Error en obrir la biblioteca install_toSourceFolder=Instal\u00B7lant a la carpeta d'origen! edit_find_media=Cerca recurs... libraryManager_delete_caption=Suprimeix libraryManager_delete_tooltip=Suprimeix la refer\u00E8ncia a la biblioteca seleccionada libraryManager_delete_confirm=Realment voleu suprimir la refer\u00E8ncia a la biblioteca seleccionada? libraryManager_new_exists=Aquesta biblioteca ja est\u00E0 connectada al sistema. edit_find_image_keys=C* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Crea una nova biblioteca de projectes libraryManager_connectToExistingOption=Afegeix un enlla\u00E7 a una biblioteca ja existent libraryManager_fileOrUrlCaption=Fitxer o URL: libraryManager_newLibraryTitle=Nova biblioteca de projectes: libraryManager_warnNoFileSelected=Si us plau, escriviu l'URL o el nom de fitxer de la biblioteca de projectes a la qual voleu accedir\\! install_launchProject=Obre ara el projecte settings_browser=Navegador preferit: settings_browser_tooltip=Ordre emprada per a engegar el navegador (firefox, iexplore, mozilla, opera...) settings_country=Codi de pa\u00EDs: settings_country_tooltip=Codi opcional de dues lletres corresponent a la variant dialectal d'un territori (ex.: BR per a portugu\u00E8s del Brasil) settings_variant=Variant: settings_variant_tooltip=Codi opcional de variant de l'idioma src/core/edu/xtec/resources/messages/PlayerMessages_cs.properties000066400000000000000000000237061335566474600257200ustar00rootroot00000000000000# JClic player messages m_File=Soubor settings_passwordRequired=Pro vykon\u00E1n\u00ED operace je t\u0159eba heslo administr\u00E1tora JClic. m_Help=N\u00E1pov\u011Bda m_Skin=Motiv action_helpAbout_caption=O aplikaci... libraryManager_mainLibraryTitle=Hlavn\u00ED knihovna library_badFormat=Tento JClic soubor nen\u00ED knihovna projekt\u016F!\nKnihovny jsou speci\u00E1ln\u00EDm typem JClic projekt\u016F. library_mainMenu=Hlavn\u00ED nab\u00EDdka library_newLibraryName=Nov\u00E1 knihovna projektu libraryManager_new_prompt=Chcete vytvo\u0159it novou knihovnu nebo propojit s existuj\u00EDc\u00ED? libraryManager_connectToLibrary=P\u0159ipojit libraryManager_createNewLibrary=Nov\u00E1 libraryManager_new_tooltip=Vytvo\u0159it nebo propojit s novou knihovnou libraryManager_new_caption=Nov\u00FD menuElement_dlg_icon_tooltip=Ikona tla\u010D\u00EDtka menuElement_dlg_description_tooltip=Popis tla\u010D\u00EDtka, pou\u017Eit\u00FD jako bublinov\u00E1 n\u00E1pov\u011Bda. menuElement_dlg_description=Popis: edit_find_image=Naj\u00EDt obr\u00E1zek... menuElement_dlg_icon=Ikona: edit_find_file=Naj\u00EDt soubor... menuElement_dlg_project_tooltip=Cesta k projektu JClic menuElement_dlg_project=Projekt: menuElement_dlg_text_tooltip=Text tla\u010D\u00EDtka edit_text=Text: menu_dlg_name_tooltip=N\u00E1zev slo\u017Eky library_dlg_name_tooltip=Jm\u00E9no knihovny edit_name=N\u00E1zev: edit_title=Titulek: library_dlg_title=Vlastnosti knihovny menu_dlg_title=Vlastnosti slo\u017Eky menuElement_dlg_title=Vlastnosti tla\u010D\u00EDtka menu_delete_tooltip=Smazat aktu\u00E1ln\u00ED nab\u00EDdku menu_delete_caption=Smazat menuElement_delete_tooltip=Smazat sou\u010Dasnou polo\u017Eku nab\u00EDdky action_libraries_caption=Knihovny... dlg_save_title=Ulo\u017Eit soubor... error_propertiesFile_beg=Chyba p\u0159i otev\u00EDr\u00E1n\u00ED " error_propertiesFile_end=". Budou pou\u017Eity v\u00FDchoz\u00ED p\u0159edvolby. menuElement_delete_caption=Smazat menu_newMenuElement_tooltip=Vytvo\u0159te nov\u00E9ho z\u00E1stupce projektu menu_newMenuName=Nov\u00E1 slo\u017Eka menu_newMenu_tooltip=Vytvo\u0159te novou slo\u017Eku pro tla\u010D\u00EDtka projektu menu_newMenu_caption=Nov\u00E1 slo\u017Eka pro tla\u010D\u00EDtka menu_newMenuElement_caption=Nov\u00E9 tla\u010D\u00EDtko projektu menu_newMenuElementName=Nov\u00E1 tla\u010D\u00EDtko library_cancel_tooltip=Zru\u0161it zm\u011Bny library_cancel_caption=Zru\u0161it libraryManager_edit_tooltip=Upravit vybranou knihovnu libraryManager_edit_caption=Upravit library_select_caption_ok_tooltip=Ulo\u017Eit zm\u011Bny library_select_caption_tooltip=Vybrat zvolenou slo\u017Eku library_select_caption_ok=Ok library_select_caption=Vybrat library_caption=Knihovna projekt\u016F JClic libraryManager_select_tooltip=Otev\u0159\u00EDt vybranou knihovnu libraryManager_cancel_tooltip=Zru\u0161it libraryManager_cancel_caption=Zru\u0161it libraryManager_select_caption=Vybrat libraryManager_caption=Vybrat knihovnu library_error_reading=Chyba p\u0159i \u010Dten\u00ED knihovny projektu! wizard_next=Dal\u0161\u00ED > wizard_prev=< P\u0159edchoz\u00ED wizard_finish=Dokon\u010Dit library_error_creating_icons=Chyba p\u0159i vytv\u00E1\u0159en\u00ED ikon knihovny! install_title=Instalace JClic projekt\u016F install_info_description=Instalace nov\u00FDch JClic projekt\u016F install_info_from=Z: wizard_cancel=Zru\u0161it wizard_cancel_tooltip=Zru\u0161it operaci wizard_finish_tooltip=Dokon\u010Dit operaci wizard_next_tooltip=N\u00E1sleduj\u00EDc\u00ED krok operace wizard_prev_tooltip=P\u0159edchoz\u00ED krok operace install_select_library=Vybrat knihovnu pro instalaci projektu: install_copy_files=Kop\u00EDrovat soubor install_source=Zdroj: install_dest=C\u00EDl: install_status=Stav: install_start=Start instalace install_start_tooltip=Za\u010D\u00EDnaj\u00ED se kop\u00EDrovat soubory na v\u00E1\u0161 po\u010D\u00EDta\u010D install_progress_tooltip=Pr\u016Fb\u011Bh instalace install_msg_waiting=\u010Cek\u00E1 se na potvrzen\u00ED install_msg_creating_dirs=Vytv\u00E1\u0159ej\u00ED se slo\u017Eky install_msg_copying=Kop\u00EDruje se soubor install_msg_end=Hotovo! install_msg_cleanup=Prob\u00EDh\u00E1 \u010Di\u0161t\u011Bn\u00ED... install_msg_cancel=Instalace zru\u0161ena! install_error=Chyba instalace! install_select_folder=Vyberte slo\u017Eku pro um\u00EDst\u011Bn\u00ED ikon projektu: install_library_folders=Slo\u017Eka knihoven: install_success_1=Projekt je nyn\u00ED nainstalov\u00E1n na va\u0161em syst\u00E9mu! install_success_2=Pro spu\u0161t\u011Bn\u00ED ho vyberte install_success_3=ikona knihovny projektu. wizard_info=Stiskn\u011Bte "Dal\u0161\u00ED" pro start. install_step_1=1. V\u00FDb\u011Br JClic knihovny install_step_2=2. Sta\u017Een\u00ED soubor\u016F install_step_3=3. Vytvo\u0159en\u00ED ikon install_step_4=Instalace dokon\u010Dena! install_info_info=Po\u017Eadujete vytvo\u0159en\u00ED projektu: settings_title=Nastaven\u00ED library_error_clone=Nelze naklonovat knihovnu! settings_security=Zabezpe\u010Den\u00ED settings_password_protect=Chr\u00E1nit nastaven\u00ED heslem settings_new_password=Nov\u00E9 heslo: settings_new_password_confirm=Potvr\u010Fte nov\u00E9 heslo: settings_general=Obecn\u00E9 settings_look=Vzhled: settings_skin=Motiv: settings_language=Jazyk: settings_reports=Sestavy settings_report_use=Zapsat sk\u00F3re do datab\u00E1ze settings_report_engine=T\u0159\u00EDda report\u00E9ra: settings_report_params=Parametry: settings_media=Multim\u00E9dia settings_media_enabled=Multim\u00E9dia povolena settings_media_system=Syst\u00E9m multim\u00E9di\u00ED: settings_media_event_sounds=Zvuky ud\u00E1lost\u00ED povoleny settings_library=Knihovny settings_library_autorun=Automaticky j\u00EDt ke knihovn\u00E1m p\u0159i startu JClicu m_Tools=N\u00E1stroje m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Aktivita m_Activity_Mnemonic=A action_openFile_caption=Otev\u0159\u00EDt soubor... action_openFile_tooltip=Otev\u0159\u00EDt soubor JClic projektu action_openFile_keys=OO action_openUrl_caption=Otev\u0159\u00EDt URL... action_openUrl_tooltip=Otev\u0159\u00EDt JClic projekt p\u0159\u00EDmo z internetu action_openUrl_keys=UU action_exit_caption=Ukon\u010Dit action_exit_tooltip=Uzav\u0159\u00EDt JClic action_exit_keys=XX action_settings_caption=Nastaven\u00ED... action_settings_tooltip=Upravit celkov\u00E1 nastaven\u00ED programu action_settings_keys=T action_libraries_tooltip=Otev\u0159\u00EDt nebo upravit JClic knihovnu. action_libraries_keys=LL action_helpAbout_tooltip=Informace o programu JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Tento obr\u00E1zek je p\u0159\u00EDli\u0161 velk\u00FD na ikonu! settings_report_tcp=P\u0159ipojit k JClic serveru sestav: settings_report_jdbc=P\u0159\u00EDm\u00E9 JDBC spojen\u00ED: settings_report_other=Jin\u00FD: settings_report_address=Hostitel: settings_report_port=Port: settings_report_driver=Ovlada\u010D: settings_report_url=URL: settings_report_user=U\u017Eivatel: settings_report_pwd=Heslo: settings_report_options=Parametry report\u00E9ra: settings_report_err_server=\u0160patn\u00E9 jm\u00E9no serveru sestav! settings_report_err_port=\u0160patn\u00E9 \u010D\u00EDslo portu! Vlo\u017Ete pros\u00EDm hodnotu mezi 1000 a 65000. settings_report_err=Nespr\u00E1vn\u00E1 syst\u00E9mov\u00E1 data report\u00E9ra! settings_report_type=Reportovac\u00ED stroj: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Autodetekce settings_security_tooltip=Bezpe\u010Dnostn\u00ED nastaven\u00ED settings_report_tooltip=Syst\u00E9mov\u00E9 nastaven\u00ED report\u00E9ra settings_media_tooltip=Nastaven\u00ED multimedi\u00E1ln\u00EDho syst\u00E9mu settings_general_tooltip=Nastaven\u00ED jazyka a vzhledu settings_library_tooltip=Nastaven\u00ED knihovny a editoru settings_look_tooltip=Vzhled u\u017Eivatelsk\u00E9ho rozhran\u00ED settings_skin_tooltip=V\u00FDb\u011Br grafick\u00E9ho vzhledu JClicu settings_language_tooltip=V\u00FDb\u011Br jazyka settings_report_use_tooltip=Zapne/vypne spojen\u00ED do datab\u00E1ze JClic sestav settings_report_tcp_tooltip=Stroj sestav zalo\u017Een\u00FD na TCP/IP spojen\u00ED settings_report_jdbc_tooltip=Stroj sestav zalo\u017Een\u00FD na p\u0159\u00EDm\u00E9m propojen\u00ED s datab\u00E1z\u00ED settings_report_other_tooltip=Ostatn\u00ED stroje sestav... settings_report_address_tooltip=Jm\u00E9no serveru sestav nebo IP adresa settings_report_port_tooltip=Port pou\u017Eit\u00FD pro spojen\u00ED (v\u00FDchoz\u00ED je 5510) edit_file=Soubor: error_launchLibrary=Chyba p\u0159i spou\u0161t\u011Bn\u00ED knihovny install_toSourceFolder=Instaluje se do zdrojov\u00E9 slo\u017Eky! edit_find_media=Naj\u00EDt soubor s m\u00E9dii... libraryManager_delete_caption=Smazat libraryManager_delete_tooltip=Smazat odkaz na vybranou knihovnu libraryManager_delete_confirm=Opravdu chcete smazat odkaz na vybranou knihovnu? libraryManager_new_exists=Tato knihovna je u\u017E propojena se syst\u00E9mem. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Vytvo\u0159it novou knihovnu projekt\u016F libraryManager_connectToExistingOption=P\u0159idat odkaz na existuj\u00EDc\u00ED knihovnu projekt\u016F libraryManager_fileOrUrlCaption=Soubor nebo URL: libraryManager_newLibraryTitle=Nov\u00E1 knihovna projektu libraryManager_warnNoFileSelected=Zadejte pros\u00EDm URL nebo jm\u00E9no souboru knihovny projekt\u016F\\! install_launchProject=Otev\u0159\u00EDt projekt nyn\u00ED settings_browser=Up\u0159ednost\u0148ovan\u00FD prohl\u00ED\u017Ee\u010D: settings_browser_tooltip=P\u0159\u00EDkaz pro spu\u0161t\u011Bn\u00ED prohl\u00ED\u017Ee\u010De (firefox, iexplore, mozilla, opera...) settings_country=Kod zem\u011B: settings_country_tooltip=Voliteln\u00FD dvoup\u00EDsmenn\u00FD k\u00F3d odpov\u00EDdaj\u00EDc\u00ED variant\u011B jazyka specifick\u00E9 pro danou zemi (nap\u0159.: BR pro brazilskou portugal\u0161tinu) settings_variant=Varianta: settings_variant_tooltip=Voliteln\u00E1 varianta k\u00F3du jazyka src/core/edu/xtec/resources/messages/PlayerMessages_de.properties000066400000000000000000000223401335566474600256740ustar00rootroot00000000000000# JClic player messages m_File=Datei settings_passwordRequired=Zum Ausf\u00FChren dieser Aktion sind nur JClick Administratoren berechtigt. m_Help=Hilfe m_Skin=Skin action_helpAbout_caption=\u00DCber \u2026 libraryManager_mainLibraryTitle=Hauptbibliothek library_badFormat=Diese JClic-Datei ist keine Projektbibliothek.\nBibliotheken sind eine spezielle Art von JClick-Projekten. library_mainMenu=Hauptmen\u00FC library_newLibraryName=Neue Projektbibliothek libraryManager_new_prompt=M\u00F6chten Sie eine neue Bibliothek erstellen oder Verbindung zu einer bereits\nvorhandenen Bibliothek herstellen libraryManager_connectToLibrary=Verbinden libraryManager_createNewLibrary=Neu libraryManager_new_tooltip=Neue Bibliothek anlegen oder mit neuer Bibliothek verbinden libraryManager_new_caption=Neu menuElement_dlg_icon_tooltip=Symbol f\u00FCr Button: menuElement_dlg_description_tooltip=Beschreibung des Buttons beim Dar\u00FCberfahren mit der Maus menuElement_dlg_description=Beschreibung: edit_find_image=Bild suchen \u2026 menuElement_dlg_icon=Symbol: edit_find_file=Datei suchen \u2026 menuElement_dlg_project_tooltip=Verzeichnis des JClic-Projekts menuElement_dlg_project=Projekt: menuElement_dlg_text_tooltip=Text f\u00FCr Button edit_text=Text: menu_dlg_name_tooltip=Ordnername library_dlg_name_tooltip=Name der Bibliothek edit_name=Name: edit_title=Titel: library_dlg_title=Eigenschaften der Bibliothek menu_dlg_title=Ordnereigenschaften menuElement_dlg_title=Eigenschaften des Buttons menu_delete_tooltip=Aktuelle Zusammenstellung l\u00F6schen menu_delete_caption=L\u00F6schen menuElement_delete_tooltip=Aktuellen Men\u00FCpunkt l\u00F6schen action_libraries_caption=Bibliotheken \u2026 dlg_save_title=Datei speichern \u2026 error_propertiesFile_beg=Fehler beim \u00D6ffnen " error_propertiesFile_end=". Standardeinstellungen werden verwendet. menuElement_delete_caption=L\u00F6schen menu_newMenuElement_tooltip=Neuen Shortcut zu Projekt anlegen menu_newMenuName=Neuer Ordner menu_newMenu_tooltip=Neuen Ordner f\u00FCr Projekt-Buttons anlegen menu_newMenu_caption=Zu neuem Button geh\u00F6render Ordner menu_newMenuElement_caption=Neuer Projektbutton menu_newMenuElementName=Neuer Button library_cancel_tooltip=\u00C4nderungen nicht speichern library_cancel_caption=Abbrechen libraryManager_edit_tooltip=Ausgew\u00E4hlte Bibliothek bearbeiten libraryManager_edit_caption=Bearbeiten library_select_caption_ok_tooltip=\u00C4nderungen speichern library_select_caption_tooltip=Ausgew\u00E4hlten Ordner \u00F6ffnen library_select_caption_ok=OK library_select_caption=Ausw\u00E4hlen library_caption=JClic Projektbibliothek libraryManager_select_tooltip=Ausgew\u00E4hlte Bibliothek \u00F6ffnen libraryManager_cancel_tooltip=Abbrechen libraryManager_cancel_caption=Abbrechen libraryManager_select_caption=Ausw\u00E4hlen libraryManager_caption=Bibliothek ausw\u00E4hlen library_error_reading=Fehler beim \u00D6ffnen der Projektbibliothek! wizard_next=Weiter > wizard_prev=< Zur\u00FCck wizard_finish=Beenden library_error_creating_icons=Fehler beim Erstellen der Symbole f\u00FCr Bibliothekt! install_title=Installation von JClic-Projekten install_info_description=Neues JClic-Projekt installieren install_info_from=Quellordner: wizard_cancel=L\u00F6schen wizard_cancel_tooltip=Aktion l\u00F6schen wizard_finish_tooltip=Aktion beenden wizard_next_tooltip=Schritt weiter wizard_prev_tooltip=Schritt zur\u00FCck install_select_library=Bibliothek ausw\u00E4hlen, in der das Projekt installiert werden soll: install_copy_files=Dateien kopieren install_source=Quelle: install_dest=Zielordner: install_status=Status: install_start=Mit Installation beginnen install_start_tooltip=Mit dem Kopieren der Dateien auf den Computer beginnen install_progress_tooltip=Installationsstatus install_msg_waiting=Best\u00E4tigung abwarten. install_msg_creating_dirs=Ordner werden angelegt install_msg_copying=Datei wird kopiert install_msg_end=Beendet! install_msg_cleanup=Dateien werden gel\u00F6scht \u2026 install_msg_cancel=Installation abgebrochen! install_error=Installationsfehler! install_select_folder=Ordner f\u00FCr Projekt-Icons ausw\u00E4hlen: install_library_folders=Bibliotheksordner: install_success_1=Projekt wurde erfolgreich auf Ihrem Computer installiert! install_success_2=Zum Starten der Anwendung entsprechendes install_success_3=Symbol aus Projektbibilothek ausw\u00E4hlen wizard_info=Zum Starten "Weiter" anklicken. install_step_1=1. JClic-Bibliothek ausw\u00E4hlen install_step_2=2. Dateien downloaden install_step_3=4. Icons anlegen install_step_4=Installation beendet! install_info_info=Sie m\u00F6chten folgendes Projekt installieren: settings_title=Einstellungen library_error_clone=Bibliothek kann nicht geclont werden! settings_security=Sicherheit settings_password_protect=Einstellungen durch Passwort sch\u00FCtzen settings_new_password=Neues Passwort: settings_new_password_confirm=Neues Passwort best\u00E4tigen: settings_general=Allgemein settings_look=Look & feel-Einstellungen: settings_skin=Skin: settings_language=Sprache: settings_reports=Reports settings_report_use=Ergebnisse in Datenbank eintragen settings_report_engine=Class: settings_report_params=Parameter: settings_media=Multimedia settings_media_enabled=Multimediaeinstellungen aktiviert settings_media_system=Multimediasystem: settings_media_event_sounds=Ereignissounds aktiviert settings_library=Bibliotheken settings_library_autorun=Beim Starten von JClick automatisch zu den Bibliotheken gehen m_Tools=Werkzeuge m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=\u00DCbung m_Activity_Mnemonic=A action_openFile_caption=Datei \u00F6ffnen \u2026 action_openFile_tooltip=JClick Projekt \u00F6ffnen action_openFile_keys=OO action_openUrl_caption=Adresse \u00F6ffnen \u2026 action_openUrl_tooltip=JClick Projekt direkt im Internet \u00F6ffnen action_openUrl_keys=UU action_exit_caption=Exit action_exit_tooltip=JClic schlie\u00DFen action_exit_keys=XX action_settings_caption=Einstellungen \u2026 action_settings_tooltip=Standardeinstellungen bearbeiten action_settings_keys=T action_libraries_tooltip=JClic Bibliothek \u00F6ffnen oder bearbeiten action_libraries_keys=LL action_helpAbout_tooltip=\u00DCber JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Bild f\u00FCr die Verwendung als Symbol zu gro\u00DF! settings_report_tcp=Mit JClic-Reportserver verbinden: settings_report_jdbc=Direktverbindung zu JDBC: settings_report_other=Andere: settings_report_address=Host: settings_report_port=Port: settings_report_driver=Treiber: settings_report_url=URL: settings_report_user=User: settings_report_pwd=Passwort: settings_report_options=Parameter f\u00FCr Report System: settings_report_err_server=Falscher name f\u00FCr Reportserver. settings_report_err_port=Falscher Port. Bitte Wert zwischen 1000 und 65000 eingeben. settings_report_err=Falsche Eingabe f\u00FCr Reportsystem settings_report_type=Reportsystem: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Auto-detect settings_security_tooltip=Sicherheitseinstellungen settings_report_tooltip=Einstellungen f\u00FCr Reportsystem settings_media_tooltip=Multimedia-Optionen settings_general_tooltip=Spracheinstellungen und Erscheinungsbild settings_library_tooltip=Bibliothekseinstellungen und -editor settings_look_tooltip=Look & feel - Pannel starten settings_skin_tooltip=JClick-Design ausw\u00E4hlen settings_language_tooltip=Sprachauswahl settings_report_use_tooltip=Verbindung zu JClic-Report-Datenbank aktivieren/deaktivieren settings_report_tcp_tooltip=Reportserver basiert auf TCP/IP-Verbindung settings_report_jdbc_tooltip=Reporterstellung \u00FCber Direktverbingung zu Datenbank settings_report_other_tooltip=Andere Berichtmaschinen \u2026 settings_report_address_tooltip=Servername oder IP-Adresse eingeben settings_report_port_tooltip=Port f\u00FCr Verbindung (Default-Einstellung: 5510) edit_file=Datei: error_launchLibrary=Fehler beim \u00D6ffnen der Bibliothek install_toSourceFolder=In den Quellordner installieren! edit_find_media=Multimediadatei suchen \u2026 libraryManager_delete_caption=L\u00F6schen libraryManager_delete_tooltip=Link auf die ausgew\u00E4hlte Bibliothek l\u00F6schen libraryManager_delete_confirm=M\u00F6chten Sie den Link auf die ausgew\u00E4hlte Bibliothek wirklich l\u00F6schen? libraryManager_new_exists=Bibliothek bereits ins System integriert. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Neue Projektbibliothek anlegen libraryManager_connectToExistingOption=Link auf eine bereits vorhandene Projektbibliothek legen libraryManager_fileOrUrlCaption=Datei oder URL: libraryManager_newLibraryTitle=Neue Projektbibliothek libraryManager_warnNoFileSelected=URL oder Namen der Projektbibliothek angeben! install_launchProject=Projekt jetzt \u00F6ffnen settings_browser=Bevorzugter Browser: settings_browser_tooltip=Befehl zum Starten des Browsers (firefox, iexplore, mozilla, opera, \u2026) settings_country=Country code: settings_country_tooltip=Optional two-letter code corresponding to the country-specific variant of the language (ex.: BR for Brazilian Portuguese) settings_variant=Variant: settings_variant_tooltip=Optional variant code of the language src/core/edu/xtec/resources/messages/PlayerMessages_el.properties000066400000000000000000000706271335566474600257170ustar00rootroot00000000000000# JClic player messages m_File=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF settings_passwordRequired=\u039F \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03B4\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE \u03C4\u03BF\u03C5 JClic \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03C0\u03B1\u03C1\u03B1\u03AF\u03C4\u03B7\u03C4\u03BF\u03C2 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03C9\u03B8\u03B5\u03AF \u03B1\u03C5\u03C4\u03AE \u03B7 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1. m_Help=\u0392\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1 m_Skin=\u0398\u03AD\u03BC\u03B1 action_helpAbout_caption=\u03A3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC... libraryManager_mainLibraryTitle=\u039A\u03CD\u03C1\u03B9\u03B1 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 library_badFormat=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03C4\u03BF\u03C5 JClic \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B9\u03B1 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5! library_mainMenu=\u039A\u03CD\u03C1\u03B9\u03BF \u039C\u03B5\u03BD\u03BF\u03CD library_newLibraryName=\u039D\u03AD\u03B1 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 libraryManager_new_prompt=\u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03B5\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03BD\u03AD\u03B1 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03AE \u03BD\u03B1 \u03C3\u03C5\u03BD\u03B4\u03B5\u03B8\u03B5\u03AF\u03C4\u03B5 \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03C5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03C3\u03B1; libraryManager_connectToLibrary=\u03A3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 libraryManager_createNewLibrary=\u039D\u03AD\u03BF libraryManager_new_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03AE \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03BC\u03B5 \u03BC\u03B9\u03B1 \u03BD\u03AD\u03B1 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 libraryManager_new_caption=\u039D\u03AD\u03BF menuElement_dlg_icon_tooltip=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 menuElement_dlg_description_tooltip=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03C4\u03BF\u03C5 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03C9\u03C2 \u03B5\u03C0\u03B5\u03BE\u03B7\u03B3\u03B7\u03BC\u03B1\u03C4\u03B9\u03BA\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF . menuElement_dlg_description=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE: edit_find_image=\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2... menuElement_dlg_icon=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF: edit_find_file=\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5... menuElement_dlg_project_tooltip=\u0394\u03B9\u03B1\u03B4\u03C1\u03BF\u03BC\u03AE \u03B3\u03B9\u03B1 \u03AD\u03C1\u03B3\u03BF \u03C4\u03BF\u03C5 JClic menuElement_dlg_project=\u0388\u03C1\u03B3\u03BF: menuElement_dlg_text_tooltip=\u03A0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 edit_text=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF: menu_dlg_name_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 library_dlg_name_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 edit_name=\u038C\u03BD\u03BF\u03BC\u03B1: edit_title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2: library_dlg_title=\u0399\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 menu_dlg_title=\u0399\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 menuElement_dlg_title=\u0399\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF\u03C5 menu_delete_tooltip=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C4\u03C1\u03AD\u03C7\u03BF\u03BD\u03C4\u03BF\u03C2 \u03BC\u03B5\u03BD\u03BF\u03CD menu_delete_caption=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE menuElement_delete_tooltip=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C4\u03C1\u03AD\u03C7\u03BF\u03BD\u03C4\u03BF\u03C2 \u03BC\u03B5\u03BD\u03BF\u03CD action_libraries_caption=\u0392\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B5\u03C2... dlg_save_title=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5... error_propertiesFile_beg=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B1\u03BD\u03BF\u03AF\u03B3\u03BC\u03B1\u03C4\u03BF\u03C2 " error_propertiesFile_end=". \u0398\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03BF\u03CD\u03BD \u03C4\u03B1 \u03C0\u03C1\u03BF\u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B1 menuElement_delete_caption=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE menu_newMenuElement_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03B1\u03C2 \u03C3\u03C5\u03BD\u03C4\u03CC\u03BC\u03B5\u03C5\u03C3\u03B7\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03BF \u03AD\u03C1\u03B3\u03BF menu_newMenuName=\u039D\u03AD\u03BF\u03C2 \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2 menu_newMenu_tooltip=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03C4\u03B1 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03B1 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 menu_newMenu_caption=\u039D\u03AD\u03BF\u03C2 \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF\u03C2 \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03C9\u03BD menu_newMenuElement_caption=\u039D\u03AD\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03AD\u03C1\u03B3\u03BF\u03C5 menu_newMenuElementName=\u039D\u03AD\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF library_cancel_tooltip=\u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7 \u03B1\u03BB\u03BB\u03B1\u03B3\u03CE\u03BD library_cancel_caption=\u0386\u03BA\u03C5\u03C1\u03BF libraryManager_edit_tooltip=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 libraryManager_edit_caption=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 library_select_caption_ok_tooltip=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03B1\u03BB\u03BB\u03B1\u03B3\u03CE\u03BD library_select_caption_tooltip=\u0394\u03B9\u03AC\u03BB\u03B5\u03BE\u03B5 \u03C4\u03BF\u03BD \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF library_select_caption_ok=\u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9 library_select_caption=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE library_caption=\u0392\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03AD\u03C1\u03B3\u03BF\u03C5 \u03C4\u03BF\u03C5 JClic libraryManager_select_tooltip=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C4\u03B7\u03C2 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 libraryManager_cancel_tooltip=\u0386\u03BA\u03C5\u03C1\u03BF libraryManager_cancel_caption=\u0386\u03BA\u03C5\u03C1\u03BF libraryManager_select_caption=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE libraryManager_caption=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 library_error_reading=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B1\u03BD\u03AC\u03B3\u03BD\u03C9\u03C3\u03B7\u03C2 \u03C4\u03B7\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5! wizard_next=\u0395\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF > wizard_prev=<\u03A0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF wizard_finish=\u03A4\u03AD\u03BB\u03BF\u03C2 library_error_creating_icons=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B5\u03B9\u03BA\u03BF\u03BD\u03B9\u03B4\u03AF\u03C9\u03BD \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2! install_title=\u0395\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03AD\u03C1\u03B3\u03C9\u03BD \u03C4\u03BF\u03C5 JClic install_info_description=\u0395\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03BD\u03AD\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 \u03C4\u03BF\u03C5 JClic install_info_from=\u0391\u03C0\u03CC: wizard_cancel=\u0386\u03BA\u03C5\u03C1\u03BF wizard_cancel_tooltip=\u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1\u03C2 wizard_finish_tooltip=\u039F\u03BB\u03BF\u03BA\u03BB\u03AE\u03C1\u03C9\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1\u03C2 wizard_next_tooltip=\u0395\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF \u03B2\u03AE\u03BC\u03B1 \u03C4\u03B7\u03C2 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1\u03C2 wizard_prev_tooltip=\u03A0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF \u03B2\u03AE\u03BC\u03B1 \u03C4\u03B7\u03C2 \u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B1\u03C2 install_select_library=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 \u03B3\u03B9\u03B1 \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5: install_copy_files=\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 install_source=\u03A0\u03B7\u03B3\u03AE: install_dest=\u03A0\u03C1\u03BF\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2: install_status=\u039A\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7: install_start=\u0388\u03BD\u03B1\u03C1\u03BE\u03B7 \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2 install_start_tooltip=\u0388\u03BD\u03B1\u03C1\u03BE\u03B7 \u03B1\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03C3\u03C4\u03BF\u03BD \u03C5\u03C0\u03BF\u03BB\u03BF\u03B3\u03B9\u03C3\u03C4\u03AE \u03C3\u03B1\u03C2 install_progress_tooltip=\u03A0\u03C1\u03CC\u03BF\u03B4\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2 install_msg_waiting=\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03B3\u03B9\u03B1 \u03B5\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 install_msg_creating_dirs=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03C6\u03B1\u03BA\u03AD\u03BB\u03C9\u03BD install_msg_copying=\u0391\u03BD\u03C4\u03B9\u03B3\u03C1\u03B1\u03C6\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 install_msg_end=\u039F\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5! install_msg_cleanup=\u0395\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7 \u03BA\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD... install_msg_cancel=\u0397 \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03B1\u03BA\u03C5\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5! install_error=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2 install_select_folder=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C6\u03B1\u03BA\u03AD\u03BB\u03BF\u03C5 \u03B3\u03B9\u03B1 \u03C4\u03BF\u03C0\u03BF\u03B8\u03AD\u03C4\u03B7\u03C3\u03B7 \u03C4\u03C9\u03BD \u03B5\u03B9\u03BA\u03BF\u03BD\u03B9\u03B4\u03AF\u03C9\u03BD \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5: install_library_folders=\u03A6\u03AC\u03BA\u03B5\u03BB\u03BF\u03B9 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2: install_success_1=\u03A4\u03BF \u03AD\u03C1\u03B3\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C4\u03CE\u03C1\u03B1 \u03B5\u03B3\u03BA\u03B1\u03C4\u03B5\u03C3\u03C4\u03B7\u03BC\u03AD\u03BD\u03BF \u03C3\u03C4\u03BF\u03BD \u03C5\u03C0\u03BF\u03BB\u03BF\u03B3\u03B9\u03C3\u03C4\u03AE \u03C3\u03B1\u03C2! install_success_2=\u0393\u03B9\u03B1 \u03BD\u03B1 \u03C4\u03BF \u03B5\u03BA\u03C4\u03B5\u03BB\u03AD\u03C3\u03B5\u03C4\u03B5, \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 install_success_3=\u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03C3\u03C4\u03B7 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 wizard_info=\u03A0\u03B1\u03C4\u03AE\u03C3\u03C4\u03B5 "\u0395\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF" \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BE\u03B5\u03BA\u03B9\u03BD\u03AE\u03C3\u03B5\u03C4\u03B5. install_step_1=1. \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 \u03C4\u03BF\u03C5 JClic install_step_2=2. \u039C\u03B5\u03C4\u03B1\u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD install_step_3=3. \u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B5\u03B9\u03BA\u03BF\u03BD\u03B9\u03B4\u03AF\u03C9\u03BD install_step_4=\u0397 \u03B5\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03BF\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03B8\u03B7\u03BA\u03B5! install_info_info=\u0396\u03B7\u03C4\u03AE\u03C3\u03B1\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03B3\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03B1\u03B8\u03B5\u03AF \u03C4\u03BF \u03AD\u03C1\u03B3\u03BF: settings_title=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 library_error_clone=\u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03BA\u03BB\u03C9\u03BD\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 \u03C4\u03B7\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2! settings_security=\u0391\u03C3\u03C6\u03AC\u03BB\u03B5\u03B9\u03B1 settings_password_protect=\u03A0\u03C1\u03BF\u03C3\u03C4\u03B1\u03C3\u03AF\u03B1 \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03BC\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 settings_new_password=\u039D\u03AD\u03BF\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2: settings_new_password_confirm=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u03BD\u03AD\u03BF\u03C5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2: settings_general=\u0393\u03B5\u03BD\u03B9\u03BA\u03AC settings_look=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 & \u0391\u03AF\u03C3\u03B8\u03B7\u03C3\u03B7: settings_skin=\u0398\u03AD\u03BC\u03B1: settings_language=\u0393\u03BB\u03CE\u03C3\u03C3\u03B1: settings_reports=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 settings_report_use=\u0395\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1\u03C2 \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD settings_report_engine=\u0395\u03AF\u03B4\u03BF\u03C2 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03BF\u03CD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD: settings_report_params=\u03A0\u03B1\u03C1\u03AC\u03BC\u03B5\u03C4\u03C1\u03BF\u03B9: settings_media=\u03A0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03B1 settings_media_enabled=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD settings_media_system=\u03A3\u03CD\u03C3\u03C4\u03B7\u03BC\u03B1 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD: settings_media_event_sounds=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03AE\u03C7\u03C9\u03BD \u03C3\u03C5\u03BC\u03B2\u03AC\u03BD\u03C4\u03C9\u03BD settings_library=\u0392\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B5\u03C2 settings_library_autorun=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03B9\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B5\u03C2 \u03CC\u03C4\u03B1\u03BD \u03BE\u03B5\u03BA\u03B9\u03BD\u03AC \u03C4\u03BF JClic m_Tools=\u0395\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03B1 m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 m_Activity_Mnemonic=A action_openFile_caption=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5... action_openFile_tooltip=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 \u03C4\u03BF\u03C5 JClic action_openFile_keys=OO action_openUrl_caption=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 URL... action_openUrl_tooltip=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03AD\u03C1\u03B3\u03BF\u03C5 \u03C4\u03BF\u03C5 JClic \u03BA\u03B1\u03C4\u03B5\u03C5\u03B8\u03B5\u03AF\u03B1\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF Internet action_openUrl_keys=UU action_exit_caption=\u0388\u03BE\u03BF\u03B4\u03BF\u03C2 action_exit_tooltip=\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF \u03C4\u03BF\u03C5 JClic action_exit_keys=\u03A7\u03A7 action_settings_caption=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2... action_settings_tooltip=\u0394\u03B9\u03B5\u03C5\u03B8\u03AD\u03C4\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B8\u03BF\u03BB\u03B9\u03BA\u03CE\u03BD \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03C4\u03BF\u03C5 \u03C0\u03C1\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 action_settings_keys=T action_libraries_tooltip=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03AE \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03BC\u03B9\u03B1\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 \u03C4\u03BF\u03C5 JClic. action_libraries_keys=LL action_helpAbout_tooltip=\u03A0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03AF\u03B5\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03BF JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=\u0391\u03C5\u03C4\u03AE \u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF \u03C9\u03C2 \u03B5\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF! settings_report_tcp=\u03A3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C4\u03BF \u03B4\u03B9\u03B1\u03BA\u03BF\u03BC\u03B9\u03C3\u03C4\u03AE \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD \u03C4\u03BF\u03C5 JClic: settings_report_jdbc=\u0391\u03C0\u03B5\u03C5\u03B8\u03B5\u03AF\u03B1\u03C2 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C4\u03B7 JDBC: settings_report_other=\u0386\u03BB\u03BB\u03BF: settings_report_address=\u0394\u03B9\u03B1\u03BA\u03BF\u03BC\u03B9\u03C3\u03C4\u03AE\u03C2: settings_report_port=\u0398\u03CD\u03C1\u03B1: settings_report_driver=\u039F\u03B4\u03B7\u03B3\u03CC\u03C2: settings_report_url=URL: settings_report_user=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2: settings_report_pwd=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2: settings_report_options=\u03A0\u03B1\u03C1\u03AC\u03BC\u03B5\u03C4\u03C1\u03BF\u03B9 \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03BF\u03C5 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD settings_report_err_server=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03B4\u03B9\u03B1\u03BA\u03BF\u03BC\u03B9\u03C3\u03C4\u03AE \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD! settings_report_err_port=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03B8\u03CD\u03C1\u03B1\u03C2! \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03C4\u03B9\u03BC\u03AE \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD 1000 \u03BA\u03B1\u03B9 65000. settings_report_err=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC\u03C2 \u03C3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 settings_report_type=\u039C\u03B7\u03C7\u03B1\u03BD\u03AE \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 settings_security_tooltip=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03B1\u03C3\u03C6\u03AC\u03BB\u03B5\u03B9\u03B1\u03C2 settings_report_tooltip=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03C3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD settings_media_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2 \u03C3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD settings_general_tooltip=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03B1\u03BD\u03B1\u03BB\u03BF\u03B3\u03B9\u03CE\u03BD settings_library_tooltip=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 \u03BA\u03B1\u03B9 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03C4\u03AE\u03C2 settings_look_tooltip=\u0394\u03B9\u03B5\u03C0\u03B1\u03C6\u03AE \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 & \u0391\u03AF\u03C3\u03B8\u03B7\u03C3\u03B7 settings_skin_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B1\u03BD\u03B1\u03BB\u03BF\u03B3\u03AF\u03B1\u03C2 \u03B3\u03C1\u03B1\u03C6\u03B9\u03BA\u03CE\u03BD \u03B3\u03B9\u03B1 \u03C4\u03BF JClic settings_language_tooltip=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1\u03C2 settings_report_use_tooltip=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7/\u0391\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7\u03C2 \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03BF\u03C5 JClic settings_report_tcp_tooltip=\u039C\u03B7\u03C7\u03B1\u03BD\u03AE \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD \u03B2\u03B1\u03C3\u03B9\u03B6\u03CC\u03BC\u03B5\u03BD\u03B7 \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 TCP/IP settings_report_jdbc_tooltip=\u039C\u03B7\u03C7\u03B1\u03BD\u03AE \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD \u03B2\u03B1\u03C3\u03B9\u03B6\u03CC\u03BC\u03B5\u03BD\u03B7 \u03C3\u03B5 \u03B1\u03C0\u03B5\u03C5\u03B8\u03B5\u03AF\u03B1\u03C2 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03BC\u03B5 \u03BC\u03B9\u03B1 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD settings_report_other_tooltip=\u0386\u03BB\u03BB\u03B5\u03C2 \u03BC\u03B7\u03C7\u03B1\u03BD\u03AD\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD... settings_report_address_tooltip=\u038C\u03BD\u03BF\u03BC\u03B1 \u03B4\u03B9\u03B1\u03BA\u03BF\u03BC\u03B9\u03C3\u03C4\u03AE \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD \u03AE \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 IP settings_report_port_tooltip=\u0398\u03CD\u03C1\u03B1 \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 (\u03B7 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B7 5510) edit_file=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF: error_launchLibrary=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 install_toSourceFolder=\u0395\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03C3\u03C4\u03BF\u03BD \u03C0\u03B7\u03B3\u03B1\u03AF\u03BF \u03C6\u03AC\u03BA\u03B5\u03BB\u03BF! edit_find_media=\u0395\u03CD\u03C1\u03B5\u03C3\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C0\u03BF\u03BB\u03C5\u03BC\u03AD\u03C3\u03C9\u03BD... libraryManager_delete_caption=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE libraryManager_delete_tooltip=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C0\u03B1\u03C1\u03B1\u03C0\u03BF\u03BC\u03C0\u03AE\u03C2 \u03C3\u03C4\u03B7\u03BD \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 libraryManager_delete_confirm=\u0398\u03AD\u03BB\u03B5\u03C4\u03B5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03AC \u03BD\u03B1 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03C8\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03C0\u03B1\u03C1\u03B1\u03C0\u03BF\u03BC\u03C0\u03AE \u03C3\u03C4\u03B7\u03BD \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7; libraryManager_new_exists=\u0391\u03C5\u03C4\u03AE \u03B7 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03BA\u03CC\u03BC\u03B7 \u03C3\u03C5\u03BD\u03B4\u03B5\u03B4\u03B5\u03BC\u03AD\u03BD\u03B7 \u03BC\u03B5 \u03C4\u03BF \u03C3\u03CD\u03C3\u03C4\u03B7\u03BC\u03B1... edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03B1\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 \u03AD\u03C1\u03B3\u03BF\u03C5 libraryManager_connectToExistingOption=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C5\u03C0\u03B5\u03C1\u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03BC\u03BF\u03C5 \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03C5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03C3\u03B1 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 libraryManager_fileOrUrlCaption=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF \u03AE URL: libraryManager_newLibraryTitle=\u039D\u03AD\u03B1 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7 \u03AD\u03C1\u03B3\u03BF\u03C5 libraryManager_warnNoFileSelected=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C4\u03BF URL \u03AE \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C4\u03B7\u03C2 \u03B2\u03B9\u03B2\u03BB\u03B9\u03BF\u03B8\u03AE\u03BA\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5: install_launchProject=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 \u03C4\u03CE\u03C1\u03B1 settings_browser=\u03A0\u03C1\u03BF\u03C4\u03B9\u03BC\u03CE\u03BC\u03B5\u03BD\u03BF\u03C2 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE\u03C2: settings_browser_tooltip=\u0395\u03BD\u03C4\u03BF\u03BB\u03AE \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (firefox, mozilla, opera, iexplore...) settings_country=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C7\u03CE\u03C1\u03B1\u03C2: settings_country_tooltip=\u03A0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC\u03C2 \u03B4\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03C4\u03B9\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF \u03C3\u03B5 \u03C3\u03C5\u03B3\u03BA\u03B5\u03BA\u03C1\u03B9\u03BC\u03AD\u03BD\u03B7 \u03B5\u03BA\u03B4\u03BF\u03C7\u03AE \u03BC\u03B9\u03B1\u03C2 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1\u03C2 (\u03C0.\u03C7.: BR \u03B3\u03B9\u03B1 \u03C4\u03B1 \u03A0\u03BF\u03C1\u03C4\u03BF\u03B3\u03B1\u03BB\u03B9\u03BA\u03AC \u03C4\u03B7\u03C2 \u0392\u03C1\u03B1\u03B6\u03B9\u03BB\u03AF\u03B1\u03C2) settings_variant=\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03BA\u03C4\u03B9\u03BA\u03AE \u03BC\u03BF\u03C1\u03C6\u03AE settings_variant_tooltip=\u03A0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03B5\u03BA\u03B4\u03BF\u03C7\u03AE\u03C2 \u03C4\u03B7\u03C2 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B1\u03C2 src/core/edu/xtec/resources/messages/PlayerMessages_es.properties000066400000000000000000000234321335566474600257160ustar00rootroot00000000000000# JClic player messages m_File=Archivo settings_passwordRequired=Para efectuar esta operaci\u00F3n hay que introducir la contrase\u00F1a de administraci\u00F3n de JClic. m_Help=Ayuda m_Skin=Apariencia action_helpAbout_caption=Acerca de... libraryManager_mainLibraryTitle=Biblioteca principal library_badFormat=Este archivo JClic no es del tipo "biblioteca de proyectos".\nLas bibliotecas son un tipo especial de archivos JClic. library_mainMenu=Men\u00FA principal library_newLibraryName=Nueva biblioteca de proyectos libraryManager_new_prompt=\u00BFDesea crear una nueva biblioteca o conectarse a una biblioteca existente? libraryManager_connectToLibrary=Conectarse libraryManager_createNewLibrary=Nueva libraryManager_new_tooltip=Crear o conectarse a una nueva biblioteca libraryManager_new_caption=Nueva menuElement_dlg_icon_tooltip=Imagen que se muestra en el bot\u00F3n menuElement_dlg_description_tooltip=Texto flotante que aparecer\u00E1 cuando se deje el puntero quieto sobre el bot\u00F3n. menuElement_dlg_description=Descripci\u00F3n: edit_find_image=Buscar imagen... menuElement_dlg_icon=Icono: edit_find_file=Buscar archivo... menuElement_dlg_project_tooltip=Ubicaci\u00F3n del proyecto JClic menuElement_dlg_project=Proyecto: menuElement_dlg_text_tooltip=Texto del bot\u00F3n edit_text=Texto: menu_dlg_name_tooltip=Nombre de la carpeta library_dlg_name_tooltip=Nombre de la biblioteca edit_name=Nombre: edit_title=T\u00EDtulo: library_dlg_title=Propiedades de la biblioteca menu_dlg_title=Propiedades de la carpeta menuElement_dlg_title=Propiedades del bot\u00F3n menu_delete_tooltip=Eliminar el men\u00FA seleccionado menu_delete_caption=Eliminar menuElement_delete_tooltip=Eliminar el elemento de men\u00FA seleccionado action_libraries_caption=Bibliotecas... dlg_save_title=Guardar archivo... error_propertiesFile_beg=Error al abrir " error_propertiesFile_end=". Se utilizaran los valores por defecto. menuElement_delete_caption=Eliminar menu_newMenuElement_tooltip=Crear un nuevo bot\u00F3n de proyecto menu_newMenuName=Nueva carpeta menu_newMenu_tooltip=Crear una nueva carpeta de botones de proyecto menu_newMenu_caption=Nueva carpeta de iconos menu_newMenuElement_caption=Nuevo bot\u00F3n de proyecto menu_newMenuElementName=Nuevo bot\u00F3n library_cancel_tooltip=Cancelar las modificaciones library_cancel_caption=Cancelar libraryManager_edit_tooltip=Editar la biblioteca seleccionada libraryManager_edit_caption=Editar library_select_caption_ok_tooltip=Guardar los cambios library_select_caption_tooltip=Elegir la carpeta seleccionada library_select_caption_ok=Aceptar library_select_caption=Seleccionar library_caption=Biblioteca de proyectos JClic libraryManager_select_tooltip=Abrir la biblioteca seleccionada libraryManager_cancel_tooltip=Cancelar libraryManager_cancel_caption=Cancelar libraryManager_select_caption=Seleccionar libraryManager_caption=Selecci\u00F3n de la biblioteca de proyectos library_error_reading=\u00A1Error al leer la biblioteca de proyectos! wizard_next=Siguiente > wizard_prev=< Anterior wizard_finish=Finalizar library_error_creating_icons=\u00A1Error al crear el icono en la biblioteca! install_title=Instalaci\u00F3n de proyectos JClic install_info_description=Instalaci\u00F3n de un nuevo proyecto JClic install_info_from=Desde: wizard_cancel=Cancelar wizard_cancel_tooltip=Cancelar la operaci\u00F3n wizard_finish_tooltip=Finalizar la operaci\u00F3n wizard_next_tooltip=Siguiente paso de la operaci\u00F3n wizard_prev_tooltip=Paso anterior de la operaci\u00F3n install_select_library=Seleccione la biblioteca en la que se instalar\u00E1 el proyecto: install_copy_files=Copia de archivos install_source=Origen: install_dest=Destino: install_status=Estado: install_start=Iniciar la instalaci\u00F3n install_start_tooltip=Iniciar la copia de archivos a su ordenador install_progress_tooltip=Progreso de la instalaci\u00F3n install_msg_waiting=Esperando confirmaci\u00F3n. install_msg_creating_dirs=Creando carpetas install_msg_copying=Copiando el archivo install_msg_end=\u00A1Acabado! install_msg_cleanup=Limpiando... install_msg_cancel=\u00A1Instalaci\u00F3n cancelada! install_error=\u00A1Se produjo un error durante la instalaci\u00F3n! install_select_folder=Seleccione la carpeta en la que se crear\u00E1n los iconos del proyecto: install_library_folders=Carpetas de la biblioteca: install_success_1=El proyecto se instal\u00F3 correctamente! install_success_2=Para ponerlo en marcha seleccione su install_success_3=icono en la biblioteca de proyectos. wizard_info=Haga clic en "Siguiente" para empezar. install_step_1=1. Selecci\u00F3n de la biblioteca install_step_2=2. Descarga de archivos install_step_3=3. Creaci\u00F3n de iconos install_step_4=\u00A1Instalaci\u00F3n acabada! install_info_info=Ha solicitado instalar el proyecto: settings_title=Configuraci\u00F3n library_error_clone=\u00A1No se ha podido clonar la biblioteca! settings_security=Seguridad settings_password_protect=Proteger los cambios de configuraci\u00F3n con contrase\u00F1a settings_new_password=Nueva contrase\u00F1a: settings_new_password_confirm=Confirmar nueva contrase\u00F1a: settings_general=General settings_look=Aspecto: settings_skin=Piel: settings_language=Idioma: settings_reports=Informes settings_report_use=Guardar los resultados de las actividades en una base de datos settings_report_engine=Clase: settings_report_params=Par\u00E1metros: settings_media=Multimedia settings_media_enabled=Multimedia activado settings_media_system=Sistema multimedia: settings_media_event_sounds=Sonidos de evento activados settings_library=Bibliotecas settings_library_autorun=Mostrar autom\u00E1ticamente la biblioteca al inicio m_Tools=Herramientas m_File_Mnemonic=F m_Tools_Mnemonic=H m_Help_Mnemonic=Y m_Activity=Actividad m_Activity_Mnemonic=A action_openFile_caption=Abrir el archivo... action_openFile_tooltip=Abrir un archivo de proyecto JClic action_openFile_keys=AO action_openUrl_caption=Abrir una ubicaci\u00F3n web... action_openUrl_tooltip=Abrir un proyecto JClic directamente desde Internet action_openUrl_keys=UU action_exit_caption=Salir action_exit_tooltip=Cerrar el JClic action_exit_keys=LX action_settings_caption=Configuraci\u00F3n... action_settings_tooltip=Ajustar las opciones globales del programa action_settings_keys=C action_libraries_tooltip=Abrir o modificar una biblioteca JClic action_libraries_keys=BB action_helpAbout_tooltip=Informaci\u00F3n sobre el JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=\u00A1Esta imagen es demasiado grande para ser utilizada como icono! settings_report_tcp=Conectarse a un servidor de informes JClic: settings_report_jdbc=Conexi\u00F3n directa a una base de datos JDBC: settings_report_other=Otros: settings_report_address=Servidor: settings_report_port=Puerto: settings_report_driver=Controlador: settings_report_url=URL: settings_report_user=Usuario: settings_report_pwd=Contrase\u00F1a: settings_report_options=Par\u00E1metros: settings_report_err_server=\u00A1El nombre del servidor de informes es incorrecto! settings_report_err_port=Valor incorrecto del puerto en el sistema de informes. Por favor, indique un valor entre 1000 y 65000. settings_report_err=\u00A1Datos incorrectos para el sistema de informes! settings_report_type=Reporter type: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Detecci\u00F3n autom\u00E1tica settings_security_tooltip=Opciones de seguridad settings_report_tooltip=Configuraci\u00F3n del sistema de informes settings_media_tooltip=Configuraci\u00F3n del sistema multimedia settings_general_tooltip=Opciones de idioma y aspecto settings_library_tooltip=Configuraci\u00F3n y edici\u00F3n de bibliotecas settings_look_tooltip=Aspecto del interfaz de usuario settings_skin_tooltip=Selecci\u00F3n del dise\u00F1o gr\u00E1fico de JClic settings_language_tooltip=Selecci\u00F3n del idioma settings_report_use_tooltip=Activa o desactiva a conexi\u00F3n a una base de datos de informes JClic settings_report_tcp_tooltip=Motor de informes basado en una conexi\u00F3n TCP/IP settings_report_jdbc_tooltip=Motor de informes basado en una conexi\u00F3n directa a una base de datos settings_report_other_tooltip=Otros motores de informes... settings_report_address_tooltip=Nombre o direcci\u00F3n IP del servidor de informes settings_report_port_tooltip=Puerto usado para la conexi\u00F3n (por defecto: 5510) edit_file=Archivo: error_launchLibrary=Error al abrir la biblioteca install_toSourceFolder=\u00A1Instalando en la carpeta origen! edit_find_media=Buscar recurso... libraryManager_delete_caption=Suprimir libraryManager_delete_tooltip=Suprimir la referencia a la biblioteca seleccionada libraryManager_delete_confirm=\u00BFRealmente desea suprimir la referencia a la biblioteca seleccionada? libraryManager_new_exists=\u00A1Esta biblioteca se encuentra ya conectada al sistema! edit_find_image_keys=B* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Crear una nueva biblioteca de proyectos libraryManager_connectToExistingOption=A\u00F1adir un enlace a una biblioteca ya existente libraryManager_fileOrUrlCaption=Archivo o URL: libraryManager_newLibraryTitle=Nueva biblioteca de proyectos libraryManager_warnNoFileSelected=Por favor, escriba el URL o nombre de archivo de la biblioteca de proyectos a la que desea acceder. install_launchProject=Abrir ahora el proyecto settings_browser=Navegador preferido: settings_browser_tooltip=Orden utilizada para lanzar el navegador (firefox, iexplore, mozilla, opera...) settings_country=C\u00F3digo de pa\u00EDs: settings_country_tooltip=C\u00F3digo opcional de dos letras correspondiente a la variante dialectal de un territorio (ej.: BR para portugu\u00E9s del Brasil) settings_variant=Variante: settings_variant_tooltip=C\u00F3digo opcional de variante del idioma src/core/edu/xtec/resources/messages/PlayerMessages_eu.properties000066400000000000000000000217231335566474600257210ustar00rootroot00000000000000# JClic player messages m_File=Fitxategia settings_passwordRequired=JClic kudeatzaile-pasahitza behar da ekintza hau burutzeko. m_Help=Laguntza m_Skin=Itxura action_helpAbout_caption=Honi buruz... libraryManager_mainLibraryTitle=Liburutegi nagusia library_badFormat=JClic fitxategi hau ez da proiektu-liburutegia!\nLiburutegiak JClic proiektu-mota berezia dira. library_mainMenu=Menu nagusia library_newLibraryName=Proiektu-liburutegi berria libraryManager_new_prompt=Liburutegi berria sortu nahi duzu edo lehendik dagoen batera konektatu? libraryManager_connectToLibrary=Konektatu libraryManager_createNewLibrary=Berria libraryManager_new_tooltip=Liburutegi berria sortu edo konektatu libraryManager_new_caption=Berria menuElement_dlg_icon_tooltip=Botoiaren irudia menuElement_dlg_description_tooltip=Punteroa botoiaren gainean geldituta agertuko den testua. menuElement_dlg_description=Deskribapena: edit_find_image=Bilatu irudia... menuElement_dlg_icon=Ikonoa: edit_find_file=Bilatu fitxategia... menuElement_dlg_project_tooltip=JClic proiektuaren kokapena menuElement_dlg_project=Proiektua: menuElement_dlg_text_tooltip=Botoiaren testua edit_text=Testua: menu_dlg_name_tooltip=Direktorioaren izena library_dlg_name_tooltip=Liburutegiaren izena edit_name=Izena: edit_title=Izenburua: library_dlg_title=Liburutegiaren propietateak menu_dlg_title=Direktorioaren propietateak menuElement_dlg_title=Botoiaren propietateak menu_delete_tooltip=Ezabatu oraingo menua menu_delete_caption=Ezabatu menuElement_delete_tooltip=Ezabatu oraingo menuaren elementua action_libraries_caption=Liburutegiak... dlg_save_title=Gorde fitxategia... error_propertiesFile_beg=Errorea zabaltzean " error_propertiesFile_end=". Berezko baloreak erabiliko dira. menuElement_delete_caption=Ezabatu menu_newMenuElement_tooltip=Proiekturako sarbide zuzen berria sortu menu_newMenuName=Karpeta berria menu_newMenu_tooltip=Proiektu-botoierako karpeta berria sortu menu_newMenu_caption=Ikono-karpeta berria menu_newMenuElement_caption=Proiektu-botoi berria menu_newMenuElementName=Botoi berria library_cancel_tooltip=Utzi aldaketak library_cancel_caption=Utzi libraryManager_edit_tooltip=Editatu aukeratutako liburutegia libraryManager_edit_caption=Editatu library_select_caption_ok_tooltip=Aldaketak gorde library_select_caption_tooltip=Aukeratu adierazitako direktorioa library_select_caption_ok=Ados library_select_caption=Aukeratu library_caption=JClic proiektuen liburutegia libraryManager_select_tooltip=Zabaldu aukeratutako liburutegia libraryManager_cancel_tooltip=Utzi libraryManager_cancel_caption=Utzi libraryManager_select_caption=Aukeratu libraryManager_caption=Aukeratu liburutegia library_error_reading=Errorea proiektuen liburutegia irakurtzean! wizard_next=Hurrengoa > wizard_prev=< Aurrekoa wizard_finish=Amaitu library_error_creating_icons=Errorea liburutegi-ikonoak sortzean! install_title=JClic proiektuen instalazioa install_info_description=JClic proiektu berriaren instalazioa install_info_from=Hemendik: wizard_cancel=Utzi wizard_cancel_tooltip=Utzi eragiketa wizard_finish_tooltip=Amaitu eragiketa wizard_next_tooltip=Eragiketaren hurrengo pausua wizard_prev_tooltip=Eragiketaren aurreko pausua install_select_library=Aukera ezazu zein liburutegitan instalatuko den proiektua: install_copy_files=Fitxategia kopiatu install_source=Iturburua: install_dest=Helburua: install_status=Egoera: install_start=Hasi instalazioa install_start_tooltip=Hasi kopiatzen fitxategiak zure ordenagailuan install_progress_tooltip=Instalazioaren aurrerapena install_msg_waiting=Baieztapenaren zain. install_msg_creating_dirs=Direktorioak sortzen install_msg_copying=Fitxategia kopiatzen install_msg_end=Amaituta! install_msg_cleanup=Garbitzen... install_msg_cancel=Instalazioa bertan behera utzita! install_error=Errorea instalatzean! install_select_folder=Aukera ezazu zein karpetatan sortuko diren proiektuaren ikonoak: install_library_folders=Liburutegiaren karpetak: install_success_1=Proiektua instalatuta dago orain zure sisteman! install_success_2=Martxan jartzeko, aukera ezazu install_success_3=ikonoa proiektuen liburutegian. wizard_info=Sakatu "Hurrengoa"ri hasteko. install_step_1=1. Aukeratu JClic liburutegia install_step_2=2. Deskargatu fitxategiak install_step_3=3. Ikonoak sortu install_step_4=Instalazioa amaituta! install_info_info=Proiektua instalatzea eskatu duzu: settings_title=Ezarpenak library_error_clone=Ezin da liburutegia klonatu! settings_security=Segurtasuna settings_password_protect=Babestu pasahitzez ezarpenak settings_new_password=Pasahitz berria: settings_new_password_confirm=Konfirmatu pasahitz berria: settings_general=Orokorra settings_look=Itxura: settings_skin=Azala: settings_language=Hizkuntza: settings_reports=Txostenak settings_report_use=Jardueren puntuazioak datu-basean gorde settings_report_engine=Mota: settings_report_params=Parametroak: settings_media=Multimedia settings_media_enabled=Multimedia gaituta settings_media_system=Multimedia sistema: settings_media_event_sounds=Ekintza-soinuak gaituta settings_library=Liburutegiak settings_library_autorun=Jo automatikoki liburutegietara JClic hastean m_Tools=Tresnak m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=L m_Activity=Jarduera m_Activity_Mnemonic=A action_openFile_caption=Ireki fitxategia... action_openFile_tooltip=Ireki JClic proiektuko fitxategi bat action_openFile_keys=IF action_openUrl_caption=Ireki URL-a... action_openUrl_tooltip=Ireki JClic proiektu bat zuzenean Internetetik action_openUrl_keys=UU action_exit_caption=Irten action_exit_tooltip=Itxi JClic action_exit_keys=II action_settings_caption=Ezarpenak... action_settings_tooltip=Programaren ezarpen orokorrak doitu action_settings_keys=E action_libraries_tooltip=Zabaldu edo editatu JClic liburutegia action_libraries_keys=BB action_helpAbout_tooltip=JClic-i buruzko informazioa action_helpAbout_keys=ZB menuElement_err_iconTooLarge=Irudia handiegia da ikono batean erabiltzeko! settings_report_tcp=Konektatu Jclic txostenen zerbitzarira: settings_report_jdbc=JDBC lotura zuzena: settings_report_other=Bestelakoa: settings_report_address=Ostalaria: settings_report_port=Ataka: settings_report_driver=Kontrolatzailea: settings_report_url=URL-a: settings_report_user=Erabiltzailea: settings_report_pwd=Pasahitza: settings_report_options=Parametroak: settings_report_err_server=Okerreko txosten-zerbitzariaren izena! settings_report_err_port=Ataka zenbaki ezegokia! Mesedez, sartu 1000 eta 65000 arteko balore bat. settings_report_err=Txosten-sistemaren datu okerra! settings_report_type=Txosten sortzaile mota: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Auto-atzeman settings_security_tooltip=Segurtasun-ezarpenak settings_report_tooltip=Txostenen sistemaren ezarpenak settings_media_tooltip=Multimedia-sistemaren ezarpenak settings_general_tooltip=Itxura eta hizkuntza-ezarpenak settings_library_tooltip=Liburutegiaren ezarpenak eta editorea settings_look_tooltip=Erabiltzailearen interfazaren itxura settings_skin_tooltip=JClic-en itxura grafikoaren aukeraketa settings_language_tooltip=Hizkuntza aukeraketa settings_report_use_tooltip=JClic txosten datu-basearekiko konexioa gaitu/ezgaitu settings_report_tcp_tooltip=TCP/IP konexio batean oinarritutako txosten-motorea settings_report_jdbc_tooltip=Datu-baseetarako konexio zuzen batean oinarritutako txosten-motorea settings_report_other_tooltip=Bestelako txosten-motoreak... settings_report_address_tooltip=Txosten-zerbitzariaren izena edo IP helbidea settings_report_port_tooltip=Konexiorako erabilitako ataka (berezkoa 5510) edit_file=Fitxategia: error_launchLibrary=Errorea biltegia irekitzean install_toSourceFolder=Jatorrizko karpetan instalatzen! edit_find_media=Bilatu media-fitxategia... libraryManager_delete_caption=Ezabatu libraryManager_delete_tooltip=Ezabatu aukeratutako liburutegirako erreferentzia libraryManager_delete_confirm=Benetan ezabatu nahi al duzu aukeratutako liburutegirako erreferentzia? libraryManager_new_exists=Biltegi hau dagoeneko sistemarekin estekatuta dago. edit_find_image_keys=F* menu_newMenuElement_caption_keys=BB menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Sortu proiektu-liburutegi berria libraryManager_connectToExistingOption=Gehitu aldez aurretik dagoen proiektu-biltegi baterako esteka libraryManager_fileOrUrlCaption=Fitxategia edo URL-a: libraryManager_newLibraryTitle=Proiektu-liburutegi berria libraryManager_warnNoFileSelected=Mesedez, sartu proiektuaren biltegiaren URL-a edo fitxategiaren izena\\! install_launchProject=Ireki proiektua orain settings_browser=Lehenetsitako nabigatzailea: settings_browser_tooltip=Nabigatzailea abiarazteko erabilitako agindua (firefox, iexplore, mozilla, opera...) settings_country=Estatu-kodea: settings_country_tooltip=Bi hizkiz osatutako aukerako kodea, herrialde zehatzeko hizkuntzaren aldagaiari dagokiona (adi.: FR Frantziako Euskararako) settings_variant=Hizkuntza-aldaera: settings_variant_tooltip=Hizkuntza-aldaeraren aukerako kodea src/core/edu/xtec/resources/messages/PlayerMessages_fr.properties000066400000000000000000000235321335566474600257170ustar00rootroot00000000000000# JClic player messages m_File=Fichier settings_passwordRequired=Le mot de passe administrateur JClic est requis pour r\u00E9aliser cette op\u00E9ration. m_Help=Aide m_Skin=Habillage action_helpAbout_caption=A propos de... libraryManager_mainLibraryTitle=Librairie principale library_badFormat=Ce fichier JClic n'est pas une librairie du projet!\nLibraries are a special type of JClic projects. library_mainMenu=Menu principal library_newLibraryName=Nouvlle librairie de projet libraryManager_new_prompt=Voulez-vous cr\u00E9er une nouvelle librairie ou vous connecter sur une existante ? libraryManager_connectToLibrary=Connecter libraryManager_createNewLibrary=Nouveau libraryManager_new_tooltip=Cr\u00E9er ou se connecter \u00E0 une nouvelle librairie libraryManager_new_caption=Nouveau menuElement_dlg_icon_tooltip=Bouton ic\u00F4ne menuElement_dlg_description_tooltip=Description du bouton utilis\u00E9 comme outil texte. menuElement_dlg_description=Description: edit_find_image=Chercher image... menuElement_dlg_icon=Ic\u00F4ne\u202F: edit_find_file=Chercher fichier... menuElement_dlg_project_tooltip=Chemin vers le projet JClic menuElement_dlg_project=Projet: menuElement_dlg_text_tooltip=Bouton texte edit_text=Texte: menu_dlg_name_tooltip=Nom du dossier library_dlg_name_tooltip=Nom de librairie edit_name=Nom: edit_title=Titre: library_dlg_title=Propri\u00E9t\u00E9s de la librairie menu_dlg_title=Propri\u00E9t\u00E9s de dossier menuElement_dlg_title=Propri\u00E9t\u00E9s de bouton menu_delete_tooltip=Supprimer le bouton courant menu_delete_caption=Supprimer menuElement_delete_tooltip=Supprimer l'\u00E9l\u00E9ment menu courant action_libraries_caption=Librairies... dlg_save_title=Enregistrer fichier... error_propertiesFile_beg=Erreur \u00E0 l'ouverture " error_propertiesFile_end=". Les param\u00E8tres par d\u00E9faut seront utilis\u00E9s. menuElement_delete_caption=Supprimer menu_newMenuElement_tooltip=Cr\u00E9er un nouveau raccourci vers le projet a new shortcut to a project menu_newMenuName=Nouveau dossier menu_newMenu_tooltip=Cr\u00E9er un nouveau dossier por les boutons du projet menu_newMenu_caption=Nouveau bouton de projet menu_newMenuElement_caption=Nouveau bouton du projet menu_newMenuElementName=Nouveau projet library_cancel_tooltip=Annuler changement library_cancel_caption=Annuler libraryManager_edit_tooltip=Editer la librairie s\u00E9lectionn\u00E9e libraryManager_edit_caption=Editer library_select_caption_ok_tooltip=Enregistrer changement library_select_caption_tooltip=Choisir le dossier s\u00E9lectionn\u00E9 library_select_caption_ok=OK library_select_caption=S\u00E9lectionner library_caption=Librairie de projets JClic libraryManager_select_tooltip=Ouvrir la librairie s\u00E9lection\u00E9e libraryManager_cancel_tooltip=Annuler libraryManager_cancel_caption=Annuler libraryManager_select_caption=S\u00E9lectionner libraryManager_caption=S\u00E9lectionner librairie library_error_reading=Erreur de lecture de la librairie du projet! wizard_next=Suivant > wizard_prev=< Pr\u00E9c\u00E9dent wizard_finish=Termin\u00E9 library_error_creating_icons=Erreur de cr\u00E9ation de la librairie d'ic\u00F4nes! install_title=Installation de projets JClic install_info_description=Installation d'un nouveau projet JClic install_info_from=De: wizard_cancel=Annuler wizard_cancel_tooltip=Annuler l'op\u00E9ration wizard_finish_tooltip=Terminer l'op\u00E9ration wizard_next_tooltip=Etape suivante de l'op\u00E9ration wizard_prev_tooltip=Etape pr\u00E9c\u00E9dente de l'op\u00E9ration install_select_library=S\u00E9lectionner la librairie o\u00F9 sera install\u00E9 le projet: install_copy_files=Copie de fichier install_source=Source: install_dest=Destination: install_status=Status: install_start=D\u00E9marrer l'installation install_start_tooltip=D\u00E9marrage de la copie des fichiers sur votre ordinateur install_progress_tooltip=Installation en cours install_msg_waiting=Attente de confirmation. install_msg_creating_dirs=Cr\u00E9ation des dossiers install_msg_copying=Copie de fichier install_msg_end=Termin\u00E9! install_msg_cleanup=Nettoyage en cours... install_msg_cancel=Installation annul\u00E9e! install_error=Erreur pendant l'installation! install_select_folder=S\u00E9lectionner le dossier o\u00F9 placer les ic\u00F4nes du projet: install_library_folders=Dossiers librairie: install_success_1=Le projet es t maintenant install\u00E9 sur votre syst\u00E8me! install_success_2=Pour le lancer, s\u00E9lectionnez son install_success_3=ic\u00F4ne sur la librairie projet. wizard_info=Presser "Suivant" pour commencer. install_step_1=1. S\u00E9lection de la librairie JClic install_step_2=2. T\u00E9l\u00E9charger fichiers install_step_3=3. Cr\u00E9ation d'ic\u00F4nes install_step_4=Installation termin\u00E9e! install_info_info=Vous avez demand\u00E9 d'installer le projet: settings_title=Param\u00E8tres library_error_clone=Impossible de cloner la librairie! settings_security=S\u00E9curit\u00E9 settings_password_protect=Prot\u00E9ger les param\u00E8tres avec un mot de passe settings_new_password=Nouveau mot de passe: settings_new_password_confirm=Confirmer le nouveau mot de passe: settings_general=G\u00E9n\u00E9ral settings_look=Apparence: settings_skin=Habillage: settings_language=Langage: settings_reports=Rapports settings_report_use=Ecrire le score dans la base de donn\u00E9es settings_report_engine=Rapporteur classe: settings_report_params=Param\u00E8tres: settings_media=Multim\u00E9dia settings_media_enabled=Autoriser multimedia settings_media_system=Syst\u00E8me multimedia: settings_media_event_sounds=Autoriser les sons \u00E9v\u00E8nement settings_library=Biblioth\u00E8ques settings_library_autorun=Allez automatiquement aux biblioth\u00E8ques quand JClic d\u00E9marre m_Tools=Outils m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Activit\u00E9 m_Activity_Mnemonic=A action_openFile_caption=Ouvrir fichier... action_openFile_tooltip=Ouvrir un fichier projet JClic action_openFile_keys=OO action_openUrl_caption=Ouvrir URL... action_openUrl_tooltip=Ouvrir un projet JClic directement depuis Internet action_openUrl_keys=UU action_exit_caption=Quitter action_exit_tooltip=Fermer JClic action_exit_keys=XX action_settings_caption=Param\u00E8tres... action_settings_tooltip=Adjuster les param\u00E8tres globaux du programme action_settings_keys=T action_libraries_tooltip=Ouvrir ou \u00E9diter une librairie JClic . action_libraries_keys=LL action_helpAbout_tooltip=Information \u00E0 propos de JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Cette image est trop grande pour \u00EAtre utilis\u00E9e comme ic\u00F4ne! settings_report_tcp=Connecter JClic au serveur de rapports: settings_report_jdbc=Connection directe JDBC: settings_report_other=Autre: settings_report_address=H\u00F4te: settings_report_port=Port: settings_report_driver=Driver: settings_report_url=URL: settings_report_user=Utilisateur: settings_report_pwd=Mot de passe: settings_report_options=Param\u00E8tres du reporter: settings_report_err_server=Mauvais nom de serveur de rapport! settings_report_err_port=Num\u00E9ro de port incorrect! Entrez une valeur entre 1000 et 65000. settings_report_err=Syst\u00E8me incorrect de rapport de donn\u00E9es! settings_report_type=Moteur de rapports: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=D\u00E9tection automatique settings_security_tooltip=Param\u00E8tres de s\u00E9curit\u00E9 settings_report_tooltip=Param\u00E8tres du syst\u00E8me de rapports settings_media_tooltip=Options du syst\u00E8me multim\u00E9dia settings_general_tooltip=Param\u00E8tres du langage et de l'aspect settings_library_tooltip=Param\u00E8tres de la librairie et de l'\u00E9diteur settings_look_tooltip=Apparence de l'interface utilisateur User settings_skin_tooltip=S\u00E9lection de l'aspect graphique de JClic settings_language_tooltip=S\u00E9lection du langage settings_report_use_tooltip=Activer/d\u00E9sactiver la connection \u00E0 une base de rapports JClic settings_report_tcp_tooltip=Moteur de rapports bas\u00E9 sur une connection TCP/IP settings_report_jdbc_tooltip=Moteur de rapports bas\u00E9 sur une connection directe \u00E0 la base de donn\u00E9es settings_report_other_tooltip=Autres moteurs de rapports... settings_report_address_tooltip=Nom de serveur de rapports ou adresse IP settings_report_port_tooltip=Port utilis\u00E9 pour la connection (5510 par d\u00E9faut) edit_file=Fichier: error_launchLibrary=Erreur au lancement de la librairie install_toSourceFolder=Installation dans le dossier source! edit_find_media=Chercher fichier media... libraryManager_delete_caption=Supprimer libraryManager_delete_tooltip=Supprimer la r\u00E9f\u00E9rence vers la librairie s\u00E9lectionn\u00E9e libraryManager_delete_confirm=Voulez-vous r\u00E9ellement supprimer la r\u00E9f\u00E9rence \u00E0 la librairie s\u00E9lectionn\u00E9e ? libraryManager_new_exists=Cette librairie est d\u00E9j\u00E0 reli\u00E9e au syst\u00E8me. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Cr\u00E9er une nouvelle librairie projet libraryManager_connectToExistingOption=Ajouter un lien vers un projet librairie existant libraryManager_fileOrUrlCaption=Fichier ou URL: libraryManager_newLibraryTitle=Nouvelle librairie de projet libraryManager_warnNoFileSelected=Entrez l'URL ou nom de fichier du projet librairie! install_launchProject=Ouvrir le projet maintenant settings_browser=Explorateur pr\u00E9f\u00E9r\u00E9: settings_browser_tooltip=Commande utilis\u00E9e pour lancer l'explorateur (firefox, iexplore, mozilla, opera...) settings_country=Country code: settings_country_tooltip=Code optionnel de deux lettres correspondant \u00E0 la variante dialectale d'un territoire (ex.: BR pour le Portugais du Br\u00E9sil) settings_variant=Variant: settings_variant_tooltip=Code optionnel de variante de la langue src/core/edu/xtec/resources/messages/PlayerMessages_gl.properties000066400000000000000000000227261335566474600257160ustar00rootroot00000000000000# JClic player messages m_File=Ficheiro settings_passwordRequired=Requ\u00EDrese contrasinal de administrador de JClic para validar esta operaci\u00F3n. m_Help=Axuda m_Skin=Tema visual action_helpAbout_caption=Sobre... libraryManager_mainLibraryTitle=Biblioteca principal library_badFormat=Este ficheiro non \u00E9 unha biblioteca de proxectos JClic!\nAs bibliotecas son un tipo especial de proxectos JClic. library_mainMenu=Men\u00FA principal library_newLibraryName=Nova biblioteca de proxectos libraryManager_new_prompt=Quer crear unha nova biblioteca ou conectarse a unha existente? libraryManager_connectToLibrary=Conectar libraryManager_createNewLibrary=Novo libraryManager_new_tooltip=Crear ou conectarse a unha nova biblioteca libraryManager_new_caption=Nova menuElement_dlg_icon_tooltip=Imaxe que mostra a icona menuElement_dlg_description_tooltip=Texto flotante, que aparecer\u00E1 ao posicionar o punteiro sobre o bot\u00F3n. menuElement_dlg_description=Descrici\u00F3n: edit_find_image=Buscar imaxe... menuElement_dlg_icon=Icona: edit_find_file=Buscar ficheiro... menuElement_dlg_project_tooltip=Ruta ao proxecto JClic menuElement_dlg_project=Proxecto: menuElement_dlg_text_tooltip=Texto do bot\u00F3n edit_text=Texto: menu_dlg_name_tooltip=Nome do cartafol library_dlg_name_tooltip=Nome da biblioteca edit_name=Nome: edit_title=T\u00EDtulo: library_dlg_title=Propiedades da biblioteca menu_dlg_title=Propiedades do cartafol menuElement_dlg_title=Propiedades do bot\u00F3n menu_delete_tooltip=Eliminar o men\u00FA seleccionado menu_delete_caption=Eliminar menuElement_delete_tooltip=Eliminar o elemento do men\u00FA seleccionado action_libraries_caption=Bibliotecas... dlg_save_title=Gardar o ficheiro... error_propertiesFile_beg=Produciuse un erro ao abrir " error_propertiesFile_end=". Utilizaranse os valores por omisi\u00F3n. menuElement_delete_caption=Eliminar menu_newMenuElement_tooltip=Crear un novo atallo ao proxecto! menu_newMenuName=Novo cartafol menu_newMenu_tooltip=Crear un novo cartafol de bot\u00F3ns de proxecto menu_newMenu_caption=Novo cartafol de iconas menu_newMenuElement_caption=Novo bot\u00F3n de proxecto menu_newMenuElementName=Novo bot\u00F3n library_cancel_tooltip=Cancelar cambios library_cancel_caption=Cancelar libraryManager_edit_tooltip=Editar na biblioteca seleccionada libraryManager_edit_caption=Editar library_select_caption_ok_tooltip=Gardar cambios library_select_caption_tooltip=Escoller o cartafol seleccionado library_select_caption_ok=Aceptar library_select_caption=Seleccionar library_caption=Biblioteca de proxectos JClic libraryManager_select_tooltip=Abrir a biblioteca seleccionada libraryManager_cancel_tooltip=Cancelar libraryManager_cancel_caption=Cancelar libraryManager_select_caption=Seleccionar libraryManager_caption=Seleccione biblioteca library_error_reading=Produciuse un erro ao ler a biblioteca de proxectos! wizard_next=Seguinte > wizard_prev=< Anterior wizard_finish=Finalizar library_error_creating_icons=Produciuse un erro na creaci\u00F3n das iconas da biblioteca! install_title=Instalaci\u00F3n de proxectos JClic install_info_description=Instalaci\u00F3n dun novo proxecto JClic install_info_from=Desde: wizard_cancel=Cancelar wizard_cancel_tooltip=Cancelar a operaci\u00F3n wizard_finish_tooltip=Finalizar a operaci\u00F3n wizard_next_tooltip=Seguinte paso da operaci\u00F3n wizard_prev_tooltip=Paso anterior da operaci\u00F3n install_select_library=Seleccione a biblioteca onde instalar o proxecto: install_copy_files=Copiar arquivo install_source=Orixe: install_dest=Destino: install_status=Estado: install_start=Iniciar a instalaci\u00F3n install_start_tooltip=Iniciar a copia dos ficheiros ao seu computador install_progress_tooltip=Progreso da instalaci\u00F3n install_msg_waiting=Agardando a confirmaci\u00F3n. install_msg_creating_dirs=Creando directorios install_msg_copying=Copiando ficheiro install_msg_end=Rematado! install_msg_cleanup=Facendo limpeza... install_msg_cancel=Instalaci\u00F3n cancelada! install_error=Produciuse un erro na instalaci\u00F3n! install_select_folder=Seleccione o cartafol onde crear as iconas do proxecto: install_library_folders=Cartafoles da biblioteca: install_success_1=O proxecto est\u00E1 instalado no sistema! install_success_2=Para inicialo, seleccione a s\u00FAa install_success_3=Icona na biblioteca de proxectos. wizard_info=Prema en \u00ABSeguinte\u00BB para iniciar install_step_1=1. Selecci\u00F3n da biblioteca de JClic install_step_2=2. Descargar ficheiros install_step_3=3. Creaci\u00F3n de iconas install_step_4=Instalaci\u00F3n rematada! install_info_info=Solicitou instalar o proxecto: settings_title=Configuraci\u00F3n library_error_clone=Non foi pos\u00EDbel clonar a biblioteca! settings_security=Seguranza settings_password_protect=Protexer a configuraci\u00F3n con contrasinal settings_new_password=Novo contrasinal: settings_new_password_confirm=Cofirme o novo contrasinal: settings_general=Xeral settings_look=Aparencia e comportamento: settings_skin=Tema visual: settings_language=Idioma: settings_reports=Informes settings_report_use=Gardar as puntuaci\u00F3ns nunha base de datos settings_report_engine=Clase: settings_report_params=Par\u00E1metros: settings_media=Multimedia settings_media_enabled=Multimedia activado settings_media_system=Sistema multimedia: settings_media_event_sounds=Sons de evento activados settings_library=Bibliotecas settings_library_autorun=Mostrar as bibliotecas cando se inicie JClic m_Tools=Ferramentas m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Actividade m_Activity_Mnemonic=A action_openFile_caption=Abrir ficheiro... action_openFile_tooltip=Abrir un ficheiro de proxecto JClic action_openFile_keys=AO action_openUrl_caption=Abrir URL... action_openUrl_tooltip=Abrir un proxecto de JClic desde a Internet action_openUrl_keys=UU action_exit_caption=Sa\u00EDr action_exit_tooltip=Pechar o Jclic action_exit_keys=XX action_settings_caption=Configuraci\u00F3n... action_settings_tooltip=Axuste global da configuraci\u00F3n do programa action_settings_keys=C action_libraries_tooltip=Abrir ou editar unha biblioteca JClic action_libraries_keys=BB action_helpAbout_tooltip=Informaci\u00F3n sobre o JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Esta imaxe \u00E9 moi grande para usala como icona! settings_report_tcp=Conectarse a un servidor de informes JClic: settings_report_jdbc=Conexi\u00F3n directa a JDBC: settings_report_other=Outros: settings_report_address=Servidor: settings_report_port=Porto: settings_report_driver=Controlador: settings_report_url=URL: settings_report_user=Usuario: settings_report_pwd=Contrasinal: settings_report_options=Par\u00E1metros dos informes: settings_report_err_server=O nome do servidor de informes \u00E9 incorrecto! settings_report_err_port=Valor incorrecto de porto! Introduza un valor entre 1000 e 65000 settings_report_err=Datos incorrectos para o sistema de informes! settings_report_type=Sistema de informes settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Detecci\u00F3n autom\u00E1tica settings_security_tooltip=Configuraci\u00F3n de seguranza settings_report_tooltip=Configuraci\u00F3n do sistema de informes settings_media_tooltip=Configuraci\u00F3n do sistema multimedia settings_general_tooltip=Configuraci\u00F3n de idioma e aspecto settings_library_tooltip=Configurador e editor de bibliotecas settings_look_tooltip=Aspecto da interface de usuario settings_skin_tooltip=Selecci\u00F3n do aspecto gr\u00E1fico de JClic settings_language_tooltip=Selecci\u00F3n do idioma settings_report_use_tooltip=Activa/desactiva a conexi\u00F3n a unha base de datos de informes JClic settings_report_tcp_tooltip=Motor de informes baseado nunha conexi\u00F3n TCP/IP settings_report_jdbc_tooltip=Motor de informes baseado nunha conexi\u00F3n directa a base de datos settings_report_other_tooltip=Outros motores de informes... settings_report_address_tooltip=Nome ou enderezo IP do servidor de informes settings_report_port_tooltip=Porto usado para a conexi\u00F3n (por omisi\u00F3n \u00E9 5510) edit_file=Ficheiro: error_launchLibrary=produciuse un erro ao abrir biblioteca install_toSourceFolder=Instalando no cartafol de orixe! edit_find_media=Buscar recurso... libraryManager_delete_caption=Eliminar libraryManager_delete_tooltip=Eliminar a referencia \u00E1 biblioteca seleccionada libraryManager_delete_confirm=Realmente quer eliminar a referencia \u00E1 biblioteca seleccionada? libraryManager_new_exists=Esta biblioteca xa est\u00E1 conectada ao sistema. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Crear unha nova biblioteca de proxectos libraryManager_connectToExistingOption=Engadir ligaz\u00F3n a unha biblioteca creada libraryManager_fileOrUrlCaption=Ficheiro ou URL: libraryManager_newLibraryTitle=Nova biblioteca de proxectos libraryManager_warnNoFileSelected=Por favor, introduza o URL ou nome de ficheiro da biblioteca de proxectos! install_launchProject=Abrir o proxecto agora settings_browser=Navegador preferido: settings_browser_tooltip=Orde empregada para executar o navegador (firefox, iexplore, mozilla, opera...) settings_country=C\u00F3digo do pa\u00EDs: settings_country_tooltip=D\u00FAas letras opcionais correspondentes ao c\u00F3digo do pa\u00EDs espec\u00EDfico da variante de idioma (p.ex.:BR para portugu\u00E9s do Brasil) settings_variant=Variante: settings_variant_tooltip=Variante opcional do c\u00F3digo de idioma src/core/edu/xtec/resources/messages/PlayerMessages_it.properties000066400000000000000000000223221335566474600257200ustar00rootroot00000000000000# JClic player messages m_File=File settings_passwordRequired=Una password di amministratore JClic \u00E8 richiesta per procedere nell'operazione. m_Help=Aiuto m_Skin=Skin action_helpAbout_caption=Informazioni... libraryManager_mainLibraryTitle=Libreria principale library_badFormat=Questo file JClic non \u00E8 una libreria di progetto!\nLe librerie sono tipi speciali di progetti JClic. library_mainMenu=Menu principale library_newLibraryName=Nuova libreria di progetti libraryManager_new_prompt=Vuoi creare una nuova libreria o collegarti a una esistente? libraryManager_connectToLibrary=Connetti libraryManager_createNewLibrary=Nuovo libraryManager_new_tooltip=Crea o connettiti a una nuova libreria libraryManager_new_caption=Nuovo menuElement_dlg_icon_tooltip=Immagine del pulsante menuElement_dlg_description_tooltip=Testo flottante che apparir\u00E0 quando il puntatore si trover\u00E0 sul pulsante. menuElement_dlg_description=Descrizione: edit_find_image=Trova immagine menuElement_dlg_icon=Icona: edit_find_file=Trova file menuElement_dlg_project_tooltip=Percorso per il progetto JClic menuElement_dlg_project=Progetto: menuElement_dlg_text_tooltip=Testo del pulsante edit_text=Testo: menu_dlg_name_tooltip=Nome della cartella library_dlg_name_tooltip=Nome della libreria edit_name=Nome: edit_title=Titolo: library_dlg_title=Propriet\u00E0 della libreria menu_dlg_title=Propriet\u00E0 della cartella menuElement_dlg_title=Propriet\u00E0 del pulsante menu_delete_tooltip=Elimina il menu selezionato menu_delete_caption=Elimina menuElement_delete_tooltip=Elimina l'elemento del menu selezionato action_libraries_caption=Librerie... dlg_save_title=Salva file... error_propertiesFile_beg=Errore all'apertura di " error_propertiesFile_end=". Si utilizzeranno i valori predefiniti. menuElement_delete_caption=Elimina menu_newMenuElement_tooltip=Crea una nuova scorciatoia per il progetto menu_newMenuName=Nuova cartella menu_newMenu_tooltip=Crea una nuova cartella per i pulsanti del progetto. menu_newMenu_caption=Nuova cartella delle icone menu_newMenuElement_caption=Nuovo pulsante di progetto menu_newMenuElementName=Nuovo pulsante library_cancel_tooltip=Annulla modifiche library_cancel_caption=Annulla libraryManager_edit_tooltip=Modifica la libreria selezionata libraryManager_edit_caption=Modifica library_select_caption_ok_tooltip=Salva le modifiche library_select_caption_tooltip=Scegli la cartella selezionata library_select_caption_ok=Ok library_select_caption=Seleziona library_caption=Libreria dei progetti JClic libraryManager_select_tooltip=Apri la libreria selezionata libraryManager_cancel_tooltip=Annulla libraryManager_cancel_caption=Annulla libraryManager_select_caption=Seleziona libraryManager_caption=Seleziona la libreria dei progetti library_error_reading=Errore nella lettura della libreria del progetto! wizard_next=Successivo > wizard_prev=< Precedente wizard_finish=Finisci library_error_creating_icons=Errore nella creazione delle icone della libreria! install_title=Installazione di progetti JClic install_info_description=Installazione di un nuovo progetto JClic install_info_from=Da: wizard_cancel=Annulla wizard_cancel_tooltip=Annulla l'operazione wizard_finish_tooltip=Concludi l'operazione wizard_next_tooltip=Passo successivo dell'operazione wizard_prev_tooltip=Passo precedente dell'operazione install_select_library=Seleziona la libreria dove verr\u00E0 installato il progetto: install_copy_files=Copia dei file install_source=Origine: install_dest=Destinazione: install_status=Stato: install_start=Inizia l'installazione install_start_tooltip=Inizia la copia dei file sul tuo computer install_progress_tooltip=Installazione in corso install_msg_waiting=In attesa di conferma install_msg_creating_dirs=Creazione delle directory install_msg_copying=Copia dei file install_msg_end=Finito! install_msg_cleanup=Pulizia in corso... install_msg_cancel=Installazione annullata! install_error=Errore nell'installazione! install_select_folder=Seleziona la cartella dove mettere le icone di progetto: install_library_folders=Cartelle della libreria: install_success_1=Ora il progetto \u00E8 installato nel tuo sistema! install_success_2=Per lanciarlo seleziona la sua install_success_3=icona nella libreria del progetto. wizard_info=Premi "Successivo" per iniziare. install_step_1=1. Selezione della libreria JClic install_step_2=Scaricamento dei file install_step_3=3. Creazione delle icone install_step_4=Installazione conclusa! install_info_info=Hai chiesto di installare il progetto: settings_title=Impostazioni library_error_clone=Impossibile duplicare la libreria settings_security=Sicurezza settings_password_protect=Proteggi la configurazione con una password settings_new_password=Nuova password: settings_new_password_confirm=Conferma la nuova password: settings_general=Generale settings_look=Aspetto settings_skin=Skin: settings_language=Lingua: settings_reports=Rapporti settings_report_use=Scrivi il punteggio in un database settings_report_engine=Classe: settings_report_params=Parametri: settings_media=Multimedia settings_media_enabled=Multimedia abilitato settings_media_system=Sistema multimediale: settings_media_event_sounds=Suoni di evento abilitati settings_library=Librerie settings_library_autorun=Mostra automaticamente le librerie quando JClic viene avviato m_Tools=Strumenti m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Attivit\u00E0 m_Activity_Mnemonic=A action_openFile_caption=Apri il file... action_openFile_tooltip=Apri un file di progetto JClic action_openFile_keys=OO action_openUrl_caption=Apri URL... action_openUrl_tooltip=Apri un progetto JClic direttamente da Internet action_openUrl_keys=UU action_exit_caption=Esci action_exit_tooltip=Chiudi JClic action_exit_keys=XX action_settings_caption=Impostazioni... action_settings_tooltip=Sistema le impostazioni globali del programma action_settings_keys=T action_libraries_tooltip=Apri o modifica una liberia JClic. action_libraries_keys=LL action_helpAbout_tooltip=Informazioni su JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Questa immagine \u00E8 troppo grande per essere usata come icona! settings_report_tcp=Collegati al server dei rapporti JClic: settings_report_jdbc=Connessione diretta JDBC: settings_report_other=Altro: settings_report_address=Host: settings_report_port=Porta: settings_report_driver=Driver: settings_report_url=URL: settings_report_user=Utente: settings_report_pwd=Password: settings_report_options=Parametri: settings_report_err_server=Nome del server dei rapporti non corretto! settings_report_err_port=Numero di porta non corretto! Per favore inserisci un valore compreso tra 1000 e 65000. settings_report_err=Dati incorretti del sistema dei rapporti! settings_report_type=Motore dei rapporti: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Autorilevamento settings_security_tooltip=Impostazioni di sicurezza settings_report_tooltip=Impostazione del sistema dei rapporti settings_media_tooltip=Configurazione del sistema multimediale settings_general_tooltip=Impostazioni di lingua e aspetto settings_library_tooltip=Impostazione e modifica della libreria settings_look_tooltip=Aspetto dell'interfaccia utente settings_skin_tooltip=Selezione dell'aspetto grafico di JClic settings_language_tooltip=Selezione della lingua settings_report_use_tooltip=Abilita/disabilita la connessione a un database dei rapporti JClic settings_report_tcp_tooltip=Motore dei rapporti basato su una connessione TCP/IP settings_report_jdbc_tooltip=Motore dei rapporti basato su una diretta connessione a un database settings_report_other_tooltip=Altri motori dei rapporti... settings_report_address_tooltip=Nome o indirizzo IP del server dei rapporti settings_report_port_tooltip=Porta usare per la connessione (il valore predefinito \u00E8 5510) edit_file=File: error_launchLibrary=Errore all'apertura della libreria install_toSourceFolder=Installazione nella cartella di origine! edit_find_media=Cerca i file multimediali... libraryManager_delete_caption=Elimina libraryManager_delete_tooltip=Elimina i riferimenti alla libreria selezionata libraryManager_delete_confirm=Vuoi davvero eliminare i riferimenti alla libreria selezionata? libraryManager_new_exists=La libreria \u00E8 gi\u00E0 connessa al sistema. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Crea una nuova libreria dei progetti libraryManager_connectToExistingOption=Aggiungi un link a una esistente libreria dei progetti libraryManager_fileOrUrlCaption=File o URL: libraryManager_newLibraryTitle=Nuova libreria di progetti libraryManager_warnNoFileSelected=Per favore inserisci l'URL o il nome del file della libreria di progetto\\! install_launchProject=Apri adesso il progetto settings_browser=Browser preferito: settings_browser_tooltip=Comando usato per avviare il navigatore Internet (Firefox, IExplore, Mozilla, Opera...) settings_country=Codice nazione: settings_country_tooltip=Codice opzionale di due lettere corrispondente alla variante nazionale di una lingua (es. BR per il portoghese brasiliano) settings_variant=Variante: settings_variant_tooltip=Codice opzionale della variante della lingua src/core/edu/xtec/resources/messages/PlayerMessages_nl.properties000066400000000000000000000216251335566474600257220ustar00rootroot00000000000000# JClic player messages m_File=Bestand settings_passwordRequired=JClic admin wachtwoord is vereist om deze bewerking uit te voeren. m_Help=Help m_Skin=Skin action_helpAbout_caption=Info... libraryManager_mainLibraryTitle=Hoofd bibliotheek library_badFormat=Dit JClic bestand is geen project bestand!\nBibliotheken zijn een speciaal type JClic projecten. library_mainMenu=Hoofdmenu library_newLibraryName=Nieuw project bibliotheek libraryManager_new_prompt=Wil je een nieuwe bibliotheek maken of een bestaande gebruiken? libraryManager_connectToLibrary=Verbinden libraryManager_createNewLibrary=Nieuw libraryManager_new_tooltip=Maak een nieuwe bibliotheek of verbind met een bestaande libraryManager_new_caption=Nieuw menuElement_dlg_icon_tooltip=Knop pictogram menuElement_dlg_description_tooltip=Beschrijving van de knop, gebruikt als helpballontekst. menuElement_dlg_description=Beschrijving: edit_find_image=Zoek afbeelding... menuElement_dlg_icon=Pictogram: edit_find_file=Zoek bestand... menuElement_dlg_project_tooltip=Pad naar JClic project menuElement_dlg_project=Project: menuElement_dlg_text_tooltip=Knop tekst edit_text=Tekst menu_dlg_name_tooltip=Naam van de map library_dlg_name_tooltip=Naam van de bibliotheek edit_name=Naam: edit_title=Titel: library_dlg_title=Bibliotheek eigenschappen menu_dlg_title=Map eigenschappen menuElement_dlg_title=Knop eigenschappen menu_delete_tooltip=Verwijder huidig menu menu_delete_caption=Verwijderen menuElement_delete_tooltip=Verwijder huidig menu element action_libraries_caption=Bibliotheken... dlg_save_title=Bestand opslaan... error_propertiesFile_beg=Fout bij openen " error_propertiesFile_end=". Standaard waarden zullen gebruikt worden. menuElement_delete_caption=Verwijderen menu_newMenuElement_tooltip=Maak een nieuwe snelkoppeling naar een project menu_newMenuName=Nieuwe map menu_newMenu_tooltip=Maak een nieuwe map voor project knoppen menu_newMenu_caption=Map voor nieuwe knop menu_newMenuElement_caption=Nieuw project knop menu_newMenuElementName=Nieuw knop library_cancel_tooltip=Veranderingen ongedaanmaken library_cancel_caption=Annuleren libraryManager_edit_tooltip=Wijzig de gekozen bibliotheek libraryManager_edit_caption=Bewerk library_select_caption_ok_tooltip=Wijzigingen opslaan library_select_caption_tooltip=Kies geselecteerde map library_select_caption_ok=Ok library_select_caption=Selecteer library_caption=JClic project bibliotheek libraryManager_select_tooltip=Geselecteerde bibliotheek openen libraryManager_cancel_tooltip=Annuleren libraryManager_cancel_caption=Annuleren libraryManager_select_caption=Selecteer libraryManager_caption=Kies bibliotheek library_error_reading=Fout bij lezen bibliotheek! wizard_next=Volgende > wizard_prev=< Vorige wizard_finish=Be\u00EBindig library_error_creating_icons=Fout bij maken van bibliotheek pictogram! install_title=Installatie van JClic projecten install_info_description=Installatie van een nieuw JClic project install_info_from=Van: wizard_cancel=Annuleren wizard_cancel_tooltip=Annuleer de bewerking wizard_finish_tooltip=Be\u00EBindig de bewerking wizard_next_tooltip=Volgende stap van de bewerking wizard_prev_tooltip=Vorige stap van de bewerking install_select_library=Kies de bibliotheek om het project te installeren install_copy_files=Bestand kopi\u00EBren install_source=Bron: install_dest=Bestemming: install_status=Status: install_start=Begin de installatie install_start_tooltip=Begin het kopi\u00EBren van bestanden op uw computer install_progress_tooltip=Vooruitgang van de installatie install_msg_waiting=Wacht op bevestiging install_msg_creating_dirs=Aanmaken mappen install_msg_copying=Bestanden copieren install_msg_end=Voltooid! install_msg_cleanup=Opschonen... install_msg_cancel=Installatie afgebroken! install_error=Fout bij installatie! install_select_folder=Kies de map om de project pictogrammen op te slaan install_library_folders=Bibliotheek mappen: install_success_1=Het project is ge\u00EFnstalleerd op uw systeem! install_success_2=Om het uit te voeren, kies het install_success_3=pictogram in de project bibliotheek wizard_info=Druk "Volgende" om te starten. install_step_1=1. Keuze van de JClic bibliotheek install_step_2=2. Download bestanden install_step_3=3. Maak de pictogrammen install_step_4=Installatie be\u00EBindigd! install_info_info=Je vroeg om het project te installeren: settings_title=Instellingen library_error_clone=Onmogelijk om de bibliotheek te kopi\u00EBren! settings_security=Beveiliging settings_password_protect=Project instellingen met wachtwoord settings_new_password=Nieuw wachtwoord: settings_new_password_confirm=Bevestig nieuw wachtwoord: settings_general=Algemeen settings_look=Look & Feel: settings_skin=Skin: settings_language=Taal: settings_reports=Rapporten settings_report_use=Schrijf punten naar een database settings_report_engine=Reporter class: settings_report_params=Parameter: settings_media=Multimedia settings_media_enabled=Multimedia toegelaten settings_media_system=Multimedia systeem: settings_media_event_sounds=Geluid gebeurtenissen ingeschakeld settings_library=Bibliotheken settings_library_autorun=Ga automatisch naar bibliotheken als JClic start m_Tools=Gereedschappen m_File_Mnemonic=B m_Tools_Mnemonic=G m_Help_Mnemonic=H m_Activity=Activiteit m_Activity_Mnemonic=A action_openFile_caption=Bestand openen... action_openFile_tooltip=JClick project bestand openen action_openFile_keys=OO action_openUrl_caption=Open URL... action_openUrl_tooltip=JClic project direct van het internet openen action_openUrl_keys=UU action_exit_caption=Afsluiten action_exit_tooltip=JClic afsluiten action_exit_keys=XX action_settings_caption=Instellingen... action_settings_tooltip=Algemene programma instellingen aanpassen action_settings_keys=T action_libraries_tooltip=JClic bibliotheek openen of aanpassen action_libraries_keys=LL action_helpAbout_tooltip=Informatie over JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Deze afbeelding is te groot om gebruikt te worden als pictogram! settings_report_tcp=Verbinden met een JClic rapport server settings_report_jdbc=Direct JDBC verbinding: settings_report_other=Andere: settings_report_address=Host: settings_report_port=Poort: settings_report_driver=Stuurprogramma: settings_report_url=URL: settings_report_user=Gebruiker: settings_report_pwd=Wachtwoord: settings_report_options=Rapporteer parameters:: settings_report_err_server=Verkeerde rapport server naam settings_report_err_port=Verkeer inkomend poort nummer! Kies een waarde tussen 1000 en 65000. settings_report_err=Verkeer rapport systeem gegevens! settings_report_type=Rapporteer motor: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Automatisch detecteren settings_security_tooltip=Beveiliging instellingen settings_report_tooltip=Rapport systeem instellingen settings_media_tooltip=Multimedia systeem opties settings_general_tooltip=Taal en aspect instellingen settings_library_tooltip=Bibliotheek instellingen en bewerken settings_look_tooltip=User interface look & feel settings_skin_tooltip=Keuze van de grafische aspecten van JClic settings_language_tooltip=Taal keuze settings_report_use_tooltip=Toestaan/verhinderen van verbinding met een JClic rapport database settings_report_tcp_tooltip=Rapporteer engine gebaseerd op een TCP/IP verbinding settings_report_jdbc_tooltip=Rapporteer engine gebaseerd op een directe verbinding settings_report_other_tooltip=Andere rapporteer engines... settings_report_address_tooltip=Rapport server naam of IP adres settings_report_port_tooltip=Poort voor verbinding (standaard is 5510) edit_file=Bestand: error_launchLibrary=Fout bij starten bibliotheek install_toSourceFolder=Installeren naar bron map! edit_find_media=Zoek media bestand... libraryManager_delete_caption=Verwijderen libraryManager_delete_tooltip=Verwijder de referentie naar de gekozen bibliotheek libraryManager_delete_confirm=Wil je de referentie naar de gekozen bibliotheek verwijderen? libraryManager_new_exists=Deze bibliotheek is reeds gekoppeld aan het systeem. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Maak een nieuwe project bibliotheek libraryManager_connectToExistingOption=Voegt een snelkoppeling naar een bestaande bibliotheek project toe libraryManager_fileOrUrlCaption=Bestand of URL: libraryManager_newLibraryTitle=Nieuw project bibliotheek libraryManager_warnNoFileSelected=Geef de URL of de bestandsnaam van de project bibliotheek\\! install_launchProject=Het project nu openen settings_browser=Voorkeur browser: settings_browser_tooltip=Commando om browser te starten(firefox, iexplore, mozilla, opera...) settings_country=Land code: settings_country_tooltip=Optionele twee letter code die overeenkomt met het land specifieke variant van de taal (vb. : BR voor Braziliaans Portugees) settings_variant=Variant: settings_variant_tooltip=Optionele variant code van de taal src/core/edu/xtec/resources/messages/PlayerMessages_pt.properties000066400000000000000000000234701335566474600257340ustar00rootroot00000000000000# JClic player messages m_File=Ficheiro settings_passwordRequired=Para efectuar esta opera\u00E7\u00E3o introduza a senha de administrador do JClic. m_Help=Ajuda m_Skin=Aspecto action_helpAbout_caption=Sobre... libraryManager_mainLibraryTitle=Biblioteca principal library_badFormat=Este ficheiro JClic n\u00E3o \u00E9 do tipo "biblioteca de projectos".\nAs bibliotecas s\u00E3o um tipo especial de ficheiro JClic. library_mainMenu=Menu principal library_newLibraryName=Nova biblioteca de projectos libraryManager_new_prompt=Deseja criar uma nova biblioteca ou ligar a uma biblioteca existente? libraryManager_connectToLibrary=Ligar libraryManager_createNewLibrary=Nova libraryManager_new_tooltip=Criar ou conectar-se a uma nova biblioteca libraryManager_new_caption=Nova menuElement_dlg_icon_tooltip=\u00CDcone do bot\u00E3o menuElement_dlg_description_tooltip=Descri\u00E7\u00E3o do bot\u00E3o (mostrada quando mant\u00E9m o ponteiro do rato sobre o bot\u00E3o). menuElement_dlg_description=Descri\u00E7\u00E3o: edit_find_image=Procurar imagem... menuElement_dlg_icon=\u00CDcone: edit_find_file=Procurar ficheiro... menuElement_dlg_project_tooltip=Caminho para o projecto JClic menuElement_dlg_project=Projecto: menuElement_dlg_text_tooltip=Texto do bot\u00E3o edit_text=Texto: menu_dlg_name_tooltip=Nome da pasta library_dlg_name_tooltip=Nome da biblioteca edit_name=Nome: edit_title=T\u00EDtulo: library_dlg_title=Propriedades da biblioteca menu_dlg_title=Propriedades da pasta menuElement_dlg_title=Propriedades do bot\u00E3o menu_delete_tooltip=Eliminar o menu seleccionado menu_delete_caption=Eliminar menuElement_delete_tooltip=Eliminar o elemento de menu seleccionado action_libraries_caption=Bibliotecas... dlg_save_title=Guardar ficheiro... error_propertiesFile_beg=Erro ao abrir " error_propertiesFile_end=".Ser\u00E3o utilizadas as predefini\u00E7\u00F5es. menuElement_delete_caption=Eliminar menu_newMenuElement_tooltip=Criar um novo atalho para o projecto menu_newMenuName=Nova pasta menu_newMenu_tooltip=Criar uma nova pasta para os bot\u00F5es de projecto menu_newMenu_caption=Nova pasta para os bot\u00F5es menu_newMenuElement_caption=Novo bot\u00E3o de projecto menu_newMenuElementName=Novo bot\u00E3o library_cancel_tooltip=Cancelar as modifica\u00E7\u00F5es library_cancel_caption=Cancelar libraryManager_edit_tooltip=Editar a biblioteca seleccionada libraryManager_edit_caption=Editar library_select_caption_ok_tooltip=Guardar altera\u00E7\u00F5es library_select_caption_tooltip=Escolher a pasta seleccionada library_select_caption_ok=OK library_select_caption=Seleccionar library_caption=Biblioteca de projectos JClic libraryManager_select_tooltip=Abrir a biblioteca seleccionada libraryManager_cancel_tooltip=Cancelar libraryManager_cancel_caption=Cancelar libraryManager_select_caption=Seleccionar libraryManager_caption=Selec\u00E7\u00E3o da biblioteca de projectos library_error_reading=Erro de leitura da biblioteca de projectos! wizard_next=Seguinte > wizard_prev=< Anterior wizard_finish=Terminar library_error_creating_icons=Erro ao criar os \u00EDcones na biblioteca! install_title=Instalac\u00E3o de projectos JClic install_info_description=Instalar um novo projecto JClic install_info_from=De: wizard_cancel=Cancelar wizard_cancel_tooltip=Cancelar a opera\u00E7\u00E3o wizard_finish_tooltip=Terminar a opera\u00E7\u00E3o wizard_next_tooltip=Passo seguinte da opera\u00E7\u00E3o wizard_prev_tooltip=Passo anterior da opera\u00E7\u00E3o install_select_library=Seleccione a biblioteca em que se instalar\u00E1 o projecto: install_copy_files=C\u00F3pia de ficheiros install_source=Origem: install_dest=Destino: install_status=Estado: install_start=Iniciar a instala\u00E7\u00E3o install_start_tooltip=Iniciar a c\u00F3pia de ficheiros para o seu computador install_progress_tooltip=Progresso da instala\u00E7\u00E3o install_msg_waiting=A aguardar confirma\u00E7\u00E3o. install_msg_creating_dirs=A criar pastas install_msg_copying=A copiar o ficheiro install_msg_end=Terminado! install_msg_cleanup=A limpar... install_msg_cancel=Instala\u00E7\u00E3o cancelada! install_error=Ocorreu um erro durante a instala\u00E7\u00E3o! install_select_folder=Seleccione a pasta em que se criar\u00E3o os \u00EDcones do projecto: install_library_folders=Pastas da biblioteca: install_success_1=O projecto foi instalado correctamente! install_success_2=Para executar, seleccione o install_success_3=\u00EDcone na biblioteca de projectos. wizard_info=Clique em "Seguinte" para continuar. install_step_1=1. Selec\u00E7\u00E3o da biblioteca Jclic install_step_2=2. Transfer\u00EAncia de ficheiros install_step_3=3. Cria\u00E7\u00E3o de \u00EDcones install_step_4=Instala\u00E7\u00E3o conclu\u00EDda! install_info_info=Solicitou a instala\u00E7\u00E3o do projecto: settings_title=Prefer\u00EAncias library_error_clone=N\u00E3o foi poss\u00EDvel clonar a biblioteca! settings_security=Seguran\u00E7a settings_password_protect=Proteger configura\u00E7\u00F5es com palavra-chave settings_new_password=Nova palavra-chave: settings_new_password_confirm=Confirmar nova palavra-chave: settings_general=Geral settings_look=Aspecto: settings_skin=Visual: settings_language=Idioma: settings_reports=Relat\u00F3rios settings_report_use=Guardar os resultados das actividades numa base de dados settings_report_engine=Classe: settings_report_params=Par\u00E2metros: settings_media=Multim\u00EDdia settings_media_enabled=Multim\u00EDdia activado settings_media_system=Sistema multim\u00EDdia: settings_media_event_sounds=Sons de evento activados settings_library=Bibliotecas settings_library_autorun=Ir para a biblioteca quando o Jclic se inicia m_Tools=Ferramentas m_File_Mnemonic=F m_Tools_Mnemonic=F m_Help_Mnemonic=Y m_Activity=Actividade m_Activity_Mnemonic=A action_openFile_caption=Abrir ficheiro... action_openFile_tooltip=Abrir um ficheiro de projecto JClic action_openFile_keys=AO action_openUrl_caption=Abrir URL... action_openUrl_tooltip=Abrir um projecto JClic directamente da Internet action_openUrl_keys=UU action_exit_caption=Sair action_exit_tooltip=Fechar JClic action_exit_keys=LX action_settings_caption=Defini\u00E7\u00F5es... action_settings_tooltip=Ajustar as op\u00E7\u00F5es globais do programa action_settings_keys=C action_libraries_tooltip=Abrir ou modificar uma biblioteca JClic action_libraries_keys=BB action_helpAbout_tooltip=Informa\u00E7\u00E3o sobre o JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Esta imagem \u00E9 muito grande para ser utilizada como \u00EDcone! settings_report_tcp=Conectar-se a um servidor de relat\u00F3rios JClic: settings_report_jdbc=Conex\u00E3o directa a uma base de dados JDBC: settings_report_other=Outros: settings_report_address=Servidor: settings_report_port=Porta: settings_report_driver=Controlador: settings_report_url=URL: settings_report_user=Utilizador: settings_report_pwd=Palavra-chave: settings_report_options=Par\u00E2metros: settings_report_err_server=Nome do servidor de relat\u00F3rios incorrecto! settings_report_err_port=Valor incorrecto da porta no sistema de relat\u00F3rios. Por favor, indique um valor entre 1000 e 65000. settings_report_err=Dados incorrectos para o sistema de relat\u00F3rios! settings_report_type=Tipo de relat\u00F3rio: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Detectar automaticamente settings_security_tooltip=Op\u00E7\u00F5es de seguran\u00E7a settings_report_tooltip=Configura\u00E7\u00E3o do sistema de relat\u00F3rios settings_media_tooltip=Configura\u00E7\u00E3o do sistema multim\u00E9dia settings_general_tooltip=Op\u00E7\u00F5es de idioma e apar\u00EAncia settings_library_tooltip=Configura\u00E7\u00E3o e edi\u00E7\u00E3o de bibliotecas settings_look_tooltip=Aspecto da interface de utilizador settings_skin_tooltip=Selec\u00E7\u00E3o do estilo gr\u00E1fico do JClic settings_language_tooltip=Selec\u00E7\u00E3o do idioma settings_report_use_tooltip=Activa ou desactiva a conex\u00E3o a uma base de dados de relat\u00F3rios JClic settings_report_tcp_tooltip=Motor de relat\u00F3rios baseado numa conex\u00E3o TCP/IP settings_report_jdbc_tooltip=Motor de relat\u00F3rios baseado numa conex\u00E3o directa a uma base de dados settings_report_other_tooltip=Outros motores de relat\u00F3rios... settings_report_address_tooltip=Nome ou endere\u00E7o IP do servidor de relat\u00F3rios settings_report_port_tooltip=Porta usada para a conex\u00E3o (padr\u00E3o: 5510) edit_file=Ficheiro: error_launchLibrary=Erro ao abrir a biblioteca install_toSourceFolder=A instalar na pasta de origem! edit_find_media=Procurar recurso... libraryManager_delete_caption=Eliminar libraryManager_delete_tooltip=Eliminar a refer\u00EAncia \u00E0 biblioteca seleccionada libraryManager_delete_confirm=Deseja eliminar a refer\u00EAncia \u00E0 biblioteca seleccionada? libraryManager_new_exists=Esta biblioteca j\u00E1 est\u00E1 conectada ao sistema! edit_find_image_keys=B* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Criar uma nova biblioteca de projectos libraryManager_connectToExistingOption=Adicionar hiperliga\u00E7\u00E3o a uma biblioteca j\u00E1 existente libraryManager_fileOrUrlCaption=Ficheiro ou URL: libraryManager_newLibraryTitle=Nova biblioteca de projectos libraryManager_warnNoFileSelected=Por favor, escreva a URL ou nome de ficheiro da biblioteca de projectos a que deseja aceder. install_launchProject=Abrir agora o projecto settings_browser=Navegador web preferido: settings_browser_tooltip=Comando usado para iniciar o navegador web (firefox, iexplore, mozilla, opera...) settings_country=C\u00F3digo do pa\u00EDs: settings_country_tooltip=C\u00F3digo opcional de duas letras correspondente \u00E0 variante do idioma (ex.: BR para Portugu\u00EAs do Brasil) settings_variant=Variante: settings_variant_tooltip=C\u00F3digo opcional da variante do idioma src/core/edu/xtec/resources/messages/PlayerMessages_pt_BR.properties000066400000000000000000000234301335566474600263130ustar00rootroot00000000000000# JClic player messages m_File=Arquivo settings_passwordRequired=Para efetuar esta opera\u00E7\u00E3o introduza a senha de administrador do JClic. m_Help=Ajuda m_Skin=Apar\u00EAncia action_helpAbout_caption=Sobre... libraryManager_mainLibraryTitle=Biblioteca principal library_badFormat=Este arquivo JClic n\u00E3o \u00E9 do tipo "biblioteca de projetos".\nAs bibliotecas s\u00E3o um tipo especial de arquivos JClic. library_mainMenu=Menu principal library_newLibraryName=Nova biblioteca de projetos libraryManager_new_prompt=\u00BFDeseja criar uma nova biblioteca ou conectar-se a uma biblioteca existente? libraryManager_connectToLibrary=Conectar-se libraryManager_createNewLibrary=Nova libraryManager_new_tooltip=Criar ou conectar-se a uma nova biblioteca libraryManager_new_caption=Nova menuElement_dlg_icon_tooltip=imagem a ser exibida no bot\u00E3o menuElement_dlg_description_tooltip=Texto flutuante que aparecer\u00E1 quando se deixa o cursor parado sobre o bot\u00E3o. menuElement_dlg_description=Descri\u00E7\u00E3o: edit_find_image=Buscar imagem... menuElement_dlg_icon=\u00EDcone: edit_find_file=Buscar arquivo... menuElement_dlg_project_tooltip=Local do projeto JClic menuElement_dlg_project=Projeto: menuElement_dlg_text_tooltip=Texto do bot\u00E3o edit_text=Texto: menu_dlg_name_tooltip=Nome da pasta library_dlg_name_tooltip=Nome da biblioteca edit_name=Nome: edit_title=T\u00EDtulo: library_dlg_title=Propriedades da biblioteca menu_dlg_title=Propriedades da pasta menuElement_dlg_title=Propriedades do bot\u00E3o menu_delete_tooltip=Eliminar o menu selecionado menu_delete_caption=Eliminar menuElement_delete_tooltip=Eliminar o elemento de menu selecionado action_libraries_caption=Bibliotecas... dlg_save_title=Salvar arquivo... error_propertiesFile_beg=Erro ao abrir " error_propertiesFile_end=".Valores padr\u00E3o foram utilizados. menuElement_delete_caption=Excluir menu_newMenuElement_tooltip=Criar um novo bot\u00E3o de projeto menu_newMenuName=Nova pasta menu_newMenu_tooltip=Criar uma nova pasta de bot\u00F5es de projeto menu_newMenu_caption=Nova pasta de \u00EDcones menu_newMenuElement_caption=Novo bot\u00E3o de projeto menu_newMenuElementName=Novo bot\u00E3o library_cancel_tooltip=Cancelar as modifica\u00E7\u00F5es library_cancel_caption=Cancelar libraryManager_edit_tooltip=Editar a biblioteca selecionada libraryManager_edit_caption=Editar library_select_caption_ok_tooltip=Salvar altera\u00E7\u00F5es library_select_caption_tooltip=Escolher a pasta selecionada library_select_caption_ok=Aceitar library_select_caption=Selecionar library_caption=Biblioteca de projetos JClic libraryManager_select_tooltip=Abrir a biblioteca selecionada libraryManager_cancel_tooltip=Cancelar libraryManager_cancel_caption=Cancelar libraryManager_select_caption=Selecionar libraryManager_caption=Selec\u00E7\u00E3o da biblioteca de projetos library_error_reading=\u00A1Erro ao ler a biblioteca de projetos! wizard_next=Pr\u00F3ximo > wizard_prev=< Anterior wizard_finish=Finalizar library_error_creating_icons=\u00A1Erro ao criar o \u00EDcone na biblioteca! install_title=Instalac\u00E3oo de projetos JClic install_info_description=Instalar um novo projeto JClic install_info_from=De: wizard_cancel=Cancelar wizard_cancel_tooltip=Cancelar a opera\u00E7\u00E3o wizard_finish_tooltip=Finalizar a opera\u00E7\u00E3o wizard_next_tooltip=Passo seguinte da opera\u00E7\u00E3o wizard_prev_tooltip=Passo anterior da opera\u00E7\u00E3o install_select_library=Selecione a biblioteca em que se instalar\u00E1 o projeto: install_copy_files=C\u00F3pia de arquivos install_source=Origem: install_dest=Destino: install_status=Estado: install_start=Iniciar a instala\u00E7\u00E3o install_start_tooltip=Iniciar a c\u00F3pia de arquivos no computador install_progress_tooltip=Progresso da instala\u00E7\u00E3o install_msg_waiting=Esperando confirma\u00E7\u00E3o. install_msg_creating_dirs=Criando camadas install_msg_copying=Copiando o arquivo install_msg_end=\u00A1Feito! install_msg_cleanup=Limpando... install_msg_cancel=\u00A1Instala\u00E7\u00E3o cancelada! install_error=\u00A1Houve um erro durante a instala\u00E7\u00E3o! install_select_folder=Selecione a pasta em que se criar\u00E3o os \u00EDcones do projeto: install_library_folders=Pastas da biblioteca: install_success_1=O projeto foi instalado corretamente! install_success_2=Para executar selecione seu install_success_3=\u00CDcone na biblioteca de projetos. wizard_info=Clique em "Pr\u00F3ximo" para continuar. install_step_1=1. Selec\u00E7\u00E3o da biblioteca install_step_2=2. C\u00F3pia de arquivos install_step_3=3. Cria\u00E7\u00E3o de \u00EDcones install_step_4=\u00A1Instala\u00E7\u00E3o conclu\u00EDda! install_info_info=Solicitada instala\u00E7\u00E3o do projeto: settings_title=Configura\u00E7\u00E3o library_error_clone=\u00A1N\u00E3o foi poss\u00EDvel clonar a biblioteca! settings_security=Seguran\u00E7a settings_password_protect=Proteger altera\u00E7\u00F5es de configura\u00E7\u00E3o com senha settings_new_password=Nova senha: settings_new_password_confirm=Confirmar nova senha: settings_general=Geral settings_look=Aspecto: settings_skin=Camada: settings_language=Idioma: settings_reports=Relat\u00F3rios settings_report_use=Salvar os resultados das atividades em uma base de dados settings_report_engine=Classe: settings_report_params=Par\u00E2metros: settings_media=Multim\u00EDdia settings_media_enabled=Multim\u00EDdia ativada settings_media_system=Sistema multim\u00EDdia: settings_media_event_sounds=Sons eventuais ativados settings_library=Bibliotecas settings_library_autorun=Mostrar autom\u00E1ticamente a biblioteca no in\u00EDcio m_Tools=Ferramentas m_File_Mnemonic=F m_Tools_Mnemonic=H m_Help_Mnemonic=Y m_Activity=Atividade m_Activity_Mnemonic=A action_openFile_caption=Abrir o arquivo... action_openFile_tooltip=Abrir um arquivo de projeto JClic action_openFile_keys=AO action_openUrl_caption=Abrir local web... action_openUrl_tooltip=Abrir um projeto JClic diretamente da Internet action_openUrl_keys=UU action_exit_caption=Sair action_exit_tooltip=Fechar o JClic action_exit_keys=LX action_settings_caption=Configura\u00E7\u00E3o... action_settings_tooltip=Ajustar as op\u00E7oes globais do programa action_settings_keys=C action_libraries_tooltip=Abrir ou modificar uma biblioteca JClic action_libraries_keys=BB action_helpAbout_tooltip=Informa\u00E7\u00E3o sobre o JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=\u00A1Esta imagem \u00E9 muito grande para ser utilizada como \u00EDcone! settings_report_tcp=Conectar-se a um servidor de relat\u00F3rio JClic: settings_report_jdbc=Conex\u00E3o direta a uma base de dados JDBC: settings_report_other=Outros: settings_report_address=Servidor: settings_report_port=Porta: settings_report_driver=Controlador: settings_report_url=URL: settings_report_user=Usu\u00E1rio: settings_report_pwd=Senha: settings_report_options=Par\u00E2metros: settings_report_err_server=\u00A1Nome do servidor de relat\u00F3rios incorreto! settings_report_err_port=Valor incorreto da porta no sistema de relat\u00F3rios. Por favor, indique um valor entre 1000 e 65000. settings_report_err=\u00A1Dados incorretos para o sistema de relat\u00F3rios! settings_report_type=Tipo de relat\u00F3rio: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Detec\u00E7\u00E3o autom\u00E1tica settings_security_tooltip=Op\u00E7\\oes de seguran\u00E7a settings_report_tooltip=Configura\u00E7\u00E3o do sistema de relat\u00F3rios settings_media_tooltip=Configura\u00E7\u00E3o do sistema multimeios settings_general_tooltip=Op\u00E7oes de idioma e apar\u00EAncia settings_library_tooltip=Configura\u00E7\u00E3o e edi\u00E7\u00E3o de bibliotecas settings_look_tooltip=Aspecto da interface de usu\u00E1rio settings_skin_tooltip=Selec\u00E7\u00E3o do estilo gr\u00E1fico do JClic settings_language_tooltip=Selec\u00E7\u00E3o do idioma settings_report_use_tooltip=Ativa ou desativa a conex\u00E3o a uma base de dados de relat\u00F3rios JClic settings_report_tcp_tooltip=Motor de relat\u00F3rios baseado numa conex\u00E3o TCP/IP settings_report_jdbc_tooltip=Motor de relat\u00F3rios baseado numa conex\u00E3o direta a uma base de dados settings_report_other_tooltip=Outros motores de relat\u00F3rios... settings_report_address_tooltip=Nome ou direc\u00E7\u00E3o IP do servidor de relat\u00F3rios settings_report_port_tooltip=Porta usada para a conex\u00E3o (padr\u00E3o: 5510) edit_file=Arquivo: error_launchLibrary=Erro ao abrir a biblioteca install_toSourceFolder=\u00A1Instalando na pasta origem! edit_find_media=Buscar recurso... libraryManager_delete_caption=Apagar libraryManager_delete_tooltip=Suprimir a refer\u00EAncia a biblioteca selecionada libraryManager_delete_confirm=\u00BFRealmente deseja eliminar a refer\u00EAncia \u00E0 biblioteca selecionada? libraryManager_new_exists=\u00A1Esta biblioteca j\u00E1 est\u00E1 conectada ao sistema! edit_find_image_keys=B* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Criar uma nova biblioteca de projetos libraryManager_connectToExistingOption=Acrescentar um link a uma biblioteca j\u00E1 existente libraryManager_fileOrUrlCaption=Arquivo ou URL: libraryManager_newLibraryTitle=Nova biblioteca de projetos libraryManager_warnNoFileSelected=Por favor, escreva a URL ou nome de arquivo da biblioteca de projetos a qual deseja acessar. install_launchProject=Abrir agora o projeto settings_browser=Navegador proferido: settings_browser_tooltip=Comando usado para iniciar o navegador (firefox, iexplorer, mozilla, opera...) settings_country=Country code: settings_country_tooltip=Optional two-letter code corresponding to the country-specific variant of the language (ex.: BR for Brazilian Portuguese) settings_variant=Variant: settings_variant_tooltip=Optional variant code of the language src/core/edu/xtec/resources/messages/PlayerMessages_ru.properties000066400000000000000000000617421335566474600257430ustar00rootroot00000000000000# JClic player messages m_File=\u0424\u0430\u0439\u043B settings_passwordRequired=\u0414\u043B\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0430\u0440\u043E\u043B\u044C \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 JClic. m_Help=\u0421\u043F\u0440\u0430\u0432\u043A\u0430 m_Skin=\u0421\u043A\u0438\u043D action_helpAbout_caption=\u041E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0435... libraryManager_mainLibraryTitle=\u041E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 library_badFormat=\u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B JClic \u043D\u0435 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430!\n\u0411\u0438\u0431\u0438\u043B\u043E\u0442\u0435\u043A\u0438 - \u044D\u0442\u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0439 \u0442\u0438\u043F \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432 JClic. library_mainMenu=\u0413\u043B\u0430\u0432\u043D\u043E\u0435 \u043C\u0435\u043D\u044E library_newLibraryName=\u041D\u043E\u0432\u0430\u044F \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 libraryManager_new_prompt=\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 \u0438\u043B\u0438 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0443\u044E? libraryManager_connectToLibrary=\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C libraryManager_createNewLibrary=\u0421\u043E\u0437\u0434\u0430\u0442\u044C libraryManager_new_tooltip=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0438\u043B\u0438 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 libraryManager_new_caption=\u0421\u043E\u0437\u0434\u0430\u0442\u044C menuElement_dlg_icon_tooltip=\u0417\u043D\u0430\u0447\u043E\u043A \u043A\u043D\u043E\u043F\u043A\u0438 menuElement_dlg_description_tooltip=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u043A\u043D\u043E\u043F\u043A\u0438, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0435 \u043A\u0430\u043A \u0442\u0435\u043A\u0441\u0442 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 menuElement_dlg_description=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435: edit_find_image=\u041D\u0430\u0439\u0442\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435... menuElement_dlg_icon=\u0417\u043D\u0430\u0447\u043E\u043A: edit_find_file=\u041D\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043B... menuElement_dlg_project_tooltip=\u041F\u0443\u0442\u044C \u043A JClic \u043F\u0440\u043E\u0435\u043A\u0442\u0443 menuElement_dlg_project=\u041F\u0440\u043E\u0435\u043A\u0442: menuElement_dlg_text_tooltip=\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 edit_text=\u0422\u0435\u043A\u0441\u0442: menu_dlg_name_tooltip=\u0418\u043C\u044F \u043F\u0430\u043F\u043A\u0438 library_dlg_name_tooltip=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438 edit_name=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435: edit_title=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A: library_dlg_title=\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438 menu_dlg_title=\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u043F\u0430\u043F\u043A\u0438 menuElement_dlg_title=\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u043A\u043D\u043E\u043F\u043A\u0438 menu_delete_tooltip=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u043C\u0435\u043D\u044E menu_delete_caption=\u0423\u0434\u0430\u043B\u0438\u0442\u044C menuElement_delete_tooltip=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043C\u0435\u043D\u044E action_libraries_caption=\u0411\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438... dlg_save_title=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0444\u0430\u0439\u043B... error_propertiesFile_beg=\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u044F " error_propertiesFile_end=". \u0411\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439. menuElement_delete_caption=\u0423\u0434\u0430\u043B\u0438\u0442\u044C menu_newMenuElement_tooltip=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u044F\u0440\u043B\u044B\u043A \u043F\u0440\u043E\u0435\u043A\u0442\u0430 menu_newMenuName=\u041D\u043E\u0432\u0430\u044F \u043F\u0430\u043F\u043A\u0430 menu_newMenu_tooltip=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043F\u0430\u043F\u043A\u0443 \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043E\u043A \u043F\u0440\u043E\u0435\u043A\u0442\u0430 menu_newMenu_caption=\u041D\u043E\u0432\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u043A\u043D\u043E\u043F\u043E\u043A menu_newMenuElement_caption=\u041D\u043E\u0432\u0430\u044F \u043A\u043D\u043E\u043F\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 menu_newMenuElementName=\u041D\u043E\u0432\u0430\u044F \u043A\u043D\u043E\u043F\u043A\u0430 library_cancel_tooltip=\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F library_cancel_caption=\u041E\u0442\u043C\u0435\u043D\u0430 libraryManager_edit_tooltip=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u0443\u044E \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 libraryManager_edit_caption=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C library_select_caption_ok_tooltip=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F library_select_caption_tooltip=\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u0443\u044E \u043F\u0430\u043F\u043A\u0443 library_select_caption_ok=Ok library_select_caption=\u0412\u044B\u0431\u0440\u0430\u0442\u044C library_caption=\u0411\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432 JClic libraryManager_select_tooltip=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u0443\u044E \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 libraryManager_cancel_tooltip=\u041E\u0442\u043C\u0435\u043D\u0430 libraryManager_cancel_caption=\u041E\u0442\u043C\u0435\u043D\u0430 libraryManager_select_caption=\u0412\u044B\u0431\u0440\u0430\u0442\u044C libraryManager_caption=\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 library_error_reading=\u041E\u0448\u0438\u0431\u043A\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430! wizard_next=\u0414\u0430\u043B\u0435\u0435 > wizard_prev=< \u041D\u0430\u0437\u0430\u0434 wizard_finish=\u0417\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u044C library_error_creating_icons=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438! install_title=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432 JClic install_info_description=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u0440\u043E\u0435\u043A\u0442\u0430 JClic install_info_from=\u041E\u0442: wizard_cancel=\u041E\u0442\u043C\u0435\u043D\u0430 wizard_cancel_tooltip=\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E wizard_finish_tooltip=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E wizard_next_tooltip=\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u0448\u0430\u0433 wizard_prev_tooltip=\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u0448\u0430\u0433 install_select_library=\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443, \u043A\u0443\u0434\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043F\u0440\u043E\u0435\u043A\u0442: install_copy_files=\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u0430 install_source=\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A: install_dest=\u041D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: install_status=\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435: install_start=\u041D\u0430\u0447\u0430\u043B\u043E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 install_start_tooltip=\u041D\u0430\u0447\u0430\u043B\u043E \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0444\u0430\u0439\u043B\u043E\u0432 \u043D\u0430 \u0432\u0430\u0448 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440 install_progress_tooltip=\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 install_msg_waiting=\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F. install_msg_creating_dirs=\u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043F\u0430\u043F\u043E\u043A install_msg_copying=\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u0430 install_msg_end=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E! install_msg_cleanup=\u041F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u043A\u0430 \u043E\u0447\u0438\u0441\u0442\u043A\u0438... install_msg_cancel=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u0430! install_error=\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438! install_select_folder=\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u0434\u043B\u044F \u0440\u0430\u0437\u043C\u0435\u0449\u0435\u043D\u0438\u044F \u0437\u043D\u0430\u0447\u043A\u043E\u0432 \u043F\u0440\u043E\u0435\u043A\u0442\u0430: install_library_folders=\u041F\u0430\u043F\u043A\u0438 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A: install_success_1=\u041F\u0440\u043E\u0435\u043A\u0442 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043D\u0430 \u0432\u0430\u0448\u0435\u043C \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440\u0435! install_success_2=\u0414\u043B\u044F \u0435\u0433\u043E \u0437\u0430\u043F\u0443\u0441\u043A\u0430, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0435\u0433\u043E install_success_3=\u0437\u043D\u0430\u0447\u043E\u043A \u0432 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u0430. wizard_info=\u041D\u0430\u0436\u043C\u0438\u0442\u0435 "\u0414\u0430\u043B\u0435\u0435" \u0434\u043B\u044F \u043D\u0430\u0447\u0430\u043B\u0430. install_step_1=1. \u0412\u044B\u0431\u043E\u0440 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438 JClic install_step_2=2. \u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0444\u0430\u0439\u043B\u043E\u0432 install_step_3=3. \u0421\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u0437\u043D\u0430\u0447\u043A\u043E\u0432 install_step_4=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430! install_info_info=\u0412\u044B \u043F\u0440\u043E\u0441\u0438\u0442\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043F\u0440\u043E\u0435\u043A\u0442 settings_title=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 library_error_clone=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043A\u043B\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443! settings_security=\u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C settings_password_protect=\u0417\u0430\u0449\u0438\u0442\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043F\u0430\u0440\u043E\u043B\u0435\u043C settings_new_password=\u041D\u043E\u0432\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C: settings_new_password_confirm=\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043D\u043E\u0432\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C: settings_general=\u041E\u0431\u0449\u0438\u0435 settings_look=\u0421\u043C\u043E\u0442\u0440\u0438 \u0438 \u0427\u0443\u0432\u0441\u0442\u0432\u0443\u0439 (\u0434\u0438\u0437\u0430\u0439\u043D): settings_skin=\u0421\u043A\u0438\u043D: settings_language=\u042F\u0437\u044B\u043A: settings_reports=\u041E\u0442\u0447\u0451\u0442\u044B settings_report_use=\u0417\u0430\u043F\u0438\u0441\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043D\u043D\u044B\u0445 settings_report_engine=\u041A\u043B\u0430\u0441\u0441 \u043E\u0442\u0447\u0438\u0442\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F: settings_report_params=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B: settings_media=\u041C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0430 settings_media_enabled=\u041C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 settings_media_system=\u041C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0439\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430: settings_media_event_sounds=\u0417\u0432\u0443\u043A\u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u0439 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B settings_library=\u0411\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438 settings_library_autorun=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0438\u0442\u044C \u043A \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430\u043C \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 JClic m_Tools=\u0421\u0435\u0440\u0432\u0438\u0441 m_File_Mnemonic=\u0424 m_Tools_Mnemonic=\u0415 m_Help_Mnemonic=\u0421 m_Activity=\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C m_Activity_Mnemonic=\u0410 action_openFile_caption=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0444\u0430\u0439\u043B... action_openFile_tooltip=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0444\u0430\u0439\u043B \u043F\u0440\u043E\u0435\u043A\u0442\u0430 JClic action_openFile_keys=OO action_openUrl_caption=\u041E\u0442\u043A\u0440\u044B\u0442\u044C URL... action_openUrl_tooltip=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0444\u0430\u0439\u043B \u043F\u0440\u043E\u0435\u043A\u0442\u0430 JClic \u0438\u0437 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0430 action_openUrl_keys=UU action_exit_caption=\u0412\u044B\u0445\u043E\u0434 action_exit_tooltip=\u0417\u0430\u043A\u0440\u044B\u0442\u044C JClic action_exit_keys=XX action_settings_caption=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438... action_settings_tooltip=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043E\u0431\u0449\u0438\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B action_settings_keys=\u041D action_libraries_tooltip=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0438\u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 JClic. action_libraries_keys=LL action_helpAbout_tooltip=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=\u042D\u0442\u043E \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0432\u0435\u043B\u0438\u043A\u043E \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F, \u043A\u0430\u043A \u0437\u043D\u0430\u0447\u043E\u043A! settings_report_tcp=\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 JClic settings_report_jdbc=\u041F\u0440\u044F\u043C\u043E\u0435 JDBC \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435: settings_report_other=\u0414\u0440\u0443\u0433\u043E\u0435: settings_report_address=\u0423\u0437\u0435\u043B: settings_report_port=\u041F\u043E\u0440\u0442: settings_report_driver=\u0414\u0440\u0430\u0439\u0432\u0435\u0440: settings_report_url=\u0410\u0434\u0440\u0435\u0441(URL): settings_report_user=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C: settings_report_pwd=\u041F\u0430\u0440\u043E\u043B\u044C: settings_report_options=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u043E\u0442\u0447\u0438\u0442\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F:: settings_report_err_server=\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0438\u043C\u044F \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043E\u0442\u0447\u0451\u0442\u043E\u0432! settings_report_err_port=\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043D\u043E\u043C\u0435\u0440 \u043F\u043E\u0440\u0442\u0430! \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043C\u0435\u0436\u0434\u0443 1000 \u0438 65000. settings_report_err=\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u044B \u043E\u0442\u0447\u0451\u0442\u043E\u0432! settings_report_type=\u0421\u0438\u0441\u0442\u0435\u043C\u0430 \u043E\u0442\u0447\u0451\u0442\u043E\u0432: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=\u0410\u0432\u0442\u043E\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 settings_security_tooltip=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 settings_report_tooltip=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u044B \u043E\u0442\u0447\u0451\u0442\u043E\u0432 settings_media_tooltip=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u0438\u0441\u0442\u0435\u043C\u044B \u043C\u0443\u043B\u044C\u0442\u0438\u043C\u0435\u0434\u0438\u0430 settings_general_tooltip=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u044F\u0437\u044B\u043A\u0430 \u0438 \u0432\u0438\u0434\u0430 settings_library_tooltip=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438 \u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 settings_look_tooltip=\u0414\u0438\u0437\u0430\u0439\u043D \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F settings_skin_tooltip=\u0412\u044B\u0431\u043E\u0440 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0430\u0441\u043F\u0435\u043A\u0442\u0430 JClic settings_language_tooltip=\u0412\u044B\u0431\u043E\u0440 \u044F\u0437\u044B\u043A\u0430 settings_report_use_tooltip=\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C/\u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043A \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 JClic settings_report_tcp_tooltip=\u041C\u0435\u0445\u0430\u043D\u0438\u0437\u043C \u043E\u0442\u0447\u0451\u0442\u043E\u0432 \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043D\u0430 TCP/IP \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0438 settings_report_jdbc_tooltip=\u041C\u0435\u0445\u0430\u043D\u0438\u0437\u043C \u043E\u0442\u0447\u0451\u0442\u043E\u0432 \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043D\u0430 \u043F\u0440\u044F\u043C\u043E\u043C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u043A \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 settings_report_other_tooltip=\u041F\u0440\u043E\u0447\u0438\u0435 \u043C\u0435\u0445\u0430\u043D\u0438\u0437\u043C\u044B \u043E\u0442\u0447\u0451\u0442\u043E\u0432... settings_report_address_tooltip=\u0418\u043C\u044F \u0438\u043B\u0438 IP \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 settings_report_port_tooltip=\u041F\u043E\u0440\u0442 \u0434\u043B\u044F \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 5510) edit_file=\u0424\u0430\u0439\u043B: error_launchLibrary=\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438 install_toSourceFolder=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0432 \u043F\u0430\u043F\u043A\u0443 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430! edit_find_media=\u041D\u0430\u0439\u0442\u0438 \u043C\u0435\u0434\u0438\u0430 \u0444\u0430\u0439\u043B... libraryManager_delete_caption=\u0423\u0434\u0430\u043B\u0438\u0442\u044C libraryManager_delete_tooltip=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u0443\u044E \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 libraryManager_delete_confirm=\u0412\u044B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u0443\u044E \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443? libraryManager_new_exists=\u042D\u0442\u0430 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u0443\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u043A \u0441\u0438\u0441\u0442\u0435\u043C\u0435. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 libraryManager_connectToExistingOption=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0443\u044E \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0443 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 libraryManager_fileOrUrlCaption=\u0424\u0430\u0439\u043B \u0438\u043B\u0438 URL: libraryManager_newLibraryTitle=\u041D\u043E\u0432\u0430\u044F \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 libraryManager_warnNoFileSelected=\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 URL \u0438\u043B\u0438 \u0438\u043C\u044F \u0444\u0430\u0439\u043B\u0430 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430\\! install_launchProject=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u0440\u043E\u0435\u043A\u0442 \u0441\u0435\u0439\u0447\u0430\u0441 settings_browser=\u041F\u0440\u0435\u0434\u043F\u043E\u0447\u0438\u0442\u0430\u0435\u043C\u044B\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440: settings_browser_tooltip=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \u0434\u043B\u044F \u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 (firefox, iexplore, mozilla, opera...) settings_country=\u041A\u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u044B: settings_country_tooltip=\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0434\u0432\u0443\u0445\u0441\u0438\u043C\u0432\u043E\u043B\u044C\u043D\u044B\u0439 \u043A\u043E\u0434, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0443 \u044F\u0437\u044B\u043A\u0430, \u0441\u043F\u0435\u0446\u0438\u0444\u0438\u0447\u043D\u043E\u043C\u0443 \u0434\u043B\u044F \u0441\u0442\u0440\u0430\u043D\u044B (\u043D\u0430\u043F\u0440.: BR \u0434\u043B\u044F Brazilian Portuguese) settings_variant=\u0412\u0430\u0440\u0438\u0430\u043D\u0442: settings_variant_tooltip=\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u043A\u043E\u0434\u0430 \u044F\u0437\u044B\u043A\u0430 src/core/edu/xtec/resources/messages/PlayerMessages_tr.properties000066400000000000000000000215761335566474600257430ustar00rootroot00000000000000# JClic player messages m_File=Dosya settings_passwordRequired=Bu i\u015Flemi ger\u00E7ekle\u015Ftirmek i\u00E7in y\u00F6netici \u015Fifresi gereklidir. m_Help=Yard\u0131m m_Skin=G\u00F6r\u00FCn\u00FCm action_helpAbout_caption=Hakk\u0131nda... libraryManager_mainLibraryTitle=Ana k\u00FCt\u00FCphane library_badFormat=Bu JClic dosyas\u0131 bir proje k\u00FCt\u00FCphanesi de\u011Fil! library_mainMenu=Ana Men\u00FC library_newLibraryName=Yeni proje k\u00FCt\u00FCphanesi libraryManager_new_prompt=Yeni bir k\u00FCt\u00FCphane mi olu\u015Fturmak istiyorsunuz yoksa var olanam\u0131 ba\u011Flanmak istiyorsunuz? libraryManager_connectToLibrary=Ba\u011Flan libraryManager_createNewLibrary=Yeni libraryManager_new_tooltip=Create or connect to a new library libraryManager_new_caption=Yeni menuElement_dlg_icon_tooltip=Buton Simgesi menuElement_dlg_description_tooltip=Description of the button, used as a tooltip text. menuElement_dlg_description=A\u00E7\u0131klama: edit_find_image=Resim bul... menuElement_dlg_icon=Simge: edit_find_file=Dosya bul... menuElement_dlg_project_tooltip=JClic projesi dosya yolu menuElement_dlg_project=Proje: menuElement_dlg_text_tooltip=Buton Yaz\u0131s\u0131 edit_text=Metin: menu_dlg_name_tooltip=Klas\u00F6r ad\u0131 library_dlg_name_tooltip=K\u00FCt\u00FCphane ad\u0131 edit_name=\u0130sim: edit_title=Ba\u015Fl\u0131k: library_dlg_title=K\u00FCt\u00FCphane projesi menu_dlg_title=Klas\u00F6r \u00F6zellikleri menuElement_dlg_title=Buton \u00F6zellikleri menu_delete_tooltip=Ge\u00E7erli men\u00FCy\u00FC sil menu_delete_caption=Sil menuElement_delete_tooltip=Delete current menu element action_libraries_caption=Libraries... dlg_save_title=Dosyay\u0131 kaydet... error_propertiesFile_beg=Dosya a\u00E7ma hatas\u0131 error_propertiesFile_end=". Defaults will be used. menuElement_delete_caption=Sil menu_newMenuElement_tooltip=Create a new shortcut to a project menu_newMenuName=Yeni klas\u00F6r menu_newMenu_tooltip=Proje butonlar\u0131 i\u00E7in yeni dosya olu\u015Ftur menu_newMenu_caption=Yeni buton klas\u00F6r\u00FC menu_newMenuElement_caption=New project button menu_newMenuElementName=New button library_cancel_tooltip=De\u011Fi\u015Fiklikleri iptal et library_cancel_caption=\u0130ptal libraryManager_edit_tooltip=Se\u00E7ilen k\u00FCt\u00FCphaneyi d\u00FCzenle libraryManager_edit_caption=D\u00FCzenle library_select_caption_ok_tooltip=De\u011Fi\u015Fiklikleri Kaydet library_select_caption_tooltip=\u0130\u015Faretli klas\u00F6r\u00FC se\u00E7 library_select_caption_ok=Tamam library_select_caption=Se\u00E7 library_caption=JClic proje k\u00FCt\u00FCphanesi libraryManager_select_tooltip=Se\u00E7ili k\u00FCt\u00FCphaneyi a\u00E7 libraryManager_cancel_tooltip=\u0130ptal libraryManager_cancel_caption=\u0130ptal libraryManager_select_caption=Se\u00E7 libraryManager_caption=K\u00FCt\u00FCphane se\u00E7 library_error_reading=Proje k\u00FCt\u00FCphanesi okuma hatas\u0131! wizard_next=Sonraki > wizard_prev=<\u00D6nceki wizard_finish=Tamamla library_error_creating_icons=K\u00FCt\u00FCphane simgeleri olu\u015Fturma hatas\u0131 install_title=JClic proje kurulumu install_info_description=Yeni bir JClic projesi kurulumu install_info_from=G\u00F6nderen: wizard_cancel=\u0130ptal wizard_cancel_tooltip=\u0130\u015Flemi iptal et wizard_finish_tooltip=\u0130\u015Flemi bitir wizard_next_tooltip=\u0130\u015Flemin sonraki ad\u0131m\u0131 wizard_prev_tooltip=\u0130\u015E\u015Flemin \u00F6nceki ad\u0131m\u0131 install_select_library=Projenin kurulaca\u011F\u0131 k\u00FCt\u00FCphaneyi se\u00E7 install_copy_files=Dosya kopyalama install_source=Kaynak: install_dest=Hedef: install_status=Durum: install_start=Kurulumu ba\u015Flat install_start_tooltip=Dosyalar\u0131 bilgisaya kopyalamay\u0131 ba\u015Flat install_progress_tooltip=Kurulumun ilerlemesi install_msg_waiting=Onay i\u00E7in bekliyor. install_msg_creating_dirs=Creating directories install_msg_copying=Dosya kopyalan\u0131yor install_msg_end=Tamamland\u0131! install_msg_cleanup=Performing cleanup... install_msg_cancel=Kurulum iptal edildi! install_error=Kurulum hatas\u0131! install_select_folder=Select the folder where to place the project icons: install_library_folders=Library folders: install_success_1=The project are now installed on your system! install_success_2=In order to run it, select its install_success_3=icon on the project library. wizard_info=Press "Next" to start. install_step_1=1. Selection of JClic library install_step_2=2. Download files install_step_3=3. Creation of icons install_step_4=Installation finished! install_info_info=You request to install the project: settings_title=Settings library_error_clone=Unable to clone library! settings_security=Security settings_password_protect=Protect settings with password settings_new_password=New password: settings_new_password_confirm=Confirm new password: settings_general=General settings_look=Look & Feel: settings_skin=Skin: settings_language=Language: settings_reports=Reports settings_report_use=Write scores to a database settings_report_engine=Reporter class: settings_report_params=Parameters: settings_media=Multimedia settings_media_enabled=Multimedia enabled settings_media_system=Multimedia system: settings_media_event_sounds=Event sounds enabled settings_library=Libraries settings_library_autorun=Automatically go to libraries when JClic starts m_Tools=Tools m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Activity m_Activity_Mnemonic=A action_openFile_caption=Open file... action_openFile_tooltip=Open a JClic project file action_openFile_keys=OO action_openUrl_caption=Open URL... action_openUrl_tooltip=Open a JClic project directly form Internet action_openUrl_keys=UU action_exit_caption=Exit action_exit_tooltip=Close JClic action_exit_keys=XX action_settings_caption=Settings... action_settings_tooltip=Adjust global program settings action_settings_keys=T action_libraries_tooltip=Open or edit a JClic library. action_libraries_keys=LL action_helpAbout_tooltip=Information about JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=This image is too large to be used as an icon! settings_report_tcp=Connect to JClic report server: settings_report_jdbc=Direct JDBC connection: settings_report_other=Other: settings_report_address=Host: settings_report_port=Port: settings_report_driver=Driver: settings_report_url=URL: settings_report_user=User: settings_report_pwd=Password: settings_report_options=Reporter params:: settings_report_err_server=Bad report server name! settings_report_err_port=Incorrect port number! Please enter a value between 1000 and 65000. settings_report_err=Incorrect report system data! settings_report_type=Reporting engine: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Auto-detect settings_security_tooltip=Security settings settings_report_tooltip=Report system settings settings_media_tooltip=Multimedia system options settings_general_tooltip=Language and aspect settings settings_library_tooltip=Library settings and editor settings_look_tooltip=User interface look & feel settings_skin_tooltip=Selection of the graphic aspect of JClic settings_language_tooltip=Language selection settings_report_use_tooltip=Enables/disables the connection to a JClic reports database settings_report_tcp_tooltip=Reporting engine based on a TCP/IP connection settings_report_jdbc_tooltip=Reporting engine based on a direct connection to a database settings_report_other_tooltip=Other reporting engines... settings_report_address_tooltip=Report server name or IP address settings_report_port_tooltip=Port used for connection (default is 5510) edit_file=File: error_launchLibrary=Error launching library install_toSourceFolder=Installing to source folder! edit_find_media=Find media file... libraryManager_delete_caption=Delete libraryManager_delete_tooltip=Delete the reference to the selected library libraryManager_delete_confirm=Do you really want to delete the reference to the selected library? libraryManager_new_exists=This library is already linked to the system. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Create new project library libraryManager_connectToExistingOption=Add a link to an exisiting project library libraryManager_fileOrUrlCaption=File or URL: libraryManager_newLibraryTitle=New project library libraryManager_warnNoFileSelected=Please enter thr URL or file name of the project library\\! install_launchProject=Open the project now settings_browser=Preferred browser: settings_browser_tooltip=Command used to launch the browser (firefox, iexplore, mozilla, opera...) settings_country=Country code: settings_country_tooltip=Optional two-letter code corresponding to the country-specific variant of the language (ex.: BR for Brazilian Portuguese) settings_variant=Variant: settings_variant_tooltip=Optional variant code of the language src/core/edu/xtec/resources/messages/PlayerMessages_vec.properties000066400000000000000000000235541335566474600260710ustar00rootroot00000000000000# JClic player messages m_File=File settings_passwordRequired=Senghe vol \u019Aa password de ministrador de JClic par sta fatura m_Help=\u00C0ida m_Skin=Skin action_helpAbout_caption=Detali... libraryManager_mainLibraryTitle=Librer\u00ECa prensipal library_badFormat=Sto file JClic no 'l x\u00E9 na librer\u00ECa de proj\u00E8to! library_mainMenu=Menu prensipal library_newLibraryName=Nova librer\u00ECa de proj\u00E8to libraryManager_new_prompt=Vusto prod\u00F9xer na librer\u00ECa niova o tacarte a una x\u00E0 existente? libraryManager_connectToLibrary=Conesion libraryManager_createNewLibrary=Niova libraryManager_new_tooltip=Produxi o t\u00E0chete a na librer\u00ECa niova libraryManager_new_caption=Niovo menuElement_dlg_icon_tooltip=Icona de 'l boton menuElement_dlg_description_tooltip=Descrision d e'l boton, doparada f\u00E0 un t\u00E8sto de suxerimento menuElement_dlg_description=Descrision: edit_find_image=Cata im\u00E0xene... menuElement_dlg_icon=Icona edit_find_file=Cata file... menuElement_dlg_project_tooltip=Percorso de 'l prox\u00E8to JClic menuElement_dlg_project=Prox\u00E8to: menuElement_dlg_text_tooltip=T\u00E8sto de 'l boton edit_text=T\u00E8sto: menu_dlg_name_tooltip=N\u00F2me cart\u00E8\u019Aa library_dlg_name_tooltip=N\u00F2me librer\u00ECa edit_name=N\u00F2me: edit_title=T\u00ECto\u019Ao library_dlg_title=Propiet\u00E0 librer\u00ECa menu_dlg_title=Propiet\u00E0 cart\u00E8\u019Aa menuElement_dlg_title=Propiet\u00E0 boton menu_delete_tooltip=Scans\u00E8\u019Aa el menu corente menu_delete_caption=Scans\u00E8\u019Aa menuElement_delete_tooltip=Scans\u00E8\u019Aa el elemento de menu corente action_libraries_caption=Librer\u00ECe... dlg_save_title=Salva file... error_propertiesFile_beg=Ghe x\u00E9 st\u00E0 un eror a verxindo " error_propertiesFile_end=". Vegnar\u00E0 dopar\u00E0 \u019Ae preinpostasion. menuElement_delete_caption=Scans\u00E8\u019Aa menu_newMenuElement_tooltip=Inp\u00F2sta na scavesagna niova a un prox\u00E8to menu_newMenuName=Cart\u00E8\u019Aa niova menu_newMenu_tooltip=Produxi na cart\u00E8\u019Aa niova par botoni de prox\u00E8to menu_newMenu_caption=Cart\u00E8\u019Aa par i botoni niovi menu_newMenuElement_caption=Boton par prox\u00E8to niovo menu_newMenuElementName=Boton niovo library_cancel_tooltip=Scans\u00E8\u019Aa canbiamenti library_cancel_caption=Anu\u019Aa libraryManager_edit_tooltip=Mod\u00ECfega \u019Aa librer\u00ECa desern\u00ECa libraryManager_edit_caption=Mod\u00ECfega library_select_caption_ok_tooltip=Salva canbiamenti library_select_caption_tooltip=Desernisi \u019Aa cart\u00E8\u019Aa library_select_caption_ok=OK library_select_caption=Desernisi library_caption=Librer\u00ECa de prox\u00E8ti JClic libraryManager_select_tooltip=V\u00E8rxi \u019Aa librer\u00ECa desern\u00ECa libraryManager_cancel_tooltip=Anu\u019Aa libraryManager_cancel_caption=Anu\u019Aa libraryManager_select_caption=Desernisi libraryManager_caption=Desernisi librer\u00ECa library_error_reading=Ghe x\u00E9 st\u00E0 un eror a lexendo \u019Aa librer\u00ECa de prox\u00E8ti wizard_next=Invanti > wizard_prev=< Indr\u00ECo wizard_finish=Fenisi library_error_creating_icons=Ghe x\u00E9 st\u00E0 un eror a produxendo \u019Ae icone de \u019Aa librer\u00ECa! install_title=Ista\u019Aasion de prox\u00E8ti JClic install_info_description=Ista\u019Aasion de un prox\u00E8to JClic niovo install_info_from=Da: wizard_cancel=Anu\u019Aa wizard_cancel_tooltip=Anu\u019Aa operasion wizard_finish_tooltip=Fenisi operasion wizard_next_tooltip=Paso in v\u00E9gner de \u019Aa operasion wizard_prev_tooltip=Paso indr\u00ECo de \u019Aa operasion install_select_library=Desernisi \u019Aa librer\u00ECa indove ista\u019Aar el prox\u00E8to install_copy_files=C\u00F2pia de i files install_source=Sorxente install_dest=Destinasion: install_status=Status: install_start=Scominsia \u019Aa ista\u019Aasion install_start_tooltip=Scominsia \u019Aa c\u00F2pia de i files so 'l to ordenaor install_progress_tooltip=Progresion de \u019Aa ista\u019Aasion install_msg_waiting=In atexa de conferma. install_msg_creating_dirs=Produsion cart\u00E8\u019Ae install_msg_copying=C\u00F2pia de 'l file install_msg_end=Fen\u00ECo! install_msg_cleanup=Drio snetar... install_msg_cancel=Ista\u019Aasion revocada! install_error=Eror d eista\u019Aasion! install_select_folder=Desernisi \u019Aa cart\u00E8\u019Aa indove m\u00E9tar \u019Ae icone de prox\u00E8to: install_library_folders=Cart\u00E8\u019Ae de \u019Aa librer\u00ECa: install_success_1=El prox\u00E8to el x\u00E9 ista\u019A\u00E0 inte 'l to sost\u00E8ma! install_success_2=Par inviarlo, desernisi \u019Aa so install_success_3=icona inte \u019Aa librer\u00ECa de prox\u00E8to. wizard_info=Struca "Invanti" par scominsiar. install_step_1=1. Se\u019Aesion de \u019Aa librer\u00ECa JClic install_step_2=2. Descargo de i files install_step_3=3. Produsion de \u019Ae icone install_step_4=Ista\u019Aasion terminada! install_info_info=Te g\u00E0 dimand\u00E0 de ista\u019Aar el prox\u00E8to: settings_title=Inpostasion library_error_clone=No se g\u00E0 podesto clonar \u019Aa librer\u00ECa! settings_security=Seguresa settings_password_protect=Pret\u00E8xi \u019Ae inpostasion co' na password settings_new_password=Password niova: settings_new_password_confirm=Conferma password niova: settings_general=Xeneral settings_look=Faciavista: settings_skin=Skin: settings_language=Lengua: settings_reports=Reports settings_report_use=Scrivi pontexii so un database settings_report_engine=Clase reporter: settings_report_params=Par\u00E0metri: settings_media=Multimedia settings_media_enabled=Multimedia ativ\u00E0 settings_media_system=Sist\u00E8ma multimedia: settings_media_event_sounds=Son\u00F2ri evento ativ\u00E0i settings_library=Librer\u00ECe settings_library_autorun=V\u00E0 a \u019Ae librer\u00ECe da to p\u00F2ssta co se invia JClic m_Tools=Inpreste m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=Ativit\u00E0 m_Activity_Mnemonic=A action_openFile_caption=V\u00E8rxi file... action_openFile_tooltip=V\u00E8rxi un file de prox\u00E8to JClic action_openFile_keys=OO action_openUrl_caption=V\u00E8rxi URL... action_openUrl_tooltip=V\u00E8rxi un prox\u00E8to JClic indretamente da 'l internet action_openUrl_keys=UU action_exit_caption=S\u00F2rti action_exit_tooltip=Sara JClic action_exit_keys=XX action_settings_caption=Inpostasion... action_settings_tooltip=Rego\u019Aasion inpostasion xenera\u019Ai de l programa action_settings_keys=T action_libraries_tooltip=V\u00E8rxi i mod\u00ECfega na librer\u00ECa de JClic. action_libraries_keys=LL action_helpAbout_tooltip=Informasion so JClic action_helpAbout_keys=AA menuElement_err_iconTooLarge=Sta im\u00E0xene \u019Aa x\u00E9 masa granda par ser doparada f\u00E0 icona! settings_report_tcp=Conesion a server de reports JClic: settings_report_jdbc=Conesion dir\u00E8ta JDBC: settings_report_other=Altro: settings_report_address=Host: settings_report_port=P\u00F2rta: settings_report_driver=Driver: settings_report_url=URL: settings_report_user=Utente: settings_report_pwd=Password: settings_report_options=Par\u00E0metri report: settings_report_err_server=N\u00F2me de server report sbali\u00E0! settings_report_err_port=N\u00F9maro p\u00F2rta sabali\u00E0! Inserisi un va\u019Aor fra 1000 e 65000. settings_report_err=Dati de sit\u00E8ma de report sbali\u00E0i! settings_report_type=Motor de report: settings_media_jmf=Java Media Framework (JMF) settings_media_qt=QuickTime settings_media_default=Auto-detect settings_security_tooltip=Inpostasion de seguresa settings_report_tooltip=Inpostasion sist\u00E8ma de report settings_media_tooltip=Opsion sist\u00E8ma multimedia settings_general_tooltip=Inpostasion lengua e faciavista settings_library_tooltip=Inpostasion e editor librer\u00ECa settings_look_tooltip=Faciavista interfaicia utente settings_skin_tooltip=Se\u019Aesion de 'l asp\u00E8to gr\u00E0fego de JClic settings_language_tooltip=Se\u019Aesion lengua settings_report_use_tooltip=Ativa/dexativa \u019Aa conesion a un database de reports JClic settings_report_tcp_tooltip=Motor de report bax\u00E0 so na conesion tipo TCP/IP settings_report_jdbc_tooltip=Motor de report bax\u00E0 so na conesion dir\u00E8ta a database settings_report_other_tooltip=Altri motori de report... settings_report_address_tooltip=N\u00F2me i indriso IP de 'l server de report settings_report_port_tooltip=P\u00F2rta doparada par \u019Aa conesion (preinpost\u00E0 x\u00E9 5510) edit_file=File: error_launchLibrary=Ghe x\u00E9 st\u00E0 un eror inviando \u019Aa librer\u00ECa install_toSourceFolder=Drio ista\u019Aar inte cart\u00E8\u019Aa sorxente! edit_find_media=Cata file media... libraryManager_delete_caption=Scans\u00E8\u019Aa libraryManager_delete_tooltip=E\u019A\u00ECmina riferimento a \u019Aa librer\u00ECa se\u019Aesionada libraryManager_delete_confirm=Vusto dabon scanse\u019Aar el riferimento a \u019Aa librer\u00ECa se\u019Aesionada? libraryManager_new_exists=Sta librer\u00ECa \u019Aa x\u00E9 x\u00E0 linkada a 'l sist\u00E8ma. edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=Produxi na librer\u00ECa de prox\u00E8to niova libraryManager_connectToExistingOption=Xonta un link a na librer\u00ECa de prox\u00E8to existente libraryManager_fileOrUrlCaption=File o URL: libraryManager_newLibraryTitle=Nova librer\u00ECa de proj\u00E8to libraryManager_warnNoFileSelected=Inserisi URL o n\u00F2me de 'l file de \u019Aa librer\u00ECa de prox\u00E8to! install_launchProject=V\u00E8rxi el prox\u00E8to settings_browser=Navegador prefer\u00ECo: settings_browser_tooltip=Comando dopar\u00E0 par inviar el navegador (firefox, iexplore, mozilla, opera...) settings_country=C\u00F2dexe paexe: settings_country_tooltip=C\u00F2ddexe opsional de do l\u00E9tare corospondente a \u019Aa variante spes\u00ECfega de lengua (ex.: BR par portoghexe braxilian) settings_variant=Variansa: settings_variant_tooltip=C\u00F2dexe opsional de variansa de lengua src/core/edu/xtec/resources/messages/PlayerMessages_zh_TW.properties000066400000000000000000000253401335566474600263420ustar00rootroot00000000000000# JClic player messages m_File=\u6A94\u6848 settings_passwordRequired=\u9700\u8981JClic\u7BA1\u7406\u8005\u5BC6\u78BC\u624D\u80FD\u57F7\u884C\u6B64\u64CD\u4F5C m_Help=\u5E6B\u52A9 m_Skin=\u5916\u89C0 action_helpAbout_caption=\u95DC\u65BC... libraryManager_mainLibraryTitle=\u4E3B\u8981\u76EE\u9304\u5EAB library_badFormat=\u9019\u500BJClic\u6A94\u4E0D\u662F\u4E00\u500B\u5C08\u6848\u7684\u51FD\u5F0F\u5EAB library_mainMenu=\u4E3B\u9078\u55AE library_newLibraryName=\u65B0\u5C08\u6848\u5EAB libraryManager_new_prompt=\u4F60\u8981\u5275\u5EFA\u65B0\u7684\u76EE\u9304\u5EAB\uFF0C\u6216\u9023\u63A5\u5230\u4E00\u500B\u73FE\u6709\u7684\uFF1F libraryManager_connectToLibrary=\u9023\u7DDA libraryManager_createNewLibrary=\u65B0\u589E libraryManager_new_tooltip=\u5EFA\u7ACB\u6216\u9023\u7DDA\u65B0\u7684\u8CC7\u6599\u5EAB libraryManager_new_caption=\u65B0\u589E menuElement_dlg_icon_tooltip=\u6309\u7D10\u5716\u793A menuElement_dlg_description_tooltip=\u6309\u9215\u7684\u8A73\u7D30\u63CF\u8FF0(\u7528tooltip\u8A9E\u6CD5) menuElement_dlg_description=\u63CF\u8FF0\uFF1A edit_find_image=\u5C0B\u627E\u5716\u6A94... menuElement_dlg_icon=\u5716\u793A\uFF1A edit_find_file=\u5C0B\u627E\u6A94\u6848... menuElement_dlg_project_tooltip=JClic\u5C08\u6848\u8DEF\u5F91 menuElement_dlg_project=\u5C08\u6848\uFF1A menuElement_dlg_text_tooltip=\u6309\u7D10\u5167\u5BB9 edit_text=\u6587\u5B57\uFF1A menu_dlg_name_tooltip=\u8CC7\u6599\u593E\u540D\u7A31 library_dlg_name_tooltip=\u51FD\u5F0F\u5EAB\u540D\u7A31 edit_name=\u540D\u7A31: edit_title=\u6A19\u984C\uFF1A library_dlg_title=\u51FD\u5F0F\u5EAB\u5C6C\u6027 menu_dlg_title=\u8CC7\u6599\u593E\u5C6C\u6027 menuElement_dlg_title=\u6309\u7D10\u5C6C\u6027 menu_delete_tooltip=\u522A\u9664\u76EE\u524D\u76EE\u9304 menu_delete_caption=\u522A\u9664 menuElement_delete_tooltip=\u522A\u9664\u76EE\u524D\u76EE\u9304\u5143\u7D20 action_libraries_caption=\u51FD\u5F0F\u5EAB dlg_save_title=\u5132\u5B58\u6A94\u6848... error_propertiesFile_beg=\u958B\u555F\u6642\u767C\u751F\u932F\u8AA4\uFF1A error_propertiesFile_end=\u3002.\u500B\u9055\u898F\u88AB\u767C\u73FE menuElement_delete_caption=\u522A\u9664 menu_newMenuElement_tooltip=\u5EFA\u7ACB\u65B0\u7684\u6377\u5F91\u5230\u6B64\u5C08\u6848 menu_newMenuName=\u65B0\u8CC7\u6599\u593E menu_newMenu_tooltip=\u70BA\u5C08\u6848\u7684\u6309\u7D10\u5EFA\u7ACB\u4E00\u500B\u65B0\u8CC7\u6599\u593E menu_newMenu_caption=\u65B0\u7684\u6309\u7D10\u8CC7\u6599\u593E menu_newMenuElement_caption=\u65B0\u7684\u5C08\u6848\u6309\u7D10 menu_newMenuElementName=\u65B0\u6309\u7D10 library_cancel_tooltip=\u53D6\u6D88\u6539\u8B8A library_cancel_caption=\u53D6\u6D88 libraryManager_edit_tooltip=\u7DE8\u8F2F\u6240\u9078\u7684\u8CC7\u6599\u5EAB libraryManager_edit_caption=\u7DE8\u8F2F library_select_caption_ok_tooltip=\u5132\u5B58\u66F4\u6539 library_select_caption_tooltip=\u9078\u64C7\u6240\u9078\u7684\u8CC7\u6599\u593E library_select_caption_ok=Ok library_select_caption=\u9078\u53D6 library_caption=JClic\u5C08\u6848\u51FD\u5F0F\u5EAB libraryManager_select_tooltip=\u6253\u958B\u6240\u9078\u7684\u51FD\u5F0F\u5EAB libraryManager_cancel_tooltip=\u53D6\u6D88 libraryManager_cancel_caption=\u53D6\u6D88 libraryManager_select_caption=\u9078\u53D6 libraryManager_caption=\u9078\u64C7\u51FD\u5F0F\u5EAB library_error_reading=\u8B80\u53D6\u51FD\u5F0F\u5EAB\u932F\u8AA4! wizard_next=\u4E0B\u4E00\u6B65> wizard_prev=<\u4E0A\u4E00\u6B65 wizard_finish=\u5B8C\u6210 library_error_creating_icons=\u88FD\u9020\u51FD\u5F0F\u5EAB\u5716\u793A\u5931\u6557\uFF01 install_title=JClic\u5C08\u6848\u7684\u521D\u4F7F\u503C install_info_description=\u65B0\u7684JClic\u5C08\u6848\u521D\u4F7F\u503C install_info_from=\u5F9E\uFF1A wizard_cancel=\u53D6\u6D88 wizard_cancel_tooltip=\u53D6\u6D88\u64CD\u4F5C wizard_finish_tooltip=\u5B8C\u6210\u64CD\u4F5C wizard_next_tooltip=\u56DE\u5FA9\u4E0B\u4E00\u6B65\u64CD\u4F5C wizard_prev_tooltip=\u5FA9\u539F\u64CD\u4F5C install_select_library=\u9078\u64C7\u4E00\u500B\u8CC7\u6599\u5EAB\u4F86\u5B89\u88DD\u5C08\u6848 install_copy_files=\u8907\u88FD\u6A94\u6848 install_source=\u4F86\u6E90: install_dest=\u76EE\u7684\u5730: install_status=\u72C0\u614B\uFF1A install_start=\u958B\u59CB\u5B89\u88DD install_start_tooltip=\u958B\u59CB\u8907\u88FD\u6A94\u6848\u81F3\u96FB\u8166 install_progress_tooltip=\u5B89\u88DD\u904E\u7A0B install_msg_waiting=\u7B49\u5F85\u78BA\u8A8D install_msg_creating_dirs=\u5EFA\u7ACB\u4F7F\u7528\u624B\u518A install_msg_copying=\u8907\u88FD\u6A94\u6848 install_msg_end=\u5B89\u88DD\u5B8C\u6210\uFF01 install_msg_cleanup=\u6E05\u9664\u52D5\u4F5C\u2026 install_msg_cancel=\u53D6\u6D88\u5B89\u88DD\uFF01 install_error=\u5B89\u88DD\u932F\u8AA4\uFF01 install_select_folder=\u9078\u64C7\u8CC7\u6599\u593E\u4F86\u653E\u7F6E\u5C08\u6848\u5716\u793A install_library_folders=\u51FD\u5F0F\u5EAB\u7F6E\u653E\u8CC7\u6599\u593E\uFF1A install_success_1=\u5C08\u6848\u5DF2\u5B89\u88DD\u81F3\u7CFB\u7D71\uFF01 install_success_2=\u70BA\u4E86\u57F7\u884C\u672C\u7A0B\u5F0F\uFF0C\u5FC5\u9700\u9078\u64C7\u9019\u4E9B\u9078\u9805 install_success_3=\u5C08\u6848\u8CC7\u6599\u5EAB\u7684\u5716\u793A wizard_info=\u9078"\u4E0B\u4E00\u6B65"\u958B\u59CB install_step_1=JClic\u8CC7\u6599\u5EAB\u7684\u9078\u64C7 install_step_2=\u4E0B\u8F09\u6A94\u6848 install_step_3=\u88FD\u4F5C\u5716\u793A install_step_4=\u5B89\u88DD\u5B8C\u6210\uFF01 install_info_info=\u60A8\u9700\u8981\u5B89\u88DD\u5C08\u6848\uFF1A settings_title=\u8A2D\u5B9A library_error_clone=\u7121\u6CD5\u8907\u88FD\u51FD\u5F0F\u5EAB\uFF01 settings_security=\u5B89\u5168\u6027 settings_password_protect=\u8A2D\u7F6E\u4FDD\u8B77\u5BC6\u78BC settings_new_password=\u65B0\u5BC6\u78BC\uFF1A settings_new_password_confirm=\u78BA\u8A8D\u65B0\u5BC6\u78BC: settings_general=\u4E00\u822C settings_look=\u611F\u89C0\uFF1A settings_skin=\u5916\u89C0\uFF1A settings_language=\u8A9E\u8A00: settings_reports=\u5831\u544A settings_report_use=\u5BEB\u5165\u8CC7\u6599\u5EAB\u7684\u5206\u6578 settings_report_engine=\u56DE\u5831\u8005\u7684class settings_report_params=\u53C3\u6578\uFF1A settings_media=\u591A\u5A92\u9AD4 settings_media_enabled=\u591A\u5A92\u9AD4\u53EF\u57F7\u884C settings_media_system=\u591A\u5A92\u9AD4\u7CFB\u7D71 settings_media_event_sounds=\u4E8B\u4EF6\u97F3\u6548\u4F7F\u7528\u4E2D settings_library=\u51FD\u5F0F\u5EAB settings_library_autorun=\u7576JClic\u958B\u59CB\u6642\uFF0C\u81EA\u52D5\u5F15\u5165\u7684\u51FD\u5F0F\u5EAB m_Tools=\u5DE5\u5177\u7BB1 m_File_Mnemonic=F m_Tools_Mnemonic=T m_Help_Mnemonic=H m_Activity=\u6D3B\u52D5 m_Activity_Mnemonic=A action_openFile_caption=\u958B\u555F\u6A94\u6848... action_openFile_tooltip=\u6253\u958BJClic\u5C08\u6848 action_openFile_keys=OO action_openUrl_caption=\u958B\u555F\u7DB2\u5740... action_openUrl_tooltip=\u76F4\u63A5\u5F9E\u7DB2\u8DEF\u958B\u59CBJClic\u5C08\u6848 action_openUrl_keys=UU action_exit_caption=\u7D50\u675F action_exit_tooltip=\u95DC\u9589JClic action_exit_keys=XX action_settings_caption=\u8A2D\u5B9A... action_settings_tooltip=\u8ABF\u6574\u5168\u57DF\u8A2D\u5B9A action_settings_keys=T action_libraries_tooltip=\u6253\u958B\u6216\u7DE8\u8F2FJClic\u8CC7\u6599\u5EAB action_libraries_keys=LL action_helpAbout_tooltip=JClic\u7684\u76F8\u95DC\u8CC7\u8A0A action_helpAbout_keys=AA menuElement_err_iconTooLarge=\u9019\u5716\u7247\u592A\u5927\uFF0C\u7121\u6CD5\u4F5C\u70BA\u5716\u793A\u4F7F\u7528\u3002 settings_report_tcp=\u9023\u63A5\u5230JClic\u56DE\u5831\u4F3A\u670D\u5668 settings_report_jdbc=JDBC\u76F4\u9023\uFF1A settings_report_other=\u5176\u4ED6\uFF1A settings_report_address=\u4E3B\u6A5F: settings_report_port=\u9023\u63A5\u57E0: settings_report_driver=\u9A45\u52D5\u7A0B\u5F0F: settings_report_url=\u7DB2\u5740\uFF1A settings_report_user=\u4F7F\u7528\u8005\uFF1A settings_report_pwd=\u5BC6\u78BC\uFF1A settings_report_options=\u56DE\u5831\u53C3\u6578 settings_report_err_server=\u4E0D\u53EF\u884C\u7684\u56DE\u5831\u4F3A\u670D\u5668\u540D\u7A31 settings_report_err_port=\u932F\u8AA4\u7684\u9023\u63A5\u57E0\u865F\u78BC\uFF01\u503C\u5FC5\u9700\u57281000\u523065000\u4E4B\u9593 settings_report_err=\u932F\u8AA4\u7684\u56DE\u5831\u4F3A\u670D\u5668\u8CC7\u6599 settings_report_type=\u56DE\u5831\u7532\u6486 settings_media_jmf=JAVA\u5A92\u9AD4\u67B6\u69CB(JMF) settings_media_qt=QuickTime settings_media_default=\u81EA\u52D5\u6AA2\u6E2C settings_security_tooltip=\u5B89\u5168\u6027\u8A2D\u5B9A settings_report_tooltip=\u56DE\u5831\u4F3A\u670D\u5668\u8A2D\u5B9A settings_media_tooltip=\u591A\u5A92\u9AD4\u7CFB\u7D71\u9078\u9805 settings_general_tooltip=\u8A9E\u8A00\u53CA\u5916\u89C0\u8A2D\u5B9A settings_library_tooltip=\u51FD\u5F0F\u5EAB\u8A2D\u5B9A\u548C\u7DE8\u8F2F\u5668 settings_look_tooltip=\u4F7F\u7528\u8005\u5916\u89C0 settings_skin_tooltip=JClic\u7684\u5716\u50CF\u5916\u89C0 settings_language_tooltip=\u8A9E\u8A00\u9078\u64C7 settings_report_use_tooltip=JClic\u56DE\u5831\u8CC7\u6599\u5EAB\u7684\u8A31\u53EF settings_report_tcp_tooltip=TCP/IP \u76F4\u9023\u7684\u56DE\u5831\u5F15\u6486 settings_report_jdbc_tooltip=\u76F4\u9023\u8CC7\u6599\u5EAB\u7684\u56DE\u5831\u5F15\u64CE settings_report_other_tooltip=\u5176\u5B83\u56DE\u5831\u5F15\u6486 settings_report_address_tooltip=\u56DE\u5831\u4F3A\u670D\u5668\u7684\u540D\u7A31\u6216IP settings_report_port_tooltip=\u9023\u63A5\u7528\u7684\u9023\u63A5\u57E0(\u9810\u8A2D\u70BA5510)\uFF1A edit_file=\u6A94\u6848\uFF1A error_launchLibrary=\u57F7\u884C\u51FD\u5F0F\u5EAB\u932F\u8AA4 install_toSourceFolder=\u5B89\u88DD\u5230\u4F86\u6E90\u8CC7\u6599\u593E edit_find_media=\u5C0B\u627E\u5A92\u9AD4\u6A94 libraryManager_delete_caption=\u522A\u9664 libraryManager_delete_tooltip=\u6C38\u4E45\u522A\u9664\u51FD\u5F0F\u5EAB libraryManager_delete_confirm=\u4F60\u78BA\u5B9A\u8981\u6C38\u4E45\u522A\u9664\u9019\u500B\u51FD\u5F0F\u5EAB\u55CE\uFF1F libraryManager_new_exists=\u9019\u500B\u51FD\u5F0F\u5EAB\u5DF2\u9023\u63A5\u81F3\u7CFB\u7D71 edit_find_image_keys=F* menu_newMenuElement_caption_keys=NN menu_newMenu_caption_keys=MM edit_find_file_keys=FF libraryManager_newLibaryOption=\u65B0\u589E\u5C08\u6848\u5EAB libraryManager_connectToExistingOption=\u65B0\u589E\u9023\u7D50\u5230\u73FE\u6709\u7684\u5C08\u6848\u5EAB libraryManager_fileOrUrlCaption=\u6A94\u6848\u6216\u7DB2\u5740\uFF1A libraryManager_newLibraryTitle=\u65B0\u5C08\u6848\u5EAB libraryManager_warnNoFileSelected=\u8ACB\u8F38\u5165\u5C08\u6848\u5EAB\u7684\u7DB2\u5740\u6216\u5C08\u6848\u540D\u7A31 install_launchProject=\u73FE\u5728\u958B\u555F\u5C08\u6848 settings_browser=\u504F\u597D\u7684\u700F\u89BD\u5668\uFF1A settings_browser_tooltip=\u7528\u4F86\u958B\u555F\u700F\u89A7\u5668(firefox, iexplore, mozilla, opera...)\u7684\u6307\u4EE4 settings_country=\u570B\u5BB6\u4EE3\u78BC\uFF1A settings_country_tooltip=\u7528\u5169\u500B\u5B57\u6BCD\u4F86\u7C21\u5BEB\u8A9E\u8A00(EX:BR for Brazilian Portuguese) settings_variant=\u8B8A\u6578\uFF1A settings_variant_tooltip=\u8A9E\u8A00\u7684\u8B8A\u6578\u4EE3\u78BC(\u975E\u5FC5\u9808) src/core/edu/xtec/resources/messages/checkmedia.html000066400000000000000000000043711335566474600231310ustar00rootroot00000000000000 JClic - Check media system

Unable to detect any multimedia extension on your Java system!

JClic can play audio files in different formats (wav, au, mp3, ogg...), but it needs a extension of the Java system in order to play video and other multimedia content, like flash movies.

There is no multimedia extension currently installed on your Java system. You can continue without it (the multimedia files will be ignored), but it's advisable to install a extension in order to experience all the content of JClic activities. The installation process is easy, and must be done only once.

You can choose one of these two options: "QuickTime for Java" or "Java Media Framework".
In both cases, please read carefully the provided instructions and restart all browsers and Java applications after the installation.

Java Media Framework


Recommended option for Windows, Linux and other operating systems.

A basic set (only 2 Mb) of Java Media Framework for Windows can be downloaded from:
http://clic.xtec.cat/dist/java/customJMFinstal.exe

Full versions for Linux (i386), Solaris, Windows and cross-platform can be found at Sun's web site:
http://java.sun.com/products/java-media/jmf/downloads/index.html

 

QuickTime for Java


Recommended option for Mac OS-X.

The free QuickTime Player is available for downloading at:
http://www.apple.com/quicktime/download

Important: When installing, please choose the "custom" method and select "QuickTime Java" from the list of components to be installed. The "default" method usually does not install this component.

src/core/edu/xtec/resources/messages/checkmedia_ca.html000066400000000000000000000053721335566474600235760ustar00rootroot00000000000000 JClic - Comprovació del sistema multimèdia

Ha estat impossible detectar cap extensió multimèdia en el vostre sistema Java!

El JClic pot interpretar fitxers d'àudio de diferents formats (wav, au, mp3, ogg...), però necessita una extensió del sistema Java per poder interpretar vídeos i altres continguts multimèdia, com ara animacions Flash.

En aquests moments el vostre ordinador no compta amb cap extensió multimèdia Java instal·lada. Podeu continuar així (els fitxers multimèdia seran ignorats), però és recomanable instal·lar-ne una per tal de poder gaudir de tots els continguts de les activitats JClic. El procés d'instal·lació és molt senzill, i només s'ha de fer una vegada.

Podeu escollir entre dues opcions: "QuickTime for Java" o "Java Media Framework".
En ambdós casos, llegiu detalladament les instruccions i reinicialitzeu tots els navegadors i aplicacions Java un cop realitzada la instal·lació.

Java Media Framework


Opció recomanada per a Linux i altres sistemes operatius.

Una versió bàsica (només 2 Mb) del Java Media Framework per a Windows es pot descarregar des de:
http://clic.xtec.cat/dist/java/customJMFinstal.exe

Les versions completes per a Linux (i386), Solaris, Windows i altres sistemes es poden descarregar des de la web de Sun:
http://java.sun.com/products/java-media/jmf/downloads/index.html

 

QuickTime for Java


Opció recomanada per a usuaris de Mac OS-X.

El programa QuickTime Player és gratuït i pot ser descarregat des de la web:
http://www.apple.com/quicktime/download

Important: En començar el procés d'instal·lació escolliu l'opció "Personalitzada" i assegureu-vos de seleccionar "QuickTime Java" a la llista de components a instal·lar. En la modalitat "Estàndard" s'acostuma a ometre la instal·lació d'aquest component.

src/core/edu/xtec/resources/messages/checkmedia_de.html000066400000000000000000000044101335566474600235730ustar00rootroot00000000000000 JClic - Check media system

Ihr Java-System ist nicht f�r Multimedia eingerichtet!

JClic kann Audio-Dateien in verschiedenen Formaten (wav, au, mp3, ogg ...) abspielen. Um Videos oder andere Multimediadateien wie Flash Movies abzuspielen, muss Ihr Java-System allerdings f�r Multimedia konfiguriert werden.

Derzeit ist Ihr Java-System nicht f�r Multimedia eingerichtet. Sie k�nnen auch so fortfahren (Multimediadateien werden dann nicht abegespielt), wir empfehlen Ihnen jedoch, Java f�r Multimedia einzurichten, damit Sie alle Features von JClick optimal n�tzen k�nnen. Die Installation ist einfach und muss nur ein einziges Mal vorgenommen werden.

W�hlen Sie dazu zwischen den folgenden Optionen: "QuickTime for Java" oder "Java Media Framework".

Wir empfehlen Ihnen, die Installationsanleitung sorgf�ltig durchzulesen und Ihren Browser sowie alle Java-Anwendungen nach der Installation neu zu starten.


Java Media Framework


Empfehlungen f�r Windows, Linux und andere Betriebssysteme:

Download Java Media Framework Basic-Applikation f�r Windows:
http://clic.xtec.cat/dist/java/customJMFinstal.exe

Download der Vollversion for Linux (i386), Solaris, Windows und Cross-Platform:
http://java.sun.com/products/java-media/jmf/downloads/index.html

 

QuickTime for Java


Empfehlungen vor Mac OS-X.

QuickTime Player (Freeware) :
http://www.apple.com/quicktime/download

Hinweis: W�hlen Sie beim Installieren die Option "Benutzerdefinierte Installation" aus und klicken Sie dann "QuickTime Java" an. In der Standardinstallation ist dieses Feature nicht enthalten!

 

src/core/edu/xtec/resources/messages/checkmedia_es.html000066400000000000000000000050621335566474600236160ustar00rootroot00000000000000 JClic - Comprobación del sistema multimedia

¡Fue imposible detectar ninguna extensión multimedia en su sistema Java!

JClic puede interpretar archivos de audio en diversos formatos (wav, au, mp3, ogg...), pero necesita una extensión del sistema Java para poder interpretar videos y otros contenidos multimedia, como por ejemplo animaciones Flash.

En estos momentos su ordenador no cuenta con ninguna extensión multimedia Java instalada. Puede continuar así (los archivos multimedia serán ignorados), pero se aconseja instalar alguna para poder disfrutar de todos los contenidos de las actividades JClic. El proceso de instalación es muy sencillo y se realiza una sola vez.

Puede elegir entre dos opciones: "QuickTime for Java" o "Java Media Framework".
En ambos casos lea detalladamente las instruccioens y reinicialice todos los navegadores y aplicaciones Java al finalizar la instalación.

Java Media Framework


Opción recomendada para Linux y otros sistemas operativos.

Una versión básica (2 Mb) de Java Media Framework para Windows se puede descargar desde:
http://clic.xtec.cat/dist/java/customJMFinstal.exe

Las versiones completas para Linux (i386), Solaris, Windows y otros sistemas se pueden descargar desde el web de Sun:
http://java.sun.com/products/java-media/jmf/downloads/index.html

 

QuickTime for Java


Opción recomendada para usuarios de Mac OS-X.

El programa QuickTime Player es gratuito y puede ser descargado desde:
http://www.apple.com/quicktime/download

Importante: Al iniciar el proceso de instalación elija la opción "Personalizada" y asegúrese de seleccionar "QuickTime Java" en la lista de componentes a instalar. En la modalidad "Estándar" se acostumbra a omitir la instalación de este componente.

src/core/edu/xtec/resources/messages/checkmedia_gl.html000066400000000000000000000051331335566474600236100ustar00rootroot00000000000000 JClic - Comprobaci�n do sistema multimedia

¡Non foi posíbel detectar ningunha extensión multimedia no seu sistema Java!

JClic pode interpretar arquivos de audio en diversos formatos (wav, au, mp3, ogg...), pero precisa unha extensión do sistema Java para poder interpretar vídeos e outros contidos multimedia, como por exemplo animacións Flash.

Nestes momentos o seu ordenador non conta con ningunha extensión multimedia Java instalada. Pode continuar así (os arquivos multimedia serán ignorados), pero aconséllase instalar algunha para poder disfrutar de todos os contidos das actividades JClic. O proceso de instalación é moi sinxelo e real�zase só unha vez.

Pode elexir entre dúas opcións: "QuickTime for Java" ou "Java Media Framework".
En ambos os casos lea polo miúdo as instrucións e reinicialice todos os navegadores e aplicacións Java ao rematar a instalación.

Java Media Framework


Opción recomendada para Linux e outros sistemas operativos.

Unha versión básica (2 Mb) de Java Media Framework para Windows pódese descargar desde:
http://clic.xtec.cat/dist/java/customJMFinstal.exe

As versións completas para Linux (i386), Solaris, Windows e outros sistemas pódense descargar desde a web de Sun:
http://java.sun.com/products/java-media/jmf/downloads/index.html

 

QuickTime for Java


Opción recomendada para usuarios de Mac OS-X.

O programa QuickTime Player é gratuíto e pode ser descargado desde:
http://www.apple.com/quicktime/download

Importante: Ao iniciar o proceso de instalación elixa a opción "Personalizada" e asegúrese de seleccionar "QuickTime Java" na lista de compoñentes a instalar. Na modalidade "Estándar" acost�mase a omitir a instalación de este compoñente.

src/core/edu/xtec/resources/messages/checkmedia_pt.html000066400000000000000000000057611335566474600236400ustar00rootroot00000000000000 JClic - Comprobación del sistema multimedia

Não possível detectar alguma extensão multimeios em seu sistema Java!

JClic pode interpretar arquivos de audio em diversos formatos (wav, au, mp3, ogg...), mas necessita uma extensão do sistema Java para poder interpretar videos e outros conteúdos multimeios, como por exemplo animações Flash.

Neste momento seu computador não conta com nenhuma extensão multimeios Java instalada. Pode continuar assim (os arquivos multimeios serão ignorados), mas aconselha-se instalar alguma para poder desfrutar de todos os conteúdos das actividades JClic. O processo de instalação é muito fácil e se faz apenas uma vez.

Pode escolher entre duas opções: "QuickTime for Java" ou "Java Media Framework".
Em ambos os casos leia detalhadamente as instruções e reinicialize todos os navegadores e aplicações Java ao finalizar a instalação.

Java Media Framework


Opção recomendada para Linux e outros sistemas operacionais.

Uma versão básica (2 Mb) de Java Media Framework para Windows pode ser copiada  de:
http://clic.xtec.cat/dist/java/customJMFinstal.exe

As versões completas para Linux (i386), Solaris, Windows e outros sistemas podem ser copiadas do sítio web da Sun:
http://java.sun.com/products/java-media/jmf/downloads/index.html

 

QuickTime for Java


Opção recomendada para usuários de Mac OS-X.

O programa QuickTime Player é gratuito e pode ser copiado de:
http://www.apple.com/quicktime/download

Importante: Ao iniciar o processo de instalação escolha a opção "Personalizada" e assegere-se de seleccionar "QuickTime Java" na lista de componentes a instalar. Geralmente a instalação deste componente é omitida na modalidade "Padrão".

src/core/edu/xtec/resources/messages/checkmedia_pt_BR.html000066400000000000000000000056551335566474600242250ustar00rootroot00000000000000 JClic - Comprobación del sistema multimedia

Não possível detectar alguma extensão multimeios em seu sistema Java!

JClic pode interpretar arquivos de audio em diversos formatos (wav, au, mp3, ogg...), mas necessita uma extensão do sistema Java para poder interpretar videos e outros conteúdos multimeios, como por exemplo animações Flash.

Neste momento seu computador não conta com nenhuma extensão multimeios Java instalada. Pode continuar assim (os arquivos multimeios serão ignorados), mas aconselha-se instalar alguma para poder desfrutar de todos os conteúdos das actividades JClic. O processo de instalação é muito fácil e se faz apenas uma vez.

Pode escolher entre duas opções: "QuickTime for Java" ou "Java Media Framework".
Em ambos os casos leia detalhadamente as instruções e reinicialize todos os navegadores e aplicações Java ao finalizar a instalação.

Java Media Framework


Opção recomendada para Linux e outros sistemas operacionais.

Uma versão básica (2 Mb) de Java Media Framework para Windows pode ser copiada  de:
http://clic.xtec.cat/dist/java/customJMFinstal.exe

As versões completas para Linux (i386), Solaris, Windows e outros sistemas podem ser copiadas do sítio web da Sun:
http://java.sun.com/products/java-media/jmf/downloads/index.html

 

QuickTime for Java


Opção recomendada para usuários de Mac OS-X.

O programa QuickTime Player é gratuito e pode ser copiado de:
http://www.apple.com/quicktime/download

Importante: Ao iniciar o processo de instalação escolha a opção "Personalizada" e assegere-se de seleccionar "QuickTime Java" na lista de componentes a instalar. Geralmente a instalação deste componente é omitida na modalidade "Padrão".

src/core/edu/xtec/resources/messages/checksignature.html000066400000000000000000000021671335566474600240540ustar00rootroot00000000000000 Check signature

The Java engine does not recognize the digital signature of this application!


In order to run this program you must add the entity "clic" to the list of signatures trusted by your Java virtual machine.
 
Windows users can easily add the certificate by downloading and executing this file:
 
http://clic.xtec.cat/dist/java/instJClicCert.exe (65 kb)
 
For other platforms (Solaris, Linux and Mac OS-X), a detailed explanation is available here:
 
http://clic.xtec.cat/en/support/instjava.htm
 
In both cases, please close and restart all browser windows and java applications after the installation of the certificate.
src/core/edu/xtec/resources/messages/checksignature_ca.html000066400000000000000000000023071335566474600245130ustar00rootroot00000000000000 Signatura digital

El motor Java no reconeix la signatura digital d'aquesta aplicaci�!


Per a executar aquest programa cal afegir el certificat de l'entitat "clic" a la llista de signatures reconegudes per la vostra m�quina virtual Java.
 
Els usuaris de windows poden afegir f�cilment aquest certificat descarregant i executant aquest fitxer:
 
http://clic.xtec.cat/dist/java/instJClicCert.exe (65 kb)
 
Per a altres sistemes operatius (Solaris, Linux i Mac OS-X) hi ha una explicaci� detallada dels passos a seguir a:
 
http://clic.xtec.cat/ca/support/instjava.htm
 
En ambd�s casos, reinicialitzeu totes les finestres dels navegadors i les aplicacions java despr�s d'haver instal�lat el certificat.
src/core/edu/xtec/resources/messages/checksignature_de.html000066400000000000000000000023151335566474600245170ustar00rootroot00000000000000 Check signature

Die digitale Signatur dieser Anwendung wird von Java Virtual Machine nicht erkannt!


Um dieses Programm n�tzen zu k�nnen, m�ssen Sie die "clic" in die Liste der von der Java Virtual Machine akzeptierten digitalen Signaturen auf Ihrem Rechner eintragen.

Window User k�nnen das verlangte Zertifikat hinzuf�gen, indem sie folgende Datei downladen und installieren:
 
http://clic.xtec.cat/dist/java/instJClicCert.exe (65 kb)
 
Eine detaillierte Beschreibung f�r andere Betriebssysteme (Solaris, Linux and Mac OS-X), finden Sie hier:
 
http://clic.xtec.cat/en/support/instjava.htm

Bitte schlie�en Sie in beiden F�llen alle Browserfenster und starten Sie nach der Installation des Sicherheitszertifikats Ihren Browser neu.
 

src/core/edu/xtec/resources/messages/checksignature_es.html000066400000000000000000000023401335566474600245340ustar00rootroot00000000000000 Firma digital

�El motor Java no reconoce la firma digital de esta aplicaci�n!


Para que este programa se ejecute correctamente hay que a�adir el certificado de la entidad "clic" a la lista de firmas reconocidas por su m�quina virtual Java.
 
Los usuarios de windows pueden a�adir f�cilmente este certificado descargando y ejecutando el siguiente archivo:
 
http://clic.xtec.cat/dist/java/instJClicCert.exe (65 kb)
 
Para otros sistemas operativos (Solaris, Linux y Mac OS-X) hay una explicaci�n detallada de los pasos a seguir en:
 
http://clic.xtec.cat/es/support/instjava.htm
 
En ambos casos conviene reinicializar todas las ventanas de los navegadores y las aplicaciones Java despu�s de haber instalado el certificado.
src/core/edu/xtec/resources/messages/checksignature_gl.html000066400000000000000000000024511335566474600245320ustar00rootroot00000000000000 Sinatura dixital

�O motor Java non recoñece a sinatura dixital desta aplicación!


Para que este programa se execute correctamente hai que engadir o certificado da entidade "clic" á lista de sinaturas recoñecidas pola súa máquina virtual Java.
 
Os usuarios de windows poden engadir facilmente este certificado descargando e executando o seguinte arquivo:
 
http://clic.xtec.cat/dist/java/instJClicCert.exe (65 kb)
 
Para outros sistemas operativos (Solaris, Linux e Mac OS-X) hai unha explicación polo miúdo dos pasos a seguir en:
 
http://clic.xtec.cat/es/support/instjava.htm
 
En ambos os casos convén reinicializar todas as xanelas dos navegadores e as aplicacións Java despois de ter instalado o certificado.

 

src/core/edu/xtec/resources/messages/checksignature_pt.html000066400000000000000000000027261335566474600245600ustar00rootroot00000000000000 Firma digital

O motor Java não reconhece a assinatura digital desta aplicação!


Para que este programa se execute correctamente é necessário adicionar o certificado da entidade "clic" à lista de assinaturas reconhecidas por sua máquina virtual Java.
 
Os usuários do Windows podem fazê-lo facilmente ao copiar (download) e executar o arquivo do  certificado que está no endereço abaixo:
 
http://clic.xtec.cat/dist/java/instJClicCert.exe (65 kb)
 
Para outros sistemas operacionais (Solaris, Linux e Mac OS-X) leia explicações detalhadas dos passos a seguir em:
 
http://clic.xtec.cat/es/support/instjava.htm
 
Em ambos casos convém reinicializar todas as janelas dos navegadores e as aplicações Java depois de instalar o certificado.
src/core/edu/xtec/resources/messages/checksignature_pt_BR.html000066400000000000000000000027261335566474600251430ustar00rootroot00000000000000 Firma digital

O motor Java não reconhece a assinatura digital desta aplicação!


Para que este programa se execute correctamente é necessário adicionar o certificado da entidade "clic" à lista de assinaturas reconhecidas por sua máquina virtual Java.
 
Os usuários do Windows podem fazê-lo facilmente ao copiar (download) e executar o arquivo do  certificado que está no endereço abaixo:
 
http://clic.xtec.cat/dist/java/instJClicCert.exe (65 kb)
 
Para outros sistemas operacionais (Solaris, Linux e Mac OS-X) leia explicações detalhadas dos passos a seguir em:
 
http://clic.xtec.cat/es/support/instjava.htm
 
Em ambos casos convém reinicializar todas as janelas dos navegadores e as aplicações Java depois de instalar o certificado.
src/core/edu/xtec/resources/shapers/000077500000000000000000000000001335566474600200175ustar00rootroot00000000000000src/core/edu/xtec/resources/shapers/listshapers.properties000066400000000000000000000012101335566474600244700ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangular|Standard rectangular shaper @JigSaw=Jigsaw with rectangular unions @TriangularJigSaw=Jigsaw with triangular unions @ClassicJigSaw=Jigsaw with curved unions @Holes=Cuts src/core/edu/xtec/resources/shapers/listshapers_ar.properties000066400000000000000000000012101335566474600251520ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangular|Standard rectangular shaper @JigSaw=Jigsaw with rectangular unions @TriangularJigSaw=Jigsaw with triangular unions @ClassicJigSaw=Jigsaw with curved unions @Holes=Cuts src/core/edu/xtec/resources/shapers/listshapers_ast.properties000066400000000000000000000012321335566474600253430ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangular|Recortador rectangular est\u00E1ndar. @JigSaw=Encaxes con xuntura rectangular @TriangularJigSaw=Encaxes con xuntura triangular @ClassicJigSaw=Encaxes con xuntura ovalada @Holes=Recortes src/core/edu/xtec/resources/shapers/listshapers_ca.properties000066400000000000000000000012431335566474600251410ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangular|Retallador rectangular est\u00E0ndard. @JigSaw=Encaixos amb uni\u00F3 rectangular @TriangularJigSaw=Encaixos amb uni\u00F3 triangular @ClassicJigSaw=Encaixos amb uni\u00F3 ovalada @Holes=Retalls src/core/edu/xtec/resources/shapers/listshapers_cs.properties000066400000000000000000000013701335566474600251640ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Pravo\u00FAhl\u00FD|Standardn\u00ED pravo\u00FAhl\u00FD tvar @JigSaw=Skl\u00E1da\u010Dka s pravo\u00FAhl\u00FDmi d\u00EDly @TriangularJigSaw=Skl\u00E1da\u010Dka s troj\u00FAheln\u00EDkov\u00FDmi d\u00EDly @ClassicJigSaw=Skl\u00E1da\u010Dka se zak\u0159iven\u00FDmi d\u00EDly @Holes=\u0158ezy src/core/edu/xtec/resources/shapers/listshapers_de.properties000066400000000000000000000012571335566474600251530ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangular|Rechteckige Standardformen @JigSaw=Puzzle mit rechteckigen Verbindungsteilen @TriangularJigSaw=Puzzle mit dreieckigen Verbindungsteilen @ClassicJigSaw=Puzzle mit runden Verbindungsteilen @Holes=Einkerbungen src/core/edu/xtec/resources/shapers/listshapers_el.properties000066400000000000000000000022211335566474600251530ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=\u039F\u03C1\u03B8\u03BF\u03B3\u03CE\u03BD\u03B9\u03BF|\u03A4\u03C5\u03C0\u03B9\u03BA\u03CC\u03C2 \u03C3\u03C7\u03B5\u03B4\u03B9\u03B1\u03C3\u03C4\u03AE\u03C2 \u03BF\u03C1\u03B8\u03BF\u03B3\u03C9\u03BD\u03AF\u03BF\u03C5 @JigSaw=\u03A0\u03B1\u03B6\u03BB \u03BC\u03B5 \u03BF\u03C1\u03B8\u03BF\u03B3\u03CE\u03BD\u03B9\u03B5\u03C2 \u03B5\u03BD\u03CE\u03C3\u03B5\u03B9\u03C2 @TriangularJigSaw=\u03A0\u03B1\u03B6\u03BB \u03BC\u03B5 \u03C4\u03C1\u03AF\u03B3\u03C9\u03BD\u03B5\u03C2 \u03B5\u03BD\u03CE\u03C3\u03B5\u03B9\u03C2 @ClassicJigSaw=\u03A0\u03B1\u03B6\u03BB \u03BC\u03B5 \u03BA\u03B1\u03BC\u03C0\u03CD\u03BB\u03B5\u03C2 \u03B5\u03BD\u03CE\u03C3\u03B5\u03B9\u03C2 @Holes=\u03A4\u03BF\u03BC\u03AD\u03C2 src/core/edu/xtec/resources/shapers/listshapers_es.properties000066400000000000000000000012431335566474600251650ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangular|Recortador rectangular est\u00E1ndar. @JigSaw=Encajes con uni\u00F3n rectangular @TriangularJigSaw=Encajes con uni\u00F3n triangular @ClassicJigSaw=Encajes con uni\u00F3n ovalada @Holes=Recortes src/core/edu/xtec/resources/shapers/listshapers_eu.properties000066400000000000000000000012471335566474600251730ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Laukizuzena|Piezak laukizuzen estandarrak @JigSaw=Puzzle-piezak laukizuzenen bidez lotuak @TriangularJigSaw=Puzzle-piezak hirukien bidez lotuak @ClassicJigSaw=Puzzle-piezak kurba bidez lotuak @Holes=Errekorteak src/core/edu/xtec/resources/shapers/listshapers_fr.properties000066400000000000000000000012751335566474600251720ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangulaire|Pieces rectangulaires classiques @JigSaw=Puzzle \u00E0 jonctions rectangulaires @TriangularJigSaw=Puzzle \u00E0 jonctions triangulaires @ClassicJigSaw=Puzzle \u00E0 jonctions arrondies @Holes=Formes personnalis\u00E9es src/core/edu/xtec/resources/shapers/listshapers_gl.properties000066400000000000000000000012461335566474600251630ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangular|Recortador est\u00E1ndar rectangular @JigSaw=Encaixes con uni\u00F3n rectangular @TriangularJigSaw=Encaixes con uni\u00F3n triangular @ClassicJigSaw=Encaixes con uni\u00F3n ovalada @Holes=Retrincos src/core/edu/xtec/resources/shapers/listshapers_it.properties000066400000000000000000000012141335566474600251700ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rettangolare|Pezzi rettangolari standard @JigSaw=Puzzle con unioni rettangolari @TriangularJigSaw=Puzzle con unioni triangolari @ClassicJigSaw=Puzzle con unioni a curva @Holes=Ritagli src/core/edu/xtec/resources/shapers/listshapers_nl.properties000066400000000000000000000012241335566474600251660ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rechthoekige|Standaard rechthoekige vorm @JigSaw=Puzzel met rechthoekige gebieden @TriangularJigSaw=Puzzel met driehoekige gebieden @ClassicJigSaw=Puzzel met gebogen gebieden @Holes=Openingen src/core/edu/xtec/resources/shapers/listshapers_pt.properties000066400000000000000000000012321335566474600251770ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Rectangular|Encaixe rectangular @JigSaw=Encaixes (conex\u00F5es) rectangulares @TriangularJigSaw=Encaixes (conex\u00F5es) triangulares @ClassicJigSaw=Encaixes (conex\u00F5es) curvos @Holes=Recortes src/core/edu/xtec/resources/shapers/listshapers_pt_BR.properties000066400000000000000000000013051335566474600255630ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Retangular|Formatador retangular padr\u00E3o @JigSaw=Quebra-cabe\u00E7as com uni\u00F5es retangulares @TriangularJigSaw=Quebra-cabe\u00E7as com uni\u00F5es triangulares @ClassicJigSaw=Quebra-cabe\u00E7as com uni\u00F5es curvas @Holes=Cortes src/core/edu/xtec/resources/shapers/listshapers_ru.properties000066400000000000000000000025651335566474600252140ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=\u041F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u044B\u0439|\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u0442\u0435\u043B\u044C @JigSaw=\u041F\u0438\u043B\u0430 \u0441 \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u044B\u043C\u0438 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\u043C\u0438 @TriangularJigSaw=\u041F\u0438\u043B\u0430 \u0441 \u0442\u0440\u0435\u0443\u0433\u043E\u043B\u044C\u043D\u044B\u043C\u0438 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\u043C\u0438 @ClassicJigSaw=\u041F\u0438\u043B\u0430 \u0441 \u0438\u0437\u043E\u0433\u043D\u0443\u0442\u044B\u043C\u0438 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\u043C\u0438 @Holes=\u0420\u0430\u0437\u0440\u0435\u0437\u044B src/core/edu/xtec/resources/shapers/listshapers_vec.properties000066400000000000000000000012161335566474600253330ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=Retango\u019Aar|Forma retango\u019Aar standard @JigSaw=Dente de sega retango\u019Aar @TriangularJigSaw=Dente de sega triango\u019Aar @ClassicJigSaw=Dente de sega ondix\u00E0 @Holes=Taji src/core/edu/xtec/resources/shapers/listshapers_zh_TW.properties000066400000000000000000000012541335566474600256130ustar00rootroot00000000000000# List of currently registered types of shapers for JClic activities. # All JClic shapers must extend edu.xtec.jclic.shapers.Shaper # and must be accessibles to the JVM classloader. # List format: # full_class_name_including_package=shaper_name[|shaper_description] # The symbol "@" can be used in place of the standard package name: "edu.xtec.jclic.shapers." # Example: # com.acme.jclic.TestShaper=Acme test shaper|This shaper is just a test... @Rectangular=\u77E9\u5F62|\u6A19\u6E96\u77E9\u5F62\u6210\u578B\u5668 @JigSaw=\u77E9\u5F62\u7684\u62FC\u5716 @TriangularJigSaw=\u4E09\u89D2\u5F62\u7684\u62FC\u5716 @ClassicJigSaw=\u66F2\u7DDA\u7684\u62FC\u5716 @Holes=\u5207\u7247 src/core/edu/xtec/resources/skins/000077500000000000000000000000001335566474600175015ustar00rootroot00000000000000src/core/edu/xtec/resources/skins/blue.png000066400000000000000000000602631335566474600211450ustar00rootroot00000000000000PNG  IHDRr,Q¯,tEXtCreation Timelun 12 mar 2001 10:01:12 +0100$tIME y pHYs  ~gAMA a` IDATxypU~_s$[bcp)RK(IH% PTnڭTmaf7VQ$dkc0!0ج .:FH{ahMon ѵU/o=3oLNm0N\}߿^dtyeIU(Hhl!LFRif"_;EۉEӃ~;, j(5t -"'Bd7Ff@jhU>/Z_Kn+#)XLm OZM=HfJuƲ [R5B={o5ch3zKDNT:2MR>1$FF+*T+3ƭQ#Z+;حd2'bE&0Ľ))$MgZĎX.4 9Պ+\&h!9džXv+"&5SX7Ao?G"Mw9]t8;/eU"3F󓪇r5"gפʃ^E&DNP4a(LBc4~ GNػ^%WXqBPlxnMPfBX"PJelivNLfʰym—˟h0d(du*bOD>C+m *XQ2_E.e+1b+Z R*b C+3 >C+3 >C+3 >Cp 1R[)E<ҿR+ZMtnJeQfO+HLid)}fZ`$¶U^ W4.b%DZ(x&^V jv%&EN]Q1.Pt\ )cB>׽FCň@ U⓻8nϔX5H\N- :AΨ*KyŦbwTʮPU'-HeROdи+iU K(ZH둒lFȜr#*383EjV%"+M!Dv'QΏS.UL) N=M++\*"MU$QYQU]GbdF+Yg*e'C$(XQ!Q-j}BQk3a !Y!=mvqL({.c؁Q/ݧbE6QՊf4vK:'[b A#&OI_v+QJn\ 1@~SkIR gp` tjQY]":A_bLڋM"bt9p[w4%Zg+= !!V`j<c+0Cr1934S(,l RJ6 lT!9<ʟUoN|YW0[ɊAo9csӆ~du]؊V*"ov.xűX ebVqKxg83n:?.!+Vce|'(d2 ׹%>b'UXi2'Ju;\p?1F#K=8n+u5Un$E09 ?!>E bW+?vdۤO ]Vt&yI"=S=,a* QgtZtعlPC]Ӽ!ѪTFyJřiZ(o?g"S+*J8_nv[2VhAsb%Rml!bAOYК!W905Xw\oQf蠕E9dE#)͏p54̋kcŊO|'A7sVg;A 񘞊ȀdI\M'Xxs[~CsL15QR\)K.}B/{{́(,V42u5hc}JW hb_G{םZޟ1WѮH|]MǶS7.fEc_CUvTӔܦ{Eы=m}?]w6Zy"VKdʾ}{x",2ʒW߫ |mYڹ9b e,#]˫][;jF >;C_t|_Ȧ#Mh=u/› Lzᅿ^>_X³yf {<V]%blޭhro=VDAxc]5ՆBvqƿG38r?}ឍq#"nWh Ⱥo]U]eδi~m5ohٶ;Y&SjkkEM曳OYƊ>L׽KjTYQǷ|X=- /w?睝3dEӵ;m[=pzh9bveӪܽRu̟oݲ3S -*rDɾ}sΑΜ9zp/4XYxʅmdTђڷ~rA;Ȕ /|Δk_ϚR);fvg!Y}oAMh-P﹵8p饗رWwӦ䭭{zw^};\ޱDsO'W73xo7vx~psss4%^y{]~ {l_(9r;kתTS ou9}{KοXQ^on|!B#:W>^\KoOkF۽)+Sgrȑ#vP.>]VQyԐbܾ[>$cf:m|a=_zi~{{9kuukяn޽_@5#cdrdbT<+;:/Ȕ-[xO%VxSW +x<_8u;xbݒ%QM˫zj[o2vejE'e򾝧TGǐpZoƦr;Wue_r!LseիsMEGBQ :Й%h `P W&ŞYC+1 jee3Ə wi .֝;k6o-0!Aᇓתr jըm*w]]{:lUc25gFNuEoz #`(M0<۷>3v+ pŊU<9lFbۻ݅@;m[.V`Vܒ\]О|Xtt/.{EmV=;;m̘q;!##s…)f'լ!'B{hfl  j ob1!oGRϕ+cc^ $m.?Ȱhqw7./[ٿ)!T*vO6jIUOp߬'0-rWqՎ!@Զ9À#zH;׹"SmESO7U:.' ߯Ϸ]?v/ݓcaV'PvMpUQ7[׾ZT5;kݶ[ieB$F.TN[.׆.鷩xpU_?;{Wj^B,(.Z+-.) M Ǘ8zG3OgrpZ}oKNJ^kȫpnEDs~F;]rSR He>\*;UۆH[,}k|)h(Wc=TN 1 MنaU> AVD:2F#.j_!<\aDb{wu~4?m\z_Jh%7+Wr&ܟvcgֿӧļzdz2X.TR@h! &F8ntW?| rc]+1pݳYޛI4FLaOZN^ernP 8oA}D}'dD7ϩ*4+|DϷe,tՑ={c=W-j] F0IBcӨ N!~rL=kJe@XOB~ߕQl PqQ?*ŧ3G>\ PyriZ~ft߽r~\οF nYU''dU_%GZ, /G@2?jiђ,Z>zw4>X71]扌5;=GO4B@Ce4)T&[/)?|wAJ_0CXa @>g%xD-^>~H,nHҶ Zp*%)Wsiyt}/xDY&,ۻ>.""~@)terj@Ԡ;DCslUk\)VN03*!IrFs fmZ&#ڻ?^?kFdhQ,G7@tar- ׳괓tٜX27)U/tb7~ dU ?:$##J3@{\YeS\!&YҌtpAxZ5py) >ƿ_q֔4XnSmۖdYZkL*Fؽ{7;y_!mr8]V[?^vM!7UO`}-p$ >AӼMӮ9oq\@ʾRIuFvAnw:Ot_N޲eʕ+Ŕ4ݴi藋BhyJ7 o/)剶LhIؑYp&l~H6dDZ raqr懍˿6dz[ܛˢI8a44Cǜs>h\0#FUTT(OX,\7 - ' {v5X={tɑe:eu$†u%B6xQG$3i*S=Y쳡*;zVAą;"KZ $:1ZWf9ؚ[m=P\0hB^f@vX@I򴗆*SqB[Q5SC9#SK;5:,uKbG\LQ4HZ-PBF5:uMPsc+/tUUUh;VPLI܃2P?t̂^"A=Uu&ZO/Ž鹽!@Pse;Qn~ orxP 9U=|9,1 \^?2"'6Qr Z[ܛFi'B m ڀrY Y|ZoQ¦`fÊj7aO|dsr)`ʜ";xJF٤PRCĝ$(.);*wD\閦拙TC R!FbJO*tUv1wdlc+5v\R~L6e.Wdf)23g6H5N)A"0)3rM ,1(FQqƎۂE[i]!T̪:sP P;Pwvv@ج{͛^ﷃoSq4,,]M77IcQqnt;8$Lfa]c~ŠI .6wPLqiDRF{,v@ np8vH[<-ٷ77E+M&jCnsv?uHc( MX ' gU pn@vhX3;Mg!' mG+;M.Y]w( @FdĂV"^% GIݟS # q):زh}FfާK>5A濔=Plũӓ*"\$ 1Xmo-h 8 uҺٺeۮ%$anC.ͲU1ŝ_|6i(-jc۫kw8I\7aORQC"o,?wf;Sn<3R 3?Z+4rQ]n&AI_o4j<A.~N'J!1,A(n bJaaaoDn|)p{@^?Pc,WuOPځ$$ɽwKN5Nc&muǺy?Xlz!o3,WjzGT`\TF[%g] fZ q\h4Y*Mu}NHN$ „# ȩ:xT~0,3Ȏή30x;Ȏ(M@r 4H;UU#t,W{}飯iTY) = .v72oZ0K :w+U,|wQ{͆!slCJ5(ۧ{jxܸ9Gz;^PUDͥI;֚à7ÿoxvLԷ?nܺķ~gsmӪ}?uރLM&qT¹ۧ02hV'س Ė Ά8 ?F[& M3Z-%铘=3)e2䤃s-{sw,x\)}O.Bud6%/Y R.>:%Og/ZRD‡si2Ė>TJ5(۞<e+cg. Y&k$SXaᓛjq 9pS!ȿ"~rZ$#s#QF.urkƧZ:DZ5E{|]4ᯱH!.XdPo| : 0ϻlSzsAb?YZ3+PҶPFgw7A `AJK b*Q+yl ;]n vdYӥ*s;+,^շ8?8dY{ǖ;d0?[U JK j$@7VJs1KGGg`-0'<v{ޗi:\2u2G,y+k;ym E϶4PJFFRy,Oeݦz;[lrouc ,̛@s Mx8׆#mJj~c@cOHFpCgͻ'+9GM[Q S &l{I{4ܠT?nt=U<)jTOrv_1+h|onRs;=1ªy_,Lk?ٖʕH[_IgL`3{Zn䀿:+tCF2zq[2} HH9 i@_5"VpQiH4` =&H\'}?WU-VNKcslkoEGW9 Vq<-(Nuq7U]ӽ2uj.hM 3â]R[' @#IT? Y`vy.&YAQLJԏphnj:f(<2As! N1<zܝ<:'qD酏B TT<<7J*}rɰ {.]r SHAeTw_8G q!K/0X@1>oID8I&xr U%Hs#pFdz*$ dꫩoH-R}/ ` Ml44\BQnsF_rkdfJ7zŰH!VAb5>CG=;D^z%'TAjznWut\쮔Gs< $ :ԫa'_r<{GYwbDEDž8$ Y pgҳ1npA.jmo碁SE;cy~цU9!JL`>E{j02cie(I==٥NcI FqrmE K?{`T/H ˠ}MlzH7g9&Dvq%WV}Y{ԭ0%+,S8-oj n0HKoCQ*HA͜77>@Ê+.?+w'M&}ڹMhЉ^}r 6@:ϞظF$k6iȳ 즌Kz 19I&Q# m,N6吢 Lqt{}s,Un8w>ڦLjM Y4ʲdE\%O(Ք+w+} k=[ R sPK;ѫsCec0dz~YYWopo.IPPK'ޭsBѣ\AOU6Jj="*'{$Sd׭\ @D50Cpu{r#Q'IIV,.QpjTDb^\Z;UuhBn KϽdrԚ D]RSס8蛚| kjmμ 언atBA+8_ԕ!؎m6ɦ?m3C$Xb׷D~ ?DZ[N T$p s;,vranpk.$:Opv$'Ul|ӯV |925atWSݱbY ]:SX"Z߻ 0l_Y,Bh<@Ԩefͪ> lUtt09'Q"c ^} rp[~16q;p>Q»v%,W~77B2s5B;˶ .ҏ~,AD5VsI 0c/vyC-F:XY*Bb.+wpc!;Qrcg6l9tsyʟ4Œ$0\ΈЙ^=E#^XZuEq7\ "رH\xwSt1GSϏ7M$ʭ~ +?t־ajMMτ_נ8оtWO3~xZS׶OUiYǘDԉ8-NM'a{Eo[x N̍ㄱo˃NQ^ ÏŎ;4l^;o^y[Oذf}e;1⥷kVWd%ǃKߊ-IYlzϊl';یTt9\^őd}!˘ @թrDq+ͧa +EmҞdǎG1 _ykzp/yѻSԂ}ĜRMJO$,*Ε3HȘ`Qr5Uuܤz?>"\RhS%V[| ϛ],i&s wMiӨ Bc}Yyr:U'./PdXu[fIZqi4v驌}z}\50dyԶ?R}j< Y `fԫ<܄K & (\1nׯw='WF/Ï58ۻHǹV38_yL8o#WKT"6Wy:XjtݬbMA9<ĈKFC훞{Ïy@DF }eh4ǖ?D/U]/l>s&}rM5.Ke5i ~ nR6}?Os8]zmM~{^<=w1IH*8JJ3 T[ ̜zT"f38I➅z-qItt"-U3J.7 sPhQcu#~lY^?3v\*7.Syً;s[DԟmqЗe+T׳\L J SXt@'7}ֈ/*@uc>SB܈*D2MtNf 0ɼUs笔O>PskI<;^uŇez| @ͫe#c\|ӏy?qG]X8 aQ2.7FyBޝww[U]NthNR]__ު?4)ΖjWjfv4ӏ [wk3۾yZ:>ťxO?<&닓0 oZ }Hq[DcO^W7 kCR. XdHhBciO?̧Z~E;/ʿ~ɧ+NpBo"i](JOe_9jQswV&x#M:vrZ suӿϿͧmƒtacqnoV90u(h$M*ף.~o_Àܦ7*NB.dcN,jZ @Vj-WзM? }Y!{˯I[O͍YFbV<+ipZ|:BzV *~/Ss?])31n׺m3LꚆ1h$ܑU_Sr[ҏ(vEtшlSR}ݜ0sr5+PjDut{O?u?;\n>lc~"} z'CwH?O8icP92Z,B/OG(OUo:G{ǖN久qơuޘ(׏A% *. N=sGc(d;3΂ &F5لg40 veY+s4Юt}l$׉r;xPq +ܻ0?SYQ*3 ɱZδW1KK<#ra$"hJ~,J3hY;_|8FL?ff0WF`"F ~-]YLIG0[tONsyz}Dzyt#rGU98{8r*qd$nuY}UG|E_NvG{xHZm]wXbiA[+LKl)Ae+k".(J9khFŵ ~a(M'ؐs#eҧVes\G^a71Uބ($˲7i(G'}=sӵxYa.NK4Io2KÊǤ)qb4dkU6"6RWt*(6C.bqx\=?t+F?+4,I3Q c[lL,߀[H‚IZN%_x}hÜ77!w_?>Xl\* BR[1Y  2VrqRRT2 X+,Ƒ Xʄ VZW0H$QѪfn {\UOi-є:`MKOa],A]\<Ɋpq.c|x?־"8ȫOVkEp?ŭB6?լƍݬYI,JX3qPǦdLi曨 W>rD 9!<1q{ rt>Т-Ri͊h5[O fd1gdR/@{&䒫-x||&tmDjos\JV/;tCh{vAG$WeL ܊aE 0Mede4 q[t=k s5A$|+| F[QTVc2'mb[yUp }(1#lRՄ$8o܉UǙ;N2ưj'ޙp%> Y1Z6a 47)AiHYkG +FoEe8˾[lX!TKL dozB(RRtO 8d[e֨V: cr,|Nl-ih(RwhuQ-t|14"HǵH %iΕ5R^P)LuC!BV(b"ꇓoXߺ͝\,*KӯͿ=CL9u%Dp%C7,TǀfLI I(e7_nŰۇUw:omy~ i&1f`FjCNlBޣ hUԙ3gЉ`d raEF F ڄ=rH]]^'"))i٥ p s6bJ98і ɍqi+=pK %%%MCm?aQ]yQ]dIaNGwUߐs@pd`h $ 7RQV|St}1ߥB0_G9Ҽ{nN~g͚鲓#| CD #L:{>u [^ްk׮ׯ3 òlMM M)Y ܻ;㡇x҂|_|E?<9-(B>|[SR];ĉk-T%%8.q,gV(PٗBC#J:LtB.pq+!GX6G޲!8%gRj ^h;x 6n,hlӟ>1cOO?4%eFRfY$J0$Rh:O>7ӷnݺtҎٳHMPp+Z[[|ybZH &Orfg'J%!"[Iyyqnn 6ZTTFjƸhyiu}F;MP­C+Bu:Ҟ)0.RdXZZ[^8,\4o69f%wrmm-?II;wAY֭?;}Kr}577C_ە+WpD1f⹺.+z3l?7>ȯyfۃwkcZC]-U}GQهGSٕcϰBb٬>W#=qJeeebb]% L*x#{E:{Bx,[(X@]!/"HRtXP/^p:ł$K)… O<Z|9cµmw;x|^x>;w Т-ѻ9|nl}jW} v&q1LO玨Q wx>s!G톦i|rbYXGEEE,8{,K&jR:Y};JoG⎘f[bŪU)IP̟+ j-l29ȅ;wDlI@c n}q7HRL`v& "IԔn ǻ:WJKKJhbӓk o.]\y5׿Z퍞*m~T4ʘ[ ǫ, j@3(IC@yG{+O<ݥƼi{s=*:fVw'P%IKmN2L+W\zIJwع;5Ǚ`B& +޽{p}vy8pGjnYҬ,BB N\YYn(_6)^{Xy'q{j\؈[pu7V@w= wd}͇n+*83(EA q="hDX,m$qa9,9c meM@n\ϵS!q @ ;:~G_aʼnFq4 hv$ """SX/tphßͳkrCph5)ం BQM-r)0&x̌wG#{AH bx ;x7gf2ô8~͖ɒ oX6f!N!%0!/SL֧ftI:J L RpY 6Klc`-{$KƺB~3;w{t/y y Dtcd"Zx^4E\n^XrupD˨7n$+W5鬡q Ni+XH bSP%uf|>>>D?^1c %2nG!Z_,-iA1=Ne)քcz7ctmzi6x$o0- RREеp Jշ7 ɇ҆!uNc4Ǐ-LDWnjYdcܟ޺2C=VZuY);vD#۷o֭!^.pJ6Py1 X\5YMCCRɋTfDOYמ)tN>NM]Uz6ۻvIKX&Jx<ڋG}\SB ap/6vd1nˣh~#ˈ+%+.UBzМ۝.< t_W]?v gҼ5^⼟QYSO75LͰ"RloeF2eoĔMR_*׆ϗ<xCpVe4[5=)@wf*TJI4grgb\Ng%1\٠Dt?iO9E6./{ l]l(E [N ZBiRtq՟Kn Nd(q9Lo.$bAR@j@|tbᐐx,ݙJnEzAذgiCY^d{ JOtr9%iVFJ`( EӜ“7w3[tYRVQi%ݩ%BgS;3+ t :3uQ^j>& z+ t :aNW~#tQuT VćID{h78`t(eoUO+hŠ%=~ZWD޶_ Y8$$ .VD(9Y".99.Ollg;1o"&10i`j)[ѰhlζMB $p|`ʷ7eddigN߲#&h=w7Ou@ +B'rwt%k'YEW1Ň$ [O9> 0y|ugEEܹU #޻w[o,4t3y;:ꫬr5q7qs: Ê۰v0͞) #JpmnDnkփ[h~0 Y/Z4?uhMMәk6x^d2kR\>W79{G}=u7o:7 ԰[y,&zm /V$_ܦtu_ad2'w#I[Q Z~ozG1-ՙE+3&vq!sbϲ5qkP)xX$ s0Řt;Eӈ+C%`Md:St(YeB!I#Gq)s1bM^P.JE/t5;F5 ӋO5^VL 3V+ 1̭'[@g 3V+ tS,aIENDB`src/core/edu/xtec/resources/skins/blue.xml000066400000000000000000000070251335566474600211560ustar00rootroot00000000000000 src/core/edu/xtec/resources/skins/default.png000066400000000000000000000252421335566474600216400ustar00rootroot00000000000000PNG  IHDRr ,tEXtCreation Timelun 12 mar 2001 10:01:12 +0100$tIME , pHYs  ~gAMA a)IDATx \Tվ0~9=|/dzӚ A~מ=v t9Y&oKCRj+@b(Ce I*wc)ڦ`H<&v#1kbRRR\uR/w|2!V2%+Yp޹cX V F(pl(Ce !V2 PX+@b(Ce !V2 PX+@b(Ce !V2 PX+@b(Ce !V2 P&`En,ޟx8+;Qأ"fK$*aZMuuV߫~)oB`;z͔% "fˊ|u+r5m Df@lbeu0 RY6rrc7h8NlCR l:'_@F<(RL&c7ޫZ)O_j}<$ɢhIp,$2y>hZ Fnl{䞤"@jZ| AVljvy{:bԸh8'ȵ)4$ɘQ#h8ш#'j-*- n:<| i,|y>yxQuڟI~`idx6F<ֺHhVۍ(; O=6Rӯ:X O;qf'͚ÅhڨSg0ZOS؋cϛII{!xf?Z65m5b7:Vprj])ZVï%+kkU1 p a)RɍmZIP̚&XΌS\T_KdS&]]*Pv}GppQhߍ,A@Gd2$8VV*kIc{&RnOhV:m$%_ 3r:ggRӯϾnIhVӣ7 "rQ#^_T*x okKL, PXZ'AҪ(eڎ֯5V+Z}٭cAF!['sm\qI)cԅl w֋"a3hRu R[@BUwfhE*Feb8*$p@܅$F㏙X `cZl_~fj (K!VYk{w/0^Z3M1&ALٵ+oSœ8}+ bE{X6Sjjj^d#k( _Y`2~#i?$'A+E99MT!uI3'Q*^{Y~U5JRj U=_2t'AaOjFoSc ѫ5dΛ=74.VWm=va߇0e[G+ʿ&v-X)(tayp7zy6Κy;j~{#.6k_Xߘڒҡ_5ϝfoe$0wR=kW 2eMQ\@2%ݲ##;}\??|_&Ȯ]i^3eҥWܮ]{YoG(ƽ'ȘIPr'=_R؁f>؞0r}GgĻS.[d xNɮITv_MSQsF埦X(#$Sr>eV8%nn30:kVkw'Z] љ ݸY?-,t-W2)W[G AqFc_ 3(Nv~N_ R]__#+L' k{v7>}Pџ|.ݽ$yX*" cwC{a-9r%7{*aB'dg %K\,2G<2ބTx7;mx'}ɨ28W @7V ]H7>3oe!Э:WZI1'_5jMV 9xK˪U>_K+V|2.,,Koќ*D[!;> WobҬAvsY7ƻ.uoMnZqw~JۀzEbb Sl}||SA#,V 6ٵ Zr_sG=ȴdʛV),ҥq ſpIWgxf7VWt/;ζ{$i~!Fךدr&aggti,lǧ%ǟъJNCﬨ|,N"I|4ǁQ/z2]bC^"]"KUxyڵV!/S;v+=Hj8QuӮIqFzҐDzɒ}eFJs_E~|Κ!KH̵aV HHnjAýP S~t.́OBn`{E%>>i΀~]2N8(i)'371ysσrnXϱFR={3$uS 3ՑMNһIY>8x{5#$eڠ~LŽYI#2k*Pv)(0 2bz`?b%8XXujPKyG)6iugjs.g]Ej8v"U+ A߆}b^]d?eZG2  }GU v78`za-d!?[?r6S͉ܲ4M#B?>UXH$QKsr]$32|\DgҡaG+I"BEGOHGļIs3|ݍ3٩w^kzT}AN2Yf9eP<~[&_ׁ|4Fu,y4޸쨺IEn?Qo3o7C%T_LF:6ܮ7Vݴ_b$iW1d2.s|{[1|Q~ q ɔ>w[ ltOzW{!5%SX$S~Qgd#34:>bۛaz[ɔ(N͛*7rv+2=AzWGlXȸ{54z-s^{)yH _:%p*N>CZL/ vw(hlljK^6L26(H$S:Y".:) K^Ζ_- TV9hRA.vLmuّ?֌Iܹsl"KBAܺ5Sӽ}EΚ& cзg,oK?c_6/A'}Lve:wъӄBb.+eIֹ]_P9iԽ.lk_V #tNO W]-g1 2t=U}۶=1=kDd֭-pR>Zyuy4{:MF//OuplC˗n4\ɉ'æ pwz^]D-ҿ0Bll,,>Zz12i\Nh4Fup6~}݂L!w&PQ\^iEd'Jf{ 15yٷD$qyƙ9dbO2dFDqW# HA@VQ[iy_QL4Hw8U]{[0l[} ;"-ccJY.^ʒP\,j_|5B%@AI>*}`; ~j>ʕzcVOFv@Y֯_ъϸ |yj̝"eZrׯ3BA67d#t 1Zu?[OYV΄1/YŲ&||3P $āk?5'2gZd;&3hM>oiWMدi MO'G_:p}'" ,G5vVvy9<'>`0ؗ0n}+,a71Gumרge3b=ZTµݚ_wIq/6J*Xֶ͢}**)TFGMYt/1fъ3[dĢWk?}+W7r BjJlM!c=ߎqhM,kɗ]~yj _:1CGYdWЯ1q)+}q Дnڒw4vui+.ƳX"{fMG[^}4EJں{)O[4Z" ,icZUYEkY}g2ta,P`}.8|$lQTyꉇ#i:Qin淗:(a~qMJYdCBM8$dz(v|%QψvԿO1-a_3X4.1PASRU]ϊ5bsua]N1Ý+C޸ؘ=H0ImK/r/z/{Rh+7&OXۧ-Z-3ݽ{:U0k&O/^JGs{th96Ae4^3d?meTZdoӵ/3 qk>¿IوPU]UQJ9v> ^zȆe59XdW-rGؒEx5/|jQy"2K,kj]-1pt((e?vD7j}]LU2\NB٣b1A!"q^"6E6ĠE @lgF(nwlلZd#4deEv-&ETmԳOFz:["۝r?Z"Xd;E92t8XdO]/Be+QS~X"{H!1Or=Y?EuUCLf{!PzE5ȶSlhWU^ʋ#0{CÇay"4 |5<" CASQAopҫ?Y?.Of\[{BAcg}w&@Rvtlgw?KZ#)-W,wňTSn.Q,}kZd;EL󀃇ƇB4ٖ^VD[doy‚D$FqM"I>rdTEAl@l.]$/"q." ?i]@LSNzmc${6Z|pajMkĈlYd3&F{:W5A/[A8eg3qAn+᷷jJ% RL&c:]- ^]l0tA3gtss!Mծ6utt477744Dp{tJmAAt'MHHIIaPVVv ~pX,r9O*Րa\RwibNa_~NNNvͥ`ɽZM#3_|",-TLk{or z@S:;-n9*MLL灣摑1YQRRBY={lHtuu;v\-̵֔{IR[U^Y:I&eAnld imy^s^rR8v= Uq+ <(IKW*0ZSr,&"66V"^0022pX[Y1)|p7T*؍ӧ{qy_TZ qmm d-N1^_WWǕ,^0`7ttvws8|@ڲSSS{Pw^bN1~ hd蠉U!d~"}K,1ݷo6^8ߏft2VDS(`g`Y*Kuu5HKm֫@"88ʕGkZ-.j/h=;sx?rfX=zVG~3cӧ%p[u(((\sDunj;n:;;)=f2 \݈ylxg@ޚQ3Y1y`r:?b,wɉѓ٬hoC~nv v̌hiJS~TT* ㎰>/E%f ZNQ oa#r5w0Org i<ɛiz5=} ۊ [!e$fjjjH$dT'tqqRbBTrFENi@B*' 6cLVw4p[82//*‚9FҐ(}tOrx`d5|w?S$3@>U@'Z4p鮓&S?2dii)ߕkӀ_FƱLV&Cq.D(T%(@{lB HrȂ۩ZtO-ľ't: `&ɅsU)\ ,Р[Ȃ+Z L ]>f?]YF˗1ǃpY Zmm-իY磭}UjdOo;{EDD@=f^`qVFF0(<<|/hr@P(Hc’soោ{2G횒rYZmd \ +lFRf΂_Uݍ.PHwIQ @pV鲝٩a,+2W\.hhh0~L7.ДXk K.lBa9AD%#G<~ :v{ǜL :" III1SBStt0C ͐sT>^ju\NrBK:!0dJ;,[lYzZHP(yt{0}nBB^4^J ǭ `ݝ}&g< w{g/HrsN\ol\ye{.JemZ&RU]x#ml葯'Ϛ/B~q`\yynUĶ >8~t1'G ڊ.Ք(9ic d@VTy/ B}8?]|`+0en֩3fcA,Ȁi{zRRw9+&&oD"joS]Ę>KGB@S=:ɵ몜_0U^^XVz b0}`[bYHYiim-d?\.k{|)VV);Og`냂0eOGdDbĞ eba1ь/+mV[J{zD~"sZRl#ߟPCiڗ% src/core/edu/xtec/resources/skins/empty.png000066400000000000000000000003161335566474600213450ustar00rootroot00000000000000PNG  IHDR<sBITOPLTEU|l pHYs  ~%tEXtSoftwareMacromedia Fireworks MX 2004vtEXtCreation Time02/13/05 IDATxc`5IENDB`src/core/edu/xtec/resources/skins/empty.xml000066400000000000000000000007431335566474600213650ustar00rootroot00000000000000 src/core/edu/xtec/resources/skins/green.png000066400000000000000000000646111335566474600213170ustar00rootroot00000000000000PNG  IHDRr,ޠ8-tEXtCreation Timedl. 12 mar 2001 10:01:12 +01002tIME  ,`6 pHYs  ~gAMA ahIDATx }w6P FX8$^Bpc(.IZ*P"a5miP#*6X" mj#; HJ\@F̛3yݭc=Tus* q:mbRepg`ByQil%ȨP)//x?Rτ)IUV+@ZKEV|ԃ;xH >YC|L׷j}PB๚T*"t\QYPqG#1"+杉0Xx:[ք켦"KN*IݭYܔSHeԈ z8S_^֚󫪄lDnD#(J@/j\YcG dߖa]KӘ0o:S%p1 Q=YlBzɸH8?JDT{a^eCWJ)15F^rX f 8E%!n0"aUIXWΌ=pqZFэq [(;\"D aanK0~0u:!^VO3r);&fWB R DM8zT5 1n<u۝SknO=˞P/lw #qBcQy0ndO{`Z.]{Wxh;9|3s:OQۚx%7a |Jxʣ4t~oсt+F;T fj/,ŎMU(3fc~iNmՏ:3Hh2GS4~TV1S#|Lxiwzu5c3Ć-?^|674T2YZ C͌H=>?9߉5Ɖ&M+W([cg=50(7V+g=x2Me "vijt3~3m Q9+n)i#F9=;0DN Nx STCf$n<F4jwN˻ySN }CB΁gzmत CdyuC̔U*+2b15匆LM=[- zA9G9δKu<]izQGv21vv2br # r9r # r9r # r9r # %kʹwF$SH{E`1 _}&jdHjw_-kňRPr]7mn_3E@ . g?$(~l< J+xqňR Ve5:$jb ~]-FJ}zqJ53 RPVw/drIr(@ 퐁6bxoΎbD))|TߚpO9dDs&rwhD5 O7d gȺ]qp>t T8ф Xpa8_j?4zR\{_G#Nô7 ( Qy3tRx2~y=Dm1"xe4r=  3!n*!8OƮfm/tWZi]׵!xXGDG8"=ec~$3\rs36,q/z-9& @o݌Ma`SZ_eo~ξ@GqLM-:\ rE)%gm;B9}߱#b.Z2T+'[@ƌ9Gʀ @rT-07@vJ¼rn 6FgUmtPΕx&\'wA;JJ/=ȴTgr}\ PCEJz`:i\sk--w@sRf;/l4U )75KU{3w%R zy4R{7NPW` 9bB_Te/-K +ziwAY1#qɲˀO0g 9LjRP9{>Oňr9݈{$xL#r78rz9b۞k rHYڇ$y]&w]9Fdm=u׿ob\`k'ȁ6x$kѨeMuB*GO9Fdm=u׿,Q)vJ j"Q7N;l" Ee:j ^]jGmpxUQ9H"^vQ9H;fL?%9]0"# r9r  ^s3  %\/dN5$xD𕓥z5v6F/xcG)o[oC([di%~q~rH97rQZF]Y^mpJ{?C*??mُG;=keyO j@bYΣߚˎK'__Eܼ5>pWfASE j,}/|@vW>~Y7>ya}6mkγEmeG?[US9kS;lU܌O}^ %й,8yy9{(Km??ZzT/e 7+[U&̭h fDntF)|Qwm}|o^;R%eoM֚K8HQ͈Ћ#p37!^ynwH>SS ׂ'IV䫥&uyMEytrOXTOXrrkM% 䡭 dO*Kw*'i9LMܔSH܄[+UuξДeI9K8dM}YKԾC'xwҮDm1RP8xL?\dmMǑaޑRd.yd߬`gM :QKdryCI w%j7+Q ~z4c&{'*K#]1k###288(׾"\4.$~@_ΧeOHߟKSHԎу1~op X%kWIOi~ao.* eğjov ٥&d)?fA1cطJ9DWeguX3N>f3=7lB~r|~{KK;,~؟l524RUܱgElחY9T.OOV@Sa㤿2k͟ڤ.XuK,gZ1Kz ugax!JR9w2$oKɑìYC mYvj2rC\XSr^6mk HL}w?Ηn'nq?WSӂd_@90-?>&Qrƨ+0, -Vb<ǩ#1vvH‚ /,ܹ @0O2PxS(xエ)tlIt+߄#c:U2`+S09əŰAhٲC?Gt|vŒ%0qr,Z4 FѪSCf 2d!ň 0׷rxWsZ{ڴ/vO Fvvxƒӧ]x]X5,+#ѣǎ9IGp}1ey-fL8VEC/3F /ov„B oш|ܤ/C9#n11 Õ%Ofjp$ <|[lPS}PM6XtƘq93B77I"ǪT"u ΊO2]}WEgrOe--RSXx LZөs6\,D` VW7c<IJ~ ŋqZ;w57{o_+0}z)-0=1s4ڵǨ3Y$Z*c|Jaky S&-MGmG>λgO-.īDN+B+1xOVaɭ[Ort" ןSOmΝ焏3Oz v*E52;Ng*}>ߥC >/{7/k|-~ mDx775&cVw||ш<>o+*l=A]ܻ8f,A`JLk$I+]=QjP4zV|IKUW6, #F`ҤB˺Lܛg_7$ߣroc0ܙ3xQwII:ɯV3J6 +|^wwu$HRP`i{؟0s)Y c;P{mؿ|L0Jw!JSzj\SͦJ[_/FsѰi UD`t5<2l sdP^ah`G nf4q-@0gA{ѢEF'ҕ3r7.,)RKrLkdQOK2jk`?)SzCmqbㆫl &\_wV/>?L-RDr>L3St;xY̟N]n>>R,^*\XLXiUWsmO^}:Yp7\Rb>>SB8Z2 x}7iםq#!z(tѡl$)?$+A[ٶDQ<g|(5yh@Mʄ(Pq C/ɔ+Fӏ+_F u@!Pgm V_\lvu ,>￷tM>CQTh џ\QZޅ)8@N?l!oř8i7^cΣPw7d vE13lvz1=/'ǧ<9w ye/6e$*ؓ2db/ Fət/Qs%#WwWVa5{WVi$\]e2x lCnnj@)R hl_d {{6%YGؒuƘP8P?R&n Pn/>B:Z0s:4;K:QӰ!':W#z-F~YNJO3!˪#N>%['ƇN2zؓ"=cuH/ Z|C|\w'^晸D HG3b'>7!kUa[UMi- M mӪCi!2T{lxe.NUvCTE gP߇e+;4$7PA$FWTG\>,01K,HlTUNA]Wn'07EDH^7UU T(*m4노Bi%SISsihw1|_R;{vCkx? Lg  |k#WOQwٔ啇WK8z'`7ɗؙ߈_9񋃏d_6Qa3;D,7f.J^yFI{6,&^x#0CyjJz0b :~YdM[kQuԉpɠLJyzkP= .'j'JS)k3(A _: Aژ$AJЎC5_‚%Kp;|0U!e5u2o`yib:WĻj{X<ƔNft&{=0)C#8&΄u(X1<57yi(O T$)7e ؒQҘD ;k6yL/|iV#Q*7"GHdǸ]jP/VQ@.lm߇䗧<9k7ZjBNsIi#0Q݌ac,eez <cKo7ၽ7pco]نm{mNɌ[e]cE.(Q%/\.f, ,CwlV#moXu Y|^:&9t䬷%4Xጌ72pF1QvvX$̷022(;Ov fp;)yQВ)b[zɨEY*˧8줭죛/:r3r}  Fg[zc]iͮIX_x1f̘Ł`ޝ%lqO( -u:٤Z$ٸ+}UG|d|OB'||ɧ0iZ+љ_Fe5gIfWsl:|Z÷]mɌ&'ZeÐ :-HuU-al;rW^T5cgWOH>&llgb<kpˎAiI6g11Bx 16:7cgSKvUazs6¦q350~ʘ;;%ד|n 2Z0) ۸"꒽h0yQI->)|:d{ѝ<. BDFufȦ<4i?vR>7ߌ8po9_紕<.loO.x,1eZŒWC-0+H!eH ^t6%*|n䬌{>:|lI<{/b weJ7O w/QyLf4ʊ͡ 6 m7J:θ; 'sӘѬZ86i ݻkʏ63vv3 ×moI,mG|e'q. avX e<0e7Lx 3 f# ˕LN8}g|ȇ$KڪZn-[-~~-?W_}U]]~L[}gygpm,wC#Q~>x1gAĄʜ]چs08 %1PKShYp&Ӏ\¨8ȯ:07{:fT>ԏ?3O\H0NdaqC&4t1#Yߒ[ZSIsml0_/|URM]{kI!hxM5}x ;kQkY^\ nEF~#&Mbù.츥UW&g.}/;-mv,LوhF;j,V+g~FڇLHE`]z 6-GqJ"RiܝK: &E%\dQjCeZv،;TLɵ|@r+[0mUoe@!,8|$q_ލOFlg%ނ\#%]]) HLk5{CL޽r}vBexZq4۽8tzH~9kƒ$h8; Z Z{yܙͅ)AkVI읨R$5ٝ'BkgvIQ0 c JF&f:*>0❿EeaXx+4sn<=P|_ϻ+l3fMy(?Oҩ+Ђ'Ux-v.ܹs?Hy{j<9.ע"aXd6F]HmB8i"|tk1\_]߀#w߄)0hE?]ol*RW7v޺ YK#MŃ խPS+ <ЌN̕Zi=;A|٣p0|UHxqbϹF#9ˏ/͘ՠí@r]sSoSA^#7Lڝ ]K4SeF;$1]`6cN-?.ĚЎIv; >X~\Ӓ c:A3 W xcrӮ';Wը 9΍G$Ou̳`?NN&16Dsxg|T̒߾cm#"r{}GOf!H^{93cѩ~IO:txq~!ߊpW]t} MG.yac<D4+6IKa0>w\E~L46dr_F83 sα$,/Ԏ8Ik+!`4,;9# |塐JI+DcG`RYG[3\*xAqJVP4>s*hpA鈓Aן9toyOXEa˱-\'KI6_|ҡCB_&AvM/A쓙a5ܺV gjGw$}!Hka^c14<F$u ]Z2qh0zB 9nRn 1\4,o?gɼ-'HEx0q$Pqт}ЁG/8r[,~s(h|s{xXD;|ޘ3L,A.b|6U)*5*$yg{Eu+t\wxR^٦P:|V|, ֻ^7=u+gfs{GNǓ_=(XgҌݥ#*#S(Qf|=@a!ʤm|g1jzQ> ' Qd3+۪xs wp&)lf5G6946|bydTUsZ8+@<e cIv?R$^2:ndP-=iPtwPWL>nJ"öbĨU(h>Q~x,C#7 1B2>-plĩTVuuô$M}E&t;#}>xA%Wp T-E"ȣ;UЙ5D <mVBÏNE\~hKbsRt+I!'⌆!T;8 )sH$aϜ0d9&U?ُUԟ`#?է?0;H#q廡(U{e h]/5p{r2!ďvtb$yR+qf}E_?#h/Y{Ge"1m4qkp>L2VD*<:61|0à I&,Κn0-~[g_ 0&AZ`yJR܉l>^f,rKQ!v5L*xyە|1n!f j:A;]We6sgp?ɸiG5]0.tQoz\ 3H3,0@9`/zffc>Ш^pdOܞAفqѭQTh gAKLGpr8م5@$44]I`]]X@ ;kQ30{W1'&^mc9_eONΙKk<ぐkۥKX(IzillK8_*Z39ݶ!ҟWvSj*,(D* ى9_&e }Vv5<%'c}Z2>Q}T%QY\nY̫4=v<>on}W F Aec]_s(ٌ|ctlV*@%l1Th;gHPQlH ?697^DpκatM[q[Z]8V &~8hCXD7(M؂H]nK[6J`s-⅂XtB?uߺ$4>ri+f|Th@?RD4(/G+V੼yxZDT7#]-{gLfp 6._ KcT7n󨌜'jORP_N"d,/nS1X̮۳O) NK}ǎۖܐ2꺎~IкZP?0rhtؤ&#`xӻ_뮠.&NzvtpPHA~`pFc l^ A|!WЀ~|q'[9QłM99IS^Ʊn4 q-Ңx8K8ؾxZR_4yzu6ȽM ?:t?Wԡ՛MT`I+vPT;ŠoV!C tO=$IŪPHTXK3 Vs57Հg*~*3?#7}DhS&1ʂTFPLO$4wR|rn9e _ɶ3'7#oH,)2QYg }֡ IeGXR!)ҥƷڐCA(FTIv-&ۈ};#D+M.0tOFcߓQ+:t?W b:㛈s[ڽB3,7`gRi^VI׆|тvFvs9#$s3'*> er=Ӆ_:Fغ`)}bs zuZ Ճ]ڈl# ZIyʢ$\O,ŃǓ8*rf]( x, |7'e9.+3..&fʰő+SW3y{2r,J&êA|Mv|="Ad~ JIz(M|M ݁VjoAݠpsJE4hpZX8C(nĞ;Ъ> DxF]"q8uB c|cMJs"qL,- 0{oiF43L@~HmX#s_$]*MCB8!ej;gh*ew6hsѲtQ"4S'ZѫR/J>1OKǚ}?E8>uКVEXgk{pEg X 󅒏cd$W#m.wF0z艱.Ljyq8p:|ArH )HaWM5)ˍHՃ0_/|1 #3uZPtЫX"CnqMeG=ELi  Ms>!NrȬ"+a" ~|aIr:Z$1vz=Q,6 Q앻Ϲ- bPbAޏzm?)ʄ~ݡ0_/|LPA}h6My|aM&Եa,Lk"X=Tu2H]0Y)5JӉIo$|aPQY=IcIB w&Q^ҝNB4 dՇ0O#μ6.Dž#>gGQ:"O*k e߷r}Uu{;KwsoW嗯nU*ڇ%{Mx_=ڬHĢٸODJ5> EE!f#oEd+Ux/,weu9]wa]1Rd@JA:Ct \>S R8ԃ۰8x /><e@&er݋bK.>3:P>~w?SΞ_߷j* )=|V*|<\Q+ #U3:O ǣX~dʈejW;Α9eDA|_~[Gܖrp$rJ,l Ƙ:d(;3:ߏEbݑ}iT))XAjBs Oq,xrc[HJTbÚKqӻPy9W|OX2˄9͠d|/0#'Nn';b#s`LHf -6?FMmg21uI?3>>Ԅ8 1x&up7>> 3 TfHlr7gYآ>۞ !3^Ԙra2"UKrPɕ6ħ!1Kg;/)M쩙y($>rQ>eFL|qif91x:.Mc57Apz BtwZ N.|mmqy1%%F-nj<̜#ud//Pwۿǣ/s]棢XZ;($wh}M.C`Χ682"Y0¾[qϾ^6UJ &U%Hkk2(ьM;`ゥ؟gS_fxxS}?Ĝp>B : >M/7$i1Ƅe>+)oϿYŎ'%ޛ'ILqskFk=V=o>0'($m^_H: bCIceA 2"IN%>oSzP^?jV./6/O|*>09yctM}Hj'è;8Ћ4Ʊ禒g#"_]x9E?gVOZK#ՠ]CT @Aceˇؽh'W!3UIOTK K;Ǯ~Nu2>렳ʘ&Tt,]CL@H:d>6$Kps{rP vXEm^t?0#Hl!e|X`Au417 C"#Ql}8x;F/@ 4uIs6GY:$pZ:}`FgnJ' S \b4|,߸pypMJ=QG*I2$'~|]?BOñ*[p34} 2%Hz M@(mb3ABA B%|OʯA4;ljIK'(d6)5IGlAAEHc:Wix5c0 HP\a!;qvXǁܖ 4AaGґiSv ZF`Ӷ@ D;ފ˧⼔K]GZ151"ķ9^ҭ&ˌ^t.pΫ&tRތ>|J9<=,Luq ,,$&EW&`#rFIA'n<{t<>vԫ: N6)xx>8Bi_,<vS%̟ۨPvW+G{j!]uõAXaɰ Ky#|Bauqű{ljd}q qyB#(Ho@Qm:K/Wz83%&9>0kD&5kyv$z=Ǟx!|>I f>nS20,Vq/L3yy:܈+Ғ c=>:[FXrӰvU))YDAAeH[KY!4\>**MBpq&=xv}d.LZhr} ޏ|sMGb6b@ݬ}A|= N{F,y+@.m_9V6qa;r+mV+ףL0I'~@\^|.w_)Yo*fhqd9ġvWIN/!CSq:^kaI7ZІJWOIFof 'km>%(/LՒml"@ .1G6CТd ӈ7>$4Z0SLIƧWMńL^> Y+ x;j[-:ր LwLkw]IM+pՊ)9thalpptƮB㋋(Rϱ,9h\(W=U z^1W~^>S<;9s`ˁ7c&a\v: dhQA0Zx+@Eq;T0b].G:DA{"2L2 $CnJjp cY<$fj'ZRbFEI;ja_E Й%' T{bteES* |*{4:rYJ; Iwxۑ%)Gn%Mz̨OEnV,FB6w߶L'p*یCݨ5X7|qh1FyZLnIBY]r[50.)YXL!gs8ًCcPdc/d4/<1>=ˎb$nZ2ːZRM=䴫ڭb1%LCggf4FIMh%zdYca@}Ht!'l#GM1 2d_rRѿ}9lZ.O2˰'פicB"5&Ei')98_/|Q|X,ƨQFJOMalŪ\\ːёN_mŤC32_3Ͻw&qi>;WhqqpH9 .Ңղfv5jf# H3e찰 1G290rعl'Ͼ{[U}w?nvw{-گ_zUV(ڲpqE .x5다>$2d2NFf7L h(.pvbޑӉ;Y|^ exHˮE;v .\@ww7A@NNiS-% `}Cpp NF'D4elv^|'hjjb45 a̔ 5 D?~Djj*˱~zTUA_O$7(Z'X0ZfL$8љֆ3%ЕqwLѮ/iGԢVJp_ }e+PZZUVBC}/qM&M[|ӎ> >(Yk7NnDee%{l!0*pF-AgI@Y.XuGzMľ}X/?<6l؀NV"ۣ+ 9bopm,/ Zb.=]&Hc qG1<,$s=(?c:h2 ~))HK&ϣ1;+[~GzXn&+*RGp!, Dܲ/[^9LR_,OcةԢ+qP*_YDRd֠kn駟b۶mX6}8klΝ;,ܔGZX9P}^QԕJ65i}V+P#_*8LimPt!N>qy<_ #h!" >MM~oǁs󝖖l2eJtT7ނcl~؀_/3}t3Ν?/5vEectMĆcm6 ǙZFRfr|W&f>m>}d,o&g- X+]; PydM|MFP ~{jh42jkk Ze9s)WT(lꫯ1}Jt9G$=y!~l+Wǥ}s *n5kHwAłrCFAK n7 `6Ǚz҉Z Bм@x6X| ޿eMW^Z;ユ.G Eٝ&\+x)|}¸J;{'୷N Á͛7&r$_CģwI =7NQW[UUW_}_ s9㟷!fP_M{qqOX>_ 9{M6a%R~0݉N'.]15tjAۄMĆ㎬aC*Skې;;PvN-y%dЌŠoug_xlTbA}]׽eWñ!9lF'k֧dΟolj'ؤ֭[czI9]h%)ע2Lh".s(ja}qYhZW3IeԏF0o<@8K"ofDmθ[a1Iwʊ+?ډgB5ڈF[cOі5&o6 ' $O ZACX3E[tEjݯeŖ%w#$[l`ħ Þhʖ@!~z)n}*`Hå,KQ^`}?233*LدxV$ѡ(2Z짔Jytb r\} :"Xo$'[GC:IMѡ!$4Zl*ٙ&éiLH_x6BA-z%CGёIaE€^)}:K ݨ]>)y]rI8)T#=!=ݵv{޼yxEId-jhT[OOb|jO-{xW9ÈEY:ӌ֢VqMUڒ"$ƲG&6Pt 6iEvϼ8&)˖U/ (0d;ޖe!&,VIack%Mb^B8un-I={:)dsiH+tQE[9C׷˲_Wۯ^ťz }JCNfC^sN,]-[Gr[Q9ٽE ȎEjKmK.6!mDw!ɿ/nukCb"eeMOaC?̆ dž/y Ԇi;{У3匹p 8d@%5$h.v%Utz.O ]+J8]|GxgD)$U$EFz I ѭ[SC,~H[3/=E," D1S:QK ]-)Qh[ׅ׊%)G"Fs,IU1n2&4#F-TPJ6TǙ:tqtUWؗ4u˂":/-iU2VzJp+Wģۖ8>㘗Q+qEpKACkΡ?;` d2I Dt?A+6}osDN/! '@[k"o,/긧JũjjcCTcf}qF: 2QkԒ 5g1ScL~H3>?K>*@VOdvxCfdѱ\: Nt}lZbS VN8jp{E&L>FWUiA'p;&뻷>>8|LSn؉cj\Մ[?lbh4kKX(k-GQz+s)*{W5z&%#9==ˢ@"xq։k PtSDYʛahGNQK*:*\%Dj_Q7|pto ;ĪV/jDojos}\_$4Y뷜h̹I5&NF Ru+n7?m26n}ʬr4)Cdug!34)$UrX̦.3|#z0Xp1<다>F;8 9yHNؕBFA6krA/Ɯa46f#mH6"T΁; דtLMfUo`Fzw1oq}hM@zw6ј$Q7t VؒFa]pezmYȕ^5D"x5Ehfhwh<=>/Dh Dup8N$᎜pb9'᎜pbiY™=Ùxpb9'᎜pb9'Q|9$rӽo!NDAz:3qN Oгk!TG:5O8#đ6Qg?-/^ήս}u6Ksmb1JK^:ÙM8R9܎T c$ NPiT3hIL.eIDe4 hW'a'LEow6l| t8ynĶ<],;u/H;38F'76Cu@> dc!7Gx]t'NDNpfP21JKˡV~nhAuu Tu2xK7*#amp:rG2vn} 5>X0fgA֐ttl>6|jjjYN8qq03i7K >>t! pf#R,ZC! src/core/edu/xtec/resources/skins/listskins.properties000066400000000000000000000005721335566474600236460ustar00rootroot00000000000000# List of currently registered JClic skins. # All JClic skins must be defined in an XML file located in edu.xtec.jclic.resources.skins # and must be accessible to the JVM classloader. # List format: # skin_name=xml_file # Example: # Test skin=test.xml Standard = default.xml Blue = blue.xml Orange=orange.xml Green=green.xml Simple=simple.xml Empty=empty.xml Mini=mini.xml src/core/edu/xtec/resources/skins/mini.png000066400000000000000000000273401335566474600211510ustar00rootroot00000000000000PNG  IHDRr,Q¯,tEXtCreation Timedc. 24 oct 2007 09:44:24 +0100҆mtIME  93Y pHYs  d_gAMA a.7IDATxyսgzx<3{lc61Ƙ=\#$)J"%!$BAEBB!n揀o%z~'d1b1fs0c{}g:gk=ߏLS]Su;NNhΝ!?} 7"BixcZ>#@񍮮@=n+zkǁ/b{{֐ąwR֐B !gh+B|B !gh+7SB[!d.V!nBtMB !gh+8w'F SN@݃h+ﳨmo&bBW;Aw!>C[! m3BV!i{M[! m9a m3BH&tV!>C[! m3BH8uV!>C[! m3BV!>C[! m3BV!>C[! m3BV!>C[! m3BV!Ŭ i+B|BF[!m3BH&v' !gh+B= !gh+Lp ph+Bfq.BV!>C[!dS-m3BHGąB.oUF+䛢#BV Xh+Y2; !P m(VgB|B !g5BKN8{!iEC1zJ(ޯBrNʀ%h&BH?sz !dtlE)I6BO!$Vl?;3H%! V!>C[! m3wLbgffJJJ'PVVVptiiC.kKAv0wy/:> RSD"rKKJJ5 *>O0?Auݻw_j>SSSxEYm jj67`6#<(@{[[m]]UUX]UӑTWWrII[Ad1ⶂKLJk, Ë ,4g/>6JJCC.RUva:xa۶QJ>y;bƈ)lpޞ몪qӧ{zz,X|r`r9VF#h\T! ]ݶ)F|<3squ7&'a'Oܷo86l[Gz!(CHJ &Zqcӓ⽵ 3ߓ<ъhUYy9Zn.-[^Gܹso{w}a >P5B1z ^ZVV/~?,>21>^tq[ZZfڵ7tvr޽;v̶BKKKcc*b˶mۄu|R8ă>Ǯ]pnxf{XA,)N]qg4` !8Mxիtҗ|"\|WX$W1Ztr!1IC2B1Jy7.cIlp9δܿEkP`f!v>O7o,>*6` OOːϞ=p둑s=zv]wͱ4,G5Bl0{a8[)+AEѱ{n[ggC4^_e˖GLM'WM[pG-kTTT">?뙙ܧ?FO:mܸӳn:J<׌*C;YD"ľV3G)%iZŝIaxkбTLOvCHJVAzf(k#(nh+`qssWggtl V><ZU]RU!$%pcO|<3 oŶ$@&t۶UWTV665j:$D_>Ho+-J991K#\=~j:gfR*X49X{Uӑ޽;#Gg'yъK#(+=2!⫭dt#;TF崻 SYo544}#$qBFWX~ORjo޼9 ?RDhxx8':L23BVIIl_z ?}*d?Hvø$] ! iioTsB V~>袋nf ޿EDVhb|ܶ O>u뭷 l(LIak׮]bUI̙3W\qG^'_ȑ#7n,ӧLVKR: (EZ)5?*cZV^^RRbDoٲ5 }93w#16bR@xJu]rJ,imm׿5S5(mũ 8jt?ՙ>r/vw,[8)1uYȁM } D"QAaKlgy'=fUlH$c\:҂7N7te޽;v>EtlV7x#;-=]LpY2Y$BNe={vvA r=477IXx 78aH8Q!AYb=)YZ7M4MDc Q'<86665梀j(饗^?mK u= wy'tY1ad 0SoߎK< {s=t)\gQA`5K'% ƃ*['N@%+%B Ç#N+ZF2RD%zR\aVh;^zHΎZBt*,tAáдj(G!:/sn?a۶mh5>uQ@bӦM&OYe Ywn ߷o_|Hnev׋/u…Ǵ$O.ٷ `>D%{A՚ĥGP.. ƭUA":8q凚ËZR~_׶6I:ʀo6Elo|fƍH{qUWSlقWŋ`̢(FO)ЛʶVHѺؽ{71Z ̗_~9jTMM׃THfR0%7oZu` uuu xT+WlÄrMm0 _gTpH4 O>?QàKJccc{4:91֫ ܺu+j2 ׯ,Y5s159YRZ5_z7-Z$ ywQ:ud ˀ%\V^hKI63SVZ%[TM&Szzz֭['Vm.ёIL r_gP__L.36jp1ݽ@1\_V||^![iZ5 =hб^gu + ր~T VTV !Rwt77WUW*> X +{W&8(P|*ܹSO|U8L-5ReTc׭??vaY8\QY$X3)0NcŗWT |իWY8gt'Kd"9&>dDTɉ}(x|Y!BO'PZWlɾ DY9r9]Tk a/{} ΢vJzb+[ Ul:,)5tyi)?)DLcU5f7>FYRD2ضE@yj X-eD.[Zr9TV2;ef@Afϑ{a  bF-8 bPb,;J,ON#()2_pU4}yߨ c4?%+\Yr2^MpN8MN:tM۷o>O}62]K(AO L8&!6O#0$ |ʹܥD+;>CLLLL8+6@ Bz3#z1rS f{gt:Gl*ъ8_cW_}=\ve7Ϝ9#?d"q*v޽9 zzzlb12hzm뭷z)e`ClnkN 'NO~%ǎw/%Ï?G̤{J,yz mvUxʿ>cwͷn.tI3D[17۷c[n_">9mkV[[ oF{챋.ܹsϟ7+b.e@sС|#2H!6H<77&sNDmX299ݤѣG;::L ie/)"x+eKWvtyȂ*6F1 .m#555h}Ǐ?<+cuި]Ś{Œ?uuMMM^|7|Sh D9D eqR+3<Yaxկ~֓cfnbz>SEtISc2Roc/ .Y/-q[d6 Gw GӲ˼)|[OqFS8pv|:a(66 7oъR}+[˪D+2|JP{ۜpB\CDֳ !{_^ CJHA h+]puppz7ki}h4͗?M:Фfb*ъYo\zaO?K/}ݲvY[GGG7he:yvBȪPQQq{Kcux),wWCИV~gvE?@EM)Z [@\Hj<(#3A_7~Ohe/wUk3g|߸ktuu:_y˱o+S*%SObk b:^ Ρ-[<4>L(Ĥγ;wXG?BTtRD%h֢0x{n*ʼOØA8ᣇeJwF[1?v}722r_W8{;vE{:< `?Ə<*[oGBlV"iiikKE_7k֬&r&xμOTD:V$: jok)ڵ'ܼyJ)/[\61L ׿7v 3xW>z,Ë/x7Yet) 1%F(++S}&HKމ7mj*}'Hdlڴ?D/V2Pfsz}ݙedžQjVH|D]LԌSP)8//U gΜφF]7+JːZaj*I6e DAe1WъZ:;cc*B%7aWF"2(d``l@?[}S7?V*Cz5Cpe Dh\8>`9~Lz-!n+EsM9) $Xra+Ќ#-R)DTcFGg˸j]$8X̤04CTU-X e $KprDyy@cw6Cbpii]})< #2[,#}+%%sz#h6|4JB!qNYoQ1דBeȧ!J"D_xŠM[hQEEL.mU@ӝ\[ZZVX+d_<+"ъ8җ%AsuN̆#'7*LNN?~ u|ʕXEDT+6@ !WT___߇~nk׮&C>^ gΜ,ZK/Eg϶'R*HP;::.2r }Qss… 022`~kk+$8  E+-a|,[/?}4*m6[pؘިZ~z\kjjˠZSDd4 Ar` d(^lڴ 1נm۶!BPc^{ Eھ}QG=tyUle&++-M; RI"~23UXŋWVVJwpW/AȘ0 HY.KP bnJ׶6qb_ -%b+KYRw:uĚ;% vИ*3$^K(>cR@]={4b W ]DnR[[7]]]GKEd1`:K8d 9#04MOhwEs@LVO7lb |Ѻu뚚D!k!SAn);)`> -W^yN`r}x]f ZUpٞZ QU}:dN044CdF?8DGhˆ5YM Q^Xti0̋^{СcTX_`_BR_zwSd*,߲e n+.Xd#FUtpرJl<5`"/T__KB 1q|(Ƥ`beTicã*93# 󭭭W^y%Tm¥|"<]{ >bJYB!Ǵ9^=0ԝ mmccczAcꫯ~7pGD/^lXYl(1) ǎF4T?0#bmݺMωAVX|rq%N u^:L0@H8*;qAD,YheժU֕ccXY XQeUh;{ɴ\|r`УBcֽ $XTy&H欟XhтZk5ɨuċV000033VB;yrW)A4T"gLy_bK4hzhtي>T_" |0g+*ؗ p8lRJUtXD`eU h+ꪪD j0嬷ͼBUؓ2PP)虙⦆$rc+pAggDRUѯie`KzJ!AS:oX[pDQ?E bPbr1cߋt|&Ht RkUvtt#ÆBT_!2_IoBHzfCCC ]UUe lbFyTMLc0knnWx賰a#RAfuRrی ?!Jr9M.]*oeѨ_UVﱤ{ѢEҚ-ki e\(D^ c񦯯O<̈́% ..H2)8Nmk׮\!|ĉ2{jR@/^:ZK]. y|'"7:A 9Dl[4 @ha!%0ox KULm * .0%K|SZlY[[bRlfxX} jlxYQM6hyW@',Z ljhI? * AJ_D/NQA΂(;vvvUEƏ ɖeVXDR΂*DēX(,1@NbRA=<6ͬh򞞞~TBѣS2R\t061vFdEFGG{{{kkkey/"gYAFfp5Ejc#EAnO k3IqMccV?evpE!}DsɡwʀW|*,Ooe ~]N=%S# E+gϞEr\/}}}X*ئ>XR :ЋjQeߊIKEeU@Q$Iܺ{Z:RF;(O0bǃ\SN<5䨯GY#D\ wL`C,rʅ`2J2~QAt V2yx#הE^ȉM &IA"!xDsB Ua\QYp!L$rD\ {L FStC24E. CCC `+FHWFð=Ϊ؊_{ŅZ ?<J]bcEK4\l\F:R*IA|dV 8%⤠"1ѳzgd0qW%k~' =o1l ٗ! ϞD/w*b+~=%_l4Jي(\~Nu 2{fʙl%S*OL[Cd`[?: hKn.ZN̜:y^_!1ݶyVr㸁Ғ^Mʳ֒#;FxdJcJßn0)a[ΓxԭE1` x e;JCRf i(3meπ%*yqi+q*i=e e; [Q[DA2ub}ޘ_8ab:g 9O$\g> xorV)>7B! FPV!i|0+RHއ& 9E\h"'}+V!Da4|A=eAyd+;AB|&.,Pe 0J&BS:"jCُ"]i/لu!HaطR|rxo0B|w!>C[! m3Bϔ#.!x"oBQB|B !gh+8X@IENDB`src/core/edu/xtec/resources/skins/mini.xml000066400000000000000000000032671335566474600211670ustar00rootroot00000000000000 src/core/edu/xtec/resources/skins/orange.png000066400000000000000000000565771335566474600215060ustar00rootroot00000000000000PNG  IHDRr,Q¯,tEXtCreation Timelun 12 mar 2001 10:01:12 +0100$tIME ~jy pHYs  ~gAMA a\IDATx}}g|~/lll0BD(VmJTH@U"*Z*` RiRp o }3<ä>HH9#'{bVμOdLyyrD}Evxu ?z$ 1u=Eeq:?F#G*.MDmI}j)a9#;M)*S6$hLЈPէV"_tk,tΊMf㖭>2%-hHuB4Zռ 1|kpr6,7\[r{D:@:"m5"%R<;%p  L&Lz !'^5Lh19^e40-(5xY[fmr55D ,ORmQP9Ȫ[Ш%F-+9GS 0cg \@I0Ճfٻ6*UĊʔTF22mSY9Ւ]vwײG;:d_<LIUH'ƼHZUĊLʈSV8ޗB}Yÿ;n$UsQ*YIk(J֖)*SbRSn2~S =E) | !/aapq r#O,xxNSTde֝AEO4P[%EV!cn1/WdD + >Ef`1C=$+zW+Gd{|teX i4V412һlHIEs\bm]_M$}F:Tn=/ X)<{'44N 2s%p6;'PO)VԩG^uUo؛;Oq ^ /;z{:tJs\&]v _u]hge5R;Ͳos@q\nL!I4vs qyn4VLDiV49f@+2 !C@+2 !C@+2 !C@+7KyH.w-i sI!V28f2$-Ih@eΗ^Ğvq^wE T&ֵz 8?οwE42Zv$TIJ"]ĺlj#;_[)cXۢ4M*Y@l>6@1~VQ[)=޲W+ճNߵlhMeN368x3{s̉]'dd;jKj4@8 "ֶKQpc+Vݷ"݇ )PY=@+;dލSb}{nYì?"V2~ʊ=džtg ͽ +LLzjW`X$}HM.ۆ?ƘS߬w`NW<"VX!PkDqU+,,gp,_aié]RmZ&'kկd |Z'^|~XUSǪ7G ޙf|gĹR/Yto&gűkՁ?E¹:fy1ýŝb 'DNgY߷`nxGVɏZg@QElql1)hqo+&Ѥݛ;ղ}n臘_+U$LfFTh؍R)kIoɋg낐c%_'N.Jȅ {` 4ѧ`'+P?^vS1k0;TfֵR7.ʿV26?yۤR-ޫ^]~yڵ+ -G;꯫_&9A TסS]j9B44UOQoh*t\$0la\V|~V`mٻT|=o_60SnMX\viwEV`nX0{b}`mz6#!'+8G #}[)l.\|"[B@<28w[*&XihuY({BsA4<_g\5o*[VR?rB}A?2dyڊ21qI4>֙RXfKU=kT!Vm !Ŗ@xTb"S=dxL:DUUl9i9&"YQriquXZm+Fs ??d!VrƅrΤլ E%K:Vd! AIݷReRO:yb> bK :S3v(VFGtT=E"m\1p~dlK{ +rC5l:aOG2&2^ݽ /ÖUꀷSIa@3[8#|LϫH;%TeJTVUnzʔ[/Ij炎hyQ9;BVYlUkh ٚ>wE dgs-'c+~C?z!E5{77;,_ 0 m!Ha97i'w̿G^Ik_ߩH}qYrTSg] }+2 !C@e >X!bl"[Bm'ִxb\Y5=4ŅծX)JK'AܹtqI+P2H+"V[@z mØAU& 񃮨PWl`b+ \4pԻ![~_o&WIV{Tcw,Mzݰn\ses#|~244,+wjiXs xMU[3Rh8!#`ۧbB6Fib+9/-%el}gfGs\hS,9j4"r>y٥T+ :ڨ+IKҒjS=} Rih`D?idlru1JE/%IjK+4h l舨-P{[ob4{A݋hM7ꦮ {ٲdkA>:zΦ4ʝzE/[DkU& e/>.GRn9/SFFF:::K^Sr?7Bv]$V'TZ.ZM-&TAq:K{0Hrɭ&7 TщHC'rD垣4SnSWo_{_?YBR>x_jҴ%=kok7cڊjQ/Z@WMS[K;+s}?l-l+n>Rc(wKsU q-βhF j-_J-F+'QieG˺뮻#xg_X#)A6侽LfSNJiڶ_?TIGS;ouΝ/]fqj5uѻSp9)ۖ]7r;;|&,7;W;re 7ܹsmKq^r3|~%} Yfѝ-tlwss=^_,*GnV勗2qUKb}~[ԓb=秈A,PbW}*clϞ<]g?-[:GO}k<,ѝ>B }cCCg{[(r3<=;vL?~ݏ~tΝo|AAԏMݶaŊàU矿7N}Pաj%uxq}z}睾ݷ:=r۲NڶcBѣVOψhN/~q$X{KݒRXHgӃX σdc08d}饲13g&:D;jN3';p@#qK6@n 2 +l+ƍK3'yc~ۯs'[m;aI/T;L Kt~.ոl>╹D`O)+k''&9zӦS7z , >7}yҥs|SE@-r0W =֭x_QQ ~݄F yǢˊ;Vp3'l.{ lR;wnpĉ 'n)577F02 ^Ѿe'y G†L/kq]?.Yzt4MoRy}WL`Z0k3zoee-Tvj(,:Ѳ{7`o?xsѦi]K^D0qhU{s`FuԊŏ?ȥUҶ!WǓY{O_mn6u`0NDcQKq}W,K—hcGx _Yo(qUUj&3U[^EX GpyXy)TӳW'OU KJ t*_ iu:پo4'/ZRɕ%/=qWvZd_q3)ơ%yV#.ry ' o۳#Auà$nZح(W'9j۵#cFI7ީNv "sCsM8u 2xVV ).XP=ݴZsm6~67E+R l@ݬ0vr~v7ڷOV!Va6)1qϪ/{NpoۻڏSa? xn*2G(%/Ñü"%<70,Uerz\wpD߼%:-\IHcW9l<85)M&2*ŕ HKӖm:.\1LG~FBJMҼ8{}gő_m~gb⧥:@2em_7ؖVGmU Ίzm ߓU[7ˣ5M%ryD@nN:2=ۧ44|?҄qe+5LRB'貵9=Hw e ӑ! wvk_ yWRydn ߡ8;K;Xk3]V0'>0ur陏Wqy9~G^ROO; V:߭s禂spOQ?N#YWNQیך&ݛ힦1ծ z1geal79Z>(+ Z"nXɲ'?)fNTgםt sI:Wm~zy~cUTJPz IpFn=vǬ҈.I8PEQgo9ѣs8{:Wusg%κswܘJY4'sG~1NiU K ny2AV6(^Ǩihqq=媄Ki}=dˋ;e\SV;mGɍqU{4D?O=tohLJs'zث{x nʇs rb@KBdjqă  ;aRTTtCͳPF f$=T yaH'85$hAùBB͜y}Cnxr͉M<>"!:M73IivO) +&W{+'OXbH6X%9p񩾡%jiӪFLHyG?vOuklZf\}ZK*^h%%9Ŭ6%(ъ7:Q(-[dr1QOdnI)ZSj6GzUq [;fZpD9kgQϔM`k~SƏhoő#'_Y5:'S퍵{,'c$VOΉf5*KYg}1yqu~Y8{7H܋, Dψ@~rִw ̈́Xq+lU{12卖152p }ʐV{V(L$8 7/ *[T*ag'-\oP8!Hy2tC\ 2<ٓde h !p؝@%++K,LjInB]; KDfPN@!Ht3p|':IPݦil'̽ wTv@҈ FH/A =X\PCah0ֲjuDV)ΡU05Iƅ+8t6ny~a_ {{ist[7Xl&E1Z#иX(UݒHAR # hSK$Uv e ={8%plJ5UJuӪVE+d˛xX$gh vG*\[ VttYzr[EuSBAnBܭ9zM;+̀ $Vx?.0,SH#n)yegƪ>6A{*iOu}'Yɉ d^a>W7@] P^D$niߧݱ^̉GbY[Г{y&BgG.A]02Jg]*inx4ޯ5uZrչ/FR v3엳Y|գ 'I z^>z5ɿ13դQ7t[yԂ+;B' דNT*&&yg@8nVfo>K.Ag28G&.|e>H]O4X0)EE/v{?^gf /W6p~FN]( Y琗yŮW_;}N;~ymc䲍X=iC_;xx`Bc5rVٵ1S$&luzj2j$nc~iiv˜E#r4*)pi:̓r庽5 ?M3@UO8ZNNvo pS˪k% | mu8;WpJX9]Z@[qHOq/7? GtH(Y\)[¼0[q-⍢8_%2 ٳLSuݏe+'9C}ӎ,yY'g6n".#$]sp53%\flV sU˞lnYSq盽R9S;U^n.R1qs7(*"bw持<Ao:vz5j#˲Kw6 >/Zx֝o諽}}t PܾD`&|nۧxWmxi= ̍ Tȿh Bd0yTVqte~\)&%&LNNiXZ!FP \shě() ,qc= :vVn +,)IR)s@4cg_cT*5{<\﯎54R˶2q]]D3sI6@wJoh$FXk%޹@GU ?gfμ'<@ B%h](.+ZV.`i½^AVR^47Q 3I duggޓ0C0&3ߏOq䲨 5ORTǏE:=7ʱInZGǜwƠOɧk8o>i.{|P-?RXH.aV(ܔDey%,cᝨm}C;1@EU_]؞%WiP|;@p8+jA}Sx]kyMU|V{onzVCZwn"n&^?gjA?.PWLrtdE]&̦I1^8Mr۬Mw^Y_>@,_" 7ʩ$ڒnyϾqH>bL$~tRwt/!BWF%Tz]cs @c?(Q^vOY"=t$ms.v.PK&EE6ܸT|'|fV|%!G\xŠel;\韖~-*Qg8pQM)6LRQg˥x *7X>(RfYYrdJ (fУ` *̂ҭ=2j6ytp-UG^pїgj\(wJZP@, c5JmIק8r~T &*_%qӨ<@SG~:[I0#SN /ykEA Bל=(*w52 S,/<% (Ѧ3)& 7NryOѳrĥ8i41lX6wV ;$#57ΦozYT^vd)~`h;.2UXuc+P獳|8t<+Ԥlǣ%{Ss3,oe_SWfɎ<ʷtaE]a<[-fÍ٥_D[\c W&9*Ehxh!n8sf^m2mjhfA1/E7};KJL-%YȖ+5usAFhpwۜſ8Z]nS'rV׶ YBSKó/A=|#u/w8m` !G E%-؝8 N's-Oa׆*̬7!TȭloVTMhגWQEMģ`@ 4%0AėqhB(vz%]fiYKטOa瘳?z\e.}{]q#h ؗaBbt A|ׁdVPPg[8J%1ֲ&f~'t7Û*F\D7€ m[!GAw+ZVy׍w+0FpG9h$:RHI+-j֛|;L7Jǂ=h3r(CG+t5Awq3IVhEe#pbˬOmvS;4k! ?U„c]R5pDێ [.c']ksŚ]h6Y7dxqۧ{vtF xT?섄&w>=Z+TTCqnh"{I b(6J& ۸f[&;^{$/m?~ϜU# ?&ΒʭVmm_OL2d?!ho'I2G.|}ƽbPٹ'k,{ Ze>M^LI~,??iAqDz"`R TN";P A:^,Nj0b||>iY/Ǧsܹx.^[ZZгN|%MHBjPPJ@hkp?)R;os$~lm]Y%_Npiǿ߶[c-%:wi7~,>iG~,CvtDp0j\|Nxp1gCqcv&nQklNV=N̔rC"@:=z?7w{?;߃ܲ~T3cD)xB( 3$XU3jlFÏMqE?a5kWMy̗m8ܓ[n\Fç;ej 7iɍGcp-k0 lI[9Mn&'Ï=`Jgo낇֧KK}%O΀XXBSY٪,^ǒVPZ>?q 6}dP4}_f9I1QX U毽wLO>@[E`oWD1~LA)CHD.k53ًߨ ‰3.TQ&@Y΃r\][Wn8Ec@z^ETc>)PT|t(Yh LaFnZcAY^ǒVUJ(Z(:I!~ ?Wn}}sC @$Z^HJ?M[("<5/?J/?+2hCe(םt-^UN&C-=rʽПKn䧆R山>&y,.c;5izM-E^I‹_:ؼU~Դ_Ip?M+w;$W2ўN VT2LEo8K6 KAqF׾z$s-vήl" yTVyQ:5ȒWrm>~T[uh+\c[Ӣf5l(36s˕m<T@ȟC"mEt ˦Ja҆zM| ,7C'/a/I^a]Ȥp.yfyhNB&nj-1\%MIJGQO5ʨ铆*a j!C(Q76[ۼ -$d-HxC.^cR~.GRLOrob ?F9tjtسHVm>~+P]AE8Nq $F/7nQ@5zy]&*l~^,Pte<+qp@ lTv*d dvggjv*Lfv+5{&0)WBHc -ξ[G-ٲb0[م$}tzޤܚ7:ޚ\nU^`Su~Ny ~,()B>bPEBHFWK_lR ?6)ir?%[w>16<_m:ORVG:񸃫.Tcp($V|u(n+emvAs2+`?%*AfJr^][mJk!wOZS> 8 _&+`Ѭ4Cqҿ4|%fy_̯Q~~//̪qʶ)з}DgF,`%EC=(/L{WI1~OYFM1;~lRwVut{k&n)3jr^~db]qChw'rЯ, Ip}=utz4:}A )Wŝ\ ies Ŏmdqtm[L>i5)(X- 4 _PsMNtR᷊pV92TVsov@bA{7, .jB>b ?Va/,{iݑUfݛ!q||?| %r<&~t@K@Y /W)-wW`fܐdڕ@5I5^y3?_jJ;pg}&^#Wɕ.![0Z& ɖ#ayfEh #Žw$~ "=Ylm [Q|^y֣KbF5[' =zhOfr[ YbTBCP(DY~{#rS3 ߿qS*x!8M~Huۈߟ==h'/`&ՄQQ+j~F ;/-)!R.8,i&iǕ3^Ņp{rV@!LW::X :܍Žd07 evB5b0B~2--I D:6rNH1 =(ay麑.jmQ z@&'wyYHZBzqn{iƨӚE]k nHՄ#`6 &(x5J :~{pet^Zۮӥ L:1-… b3nE~TM'}<2E9K~Ҏ9 ZAk:z1NC`%+O+QZ,0 x XqoosG7H|ޣ5Xofci׊pna=RܛFh'Jki;=q C'iIXXMdER y),&F{ }+L$碑+u]z3"i ձ\Sa,0)6wtsBs#r7g}%Xl`NEC5+|5Ggm~g >rZeNhOZC ״Y=<1uiB5' :p}F{SsJ@i9^&G`Uަ4X ߓᾔw.%hZ0uKݖ&2z;RЎ!rHgg'EQ MME eL3jݚt8нm۶QfϞ=cƄܜpRʪ;wn}`H!7r~5Soҹ2as%ݚ^dw,#½E{iK:3k>^ݭׯZ˗/EK4U:uj۶VkEA!}L>LʤLfΖƹL[9ԗ8w׮k׮t 8CTaQł2ǽNo]wGM>cS;(ʲ$.r޹S,,R,}/t\)]RE҈F[zܹ4{*ǒXhrk6s.GܔK㚤]%6b=9siJh8,#+/Ӷ}+WZU{\}N= "",/"ic2X9^ Ϟ}^z޼yW^rJC]y2QeM颶osg}b[fH(;?m]}}bEEVd..P7m:u)Wmn>}Ң(s62ι5e.QV+i$z{}'NtTTd&6]߮apŮB s!JwLVu9bx',^xLps΁+'o*Zlٻˋ3`@ q%;`VOϟ2%@Gdrӧ~2aǾ曖6\B={7onmmUS+vhDž_tgS -'K~O<ϯy衟٥k7kk7-]⫯nݮ{RK聹#SYɽEmVDJs9Ɲ9FX~O\Uٷo_^^ޜv9ǍWVV]؉.(Fud(e.2WcDD%ȕ[#͚5f3DNN%K8a_}Ur-};x 6RQ'Tɓ7nF)-USٮ'FrʼntaQي k. 38D=p6l̞6]mʥD)Lw.Awl5ltPキ1,XxqSa~pM=$˲bsơux ,N"~:~B: 'rds#mCTtUsDFEOan755!)(9y%g]x^;xG3E@>`*Mz]Ei(ωfEVkR> dl|@9 5u۰al<3 ˽T|zΡ e!'uu3YBWUn믽^޻Bd^υ{|)UcHreʙs B}V7n<9p0\k ru0֨(8mٲ)?]38h^Yy6ml޵kzpʺ ]i^V1*N*+Q)ji~q;=_3ŸOӤ39r 9C`?K8 xILbܨv\$ZUnn. E#D.CxM桂dK 4$%lV"h(W|1O3%Bt:eL:u?OET'FJ4ʃ&u뤌ިYbf[t9;!hO.*+ppw [&:|e>@ glJX*hOeZpMn3'''\FoXaʕ=zW*ihhXjEn6jqM'Ta,K__zkpn~|DqEC2RCh_VEYƾ4NJ ,*ŠލJ078J [f(x,.&Mݒ((BNtΚ臭R x$6 P`YbkvhEF8nXVW3r]&޽{MnR ǍǪjcǎM.7P/_(2J}0l\Y n&ma; Wx!)Y]]i&_I` ~رZet>!V+r8) 2pXEoFQtJ0MG~ȅEJΚ6 #L}}=sAd?8 G+a[i,P"N([& NLnݺ-Tr[ZZ ˏ?sI-XҸJiճ2,gϞ!!EKg˖-0~h\JOt_7==}=-?g]ӃnW1UBb&,`%|7%57ɲJ2 T|/M$IRzU$3k\),OOQHMbr+y=Շ+$@կqdG$kEݼPfl"#AկbX^yryX0` V0 b0`0+  K!ͮ_IENDB`src/core/edu/xtec/resources/skins/orange.xml000066400000000000000000000070311335566474600214770ustar00rootroot00000000000000 src/core/edu/xtec/resources/skins/simple.png000066400000000000000000000465621335566474600215150ustar00rootroot00000000000000PNG  IHDRO,ϦQ,tEXtCreation Timemar 15 may 2001 16:21:55 +0100tIMEd( pHYs  ~gAMA aLIDATx tTUzUIHH* $e3Qt[mVpVrzltvdm42DT[Q@'j֫T U=/n{KI`z]4)Gdw༣KtQQQQQQQQQQQQQQQ5k7%3'vr1I @vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@"Ʌ <Q{G  @"}M B%yGy[$2yDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDj@vDA>0ѝG"j߿DwpA&(خ]ѺDwF nR5k7%/ѱpߏ,e__Q?)~"ÞCώpNO[:M;dGM9.P; P; P; P; P; P;T`vؓcY#A*zߧyBOE.Jti߮mB9yDj@vDj@vD!v"icmޚfTr2%ۓA*Zv M&МJ&E 4j5hTk4ȣ>ٝR]S&IA/1sҸETt埪o.&9]ۖs3ҝ/]5h 2H-:[o(r}XWlc̲X3uɗW|5笩h1)/ms{ҎIv:[:;kg"TuUdqSFmgM-A^7Ww6LܮuRrmC'0)Qi6vS\0d-ilRe 5RNRQ[x/fPZDGKC}fa|HEVCmδrӯp27J]z #|}zht9Zg 1(;X^/ - ZCQQ~C%#_wq (81dRѲc8P^ga7f&"mtP?F^6%zİ1@R_|<5cm$QGń]ùnjЎji-땥ƊS=2fϱ^BplCɳ7f>`>arSL[v>}Xa0Jfe-{ڣAĪ,?Qžtˬ4UT ~|ulfVz.;s˷juNe6vf9a#؊?Wēiɯf΁f5ϣGb~ tW^qhSk4;sw'CwWUG-dNY喬U=m:=K3ʊ8 ʇM˟O6[k/m{>xgËG٠#Dps-l7YN)7Yϯ!U/Xc;x4a9W}z$cG=vح\^g {3rwuiONVdb>~??ƣh٨-6ryݦJeuGFqNΥu`=d.^N?TTFe}5;S5 A;D|>b~=Uu 7Yϻ}ӝy%lύ1ۢF*#'m4۝RUMTi{Dn}-xp2l2Qg6vi3 Y&%#zYC_Zjz\=4Wi ӛ+y2?R'*SLŶ OfsNU2NRyIl6x{D/{as4t-w>tOS/Ll1#G%FbR嶮C.)YHcEEjiyyyF+[3%BȶD?lg(#$)옭Zp:v-SlE,Ie9N2ճLǵ9i37f;Iz8t._Ȟ{O=fsob}V̏DGeEzhh[5}ίtK&;t-+7rhՊ73{[H.<2U𪼗,y~'OPr=hɧG}+h]EduvC/:fr' giYTk{ӲNUfv<oق_1*d n~)IA./EgWrٌe?P qJCZ:/E EBUv55V۵mɒ{cږZ&N´\NC!Z-4r%ocgwT!"=͕ntC]viigm+CZHwŔ0>g{#T[VH`tN oM:9f;g哅]w/fA邥 'Ks̹ORycs4]9dU+8@Isu[SHuܭ5=7嬵d VVf'\gAț#/w2M}%m+"'#9I5ud\.G4?k{tg2EnT"V/ys mTXBg"[!+9?cKHL<]NQ]S? I+_d{:o/s$<,B< ks*j)a*ٙ^f+[_$\E=,gg:2PG ȸl8^?Gs2SS}JQ 늆\lA[GhPOW/Ӈ Qv&- oLeHaX&uRO6Z=#ݗt Y6.l3:cuaV[R&YWsHb.K5/ϢֹeFmϝ݇d;RfA|+51Օ{ͦ`nvcvva v#6&tښ-lҕjڹh+x\sfy'GV .-r*jչ.k3`-_ -jYOPi-P 5ֆCz zIg U מq'k;TNx?uF'RמxE>(A)AL3z",)*U'vX{A}6pM&SLxOkLkLɗ"z(m֖Z[ Y)hD= ?zuW+WtBj'/bI[YG؃A zNG`ȳ}׫46ԗq`aKL,-*~$"4>fk<^d~oB!e7N't48$Knذn 9[[@{r7:+B^(INKǚ.gW w2nqڰЦ35i]gSj`01k0Cqפm\xrܩSs+Gb?S%%%/oow59\r[=f;;fɲCr_IEDMcå`SlנMdn@^'~h<0yjO.Ydoྚkk\ںS:3Rm04,|6NU56z]0=Qq\PvSn4("5kVqqqii)L7@ /VOu;b{҂xg ؎ړxUlvfkLoh <Œ7OT,;]i fl2/y!Q#ݹgGky"<ۓ3ySm]ѲtWI")JP>O<#ucR2<ȱUF9RSUfcvw%QTYVWu4 YD!UDQPpx<.3uPsAE2;8(dQBHYHKR]թtNDI3:}*W/{R =5Uqظjj)JFz̔$ɖ^RS8l9N4HT] ;v~eGȎSs/y0P~S)$)G;:J)f[I =^vn'b ~? =Ty^_KFfYRka^ Ǒ*[ê!,*1e?P?7M/ܳ7Sag,H:Vհ};z@]:,ٰF4UB) =2J\, _|NO3;7d] 2*WOennkNF?P_z.9rp@gjNs·߆k?g$ySHE! Vr0cؔ1v- A꬞7+V_W_;!̑ƀZྪ@uU_Clln/a';G.HJf#rba|ud N^K9ɘ _~Iݡ-#r+;ax(."?""il~`1ydXmXKά:~.n>Q`gopOV )d%EDFI[ 3Fx~~&qn(-rxer(-%x-F#I1sjoݖh.m`ȞrI9w,/=rܱS^]dђV`|j}X!*iί p$9 Qwaz0!FM?WB`VR rb dp eI5}2ą x11u:JDqd^h~ d:z7s|g/^Lf.CPkYVZ,:X?0dViaVJI9$jS[(z=<8)} + @@xee5ޞ 8ΛJ2&N xQlctl?yJ1̽xM:DE$*ۣN\W͛a|%ۈ=,5흁Ŭ#$}UU arKRwBT6%T@{ǘ2 O@I"!Z,n'6+ai}7!ĘkAYCuEek  | )𶂵K؏\HVy;_0S}!*N28<+`oã]wK/`g.+g=$ѣ7-k yC48Bd 7jf%KgЃ ̥Fc2Eweׁ,c]Ə9$d$#"&2dރXkZE/O7}h*+DvBhХԃ!w>KӲBh<"sD sp/C)/cŐbP㍅1|2 $u4C尬P"ՆvX  W(Ɓ$go7{%#w!?0Dž=,V?*{Co?Z6?|\vtVV$c/ÃѣjG j4^/q:y OaY>$f,_`/-2[r Ukj"xH0X k(lN15O? B>osl+dBҭ0%.ynΜ'vX,q>׭#辽D^yIrmYVϰOfLÓ d!3+ w3r]-3`?GIƎ_*V,ڮ.ќ'ho ^5=>Xk`bblZ6~FJ<6rw܎'k֐77nIѲ`Hh"V󼏢IBh22k[r>X/m75cgWiOQnt:WqaӘS&'H!鐀$q;>tyq{) åyL&WlsAֿ6;Ѧ5] f#'[h;-dF Iij"0Д^GYymm#C#NkY#d@J5[RH kZ[px^p &N˳&1`0UY.o833O;.;̝]!jkZ#dѮ;FxOꁧADృ" 8&c O^;:=%yJf 2Ӹnjqnr4 @;?eL9#iH!_O9אupt=r#vBi&-f&A~ `>w$, R˱Z:RNh &üW?H/]eW@g#O5jў}$C+v.xC+J.gF*>bjau\-~;г/ tԑ7RX"mxrͬ곳2hkFjO6-MՒɈSgekJL_˰s*m0 #FqH<< |&r˖~Wkd3%hD+:)F2eW@4X "x2^-vCfܴ$f,o(˜2 iA|UD?{^+'sqO~β0DKgGLV<1k±Mpa0LxFՃgԗ4k_x Vɷ¢^X|D}_K„gN,@Z:he!%n0Z04&v{Ma]ylysEqyI"%R"[DQ,V2j1mm N4EAFѴI`K-ۭ%d("%޳s{vggwy,e1ƪb9o}ޛM юPq&y"ߵsEQ0ÃEd4>#F6c䚣cX;{!X; MH_pw¯8T]5^gnk-6'HٟB@׼ YEҿ2ApXX|R̟qcQ^5LWO8 ws]zuN"[ MǛHF ÀTޫFh>3h3McrO!lXpQeN;@1̼=S ·>[. Wgjb*o 2-ݢ)5^~m&''~CǯE""k_J|>n^ȏq9WMծc;/kq</[,v̌ MOR8h܂i 1:Bvfb%pifo-NЂyǾ{=k9>YMC/,#x++LYL|/m^A=G, m!@q]h$j"|ܥZЗ!|iQȱvVO|@Tef 䨚橞X &d1O_la7nlj\cNV4<62$&>OxBAHs{gjWO\+إOZaYRF%)U4zr0-\GMB(u@Dݓm!)jkܽ{7+\_\"&,byJt=e}]6+WL_t)*Y&2J,s+eۓ 8~Ƒk!OXo5^KNe2{n=:4Yq@w;#Xvk^vC{T1$E)-~y/)m*4 #m?6ulwT6UT5'fDr`tP<4ey% H,q磶ވ!lyh'2J30ēo]x> ^?afe}460y}8iktpu{~)XY9R%'L#:d ϱy8jnAP$0So1#:5\L 40EK _U[5j4(!UQIFG;?w10 !V~WtMڣLQ;ZtJ15^KKeZ9Q4-V@4[֕2(+:Q[gnb4ϲ^<^Go$nB+Cݘz}ye6us(⩪U3Ȇ={##r2 «X"}SYQ_`<%'2J!+HԤqdpQn'5gG&'C=wl+Ȇv;F˹2CB1jO,GfeS˗OfqqA x/,z׮-[*LA>uw; ッ]Qyѽ|6,YXA<viܶ(uv-ܹ$.Fv`!q<'[7{_͌Kk$gϒQ`xҊD4&T㲦lgcڷ W\;~Hf+<}Z>٤yU=opFw>&!49iZDU֬YUL+suu{nUE1::qr.ԑӯ厅Bq +?@c<<^/ҍKI. (d&\^U_g vS{vfEOf̦nKEf̎?\n#1#%5YCsXySu6oyQߞ{mw(@0 \Qʕu˖)2̍,$F"NԚ^bz/O9,9+<s>YySMM5c޴_߂[kڰz^O=VT+wG<+ٷA|̒"ޱ7 F\; }@}@>}mmwjrcY,z/_Wg@_4 ko]x׿nٶmWD Awl&Wn޴qC\9nje$'n~Mr@&uLS}e'|RRM,L6<\vH$aY8JJ ڣ33q)bKőP 3R!OE0';[2M8Mm{qlڻ.Wق,Tmͫ:mTAX鋡]zO;B N޽{->=Lk1muNNS4 :@ ?:,C{!PXCf3QȱvZ =I*ԙ-Ԩĉ.<kL13;dN0ڂ-DTTUj~4RG*RWQ6U_ZUTMNc'N`al ^ dϙv< b-ssf=sιsz!o W8!%rI"$R No7 Z)~Y;A+ xJ %|$ l,ׅno"tqN14tM{[D?4dŹA3azC!H yjRm0߹3r<\fp\g4 iN kkw zQBSz ZѨPҐ99nWPk@o3K پcεk)h|Y͏7WhFv#y |X Ѝ^~,L,Jt2drT%_.Lб, ١S% cN"ڣh^A)&C띛KRjCUs6Ӗt -zgp#!)*ML<❆G鑑B[vi N.$ꫮ \\5#;~Otez{ -3!\`-'O"A3FO=`5vժШ̭=_{mŖS/{ 5C0@6'0 -ry{LC[,N'^/ɩWk45mUk<)vV3*3#C~+Cg>nQWԪ]jҍCe,--0U#Gs,i6R Ejk>YoۛѬkC$kuHwc˚-l}bѣvػo݂V+jލުL;#Jg֩un uiaBbI&%'^V6а5iÜ9f^me/=M*"Jܓ/~;wy ^JB!f3{{z=U1-9C:=ۻu #m Y3@:rHF+U <ZO׀Wp8 @kW__J?K6bBSgԚGOLE)i!6& !+겙:]<ΦRwd2l2CZAY[)j֮H mEϱxd[Z%- CΝOf|>Mc {WkVh5jnaj&K(-55a9֫==R}ZnlڣۤvQJH2Jb,|Υx>clX|Zt59 I0tZj)& !0Ė z=mZ!TJ4k8s}Lr5;n2%?Lд9!G6ۤgYRf3g:ZK֥[)F6z4e_8ʀdJBEQQ lEը::S_WO!]a}I ɤ'Bp80:D.ϿiC Sc>g3L4Tj1JYJR(66_[): Ƈg{U垩,WX.e "M':NTWWUWẂ]{cf'%~H.Ks3,FbQh$]u508p҈.L/OMtKA(TAw?/}r㭷Z~_jBJ7/mi9~#[N=ݸ{ Ro|vϞ:cNOӪz8/QI魾У$_kXֶJӗ?G$IS}eYn^Yѱ#A]ָr9cݵ'ZsZ)̅Hӏ7HSO/ EnRcFcY>A %/k'ǎ;bȗ=]MM+*4M&JAtұ3폺K ;v-?$=|6=~jlD*p+J7/՗6!ð=>1JY"o_4\2LMM+J7)lAs#HAll桻R:5ah"A^%djiwG_x[4rL*a,pʤ?*6\:_K1eRyRh}}_{Z-"7β:'[J*35PURZ1"j h"D,#X@kG֎ bAZ;v h"D,#X@kG֎ bAZ;v h"D,mIENDB`src/core/edu/xtec/resources/skins/simple.xml000066400000000000000000000053251335566474600215210ustar00rootroot00000000000000 src/core/edu/xtec/resources/skins/skin.dtd000066400000000000000000000050341335566474600211440ustar00rootroot00000000000000 src/core/edu/xtec/resources/sounds/000077500000000000000000000000001335566474600176655ustar00rootroot00000000000000src/core/edu/xtec/resources/sounds/action_error.wav000066400000000000000000000226201335566474600230740ustar00rootroot00000000000000RIFF%WAVEfmt >}datad% %( d< )k:aV5(% 6A*!gU4YC@U3=9hEe'Vbl@`C@]\F[gZ)g'nw, 9Bl6Z$W< =P x0/Nہ /1!37$Y -X1E '(< UPݲOT~1  H]2%%]  Ti u (K ^h 1  / |z!9p ^x#3N!|xEuM M ]M "J K/*xIM%,,.80Hܑi܊Q@ 2]S_".?y.C q%_-Xe] 4 Xcc 3/o:xa]A`#@p7"N ; *#B5*B1f )6wZwp@!N!&#'X! T +RO$L j  lO8  A<x3@E<* 4  # wY, 03ڟ E H?}k[ R_NWX r# _ *( on S%  e)4k""mUZl* aeD *.uC{X8  vHT=s[d;# `YX p\@ T G~2Hf  ~16im_!   -j{;+ c . O3=R C!#9'I 6&VIYr 2RcR"  "rES Q 5 {.?)( & %v_({ < 3 do8  y *j+jKj_Q ]X^=Z z L @H X%,($)Tt,Qm kT'2 0E7 R0n 9~X  )yWfj+w h&Q<. Md'[`| :|g=J > nb40 I =C  IuBXh, ^ Ic| w% 6 cAl2iR*)$%63 ߜҟ=[8! -m& RFU%  ^>U5p*F,E s8Ygd +_ s PE]f 2  %7; \ \3m.'++' 5 [M>4ZDQ S(-& EnӦWbbqd[${^ -@) 6OY:; )a` /|ۄQ6_ r}\i%9sv NS) !/ $w *7w(H)Q a}&&'j/c^W!X,\& q%FMb# gN8z!e eBf ~U v Fg?J`.~ 2f S }C{ڒAj : UH I1^2|m{J o] oW o * !J/G _ ^n LRLc&!l܈ڣH^m4Eu+?d'  HB`x\J: 9 ~e Pz \  4 ^ @ }yW' !%FcGfnVR y|nL03 V'< (S V g?6l 2o > Jxdo:= }P<  $ xX`F  o D ^?9Yu [  w ;i =#!E r!'-" ߕ]i[ <S,} j  y{F) S`jyxd@R .}*)nL  D '{e0 2 h  [><S D x\ >"ڑT% P!'"x AQ~W99u o$^p*K k q%sR7 o S 4UY{ZSH {]|qS ftg7(F /^kUMRQr / # kE++W)  $W|/ -E$  WmCN@ 3K@;%1q DOq8WkhM#.  Y-t`xc8 JIX}O dU  2 *#< Htb{ mN j0 q%G L v$Mj26  l 8e;p]i z  {IEU#=uq5= (D w(_V+KU 9y yDjL~  Ub(~TD'Q VHWQL  5 X6h _ S LYa66 { q  !Jp?n;#dm MGBP] `fK 8C JbXX; 1ND27 * [oV- 6%h!p-hii:Hh/q  0+B>^"lB D  , \j#]!, "3lZ%  a. t4Lpb? 6 2_{Om$q Hw+-y ='R=  dW*-E Te + +~Mk6 @G (2i_rw' M;97w B c pw]Dg&R^ZK= | ` r 3e8E3n{ze ]o'_ v? Bߒ.? Nr"Nz1j1L:  Q V [ }|@ \ :FJNQ15SZ d *Z2Nn8 IlF K^%QYGy * 3J> lyv ~ - U.fO  g  `0 7Pgq < SX sry :9 U &_":b5,WN v )E  ~ |  FE'InNeb 6M1,`IHC(@<F_b}SJgaIy}5 ? /49Ha#\}BRG.8s 1L GpBX!T-G-kB}PFkI57v$Ttw0GT*(DJ*xc{*qWV4bUU<=b{~-];b~E_1X"G|j!!,#;+ D EP/5B[O2(K.Lp5YKe# ^Sk+T6>L,o&XKt,3-<Jr,2HMjkCZ}WmU sz}1v'j~.TX/wCV[l0k%l%X2[(src/core/edu/xtec/resources/sounds/action_ok.wav000066400000000000000000000325441335566474600223620ustar00rootroot00000000000000RIFF\5WAVEfmt "VDdata85mwN*uW>un7 & )' -жt r,3-9ZB/u4+Y &Wj!%13d|X)3/$ ڒкю;q+x/%qEvд&l'e.'T)b&,d+CEy x+({ `7 $&| qݏE_r!$_z`ei| a KD߹XX '2 ;,%E :[_V X5]_pyKc | SL;3J x.ua(>3=g~UHil` : ^ X 3 +PcZYxA &Tj)&)E+Y e En1e K + Ndp )&!!kMK^0^E6aP? >3zOh.!b$1&&%# wKyD81j k E(kq)y-~0]ٱyBp߇pސtڦع ܄2|Snw2 c /dv !B$&(&*u*)()&h$)#`""("f"7"C!i}vs  3  d}5lwfPܸXg\s;ZW|C@-,nWSX9r) N6n "D$&()*~*) )([''<'{'''&y%b# *}i >u$" |)Yۙou2}Ԍ׶Pڨܥp[ߨ:u~x U Y9c8"$&>(W))*)) *J**E+++{+y*(&$E"N  RbLYW9@wZ6/ ځhԸүl6+~L;`S^{ a ) [!#w%&*()),**+,F--(.7.-,+*J(&%o#!+O w >&*fއ6ٛG5RӴJԇkX7߫y_Of>+4OA R!#%&$()+,-.r/00u1Y10/.--+O* (%#!TR; /l?pu2;} <րԡUѮ3_\3Η-ϩ$xtڒqO;B+ M #%&U(V*L,[.//0j23442~232#2u0-,_+(&$ J MA\Y6 Kݔۼ٤֏Ӫ e.O$*ϥϊ?([ٱ܁^Nb9& w[ ~!W#V$&E)**@,},i-n/!0/n0/n/t00/g.,+*W)m&$" " u$(.oЦ6[6.tԪ'I e;͸9IkׇRf DY2O 'MB+e*}-I6j"@A]2M<( (3tL.;'*Ck3 " N2$ywSieÂqf Ϛ}ʇިʖx ԟT9xץC"LMHHq}N! b"b1?$g{ g.o>1g!B%2jD7%o& &t1B69$"d#*:?-46N+A 0% CT1O<̿ٔ!ېl$(r aٌK͛.'܍o6M6:JMQ'6?z(x"bZx!(#,O3*l q#(06`-Q##E&-P3)2]$)m gf4S F S ?@W @}R@A<+øÑƴBɹе*סٸ]0 UiS$+m/11p048874$0V1w2b0-'K"!!s +!F9D\  e > 7N@U6;ǝ8#ߺUGɭ6ynr h!&(*-`15C975556-73}.,)($(";  a2Ar6 o 5 'Ds +  0Ka~ްr$ƖĮyc7'X6eŒȜ̵,\3P1 #I*/B3677:I<;;965]4|1.C*F%1#x y* T GY~"3 G CZc)OjəmV0,tL?IΌ5޼2 d":(e+.J1@35'876e6433/,)%f# }@r Z 9vxT{Zy`Y1 p K7 i}n}Q[ٶԻ˞LǜŕƵ2ȼ˷(ܞ:m r!.&*\.1467!88h87630.+'$1AA1G sdRj@? x ?u ( W92v([m5Ͽ׾mfýƓ Csd q$~*/48;>q?=@*@&?=O;c85F1,H(#CH 4fac$GNYXZ;o qAE.w 1;QCGȀ.)û'B*ʲ{w>(|m!&^+/257v99h98641u.*7&! v`=4=4*~z - |)DI0 n[;NmfQW̱̐tӲ-߸sdX] M"G'+/3,579%9r76O6i3>/,j*%/It [v^T |v{VeE QK]dE$zpډכRЭW͎̘̅Ε_ a"]|Z($B)f6I-"1@2"W0-@p.'&c7!$ >*W_A6rՁ;P?4E 6{  '`G*C! v(u UJC2ݬ+n7ր4sѻ djժT܇3G[,n)3.#+88@5.:|A2(27%"a&v_VnV5*߻LGOKA >Te~%7)M Vug^-:է1}̿ӬW_Oߨx * ~b.!"%Q(|()-%.O,z,.,'K$#> x !anږִei 5؄\  %(*2D8C50U1'0=&PNq=͢{[kŌ ӛԆڇ]4 v 3 ]!NGlm&,Q-.-58500.$-XTf/ m̿#Hüop %2M67=[B >\7n5P2`'+ ` `Ƹ¥Evthm gZ OdZ;r  C#+Z1/-=11)!>M5?ۇ 3)U),ړ.v ~##*+.4n= ?:9m93I(" cdOmݼJDowԹbf= Z{ku _IxL !w'*{-02$1-*%ly Z?!%)Nj5°OϏՐQ (2: ?mBKED?:K5,  w8ۗFq$qŹ6Ţ{L~ ")% ':&# 9  {BbsrW f %?)+0/X2r1m-2*&!AE [c0P8]W%" ;L'0z:!@ACDA92," ه!9B} S!&(u(O('W$h]Zf;;(o p1$),-&.-R*$gV,.C\օv̮ɨ!}ӄBTU $'/47;<940*  0B/έ˼VőNݸuy%(+,,}*&?#tO Et ,"&f R"#^#!Z2kfޓՠӫM.qT #+05y786n3o.(2 M i*фo.?̘-ܜq ;$(+k-K-+)#%J I6u%u& OC>!""!Do 0hBןԙ&<0ߞ1;K0!)/36763f/])!NwrZgzlĢjy5n4 "{'*,-+)%!f]E#/TOy139 "o#" _ p116ء5<*XmBpt 'A.=367v7 50,+#W^LH K*߽"jɁЮضiq !&*,N-V,*&!*c -^75  V*! ##!"s* {_e2؏PXvr <X%U%*9.00g0.+T'b!ly pob{ƩħDrͶӋ%e pT N$& ('U&#N  N5Lq8uy cpgCVa ەۂGV%K!&1*[,,+d){%?  }4-|ۥУ˖̡ϙމb' { K"R##!#p V)Zyw>{ _U& !z.S-,= 2"L$$%$" 2I)ӕ^kըNFKP%-] U7h,'h] p]`YD*X! en`hAlaDV 4Z [!!z b+/ )iד[,WX{^r 4O] tg'sbr  A  ?E1!2]x?}&BS  op  `sm7eޗ4ܘ-q a]hpEX 3t NL@ f c !Ri5: I Y >OUVs^k $j*Etݥ߰zK sf{i4 |WLO&T h p%  *b+ Iol .4z7i ~ b ޹ޒZA'|'I| 2Y3G} e ,]V2fl  $;U**k >j"$H nw($M+8Lf 1 9 e  G9G\&QA;_  /  &8]Wf8 Z ^ { P 5 k4|"ZL2F (=@ % qBC.{+%`=K2iO#lDWG1) f * A H@\#X]V !*ak<  N 1uV8rPvg6D?dY:s-$e( D ` ? S c-s~{>F  @ I N cJ@ d feTc,JMi d8_v31 1 b e # kbF8D >Ge?4:KGId f *;(W @b 1^zb6yLF~x=l?#v_h"'OCli.;cp9PC#Xzpc/+`-+f=d'L\]~Z*pgexBLpbej}k6_C>B) dMZFT-Q7}d?K5uSU^|N"<3yg .-' 8EI&"$&-$wMf,zd5z[[~#Bix,O[@'s1 R@t:5=cx'| WKJx',(V.A? h~"5!Q C|Dy?'t:s q@$)Su9&P:d^TEBI s'q`m5"I*\6NO$$ $jew>)$Ke_Q(b NBDqDuY%?W jTVeQV i ?JJ'e 9Uts>.'.-&3@Pfy *:>GIGG>=.)        src/core/edu/xtec/resources/sounds/click.wav000066400000000000000000000214121335566474600214710ustar00rootroot00000000000000RIFF#WAVEfmt "VDdata"%/)$4B('0KC !H $L&/U;J*B% JJ6g3 (px:@$:9r% +jjK0ke0\D5F&p_MxoP 98-j 6T-#T #Ka;bXFJ[/:^ St4<6H(l;P) aN9qVqD<!l+0w y1;D58O`m'k@h|>uR.!0n)flc8YTyd\||"}ui*T=WtPJ8}<\:V^Un:Lx`l#&iV/VLVR]ifwg(twU] Y0@sZn )6fKdzm2qbCH7i|Yw'S"upcmFd[.d"q3vT}d%I=~0FkEQ*O-aGE'@dUA9S{nD [l@\&R kwrX=DVumzjd&!&(@2x2b4~>1H*yJ^ZR|{@(>\f!5uTNHA!mSOt;51tDeR);xAGF/6"+eREEv.Ncbw*r$$%XWDv 3w  tBD% P*R5`"q Zwv "\ YB } I#v DQx  LxNe Du-X @-$rv/]a=ej( j%F"IVpZ~M8, cR"MT:?Ap6qV;'J)*XtF+65YaZ<RYI_ l^JP!QF="UNk# rAGhxc}wKQnEE:e}S@gxf<`Q whVwh,'@AH gy>R (7 $.]q 4c0?W_3eE7.~+8l cUoG!Cq#O hj jb V kl&Qg$v %~-NFT~ty~T"}m&Jx=5N"L3FTHQg^}*l9Vg:P,j>lNCel T ]8$_@"\0RqG*!)FIFq:Sr" Ok}y M#VW.src/core/edu/xtec/resources/sounds/finished_error.wav000066400000000000000000000555221335566474600234170ustar00rootroot00000000000000RIFFJ[WAVEfmt +"Vdata&[   *F|xVs3PiY-j]#a>E8w.?''J#&~l`S;?U\~p (cf`F|wL|(t"T7mAl~UA.MQ_xd|cJ<}K}DJ6#xb+0 R.L>F߄f q -kt!w7rEspZ N7]>0V-,$ad|O:&=9C^:t N 8 h -\/_$`X˩޷k7p]vVtgx &L(X C 3  5" < K U N o!^]w.{')?B,aqcmD< Z   ~ # G?PZmB`OzÖ`DReIH}p\ sqf51 ,  4 O "\Hj+BDbF16}hD79) c[a& ,F7} \"ph`[eĈH@4  " n0cy 8 . iOP/Bs% t1WY:O-b?%C#KJ}kB j Z g ^ 4;Q]N*2(҉㾈첉Ӭ  *,n.mk O5@R 5~t &   C4TMz"r1uE!< 9E2[ws~F3\ J]Sx% {.: D EK  c U20hBp)?ST,ڍU P VoS*  > bk[# e(k8m[,[9[c.#Pr?]ix  v   ׼pJr3  3+ q ; 1 % A9ZyWi/5 6C{x$_a Q-VXV|gI"Oih@zp hq X \  }64_޵`þt%4  h R%   m 0\b82N  KVk0D\_D d/:8(32;O"FDN,q>4"ly : 8 j 427# rӹ9BU;M  MytAk x K@I]2T! | c {joTEfl1}Ew1 &IQ9 s,kP!}  K A < N1zi] ODGj[ 8 []' E m@ Ep |BBrAp??Ai:J4Dy;at5DP 6  5  L|%Kqؼ1fY eigO m E2sh9 r_>}:QTWlN2xv:=yh3n X ) 7 5i6g`JŽ2!n Q  34u ^ ] >l,:w  wlMLRE^$f<[~=+{2HL!jZp[H @jS[5+c< F h 9;,;ejU~ƽ0lX" C q\v.  d  Q L 0 `s8`Mp _=}dsJ3eXYKWL_+<7E` ivm9ݧb˽Ǽ"G6^t30Q <Qln  Q,AaaLJ+j)q*I;U/E2@ ~!R W c p %d3Podؘp6ݻĽ+ur@?cM"e"Sa [  h2+m_p^r #yJXpaAytnSo*Ta5 ^ w=.t7E!& ' e q HbCa /jñK!-q Y_ j8g +OCTG 4  $ rUD[| 5 wW8b'JX,Y L'K*MRrd nT,y6C=6  n Y  -;6 h!Tt͐OF 7U L1r 2 0 Y]_ #  M:e@S6m!US \[ bi~[-HR{Ni^QWOpuu5G F v zk"#pXΗݾz eI350 l ~ w N@X<Z J &EAo|b+R9(P$q ^EVO1(]W-(P-Z,~\of|dj  3 W nV]ɪ}̰ 21[lv3 1`d*wd 9  [QImcuU<%;- b > y%:%Qj'oloEb 1 2 _ d C4( vŭE 4)  Pi3]Z -1lQsh%O 2 M Q)gB1/>1eb.2-hDb5W;hb + B WYVݒ՞BT뿎SK% f7H+ 8 /bZogYh  b/D^ Nm^q\< 'gyL=]AC@L G4v` a g 9G[Mw1ܕ2H"V /Is216DU  95$&#cb6W@<H jqW* |.#(mn>@O[ 9 + % qP-FkRv㻻fj2cv|s 0  g'oXf- H+#_KCg8}BSXCGve AJ&{eM(`>&/<\E~ m z }HoF:;DϤNnEQW?]_MU r ?k]  /x</~t yNvMrD+(?xd*(g+d'mHXe7_;+&c r9.k usF< *g#P| 8a~AY+HcH4:0x ND  @y l]d(3UMissP6) TxW{4u{D;)k,@lr/N, (SbsV#>E:vmq1^)ko z#p @qWTZZ]3$(S*g (#v)hcA;C8!G\tK#&R:ysdfgu{9i#o&E 1cMKyD !:|CX=4$2DHC5.,2,ip4^llXRUj`=)TztV>/Bf"B>*\Wno]!keio}iI$s/gN}@'\Z;Iq!z#h r+| Ioþ@$Y.*9>mk'zW 9 7 }  Q S X [ R  ~ < -  O }4f t 4 a,$XHPJMMsSJiy{c7? v7"j4aM [1d-2 CaUsa*3H5Dr  $v ;h󼝮b.ʋI,:Gb3:& l / I  V q t } +X d# p '  3+5Mm}5:qT~ 2n bc1e|G|[c !"e|vKCdV/ {S   ma#m8~% [,`M:[\]lrs7a n 0 % x M Z l :   R )2O9&LH*  w d}i'rQ:9hLz u,s[ q1C&  m8+Fk)UC  8*PWk^,Nh"  ,=(- .R6f_@te 7Sm e^T#i0 l    -    EG e0X5Ea$uhrP_e{/H+[ WZ& -Y{kEH{rsu 6e *f`t#f}liu ''r >HLF ʲ?˰Ո4"a0} @Cmy  A P N '    5 7 $ ` H fw 8 f z DUjqJ+p~Q-*a7.WoPN}&>i m:aK< Ny+Kj,MaB+89EID4 a a1 ; Q*&l"<Σ/(k jTEbX$~29:> z ] y r 3  , C ! A B| A v  R p|eUG\v4h%|(k`d0-OoR&{+^MlK?a*>8&j& /[|<dV szA?Z~LIVHi Y w E{۹>ֽz'Ep%'R I r } ] ( { ( h O ` 2 O  |  : t R IB xBBv$iE\ *~Cwmt(]EvFa54pSpsV0EU  g  [ R eEݲ3ͶlȖ̢y /sok3 a ' B K 2 : W < d A f \ b  < ` "&/<_B"2_\oo4-%k3avWZv/\JTYHhxkR4= nI0(y #  \΋9y҇xl g0$Ofy<X 5 k x V C | k ) N ? u 5 i ,AU]n:]!q,'D!u,jHu'}1}p^Y>O,h?f 4LhN-B<%*SJB*#)X= c+V l l B1k٠Ѐ!z ['u}eFBh >&H7Y l 7 > * T O & 3 n h  9  a  G ]fqsehm@^rucD<x5:'"?O^.3Hx8j)JIG{~4PH*Gj( ^ q J ~ d O EہҭF"}_$$nMJl _ R ; ?  f  | R U ! s  <  ) Q wgkf%S,m6 \s-`km{|#/D,f)Bdzw(&f,L;jA.y  Q G [ݢ"ͼȓY9~Tln B  F N :  u  { W V z ] D  x & F g $[ 'q4e#/yYFq2*<pp+2 Z"Q&<lF>f6Jt&!; SK< 8 H .  KߦΕK}˿ܾO[22/Lbz.^   = B " = R G b 0 e  Y z : l 0HC?P1B {:O U>f:Hf:@(!TZ3`y6DZ  +5.;@ Ap2hB z # _ 4x)ٲаDUʞW7ihJ<9eA);*- [  < 5  W I ! 3 v ^ d  =  7Vx*HlAXr~Nyv'B`/J '7t3Z2a!@!@~ g[@\$ s { K o۵˅]ɖRkOrdN}2t3 7 / 2  e j I V _ `  4  & Mm]i7 |1CX_GRo=MnZY_Ioe0S-B2Z%B`wl%l 8j#>yO= @ a E yݕ/Ƞh:!N_o& F  4 :  s " U A s a 9 v l # H k "?]|!o(f[Nae5eXs[c&A*~T1\SZ:,P66 Je  {    m P!ߤίcȆܰ0K-& n#X~O_ 1 S q Y 3 q n I x 5  : t  0=..SFpb6P5: n+S\ dZN'>W C`|i$Oe{|lRfL,d)= e q q ,  6  YٮʙȷA>4/*!(O*R TOO 1 ,  Q b R j    o   L ; b}5GLCSY>r^ }D]@<<&* :5rNnF(?3b<.hul`y_VkL [ m 7 HBۓ}hɾΟSwv~J]E%G J , f { V  L P 3 R   s  s (  = a u}Qt&x2TPT;i'Rh)|y jee$|"F|6gc D,@huGst$ k  X D :ݭ^>Iաb)6 -j?' 9  5 7  o  l F I t 9 z 9 X  - T | *M/\RCXOj HA5hL_ '*D'l$K}rmv3?3cr y@  tIɕܽzx]I P\P  , /  o j X = T ` ) V 1I^wR2r?= H"%[|6Cr5Ya]8mcJ N}#ToaD]"5$ 3=BC;@c$*t.E m q N  WhfʏQ2 sD5G\sA:L* ` # L F B H & , w 2 o & w  N~VOcIcfNI[#] TE2 ?N%/<(Lc5<R<@wc^I~YMp< } b b 8 ;~ɠZ h@[=<'~ \ F  3  H ^ F ^ p ~ , }  1 ^ 5s[vBS\ [@ U|IX%4}5]JY a ;UNs#"`(]0PEN    F#+~Dalߺ0E}-aEXk " M ] 4 $ e S w G z % a U  V 7G=6AYH?~5 TH$kf)q,Ar]m,K 2  V X = Q " G %  j 3 Qn{:k)_'f+~V q8u]F%1?R0:+c;l { 4 /qy  d Y @ Q }  U  U  D e6u#\LyxV NJu&q x{&yv0#"!O'?\Hcw S| ?&Tzs 1 ` E M9ԕ<̷޺9o!U 3Vni?=)/",CDx(( !   t zE(PJ_C'%sZD&=|-w{;f & D L ( ! V L f # X E @ =OXQd.7S)G4z2xMT NPFJ$0~-Hv9hR,R/I&)`ehJ8.bPg.\4 | t N FFni1IЖV!rN,5^|wQ4$X f  C V < 9 S : L ! G  5   3RrL5[Vv( Hs"j]P n <.F) >{.Ic3 0$FvZvPF] T z W w f W ")G̥9K|2u~n0H\F P  8 N H ! |  [ ] ~ ]  _  H  6 e \Zq%V})|U XJ A:'8%/0i5Or aW*iaW!TD( > \ G D 8 oͲ.O)7 =@{T; J  0 A 1  Z j G I y `  ^  X ! D _ |&ql"jUu#lHbLgg}. $4)'T7Tr8  <wsToAz' e Z Z & ~k کMgɋϠatI9`tl2}YU*G  G [ N  S w ^ q ) Z  ?   G p Day1M MVU{;P n'6\D;/0gC %HxW[%+m e;f5#  B , a2̥gqH!+X:..V _ 2 d u S  R a ; ? p i  n  , " H p SVn/bU"p>8 !#%&.,00.20.2003/.2./3,/-,()#($&&!%#"$$##"%!##"! ! !  $%.15<>@??72"##$$%&&$#(%$$"%!$!      src/core/edu/xtec/resources/sounds/finished_ok.wav000066400000000000000000001004401335566474600226650ustar00rootroot00000000000000RIFFWAVEfmt "VDdata  %34=(B'-lI} )c<i?S+;iX c+%jU\d!izs{Ha#psf O#visw,HF_8%$*m\6 -LY|kKWH<a:&xK$ ) }1P8iU-m0F"LX<F.  +2e$-Hs+Y?4iH%/-:& ȝ w;HO#hT5a?<ίQX"{ 1ob 37DR53. 'qlư$'F L& )Hv5w@ T@Nds^޿<Ѥ"$ @b " )B7+ N Y &W%I5Md[0 tCG.uo   ;͔\5׼S#-b>uQGV), +{q $jȷe&:~Iua=+FJhB(1 zk8lŊ 9W (7JIV5$#k  1͒r!F X'BN+B|IE5S)d_wTT[)6˕=٬ -AMG3#uG?#' g ^|(4> JH?%0$"X([ґԆh x֩I& X8+\2w+%g  G{Nz'TIFX*&7 DC=3r'#  b#1nʥK>bQ"1G9Y3-&^#M;";,WG/mph'290:5/-)"jHT O#~ `:$.5<62W-=& 4Iܛ.ЭC   %/68 5t/*##[~ѥnJ9 O25%c-3541+${XJժQ_0a0#-{4O8+7 2,2& #Q5/$QQ  G+3|873N-$L Eosg'v:`Д  '1894,$ Iރָ̳H6kIMZ'06-6x2*-'  cn)ӣt֜sXa'(04V6t4O/)# {ЅΕW>܉%HN@d]&p/5564i0+%0 զ1 СD]O" s$0.575a0*#f .#B҂Յ,dQ G)142-Q(" )3YE5\^G%_,/h/,'!c?i IjaAљNLS?#J*--*% _ w z(:; !?)i-,(1$;CHnK4݈uدG%8e .'h,,z)$l ~* n+ZةEOݚ Oy y$)T+)h&" eރ#'ig s  ;"')'f$fzw,<R ݴe &)($u ""V5(Sٽ A%''$q &|8]YߨCڹڑ#s5#j&h&y$wS_kX߳ޑlU) gv $%0#  P=h_F߱A޷by 6!#" iG >vUsqްUfho!"!/h o<|!>yaf !  Brbm}[?:~ z\ 2u&8XP R iDt`1PzMJ [{( &yAUff Y&, y#} fc?xkYJ3z a&  !wA &1mpZ z1%E P>QHd3e9p6J [sj/ tMzWl9L9 G&KvB ,Ei+pT  Pm4u uD"=HL  h CnL9~f' (Y9d% -,|BrZGw:  ?- T^`]zAD/*z2 _ w s&2* t! ]LG_ 6t@B3usK dRH }ImC P ! E%,-sp6d |!9 Q1>xYSQb%98 ;kp  n}S38( %B%G 0SF7[| 'U/[  W0`r gs+lE8?{K JbI) gUW|n ( '_^ G \Dak-8>3K+  H~kV09  3>m|b"r-H1.%$ ;`jrL , ̌A 0p"y'}'% 6( ʈ==9!jV-C! K^}6˞ {=0:z ;;G>;ۏn Q8YzGGB&:mY[<Δt; W*=6?>3 'n 6GآySL Z wD[-N>i( %$o΅†܎75OPc/'':! /kDI)ͻ 33D_Az0$ K'!-`)<_ gxĻӲ% )v(A7wZ*U`Xrtޜ  5-3M.{ Y[BB)ٔX;M[!y#A4F3qBe BݬNߔ+%*\F=E8 &D֏[fT9* z"w*%=4CTE_,: V*ǯ!캬Œ5 "%&g:TUN+5|u|ו™3Id`#`d`u T^.IsTRD5y3.-#3w`/И^!WΤ)=GF=62n0D([7hb]PZpg7 D1: ;1(<'$ '-G4N̘`^(3/)$*>{{|7ػѾ b )/.%OO_ݨs' Q$1-84) +ڹ]QѦЫM\ M*i8?=<4V(AmԖ~͹ːɲZa /-);oCBM;K2(YjU]֗EĿ3#UHg~,;DbGC;2'N Q^ƒտΓI1y(b$1>SD(C>5-#\ "S=İZȞXf )V5<#=82+H$< 7y;ϓ:t -z3L407*$g _XґY_'..'  xqע))dQ  D(n*(#+oHQڑOןػJJ -( .0q.=' |ӳБmC$0*&l0675U.E&+ʏ5q 7(3=)AK>+7<-"S QҊȄK Ƃn{ܼY7#w18
D}g5{$ ((U$%((3v۳ץo0BI SG[l")/a/*$; gu@iV؝q* !+131+#y9E nGi%I.522v.("L>y։Ҧ|Cc'X#k*N-4,_)$6 ٸן?V T##r" Fn9Z s,zg e80 q>%# R , nACx\J wt^ < eu%w8Ob:$1~ tn :[(RJ5S/dAs T4Y߂F' Y #z# `#"rJl&*li#$p# M~pCtO }> !] _1EGJdqT="Q; 5;u ]^ILc (UW ( gC>R .M,J>|f 4 A #|)]0+HT>zz e ?E 4 h5bDH, (m d]Q(bq>zMS }bA`WYW >HD= Gi  gE(5:aItp3'  gd m7'n  l  { C 7 V  {ty^b4 \ gy: K  6"'Q%AYL c<x6 P =6 U l oZ2 E?M] po@KmZkZ `1XSA:VX;S0 rx  T!M.ZeO*'X< i!N  )n-t[F  ~ 1j6L ehs RAO 6 W 33QK : < m*Epxi4 "o  Z)k~tTˠ ,)0I7hW=7y@,:[wڬ`J*1fiԸUV|O0KaZL.Y!`$ 2wȚ۵=at 3OC@,!#&GalލӞi7%1c9'- 9^ӊNa*Ң S4=7*e }dX ΄7%Ӟ &*9>/SԌCl#1 n?4@?/^T *ؘӡ%[ԙlH1<< 1(Ph&֥֕9Gp$p3BSB=)WhúĜHâg7s !`6FRJ?2&,լXUMʯ$%9=HMH@79+[ ݽu 5.ABq=6A4)Lyː ~ӂq&8 m+L-[(!= {}D* &E  $"%o $*[&ޙF#*,'A^'׊)#2X $0.2s1)6 BP5WPj"F۳ 08#-56.?&)a,H;ixTt+25 940) N_w˔˰ϲ4>!,8@=4_&Z YęŠ'9C}F@7],u~\1zwDDTY<)*9CECE;18#&UgӾ}vؒ| %.9554j1Q* "=G>րՌe߀S0EO%:$" uBh~l Y] o:ރ, 9|%(& @{Y Թ7nTP W-"J*C/0.)" 730ݴz҆Fd'S&/%2-% %ܾ9՛wSV`X "-10*w"_MnM ?Ԇڠj +34/1) 3 ߇f|̚ˋ( %05'50+" u)ϘXs؈_ #,0/;-)"} ٛߤ'ej *c$"N> ~ L;` U `_ ` aba'-]!! #" n,siܹ f N1#)q*6' #l iIؒad#('j#LLU1`1w _%=&{# Pq "|ܪݐROy"@&%"i ۼ2ܬ*Ov!$$$#])|8ߡ#j )di,N oQ  ~i+hbC}V{oF:J&\ E d q4T0y:?[ .5 s  5|x :<4 CnX2{YJM~ yl f <B  @"&,^ P$ >b|q*#13D*<gI L/Ia j C \F ;p jw}48[o6V-%io 0Y*b! q 3*5D8Xl "4D,n " r8s b~{t7J(Qz 2 "dYx1t =$ q|D)U DL =2-0yz | ^&  @ ^cP7F`.o ;0Ic8 qr oXX eWm F>X)f  T_K w@r7|* cb%`Pt"3 H  +f"vJ9 K dd VqxfMC{>D 5$L W x2{- iMp  ; COa4X}vDsZo0m o | +8hL^P~G? g>  srTM|"b .3ZfB) a1cPP ?J1JFL^H=eg1sB|ZT iG7$>:>Y!t$RD7W !-W!7Uux5l*> L*7$Lx -ܹ=z6@#$(עh0 AN*%5+ma'2& jo%+_ i ZF#U) O*eH|#RQ'qG"60FY6" R_A ; (|8>#X&8R] V"jgް%-2#/^  brС̄/H"5-?/(`ߦ %݃ӏ+4eE58CS4 _0ԺSڳ.9KX0LQ@[U6℮һI5ݟ5+! "0EMC$R4fֽџc!8%+JA% " 8}ڠ Ōp"'!BI G#w Ec]Jɼ̧hx@#4F[(K2Au;(YÐ( +%J_I`UJ3+O!A u2Ҹם #CFX\OD`:{1BYT~_ŴέTNd-@F&>740C nWZƻ՝[ !340,) 1%ӝsɖݫZj&W150)##G ;fT&vo'&t8C;3+(#i\U^Dž#R/Q3/z+%(^% 0@Qi<5$A,*t%="Mܰcd#'t'#"6)Fb"܀>f;$T| W^ g![(o JlWߨ6K ?3 )+|% ni03ϼԥڶQ #r-8<6l' Eёz»1 B-9k@s<|4(f v{ҫɝYK#1u8*8\2Y+ ]dbVڨҋY;vq!-5 5.9$OИҥg a&2:o:1 's҇$UaiY>L&(5>?8S."f*öP`.:=*9/%qQֻ˄¸*ͮn +x8U>s;4*yg^DzíÁȈԬT$5=<8`2E* \پυ5Ћ/Gb(n253q2P,#&MދҔL !(&!'H$ T&0iF *_/Ln -$$ q [Mۗ۳Kja&):&W!_b b@ړ,g|)r  W95 Wv$+@1p-1# lI Du  8C&[zbT)U 6 g, "fJR!"OA"2h ߸. wJ%*)'`! :غu $%z#Y .Z IWm<eIVWc8 K hi O *h!# ?%hChV#('[$6,RAق~۔= s!$E$!N p{Xd='CgfqX+" 'D UL(Bx1KS \Xd ^>VZ D O vio/HP | C -VgE, <n rt+_P !@ 36niW F e ;G/tYEPYE0S6Ig1mm @ ) a:&}`2zQY 0}  8o.n^&b  qp=: X>28s,o' MB5z :N `-i PaP" b!Zkmr[@y zDTMT1 )2wh l?OK'!/'\\8 `?KCu. 9!!- Y ni|nyo V@eO lg)o X  [|8gml o V u )y>5( M 1 =.Q10Ffv. "%5> W 9  QPx 3 S 8!t( J] }+uqW$7_X74M}L@H! k  %Dolq z1a- (em\u#@PFz3HiV Eqme "!m dQ lZFm>p1]! @J$|;TfR HUv /W9G.%(z i|  e 1nCR N j%HI{\$ٕ8+?45i>W}0( QL< J@vF"b4-5 ; -Ȏ%D8D?k;!SvIs%4] OTMU) Ԏr_ފ?z:$@%)!o)%(ǐ,8Z($s0%Qʡ iO)@" "q#uF o 14  ='B 'I>1 $: $9ET+&   cLkx +CF)e vTeǕqԴ f%'?^ZURZ+r=cGs"Fr\+P5'") ; g4W"i3pK?&%16#A.wۚ`005|\$ 3ۛzR ,'y\ rAkHF/E;1,x0MټZR ,M>@a1` ف)L.4 & &y:IKG7'Qarl(ANJV>)2" )֑Z7#V"5?19)wc::T,3/H+Q' Gn`#H11*$*|@ e؜-! +7M91(KaSYCi`ܤq3(1/("Q *%Q#'m+'h&ܖ"ݒ!R-67.\С|ťʇ'n6BAk5 $'Nl YĤ̢Fb)2:B?T5'DJiف,NCˆqO.2>GG =,WG|);E F@5%?oǁ|> !H2:C;o7i0v$^(pjОڞR%'+)W&'!* 2]ލ yX i1M ~T#"7sӘ= m$&B29R7,g*(=ʟ/mBg$4=;1& ,֙`˨ < A/8S6.%v߿(vr L1-96/'} ڝɴ8@]'/Z/B+%K OL92eE1t Np6n, nCcQ y:QN_ j fQ ~\p;. ND-#U<k &Yi #Jin^cP u"v, #'#aڂ% # .1f.p':r۵/Ϊ|_ $+*,)@#Z a%\K}l G9<5 w_VI[s Ed#yYR*S  %|ew:p/bk!FW]FX + JSNj O qwZE  ^%f l 1X#&!$j  J;}A>DڭNbS f %&x$sh %*'߾+y E\Qh+Ce~ VM Uskzv S s H ,N~`N 12  }  ;0aij|, |T zD:*[[j:F%  (!q] 24 84PI_Ks@?q;O5aR ?U#WhLo^WVY oI7N9 >s|, lDQfX~%M7 %d " yxkV /7 E c3"b-K` >: -S^"Y!(%$Gui-g@>"%a%K"I݋Old S n cZ(  z vmBdP;  M  *_ } B h1mhhzd  ,lC :" >xR 8f3 l' VpEc mFvF ;h*8@ >O r "+TY+ &b Fu lKAu T8 * 1\o9+C 2+f4V \04 ?:Z`PbpN?G2Om<, M ; z ?0`GIG VJR \vUk yw.$|XYq4 fd O[[;tr=}cn=e H U~ m,2T y Y . V$nG uRuusBkPY +  p ?CYn;  4~*& 5On-|v LSv^j? 3Y 4KzJI B7P#'/\c  ~R_?o*: 1C)[28 vx_v ]M!^mFW@ Q zj :p %  89pgEl ~osRD_@ # qVBs  4 =Wo/| ^D nzJ R/, }iv~/-R; 8sO*i8 A THdGjk3Nmh)Fs]>Vv? Y  -PS L]yH4 6M L  zA] g=Q^T )iR!pEl UH l/z= R }3 l59^ /I x?F]e  N(!^&s  ;6GO1Oq t x6$F c"tzQ}DY % @ b o*+n KU * zYw62 58$8E  n !c";BM` jwYs?B\zp`BnNkn, J kK9gU?  P D -f=uK zLp 0sWWO}Chj3 *X8:P7 -r 4@ .k 7 Z.cNPS   V X mT| yGP  AXdQe>8 ( @ bHlLRI < ;aJu}G=Cy% Y t 0% eh #Aa|!V1D '5 x6fR V g : ]OX@ 1 S,P%-X2)8 Z ^_ -EHHsVj;+/i w` B c R@22aW%?cXq '( DGl .7 jD)(?a=m |^V Joq9 .$]8~   xy^0Rv B \2BC;&.\!N?]e8>BgeH+aU Nc%;4=N  . PFXq?Nmx T w^-VCQ&hN5 ^ Zn*, r  j `L`_6r NDa 4_USvcKo 3 a=AadZ1*A - 3 ! 9Ji  /ibEG:hs R~ myqX 0 gE"E2 ",HN/ H e l p. F:.V <Y2 I:i E 9W^d_e$ mqd9*`+X^*5Z[gF-.ba]R s rLF(@/{ o 3  OOK ~gAcm- ; ; Q m}n 4e , u 0IkXmH 9< OJb"  Xs\j9yN3n<0gaJ8=*rs cU.)@: []7OB 7  h".6     TH)R \-y gK8  !bYBP) <(  9+yYX& ] :m{@t;';{~tI+=RP2IiS#skOe0ydY\r g  k<@mHU;P * C-m:c # (&Gu%h M &Jz  jmRf9 g Q H6nv KY%D|G-%TJmu/!qA{@9$.FQ  $ eLNz0}T^1 v0XEH/;h:  ]  Ky@xi   m -7/4   \p`8F&pRVIxvOey'$$-l. Y0Z;I?])Vy3l_ \_ne9;tRUjQ5`mnR~YLWqmaA07N^t1Ys I l #["qK U  ~ !NJO#t] N bYS P/DBw?c>XEiUL $4 w@IC+X'aa(]'Zn$ x%E6, 0 #K/w  d  yeqG> A 6agN:/M;(&?4Y ha}{S#J[x/Y(`m0R\Kh9]N\Ph@I" Uec`&F:q;3! r]>[#Lmk? k,t.=QwY[&t7Vt gkid|^ d x>+tE M?&G\W*,2DY,|v H5NlfU d:)EW}0BS:L4!]"z&  0[t Gb&\v{#l}M|Ma7S="Y("YfA3DUZH=!!HItY X nz-OH+.J K VH1p+Mz,fd B#nX5&n{0CCz3U$>[:>)W6>ybrNC6j#v( F<TkOT7yCtYq\llR`EO + ?AMp&5jv  SX U >ndIsne6!OyolWDiWI p M"*s$&VG -;~%O93ClQXL"xQ4/<mZ bC$@> &f>w+pg  $#!r I"LCCAU$BBn^s[r{(d k#Le#<phT$I*u>;^{9v"q |02;bEfq|}huFRDwWN(z"0"P!tqMyP0ph*Bf.<}?GOYH  *qcLR~/\wWnr#yNP>q7t]c+L X x1b.Oq!AiK!ZEn6|]8@b{G`3y5KxjUi%ku{ * i5 LUE2adL:L$'~p&cG%zSwzj| UVX6xl 1LY[@hJfgBU:Cb@ 5DpYzpaI>VnxU6q'67y&NKW$<v.!2O9 0+rb+LulS]~ b>KG1,MzT]`Zek qR9]sZo*!pu!x-<kzoq2,!mVqCpRMa@aV4"s>lZ9?$[M+[tLt7(!q?z]Sl *<KECa v sI,O 8L5[(m>UE?@~x Ve%1LZ-.XiVKsrc/core/edu/xtec/resources/sounds/start.wav000066400000000000000000000400641335566474600215450ustar00rootroot00000000000000RIFF,@WAVEfmt "VDdata@ &  6Q T-Ss@R48{uSe3 o!J `PH^!?bsDU?//q/7%6T^7 9 ^})Rj ?9vD* % w6p2qK qeG< d Ih$ SPK$|"_g*+%ef > _bp7 [h[i~4v/LLu u 26+P|  #&%L0c@ g SB#%$&wE|~@ N y kq'=h1$ I`ICZ P1=+{p*=Tfzd  x +`KwP&-CAc w s \?7V6p _;$T~?v wWat| uD}c : [U56J  s rh~hNwTjc  Q  wI' e<_ 6Fx0E#8u}) q. "G!m!" F!  N[~,xݺE/1"[#"" )wRXUS[w;o< b  k/ xOC`kmb $57 %هM0mmn ^#y)-L0621-r*$^ y_BɚzRhԃ?Ec+/*R-5J44&"& =&]VվӢ }/ N 4chp{UZ(*[Ixn;Vz& )|# n RθjrЀщe|:Li !&289d< B?2./S'K{yeڕ;:-H',%!xSWإچףV+ -EZ ; ? pbYVvz L%(l-t-(b%# g^G.ƛɳΜ (2>]D>DEIEFL:O2,,"Z"df'qYI׿,^ (/9:>a=<;8z0(sd n٬ntmz2 D N7! \*I 1 ?F1!_'+.u2|1+&S!s k7͔{ۼv J^i' )4>SINgOONH? 6) Ra;(S{( CW> h(2:@DDD#?=:0N([Dە"Tϊоԥ#x!'!/C n_.s|5-G #,1(5663T-&p(*.Ͼұ *7CLT~XUYWQIt>2#n,e{\'ƪƯ<Тܲ <&1;BFIG+E>!8-$ v%^ٝԊ{`ҪMM NCmRC /.  ݨ 9  #,28;*H>;G7_/&#{ ˇұl\0 x!.;HQY]3^[UMA5%dZɾjUuҬLO! ^!*M4Z:>@c?u@;@S=+92*  e^;%j6Ͽӭ < gfm!#]$#!_9M? ;#@q]UJ/k1gM\Q;*+t#%T()$)P'#W\߷]UͿ.شQ7 %+-15/764>0<+# 5Vly֕ әH 5  |jf26 D jz"w"BR\ZY+tu7lE Bh 6 N = 7/؈7&ߊ|s #([+,,+Q(#M  "i@hC>VFW Nrfm$.p: Psv`O304PN>s4<' -6b= |miE  ydkFsEb*C` J*d!7$T%h%5$!nKd! 1q ?DmS8 -?v9 nM0qd$XyI^E~(edO4 M %J @ Jdn" !<4il  mR*-X/"]lQ4YpHw a E L ^ x xBGT6[B%@Wmrv|t^_OXl>i[c2D[`QVmLrSn ? 0K L 5  xp#mZ-[[IB { 4 %)igKPFQ$Z5f*Q} V2a `6<"v =78q0-5 #!ߪYbW:Cd1Ru >!J P(c h&E $q}{|~y H _y@[OK`Xu!{|+*wd%# k*݊wGG*{ ,2"&$  1B]^k;b30 | _  O&YSz\G? < B*dEp i bp #" [ Qqja<aQ0M/ksm|IaN' >%3N @:&{kj\ek-KcWV X l(  nt[#O|  YNJ! f  ' oXh64 Gs ?  8ae xݖ3Y' g"'!eL&  5)b!;k P +$y'(q'!$ .4ߐIާ`2 7o9Y _>  N NA]Su dO$u-6:;80D'" `aY8aq%" (+;,*("`g B D 6 A Y[!WͥlIý^W, 4B R[Ya][SH7[&u]qӖޯs̚I~($(*=*'y$R/    IWD߲d*?pʋS+:KeTZ^ZTK4;+_پźp~ծ$L*-.y/-+&"pM  jf1ēkŮ̉,G+L>XIBSVUHPAD7!%S_ZSC(ªP=1T!%('&a"7a*K X *{*0cjA >#5@KPQN DC9o'$z?/>M/#*.z090,)#vu 9 R^PP+t,w͆-ݟS '*6xDnKPOJA33`%h:~ͼ܎>>V%a*x-.%,)?#*a%c B/e-ݹ[O$\3!,{:BHJG!By6*r D07b÷O c4&|.15i8c97=2,^$HBz |de< g ׽Nޜ,Eo\!/a9/CGIDFX>4*&N ĊQz! *l2687]2 -#N \7h=is)gsm?/6'0;@,DC>[6)I ؍%ʳz}r~40+5;>X>N93'l7%op8~K68<8<(%,|3 6&6%3 ,#j lT?κŽ0~Au ^,'`27;;:G5f.y"GI &w_jaTyW6*/y 2U+&-120z+$j m$9콡ҼE-K5;=9<7e.i% (Z@!\TO g. %*G.\.+&{$E[k±ľfB $-3|666&3+#v| ,28+dD'-$^AN#;$$'c #-(\,,*4& k[?cDa!էSk>&T05"87C3- #= itjmP65(#Zz$!*++("zM k8?MޢM8g'w-120,$$ 2]n$I7} J@vU h"]'((f&8!;!3Ma+.Ζ{l.&-E112#17,& ) uk6YdG0~}qKVs %')s'#D Yה4eϭV< b'+&.#.*&,0Z!+.a- d"K')*)%d 4N؂ј|ɦ|F8"'B+x,+m("i~& N 2%(^+*'k#4 Bsߔ Uj~@ 7zC_ LI HRn,eB_t;/ x"Z'+,!,("UZX##1r0 [o5U sQF\y[8wZ i#(*6+(#o( 1psFկ=x Aax;8:3V S }!ub13~Z'-4%A)?+*X'"x(+ n7ٮ| x T6br  2t9G`fY|0 $ ((& #  :ލك$lu9 U2?x 1Y{r[A v>!)'~))'"^ 'g.٬DQMsa] 3Sd  :`IMBOJQBuTM !%&&" $GV0Al/Y43< {L;C/Z0Hs7S(T"&.'%" MT koewZ3y ;~h y#:9` |x 5))hD.  R npig5{ + hR  X>oFh'@Fr^eT < m Q \q%El)!M>9Jv4[;2p|KwcURgOq"< (=PSHCF}!H">Dj8JV }Znn0LQQ"N.iR#_CW2}r(*3L5{MXE;xnOVKULl~q{Be|2xD1@t_)sX(~M(!'Ylpn|3xdP?re}7=hnJU N1(& * EXAMPLES: * *

* Creation of a new action, with reference to a original key: * AbstractAction beginAction=new AbstractAction(DefaultEditorKit.beginAction){ * public void actionPerformed(ActionEvent e){ * // ... * } * }; * Creation of a new action, with a new key: * AbstractAction prevTargetAction=new AbstractAction("prev-target"){ * public void actionPerformed(ActionEvent e){ * // ... * } * }; * Action that references an existing one: * Action kitUpAction=null; * AbstractAction upAction=new AbstractAction(DefaultEditorKit.upAction){ * public void actionPerformed(ActionEvent e){ * if(kitUpAction!=null){ * // .... pre-action * kitUpAction.actionPerformed(e); * // .... post-action * } * } * }; * Actions mapping: * protected void setActions(){ * // get existing actions: * kitUpAction=getActionMap().get(DefaultEditorKit.upAction); * * // actionKeys init: * java.util.HashMap actionKeys=Actions.getActionKeys(this); * * // build new ActionMap: * ActionMap am=new ActionMap(); * am.setParent(getActionMap()); * setActionMap(am); * * //Actions derived to trace (only for debug purposes): * Actions.mapTraceAction(this, actionKeys, DefaultEditorKit.readOnlyAction); * Actions.mapTraceAction(this, actionKeys, DefaultEditorKit.writableAction); * Actions.mapTraceAction(this, actionKeys, "requestFocus"); * Actions.mapTraceAction(this, actionKeys, "toggle-componentOrientation"); * * //Actions to disable: * Actions.mapNullAction(this, actionKeys, DefaultEditorKit.beepAction); * * //New actions: * Actions.mapAction(this, actionKeys, beginAction); * Actions.mapAction(this, actionKeys, upAction); * * //Original actions mapped to other methods: * Actions.mapAction(this, actionKeys, beginAction, DefaultEditorKit.previousWordAction); * Actions.mapAction(this, actionKeys, prevTargetAction, DefaultEditorKit.beginParagraphAction); * * //Uncomment this line only if you want to hide all other actions: * //am.setParent(null); * // * * // Assign keystrokes to a new action: * getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_TAB, java.awt.Event.SHIFT_MASK), prevTargetAction.getValue(Action.NAME)); * } * * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public abstract class Actions { /** * Collects the keys of all the actions linked to a specific * {@link javax.swing.JComponent} and groups them in arrays by action names. * * @param jc The JComponent with the actions linked to. * @return A HashMap formed by pairs of action names (key) and arrays of action * keys (value). Usually each action name has only one action key * associated to it, and the value of the pair is an object array with * only one string, but this is not an imperative: several actions can * be associated to a single name. */ public static Map getActionKeys(JComponent jc) { Map result = new HashMap(); ActionMap am = jc.getActionMap(); for (Object amk : am.allKeys()) { Action act = am.get(amk); Object o = act.getValue(Action.NAME); if (o == null) o = ""; String name = o.toString(); Object[] keys = result.get(name); if (keys == null) keys = new Object[] { amk }; else { Object[] k2 = new Object[keys.length + 1]; int j; for (j = 0; j < keys.length; j++) k2[j] = keys[j]; k2[j] = amk; keys = k2; } result.put(name, keys); } return result; } /** * This function is for debug purposes only. Prints out the * * @param actionKeys * @param am */ public static void dumpActionKeys(Map actionKeys, ActionMap am) { for (String key : actionKeys.keySet()) { System.out.println(key + ":"); for (Object val : (Object[]) actionKeys.get(key)) System.out.println(" - " + val + " >> " + am.get(val)); } } public static void mapAction(JComponent jc, Map actionKeys, Action act) { if (actionKeys == null) { actionKeys = getActionKeys(jc); } if (jc != null && act != null && actionKeys != null) { ActionMap am = jc.getActionMap(); String name = (String) act.getValue(Action.NAME); Object[] keys = actionKeys.get(name); boolean replaced = false; if (keys != null) { for (Object key : keys) { am.put(key, act); if (key.equals(name)) { replaced = true; } } } if (!replaced) { am.put(name, act); } } } public static void mapAction(JComponent jc, Map actionKeys, Action act, String key) { if (actionKeys == null) { actionKeys = getActionKeys(jc); } if (jc != null && actionKeys != null) { ActionMap am = jc.getActionMap(); Object[] keys = actionKeys.get(key); boolean replaced = false; if (keys != null) { for (Object k : keys) { am.put(k, act); if (k.equals(key)) { replaced = true; } } } if (!replaced) { am.put(key, act); } } } public static class NullAction extends AbstractAction { public NullAction(String name) { super(name); } public void actionPerformed(ActionEvent e) { // do nothing } } public static void mapNullAction(JComponent jc, Map actionKeys, String s) { mapAction(jc, actionKeys, new edu.xtec.util.Actions.NullAction(s)); } public static class TraceAction extends AbstractAction { Action bkAction = null; Object bkKey = null; public TraceAction(Action act, Object key) { super((String) (key instanceof String ? key : "")); bkAction = act; bkKey = key; } public void actionPerformed(ActionEvent e) { System.out.println("TRACE: " + (bkAction != null ? bkAction.getValue(Action.NAME) : "") + " " + bkKey); if (bkAction != null) bkAction.actionPerformed(e); } } public static void mapTraceAction(JComponent jc, Map actionKeys, String s) { mapAction(jc, actionKeys, new edu.xtec.util.Actions.TraceAction(jc.getActionMap().get(s), s)); } public static void traceHierarchy(Component cmp, int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) sb.append(" "); sb.append(cmp); System.out.println(sb.substring(0)); if (cmp instanceof Container) { for (Component cmp2 : ((Container) cmp).getComponents()) traceHierarchy(cmp2, level + 1); } } } src/core/edu/xtec/util/BasicResourceBridge.java000066400000000000000000000033201335566474600220240ustar00rootroot00000000000000/* * File : BasicResourceBridge.java * Created : 20-feb-2004 16:08 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.InputStream; import javax.swing.JComponent; /** * This class is the most basic implementation of edu.xtec.util.ResourceBridge. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class BasicResourceBridge implements ResourceBridge { Options options; /** Creates a new instance of BasicResourceBridge */ public BasicResourceBridge(Options options) { this.options = options; } public JComponent getComponent() { return (JComponent) options.getMainComponent(); } public String getMsg(String key) { return options.getMessages().get(key); } public edu.xtec.util.Options getOptions() { return options; } public InputStream getProgressInputStream(InputStream is, int expectedLength, String name) { return new ProgressInputStream(is, expectedLength, name); } public void displayUrl(String url, boolean inFrame) { } } src/core/edu/xtec/util/BrowserLauncher.java000066400000000000000000000127751335566474600213010ustar00rootroot00000000000000/* * File : BrowserLauncher.java * Created : 02-jul-2002 18:22 * Remaked: 01-Feb-2011 17:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Old version was taken from: Eric Albert's BrowserLauncher class (ejalbert@cs.stanford.edu) * New version from BareBonesBrowserLauncher, by Dem Pilafian enhanced by Williem van Engen * Adapted by Francesc Busquets * * @author Eric Albert (ejalbert@cs.stanford.edu) modified by Francesc Busquets (fbusquets@xtec.cat) * @version 15.11.27 */ package edu.xtec.util; import java.awt.Component; import java.awt.Desktop; import java.lang.reflect.Method; import java.net.URI; import java.net.URL; import javax.swing.JOptionPane; /** * Class to open the system's default web browser. * *

* Since JClic uses Java 1.6, this class can make direct calls to * java.awt.Desktop.browse */ public class BrowserLauncher { /** Added by fbusquets - command that launches the user's preferred browser * */ private static String preferredBrowser; /** * Added by fbusquets - Key used to store browser settings in properties files * */ public static final String BROWSER = "browser"; private static final String errMsg = "Error attempting to launch web browser"; /** * Open a URL * * @param url {@link URL} to open * @param parent parent component for error message dialog */ public static void openURL(URL url, Component parent) { openURL(url.toExternalForm(), parent); } /** * Open a string URL * * @param surl URL to open (as String) * @param parent parent component for error message dialog */ // @SuppressWarnings("unchecked") // to support older java compilers public static void openURL(String surl, Component parent) { // Try java desktop API first (new in Java 1.6) // basically: java.awt.Desktop.getDesktop().browse(new URI(url)); // Replace whitespaces with the URL-encoded expression "%20" surl = StrUtils.replace(surl, " ", "%20"); try { Desktop dsk; if (Desktop.isDesktopSupported() && (dsk = Desktop.getDesktop()) != null) { dsk.browse(new URI(surl)); return; } } catch (Exception e) { } // Failed, resort to executing the browser manually String osName = System.getProperty("os.name"); try { // Mac OS has special Java class if (osName.startsWith("Mac OS")) { Class fileMgr = Class.forName("com.apple.eio.FileManager"); Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[] { String.class }); openURL.invoke(null, new Object[] { surl }); return; } String[] cmd; // Windows execs url.dll if (osName.startsWith("Windows")) { cmd = new String[] { "rundll32", "url.dll,FileProtocolHandler", surl }; // else assume unix/linux: call one of the available browsers } else { String[] browsers = { // user's Preferred browser (will be skipped if null or empty): preferredBrowser, // Freedesktop, http://portland.freedesktop.org/xdg-utils-1.0/xdg-open.html "xdg-open", // Debian "sensible-browser", // Otherwise call browsers directly "chromium", "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape" }; String browser = null; for (int count = 0; count < browsers.length && browser == null; count++) { if (browsers[count] != null && browsers[count].length() > 0 && Runtime.getRuntime().exec(new String[] { "which", browsers[count] }).waitFor() == 0) { browser = browsers[count]; } } if (browser == null) { // logger.warning("No web browser found"); throw new Exception("Could not find web browser"); } cmd = new String[] { browser, surl }; } if (Runtime.getRuntime().exec(cmd).waitFor() != 0) { throw new Exception("Error opening page: " + surl); } } catch (Exception e) { JOptionPane.showMessageDialog(parent, errMsg + ":\n" + e.getLocalizedMessage()); } } /** * Open a URL * *

* This is equal to {@link #openURL(URL, Component) openURL(url, null)} so any * error dialog will have no parent. * * @param url {@link URL} to open */ public static void openURL(URL url) { openURL(url, null); } /** * Open a string URL * *

* This is equal to {@link #openURL(String, Component) openURL(surl, null)} so * any error dialog will have no parent. * * @param surl URL to open (as String) */ public static void openURL(String surl) { openURL(surl, null); } /** * Added by fbusquets Sets the path to the user's perferred browser. * * @param browserCmd The path to the browser to be used by BrowserLaunched */ public static void setPreferredBrowser(String browserCmd) { preferredBrowser = StrUtils.nullableString(browserCmd); } /** * Added by fbusquets Gets the path to the user's preferred browser. * * @param defaultValue The default choice, used only if preferred browser not * set. * @return The command line corresponding to the user's preferred browser */ public static String getPreferredBrowser(String defaultValue) { return StrUtils.secureString(preferredBrowser, defaultValue); } } src/core/edu/xtec/util/Check.java000066400000000000000000000070641335566474600172040ustar00rootroot00000000000000/* * File : Check.java * Created : 09-jul-2002 10:06 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Dimension; import java.net.URL; import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; /** * This class is useful to display a warning message when a specific requirement * is not satisfied. Examples of unsatisfied requirements are the ability to * instantiate a specific class, to access to a file or resource, or to have * specific permissions. The message can be stored into an HTML resource, and * will be displayed in a {@link javax.swing.JEditorPane}. Users will be able to * follow the links included in the HTML document. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class Check { private static final String DLG_KEY = "CHECK_DIALOG"; private Check() { } public static void showUrlPane(final Options options, String urlKey) { final Messages msg = options.getMessages(); HyperlinkListener hlst = new HyperlinkListener() { public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { final URL sUrl = e.getURL(); SwingUtilities.invokeLater(new Runnable() { public void run() { try { if (options.getApplet() != null) options.getApplet().getAppletContext().showDocument(sUrl); else BrowserLauncher.openURL(sUrl.toExternalForm()); } catch (Exception ex) { msg.showErrorWarning((JDialog) options.get(DLG_KEY), "URL_LAUNCH_ERROR", ex); } } }); } } }; JScrollPane scroll; try { URL url = ResourceManager.getResource(msg.get(urlKey)); JEditorPane ep = new JEditorPane(url); ep.setEditable(false); ep.addHyperlinkListener(hlst); scroll = new JScrollPane(ep); scroll.setPreferredSize(new Dimension(500, 400)); } catch (Exception ex) { msg.showErrorWarning(options.getMainComponent(), "URL_ERROR", ex); return; } JOptionPane pane = new JOptionPane(new Object[] { scroll }, JOptionPane.WARNING_MESSAGE); JDialog dialog = pane.createDialog(options.getMainComponent(), msg.get(Messages.WARNING)); options.put(DLG_KEY, dialog); dialog.setVisible(true); options.remove(DLG_KEY); } public static boolean checkSignature(Options options, boolean showWarning) { boolean result = false; try { System.getProperty("java.class.path"); result = true; } catch (SecurityException ex) { if (showWarning) showUrlPane(options, "CHECK_SIGNATURE_URL"); } return result; } } src/core/edu/xtec/util/CompoundListCellRenderer.java000066400000000000000000000040101335566474600230620ustar00rootroot00000000000000/* * File : CompoundListCellRenderer.java * Created : 13-aug-2002 12:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Component; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class CompoundListCellRenderer extends JLabel implements ListCellRenderer { /** Creates a new instance of CompoundListCellRenderer */ public CompoundListCellRenderer() { setOpaque(true); setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } String text = "???"; ImageIcon icon = null; if (value instanceof CompoundObject) { CompoundObject co = (CompoundObject) value; text = co.text; icon = co.getIcon(); } else if (value != null) text = value.toString(); setText(icon == null ? text : ""); setIcon(icon); return this; } } src/core/edu/xtec/util/CompoundObject.java000066400000000000000000000062471335566474600211040ustar00rootroot00000000000000/* * File : CompoundObject.java * Created : 17-feb-2003 10:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.Serializable; import java.net.MalformedURLException; import java.net.URL; import javax.swing.ImageIcon; /** * This class encapsulates three fields: a text identifier, a * label and an icon. The icon is always an external * resource, accessible through an URL. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class CompoundObject implements Serializable { protected String id = null; protected String text = null; protected String iconUrl = null; private transient ImageIcon icon = null; /** Creates a new instance of CompoundObject */ protected CompoundObject() { } /** Creates a new instance of CompoundObject */ public CompoundObject(String id, String text, String iconUrl) { this.id = id; this.text = text; this.iconUrl = iconUrl; } public boolean hasIcon() { return iconUrl != null && iconUrl.length() > 0; } public ImageIcon getIcon() { if (icon == null && iconUrl != null && iconUrl.length() > 0) { String s = iconUrl; try { URL url; try { url = new URL(s); } catch (MalformedURLException mex) { url = new URL("file://" + s); } icon = new ImageIcon(url); } catch (Exception ex) { System.err.println("Unable to read image " + iconUrl + "\n" + ex); } } return icon; } public void clearIcon() { icon = null; } /** * Getter for property id. * * @return Value of property id. */ public java.lang.String getId() { return id; } /** * Setter for property id. * * @param id New value of property id. */ public void setId(java.lang.String id) { this.id = id; } /** * Getter for property text. * * @return Value of property text. */ public java.lang.String getText() { return text; } /** * Setter for property text. * * @param text New value of property text. */ public void setText(java.lang.String text) { this.text = text; } /** * Getter for property iconUrl. * * @return Value of property iconUrl. */ public java.lang.String getIconUrl() { return iconUrl; } /** * Setter for property iconUrl. * * @param iconUrl New value of property iconUrl. */ public void setIconUrl(java.lang.String iconUrl) { this.iconUrl = iconUrl; } } src/core/edu/xtec/util/CtrlPanel.java000066400000000000000000000124361335566474600200520ustar00rootroot00000000000000/* * File : CtrlPanel.java * Created : 10-mar-2004 16:48 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Component; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.EventObject; import javax.swing.JPanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; /** * This class is a special {@link javax.swing.JPanel}, designed to edit the * properties of a specific object. It has a boolean flag useful to signal if * the edited object has been modified, and implements several listeners (a * {@link java.beans.PropertyChangeListener}, a * {@link javax.swing.event.DocumentListener} and a * {@link java.awt.event.ActionListener}). This listeners can be hooked to child * controls in order to vehiculate a single way to handle events that can cause * changes to the edited object. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class CtrlPanel extends JPanel implements PropertyChangeListener, ActionListener, DocumentListener { private boolean modified; private static int initializing; private MouseAdapter mouseAdapter; public boolean eventPerformed(EventObject eventObject) { return genericEvent(eventObject); } public boolean documentChangePerformed(DocumentEvent documentEvent) { return genericEvent(documentEvent); } public boolean genericEvent(Object event) { return true; } public final void actionPerformed(ActionEvent actionEvent) { if (!isInitializing() && eventPerformed(actionEvent)) modified = true; } public final void listenButtonActions(javax.swing.AbstractButton[] controls) { for (javax.swing.AbstractButton cmp : controls) cmp.addActionListener(this); } public final void propertyChange(PropertyChangeEvent propertyChangeEvent) { if (!isInitializing() && eventPerformed(propertyChangeEvent)) modified = true; } public final void changedUpdate(DocumentEvent documentEvent) { if (!isInitializing() && documentChangePerformed(documentEvent)) modified = true; } public final void insertUpdate(DocumentEvent documentEvent) { if (!isInitializing() && documentChangePerformed(documentEvent)) modified = true; } public final void removeUpdate(DocumentEvent documentEvent) { if (!isInitializing() && documentChangePerformed(documentEvent)) modified = true; } public MouseListener getMouseClickListener() { if (mouseAdapter == null) { mouseAdapter = new MouseAdapter() { @Override public void mouseClicked(MouseEvent evt) { if (!isInitializing() && eventPerformed(evt)) modified = true; } }; } return mouseAdapter; } /** * Getter for property modified. * * @return Value of property modified. */ public final boolean isModified() { return findModified(this); } /** * Setter for property modified. * * @param value New value of property "modified". */ public final void setModified(boolean value) { if (value) modified = true; else clearModified(this); } private static void clearModified(Container cnt) { if (cnt instanceof CtrlPanel) { ((CtrlPanel) cnt).modified = false; } for (Component ch : cnt.getComponents()) { if (ch instanceof Container) clearModified((Container) ch); } } private static boolean findModified(Container cnt) { boolean result = cnt instanceof CtrlPanel ? ((CtrlPanel) cnt).modified : false; if (!result) { for (Component ch : cnt.getComponents()) { if (ch instanceof Container) if ((result = findModified((Container) ch)) == true) break; } } return result; } /** * Getter for property initializing. * * @return Value of property initializing. */ public final boolean isInitializing() { return initializing != 0; } /** * Setter for property initializing. * * @param value New value of property "initializing". */ public final void setInitializing(boolean value) { initializing += value ? 1 : -1; } public Container getAWTAncestor(Class ancestorClass) { Container result = null; Container c = getParent(); while (c != null) { if (ancestorClass.isAssignableFrom(c.getClass())) { result = c; break; } c = c.getParent(); } return result; } } src/core/edu/xtec/util/CustomListCellRenderer.java000066400000000000000000000057021335566474600225610ustar00rootroot00000000000000/* * File : CustomListCellRenderer.java * Created : 09-apr-2003 18:27 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Component; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; /** * This class is a {@link javax.swing.ListCellRenderer} that can use an array of * strings and another array of icons to display its content based on the value * of the index param passed to * getListCellRendererComponent. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class CustomListCellRenderer extends JLabel implements ListCellRenderer { protected String[] labels = null; protected Icon[] icons = null; public CustomListCellRenderer() { this(null, null); } /** Creates a new instance of CustomListCellRenderer */ public CustomListCellRenderer(String[] labels, Icon[] icons) { setObjects(labels, icons); setOpaque(true); if (labels == null) { setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); } setHorizontalAlignment(JLabel.LEFT); } public void setObjects(String[] labels, Icon[] icons) { this.labels = labels; this.icons = icons; } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } String s = ""; if (value instanceof String) s = (String) value; else if (labels != null && index >= 0 && index < labels.length) s = labels[index]; Icon icon = null; if (value instanceof Icon) icon = (Icon) value; else if (icons != null && index >= 0 && index < icons.length) icon = icons[index]; else if (icons != null && labels != null && index < 0 && value != null) { for (int i = 0; i < labels.length; i++) { if (value.equals(labels[i])) { if (i < icons.length) icon = icons[i]; break; } } } setText(s); setIcon(icon); return this; } } src/core/edu/xtec/util/Domable.java000066400000000000000000000027151335566474600175300ustar00rootroot00000000000000/* * File : Domable.java * Created : 24-mar-2003 15:26 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; /** * This interface applies to all classes that can serialize and de-serialize its * data into a XML {@link org.jdom.Element} of type * JDOM. The getJDomElement * method stores the current non-transient data into a JDOM element, and * setProperties * reads the data. Domable classes should implement also a * static method that builds new objects from a provided Element. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public interface Domable { org.jdom.Element getJDomElement(); void setProperties(org.jdom.Element e, Object aux) throws Exception; } src/core/edu/xtec/util/DomableBean.java000066400000000000000000000100141335566474600203050ustar00rootroot00000000000000/* * File : DomableBean.java * Created : 25-mar-2003 11:38 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * This class has a collection of XML {@link org.jdom.Element} objects, among * with a set of properties represented by key-value pairs, and a string * identifer. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.14 */ public class DomableBean extends Object implements Domable, Serializable { public static final String ELEMENT_NAME = "bean", ID = "id", PARAM = "param", NAME = "name", VALUE = "value"; private String id; private Map params; private List elements; /** Creates a new instance of DomableBean */ public DomableBean() { } public DomableBean(String id) { setId(id); } private List chkElements() { if (elements == null) elements = new ArrayList(); return elements; } public String getId() { return id; } public void setId(String id) { this.id = id; } public org.jdom.Element getJDomElement() { org.jdom.Element e = new org.jdom.Element(ELEMENT_NAME); if (id != null) e.setAttribute(ID, id); if (params != null) { Iterator it = params.keySet().iterator(); while (it.hasNext()) { String key = it.next(); String value = params.get(key); if (value != null) { org.jdom.Element child = new org.jdom.Element(PARAM); child.setAttribute(NAME, key); child.setAttribute(VALUE, value); e.addContent(child); } } } if (elements != null) { Iterator it = elements.iterator(); while (it.hasNext()) { e.addContent(((org.jdom.Element) it.next()).detach()); } } return e; } public void setProperties(org.jdom.Element e, Object aux) throws Exception { JDomUtility.checkName(e, ELEMENT_NAME); setId(e.getAttributeValue(ID)); List children = e.getChildren(); Iterator it = children.iterator(); while (it.hasNext()) { org.jdom.Element child = (org.jdom.Element) it.next(); if (PARAM.equals(child.getName())) { getParams().put(JDomUtility.getStringAttr(child, NAME, "DEFAULT", false), JDomUtility.getStringAttr(child, VALUE, "", false)); } else { chkElements().add(child); } } } public static DomableBean getDomableBean(org.jdom.Element e) throws Exception { DomableBean db = new DomableBean(null); db.setProperties(e, null); return db; } public void setParam(String key, String value) { if (key != null) getParams().put(key, value); } public String getParam(String key) { return key == null ? null : (String) getParams().get(key); } public Map getParams() { if (params == null) params = new HashMap(); return params; } public void addElement(org.jdom.Element e) { chkElements().add(e); } public org.jdom.Element[] getElements() { org.jdom.Element[] result; if (elements != null) result = elements.toArray(new org.jdom.Element[elements.size()]); else result = new org.jdom.Element[0]; return result; } } src/core/edu/xtec/util/Encryption.java000066400000000000000000000174371335566474600203260ustar00rootroot00000000000000/* * File : Encryption.java * Created : 03-jul-2001 09:51 * By : allastar * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; /** * Utilities to encrypt and decrypt strings using simple methods, just to avoid * write passwords in plain text in data and configuration files. Do not use it * as a secure cryptographic system! * * @author Albert Llastarri (allastar@xtec.cat) * @version 13.08.08 */ public final class Encryption { private static final String BLANK = "___blank___##"; public static String Encrypt(String txt) { if (txt == null || txt.length() == 0) txt = BLANK; String result = null; try { result = codify(txt); } catch (Exception ex) { System.err.println("Error encripting text!"); } return result; } public static String Decrypt(String txt) { if (txt == null || txt.length() == 0) return null; String s = decodify(txt); if (BLANK.equals(s)) s = new String(); return s; } private static char hexCharArrayToChar(char[] cA, int fromIndex) { char[] hex = new char[4]; int n = 0; for (int i = 0; i <= 3; i++) { int j = Character.digit(cA[fromIndex + i], 16); n = (n * 16) + j; } return (char) n; } private static char[] charToHexCharArray(char c) { char[] hex = new char[4]; int j = (int) c; for (int i = 3; i >= 0; i--) { hex[i] = Character.forDigit(j % 16, 16); j /= 16; } return hex; } private static char[] intToHexCharArray(int c) { char[] hex = new char[2]; int j = (int) c; for (int i = 1; i >= 0; i--) { hex[i] = Character.forDigit(j % 16, 16); j /= 16; } return hex; } private static int hexCharArrayToInt(char[] cA, int fromIndex) { int n = 0; for (int i = 0; i <= 1; i++) { int j = Character.digit(cA[fromIndex + i], 16); n = (n * 16) + j; } return n; } private static StringBuilder compressZeros(char[] cA) { int total = 0; StringBuilder sb = new StringBuilder(cA.length); int[] zeros = new int[(cA.length + 7) / 8]; // it will be better to use bytes, but // then it takes the first bit as a sign int j; for (j = 0; total < cA.length; j++) { char b = 0; for (int i = 0; i <= 7; i++) { b <<= 1; if (total < cA.length) { if (cA[total] == '0') b += 1; else sb.append(cA[total]); } total++; } zeros[j] = (int) b; } return codifyZerosField(zeros, j).append(sb.substring(0)); } private static StringBuilder codifyZerosField(int[] zeros, int length) { String hexZeros = codifyToHex(zeros, length); // hexZeros size is always odd StringBuilder codified = new StringBuilder(); if (hexZeros.length() > 1) { char c1 = hexZeros.charAt(0); char c2 = hexZeros.charAt(1); int num = 1; int currentChar = 2; while (currentChar < hexZeros.length()) { if (c1 == hexZeros.charAt(currentChar) && c2 == hexZeros.charAt(currentChar + 1) && num < 32) num++; else { // New sequence codified.append(Character.forDigit(num, 32)); codified.append(c1); codified.append(c2); num = 1; c1 = hexZeros.charAt(currentChar); c2 = hexZeros.charAt(currentChar + 1); } currentChar += 2; } codified.append(Character.forDigit(num, 32)); codified.append(c1); codified.append(c2); codified.append("0"); } return codified; } private static String decodifyZerosField(char[] cA) { StringBuilder sb = new StringBuilder(); int num = Character.digit(cA[0], 32); int k = 0; int i; for (i = 0; num != 0; i++) { while (num > 0) { sb.append(cA[(i * 3) + 1]); sb.append(cA[(i * 3) + 2]); num--; k++; } if (cA.length > ((i * 3) + 3)) num = Character.digit(cA[(i * 3) + 3], 32); else num = 0; } for (int j = (i * 3) + 1; j < cA.length; j++) sb.append(cA[j]); char c = Character.forDigit(k, 32); return c + sb.toString(); } private static StringBuilder decompressZeros(char[] cA) { cA = decodifyZerosField(cA).toCharArray(); int numBytesZeros = Character.digit(cA[0], 32); int iniNoZeros = (numBytesZeros * 2) + 1; boolean bFi = false; StringBuilder sb = new StringBuilder(); for (int i = 0; i < numBytesZeros && !bFi; i++) { int zeros = hexCharArrayToInt(cA, 1 + (i * 2)); String s = Integer.toBinaryString(zeros); while (s.length() < 8) s = "0" + s; for (int j = 0; j <= 7 && !bFi; j++) { if (s.charAt(j) == '1') { sb.append('0'); } else if (iniNoZeros < cA.length) { sb.append(cA[iniNoZeros]); iniNoZeros++; } else bFi = true; } } return sb; } private static String codifyToHex(int[] bA, int length) { // char [] cA=s.toCharArray(); char[] cA = new char[length * 2]; int j = 0; for (int i = 0; i < length; i++) { char[] hex = intToHexCharArray(bA[i]); for (int k = 0; k < 2; k++) { cA[j] = hex[k]; j++; } } String st = new String(cA); return st; } private static char[] codifyToHex(String s) { char[] cA = new char[s.length() * 4]; int j = 0; for (int i = 0; i < s.length(); i++) { char[] hex = charToHexCharArray(s.charAt(i)); for (int k = 0; k < 4; k++) { cA[j] = hex[k]; j++; } } return cA; } private static String decodifyFromHex(StringBuilder sb1) { StringBuilder sb = new StringBuilder(); char[] cA = sb1.toString().toCharArray(); int j = 0; for (int i = 0; j < sb1.length(); i++) { char c = hexCharArrayToChar(cA, j); sb.append(c); j += 4; } return sb.toString(); } private static char[] changeOrder(StringBuilder s) { int m = 0; int n = s.length() - 1; char[] cA = new char[s.length()]; // =s.toCharArray(); for (int i = 0; i < s.length(); i++) { if ((i % 2) == 0) { cA[m] = s.charAt(i); m++; } else { cA[n] = s.charAt(i); n--; } } return cA; } private static char[] unchangeOrder(String s) { int m = 0; int n = s.length() - 1; char[] cA = new char[s.length()]; for (int i = 0; i < s.length(); i++) { if ((i % 2) == 0) { cA[i] = s.charAt(m); m++; } else { cA[i] = s.charAt(n); n--; } } return cA; } static class TooLargePasswordException extends Exception { @Override public String toString() { return "Password mustn't contain over 24 characters!!!"; } } private static String codify(String word) throws TooLargePasswordException { if (word.length() > 24) throw new TooLargePasswordException(); return new String(changeOrder(compressZeros(codifyToHex(word)))); } private static String decodify(String word) { try { return decodifyFromHex(decompressZeros(unchangeOrder(word))); } catch (Exception e) { // The supplied word was not codified using this system return ""; } } } src/core/edu/xtec/util/ExtendedByteArrayInputStream.java000066400000000000000000000041551335566474600237440ustar00rootroot00000000000000/* * File : ExtendedByteArrayInputStream.java * Created : 21-sep-2001 10:14 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.ByteArrayInputStream; /** * This class extends {@link java.io.ByteArrayInputStream} in two ways: it adds * a "name" member, and gives read-only acces to its protected members * pos, mark and * count. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ExtendedByteArrayInputStream extends ByteArrayInputStream { protected String m_name; /** Creates new ExtendedByteArrayInputStream */ public ExtendedByteArrayInputStream(byte[] buffer, String name) { super(buffer); m_name = name; } public ExtendedByteArrayInputStream(byte[] buffer, int offset, int length, String name) { super(buffer, offset, length); m_name = name; } public ExtendedByteArrayInputStream duplicate() { return new ExtendedByteArrayInputStream(buf, m_name); } public String getName() { return m_name; } public int getPos() { return pos; } public int getMark() { return mark; } public int getCount() { return count; } public boolean eosReached() { return pos >= count; } public long seek(long param) { pos = 0; return skip(param); } public byte[] getBuffer() { return buf; } @Override public boolean markSupported() { return true; } } src/core/edu/xtec/util/ExtendedJDialog.java000066400000000000000000000051461335566474600211600ustar00rootroot00000000000000/* * File : ExtendedJDialog.java * Created : 04-jun-2002 12:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Component; import java.awt.Dialog; import java.awt.Frame; import java.awt.event.WindowAdapter; import javax.swing.JDialog; import javax.swing.JOptionPane; /** * This class is just a {@link javax.swing.JDialog} with a * {@link java.awt.event.WindowAdapter} that checks for focus lost. It also * provides an utility method to place the dialog window centered over another * swing object. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ExtendedJDialog extends JDialog { private WindowAdapter wa = null; private boolean waConnected = false; /** Creates new JDialog */ public ExtendedJDialog(Frame owner, String title, boolean modal) { super(owner, title, modal); createComponentEvents(); } public ExtendedJDialog(Component owner, String title, boolean modal) { this(JOptionPane.getFrameForComponent(owner), title, modal); } public ExtendedJDialog(Dialog owner, String title, boolean modal) { super(owner, title, modal); createComponentEvents(); } protected void createComponentEvents() { /* * Removed due to problems with MAC OSX * * wa=new java.awt.event.WindowAdapter(){ public void * windowDeactivated(java.awt.event.WindowEvent e){ requestFocus(); } }; */ } @Override public void setVisible(boolean b) { if (b) { if (!waConnected && wa != null) { addWindowListener(wa); waConnected = true; } } else { if (waConnected && wa != null) { removeWindowListener(wa); waConnected = false; } } super.setVisible(b); } public void centerOver(Component parent) { if (parent != null) setLocation((parent.getWidth() - getWidth()) / 2, (parent.getHeight() - getHeight()) / 2); setLocationRelativeTo(parent); } } src/core/edu/xtec/util/FileChooserForFiles.java000066400000000000000000000100541335566474600220140ustar00rootroot00000000000000/* * File : FileChooserForFiles.java * Created : 18-apr-2002 16:43 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.File; import java.lang.reflect.Method; import javax.swing.JFileChooser; import javax.swing.filechooser.FileSystemView; import javax.swing.plaf.FileChooserUI; import javax.swing.plaf.metal.MetalFileChooserUI; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class FileChooserForFiles extends JFileChooser { /** Creates new FileChooserForFiles */ public FileChooserForFiles() { setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(File file) { super(file); setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(File currentDirectory, FileSystemView fsv) { super(currentDirectory, fsv); setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(FileSystemView fsw) { super(fsw); setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(String file) { super(file); setFileSelectionMode(JFileChooser.FILES_ONLY); } public FileChooserForFiles(String currentDirectory, FileSystemView fsv) { super(currentDirectory, fsv); setFileSelectionMode(JFileChooser.FILES_ONLY); } @Override public void setCurrentDirectory(final File dir) { final String oldFileName = getCurrentFileName(); super.setCurrentDirectory(dir); // TODO: interpret oldFilename for multiselection if (oldFileName != null && oldFileName.indexOf('"') == -1) { if (getCurrentFileName() == null) { setSelectedFile(new File(dir, oldFileName)); } } } static Class WindowsFileChooserUIClass; static Method getFileNameMethod; static { try { if (FileChooserForFiles.class .getResource("/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.class") != null) { WindowsFileChooserUIClass = Class.forName("com.sun.java.swing.plaf.windows.WindowsFileChooserUI"); if (WindowsFileChooserUIClass != null) { getFileNameMethod = WindowsFileChooserUIClass.getMethod("getFileName", (Class[]) null); } } } catch (Exception ex) { // Class not found: ignore } } /** JDKBUG: get current selected filename. */ private String getCurrentFileName() { final FileChooserUI fchui = getUI(); String fileName; if (fchui instanceof MetalFileChooserUI) { fileName = ((MetalFileChooserUI) fchui).getFileName(); } else if (WindowsFileChooserUIClass != null && WindowsFileChooserUIClass.isInstance(fchui) && getFileNameMethod != null) { try { fileName = (String) getFileNameMethod.invoke(fchui, (Object[]) null); } catch (Exception ex) { fileName = null; } } else { fileName = null; } return fileName == null || fileName.trim().length() == 0 ? null : fileName; } public void directSetSelectedFile(final File selectedFile) { super.setSelectedFile(selectedFile); } /** JDKBUG: avoid unsetting filename when a directory is selected. */ @Override public void setSelectedFile(final File selectedFile) { if (selectedFile != null) { if ((selectedFile.isDirectory() && isDirectorySelectionEnabled()) || (!selectedFile.isDirectory() && isFileSelectionEnabled())) { super.setSelectedFile(selectedFile); } } } } src/core/edu/xtec/util/FontCheck.java000066400000000000000000000101731335566474600200260ustar00rootroot00000000000000/* * File : FontCheck.java * Created : 15-mar-2002 11:33 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Font; import java.awt.GraphicsEnvironment; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.util.HashMap; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class FontCheck { public static final String DEFAULT_FONT_NAME = "default"; public static final Font DEFAULT_FONT = new Font(DEFAULT_FONT_NAME, Font.PLAIN, 17); public static final String TMP_FONT_PREFIX = "tmp_font_"; private static final Map systemFonts = new HashMap(12); private static String[] fontList; public static final String[] fontSizes = new String[] { "8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "72" }; private FontCheck() { } public static String[] getFontList(boolean reload) { if (fontList == null || reload) { fontList = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); } return fontList; } public static boolean checkFont(Font font) { boolean result = false; if (font != null) { FontRenderContext frc = new FontRenderContext(new AffineTransform(), false, false); TextLayout layout = new TextLayout("AB", font, frc); result = layout.getBounds().getWidth() > 1; } return result; } public static boolean checkFontFamilyName(Object family) { return family != null && family instanceof String && checkFont(new Font((String) family, Font.PLAIN, 17)); } public static Font getValidFont(String family, int style, int size) { Font f = new Font(family, style, size); if (!checkFont(f)) { Font fontBase = (Font) systemFonts.get(family.toLowerCase()); if (fontBase == null) { fontBase = DEFAULT_FONT; } f = fontBase.deriveFont(style, size); } return f; } public static String getValidFontFamilyName(Object family) { Font f = systemFonts.get(family instanceof String ? ((String) family).toLowerCase() : family); if (f != null) { return f.getFamily(); } return checkFontFamilyName(family) ? (String) family : DEFAULT_FONT_NAME; } public static Font checkSystemFont(String fontName, String fontFileName) { String fnLower = fontName.toLowerCase(); Font f = (Font) systemFonts.get(fnLower); if (f == null) { f = new Font(fontName, Font.PLAIN, 17); if (!checkFont(f) || !fontName.toLowerCase().equals(f.getFamily().toLowerCase())) { try { f = buildNewFont(fontFileName, ResourceManager.STREAM_PROVIDER, "fonts/" + fontFileName); if (checkFont(f)) { systemFonts.put(fnLower, f); } else { f = DEFAULT_FONT; } } catch (Exception ex) { System.err.println("Unable to build font " + fontName + "\n:" + ex); } } } return f; } public static Font buildNewFont(String fileName, StreamIO.InputStreamProvider isp, String resourceName) throws Exception { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); Font font = Font.createFont(Font.TRUETYPE_FONT, isp.getInputStream(resourceName)); if (ge != null && font != null) { ge.registerFont(font); font = getValidFont(font.getName(), Font.PLAIN, 1); } return font; } } src/core/edu/xtec/util/GlobalMouseAdapter.java000066400000000000000000000045231335566474600216760ustar00rootroot00000000000000/* * File : GlobalMouseAdapter.java * Created : 24-jan-2002 13:20 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Component; import java.awt.event.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class GlobalMouseAdapter implements MouseListener, MouseMotionListener { protected Component parent; /** Creates new GlobalMouseAdapter */ public GlobalMouseAdapter(Component parent) { this.parent = parent; } public void attachTo(Component cmp, boolean catchMotion) { cmp.addMouseListener(this); if (catchMotion) cmp.addMouseMotionListener(this); } public Component getParent() { return parent; } public void setParent(Component parent) { this.parent = parent; } public void detach(Component cmp) { if (cmp != null) { cmp.removeMouseListener(this); cmp.removeMouseMotionListener(this); } } protected void processEvent(MouseEvent e) { java.awt.Point pt = e.getComponent().getLocation(); e.translatePoint(pt.x, pt.y); parent.dispatchEvent(e); } public void mouseDragged(java.awt.event.MouseEvent e) { processEvent(e); } public void mouseExited(java.awt.event.MouseEvent e) { processEvent(e); } public void mouseReleased(java.awt.event.MouseEvent e) { processEvent(e); } public void mouseMoved(java.awt.event.MouseEvent e) { processEvent(e); } public void mousePressed(java.awt.event.MouseEvent e) { processEvent(e); } public void mouseClicked(java.awt.event.MouseEvent e) { processEvent(e); } public void mouseEntered(java.awt.event.MouseEvent e) { processEvent(e); } } src/core/edu/xtec/util/Html.java000066400000000000000000000204321335566474600170650ustar00rootroot00000000000000/* * File : Html.java * Created : 05-dec-2001 12:28 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ import java.io.PrintStream; import java.util.StringTokenizer; public class Html extends Object { public static final String SP = " "; public static final String NBSP = " "; public static final String BR = "\n
\n"; public static final String P = "\n

\n"; public static final String Q = "\""; public static final int LEFT = 0, CENTER = 1, RIGHT = 2; public static final String[] ALIGN = { "", "ALIGN=\"center\"", "ALIGN=\"right\"" }; protected StringBuilder sb; public Html(int bufSize) { sb = new StringBuilder(bufSize); } public Html(StringBuilder sb) { this.sb = sb; } @Override public String toString() { return sb.substring(0); } public Html append(String str) { sb.append(str == null ? "" : str); return this; } public Html appendParagraphs(String source) { StringTokenizer st = new StringTokenizer(source, "\n"); boolean first = true; while (st.hasMoreTokens()) { if (!first) sb.append(BR); else first = false; sb.append(st.nextToken()); } return this; } public Html mailTo(String mail, boolean parenthesis) { if (parenthesis) sb.append("("); sb.append("").append(mail).append(""); if (parenthesis) sb.append(")"); return this; } public Html linkTo(String url, String text) { sb.append(""); sb.append(text == null ? url : text); sb.append(""); return this; } public Html bold(String text) { sb.append("").append(text).append(""); return this; } public Html td(boolean init) { sb.append(init ? "" : "\n"); return this; } public Html td(String text) { return td(text, false); } public Html td(String text, int align, boolean bold, String tdParams) { sb.append(" LEFT) sb.append(SP).append(ALIGN[align]); if (tdParams != null) sb.append(SP).append(tdParams); sb.append(">"); if (bold) bold(text); else sb.append(text); sb.append("\n"); return this; } public Html td(String text, boolean bld) { sb.append(""); if (bld) bold(text); else sb.append(text); sb.append("\n"); return this; } public Html tr(boolean init) { return append(init ? "" : "\n"); } public Html br() { return append(BR); } public Html p() { return append(P); } public Html sp() { return append(SP); } public Html nbsp() { return append(NBSP); } public Html doubleCell(String tx1, boolean b1, String tx2, boolean b2) { tr(true); td(true); if (b1) sb.append(""); appendParagraphs(tx1); if (b1) sb.append(""); td(false); td(true); if (b2) sb.append(""); appendParagraphs(tx2); if (b2) sb.append(""); td(false); tr(false); return this; } public static String table(String content, String width, int border, int cellPadding, int cellSpacing, String style, boolean simpleCell) { int v = content != null ? content.length() : 100; StringBuilder sbs = new StringBuilder(v + 200); sbs.append("= 0) sbs.append(" BORDER=\"").append(border).append(Q); if (cellPadding >= 0) sbs.append(" CELLPADDING=\"").append(cellPadding).append(Q); if (cellSpacing >= 0) sbs.append(" CELLSPACING=\"").append(cellSpacing).append(Q); if (style != null) sbs.append(" STYLE=\"").append(style).append(Q); sbs.append(">\n"); if (simpleCell) sbs.append(""); sbs.append("\n
"); sbs.append(content); if (simpleCell) sbs.append("
"); return sbs.substring(0); } public static String getHtmlDoc(String content, String bgColor) { int v = content != null ? content.length() : 100; StringBuilder sbs = new StringBuilder(v + 100); sbs.append("\n"); sbs.append("\n"); sbs.append(content); sbs.append(""); return sbs.substring(0); } public static String quote(String txt) { StringBuilder sbs = new StringBuilder(txt.length() * 3); sbs.append("'"); sbs.append(edu.xtec.util.StrUtils.replace( edu.xtec.util.StrUtils.replace(edu.xtec.util.StrUtils.replace(txt, "'", "'"), "\"", """), "`", "’")); sbs.append("'"); return sbs.substring(0); } public static final String validChars = " -_.*0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static String encode(String src) { if (src == null || src.length() < 1) return src; int len = src.length(); StringBuilder sbs = new StringBuilder(len * 2); for (int i = 0; i < len; i++) { char ch = src.charAt(i); if (validChars.indexOf(ch) >= 0) sbs.append(ch); else if (ch < 256) sbs.append("%").append(Integer.toHexString(ch)); else sbs.append("%26%23").append(Integer.toHexString(ch)).append("%3B"); } return sbs.substring(0); } public static String decode(String src) { if (src == null || src.length() < 1) return src; int len = src.length(); StringBuilder sbs = new StringBuilder(len); for (int i = 0; i < len; i++) { char ch = src.charAt(i); if (ch == '%') { sbs.append((char) Integer.parseInt(src.substring(i + 1, i + 3), 16)); i += 2; } else sbs.append(ch); } String s = sbs.substring(0); len = s.length(); sbs.setLength(0); int j = 0; for (int i = 0; i < len; i++) { char ch = s.charAt(i); if (ch == '&' && (j = s.indexOf(';', i)) > i + 2) { String v = s.substring(i + 1, j).toLowerCase(); if (v.length() > 2 && v.charAt(0) == '#') { int k; if (v.charAt(1) == 'x') k = Integer.parseInt(v.substring(2), 16); else k = Integer.parseInt(v.substring(1)); sbs.append((char) k); } else sbs.append('?'); i = j; } else sbs.append(ch); } return sbs.substring(0); } // to be deprecated!! public static void processParamsLine(String txt, java.util.Map map, char sep, char equalSign) { if (txt != null && txt.length() > 0 && map != null) { StringTokenizer st = new StringTokenizer(txt, String.valueOf(sep)); while (st.hasMoreTokens()) { String s = st.nextToken().trim(); String key, value = null; int k = s.indexOf(equalSign); if (k > 0) { key = decode(s.substring(0, k).replace('+', ' ')); if (k < s.length() - 1) value = decode(s.substring(k + 1).replace('+', ' ')); } else key = decode(s.replace('+', ' ')); map.put(key, value); } } } public static void writeScriptConfirm(PrintStream pOut) { pOut.println(""); } } src/core/edu/xtec/util/JDomUtility.java000066400000000000000000000542471335566474600204110ustar00rootroot00000000000000/* * File : JDomUtility.java * Created : 14-jun-2001 17:25 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Point; import java.awt.Rectangle; import java.io.OutputStream; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.StringTokenizer; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class JDomUtility { private static org.jdom.input.SAXBuilder saxBuilder; private static org.jdom.output.XMLOutputter outputter; public static final String ID = "id", IMAGE = "image", NAME = "name", TYPE = "type", BGCOLOR = "bgcolor", FORECOLOR = "forecolor", MARGIN = "margin", BORDER = "border", POSITION = "position", X = "x", Y = "y", P = "p", CLASS = "class"; private JDomUtility() {} public static boolean addGenericAttribute(org.jdom.Element e, String key, Object v) { if (v == null) { return false; } Class cl = v.getClass(); if (e.getAttribute(key) != null) { return false; } if (cl.isArray()) { return false; } if (cl.isAssignableFrom(String.class) || cl.isAssignableFrom(Integer.class) || cl.isAssignableFrom(Float.class) || cl.isAssignableFrom(Double.class) || cl.isAssignableFrom(Boolean.class)) { e.setAttribute(key, v.toString()); } else if (cl.isAssignableFrom(Color.class)) { e.setAttribute(key, colorToString((Color) v)); } else { return false; } return true; } // ---------------------------------------------------------------------- // Font conversion functions // ---------------------------------------------------------------------- public static final String FONT = "font"; private static final String FAMILY = "family", SIZE = "size", BOLD = "bold", ITALIC = "italic"; public static org.jdom.Element fontToElement(java.awt.Font font) { org.jdom.Element e = new org.jdom.Element(FONT); e.setAttribute(FAMILY, font.getFamily()); e.setAttribute(SIZE, Integer.toString(font.getSize())); if (font.isBold()) { e.setAttribute(BOLD, boolString(font.isBold())); } if (font.isItalic()) { e.setAttribute(ITALIC, boolString(font.isItalic())); } return e; } public static Font elementToFont(org.jdom.Element e) throws Exception { checkName(e, FONT); String family = getStringAttr(e, FAMILY, "default", false); int size = getIntAttr(e, SIZE, 12); int style = (getBoolAttr(e, BOLD, false) ? Font.BOLD : 0) | (getBoolAttr(e, ITALIC, false) ? Font.ITALIC : 0); return FontCheck.getValidFont(family, style, size); } // ---------------------------------------------------------------------- // Color conversion functions // ---------------------------------------------------------------------- public static String colorToString(Color color) { // be careful with alpha : high bits String s = Long.toHexString(0x100000000L | color.getRGB()).toUpperCase(); s = s.substring(s.length() - (color.getAlpha() == 0xFF ? 6 : 8)); return "0x" + s; } public static final String[] HTML_COLOR_NAMES = { "Black", "Silver", "Gray", "White", "Maroon", "Red", "Purple", "Fuchsia", "Green", "Lime", "Olive", "Yellow", "Navy", "Blue", "Teal", "Aqua", "Pink", "Orange", "DarkGray" }; public static final Color[] HTML_COLORS = { Color.black, Color.lightGray, Color.gray, Color.white, new Color(128, 0, 0), Color.red, new Color(128, 0, 128), Color.magenta, new Color(0, 128, 0), Color.green, new Color(128, 128, 0), Color.yellow, new Color(0, 0, 128), Color.blue, new Color(0, 128, 128), Color.cyan, Color.pink, Color.orange, Color.darkGray }; public static Color stringToColor(String s) throws Exception { // Color c=Color.black; Color color = null; if (s.startsWith("0x")) { // c=Color.decode(s); long v = Long.decode(s).longValue(); color = new Color((int) v, s.length() > 8 || v >= 0x1000000); } else { for (int i = 0; i < HTML_COLOR_NAMES.length; i++) { if (HTML_COLOR_NAMES[i].equalsIgnoreCase(s)) { color = HTML_COLORS[i]; break; } } } if (color == null) { throw new Exception("Invalid color: " + s); } return color; } public static Color getColorAttr(org.jdom.Element e, String attr, Color defaultValue) throws Exception { String s = e.getAttributeValue(attr); return s == null ? defaultValue : stringToColor(s); } // ---------------------------------------------------------------------- // conversion functions for awt objects // ---------------------------------------------------------------------- public static final String LEFT = "left", RIGHT = "right", TOP = "top", BOTTOM = "bottom", WIDTH = "width", HEIGHT = "height", UP = "up", DOWN = "down"; public static org.jdom.Element getChildWithId(org.jdom.Element e, String name, String id) { org.jdom.Element result; if (e != null && id != null && name != null) { Iterator it = e.getChildren(name).iterator(); while (it.hasNext()) { result = (org.jdom.Element) it.next(); if (id.equals(result.getAttributeValue(ID))) { return result; } } } return null; } public static final String RECTANGLE = "rectangle"; public static Rectangle getRectangle(org.jdom.Element e, String id, Rectangle defaultValue) { if (id != null) { e = getChildWithId(e, RECTANGLE, id); } else if (e != null && !e.getName().equals(RECTANGLE)) { e = e.getChild(RECTANGLE); } if (e == null) { return defaultValue; } Rectangle r = (defaultValue == null ? new Rectangle() : new Rectangle(defaultValue)); r.setBounds( getIntAttr(e, LEFT, r.x), getIntAttr(e, TOP, r.y), getIntAttr(e, WIDTH, r.width), getIntAttr(e, HEIGHT, r.height)); return r; } public static final String POINT = "point"; public static Point getPoint(org.jdom.Element e, String id, Point defaultValue) { if (id != null) { e = getChildWithId(e, POINT, id); } else if (e != null && !e.getName().equals(POINT)) { e = e.getChild(POINT); } if (e == null) { return defaultValue; } Point p = (defaultValue == null ? new Point() : new Point(defaultValue)); p.setLocation(getIntAttr(e, LEFT, p.x), getIntAttr(e, TOP, p.y)); return p; } public static final String DIMENSION = "dimension"; public static Dimension getDimension(org.jdom.Element e, String id, Dimension defaultValue) { if (id != null) { e = getChildWithId(e, DIMENSION, id); } else if (e != null && !e.getName().equals(DIMENSION)) { e = e.getChild(DIMENSION); } if (e == null) { return defaultValue; } Dimension d = (defaultValue == null ? new Dimension() : new Dimension(defaultValue)); d.setSize(getIntAttr(e, WIDTH, d.width), getIntAttr(e, HEIGHT, d.height)); return d; } public static final String OFFSET = "offset"; public static Point getOffset(org.jdom.Element e, String id, Point defaultValue) { if (id != null) { e = getChildWithId(e, OFFSET, id); } else if (e != null && !e.getName().equals(OFFSET)) { e = e.getChild(OFFSET); } if (e == null) { return defaultValue; } Point p = (defaultValue == null ? new Point() : new Point(defaultValue)); p.setLocation(getIntAttr(e, RIGHT, p.x), getIntAttr(e, DOWN, p.y)); return p; } public static final String COLOR = "color", VALUE = "value"; public static Color getColorByPoint( org.jdom.Element e, String id, java.awt.image.BufferedImage img, Color defaultValue) throws Exception { if (id != null) { e = getChildWithId(e, COLOR, id); } else if (e != null && !e.getName().equals(COLOR)) { e = e.getChild(COLOR); } if (e == null) { return defaultValue; } Color result = getColorAttr(e, VALUE, defaultValue); if (img != null) { org.jdom.Element child = e.getChild(POINT); if (child != null) { Point pt = getPoint(child, null, new Point()); result = new Color(img.getRGB(pt.x, pt.y)); } } return result; } public static final String DIRECTION = "direction"; public static final int DIRECTION_UP = 0, DIRECTION_DOWN = 1, DIRECTION_LEFT = 2, DIRECTION_RIGHT = 3; public static final String[] directionName = {UP, DOWN, LEFT, RIGHT}; public static int getDirection(org.jdom.Element e, int defaultValue) throws Exception { if (e == null) { return defaultValue; } return getStrIndexAttr(e, DIRECTION, directionName, defaultValue); } public static final String ALIGNMENT = "alignment"; public static final String HALIGN = "hAlign", VALIGN = "vAlign"; public static final int ALIGN_LEFT = 0, ALIGN_TOP = 0, ALIGN_MIDDLE = 1, ALIGN_RIGHT = 2, ALIGN_BOTTOM = 2; public static final String[] hAlignName = {"left", "middle", "right"}; public static final String[] vAlignName = {"top", "middle", "bottom"}; public static final int[] DEFAULT_ALIGNMENT = {ALIGN_MIDDLE, ALIGN_MIDDLE}; public static int getHAlign(org.jdom.Element e, int defaultValue) throws Exception { if (e == null) { return defaultValue; } return getStrIndexAttr(e, HALIGN, hAlignName, defaultValue); } public static int getVAlign(org.jdom.Element e, int defaultValue) throws Exception { if (e == null) { return defaultValue; } return getStrIndexAttr(e, VALIGN, vAlignName, defaultValue); } public static int[] getAlignment(org.jdom.Element e, String id, int[] defaultValue) throws Exception { if (defaultValue == null) { defaultValue = DEFAULT_ALIGNMENT; } if (id != null) { e = getChildWithId(e, ALIGNMENT, id); } else if (e != null && !e.getName().equals(ALIGNMENT)) { e = e.getChild(ALIGNMENT); } if (e == null) { return defaultValue; } int[] al = new int[2]; al[0] = getHAlign(e, defaultValue == null ? defaultValue[0] : ALIGN_MIDDLE); al[1] = getVAlign(e, defaultValue == null ? defaultValue[1] : ALIGN_MIDDLE); return al; } public static int[] getAlignProp(org.jdom.Element e, String id, int[] defaultValue) throws Exception { int[] result = new int[2]; if (defaultValue == null) { defaultValue = DEFAULT_ALIGNMENT; } result[0] = defaultValue[0]; result[1] = defaultValue[1]; if (id != null) { String s = e.getAttributeValue(id); if (s != null && s.length() > 0) { StringTokenizer st = new StringTokenizer(s, ","); if (st.hasMoreTokens()) { result[0] = getStrIndexAttr(st.nextToken(), hAlignName, defaultValue[0]); } if (st.hasMoreTokens()) { result[1] = getStrIndexAttr(st.nextToken(), vAlignName, defaultValue[1]); } } } return result; } public static void setAlignProp( org.jdom.Element e, String id, int[] align, boolean omitIfDefault) { if (e != null && id != null && align != null && align.length == 2) { if (!omitIfDefault || !isDefaultAlign(align)) { e.setAttribute(id, hAlignName[align[0]] + "," + vAlignName[align[1]]); } } } public static boolean isDefaultAlign(int[] align) { return (align != null && align[0] == ALIGN_MIDDLE && align[1] == ALIGN_MIDDLE); } // ---------------------------------------------------------------------- // conversion functions for paragraphs of plain text // ---------------------------------------------------------------------- public static org.jdom.Element addParagraphs( org.jdom.Element parent, String childName, String text) { org.jdom.Element result = null; if (text != null) { result = new org.jdom.Element(childName); setParagraphs(result, text); parent.addContent(result); } return result; } public static void setParagraphs(org.jdom.Element e, String text) { if (text != null) { StringTokenizer st = new StringTokenizer(text, "\n"); while (st.hasMoreTokens()) { e.addContent(new org.jdom.Element(P).setText(st.nextToken())); } } } public static String getParagraphs(org.jdom.Element e) { StringBuilder sb = null; if (e != null) { java.util.Iterator itr = e.getChildren(P).iterator(); while (itr.hasNext()) { String s = ((org.jdom.Element) itr.next()).getText(); if (sb == null) { sb = new StringBuilder(s); } else { sb.append("\n").append(s); } } } return (sb == null ? null : sb.substring(0)); } // ---------------------------------------------------------------------- // conversion functions for arrays // ---------------------------------------------------------------------- public static String intArrayToString(int[] v) { return intArrayToString(v, v.length); } public static String intArrayToString(int[] v, int numElements) { StringBuilder sb = new StringBuilder(numElements * 4); for (int i = 0; i < numElements; i++) { sb.append(v[i]).append(' '); } return sb.substring(0).trim(); } public static int[] stringToIntArray(String s) throws Exception { StringTokenizer st = new StringTokenizer(s, " "); int numTokens = st.countTokens(); int[] result = new int[numTokens]; for (int i = 0; i < numTokens; i++) { result[i] = Integer.parseInt(st.nextToken()); } return result; } // ---------------------------------------------------------------------- // primitive types conversion functions // ---------------------------------------------------------------------- // int public static int getIntAttr(org.jdom.Element e, String attr, int defaultValue) { String s = e.getAttributeValue(attr); int result = defaultValue; if (s != null) { result = Integer.parseInt(s); } return result; } // long public static long getLongAttr(org.jdom.Element e, String attr, long defaultValue) { String s = e.getAttributeValue(attr); long result = defaultValue; if (s != null) { result = Long.parseLong(s); } return result; } // triple state public static final String[] BOOL_STR = {"false", "true", "default"}; public static final int FALSE = 0, TRUE = 1, DEFAULT = 2; public static String triStateString(int state) { if (state < 0 || state >= DEFAULT) { state = DEFAULT; } return BOOL_STR[state]; } public static int getTriStateAttr(org.jdom.Element e, String attr, int defaultValue) throws Exception { return getStrIndexAttr(e, attr, BOOL_STR, defaultValue); } public static boolean checkTriState(int v) { return v >= FALSE && v <= DEFAULT; } // boolean and Boolean public static String boolString(boolean value) { return BOOL_STR[value ? TRUE : FALSE]; } public static boolean getBoolAttr(org.jdom.Element e, String attr, boolean defaultValue) { String s = e.getAttributeValue(attr); boolean result = defaultValue; if (s != null) { if (s.equalsIgnoreCase(BOOL_STR[TRUE])) { result = true; } else if (s.equalsIgnoreCase(BOOL_STR[FALSE])) { result = false; } else { throw new NumberFormatException("invalid boolean: " + s); } } return result; } public static Boolean getBooleanAttr(org.jdom.Element e, String attr, Boolean defaultValue) { String s = e.getAttributeValue(attr); Boolean result = defaultValue; if (s != null) { if (s.equalsIgnoreCase(BOOL_STR[TRUE]) || s.equalsIgnoreCase(BOOL_STR[FALSE])) { result = Boolean.valueOf(s); } else { throw new NumberFormatException("invalid boolean: " + s); } } return result; } // float public static float getFloatAttr(org.jdom.Element e, String attr, float defaultValue) { String s = e.getAttributeValue(attr); float result = defaultValue; if (s != null) { result = Float.parseFloat(s); } return result; } // double public static double getDoubleAttr(org.jdom.Element e, String attr, double defaultValue) { String s = e.getAttributeValue(attr); double result = defaultValue; if (s != null) { result = Double.parseDouble(s); } return result; } // ---------------------------------------------------------------------- // conversion functions for basic classes // ---------------------------------------------------------------------- // String public static String getStringAttr( org.jdom.Element e, String attr, String defaultValue, boolean allowEmpty) { String s = e.getAttributeValue(attr); String result = defaultValue; if (s != null && (allowEmpty || s.length() > 0)) { result = s; } return result; } public static void setStringAttr( org.jdom.Element e, String key, String value, boolean allowEmpty) { String v = allowEmpty && (value == null || value.length() == 0) ? "" : value; if (key != null && v != null) { e.setAttribute(key, v); } } // String array index public static int getStrIndexAttr( org.jdom.Element e, String attr, String[] values, int defaultValue) throws Exception { return getStrIndexAttr(e.getAttributeValue(attr), values, defaultValue); } public static int getStrIndexAttr(String s, String[] values, int defaultValue) throws Exception { int result = defaultValue; if (s != null && s.length() > 0) { for (result = 0; result < values.length; result++) { if (s.equalsIgnoreCase(values[result])) { break; } } if (result == values.length) { throw new Exception("Unknown value: " + s); } } return result; } // Dimension private static final int rare = -18634527; public static Dimension getDimensionAttr( org.jdom.Element e, String atrW, String atrH, Dimension defaultValue) { Dimension result = defaultValue; int w = getIntAttr(e, atrW, rare); int h = getIntAttr(e, atrH, rare); if (w != rare && h != rare) { result = new Dimension(w, h); } return result; } // Point public static Point getPointAttr( org.jdom.Element e, String atrX, String atrY, Point defaultValue) { Point result = defaultValue; int x = getIntAttr(e, atrX, rare); int y = getIntAttr(e, atrY, rare); if (x != rare && y != rare) { result = new Point(x, y); } return result; } // Date public static String dateToStringShortUS(Date date) { return DateFormat.getDateInstance(DateFormat.SHORT, Locale.US).format(date); } public static Date getDateAttrShortUS(org.jdom.Element e, String attr, Date defaultValue) throws Exception { Date result = defaultValue; String s; if ((s = getStringAttr(e, attr, null, false)) != null) { result = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US).parse(s); } return result; } public static final String NEWLINE = "\n", BLANK = ""; public static void clearNewLineElements(org.jdom.Element e) { if (e != null) { List toRemove = null; boolean hasChildren = !e.getChildren().isEmpty(); List content = e.getContent(); for (Object o : content) { if (o instanceof org.jdom.Element) { clearNewLineElements((org.jdom.Element) o); } else if (hasChildren && o instanceof org.jdom.Text) { if (toRemove == null) { toRemove = new ArrayList(); } toRemove.add((org.jdom.Text) o); } } if (toRemove != null) { for (org.jdom.Text o : toRemove) { content.remove(o); } } } } public static org.jdom.input.SAXBuilder getSAXBuilder() { if (saxBuilder == null) { /* try{ saxBuilder=new org.jdom.input.SAXBuilder("org.apache.crimson.parser.XMLReaderImpl"); } catch(Exception ex){ saxBuilder=new org.jdom.input.SAXBuilder(); } */ saxBuilder = new org.jdom.input.SAXBuilder(); } return saxBuilder; } public static void saveDocument(OutputStream out, org.jdom.Element rootElement) throws Exception { saveDocument(out, new org.jdom.Document(rootElement)); } public static void saveDocument(OutputStream out, org.jdom.Document doc) throws Exception { getXMLOutputter().output(doc, out); out.flush(); } public static org.jdom.output.XMLOutputter getXMLOutputter() { if (outputter == null) { org.jdom.output.Format format = org.jdom.output.Format.getPrettyFormat(); format.setIndent(" "); format.setEncoding("UTF-8"); format.setTextMode(org.jdom.output.Format.TextMode.PRESERVE); outputter = new org.jdom.output.XMLOutputter(format); } return outputter; } public static void checkName(org.jdom.Element e, String expectedName) throws Exception { if (e == null) { throw new org.jdom.JDOMException( "Null element passed as argument, expecting: \"" + expectedName + "\""); } if (!e.getName().equals(expectedName)) { throw new org.jdom.JDOMException( "Find element \"" + e.getName() + "\" while expecting \"" + expectedName + "\""); } } public static String getClassName(org.jdom.Element e) throws Exception { if (e == null) { throw new org.jdom.JDOMException("Element without class name!"); } return e.getAttributeValue(CLASS); } } src/core/edu/xtec/util/KJMenuItem.java000066400000000000000000000032751335566474600201370ustar00rootroot00000000000000/* * File : KJMenuItem.java * Created : 17-jul-2002 18:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JMenuItem; import javax.swing.KeyStroke; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class KJMenuItem extends JMenuItem { /** Creates a new instance of KJMenuItem */ public KJMenuItem(Action a) { super(a); } @Override protected void configurePropertiesFromAction(Action a) { setText((a != null ? (String) a.getValue(Action.NAME) : null)); setIcon((a != null ? (Icon) a.getValue(Action.SMALL_ICON) : null)); setEnabled((a != null ? a.isEnabled() : true)); if (a != null) { Object o = a.getValue(Action.ACCELERATOR_KEY); if (o != null && o instanceof KeyStroke) setAccelerator((KeyStroke) o); o = a.getValue(Action.MNEMONIC_KEY); if (o != null && o instanceof Integer) setMnemonic(((Integer) o).intValue()); } } } src/core/edu/xtec/util/LFUtil.java000066400000000000000000000073121335566474600173220ustar00rootroot00000000000000/* * File : LFUtil.java * Created : 24-oct-2001 21:22 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Color; import java.awt.Component; import java.awt.Font; import javax.swing.SwingUtilities; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public abstract class LFUtil { /** Key for Options */ public static final String LOOK_AND_FEEL = "lookAndFeel"; /** Default look & feel name */ public static final String DEFAULT = "default"; /** System look & feel name */ public static final String SYSTEM = "system"; /** Metal look & feel name */ public static final String METAL = "metal"; /** Motif look & feel name */ public static final String MOTIF = "motif"; /** Windows look & feel name */ public static final String WINDOWS = "windows"; public static final String[] VALUES = { DEFAULT, SYSTEM, METAL, MOTIF }; /** * Sets the app look & feel * * @param friendlyName Look & feel name. If null, empty or not recognized * this function does nohing. */ public static void setLookAndFeel(String friendlyName, Component rootComponent) { if (friendlyName != null) { try { if (friendlyName.equals(DEFAULT)) setLookAndFeel(null, javax.swing.UIManager.getCrossPlatformLookAndFeelClassName(), rootComponent); else if (friendlyName.equals(SYSTEM)) setLookAndFeel(null, javax.swing.UIManager.getSystemLookAndFeelClassName(), rootComponent); else if (friendlyName.equals(METAL)) setLookAndFeel("javax.swing.plaf", "metal.MetalLookAndFeel", rootComponent); else if (friendlyName.equals(MOTIF)) setLookAndFeel("com.sun.java.swing.plaf", "motif.MotifLookAndFeel", rootComponent); else if (friendlyName.equals(WINDOWS)) setLookAndFeel("com.sun.java.swing.plaf", "windows.WindowsLookAndFeel", rootComponent); } catch (Exception ex) { System.err.println("unable to set lookAndFeel to: \"" + friendlyName + "\"\n" + ex); } } } private static void setLookAndFeel(String prefix, String className, Component rootComponent) throws Exception { String cl = (prefix != null && prefix.length() > 0) ? prefix + "." + className : className; javax.swing.UIManager.setLookAndFeel(cl); if (rootComponent != null) SwingUtilities.updateComponentTreeUI(rootComponent); } public static Color getSysColor(String key, Color defaultValue) { Color result = javax.swing.UIManager.getColor(key); return result == null ? defaultValue : result; } public static Color getColor(String key, Color defaultValue) { Color result = defaultValue; Object o = javax.swing.UIManager.get(key); if (o != null && o instanceof Color) result = (Color) o; return result; } public static Font getFont(String key, Font defaultValue) { Font result = defaultValue; Object o = javax.swing.UIManager.get(key); if (o != null && o instanceof Font) result = (Font) o; return result; } } src/core/edu/xtec/util/ListComboModel.java000066400000000000000000000036441335566474600210430ustar00rootroot00000000000000/* * File : ListComboModel.java * Created : 10-apr-2003 18:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import javax.swing.ComboBoxModel; import javax.swing.DefaultListModel; import javax.swing.ListModel; import javax.swing.event.ListDataListener; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ListComboModel extends Object implements ComboBoxModel { private ListModel model; private Object current; /** Creates a new instance of ListComboModel */ public ListComboModel(ListModel model) { this.model = model; } public ListComboModel() { this(new DefaultListModel()); } public ListModel getListModel() { return model; } public Object getSelectedItem() { return current; } public void setSelectedItem(Object anItem) { current = anItem; } public void addListDataListener(ListDataListener l) { model.addListDataListener(l); } public Object getElementAt(int index) { return index < 0 ? null : model.getElementAt(index); } public int getSize() { return model.getSize(); } public void removeListDataListener(ListDataListener l) { model.removeListDataListener(l); } } src/core/edu/xtec/util/Messages.java000066400000000000000000000631001335566474600177270ustar00rootroot00000000000000/* * File : Messages.java * Created : 14-sep-2001 11:22 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.BorderLayout; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.io.File; import java.text.Collator; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.StringTokenizer; import java.util.TreeMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.10.29 */ public class Messages { public static final String LANGUAGE = "language", COUNTRY = "country", VARIANT = "variant"; public static final String BASIC_BUNDLE = "messages.BasicMessages"; public static final String MESSAGES = "messages"; public static final String ERROR = "ERROR", WARNING = "WARNING"; public static final int OK = 0; // o public static final int YES = 1; // y public static final int RETRY = 2; // r public static final int NO = 3; // n public static final int IGNORE = 4; // i public static final int CANCEL = 5; // c public static final int YES_TO_ALL = 6; // Y public static final int NO_TO_ALL = 7; // N private static final int NUM_BUTTONS = 8; private static final String BTN_KEYS = "oyrnicYN"; private static final String[] BTN_CODES = { "OK", "YES", "RETRY", "NO", "IGNORE", "CANCEL", "YES_TO_ALL", "NO_TO_ALL" }; private String[] dlgButtons; public static final int MAX_PASSWORD_LENGTH = 24; private Locale currentLocale; private MultiBundle messages; private Collator collator; private java.text.NumberFormat numberFormat; private java.text.NumberFormat percentFormat; public static final String OPTIONS_DELIMITER = ","; public static final String[] KNOWN_LANGS = { "anglès", "arabic", "araucanian", "basque", "català", "catalán", "chinese", "english", "espanyol", "español", "esperanto", "euskara", "francés", "francès", "french", "gallego", "german", "greek", "inglés", "italian", "latin", "occità", "occitan", "portuguès", "romanian", "spanish", "swedish", "vasco" }; public static final String[] KNOWN_LANG_CODES = { "en", "ar", "arn", "eu", "ca", "ca", "ch", "en", "es", "es", "eo", "eu", "fr", "fr", "fr", "gl", "de", "gr", "en", "it", "la", "oc", "oc", "pt", "ro", "es", "sv", "eu" }; public Messages(String bundle) { init(bundle, null, null, null); } public Messages(String bundle, String options) { StringTokenizer st = new StringTokenizer(options, OPTIONS_DELIMITER); init(bundle, st.hasMoreTokens() ? st.nextToken() : null, st.hasMoreTokens() ? st.nextToken() : null, st.hasMoreTokens() ? st.nextToken() : null); } public Messages(String bundle, java.util.HashMap options) { init(bundle, (String) options.get(LANGUAGE), (String) options.get(COUNTRY), (String) options.get(VARIANT)); } public Messages(String bundle, String language, String country, String variant) { init(bundle, language, country, variant); } public static Messages getMessages(HashMap options, String bundle) { Messages msg = (Messages) options.get(MESSAGES); if (msg == null) { String language = (String) options.get(LANGUAGE); if (language == null) { JOptionPane pane = new JOptionPane("Please select your language:", JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION); pane.setSelectionValues(getDescriptiveLanguageCodes(null)); pane.setWantsInput(true); String initialSelection = getDescriptiveLanguageCode(Locale.getDefault().getLanguage()); pane.setInitialSelectionValue(initialSelection); showDlg((Component) options.get(Options.MAIN_PARENT_COMPONENT), pane, "Language selecion"); String sel = (String) pane.getInputValue(); if (sel == null) { sel = initialSelection; } options.put(LANGUAGE, getLanguageFromDescriptive(sel)); } msg = new Messages(bundle, options); options.put(MESSAGES, msg); Locale.setDefault(msg.getLocale()); } else if (bundle != null) { msg.setLocale(options); msg.addBundle(bundle); } return msg; } private void init(String bundle, String language, String country, String variant) { setLocale(language, country, variant); addBundle(bundle); addBundle(BASIC_BUNDLE); getDlgButtons(true); } public void setLocale(java.util.HashMap options) { setLocale((String) options.get(LANGUAGE), (String) options.get(COUNTRY), (String) options.get(VARIANT)); } public void setLocale(String language, String country, String variant) { Locale l; if (country == null) { country = ""; } if (language == null || language.length() == 0) { l = (currentLocale == null ? Locale.getDefault() : currentLocale); } else if (variant == null || variant.length() == 0) { l = new Locale(language, country); } else { l = new Locale(language, country, variant); } if (!l.equals(currentLocale)) { currentLocale = l; numberFormat = java.text.NumberFormat.getInstance(currentLocale); percentFormat = java.text.NumberFormat.getPercentInstance(currentLocale); collator = null; if (messages != null) { messages.setLocale(currentLocale); getDlgButtons(true); } } } public String[] getDlgButtons(boolean update) { if (update || dlgButtons == null) { dlgButtons = new String[NUM_BUTTONS]; for (int i = 0; i < NUM_BUTTONS; i++) { dlgButtons[i] = get(BTN_CODES[i]); } } return dlgButtons; } public void addBundle(String bundle) { if (currentLocale != null && bundle != null) { try { java.util.ResourceBundle b = ResourceManager.getBundle(bundle, currentLocale); if (messages == null) { messages = new MultiBundle(b, bundle, currentLocale); } else { messages.addBundle(b, bundle, currentLocale); } } catch (Exception ex) { System.err.println("unable to build messagesBundle: " + bundle); System.err.println(ex); } } } public String getShortDateStr(Date date) { DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, currentLocale); return df.format(date); } public String getShortDateTimeStr(Date date) { DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, currentLocale); return df.format(date); } public Date parseShortDate(String str) { Date result = null; if (str != null) { try { result = DateFormat.getDateInstance(DateFormat.SHORT, currentLocale).parse(str); } catch (java.text.ParseException ex) { // bad data! } } return result; } public String get(String group, String key) { return get(new StringBuilder(group).append(key).substring(0)); } public static String get(HashMap options, String group, String key) { return getMessages(options, null).get(group, key); } public String get(String key) { return messages == null ? key : messages.getString(key); } public static String get(HashMap options, String key) { return getMessages(options, null).get(key); } public String getAllowNull(String key) { return key == null ? "" : get(key); } public String get(String key1, String s, String key2) { StringBuilder sb = new StringBuilder(getAllowNull(key1)); sb.append(" ").append(s != null ? s : "").append(" ").append(getAllowNull(key2)); return sb.substring(0); } public Locale getLocale() { return currentLocale; } public Collator getCollator() { if (collator == null) { collator = Collator.getInstance(currentLocale); } return collator; } protected String[] parseButtons(String btnCodes) { btnCodes = StrUtils.secureString(btnCodes, "o"); String[] result = new String[btnCodes.length()]; String[] dlg = getDlgButtons(false); for (int i = 0; i < btnCodes.length(); i++) { int k = Math.max(BTN_KEYS.indexOf(btnCodes.charAt(i)), 0); result[i] = dlg[k]; } return result; } protected JButton[] parseJButtons(String btnCodes) { btnCodes = StrUtils.secureString(btnCodes, "o"); JButton[] result = new JButton[btnCodes.length()]; String[] dlg = getDlgButtons(false); for (int i = 0; i < btnCodes.length(); i++) { int k = Math.max(BTN_KEYS.indexOf(btnCodes.charAt(i)), 0); result[i] = new JButton(dlg[k]); result[i].setActionCommand(BTN_CODES[k]); } return result; } public int showQuestionDlg(Component parent, String key, String titleKey, String buttons) { return showQuestionDlgObj(parent, get(key), titleKey, buttons); } public int showQuestionDlgObj(Component parent, Object msg, String titleKey, String buttons) { NarrowOptionPane pane = new NarrowOptionPane(60, msg, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, parseButtons(buttons)); String title = get(StrUtils.secureString(titleKey, "QUESTION")); return getFeedback(parent, pane, title); } public String showInputDlg(Component parent, String msgKey, String shortPromptKey, String initialValue, String titleKey, boolean isPassword) { String[] msgKeys = null; if (msgKey != null) { msgKeys = new String[] { msgKey }; } return showInputDlg(parent, msgKeys, shortPromptKey, initialValue, titleKey, isPassword); } public String showInputDlg(Component parent, String[] msgKeys, String shortPromptKey, String initialValue, String titleKey, boolean isPassword) { String result = null; JTextField textField; if (isPassword) { textField = new JPasswordField(MAX_PASSWORD_LENGTH); if (shortPromptKey == null) { shortPromptKey = "PASSWORD"; } } else { textField = new JTextField(MAX_PASSWORD_LENGTH); } if (initialValue != null) { textField.setText(initialValue); } if (showInputDlg(parent, msgKeys, new String[] { shortPromptKey }, new JComponent[] { textField }, titleKey)) { if (isPassword) { char[] pwch = ((JPasswordField) textField).getPassword(); if (pwch != null && pwch.length > 0) { result = String.copyValueOf(pwch); } } else { result = textField.getText(); } } return result; } public boolean showInputDlg(Component parent, String[] msgKeys, String[] shortPromptKeys, JComponent[] promptObjects, String titleKey) { ArrayList v = new ArrayList(); if (msgKeys != null) { for (String msgKey : msgKeys) { v.add(get(msgKey)); } } if (promptObjects != null) { if (shortPromptKeys == null) { for (JComponent jc : promptObjects) { v.add(jc); } } else { GridBagLayout gridBag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.insets = new java.awt.Insets(3, 3, 3, 3); JPanel panel = new JPanel(gridBag); for (int i = 0; i < promptObjects.length; i++) { if (shortPromptKeys.length > i) { JLabel lb = new JLabel(get(shortPromptKeys[i])); lb.setLabelFor(promptObjects[i]); lb.setHorizontalAlignment(SwingConstants.LEFT); c.gridwidth = GridBagConstraints.RELATIVE; gridBag.setConstraints(lb, c); panel.add(lb); } c.gridwidth = GridBagConstraints.REMAINDER; gridBag.setConstraints(promptObjects[i], c); panel.add(promptObjects[i]); } v.add(panel); } } String title = (titleKey != null ? get(titleKey) : ""); NarrowOptionPane pane = new NarrowOptionPane(60, v.toArray(), JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, parseButtons("oc")); return getFeedback(parent, pane, title) == OK; } public boolean showInputDlg(Component parent, JComponent mainComponent, String titleKey) { return showInputDlg(parent, mainComponent, titleKey, "oc"); } public boolean showInputDlg(Component parent, JComponent mainComponent, String titleKey, String buttons) { return showInputDlg(parent, mainComponent, titleKey, buttons, false); } public boolean showInputDlg(Component parent, JComponent mainComponent, String titleKey, String buttons, boolean centerOnParent) { InputDlg dlg = new InputDlg(parent, titleKey, buttons, mainComponent, centerOnParent); return dlg.getFeedback() == OK; } class InputDlg extends JDialog implements java.awt.event.ActionListener { int result = CANCEL; Component parent; boolean centerOnParent; InputDlg(Component parent, String titleKey, String buttons, JComponent mainComponent, boolean centerOnParent) { // 26-jan-06 - Modified to solve bug #73, reported by Jorda Polo // Compile error in gcj 4.0.3: // "Can't reference 'this' before the superclass constructor has been called." // OLD CODE: // super(JOptionPane.getFrameForComponent(parent), titleKey!=null ? // get(titleKey) : "", true); // NEW CODE: // Split in two steps: // 1 - call super with 'owner' and 'modal' parameters // 2 - if 'titleKey' not null, set title super(JOptionPane.getFrameForComponent(parent), true); if (titleKey != null) { setTitle(get(titleKey)); } // -------- this.parent = parent; this.centerOnParent = centerOnParent; setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setLayout(new BorderLayout(10, 10)); if (mainComponent != null) { getContentPane().add(mainComponent, BorderLayout.CENTER); } JButton[] btn = parseJButtons(buttons); JPanel btnPanel = new JPanel(); JButton defaultBtn = null; for (JButton b : btn) { btnPanel.add(b); b.addActionListener(this); String cmd = b.getActionCommand(); if (defaultBtn == null && (BTN_CODES[OK].equals(cmd) || BTN_CODES[YES].equals(cmd))) { defaultBtn = b; } } getContentPane().add(btnPanel, BorderLayout.SOUTH); if (defaultBtn != null) { getRootPane().setDefaultButton(defaultBtn); } } public void actionPerformed(java.awt.event.ActionEvent ev) { if (ev != null) { String cmd = ev.getActionCommand(); for (int i = 0; i < BTN_CODES.length; i++) { if (BTN_CODES[i].equals(cmd)) { result = i; break; } } setVisible(false); } } public int getFeedback() { pack(); Component cmp = centerOnParent ? parent : JOptionPane.getFrameForComponent(parent); if (cmp != null) { int pw = cmp.getWidth(); int ph = cmp.getHeight(); setLocation((pw - getWidth()) / 2, (ph - getHeight()) / 2); setLocationRelativeTo(cmp); } if (!showDlg(this)) { result = CANCEL; } return result; } } public void showAlert(Component parent, String key) { showAlert(parent, new String[] { get(key) }); } public void showAlert(Component parent, String[] msg) { System.err.println("Warning:"); for (String s : msg) { System.err.println(s); } NarrowOptionPane pane = new NarrowOptionPane(60, msg, JOptionPane.WARNING_MESSAGE, JOptionPane.DEFAULT_OPTION, null, parseButtons(null)); getFeedback(parent, pane, get(WARNING)); } public int showErrorWarning(Component parent, String key, Exception ex) { return showErrorWarning(parent, key, (List) null, ex, null); } public int showErrorWarning(Component parent, String key, Exception ex, String buttons) { return showErrorWarning(parent, key, (List) null, ex, buttons); } public int showErrorWarning(Component parent, String key, String value, Exception ex, String buttons) { List v = new ArrayList(); if (value != null) { v.add(value); } return showErrorWarning(parent, key, v, ex, buttons); } public int showErrorWarning(Component parent, String key, List values, Exception ex, String buttons) { if (key == null) { key = ERROR; } List v = new ArrayList(); String mainMsg = get(key); System.err.println(mainMsg); v.add(mainMsg); if (values != null) { Iterator it = values.iterator(); while (it.hasNext()) { Object o = it.next(); if (o != null) { v.add(o); System.err.println(o); } } } if (ex != null) { String s = ex.getLocalizedMessage(); if (s != null) { v.add(s); } else { v.add(ex.toString()); } System.err.println(s); ex.printStackTrace(System.err); } NarrowOptionPane pane = new NarrowOptionPane(60, v.toArray(), JOptionPane.ERROR_MESSAGE, JOptionPane.DEFAULT_OPTION, null, parseButtons(buttons)); return getFeedback(parent, pane, get(ERROR)); } public boolean confirmReadableFile(Component parent, File f) { boolean result = f.canRead(); if (!result) { showAlert(parent, new String[] { get("FILE_BEG"), quote(f.getAbsolutePath()), get(f.exists() ? "FILE_NOT READABLE" : "FILE_NOT_EXIST") }); } return result; } public int confirmOverwriteFile(Component parent, File f, String buttons) { int result = YES; if (f.exists()) { boolean dir = f.isDirectory(); List v = new ArrayList(); v.add(get(dir ? "FILE_DIR_BEG" : "FILE_BEG")); v.add(quote(f.getAbsolutePath())); boolean readOnly = !f.canWrite(); if (readOnly) { v.add(get("FILE_READONLY")); } else { v.add(get("FILE_EXISTS")); v.add(get(dir ? "FILE_OVERWRITE_DIR_PROMPT" : "FILE_OVERWRITE_PROMPT")); } if (readOnly) { showErrorWarning(parent, ERROR, v, null, null); result = CANCEL; } else { NarrowOptionPane pane = new NarrowOptionPane(60, v.toArray(), JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, parseButtons(buttons)); result = getFeedback(parent, pane, get("CONFIRM")); } } return result; } private static boolean showDlg(Component parent, JOptionPane pane, String title) { if (parent != null && !(parent instanceof java.awt.Frame)) { parent = JOptionPane.getFrameForComponent(parent); } JDialog dialog = pane.createDialog(parent, title); pane.selectInitialValue(); return showDlg(dialog); } public static boolean showDlg(final JDialog dialog) { if (SwingUtilities.isEventDispatchThread()) { dialog.setVisible(true); } else { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { dialog.setVisible(true); } }); } catch (Exception ex) { System.err.println("Show dialog error: " + ex); return false; } } return true; } protected int getFeedback(Component parent, JOptionPane pane, String title) { int result = CANCEL; if (showDlg(parent, pane, title)) { Object selectedValue = pane.getValue(); if (selectedValue != null) { for (int i = 0; i < NUM_BUTTONS; i++) { if (dlgButtons[i].equals(selectedValue)) { result = i; break; } } } } return result; } public static String quote(String text) { return new StringBuilder(" \"").append(text).append("\" ").substring(0); } public String kValue(long v) { StringBuilder sb = new StringBuilder(20); sb.append(numberFormat.format(v / 1024)).append(" Kb"); return sb.substring(0); } public String fileSize(long size) { StringBuilder sb = new StringBuilder(20); int kb = (int) size / 1024; double mb = ((double) size) / (1024 * 1024); if (kb == 0) { sb.append(numberFormat.format(size)).append(" bytes"); } else if (mb < 1.0) { sb.append(numberFormat.format(kb)).append(" Kb"); } else { int digits = numberFormat.getMaximumFractionDigits(); numberFormat.setMaximumFractionDigits(1); sb.append(numberFormat.format(mb)).append(" Mb"); numberFormat.setMaximumFractionDigits(digits); } return sb.substring(0); } public String getNumber(long v) { return numberFormat.format(v); } public String getNumber(double v) { return numberFormat.format(v); } public String getPercent(long v) { return percentFormat.format(((double) v) / 100); } public String getPercent(double v) { return percentFormat.format(v); } public String getHmsTime(long milis) { long v = milis / 1000; if (v < 1) { v = 1; } StringBuilder sb = new StringBuilder(50); if (v >= 3600) { sb.append(v / 3600).append("h"); } if (v >= 60) { sb.append((v % 3600) / 60).append("'"); } sb.append(v % 60).append("\""); return sb.substring(0); } /* * Since the Java specification does not include the ISO 639-2 three-letter * language codes, we provide this HashMap to support it. The list will be * expanded as new translations of JClic where created. */ public static final HashMap ISO_639_2_CODES = new HashMap(); static { ISO_639_2_CODES.put("ast", "asturianu"); ISO_639_2_CODES.put("vec", "vèneto"); } public static String getDescriptiveLanguageCode(String languageCode) { String result = null; if (languageCode != null) { result = (String) ISO_639_2_CODES.get(languageCode); if (result == null) { Locale lx = new Locale(languageCode, ""); result = lx.getDisplayName(Locale.getDefault()); } result = result + " (" + languageCode + ")"; } return result; } public static String getLanguageFromDescriptive(String descriptive) { String result = null; int p = -1; if (descriptive != null && (descriptive = descriptive.trim()).length() > 4 && (p = descriptive.lastIndexOf('(')) > 0) { result = descriptive.substring(p + 1, descriptive.length() - 1); } return result; } private static HashMap descriptiveLanguageCodes = new HashMap(); public static String[] getDescriptiveLanguageCodes(Locale inLocale) { String key = (inLocale == null ? "null" : inLocale.toString()); String[] result = descriptiveLanguageCodes.get(key); if (result == null) { Locale dl = Locale.getDefault(); String[] lc = Locale.getISOLanguages(); TreeMap tree = new TreeMap(); for (String l : lc) { String s; // EXCEPTIONS: if (inLocale == null && l.equals("eu")) { s = "euskara"; } else if (inLocale == null && l.equals("gl")) { s = "galego"; } else { Locale lx = new Locale(l, ""); s = lx.getDisplayName(inLocale == null ? lx : dl); } tree.put(l, s + " (" + l + ")"); } for (String k : ISO_639_2_CODES.keySet()) { String s = (String) ISO_639_2_CODES.get(k); tree.put(k, s + " (" + k + ")"); } result = new String[tree.size()]; Iterator it = tree.values().iterator(); int i = 0; while (it.hasNext()) { result[i++] = (String) it.next(); } descriptiveLanguageCodes.put(key, result); } return result; } public String[] getDescriptiveLanguageCodes() { return getDescriptiveLanguageCodes(getLocale()); } public static String getKnownLanguageCode(String language) { String result = null, lang = (language == null) ? "" : language.toLowerCase(); for (int i = 0; i < KNOWN_LANGS.length; i++) { if (KNOWN_LANGS[i].equals(lang)) { result = KNOWN_LANG_CODES[i]; break; } } return result; } private static HashMap codesToNames; private static HashMap namesToCodes; private static void buildLanguageMaps() { String[] dlc = getDescriptiveLanguageCodes(null); codesToNames = new HashMap(dlc.length); namesToCodes = new HashMap(dlc.length); for (String c : dlc) { // Allow country codes with more than two letters int p = c.lastIndexOf('(') - 1; String name = c.substring(0, p).toLowerCase(); String code = c.substring(p + 2, c.length() - 1); codesToNames.put(code, name); namesToCodes.put(name, code); } } public static HashMap getCodesToNames() { if (codesToNames == null) { buildLanguageMaps(); } return codesToNames; } public static HashMap getNamesToCodes() { if (namesToCodes == null) { buildLanguageMaps(); } return namesToCodes; } } src/core/edu/xtec/util/MultiBundle.java000066400000000000000000000051111335566474600204020ustar00rootroot00000000000000/* * File : MultiBundle.java * Created : 28-jan-2002 11:42 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.util.Locale; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class MultiBundle { java.util.ArrayList bundles; public MultiBundle(ResourceBundle mainBundle, String resource, Locale l) { bundles = new java.util.ArrayList(1); bundles.add(new ResourceBundleEx(mainBundle, resource, l)); } public void addBundle(ResourceBundle bundle, String resource, Locale l) { for (int i = 0; i < bundles.size(); i++) if (((ResourceBundleEx) bundles.get(i)).resource.equals(resource)) return; bundles.add(new ResourceBundleEx(bundle, resource, l)); } public void setLocale(Locale l) { for (int i = 0; i < bundles.size(); i++) (bundles.get(i)).setLocale(l); } public String getString(String key) { String result = key; for (int i = 0; i < bundles.size(); i++) { try { result = bundles.get(i).bundle.getString(key); return result; } catch (Exception ex) { // do nothing } } System.err.println("Unable to find resource message: [" + result + "]"); return result; } class ResourceBundleEx { ResourceBundle bundle = null; String resource = null; Locale locale = null; ResourceBundleEx(ResourceBundle bundle, String resource, Locale locale) { this.resource = resource; this.locale = locale; this.bundle = bundle; } void setLocale(Locale l) { if (!locale.equals(l)) { try { bundle = ResourceManager.getBundle(resource, l); locale = l; } catch (Exception ex) { System.err.println("unable to build messagesBundle: " + resource); System.err.println(ex); } } } } } src/core/edu/xtec/util/NarrowOptionPane.java000066400000000000000000000057141335566474600214340ustar00rootroot00000000000000/* * File : NarrowOptionPane.java * Created : 23-jan-2004 09:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import javax.swing.Icon; import javax.swing.JOptionPane; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class NarrowOptionPane extends JOptionPane { public static final int DEFAULT_CH = 60; int maxCharactersPerLineCount; /** Creates a new instance of NarrowOptionPane */ public NarrowOptionPane(int maxCharactersPerLineCount) { this(maxCharactersPerLineCount, "JOptionPane message"); } public NarrowOptionPane(int maxCharactersPerLineCount, Object message) { this(maxCharactersPerLineCount, message, JOptionPane.PLAIN_MESSAGE); } public NarrowOptionPane(int maxCharactersPerLineCount, Object message, int messageType) { this(maxCharactersPerLineCount, message, messageType, JOptionPane.DEFAULT_OPTION); } public NarrowOptionPane(int maxCharactersPerLineCount, Object message, int messageType, int optionType) { this(maxCharactersPerLineCount, message, messageType, optionType, null); } public NarrowOptionPane(int maxCharactersPerLineCount, Object message, int messageType, int optionType, Icon icon) { this(maxCharactersPerLineCount, message, messageType, optionType, icon, null); } public NarrowOptionPane(int maxCharactersPerLineCount, Object message, int messageType, int optionType, Icon icon, Object[] options) { this(maxCharactersPerLineCount, message, messageType, optionType, icon, options, null); } public NarrowOptionPane(int maxCharactersPerLineCount, Object message, int messageType, int optionType, Icon icon, Object[] options, Object initialValue) { if ((message instanceof String) && ((String) message).trim().toLowerCase().startsWith("")) { maxCharactersPerLineCount = Integer.MAX_VALUE; } this.maxCharactersPerLineCount = maxCharactersPerLineCount; setMessage(message); setOptions(options); setInitialValue(initialValue); setIcon(icon); setMessageType(messageType); setOptionType(optionType); value = JOptionPane.UNINITIALIZED_VALUE; inputValue = JOptionPane.UNINITIALIZED_VALUE; updateUI(); } @Override public int getMaxCharactersPerLineCount() { return maxCharactersPerLineCount; } } src/core/edu/xtec/util/Options.java000066400000000000000000000155271335566474600176250ustar00rootroot00000000000000/* * File : Options.java * Created : 02-jul-2002 00:20 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.applet.Applet; import java.awt.Component; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class Options extends HashMap { public static final String TRUE = "true", FALSE = "false"; public static final Boolean BTRUE = true, BFALSE = false; public static final String MAC = "Mac", WIN = "Windows", JAVA131 = "java131", JAVA14 = "java14", JAVA141 = "java141", ARCH64BIT = "arch64bit"; public static final String MAIN_PARENT_COMPONENT = "mainParentComponent", APPLET = "applet"; public static final String LANGUAGE_BY_PARAM = "languageByParam"; protected static final String[] TRANSIENT_KEYS = { MAIN_PARENT_COMPONENT, APPLET, LANGUAGE_BY_PARAM, MAC, WIN, JAVA14, JAVA131, JAVA141, ARCH64BIT, Messages.MESSAGES }; public Options() { init(); } public Options(Map t) { super(t); init(); } public Options(Component cmp) { init(); if (cmp != null) setMainComponent(cmp); } protected void init() { String ver = System.getProperty("java.version"); if (ver != null && ver.compareTo("1.3.1") >= 0) put(JAVA131, true); if (ver != null && ver.compareTo("1.4.0") >= 0) put(JAVA14, true); if (ver != null && ver.compareTo("1.4.1") >= 0) put(JAVA141, true); String s = System.getProperty("os.name").toLowerCase(); if (s != null) { if (s.indexOf("mac") >= 0) { put(MAC, true); put(LFUtil.LOOK_AND_FEEL, LFUtil.SYSTEM); } else if (s.toLowerCase().indexOf("win") >= 0) put(WIN, true); } s = System.getProperty("sun.arch.data.model"); if ("64".equals(s)) put(ARCH64BIT, true); } public Properties toProperties() { Properties prop = new Properties(); Iterator it = keySet().iterator(); while (it.hasNext()) { Object k = it.next(); if (k != null && k instanceof String) { int i; for (i = 0; i < TRANSIENT_KEYS.length; i++) if (k.equals(TRANSIENT_KEYS[i])) break; if (i == TRANSIENT_KEYS.length) { Object v = get((String) k); if (v != null) prop.setProperty((String) k, v.toString()); } } } return prop; } public boolean getBoolean(String key) { return getBoolean(key, false); } public boolean getBoolean(String key, boolean defaultValue) { boolean result = defaultValue; Object r = get(key); if (r != null) { if (r instanceof Boolean) result = ((Boolean) r).booleanValue(); else if (r instanceof String) result = ((String) r).equalsIgnoreCase(TRUE); else if (r instanceof Integer) result = ((Integer) r).intValue() != 0; } return result; } public void putBoolean(String key, boolean value) { put(key, value ? BTRUE : BFALSE); } public String getString(String key) { return (String) get(key); } public String getString(String key, String defaultValue) { return StrUtils.secureString(get(key), defaultValue); } public int getInt(String key, int defaultValue) { int result = defaultValue; Object r = get(key); if (r != null) { if (r instanceof Integer) result = ((Integer) r).intValue(); else if (r instanceof String) { try { result = Integer.parseInt((String) r); } catch (NumberFormatException ex) { result = defaultValue; } } } return result; } public Messages getMessages() { return getMessages(null); } public Messages getMessages(String bundle) { return Messages.getMessages(this, bundle); } public String getMsg(String key) { return getMessages(null).get(key); } public Component getMainComponent() { return (Component) get(MAIN_PARENT_COMPONENT); } public Applet getApplet() { return (Applet) get(APPLET); } public void setMainComponent(Component cmp) { put(MAIN_PARENT_COMPONENT, cmp); if (cmp instanceof Applet) put(APPLET, cmp); } public void setLookAndFeel() { String s = getString(LFUtil.LOOK_AND_FEEL); if (s != null) LFUtil.setLookAndFeel(s, getMainComponent()); } public void syncProperties(Map src, boolean preserveExistingValues) { Iterator it = src.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); if (!preserveExistingValues || !containsKey(entry.getKey().toString())) put(entry.getKey().toString(), entry.getValue()); } } public static Map strToMap(String values, Map map, String delim, char equals, boolean nullsAllowed) { if (values != null && values.length() >= 0) { java.util.StringTokenizer st = new java.util.StringTokenizer(values, delim); while (st.hasMoreTokens()) { String e = st.nextToken(); int i = e.indexOf(equals); if (i > 0) { String key = e.substring(0, i); String value = e.substring(i + 1); if (key != null && key.length() > 0 && (nullsAllowed || values.length() > 0)) map.put(key, value); } } } return map; } public static String getString(Map map, String key, String defaultValue) { String result = (String) map.get(key); return result == null ? defaultValue : result; } public static java.awt.Window getWindowForComponent(Component parentComponent) { if (parentComponent == null) return null; if (parentComponent instanceof java.awt.Window) return (java.awt.Window) parentComponent; return getWindowForComponent(parentComponent.getParent()); } public static Map toStringMap(Properties prop) { Map map = new HashMap(); Enumeration keys = prop.propertyNames(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String value = prop.getProperty(key); map.put(key, value); } return map; } } src/core/edu/xtec/util/PersistentSettings.java000066400000000000000000000154651335566474600220540ustar00rootroot00000000000000/* * File : PersistentSettings.java * Created : 28-jun-2002 16:20 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.*; import java.util.Enumeration; import java.util.Properties; import java.util.StringTokenizer; import java.util.prefs.Preferences; import javax.swing.JOptionPane; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class PersistentSettings { public static final String BASE = ".edu.xtec.properties"; public static final String BASE_OLD = "edu.xtec.properties"; public static final String BUNDLE = "messages.PersistentPathsMessages"; public static final String BASE_PREFS_NODE = "/edu/xtec"; public static final String JCLIC_PREFS_NODE = "/edu/xtec/jclic"; public static Preferences userPrefs = Preferences.userRoot().node(BASE_PREFS_NODE); public static Preferences systemPrefs = Preferences.systemRoot().node(JCLIC_PREFS_NODE); // Gets basic preferences for "edu.xtec" programs. private static Properties getProperties() throws Exception { Properties prop = new Properties(); // Try to read from new "Preferences" object String[] keys = userPrefs.keys(); if (keys.length == 0) { // No keys left. Try to load from previous settings StringBuilder sb = new StringBuilder(300); sb.append(System.getProperty("user.dir")); sb.append(File.pathSeparator); sb.append(System.getProperty("user.home")); sb.append(File.pathSeparator); sb.append(System.getProperty("java.home")).append(File.separator).append("lib"); sb.append(File.pathSeparator).append(System.getProperty("java.ext.dirs")); File baseFile = null; StringTokenizer st = new StringTokenizer(sb.substring(0), File.pathSeparator); while (baseFile == null && st.hasMoreTokens()) { String s = st.nextToken(); File dir = new File(s); if (dir.exists() && dir.isDirectory()) { File testFile = new File(dir, BASE); if (testFile.canRead()) { baseFile = testFile; } else { testFile = new File(dir, BASE_OLD); if (testFile.canRead()) { baseFile = testFile; } } } } if (baseFile != null) { // Found old settings // Read it and store into "userPrefs" InputStream is = new FileInputStream(baseFile); prop.load(is); is.close(); saveSettings(prop); } } else { // Read current settings from "userPrefs" for (String k : keys) { prop.put(k, userPrefs.get(k, "")); } } return prop; } public static File getBasePathTo(String programName, Options options) throws Exception { Properties prop = getProperties(); String path = (String) prop.get(programName); if (path != null) { File d = new File(path); if (!d.exists() || !d.isDirectory()) { path = null; } } if (path == null) { // "Program Files" path is no longer used as default for storing data // instead, we will use always {user.home}/programName String sPath = System.getProperty("user.home") + File.separator + programName; Messages messages = getMessages(options, BUNDLE); String msg = messages.get("cl_alert"); int i = msg.indexOf('$'); if (i >= 0) { msg = msg.substring(0, i) + programName + msg.substring(i + 1); } boolean done = false; File d = new File(sPath); while (!done) { String result = (String) JOptionPane.showInputDialog(options.getMainComponent(), msg, messages.get("cl_prompt_title"), JOptionPane.QUESTION_MESSAGE, null, null, sPath); if (result == null) throw new Exception("bad user input!"); d = new File(result); try { if (!d.exists() || !d.isDirectory()) d.mkdirs(); done = d.exists() && d.isDirectory(); } catch (Exception ex) { messages.showErrorWarning(options.getMainComponent(), "cl_err_unableToCreateDir", ex); } } path = d.getAbsolutePath(); prop.setProperty(programName, path); saveSettings(prop); } return new File(path); } private static void saveSettings(Properties prop) throws Exception { Enumeration keys = prop.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String value = prop.getProperty(key, ""); userPrefs.put(key, value); } userPrefs.flush(); } public static Messages getMessages(Options options, String bundle) throws Exception { Messages msg = (Messages) options.get(Messages.MESSAGES); if (msg == null) { boolean mustSave = false; String l = (String) options.get(Messages.LANGUAGE); Properties prop = null; if (l == null) { prop = getProperties(); l = prop.getProperty(Messages.LANGUAGE); if (l != null) options.put(Messages.LANGUAGE, l); else mustSave = true; } else { options.put(Options.LANGUAGE_BY_PARAM, Options.BTRUE); } msg = Messages.getMessages(options, bundle); if (mustSave && prop != null) { prop.setProperty(Messages.LANGUAGE, (String) options.get(Messages.LANGUAGE)); saveSettings(prop); } } else if (bundle != null) msg.addBundle(bundle); return msg; } public static String getFilePath(String programName, String fileName, Options options, boolean createFile) { String result = null; File base; try { base = getBasePathTo(programName, options); } catch (Exception ex) { base = new File(System.getProperty("user.home")); } File testFile = new File(base, fileName); if (testFile.canRead()) result = testFile.getAbsolutePath(); else if (createFile) try { FileOutputStream fos = new FileOutputStream(testFile); fos.close(); testFile.delete(); } catch (Exception ex) { // Unable to create file in selected dir // It will be created on {user.dir} testFile = new File(fileName); } finally { result = testFile.getAbsolutePath(); } return result; } } src/core/edu/xtec/util/ProgressDialog.form000066400000000000000000000130241335566474600211260ustar00rootroot00000000000000
src/core/edu/xtec/util/ProgressDialog.java000066400000000000000000000142561335566474600211140ustar00rootroot00000000000000/* * File : ProgressDialog.java * Created : 10-dec-2002 14:40 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.InputStream; import javax.swing.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class ProgressDialog extends ExtendedJDialog implements ProgressInputStream.ProgressInputStreamListener { protected Options options = null; protected edu.xtec.util.SwingWorker worker = null; protected boolean progressActive = false; protected boolean cancellable = false; protected boolean saving = false; /** Creates new form ProgressDialog */ public ProgressDialog(JComponent parent, Options options) { super(parent, "", true); this.options = options; initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; mainPanel = new javax.swing.JPanel(); label = new javax.swing.JLabel(); fileLabel = new javax.swing.JLabel(); progressBar = new javax.swing.JProgressBar(); cancelButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); mainPanel.setLayout(new java.awt.GridBagLayout()); label.setText(" "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(12, 5, 0, 5); mainPanel.add(label, gridBagConstraints); fileLabel.setText(" "); fileLabel.setFont(new java.awt.Font("Dialog", 0, 12)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 5, 5); mainPanel.add(fileLabel, gridBagConstraints); progressBar.setPreferredSize(new java.awt.Dimension(250, 22)); progressBar.setStringPainted(true); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); mainPanel.add(progressBar, gridBagConstraints); cancelButton.setText(options.getMsg("CANCEL")); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); mainPanel.add(cancelButton, gridBagConstraints); getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER); pack(); } // GEN-END:initComponents private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_cancelButtonActionPerformed if (cancellable && worker != null) { worker.cancel(); } } // GEN-LAST:event_cancelButtonActionPerformed public void start(String titleKey, String msgKey, edu.xtec.util.SwingWorker worker, boolean showProgressBar, boolean cancellable, boolean saving) { this.worker = worker; this.cancellable = cancellable; this.saving = saving; setTitle(titleKey != null ? options.getMsg(titleKey) : ""); label.setText(options.getMsg(msgKey != null ? msgKey : "WORKING")); cancelButton.setVisible(cancellable && worker != null); progressBar.setVisible(showProgressBar); setProgressValue(0); mainPanel.revalidate(); pack(); centerOver(getParent()); if (worker != null) { worker.startLater(); } setVisible(true); } public void setText(String txt) { label.setText(txt); mainPanel.revalidate(); } public void setFileLabel(String txt) { fileLabel.setText(txt == null ? "" : txt); } public void startProgress(String name) { setProgressValue(0); name = (name == null ? "" : name.replace('\\', '/')); int i = name.lastIndexOf('/'); if (i > 0) name = name.substring(i + 1); fileLabel.setText(name == null ? "" : options.getMsg(saving ? "SAVING_FILE" : "LOADING_FILE") + " " + name); progressActive = true; } public void endProgress() { progressActive = false; } public void setProgressMax(int max) { progressBar.setMaximum(max); } public void setProgressValue(int value) { progressBar.setValue(value); } public InputStream getProgressInputStream(InputStream is, int expectedLength, String name) { InputStream result; if (!progressActive) { ProgressInputStream pi = new ProgressInputStream(is, expectedLength, name); pi.addProgressInputStreamListener(this); result = pi; } else { result = is; } return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cancelButton; private javax.swing.JLabel fileLabel; private javax.swing.JLabel label; private javax.swing.JPanel mainPanel; private javax.swing.JProgressBar progressBar; // End of variables declaration//GEN-END:variables } src/core/edu/xtec/util/ProgressInputStream.java000066400000000000000000000073461335566474600221720ustar00rootroot00000000000000/* * File : ProgressInputStream.java * Created : 04-jul-2002 13:48 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ProgressInputStream extends FilterInputStream { private int nread; private int size; private boolean started; private List listeners; private String name; public ProgressInputStream(InputStream in, int expectedLength, String name) { super(in); this.listeners = new ArrayList(); this.name = name; started = false; nread = 0; size = expectedLength; if (size <= 0) { try { size = in.available(); } catch (IOException ioe) { size = 0; } } } public void addProgressInputStreamListener(ProgressInputStreamListener isl) { if (!listeners.contains(isl)) { listeners.add(isl); } } private void start() { if (!started) { notifyListeners(MAX, size); notifyListeners(VALUE, 0); notifyListeners(START, 0); started = true; } } @Override public int read() throws IOException { if (!started) start(); int c = in.read(); if (c >= 0) notifyListeners(VALUE, size); return c; } @Override public int read(byte b[]) throws IOException { if (!started) start(); int nr = in.read(b); if (nr > 0) notifyListeners(VALUE, nread += nr); return nr; } @Override public int read(byte b[], int off, int len) throws IOException { if (!started) start(); int nr = in.read(b, off, len); if (nr > 0) notifyListeners(VALUE, nread += nr); return nr; } @Override public long skip(long n) throws IOException { if (!started) start(); long nr = in.skip(n); if (nr > 0) notifyListeners(VALUE, nread += nr); return nr; } @Override public void close() throws IOException { if (!started) start(); in.close(); notifyListeners(END, 0); } @Override public synchronized void reset() throws IOException { if (!started) start(); in.reset(); nread = size - in.available(); notifyListeners(VALUE, nread); } protected static final int MAX = 0, VALUE = 1, START = 2, END = 3; private void notifyListeners(int action, int value) { for (ProgressInputStreamListener isl : listeners) { switch (action) { case MAX: isl.setProgressMax(value); break; case VALUE: isl.setProgressValue(value); break; case START: isl.startProgress(name); break; case END: isl.endProgress(); break; default: break; } } } public interface ProgressInputStreamListener { void setProgressMax(int max); void setProgressValue(int value); void startProgress(String strName); void endProgress(); } } src/core/edu/xtec/util/ResourceBridge.java000066400000000000000000000023271335566474600210700ustar00rootroot00000000000000/* * File : ResourceBridge.java * Created : 16-sep-2002 12:31 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public interface ResourceBridge { public java.io.InputStream getProgressInputStream(java.io.InputStream is, int expectedLength, String name); public void displayUrl(String url, boolean inFrame); public edu.xtec.util.Options getOptions(); public String getMsg(String key); public javax.swing.JComponent getComponent(); } src/core/edu/xtec/util/ResourceManager.java000066400000000000000000000076701335566474600212540ustar00rootroot00000000000000/* * File : ResourceManager.java * Created : 07-mar-2002 17:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.swing.ImageIcon; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public abstract class ResourceManager { public static final String RESOURCE_ROOT = "/edu/xtec/resources/"; public static final String RESOURCE_CLASS_ROOT = "edu.xtec.resources."; public static final StreamIO.InputStreamProvider STREAM_PROVIDER = new StreamIO.InputStreamProvider() { public java.io.InputStream getInputStream(String resourceName) throws Exception { return getResourceAsStream(resourceName); } }; public static final String DEFAULT_LOCALE = "en"; private static Map icons = new HashMap(); public static ImageIcon getImageIcon(String name) { ImageIcon result = (ImageIcon) icons.get(name); if (result == null) { try { result = new ImageIcon(getResource(name)); String s = name; if (s.startsWith("icons/")) s = new StringBuilder("@").append(s.substring(6)).substring(0); result.setDescription(s); icons.put(name, result); } catch (Exception ex) { System.err.println("unable to get image " + name); System.err.println(ex); } } return result; } public static java.net.URL getResource(String name) throws Exception { java.net.URL result = ResourceManager.class.getResource(RESOURCE_ROOT + name); if (result == null) throw buildException(name); return result; } public static java.io.InputStream getResourceAsStream(String name) throws Exception { java.io.InputStream result = ResourceManager.class.getResourceAsStream(RESOURCE_ROOT + name); if (result == null) throw buildException(name); return result; } public static byte[] getResourceBytes(String name) throws Exception { return StreamIO.readInputStream(getResourceAsStream(name)); } public static ExtendedByteArrayInputStream getResourceAsByteArray(String name) throws Exception { return new ExtendedByteArrayInputStream(getResourceBytes(name), name); } public static String getResourceText(String name, boolean useCRLF) throws Exception { String lineEnding = useCRLF ? "\r\n" : System.getProperty("line.separator"); BufferedReader in = new BufferedReader(new InputStreamReader(getResourceAsStream(name))); StringBuilder sb = new StringBuilder(); String line; while ((line = in.readLine()) != null) { sb.append(line).append(lineEnding); } in.close(); return sb.substring(0); } public static java.util.ResourceBundle getBundle(String name, java.util.Locale locale) throws Exception { if (locale != null && DEFAULT_LOCALE.equals(locale.getLanguage())) Locale.setDefault(locale); java.util.ResourceBundle result = java.util.ResourceBundle.getBundle(RESOURCE_CLASS_ROOT + name, locale); if (result == null) throw buildException(name); return result; } private static Exception buildException(String name) { return new Exception("Unable to load resource: " + name); } } src/core/edu/xtec/util/SimpleFileFilter.java000066400000000000000000000046771335566474600213750ustar00rootroot00000000000000/* * File : SimpleFileFilter.java * Created : 01-feb-2001 18:07 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.File; import java.io.FilenameFilter; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class SimpleFileFilter extends javax.swing.filechooser.FileFilter implements java.io.FileFilter { private String m_description = null; private String[] m_extension = null; public SimpleFileFilter(String extension, String description) { this(new String[] { extension }, description); } public SimpleFileFilter(String[] extension, String description) { m_description = description; m_extension = extension; if (m_extension != null) for (int i = 0; i < m_extension.length; i++) if (!m_extension[i].startsWith(".")) m_extension[i] = "." + m_extension[i]; } public String getDescription() { return m_description; } public boolean accept(File f) { boolean result = false; if (f == null) result = false; else if (f.isDirectory()) result = true; else if (m_extension != null) { String s = f.getName().toLowerCase(); for (String ex : m_extension) if (ex.equals(".*") || s.endsWith(ex)) { result = true; break; } } return result; } public FilenameFilter getFilenameFilter() { return new FilenameFilter() { public boolean accept(File f, String name) { return SimpleFileFilter.this.accept(new File(f, name)); } }; } public File checkFileExtension(File f) { File result = f; if (!accept(result)) { for (String ex : m_extension) if (!ex.equals(".*")) result = new File(f.getAbsolutePath() + ex); } return result; } } src/core/edu/xtec/util/SmallButton.java000066400000000000000000000034701335566474600204300ustar00rootroot00000000000000/* * File : SmallButton.java * Created : 09-jun-2002 20:19 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.event.*; import javax.swing.Action; import javax.swing.JButton; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class SmallButton extends JButton implements MouseListener { SmallButtonBorder smb; public SmallButton(Action act) { super(act); setText(null); setToolTipText((String) act.getValue(javax.swing.Action.SHORT_DESCRIPTION)); addMouseListener(this); setRequestFocusEnabled(false); smb = new SmallButtonBorder(getBorder(), false); setBorder(smb); setOpaque(false); } @Override public float getAlignmentY() { return 0.5f; } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { if (isEnabled()) smb.borderOn = true; setOpaque(true); repaint(); } public void mouseExited(MouseEvent e) { smb.borderOn = false; setOpaque(false); repaint(); } } src/core/edu/xtec/util/SmallButtonBorder.java000066400000000000000000000033611335566474600215650ustar00rootroot00000000000000/* * File : SmallButtonBorder.java * Created : 14-apr-2004 17:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import javax.swing.JComponent; import javax.swing.border.Border; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class SmallButtonBorder implements Border { boolean borderOn; Border m_border; public SmallButtonBorder(Border border, boolean borderOn) { m_border = border; this.borderOn = borderOn; } public SmallButtonBorder(JComponent jc, boolean borderOn) { this(jc.getBorder(), borderOn); } public void paintBorder(java.awt.Component c, java.awt.Graphics g, int x, int y, int width, int height) { if (borderOn) m_border.paintBorder(c, g, x, y, width, height); } public java.awt.Insets getBorderInsets(java.awt.Component component) { java.awt.Insets i = (java.awt.Insets) m_border.getBorderInsets(component).clone(); i.left = i.top; i.right = i.bottom; return i; } public boolean isBorderOpaque() { return m_border.isBorderOpaque(); } } src/core/edu/xtec/util/StrUtils.java000066400000000000000000000223621335566474600177560ustar00rootroot00000000000000/* * File : StrUtils.java * Created : 17-may-2004 19:50 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.StringTokenizer; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.23 */ public abstract class StrUtils { public static void strToIntArray(String str, int[] intArray) { if (str == null || intArray == null) { return; } int i = 0; StringTokenizer st = new StringTokenizer(str, ",", false); while (st.hasMoreTokens() && i < intArray.length) { try { intArray[i] = Integer.parseInt(st.nextToken().trim()); } catch (Exception e) { } i++; } } public static void strToPoint(String str, java.awt.Point pt) { int[] values = new int[2]; strToIntArray(str, values); pt.x = values[0]; pt.y = values[1]; } public static void strToDimension(String str, java.awt.Dimension d) { int[] values = new int[2]; strToIntArray(str, values); d.width = values[0]; d.height = values[1]; } public static void strToRect(String str, java.awt.Rectangle r) { int[] values = new int[4]; strToIntArray(str, values); r.setBounds(values[0], values[1], values[2], values[3]); } public static String[] strToStrArray(String source, String separator) { List v = StrUtils.enumerationToList(source, separator); return v != null ? v.toArray(new String[v.size()]) : null; } public static String[] strToStrArrayNoNulls(String source, String separator) throws Exception { String[] result = strToStrArray(source, separator); if (result == null || result.length == 0) { throw new Exception("Invalid parameter: " + source); } for (String s : result) { if (s == null || s.length() == 0) { throw new Exception("Invalid parameter: " + source); } } return result; } public static List enumerationToList(String source, String separator) { if (source == null || separator == null) { return null; } StringTokenizer st = new StringTokenizer(source, separator); List v = new ArrayList(); while (st.hasMoreTokens()) { String s = st.nextToken().trim(); if (s.length() > 0) v.add(s); } return v; } public static byte[] extractByteSeq(byte[] data, int line, byte searchFor, byte changeTo) { byte[] result = null; int l = data.length; int k = 0; int p0 = 0, p1 = 0; for (int i = 0; i < l; i++) { if (data[i] == 0x0D) { if (i < l && data[i + 1] == 0x0A) { p0 = p1 == 0 ? p1 : p1 + 2; p1 = i; if (k == line) { break; } k++; } } } if (p1 > p0) { int j = p1 - p0; result = new byte[j]; for (int i = 0; i < j; i++) { result[i] = data[p0 + i]; if (result[i] == searchFor) { result[i] = changeTo; } } } return result; } public static int roundTo(double v, int n) { return ((int) (v / n)) * n; } public static int countSpaces(String tx) { String t = tx.trim(); int j = 0; for (char ch : t.toCharArray()) { if (ch == ' ') { j++; } } return j; } public static boolean compareStringsIgnoreCase(String s1, String s2) { if (s1 == null && s2 == null) { return true; } if (s1 == null || s2 == null) { return false; } return s1.compareToIgnoreCase(s2) == 0; } public static boolean compareTrimStringsIgnoreCase(Object s1, Object s2) { if (s1 == null) { s1 = ""; } if (s2 == null) { s2 = ""; } return s1.toString().trim().compareToIgnoreCase(s2.toString().trim()) == 0; } public static boolean compareObjects(Object o1, Object o2) { if (o1 == null && o2 == null) { return true; } if (o1 == null || o2 == null) { return false; } return o1.equals(o2); } public static String replace(String str, String pattern, String replace) { int s = 0; if (str == null) { str = ""; } StringBuilder result = new StringBuilder(); int e; while ((e = str.indexOf(pattern, s)) >= 0) { result.append(str.substring(s, e)); if (replace != null) { result.append(replace); } s = e + pattern.length(); } result.append(str.substring(s)); return result.substring(0); } public static String replace(String str, String pattern, String[] replace) { int s = 0; if (str == null) { str = ""; } StringBuilder result = new StringBuilder(); int e, i = 0; while ((e = str.indexOf(pattern, s)) >= 0) { result.append(str.substring(s, e)); if (replace != null) { result.append(replace[i++ % replace.length]); } s = e + pattern.length(); } result.append(str.substring(s)); return result.substring(0); } public static boolean compareMultipleOptions(String answer, String check, boolean checkCase) { if (answer == null || answer.length() == 0 || check == null || check.length() == 0) { return false; } StringTokenizer st = new StringTokenizer(check, "|"); while (st.hasMoreTokens()) { if (checkCase ? st.nextToken().equals(answer) : st.nextToken().equalsIgnoreCase(answer)) { return true; } } return false; } public static String secureString(Object data) { if (data == null) { return new String(); } return data.toString(); } public static String secureString(Object data, String defaultValue) { String result = nullableString(data); return result == null ? defaultValue : result; } public static String nullableString(Object o) { String result = null; if (o != null) { result = o.toString().trim(); if (result.length() == 0) { result = null; } } return result; } public static String trimEnding(String str) { String result = str; if (result != null) { int p = result.length() - 1; int p0 = p; while (p >= 0) { char ch = result.charAt(p); if (ch == ' ' || ch == '\n' || ch == '\r') { p--; } else { break; } } if (p != p0) { result = result.substring(0, p + 1); } } return result; } public static String secureSQLString(String data) { return replace(secureString(data), "'", "''"); } public static int getAbsIntValueOf(String s) { int result = -1; if (s != null && s.length() > 0) { for (char ch : s.toCharArray()) { if (ch < '0' || ch > '9') { return result; } } try { result = Integer.parseInt(s); } catch (NumberFormatException ex) { result = -1; } } return result; } public static String getShortExpression(String text, int maxLen) { String result = secureString(text).trim(); if (maxLen > 0 && result.length() > maxLen) { result = result.substring(0, maxLen); for (int p = maxLen - 1; p > (2 * maxLen / 3); p--) { if (Character.isSpaceChar(result.charAt(p))) { result = result.substring(0, p) + "..."; break; } } } return result; } public static String limitStrLen(String text, int maxLen) { String result = text; if (result != null && result.length() > maxLen) { result = result.substring(0, maxLen); } return result; } public static int getIndexOf(String val, String[] ops) { int result = -1; if (val != null && ops != null) { for (int k = 0; k < ops.length; k++) { if (val.equals(ops[k])) { result = k; break; } } } return result; } public static String safeHtml(String s) { return StrUtils.secureString(s).replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">") .replaceAll("\"", """); } public static String getEnumeration(List items) { StringBuilder sb = new StringBuilder(); ListIterator it = items.listIterator(); while (it.hasNext()) StrUtils.addToEnum(sb, it.next(), ", "); return sb.toString(); } public static String addToEnum(String str, String txt) { return addToEnum(new StringBuilder(str), txt, ", ").toString(); } public static StringBuilder addToEnum(StringBuilder sb, String txt) { return addToEnum(sb, txt, ", "); } public static StringBuilder addToEnum(StringBuilder sb, String txt, String sep) { if (sb.length() > 0) sb.append(sep); return sb.append(txt); } } src/core/edu/xtec/util/StreamIO.java000066400000000000000000000161451335566474600176520ustar00rootroot00000000000000/* * File : StreamIO.java * Created : 06-feb-2001 18:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Component; import java.awt.event.*; import java.io.*; import javax.swing.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class StreamIO { private static boolean cancel = false; public static final int DEFAULT_READ_STEP_SIZE = 4096; private StreamIO() { } public static void setCancel(boolean value) { cancel = value; } public interface InputStreamListener { void notify(InputStream in, int bytesRead); } public static byte[] readInputStream(InputStream is) throws IOException { return readInputStream(is, null, DEFAULT_READ_STEP_SIZE); } public static byte[] readInputStream(InputStream is, InputStreamListener lst, int stepSize) throws IOException { cancel = false; BufferedInputStream bufferedStream; if (is instanceof BufferedInputStream) { bufferedStream = (BufferedInputStream) is; } else { bufferedStream = new BufferedInputStream(is); } ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] buffer = new byte[stepSize]; while (!cancel) { int bytesRead = bufferedStream.read(buffer); if (lst != null) { lst.notify(is, bytesRead); } if (bytesRead <= 0) { break; } os.write(buffer, 0, bytesRead); Thread.yield(); } buffer = os.toByteArray(); os.close(); bufferedStream.close(); if (cancel) { throw new InterruptedIOException("Cancelled by user"); } return buffer; } public static byte[] readFile(File file) throws IOException { return readFile(file, null, 0); } public static byte[] readFile(File file, InputStreamListener lst, int stepSize) throws IOException { cancel = false; long fileLength = file.length(); if ( /* fileLength<1 || */ fileLength > Integer.MAX_VALUE) { throw new IOException(); } int intFileLength = (int) fileLength; byte[] result = new byte[intFileLength]; BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file)); int bytesRead = 0; for (int k = 0; k < fileLength && !cancel; k += bytesRead) { int bytesToRead = intFileLength - k; if (stepSize > 0 && stepSize < bytesToRead) { bytesToRead = stepSize; } bytesRead = fis.read(result, k, bytesToRead); if (bytesRead < 0) { break; } if (lst != null) { lst.notify(fis, bytesRead); } Thread.yield(); } fis.close(); if (cancel) { throw new InterruptedIOException("Cancelled by user"); } return result; } public static byte[] getResourceBytes(Object caller, String packageName, String resourceName) throws IOException { return readInputStream(caller.getClass().getResourceAsStream(packageName + "/" + resourceName)); } public static long writeStreamTo(InputStream is, OutputStream os) throws IOException { return writeStreamTo(is, os, null, DEFAULT_READ_STEP_SIZE); } public static long writeStreamTo(InputStream is, OutputStream os, InputStreamListener lst, int stepSize) throws IOException { cancel = false; long result = 0; BufferedInputStream bufferedStream; if (is instanceof BufferedInputStream) { bufferedStream = (BufferedInputStream) is; } else { bufferedStream = new BufferedInputStream(is); } int bytesRead; byte[] buf = new byte[stepSize]; while (!cancel) { bytesRead = bufferedStream.read(buf, 0, stepSize); if (lst != null) { lst.notify(is, bytesRead); } if (bytesRead <= 0) { break; } os.write(buf, 0, bytesRead); result += bytesRead; Thread.yield(); } bufferedStream.close(); os.flush(); os.close(); if (cancel) { throw new InterruptedIOException("Cancelled by user"); } return result; } public interface InputStreamProvider { java.io.InputStream getInputStream(String resourceName) throws Exception; } public static boolean writeStreamDlg(final InputStream is, final OutputStream os, int knownSize, String mainMsg, Component dlgOwner, Options options) { final Messages msg = options.getMessages(); String title = msg.get("WRITING_FILE"); JDialog dialog; if (dlgOwner instanceof java.awt.Dialog) { dialog = new JDialog((java.awt.Dialog) dlgOwner, title, true); } else if (dlgOwner != null) { dialog = new JDialog(JOptionPane.getFrameForComponent(dlgOwner), title, true); } else { dialog = new JDialog((JFrame) null, title, true); } if (mainMsg != null) { dialog.getContentPane().add(new JLabel(mainMsg)); } final JProgressBar progress = new JProgressBar(); if (knownSize > 0) { progress.setMinimum(0); progress.setMaximum(knownSize); progress.setIndeterminate(false); } else { progress.setIndeterminate(true); } InputStreamListener isl = new InputStreamListener() { public void notify(InputStream in, int bytesRead) { progress.setValue(bytesRead); } }; dialog.getContentPane().add(progress); final InputStreamListener iis = isl; JButton cancelButton = new JButton(msg.get("CANCEL")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { cancel = true; } }); dialog.getContentPane().add(cancelButton); dialog.pack(); final JDialog dlg = dialog; edu.xtec.util.SwingWorker sw = new edu.xtec.util.SwingWorker() { private boolean result = false; @Override public Object construct() { try { writeStreamTo(is, os, iis, DEFAULT_READ_STEP_SIZE); result = !cancel; } catch (Exception ex) { result = false; msg.showErrorWarning(dlg, "ERROR", ex); } dlg.setVisible(false); return result; } }; sw.startLater(); dialog.setVisible(true); return ((Boolean) sw.get()).booleanValue(); } public static Object cloneObject(Serializable obj) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(512); ObjectOutputStream out = new ObjectOutputStream(baos); out.writeObject(obj); out.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream in = new ObjectInputStream(bais); return in.readObject(); } } src/core/edu/xtec/util/SwingWorker.java000066400000000000000000000071071335566474600204460ustar00rootroot00000000000000/* * File : SwingWorker.java * Created : 09-jan-2002 12:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Taken from: * The Java Tutorial * http://java.sun.com/docs/books/tutorial/ */ package edu.xtec.util; import javax.swing.SwingUtilities; /** * This is the 3rd version of SwingWorker (also known as SwingWorker 3), an * abstract class that you subclass to perform GUI-related work in a dedicated * thread. For instructions on using this class, see: * *

* http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html * *

* Note that the API changed slightly in the 3rd version: You must now invoke * start() on the SwingWorker after creating it. */ public abstract class SwingWorker { private Object value; // see getValue(), setValue() private Thread thread; private boolean cancelled; /** * Class to maintain reference to current worker thread under separate * synchronization control. */ private static class ThreadVar { private Thread thread; ThreadVar(Thread t) { thread = t; } synchronized Thread get() { return thread; } synchronized void clear() { thread = null; } } private ThreadVar threadVar; /** * Get the value produced by the worker thread, or null if it hasn't been * constructed yet. */ protected synchronized Object getValue() { return value; } public void cancel() { cancelled = true; } public boolean isCancelled() { return cancelled; } /** Set the value produced by worker thread */ private synchronized void setValue(Object x) { value = x; } /** Compute the value to be returned by the get method. */ public abstract Object construct(); /** * Called on the event dispatching thread (not on the worker thread) after the * construct * method has returned. */ public void finished() { } /** * A new method that interrupts the worker thread. Call this method to force the * worker to stop what it's doing. */ public void interrupt() { Thread t = threadVar.get(); if (t != null) { t.interrupt(); } threadVar.clear(); } /** * Return the value created by the construct method. Returns null * if either the constructing thread or the current thread was interrupted * before a value was produced. * * @return the value created by the construct method */ public Object get() { while (true) { Thread t = threadVar.get(); if (t == null) { return getValue(); } try { t.join(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // propagate return null; } } } /** * Start a thread that will call the construct method and then * exit. */ public SwingWorker() { final Runnable doFinished = new Runnable() { public void run() { finished(); } }; Runnable doConstruct = new Runnable() { public void run() { try { setValue(construct()); } finally { threadVar.clear(); } SwingUtilities.invokeLater(doFinished); } }; Thread t = new Thread(doConstruct); threadVar = new ThreadVar(t); } /** Start the worker thread. */ public void start() { Thread t = threadVar.get(); if (t != null) { t.start(); } } public void startLater() { SwingUtilities.invokeLater(new Runnable() { public void run() { start(); } }); } } src/core/edu/xtec/util/TripleString.java000066400000000000000000000110251335566474600206050ustar00rootroot00000000000000/* * File : TripleString.java * Created : 28-apr-2003 10:14 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class TripleString extends Object implements Comparable { public static final int ELEMENTS = 3; public static final int NAME = 0, CLASS = 1, DESCRIPTION = 2; public static final char SEP = '|'; String[] str; /** Creates a new instance of TripleString */ public TripleString(String name, String className, String description) { str = new String[ELEMENTS]; str[NAME] = name; str[CLASS] = className; str[DESCRIPTION] = description; } public TripleString(String className, String nameAndDescription) { str = new String[ELEMENTS]; str[CLASS] = className; if (nameAndDescription != null) { nameAndDescription = nameAndDescription.trim(); int p = nameAndDescription.indexOf(SEP); if (p >= 0) { str[NAME] = nameAndDescription.substring(0, p); str[DESCRIPTION] = nameAndDescription.substring(p + 1); } else { str[NAME] = nameAndDescription; } } } public String getStr(int index) { return (index >= 0 && index < ELEMENTS) ? str[index] : null; } public void setStr(int index, String s) { if (index >= 0 && index < ELEMENTS) str[index] = s; } @Override public String toString() { return str[NAME]; } public String getDescription() { return str[DESCRIPTION]; } public String getClassName() { return str[CLASS]; } @Override public boolean equals(Object obj) { boolean result = false; if (obj != null) { result = obj.equals(str[NAME]); } return result; } public static int getFirstItemWithClass(List tripleListObjects, String className) { int result = -1; if (className != null && tripleListObjects != null && !tripleListObjects.isEmpty()) { for (int i = 0; i < tripleListObjects.size(); i++) { TripleString ts = tripleListObjects.get(i); if (className.equals(ts.getClassName())) { result = i; break; } } } return result; } public static List getTripleList(String bundlePath, Options options, boolean includeEmpty, boolean sorted, boolean lookInUserDir) throws Exception { java.util.ResourceBundle bundle = ResourceManager.getBundle(bundlePath, options.getMessages().getLocale()); java.util.Enumeration keys = bundle.getKeys(); List result = new ArrayList(); while (keys.hasMoreElements()) { String key = ((String) keys.nextElement()).trim(); String str = bundle.getString(key); if (str != null) result.add(new TripleString(key, str)); } if (lookInUserDir) { String bundleName = bundlePath; int k = bundleName.lastIndexOf('.'); if (k > 0) bundleName = bundleName.substring(k + 1); File file = new File(System.getProperty("user.home"), bundleName + ".properties"); if (file.exists()) { Properties prop = new Properties(); prop.load(new FileInputStream(file)); Iterator it = prop.keySet().iterator(); while (it.hasNext()) { String key = (String) it.next(); String str = prop.getProperty(key); if (str != null) result.add(new TripleString(key, str)); } } } if (sorted) java.util.Collections.sort(result); if (includeEmpty) { result.add(0, new TripleString(options.getMsg("NONE"), null, null)); } return result; } public int compareTo(TripleString obj) { return getClassName().compareTo(obj.getClassName()); } } src/core/edu/xtec/util/VFlowScrollPane.java000066400000000000000000000037301335566474600212030ustar00rootroot00000000000000/* * File : VFlowScrollPane.java * Created : 28-sep-2004 09:24 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.JPanel; import javax.swing.JScrollPane; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class VFlowScrollPane extends JScrollPane { JPanel panel; int panelHGap, panelVGap; public VFlowScrollPane(JPanel view) { super(view, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); panel = view; if (panel.getLayout() instanceof FlowLayout) { panelHGap = ((FlowLayout) panel.getLayout()).getHgap(); panelVGap = ((FlowLayout) panel.getLayout()).getVgap(); } } @Override public void doLayout() { int n = panel.getComponentCount(); if (n > 0) { Dimension minSize = getMinimumSize(); Component lastCmp = panel.getComponent(n - 1); int w = Math.max(minSize.width, getWidth() - getVerticalScrollBar().getWidth() - panelHGap); panel.setPreferredSize(new Dimension(w, 9999)); super.doLayout(); panel.setPreferredSize(new Dimension(w, lastCmp.getY() + lastCmp.getHeight() + panelVGap)); invalidate(); } super.doLayout(); } } src/report/000077500000000000000000000000001335566474600132035ustar00rootroot00000000000000src/report/jclicReports.properties000066400000000000000000000111371335566474600177670ustar00rootroot00000000000000#-------------------------------------------------------------------------- # JCLIC REPORTS SERVER SETTINGS #-------------------------------------------------------------------------- #-------------------------------------------------------------------------- # Name of the JDBC driver #-------------------------------------------------------------------------- # Examples: ODBC: sun.jdbc.odbc.JdbcOdbcDriver # MySQL: com.mysql.jdbc.Driver # PointBase: com.pointbase.jdbc.jdbcUniversalDriver # Oracle: oracle.jdbc.driver.OracleDriver #-------------------------------------------------------------------------- dbDriver=sun.jdbc.odbc.JdbcOdbcDriver #-------------------------------------------------------------------------- # URL of the the database #-------------------------------------------------------------------------- # Examples: ODBC: jdbc:odbc:JClic # MySQL: jdbc:mysql://localhost/JClicReports # PointBase: jdbc:pointbase:jclic # Oracle: jdbc:oracle:thin:@server.domain.com:1521:database #-------------------------------------------------------------------------- dbServer=jdbc:odbc:JClic #-------------------------------------------------------------------------- # DB system username and password (not mandatory in some DBMS) #-------------------------------------------------------------------------- dbLogin=clic_user dbPassword=clic_pwd #-------------------------------------------------------------------------- # If not exist, automatically create tables on first run #-------------------------------------------------------------------------- createTables=true #-------------------------------------------------------------------------- # String that will be used as prefix for table names #-------------------------------------------------------------------------- tablePrefix=JCLIC_ #-------------------------------------------------------------------------- # Automatically start services #-------------------------------------------------------------------------- autostart=true http_autostart=true #-------------------------------------------------------------------------- # Provide console/log info on each transaction #-------------------------------------------------------------------------- verbose=true #-------------------------------------------------------------------------- # Language to be used (ISO-639 two-letter language codes) #-------------------------------------------------------------------------- #language=ca #-------------------------------------------------------------------------- # If set, write logs to file #-------------------------------------------------------------------------- http_logFile= #-------------------------------------------------------------------------- # Maximum time to wait for idle connections (in milliseconds) #-------------------------------------------------------------------------- http_timeout=1200 timeout=1200 #-------------------------------------------------------------------------- # Parameters related to the pool of database connections #-------------------------------------------------------------------------- # Reuse preparedStatements dbMapStatements=true # Absolute path name for log file. e.g. 'c:/temp/mylog.log'. # Default is 'jclicReportsDBConnection.log' in user's home dir. dbLogFile=jclicReportsDBConnection.log # Append to logfile. Default is true. dbLogAppend=true # Minimum number of connections to start with. default is 1 dbMinConns=1 # Maximum number of connections in dynamic pool. Default is 3 dbMaxConns=3 # Time in days between connection resets. (Reset does a basic cleanup). Default is 1.0 dbMaxConnDays=1.0 # Level of debug messages output to the log file. # 0 -> no messages, 1 -> Errors, 2 -> Warnings, 3 -> Information. # Default is 2. dbDebugLevel=2 # Max time a connection can be checked out before being recycled. # Zero value turns option off. Default is 60. dbMaxCheckoutSeconds=60 #-------------------------------------------------------------------------- # Parameters related to the drawing of graphics #-------------------------------------------------------------------------- graph_width=440 graph_dist_width=192 graph_height=155 graph_header_height=25 graph_margin=8 graph_color_bg=F0F8FF graph_color_text=000000 graph_color_border=FFFFFF graph_color_v1=D00000 graph_color_v2=00D000 graph_color_dist=0000D0 graph_color_alert=FF0000 graph_stroke_width=3.0 graph_font_family=Dialog graph_font_size=11 graph_margin_x=50 graph_margin_y=20 graph_div_y=4 graph_max_cols=10 graph_margin_dist_x=15 graph_margin_dist_y=20 graph_color_header_bg=ADD8E6 graph_color_header_text=000000 src/report/reportServer/000077500000000000000000000000001335566474600157055ustar00rootroot00000000000000src/report/reportServer/CmdReportServer.java000066400000000000000000000167141335566474600216470ustar00rootroot00000000000000 /* * File : CmdReportServer.java * Created : 16-jul-2001 20:23 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.ReportServerConstants; import edu.xtec.jclic.report.*; import edu.xtec.util.Encryption; import edu.xtec.util.Messages; import edu.xtec.util.db.ConnectionBeanProvider; import java.io.*; import java.text.DateFormat; import java.util.Date; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class CmdReportServer implements ReportServerEventMaker.Listener, ReportServerConstants { static String iDriver, iUrl, iUser, iPwd; static int iHttpPort, iHttpTimeout; static boolean iCreateTables; static String iTablePrefix; DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); public CmdReportServer(String driver, String url, String user, String pwd, int httpPort, int httpTimeOut, boolean createTables, String tablePrefix) throws Exception { showValidCommands(); ConnectionBeanProvider cbp = ConnectionBeanProvider.getConnectionBeanProvider(true, driver, url, user, pwd, true); ReportServerJDBCBridge bridge = new ReportServerJDBCBridge(cbp, createTables, tablePrefix); reportEventPerformed(new ReportServerEvent(ReportServerEvent.SYSTEM, url, null, ReportServerEvent.CONNECT)); HTTPReportServer httpServer = new HTTPReportServer(new Messages(ReportServer.MSG_BUNDLE)); httpServer.addListener(this); httpServer.startServer(httpPort, httpTimeOut); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); boolean loop = true; String s = null; while (loop) { try { s = in.readLine(); Thread.sleep(1000); } catch (Exception ex) { loop = false; } if (s != null) { if (s.equalsIgnoreCase("stop")) { httpServer.stopServer(); } else if (s.equalsIgnoreCase("start")) { httpServer.startServer(httpPort, httpTimeOut); } else if (s.equalsIgnoreCase("exit")) { if (httpServer.serverRunning()) httpServer.stopServer(); loop = false; } else { showValidCommands(); } } } bridge.end(); reportEventPerformed(new ReportServerEvent(ReportServerEvent.SYSTEM, url, null, ReportServerEvent.DISCONNECT)); } public static void main(String[] args) { String propFile = CFG_FILE; java.util.Properties prop; int i = 0; if (args.length > 0) { if (args[1].equals("-help")) { displayHelp(); return; } if (!args[0].startsWith("-")) { propFile = args[0]; i++; } } prop = new java.util.Properties(); try { prop.load(ReportServerConstants.class.getResourceAsStream(CFG_FILE)); if (!CFG_FILE.equals(propFile)) { prop.load(CmdReportServer.class.getResourceAsStream(propFile)); String pwd = prop.getProperty(ConnectionBeanProvider.DB_PASSWORD); if (pwd != null && pwd.length() > 0) prop.setProperty(ConnectionBeanProvider.DB_PASSWORD, Encryption.Decrypt(pwd)); } } catch (Exception ex) { System.err.println("ERROR: Invalid properties file name\n" + ex); displayHelp(); return; } iDriver = prop.getProperty(ConnectionBeanProvider.DB_DRIVER, edu.xtec.jclic.report.BasicJDBCBridge.DEFAULT_ODBC_BRIDGE); iUrl = prop.getProperty(ConnectionBeanProvider.DB_SERVER, edu.xtec.jclic.report.BasicJDBCBridge.DEFAULT_DB); iUser = prop.getProperty(ConnectionBeanProvider.DB_LOGIN, null); iPwd = prop.getProperty(ConnectionBeanProvider.DB_PASSWORD, null); iHttpPort = Integer.parseInt(prop.getProperty(HTTP_PORT, Integer.toString(HTTPReportServer.DEFAULT_PORT))); iHttpTimeout = Integer.parseInt(prop.getProperty(HTTP_TIMEOUT, Integer.toString(HTTPReportServer.DEFAULT_TIMEOUT))); iTablePrefix = prop.getProperty(BasicJDBCBridge.TABLE_PREFIX_KEY, null); iCreateTables = "true".equalsIgnoreCase((prop.getProperty(BasicJDBCBridge.CREATE_TABLES_KEY, "true"))); for (; i < args.length; i++) { boolean err = false; if (i < args.length - 1) { if (args[i].equals("-driver")) iDriver = args[++i]; else if (args[i].equals("-url")) iUrl = args[++i]; else if (args[i].equals("-user")) iUser = args[++i]; else if (args[i].equals("-pwd")) iPwd = args[++i]; else if (args[i].equals("-port")) iHttpPort = Integer.parseInt(args[++i]); else if (args[i].equals("-timeout")) iHttpTimeout = Integer.parseInt(args[++i]); else if (args[i].equals("-prefix")) iTablePrefix = args[++i]; else if (args[i].equals("-create")) iCreateTables = "true".equalsIgnoreCase(args[++i]); else err = true; } else err = true; if (err) { System.err.println("Syntax error!"); displayHelp(); return; } } try { new CmdReportServer(iDriver, iUrl, iUser, iPwd, iHttpPort, iHttpTimeout, iCreateTables, iTablePrefix); System.err.println("Report Server closed"); } catch (Exception ex) { System.err.println("Unable to start!\n" + ex); } } static void displayHelp() { System.out.println("Syntax: java CmdReportServer [-help] [fileName] [-option value].."); System.out.println("Switches:"); System.out.println(" -help displays this message"); System.out.println(" fileName get values from the specified fileName"); System.out.println(" if ommitted, default values will be read"); System.out.println(" from ReportServer.properties"); System.out.println("Option-Value pairs:"); System.out.println(" -driver name of the JDBC driver"); System.out.println(" -url JDBC path to the database"); System.out.println(" -user system user name"); System.out.println(" -pwd system user password"); System.out.println(" -port HTTP port for foreign connections (default: 9000)"); System.out.println(" -timeout maximum number of seconds of socket inactivity"); System.out.println(" -create [true|false] automatic creation of tables (default: true)"); System.out.println(" -prefix prefix used in table names"); } public void reportEventPerformed(ReportServerEvent ev) { System.out.println(dateFormat.format(new Date()) + " " + ev.toString()); } void showValidCommands() { System.out.println("-----------------------------------------------------"); System.out.println("Valid control commands:"); System.out.println("stop - Close all connections and stop server"); System.out.println("start - Start server"); System.out.println("exit - Close all connections, stop server and exit"); System.out.println("-----------------------------------------------------"); } } src/report/reportServer/ReportServer.form000066400000000000000000000472501335566474600212440ustar00rootroot00000000000000

src/report/reportServer/ReportServer.java000066400000000000000000000472661335566474600212310ustar00rootroot00000000000000/* * File : ReportServer.java * Created : 10-aug-2001 13:52 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.ReportServerConstants; import edu.xtec.jclic.report.*; import edu.xtec.jclic.report.rp.JClicReportService; import edu.xtec.jclic.skins.AboutWindow; import edu.xtec.util.*; import edu.xtec.util.db.ConnectionBeanProvider; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.text.*; import java.util.*; import javax.swing.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class ReportServer extends javax.swing.JFrame implements ReportServerConstants, ResourceBridge { HTTPReportServer httpServer; int httpPort; int httpTimeOut; Options options; Messages msg; boolean webVerbose; boolean webAutostart; java.awt.Image frameIcon; File cfgFile; rsListener webServerListener; java.io.PrintWriter logWeb; DateFormat dateFormat, timeFormat; public static final String MSG_BUNDLE = "messages.ReportServerMessages"; // ** Creates new form ReportServer */ public ReportServer(String[] args) { options = new Options(this); frameIcon = ResourceManager.getImageIcon("icons/reportServerIcon.png").getImage(); if (args.length > 0 && args[0] != null) { cfgFile = new File(args[0]); if (!cfgFile.isAbsolute()) cfgFile = new File(System.getProperty("user.dir"), args[0]); } if (cfgFile == null || !cfgFile.exists()) cfgFile = new File( edu.xtec.util.PersistentSettings.getFilePath(edu.xtec.jclic.Constants.PROGRAM, CFG_FILE, options, true)); Properties prop = new Properties(); try { prop.load(ReportServerConstants.class.getResourceAsStream(CFG_FILE)); if (cfgFile.exists()) { FileInputStream is = new FileInputStream(cfgFile); prop.load(is); is.close(); String pwd = prop.getProperty(ConnectionBeanProvider.DB_PASSWORD); if (pwd != null && pwd.length() > 0) prop.setProperty(ConnectionBeanProvider.DB_PASSWORD, Encryption.Decrypt(pwd)); } options.syncProperties(prop, false); loadSettings(); } catch (Exception ex) { System.err.println("Error reading settings!\n" + ex); } dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM); httpServer = new HTTPReportServer(msg); initComponents(); webServerListener = new rsListener(webMsgTextArea); webServerListener.writer = logWeb; httpServer.addListener(webServerListener); JClicReportService.eventMaker.addListener(webServerListener); pack(); setVisible(true); if (webAutostart) startWebServer(); } private void loadSettings() throws Exception { edu.xtec.jclic.report.rp.ReportsRequestProcessor.setProperties(options.toProperties()); msg = edu.xtec.util.PersistentSettings.getMessages(options, MSG_BUNDLE); msg.addBundle(edu.xtec.jclic.Constants.DEFAULT_BUNDLE); msg.addBundle(edu.xtec.jclic.Constants.COMMON_SETTINGS); options.setLookAndFeel(); httpPort = options.getInt(HTTP_PORT, HTTPReportServer.DEFAULT_PORT); httpTimeOut = options.getInt(HTTP_TIMEOUT, HTTPReportServer.DEFAULT_TIMEOUT); ToolTipManager.sharedInstance().setEnabled(options.getBoolean(TOOLTIPS, true)); webVerbose = options.getBoolean(HTTP_VERBOSE, true); webAutostart = options.getBoolean(HTTP_AUTOSTART, true); String preferredBrowser = options.getString(BrowserLauncher.BROWSER); if (preferredBrowser != null && preferredBrowser.length() > 0) edu.xtec.util.BrowserLauncher.setPreferredBrowser(preferredBrowser); try { String s = options.getString(HTTP_LOGFILE, null); if (s != null) { FileOutputStream fos = new FileOutputStream(s, true); logWeb = new java.io.PrintWriter(fos, true); if (webServerListener != null) webServerListener.writer = logWeb; } } catch (Exception ex) { msg.showErrorWarning(this, "error_opening_logs", ex); } } private void startWebServer() { if (httpServer.startServer(httpPort, httpTimeOut)) { startWebServerBtn.setEnabled(false); stopWebServerBtn.setEnabled(true); launchBrowserBtn.setEnabled(true); } else { msg.showErrorWarning(this, "error_serverCannotStart", null); } } void stopWebServer() { if (httpServer.serverRunning()) httpServer.stopServer(); startWebServerBtn.setEnabled(true); launchBrowserBtn.setEnabled(false); stopWebServerBtn.setEnabled(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the FormEditor. */ private void initComponents() { // GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; webServerPane = new javax.swing.JPanel(); btnWebPanel = new javax.swing.JPanel(); startWebServerBtn = new javax.swing.JButton(); stopWebServerBtn = new javax.swing.JButton(); launchBrowserBtn = new javax.swing.JButton(); webMsgPanel = new javax.swing.JPanel(); webMsgScrollPane = new javax.swing.JScrollPane(); webMsgTextArea = new javax.swing.JTextArea(); webVerboseCheckBox = new javax.swing.JCheckBox(); webClearTextBtn = new javax.swing.JButton(); webCopyTextBtn = new javax.swing.JButton(); btnPanel = new javax.swing.JPanel(); settingsButton = new javax.swing.JButton(); aboutBtn = new javax.swing.JButton(); exitBtn = new javax.swing.JButton(); setTitle(msg.get("form_title")); setIconImage(frameIcon); setName(""); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); webServerPane.setLayout(new java.awt.GridBagLayout()); btnWebPanel.setLayout(new java.awt.GridBagLayout()); startWebServerBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/run.gif"))); startWebServerBtn.setToolTipText(msg.get("form_btn_start_tooltip")); startWebServerBtn.setText(msg.get("form_btn_start")); startWebServerBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { startWebServerBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(8, 2, 2, 2); btnWebPanel.add(startWebServerBtn, gridBagConstraints); stopWebServerBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/cancel.gif"))); stopWebServerBtn.setToolTipText(msg.get("form_btn_stop_tooltip")); stopWebServerBtn.setText(msg.get("form_btn_stop")); stopWebServerBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { stopWebServerBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(8, 2, 2, 2); btnWebPanel.add(stopWebServerBtn, gridBagConstraints); launchBrowserBtn .setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/browser_small.gif"))); launchBrowserBtn.setText(msg.get("form_btn_show")); launchBrowserBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { launchBrowserBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(8, 2, 2, 2); btnWebPanel.add(launchBrowserBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webServerPane.add(btnWebPanel, gridBagConstraints); webMsgPanel.setLayout(new java.awt.GridBagLayout()); webMsgPanel.setBorder(new javax.swing.border.TitledBorder(msg.get("form_messages_title"))); webMsgPanel.setMinimumSize(new java.awt.Dimension(300, 200)); webMsgPanel.setPreferredSize(new java.awt.Dimension(400, 200)); webMsgTextArea.setEditable(false); webMsgScrollPane.setViewportView(webMsgTextArea); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); webMsgPanel.add(webMsgScrollPane, gridBagConstraints); webVerboseCheckBox.setToolTipText(msg.get("form_messages_verbose_tooltip")); webVerboseCheckBox.setSelected(webVerbose); webVerboseCheckBox.setText(msg.get("form_messages_verbose")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); webMsgPanel.add(webVerboseCheckBox, gridBagConstraints); webClearTextBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/delete.gif"))); webClearTextBtn.setToolTipText(msg.get("form_messages_clear_tooltip")); webClearTextBtn.setText(msg.get("form_messages_clear")); webClearTextBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { webClearTextBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); webMsgPanel.add(webClearTextBtn, gridBagConstraints); webCopyTextBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/copy.gif"))); webCopyTextBtn.setToolTipText(msg.get("form_messages_copy_tooltip")); webCopyTextBtn.setText(msg.get("form_messages_copy")); webCopyTextBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { webCopyTextBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); webMsgPanel.add(webCopyTextBtn, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webServerPane.add(webMsgPanel, gridBagConstraints); getContentPane().add(webServerPane, java.awt.BorderLayout.CENTER); btnPanel.setLayout(new java.awt.GridBagLayout()); settingsButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/settings.gif"))); settingsButton.setText(msg.get("settings_button")); settingsButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { settingsButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); btnPanel.add(settingsButton, gridBagConstraints); aboutBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/about_small.gif"))); aboutBtn.setText(msg.get("ABOUT")); aboutBtn.setToolTipText(msg.get("form_btn_exit_tooltip")); aboutBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { aboutBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); btnPanel.add(aboutBtn, gridBagConstraints); exitBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/exit_small.gif"))); exitBtn.setText(msg.get("form_btn_exit")); exitBtn.setToolTipText(msg.get("form_btn_exit_tooltip")); exitBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { exitBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); btnPanel.add(exitBtn, gridBagConstraints); getContentPane().add(btnPanel, java.awt.BorderLayout.SOUTH); } // GEN-END:initComponents private void aboutBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_aboutBtnActionPerformed showAbout(); } // GEN-LAST:event_aboutBtnActionPerformed private void webClearTextBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_webClearTextBtnActionPerformed webMsgTextArea.setText(""); } // GEN-LAST:event_webClearTextBtnActionPerformed private void webCopyTextBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_webCopyTextBtnActionPerformed webMsgTextArea.selectAll(); webMsgTextArea.copy(); webMsgTextArea.select(0, 0); } // GEN-LAST:event_webCopyTextBtnActionPerformed private void launchBrowserBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_launchBrowserBtnActionPerformed try { java.net.URL page = new java.net.URL("http", java.net.InetAddress.getLocalHost().getHostName(), httpPort, "/"); edu.xtec.util.BrowserLauncher.openURL(page.toExternalForm()); } catch (Exception ex) { msg.showErrorWarning(this, "error", ex); } } // GEN-LAST:event_launchBrowserBtnActionPerformed private void stopWebServerBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_stopWebServerBtnActionPerformed stopWebServer(); } // GEN-LAST:event_stopWebServerBtnActionPerformed private void startWebServerBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_startWebServerBtnActionPerformed startWebServer(); } // GEN-LAST:event_startWebServerBtnActionPerformed private void settingsButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_settingsButtonActionPerformed ReportServerSettingsDlg dlg = new ReportServerSettingsDlg(this, true, options); dlg.setVisible(true); if (dlg.result) { if (cfgFile != null) { try { Properties prop = options.toProperties(); String pwd = prop.getProperty(ConnectionBeanProvider.DB_PASSWORD, ""); if (pwd != null && pwd.length() > 0) prop.put(ConnectionBeanProvider.DB_PASSWORD, Encryption.Encrypt(pwd)); FileOutputStream os = new FileOutputStream(cfgFile); prop.store(os, "Jclic report server settings"); os.close(); } catch (Exception ex) { msg.showErrorWarning(this, "error_writting_settings", ex); } stopWebServer(); if (logWeb != null) { logWeb.flush(); logWeb.close(); logWeb = null; webServerListener.writer = null; } try { loadSettings(); } catch (Exception ex) { System.err.println("Error loading settings.\n" + ex); } if (webAutostart) startWebServer(); } } } // GEN-LAST:event_settingsButtonActionPerformed private void exitBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_exitBtnActionPerformed exitForm(null); } // GEN-LAST:event_exitBtnActionPerformed /** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) { // GEN-FIRST:event_exitForm stopWebServer(); if (logWeb != null) { logWeb.flush(); logWeb.close(); logWeb = null; webServerListener.writer = null; } System.exit(0); } // GEN-LAST:event_exitForm /** @param args the command line arguments */ public static void main(String args[]) { new ReportServer(args).setVisible(true); } class rsListener implements ReportServerEventMaker.Listener { JTextArea textArea; java.io.PrintWriter writer; rsListener(JTextArea textArea) { this.textArea = textArea; } public void reportEventPerformed(ReportServerEvent ev) { if (webVerbose || ev.type == ReportServerEvent.SYSTEM) { StringBuilder sb = new StringBuilder(100); sb.append(dateFormat.format(new Date())); sb.append(" ").append(ev.toString()); if (writer != null) writer.println(sb.substring(0)); textArea.append(sb.append("\n").substring(0)); } } } // Interface ResourceBridge // ****************************************** public java.io.InputStream getProgressInputStream(java.io.InputStream is, int expectedLength, String name) { return is; } public void displayUrl(String url, boolean inFrame) { try { edu.xtec.util.BrowserLauncher.openURL(url); } catch (Exception ex) { System.err.println("Error opening URL: " + url); } } public edu.xtec.util.Options getOptions() { return options; } public String getMsg(String key) { return msg.get(key); } public javax.swing.JComponent getComponent() { return getRootPane(); } // ****************************************** protected void showAbout() { AboutWindow aw = new AboutWindow(getComponent(), this, new java.awt.Dimension(500, 400)); try { aw.buildAboutTab("JClic Reports", getMsg("REPORTS_VERSION"), "logo_reports_small.png", null, null, null, null); aw.buildStandardTab(aw.getHtmlSystemInfo(), "about_window_systemInfo", "about_window_lb_system", "icons/system_small.gif"); aw.setVisible(true); } catch (Exception ex) { System.err.println("Error building about window!\n" + ex); } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton aboutBtn; private javax.swing.JPanel btnPanel; private javax.swing.JPanel btnWebPanel; private javax.swing.JButton exitBtn; private javax.swing.JButton launchBrowserBtn; private javax.swing.JButton settingsButton; private javax.swing.JButton startWebServerBtn; private javax.swing.JButton stopWebServerBtn; private javax.swing.JButton webClearTextBtn; private javax.swing.JButton webCopyTextBtn; private javax.swing.JPanel webMsgPanel; private javax.swing.JScrollPane webMsgScrollPane; private javax.swing.JTextArea webMsgTextArea; private javax.swing.JPanel webServerPane; private javax.swing.JCheckBox webVerboseCheckBox; // End of variables declaration//GEN-END:variables } src/report/reportServer/ReportServerSettingsDlg.form000066400000000000000000001175331335566474600234160ustar00rootroot00000000000000
src/report/reportServer/ReportServerSettingsDlg.java000066400000000000000000000522741335566474600233740ustar00rootroot00000000000000/* * File : ReportServerSettingsDlg.java * Created : 21-feb-2003 09:57 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ import edu.xtec.jclic.ReportServerConstants; import edu.xtec.jclic.report.BasicJDBCBridge; import edu.xtec.util.BrowserLauncher; import edu.xtec.util.LFUtil; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.db.ConnectionBeanProvider; import java.awt.Frame; import java.awt.Point; import java.io.File; import javax.swing.JDialog; import javax.swing.JFileChooser; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ReportServerSettingsDlg extends JDialog implements ReportServerConstants { Options options; Messages msg; public boolean result; /** Creates new form ReportServerSettingsDlg */ public ReportServerSettingsDlg(Frame parent, boolean modal, Options options) { super(parent, modal); this.options = options; msg = options.getMessages(); initComponents(); result = false; Point p = parent.getLocationOnScreen(); setLocation(p.x + 80, p.y + 30); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // //GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JTabbedPane mainPanel = new javax.swing.JTabbedPane(); javax.swing.JPanel optionsPanel = new javax.swing.JPanel(); langLb = new javax.swing.JLabel(); langCombo = new javax.swing.JComboBox(Messages.getDescriptiveLanguageCodes(msg.getLocale())); javax.swing.JLabel lookLb = new javax.swing.JLabel(); lookCombo = new javax.swing.JComboBox(edu.xtec.util.LFUtil.VALUES); tooltipChk = new javax.swing.JCheckBox(); javax.swing.JLabel browserLb = new javax.swing.JLabel(); browserField = new javax.swing.JTextField(); dbPanel = new javax.swing.JPanel(); driverLb = new javax.swing.JLabel(); driverField = new javax.swing.JTextField(); urlLb = new javax.swing.JLabel(); urlField = new javax.swing.JTextField(); usrLb = new javax.swing.JLabel(); usrField = new javax.swing.JTextField(); pwdLb = new javax.swing.JLabel(); pwdField = new javax.swing.JPasswordField(options.getString(ConnectionBeanProvider.DB_PASSWORD, ""), 20); prefixLb = new javax.swing.JLabel(); prefixFld = new javax.swing.JTextField(); createChk = new javax.swing.JCheckBox(); webPanel = new javax.swing.JPanel(); webAutostartChk = new javax.swing.JCheckBox(); webPortLb = new javax.swing.JLabel(); webPortField = new javax.swing.JTextField(); webTimeoutLb = new javax.swing.JLabel(); webTimeoutField = new javax.swing.JTextField(); sessionLifetimeLb = new javax.swing.JLabel(); sessionLifetimeField = new javax.swing.JTextField(); webLogLb = new javax.swing.JLabel(); webLogField = new javax.swing.JTextField(); logFileWebBtn = new javax.swing.JButton(); javax.swing.JPanel btPanel = new javax.swing.JPanel(); javax.swing.JButton btOk = new javax.swing.JButton(); javax.swing.JButton btCancel = new javax.swing.JButton(); setTitle(msg.get("settings_title")); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); optionsPanel.setLayout(new java.awt.GridBagLayout()); langLb.setText(msg.get("settings_options_language")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); optionsPanel.add(langLb, gridBagConstraints); langCombo.setSelectedItem(Messages.getDescriptiveLanguageCode(msg.getLocale().getLanguage())); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); optionsPanel.add(langCombo, gridBagConstraints); lookLb.setText(msg.get("settings_options_look")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); optionsPanel.add(lookLb, gridBagConstraints); lookCombo.setSelectedItem(options.getString(LOOK, LFUtil.DEFAULT)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); optionsPanel.add(lookCombo, gridBagConstraints); tooltipChk.setSelected(options.getBoolean(TOOLTIPS, true)); tooltipChk.setText(msg.get("settings_options_tooltips")); tooltipChk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { tooltipChkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); optionsPanel.add(tooltipChk, gridBagConstraints); browserLb.setLabelFor(browserField); browserLb.setText(msg.get("settings_browser")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); optionsPanel.add(browserLb, gridBagConstraints); browserField.setText(options.getString(edu.xtec.util.BrowserLauncher.BROWSER, "")); browserField.setToolTipText("msg.get(\"settings_browser_tooltip\")"); browserField.setMinimumSize(new java.awt.Dimension(75, 21)); browserField.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); optionsPanel.add(browserField, gridBagConstraints); mainPanel.addTab(msg.get("settings_options_title"), optionsPanel); dbPanel.setPreferredSize(new java.awt.Dimension(440, 200)); dbPanel.setLayout(new java.awt.GridBagLayout()); driverLb.setText(msg.get("settings_db_driver")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(driverLb, gridBagConstraints); driverField.setText(options.getString(ConnectionBeanProvider.DB_DRIVER, "")); driverField.setMinimumSize(new java.awt.Dimension(75, 21)); driverField.setPreferredSize(new java.awt.Dimension(200, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(driverField, gridBagConstraints); urlLb.setText(msg.get("settings_db_url")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(urlLb, gridBagConstraints); urlField.setText(options.getString(ConnectionBeanProvider.DB_SERVER, "")); urlField.setMinimumSize(new java.awt.Dimension(75, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(urlField, gridBagConstraints); usrLb.setText(msg.get("settings_db_usr")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(usrLb, gridBagConstraints); usrField.setText(options.getString(ConnectionBeanProvider.DB_LOGIN, "")); usrField.setMinimumSize(new java.awt.Dimension(75, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(usrField, gridBagConstraints); pwdLb.setText(msg.get("settings_db_pwd")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(pwdLb, gridBagConstraints); pwdField.setMinimumSize(new java.awt.Dimension(75, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(pwdField, gridBagConstraints); prefixLb.setText(msg.get("settings_tablePrefix")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(prefixLb, gridBagConstraints); prefixFld.setText(options.getString(BasicJDBCBridge.TABLE_PREFIX_KEY, "")); prefixFld.setMinimumSize(new java.awt.Dimension(75, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(prefixFld, gridBagConstraints); createChk.setSelected(options.getBoolean(BasicJDBCBridge.CREATE_TABLES_KEY, true)); createChk.setText(options.getMsg("settings_createTables")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); dbPanel.add(createChk, gridBagConstraints); mainPanel.addTab(msg.get("settings_db_title"), dbPanel); webPanel.setPreferredSize(new java.awt.Dimension(300, 112)); webPanel.setLayout(new java.awt.GridBagLayout()); webAutostartChk.setSelected(options.getBoolean(HTTP_AUTOSTART, false)); webAutostartChk.setText(msg.get("settings_server_autostart")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(webAutostartChk, gridBagConstraints); webPortLb.setLabelFor(webPortField); webPortLb.setText(msg.get("settings_server_port")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(webPortLb, gridBagConstraints); webPortField.setText(options.getString(HTTP_PORT, "")); webPortField.setMinimumSize(new java.awt.Dimension(70, 21)); webPortField.setPreferredSize(new java.awt.Dimension(80, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(webPortField, gridBagConstraints); webTimeoutLb.setLabelFor(webTimeoutField); webTimeoutLb.setText(msg.get("settings_server_timeout")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(webTimeoutLb, gridBagConstraints); webTimeoutField.setText(options.getString(HTTP_TIMEOUT, "")); webTimeoutField.setMinimumSize(new java.awt.Dimension(70, 21)); webTimeoutField.setPreferredSize(new java.awt.Dimension(80, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(webTimeoutField, gridBagConstraints); sessionLifetimeLb.setLabelFor(sessionLifetimeField); sessionLifetimeLb.setText(msg.get("settings_session_lifetime")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(sessionLifetimeLb, gridBagConstraints); sessionLifetimeField.setText(options.getString(SESSION_LIFETIME, "")); sessionLifetimeField.setMinimumSize(new java.awt.Dimension(70, 21)); sessionLifetimeField.setPreferredSize(new java.awt.Dimension(80, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(sessionLifetimeField, gridBagConstraints); webLogLb.setLabelFor(webLogField); webLogLb.setText(msg.get("settings_server_logFile")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(webLogLb, gridBagConstraints); webLogField.setText(options.getString(HTTP_LOGFILE, "")); webLogField.setMinimumSize(new java.awt.Dimension(70, 21)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(webLogField, gridBagConstraints); logFileWebBtn.setText(msg.get("settings_file")); logFileWebBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { logFileWebBtnActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); webPanel.add(logFileWebBtn, gridBagConstraints); mainPanel.addTab(msg.get("settings_web_title"), webPanel); getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER); btOk.setText(msg.get("OK")); btOk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btOkActionPerformed(evt); } }); btPanel.add(btOk); btCancel.setText(msg.get("CANCEL")); btCancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btCancelActionPerformed(evt); } }); btPanel.add(btCancel); getContentPane().add(btPanel, java.awt.BorderLayout.SOUTH); pack(); } // //GEN-END:initComponents private void logFileWebBtnActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_logFileWebBtnActionPerformed JFileChooser chooser; String s = webLogField.getText(); if (s != null && s.length() > 0) { File f = new File(s); chooser = new JFileChooser(f.getParent()); chooser.setSelectedFile(f); } else { chooser = new JFileChooser(); chooser.setSelectedFile(new File("jclic_webserver.log")); } int b = chooser.showSaveDialog(this); if (b == JFileChooser.APPROVE_OPTION) { webLogField.setText(chooser.getSelectedFile().getAbsolutePath()); } } // GEN-LAST:event_logFileWebBtnActionPerformed private void tooltipChkActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_tooltipChkActionPerformed // Add your handling code here: } // GEN-LAST:event_tooltipChkActionPerformed private void btCancelActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btCancelActionPerformed closeDialog(null); } // GEN-LAST:event_btCancelActionPerformed private void btOkActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btOkActionPerformed readValues(); result = true; closeDialog(null); } // GEN-LAST:event_btOkActionPerformed /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt) { // GEN-FIRST:event_closeDialog setVisible(false); dispose(); } // GEN-LAST:event_closeDialog protected void readValues() { options.put(Messages.LANGUAGE, Messages.getLanguageFromDescriptive(langCombo.getSelectedItem().toString())); options.put(LOOK, lookCombo.getSelectedItem().toString()); options.put(TOOLTIPS, tooltipChk.isSelected() ? TRUE : FALSE); options.put(ConnectionBeanProvider.DB_DRIVER, driverField.getText()); options.put(ConnectionBeanProvider.DB_SERVER, urlField.getText()); options.put(ConnectionBeanProvider.DB_LOGIN, usrField.getText()); options.put(ConnectionBeanProvider.DB_PASSWORD, new String(pwdField.getPassword())); options.put(BasicJDBCBridge.TABLE_PREFIX_KEY, prefixFld.getText()); options.put(BasicJDBCBridge.CREATE_TABLES_KEY, createChk.isSelected() ? "true" : "false"); options.put(HTTP_PORT, webPortField.getText()); options.put(HTTP_TIMEOUT, webTimeoutField.getText()); options.put(SESSION_LIFETIME, sessionLifetimeField.getText()); options.put(HTTP_AUTOSTART, webAutostartChk.isSelected() ? TRUE : FALSE); options.put(HTTP_LOGFILE, webLogField.getText()); options.put(BrowserLauncher.BROWSER, browserField.getText()); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField browserField; private javax.swing.JCheckBox createChk; private javax.swing.JPanel dbPanel; private javax.swing.JTextField driverField; private javax.swing.JLabel driverLb; private javax.swing.JComboBox langCombo; private javax.swing.JLabel langLb; private javax.swing.JButton logFileWebBtn; private javax.swing.JComboBox lookCombo; private javax.swing.JTextField prefixFld; private javax.swing.JLabel prefixLb; private javax.swing.JPasswordField pwdField; private javax.swing.JLabel pwdLb; private javax.swing.JTextField sessionLifetimeField; private javax.swing.JLabel sessionLifetimeLb; private javax.swing.JCheckBox tooltipChk; private javax.swing.JTextField urlField; private javax.swing.JLabel urlLb; private javax.swing.JTextField usrField; private javax.swing.JLabel usrLb; private javax.swing.JCheckBox webAutostartChk; private javax.swing.JTextField webLogField; private javax.swing.JLabel webLogLb; private javax.swing.JPanel webPanel; private javax.swing.JTextField webPortField; private javax.swing.JLabel webPortLb; private javax.swing.JTextField webTimeoutField; private javax.swing.JLabel webTimeoutLb; // End of variables declaration//GEN-END:variables } src/report/reportServer/edu/000077500000000000000000000000001335566474600164625ustar00rootroot00000000000000src/report/reportServer/edu/xtec/000077500000000000000000000000001335566474600174255ustar00rootroot00000000000000src/report/reportServer/edu/xtec/jclic/000077500000000000000000000000001335566474600205115ustar00rootroot00000000000000src/report/reportServer/edu/xtec/jclic/report/000077500000000000000000000000001335566474600220245ustar00rootroot00000000000000src/report/reportServer/edu/xtec/jclic/report/HTTPReportServer.java000066400000000000000000000204151335566474600260330ustar00rootroot00000000000000/* * File : HttpReportServer.java * Created : 13-feb-2003 14:47 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.jclic.report.rp.*; import edu.xtec.servlet.RequestProcessor; import edu.xtec.servlet.ResourceRP; import edu.xtec.util.Messages; import java.io.IOException; import java.io.InterruptedIOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class HTTPReportServer extends ReportServerEventMaker { public static final int DEFAULT_PORT = 9000, DEFAULT_TIMEOUT = 1200; protected static final String[] URI = { "/login", "/main", "/dbAdmin", "/userReport", "/actReport", "/img", "/groupReport", "/groupAdmin", "/userAdmin", "/resource", "/JClicReportService" }; protected static final Class[] CLS = { Login.class, Main.class, DbAdmin.class, UserReport.class, ActReport.class, Img.class, GroupReport.class, GroupAdmin.class, UserAdmin.class, ResourceRP.class, JClicReportService.class }; HttpThread httpThread; edu.xtec.util.Messages messages; /** Creates a new instance of HttpReportServer */ public HTTPReportServer(Messages messages) { this.messages = messages; httpThread = null; RequestProcessor.setDirectResources(true); } public boolean startServer(int port, int timeOut) { if (serverRunning()) { fireReportServerSystemEvent(messages.get("manage_server_already_started"), ReportServerEvent.ERROR); return false; } try { httpThread = new HttpThread(port, timeOut); httpThread.start(); } catch (Exception e) { fireReportServerSystemEvent(e.toString(), ReportServerEvent.ERROR); return false; } return true; } public boolean stopServer() { if (!serverRunning()) { fireReportServerSystemEvent("Server is not started!", ReportServerEvent.ERROR); return false; } httpThread.stopServer(); while (serverRunning()) { Thread.yield(); } return true; } @Override protected void finalize() throws Throwable { try { if (serverRunning()) stopServer(); } finally { super.finalize(); } } public boolean serverRunning() { return httpThread != null; } protected class HttpThread extends Thread { boolean running = false; ServerSocket ss = null; int socketTimeOut = 0; HttpThread(int port, int timeOut) throws Exception { ss = new ServerSocket(port); fireReportServerSystemEvent(Integer.toString(port), ReportServerEvent.START); socketTimeOut = timeOut; running = false; } @Override public void run() { try { running = true; ss.setSoTimeout(1000); while (running) { try { Socket socket = ss.accept(); ClientConnection cc = new ClientConnection(socket); cc.start(); } catch (InterruptedIOException ioex) { // Timeout. start again... } catch (Exception ex) { fireReportServerSystemEvent(ex.toString(), ReportServerEvent.ERROR); running = false; } } ss.close(); fireReportServerSystemEvent(null, ReportServerEvent.STOP); } catch (IOException e) { fireReportServerSystemEvent(e.toString(), ReportServerEvent.ERROR); } running = false; httpThread = null; } public void stopServer() { running = false; } protected class ClientConnection extends Thread { Socket socket = null; int id = 0; ClientConnection(Socket socket) { this.socket = socket; } @Override public void run() { RequestProcessor rp = null; HTTPRequest re = null; try { re = new HTTPRequest(socket); fireReportServerSocketEvent(socket, re.firstLine, ReportServerEvent.CONNECTION); String url = re.urlBase; if (url == null || url.length() == 0 || url.equals("/")) url = URI[0]; Class cl = null; for (int i = 0; i < URI.length; i++) { if (URI[i].equals(url)) { cl = CLS[i]; break; } } int p = 0; if (cl == null && re.urlBase != null && (p = re.urlBase.lastIndexOf('/')) >= 0 && p < re.urlBase.length() - 1) { String s = re.urlBase.substring(p + 1); re.params.put(ResourceRP.ID, new String[] { s }); cl = ResourceRP.class; } if (cl == null) { re.error(HTTPRequest.NOT_FOUND, null); } else { rp = (RequestProcessor) cl.newInstance(); rp.setParams(re.params); if (rp.wantsInputStream()) rp.setInputStream(re.inputStream); for (String key : re.cookies.keySet()) { rp.setCookie(key, (String) re.cookies.get(key)); } rp.init(); re.head.cache = !rp.noCache(); List v = new ArrayList(); rp.header(v); if (!v.isEmpty()) { Iterator it = v.iterator(); while (it.hasNext() && !re.head.commited) { String[] h = (String[]) it.next(); if (h[0].equals(RequestProcessor.ERROR)) { re.error(Integer.parseInt(h[1]), h[2]); } else if (h[0].equals(RequestProcessor.REDIRECT)) { re.redirect(h[1]); break; } else if (h[0].equals(RequestProcessor.CONTENT_TYPE)) re.head.contentType = h[1]; else if (h[0].equals(RequestProcessor.CONTENT_LENGTH)) re.head.contentLength = Integer.parseInt(h[1]); else if (h[0].equals(RequestProcessor.EXTRA)) { StringBuilder sb = new StringBuilder(100); if (re.head.extra != null) sb.append(re.head.extra).append("\r\n"); sb.append(h[1]).append(": ").append(h[2]); re.head.extra = sb.substring(0); } else if (h[0].equals(RequestProcessor.COOKIE)) re.cookies.put(h[1], h[2]); } } if (!re.head.commited) { re.head.write(); if (rp.usesWriter()) { rp.process(re.pw); re.pw.flush(); re.pw.close(); } else { rp.process(re.os); re.os.flush(); re.os.close(); } re.commited = true; } rp.end(); rp = null; } } catch (Exception ex) { int errCode = (rp != null && rp.errCode >= 0) ? rp.errCode : HTTPRequest.SERVER_ERROR; String errMsg = (rp != null && rp.errMsg != null) ? rp.errMsg : ex.getMessage(); if (re != null && !re.head.commited) { try { re.error(errCode, errMsg); } catch (Exception ex2) { System.err.println("Unable to report error due to\n" + ex2); } } fireReportServerSocketEvent(socket, ex.toString(), ReportServerEvent.ERROR); System.err.println("ERROR " + errCode + ": " + errMsg); ex.printStackTrace(System.err); } finally { if (rp != null) rp.end(); try { socket.close(); } catch (Exception ex) { System.err.println("Unable to close socket due to:\n" + ex); } } } } } } src/report/reportServer/edu/xtec/jclic/report/HTTPRequest.java000066400000000000000000000256421335566474600250300ustar00rootroot00000000000000/* * File : HTTPRequest.java * Created : 13-feb-2003 15:19 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.servlet.RequestProcessor; import edu.xtec.util.Html; import edu.xtec.util.StrUtils; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.StringTokenizer; /** * This class provides methods and encapsulates the data involved in a * transaction using the HTTP protocol. It provides basic methods to accept an * incoming conenction throught an open {@link java.net.Socket}, read the * cookies and parameters passed by the client, read the data passed into the * request header and leave a prepared {@link java.io.OutputStream} and a * {@link java.io.PrintWriter} for sending back the response to the client. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class HTTPRequest { public Socket socket; public BufferedReader in; public OutputStream os; public PrintWriter pw; public Map cookies = new HashMap(); public Map params = new HashMap(); public String method; public String urlBase; public String protocol; public boolean commited; public String firstLine; public InputStream inputStream; ResponseHead head = new ResponseHead(); public static final int OK = 200, BAD_REQUEST = 400, MOVED_PERM = 301, FOUND = 302, NOT_FOUND = 404, SERVER_ERROR = 500; public static final String MIME_HTML = "text/html"; /** Creates a new instance of HTTPRequest */ public HTTPRequest(Socket socket) throws Exception { this.socket = socket; buildStreams(); int cl = -1; try { firstLine = in.readLine(); if (firstLine == null) { while (in.ready()) in.readLine(); return; } StringTokenizer st = new StringTokenizer(firstLine, " "); method = st.nextToken(); String s = st.nextToken(); int i = s.indexOf('?'); if (i < 0) urlBase = s; else { urlBase = s.substring(0, i); processParamsLine(s.substring(i + 1), params, '&', '=', true); } protocol = st.nextToken(); if (protocol == null || !protocol.equals("HTTP/1.0") && !protocol.equals("HTTP/1.1")) { error(BAD_REQUEST, null); throw new Exception("Bad request!"); } } catch (Exception ex) { error(BAD_REQUEST, null); throw ex; } while (true) { String line = StrUtils.nullableString(in.readLine()); if (line == null) break; else if (line.toLowerCase().startsWith("cookie:")) { int k = line.indexOf(' '); if (k > 0) processParamsLine(line.substring(k + 1), cookies, ';', '=', false); } else if (line.toLowerCase().startsWith("content-length:")) { cl = Integer.parseInt(line.substring(16)); } } if (cl >= 0) { char[] buf = new char[cl]; int k = in.read(buf); // Corrected a bug that added trailing zeroes to the resulting line // Now the "copyValueOf" takes care of the number of readed "chars", // not the estimated length in bytes // String line=String.copyValueOf(buf); String line = String.copyValueOf(buf, 0, k); inputStream = new java.io.ByteArrayInputStream(line.getBytes()); if (!line.startsWith("<")) processParamsLine(line, params, '&', '=', true); } else { while (in.ready()) { String line = StrUtils.nullableString(in.readLine()); if (line == null) break; processParamsLine(line, params, '&', '=', true); } } } private void buildStreams() throws java.io.IOException { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); os = new BufferedOutputStream(socket.getOutputStream()); pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), RequestProcessor.CHARSET)); } private void buildStreamsDebug(final java.io.PrintStream log) throws java.io.IOException { in = new BufferedReader(new InputStreamReader(socket.getInputStream())) { @Override public String readLine() throws java.io.IOException { String result = super.readLine(); if (result != null) { log.println("< " + result); } return result; } @Override public int read(char buf[]) throws java.io.IOException { int result = super.read(buf); if (result > 0) log.println("< " + new String(buf, 0, result)); return result; } }; os = new BufferedOutputStream(socket.getOutputStream()) { @Override public synchronized void write(byte b[], int off, int len) throws java.io.IOException { if (b != null) { log.println("> " + new String(b, off, len)); } super.write(b, off, len); } }; pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), RequestProcessor.CHARSET)) { @Override public void write(String s, int off, int len) { log.println("> " + s); super.write(s, off, len); } }; } public static void processParamsLine(String txt, Map map, char sep, char equalSign, boolean arrays) { if (txt != null && txt.length() > 0 && map != null) { StringTokenizer st = new StringTokenizer(txt, String.valueOf(sep)); while (st.hasMoreTokens()) { String s = st.nextToken().trim(); String key, value = null; int k = s.indexOf(equalSign); if (k > 0) { key = Html.decode(s.substring(0, k).replace('+', ' ')); if (k < s.length() - 1) value = Html.decode(s.substring(k + 1).replace('+', ' ')); } else key = Html.decode(s.replace('+', ' ')); if (arrays) { String[] vArray = (String[]) map.get(key); if (vArray == null) { vArray = new String[] { value }; } else { String[] v2 = new String[vArray.length + 1]; int i = 0; for (; i < vArray.length; i++) v2[i] = vArray[i]; v2[i] = value; vArray = v2; } map.put(key, vArray); } else { map.put(key, value); } } } } public final void error(int code, String msg) throws Exception { String err; switch (code) { case BAD_REQUEST: err = "Bad Request"; break; case MOVED_PERM: err = "Moved permanently"; break; case NOT_FOUND: err = "File not found"; break; case SERVER_ERROR: err = "Server error"; break; default: err = "Undefined error"; } head.code = code; head.title = err; head.write(); StringBuilder sb = new StringBuilder(100); sb.append("").append(err).append("\n
 
\n"); if (msg != null) sb.append(msg); minimalPage("ERROR: " + err, sb.substring(0)); } public void redirect(String url) throws Exception { head.contentType = null; head.code = MOVED_PERM; head.title = "Moved permanently"; StringBuilder sb = new StringBuilder(100); sb.append("http://"); String serverAddress = socket.getLocalAddress().getHostAddress(); if (serverAddress == null || "0.0.0.0".equals(serverAddress)) serverAddress = java.net.InetAddress.getLocalHost().getHostAddress(); sb.append(serverAddress); sb.append(":").append(socket.getLocalPort()).append("/").append(url); String fullUrl = sb.substring(0); sb.setLength(0); sb.append("Location: ").append(fullUrl); head.extra = sb.substring(0); head.write(); sb.setLength(0); sb.append("redirected to: ").append(fullUrl).append(""); minimalPage("redirect", sb.substring(0)); } public class ResponseHead { public String contentType; public int code, contentLength; public String title, extra; public boolean cache; public boolean commited; public ResponseHead() { contentType = MIME_HTML; code = OK; cache = true; commited = false; contentLength = -1; } public void write() { StringBuilder sb = new StringBuilder(200); sb.append("HTTP/1.0 "); sb.append(code).append(" ").append(title == null ? "OK" : title); pw.println(sb.substring(0)); if (extra != null) pw.println(extra); if (contentType != null) { sb.setLength(0); pw.println(sb.append("Content-Type: ").append(contentType).substring(0)); } sb.setLength(0); pw.println(sb.append("Date: ").append(RequestProcessor.httpDate(new java.util.Date())).substring(0)); pw.println("Server: JClicHttpServer 1.0"); if (!cache) { pw.println("Pragma: no-cache"); // HTTP/1.0 pw.println("Cache-Control: no-cache"); // HTTP/1.1 pw.println("Expires: 0"); } if (cookies.size() > 0) { sb.setLength(0); sb.append("Set-Cookie: "); Iterator it = cookies.keySet().iterator(); boolean first = true; while (it.hasNext()) { String key = (String) it.next(); if (!first) sb.append(";"); else first = false; sb.append(key).append("=").append(cookies.get(key)); } pw.println(sb.substring(0)); } if (contentLength > 0) { sb.setLength(0); pw.println(sb.append("Content-Length: ").append(contentLength).substring(0)); } pw.println(""); pw.flush(); commited = true; } } public void minimalPage(String title, String text) throws Exception { StringBuilder sb = new StringBuilder(1024); sb.append("\n"); sb.append("\n\n"); if (title != null) sb.append("").append(title).append("\n"); sb.append("\n\n"); sb.append("

").append(title).append("

\n"); sb.append(text); sb.append("\n\n"); pw.println(sb.substring(0)); os.flush(); commited = true; } } src/report/reportServer/edu/xtec/jclic/report/ReportServerEvent.java000066400000000000000000000042561335566474600263420ustar00rootroot00000000000000/* * File : ReportServerEvent.java * Created : 06-sep-2002 13:19 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import java.net.Socket; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class ReportServerEvent extends Object { public static final int SYSTEM = 0, SOCKET = 1, DB = 2; public static final int CONNECT = 0, DISCONNECT = 1, START = 2, STOP = 3, MSG = 4, ERROR = 5, CONNECTION = 6; public int type; public int action; public String msg; public Socket socket; public ReportServerEvent(int type, String msg, Socket socket, int action) { this.type = type; this.msg = msg; this.socket = socket; this.action = action; } @Override public String toString() { StringBuilder sb = new StringBuilder(100); sb.append(type == SYSTEM ? "SYSTEM " : type == SOCKET ? "" : "DB "); String sAct = ""; switch (action) { case CONNECT: sAct = "CONNECT"; break; case DISCONNECT: sAct = "DISCONNECT"; break; case START: sAct = "START"; break; case STOP: sAct = "STOP"; break; case ERROR: sAct = "ERROR"; break; case CONNECTION: sAct = msg == null ? "CONNECTION" : ""; break; } sb.append(sAct).append(" "); if (socket != null) sb.append(socket.getInetAddress().getHostAddress()).append(":").append(socket.getPort()).append(" "); if (msg != null) sb.append(msg); return sb.substring(0); } } src/report/reportServer/edu/xtec/jclic/report/ReportServerEventMaker.java000066400000000000000000000043661335566474600273240ustar00rootroot00000000000000/* * File : ReportServerEventMaker.java * Created : 06-sep-2002 13:25 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import java.net.Socket; import java.util.ArrayList; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class ReportServerEventMaker { protected List listeners = new ArrayList(1); public interface Listener { public void reportEventPerformed(ReportServerEvent ev); } /** Creates a new instance of ReportServerEventMaker */ public ReportServerEventMaker() { } public void addListener(Listener ls) { listeners.add(ls); } public void removeListener(Listener ls) { listeners.remove(ls); } public void fireReportServerSystemEvent(String s) { fireReportServerSystemEvent(s, ReportServerEvent.MSG); } public void fireReportServerSystemEvent(String s, int action) { fireReportServerEvent(ReportServerEvent.SYSTEM, s, null, action); } public void fireReportServerSocketEvent(Socket socket, String msg) { fireReportServerSocketEvent(socket, msg, ReportServerEvent.MSG); } public void fireReportServerSocketEvent(Socket socket, String msg, int action) { fireReportServerEvent(ReportServerEvent.SOCKET, msg, socket, action); } public void fireReportServerEvent(int type, String msg, Socket socket, int action) { ReportServerEvent ev = new ReportServerEvent(type, msg, socket, action); for (int i = 0; i < listeners.size(); i++) { ((Listener) listeners.get(i)).reportEventPerformed(ev); } } } src/report/reportServer/edu/xtec/resources/000077500000000000000000000000001335566474600214375ustar00rootroot00000000000000src/report/reportServer/edu/xtec/resources/about/000077500000000000000000000000001335566474600225515ustar00rootroot00000000000000src/report/reportServer/edu/xtec/resources/about/logo_reports_small.png000066400000000000000000000077131335566474600271750ustar00rootroot00000000000000PNG  IHDRU] sBIT|d pHYs  ~tEXtCreation Time09/05/04%tEXtSoftwareMacromedia Fireworks MX 2004vIDATxKlGz3Ù2%Y%Q~(E7Vb F. yAe>$WQ@jx5vڲ=Z۲wWP5Ts3=Y?%NuUWu]4h&Zx!!2 x0=:nf(<4Oɔ)0d'\ۧ٧4#QLc+!x<K?OncFd0ah#=`P#JBPqB醳m5x4=ᖷ1,^8a X|L, <):À,`Y%"k+D9'U!x n'SMn@QWxɔΘ&1Lw `./][|BCO] vI#7jYqT`mY«K[+Jwnaށ^^2Mzo a*eX]on;kTJ+Nct &%?ćZ+ukZñ8)U砻Wi!>d z0ź5-+do&qBw",=b"Gu]}QBV RGpx-mN!nw x4i CGpj:N&R܃rY‘Xǐ_ᰌ{ /FDR,CL[ 9[dR_?`^DZlAN!p˩a 0z`Cjz-!-Z2eđ[\ N"6 hH4&çet:Vr5 JPJîG%@2e!Go ieXđ* Ga̮n yO{y {ɔAwxx]^u|,€i}xO RdOkh-oQ7ɔr]r]^ c0K):Lvi1?N]rx8,z;A7ggTЅ+p$;Ȩ0u6}SM|j{@٪M!1*C#g"UlHx^ZzZx$,kps bTb8 -f dn'aY隤mO6?D?zٚ:&*\l LXuEW˅eDv^w5Wˎ&,b۲+v'0$,+m6q`'d²Qe`s]~n#@P!S@bTƶ ^$,k)њ2Tz]2}Ŧn;+<^x>ie#G^',"*ۮ}N5RsQpQbGwI *O<4i >RltiJH+bUtƶ~ۅ^Pnv&y.cMel=Wk^ƶ/ ^tJ8:t͈%;^Ins$,9dW`L]>:6]>GY,0FUn$,*pޓ6N 8?<z;.hi}M5i렦9V :po Ⱥhu?(1aYc :3{ 6:)<+e flrZ\C:MhZؿ$#,֊oTOGȥ_y~?ei;n%H~#>iY3>x~guFAd}jWu_t&sS>i>i*Z$[sguT%6ΥUq3}&0B6D| շQ |M}>ՉE67u"Aa?AVmUV^1 ~ƶӞ} V B >3lruԺC%q2Ipo,L"H6!!T#lUx&*VE(l)!Wਜ਼7\cwB<ǫrvXí= Np J4;2W/.cW ٦7Q[:MYqrƶgk op e÷ Q++yùZ䁢}貀 CPH 9x#g2~ J|i zޢwmm_>cuOelv[ w2&4u.qU?v? eգ22oOG0+ϕjCO~꥿%ei6cw16zf&2nX²1lgpַ^1z7_d"M|Χ1^@*p) ᅐV&<"cZ|9>jْ4e,y@ d}W-$ri+NB5ޫEϱ<ׅe]T\RϹjz |үߨ:.z3Azbo2Kȍw T5=aYKHהui-sFZ-ۛ,zǐuƼ( 'dl{V VKy )P.?h"ۇQ׆m=?7 J_ "{qj}44*^+^mt/ji탄e 8=b?@e,7aYgUYo_²Y`/*X4 ryQ0Ko3t7u?+HDZq no messages, 1 -> Errors, 2 -> Warnings, 3 -> Information. # Default is 2. dbDebugLevel=2 # Max time a connection can be checked out before being recycled. # Zero value turns option off. Default is 60. dbMaxCheckoutSeconds=60 #-------------------------------------------------------------------------- # Parameters related to the drawing of graphics #-------------------------------------------------------------------------- graph_width=440 graph_dist_width=192 graph_height=155 graph_header_height=25 graph_margin=8 graph_color_bg=F0F8FF graph_color_text=000000 graph_color_border=FFFFFF graph_color_v1=D00000 graph_color_v2=00D000 graph_color_dist=0000D0 graph_color_alert=FF0000 graph_stroke_width=3.0 graph_font_family=Dialog graph_font_size=11 graph_margin_x=50 graph_margin_y=20 graph_div_y=4 graph_max_cols=10 graph_margin_dist_x=15 graph_margin_dist_y=20 graph_color_header_bg=ADD8E6 graph_color_header_text=000000 src/report/reportServlets/edu/xtec/jclic/report/000077500000000000000000000000001335566474600223655ustar00rootroot00000000000000src/report/reportServlets/edu/xtec/jclic/report/ActivityData.java000066400000000000000000000033231335566474600256170ustar00rootroot00000000000000/* * File : ActivityData.java * Created : 07-feb-2003 17:01 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ActivityData implements java.io.Serializable { public String project, activityName, id; public int time, actions, score, qualification; public boolean solved; /** Creates a new instance of ActivityData */ public ActivityData(String project, String activityName, String id, int time, int actions, int score, boolean solved, int qualification) { this.project = project != null ? project.trim() : null; this.activityName = activityName != null ? activityName.trim() : null; this.id = id != null ? id.trim() : null; this.time = time; this.actions = actions; this.score = score; this.solved = solved; this.qualification = qualification; } public int percentSolved() { int result = 0; if (actions > 0) result = (score * 100) / actions; return result; } } src/report/reportServlets/edu/xtec/jclic/report/ReportServerJDBCBridge.java000066400000000000000000000641401335566474600274370ustar00rootroot00000000000000/* * File : ReportServerJDBCBridge.java * Created : 11-feb-2003 15:52 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import edu.xtec.util.StrUtils; import edu.xtec.util.db.ConnectionBean; import edu.xtec.util.db.ConnectionBeanProvider; import java.sql.*; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.23 */ public class ReportServerJDBCBridge extends BasicJDBCBridge { public static final String[] KCC = { "SESSION_KEY", "SESSION_CODE", "SESSION_CONTEXT" }; public String GROUP_SESSION_DATE_STRING = null; public String ORDER_QUALIFICATION_1_STRING = null; public String ORDER_QUALIFICATION_2_STRING = null; public ReportServerJDBCBridge(ConnectionBeanProvider cbp, boolean createTables, String tablePrefix) throws Exception { super(cbp, createTables, tablePrefix); ConnectionBean cb = cbp.getConnectionBean(); // Changed 20-Dec-2010: Set default behavior to MySQL instead of MS-Access // TODO: Check code with PostgreSQL switch (DBMSType) { case ACCESS: GROUP_SESSION_DATE_STRING = "Format(s.SESSION_DATETIME,'yyyy/mm/dd')"; ORDER_QUALIFICATION_1_STRING = "sum(QUALIFICATION)/count(*)"; ORDER_QUALIFICATION_2_STRING = ORDER_QUALIFICATION_1_STRING; break; case ORACLE: GROUP_SESSION_DATE_STRING = "trunc(s.SESSION_DATETIME)"; ORDER_QUALIFICATION_1_STRING = "sum(QUALIFICATION)/count(*) AS qf"; ORDER_QUALIFICATION_2_STRING = "qf"; break; case MYSQL: default: // MYSQL & Other GROUP_SESSION_DATE_STRING = "s.SESSION_DATETIME"; ORDER_QUALIFICATION_1_STRING = "sum(QUALIFICATION)/count(*) AS qf"; // std as in Oracle ORDER_QUALIFICATION_2_STRING = "qf"; break; } } private static java.util.Date FIRST_DATE = null; public static java.util.Date getFirstDate() { if (FIRST_DATE == null) { Calendar c = Calendar.getInstance(); c.set(1992, 0, 1); FIRST_DATE = c.getTime(); } return FIRST_DATE; } public java.util.Date getMinSessionDate() throws Exception { Exception ex = null; java.util.Date d = getFirstDate(); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement pstmt = null; try { pstmt = cb.getPreparedStatement("SELECT min(SESSION_DATETIME)" + " FROM " + getTableName("SESSIONS")); ResultSet result = pstmt.executeQuery(); if (result.next()) d = result.getDate(1); result.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(pstmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return d; } private String getFilteringStringQuery(String[] kcc, boolean and) { StringBuilder sb = new StringBuilder(200); if (kcc != null) { for (int i = 0; i < KCC.length; i++) { if (kcc[i] != null && kcc[i].length() > 0) { sb.append(and ? " AND s." : " s.").append(KCC[i]).append("=?"); and = true; } } } return sb.substring(0); } private int updateFiltering(PreparedStatement pstmt, String[] kcc, int n) throws SQLException { if (kcc != null) for (int i = 0; i < KCC.length; i++) if (kcc[i] != null && kcc[i].length() > 0) pstmt.setString(n++, kcc[i]); return n; } public List getInfoSessionUser(String userId, String projectName, java.util.Date dateFrom, java.util.Date dateTo, String[] kcc, boolean groupByDate) throws Exception { Exception ex = null; List vInfoSessions = new ArrayList(); String proj = null; if (projectName != null && projectName.length() > 0 && !projectName.equals("-1")) proj = projectName; StringBuilder sb = new StringBuilder(300); sb.append("SELECT ").append(GROUP_SESSION_DATE_STRING).append(", s.SESSION_ID, s.PROJECT_NAME, count(*)") .append(", sum(QUALIFICATION), sum(a.ACTIVITY_SOLVED), sum(a.TOTAL_TIME)").append(" FROM ") .append(getTableName("SESSIONS", "s")).append(", ").append(getTableName("ACTIVITIES", "a")).append(",") .append(getTableName("USERS", "u")).append(" WHERE u.USER_ID=? AND s.USER_ID=u.USER_ID") .append(getFilteringStringQuery(kcc, true)).append(" AND s.SESSION_DATETIME>=? AND s.SESSION_DATETIME<=?") .append(" AND s.SESSION_ID=a.SESSION_ID"); if (proj != null) sb.append(" AND s.PROJECT_NAME=?"); sb.append(" GROUP BY s.SESSION_ID, s.PROJECT_NAME, ").append(GROUP_SESSION_DATE_STRING).append(" ORDER BY ") .append(GROUP_SESSION_DATE_STRING); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement pstmt = null; try { pstmt = cb.getPreparedStatement(sb.substring(0)); int n = 1; pstmt.setString(n++, userId); n = updateFiltering(pstmt, kcc, n); pstmt.setTimestamp(n++, new Timestamp(dateFrom.getTime())); pstmt.setTimestamp(n++, new Timestamp(dateTo.getTime())); if (proj != null) pstmt.setString(n++, proj); ResultSet rs = pstmt.executeQuery(); SessionData sdx = null; while (rs.next()) { SessionData sd = new SessionData(rs.getString(2), // id userId, // user rs.getString(3), // projectName ReportUtils.strToDate(rs.getString(1)), // date rs.getInt(4), // numActs rs.getInt(6), // actsSolved rs.getInt(5), // totalPrec Math.max(0, rs.getInt(7))); // totalTime if (groupByDate) { if (sd.sameDate(sdx)) { if (sdx != null) sdx.acumula(sd); } else { if (sdx != null) vInfoSessions.add(sdx); sdx = sd; } } else vInfoSessions.add(sd); } if (sdx != null) vInfoSessions.add(sdx); rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(pstmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return vInfoSessions; } public List getInfoSessionGroup(String groupId, String projectName, java.util.Date dateFrom, java.util.Date dateTo, String[] kcc, boolean groupByDate) throws Exception { Exception ex = null; List vInfoSessions = new ArrayList(); String proj = null; if (projectName != null && projectName.length() > 0 && !projectName.equals("-1")) proj = projectName; StringBuilder sb = new StringBuilder(300); sb.append("SELECT ").append(GROUP_SESSION_DATE_STRING).append( ", s.SESSION_ID, s.PROJECT_NAME, count(*), sum(QUALIFICATION), sum(a.ACTIVITY_SOLVED), sum(a.TOTAL_TIME), s.USER_ID") .append(" FROM ").append(getTableName("SESSIONS", "s")).append(", ").append(getTableName("ACTIVITIES", "a")) .append(", ").append(getTableName("USERS", "u")).append(" WHERE u.GROUP_ID=? AND s.USER_ID=u.USER_ID") .append(getFilteringStringQuery(kcc, true)).append(" AND s.SESSION_DATETIME>=? AND s.SESSION_DATETIME<=?") .append(" AND s.SESSION_ID=a.SESSION_ID"); if (proj != null) sb.append(" AND s.PROJECT_NAME=?"); sb.append(" GROUP BY s.SESSION_ID, s.USER_ID, s.PROJECT_NAME, ").append(GROUP_SESSION_DATE_STRING) .append(" ORDER BY ").append(GROUP_SESSION_DATE_STRING); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement pstmt = null; try { pstmt = cb.getPreparedStatement(sb.substring(0)); int n = 1; pstmt.setString(n++, groupId); n = updateFiltering(pstmt, kcc, n); pstmt.setTimestamp(n++, new Timestamp(dateFrom.getTime())); pstmt.setTimestamp(n++, new Timestamp(dateTo.getTime())); if (proj != null) pstmt.setString(n++, proj); ResultSet rs = pstmt.executeQuery(); SessionData sdx = null; while (rs.next()) { SessionData sd = new SessionData(rs.getString(2), // id rs.getString(8), // user rs.getString(3), // projectName ReportUtils.strToDate(rs.getString(1)), // date rs.getInt(4), // numActs rs.getInt(6), // actsSolved rs.getInt(5), // totalPrec Math.max(0, rs.getInt(7))); // totalTime if (groupByDate) { if (sd.sameDate(sdx)) { if (sdx != null) sdx.acumula(sd); } else { if (sdx != null) vInfoSessions.add(sdx); sdx = sd; } } else vInfoSessions.add(sd); } if (sdx != null) vInfoSessions.add(sdx); rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(pstmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return vInfoSessions; } public List getInfoSessionAct(String projectName, String activityName, java.util.Date dateFrom, java.util.Date dateTo, String[] kcc, boolean groupByDate) throws Exception { Exception ex = null; List vInfoSessions = new ArrayList(); String act = null; if (activityName != null && activityName.length() > 0 && !activityName.equals("-1")) act = activityName; StringBuilder sb = new StringBuilder(300); sb.append("SELECT ").append(GROUP_SESSION_DATE_STRING).append( ", s.SESSION_ID, s.PROJECT_NAME, count(*), sum(QUALIFICATION), sum(a.ACTIVITY_SOLVED), sum(a.TOTAL_TIME), s.USER_ID") .append(" FROM ").append(getTableName("SESSIONS", "s")).append(", ").append(getTableName("ACTIVITIES", "a")) .append(" WHERE s.PROJECT_NAME=?").append(getFilteringStringQuery(kcc, true)) .append(" AND s.SESSION_DATETIME>=? AND s.SESSION_DATETIME<=?").append(" AND s.SESSION_ID=a.SESSION_ID"); if (act != null) sb.append(" AND a.ACTIVITY_NAME=?"); sb.append(" GROUP BY s.SESSION_ID, s.USER_ID, s.PROJECT_NAME, ").append(GROUP_SESSION_DATE_STRING) .append(" ORDER BY ").append(GROUP_SESSION_DATE_STRING); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement pstmt = null; try { pstmt = cb.getPreparedStatement(sb.substring(0)); int n = 1; pstmt.setString(n++, projectName); n = updateFiltering(pstmt, kcc, n); pstmt.setTimestamp(n++, new Timestamp(dateFrom.getTime())); pstmt.setTimestamp(n++, new Timestamp(dateTo.getTime())); if (act != null) pstmt.setString(n++, act); ResultSet rs = pstmt.executeQuery(); SessionData sdx = null; while (rs.next()) { SessionData sd = new SessionData(rs.getString(2), // id rs.getString(8), // user rs.getString(3), // projectName ReportUtils.strToDate(rs.getString(1)), // date rs.getInt(4), // numActs rs.getInt(6), // actsSolved rs.getInt(5), // totalPrec Math.max(0, rs.getInt(7))); // totalTime if (groupByDate) { if (sd.sameDate(sdx)) { if (sdx != null) sdx.acumula(sd); } else { if (sdx != null) vInfoSessions.add(sdx); sdx = sd; } } else vInfoSessions.add(sd); } if (sdx != null) vInfoSessions.add(sdx); rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(pstmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return vInfoSessions; } public boolean hasUserTables() throws Exception { String s = getProperty("USER_TABLES", null); boolean result = s == null || !s.trim().toLowerCase().equals("false"); return result; } public List getProjList(String userId, java.util.Date dateFrom, java.util.Date dateTo, String[] kcc) throws Exception { Exception ex = null; List pl = new ArrayList(); StringBuilder sb = new StringBuilder(300); sb.append("SELECT distinct(PROJECT_NAME)").append(" FROM ").append(getTableName("SESSIONS", "s")) .append(" WHERE s.SESSION_DATETIME>=? AND s.SESSION_DATETIME<=?"); if (userId != null) sb.append(" AND s.USER_ID=?"); // When userID==null, get data from all users sb.append(getFilteringStringQuery(kcc, true)).append(" ORDER BY PROJECT_NAME"); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement(sb.substring(0)); int n = 1; stmt.setTimestamp(n++, new Timestamp(dateFrom.getTime())); stmt.setTimestamp(n++, new Timestamp(dateTo.getTime())); if (userId != null) stmt.setString(n++, userId); updateFiltering(stmt, kcc, n); ResultSet result = stmt.executeQuery(); while (result.next()) pl.add(result.getString("PROJECT_NAME")); result.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return pl; } public List getProjListGrup(String groupId, java.util.Date dateFrom, java.util.Date dateTo, String[] kcc) throws Exception { /* * Returns a ProjList containing the list of the names of all projects made by * the users of the group 'groupName' in the time interval indicated. * Information is only returned if validated==true or if the projects wher made * in sessions where sessionKey==pass. */ Exception ex = null; List pl = new ArrayList(); StringBuilder sb = new StringBuilder(300); sb.append("SELECT distinct(PROJECT_NAME)").append(" FROM ").append(getTableName("SESSIONS", "s")).append(", ") .append(getTableName("GROUPS", "g")).append(", ").append(getTableName("USERS", "u")) .append(" WHERE SESSION_DATETIME>=? AND SESSION_DATETIME<=?") .append(" AND u.GROUP_ID=g.GROUP_ID AND s.USER_ID=u.USER_ID"); if (groupId != null) sb.append(" AND g.GROUP_ID=?"); // When groupId==null get data from all groups sb.append(getFilteringStringQuery(kcc, true)).append(" ORDER BY PROJECT_NAME"); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement(sb.substring(0)); int n = 1; stmt.setTimestamp(n++, new Timestamp(dateFrom.getTime())); stmt.setTimestamp(n++, new Timestamp(dateTo.getTime())); if (groupId != null) stmt.setString(n++, groupId); updateFiltering(stmt, kcc, n); ResultSet result = stmt.executeQuery(); while (result.next()) pl.add(result.getString("PROJECT_NAME")); result.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return pl; } public List getActList(String prj, java.util.Date dateFrom, java.util.Date dateTo, String[] kcc) throws Exception { Exception ex = null; List pl = new ArrayList(); StringBuilder sb = new StringBuilder(300); sb.append("SELECT distinct(ACTIVITY_NAME)").append(" FROM ").append(getTableName("ACTIVITIES", "a")).append(", ") .append(getTableName("SESSIONS", "s")).append(" WHERE s.SESSION_DATETIME>=? AND s.SESSION_DATETIME<=?") .append(" AND a.SESSION_ID=s.SESSION_ID"); if (prj != null) sb.append(" AND s.PROJECT_NAME=?"); sb.append(getFilteringStringQuery(kcc, true)).append(" ORDER BY ACTIVITY_NAME"); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement(sb.substring(0)); int n = 1; stmt.setTimestamp(n++, new Timestamp(dateFrom.getTime())); stmt.setTimestamp(n++, new Timestamp(dateTo.getTime())); if (prj != null) stmt.setString(n++, prj); updateFiltering(stmt, kcc, n); ResultSet result = stmt.executeQuery(); while (result.next()) pl.add(result.getString("ACTIVITY_NAME")); result.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return pl; } public List getPacSessionList(String userId, String proj, String sessionId, java.util.Date dFrom, java.util.Date dTo, String[] kcc) throws Exception { /* * Returns a PacSessionList with all the info needed to show the table with * information about the activities made in the session 'sessionId' * corresponding to the user 'userId' in the indicated date interval . Data ara * only returned when validated==true or when the invloucrated sessions where * created with sessionKey==pass. */ Exception ex = null; List v = new ArrayList(); StringBuilder sb = new StringBuilder(300); sb.append("SELECT s.PROJECT_NAME, a.ACTIVITY_ID, a.ACTIVITY_NAME, a.NUM_ACTIONS") .append(" ,a.SCORE, a.ACTIVITY_SOLVED, a.QUALIFICATION, a.TOTAL_TIME").append(" FROM ") .append(getTableName("ACTIVITIES", "a")).append(", ").append(getTableName("SESSIONS", "s")) .append(" WHERE a.SESSION_ID=s.SESSION_ID"); if (dFrom != null && dTo != null) sb.append(" AND SESSION_DATETIME>=? AND SESSION_DATETIME<=?"); if (userId != null) sb.append(" AND s.USER_ID=?"); sb.append(getFilteringStringQuery(kcc, true)); if (sessionId != null) sb.append(" AND a.SESSION_ID=?"); if (proj != null && !proj.equals("-1")) sb.append(" AND s.PROJECT_NAME=?"); sb.append(" ORDER BY s.SESSION_DATETIME, a.ACTIVITY_ID"); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement(sb.substring(0)); int n = 1; if (dFrom != null && dTo != null) { stmt.setTimestamp(n++, new Timestamp(dFrom.getTime())); stmt.setTimestamp(n++, new Timestamp(dTo.getTime())); } if (userId != null) stmt.setString(n++, userId); n = updateFiltering(stmt, kcc, n); if (sessionId != null) stmt.setString(n++, sessionId); if (proj != null && !proj.equals("-1")) stmt.setString(n++, proj); ResultSet result = stmt.executeQuery(); while (result.next()) { ActivityData ad = new ActivityData(result.getString("PROJECT_NAME"), result.getString("ACTIVITY_NAME"), result.getString("ACTIVITY_ID"), Math.max(0, result.getInt("TOTAL_TIME")), result.getInt("NUM_ACTIONS"), result.getInt("SCORE"), result.getInt("ACTIVITY_SOLVED") != 0, result.getInt("QUALIFICATION")); v.add(ad); } result.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } return v; } public void updateUser(UserData ud, boolean create) throws Exception { Exception ex = null; boolean result = false; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { String tn = getTableName("USERS"); stmt = cb.getPreparedStatement( create ? "INSERT INTO " + tn + " (USER_NAME,USER_ICON,USER_PWD,USER_ID,GROUP_ID) VALUES (?,?,?,?,?)" : "UPDATE " + tn + " SET USER_NAME=?, USER_ICON=?, USER_PWD=? WHERE USER_ID=?"); stmt.setString(1, StrUtils.limitStrLen(ud.getText(), 80)); if (ud.getIconUrl() != null && ud.getIconUrl().length() == 0) ud.setIconUrl(null); stmt.setString(2, StrUtils.limitStrLen(ud.getIconUrl(), 255)); stmt.setString(3, StrUtils.limitStrLen(ud.pwd, 255)); stmt.setString(4, StrUtils.limitStrLen(ud.getId(), 50)); if (create) stmt.setString(5, ud.groupId); result = stmt.executeUpdate() > 0; } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } if (!result) throw new Exception("SQL \"UPDATE\" statement returns 0"); } public void updateGroup(GroupData gd, boolean create) throws Exception { Exception ex = null; boolean result = false; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { String tn = getTableName("GROUPS"); stmt = cb.getPreparedStatement(create ? "INSERT INTO " + tn + " (GROUP_NAME,GROUP_ICON,GROUP_ID) VALUES (?,?,?)" : "UPDATE " + tn + " SET GROUP_NAME=?, GROUP_ICON=? WHERE GROUP_ID=?"); stmt.setString(1, StrUtils.limitStrLen(gd.getText(), 80)); if (gd.getIconUrl() != null && gd.getIconUrl().length() == 0) gd.setIconUrl(null); stmt.setString(2, StrUtils.limitStrLen(gd.getIconUrl(), 255)); stmt.setString(3, StrUtils.limitStrLen(gd.getId(), 50)); result = stmt.executeUpdate() > 0; } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } if (!result) throw new Exception("SQL \"UPDATE\" statement returns 0"); } public void clearUserReportData(String userId, java.util.Date dFrom, java.util.Date dTo) throws Exception { Exception ex = null; StringBuilder sb = new StringBuilder(300); // Index for GROUP_ID into users. It will be faster with groups, but MySQL // doesn't have foreign keys... sb.append("SELECT SESSION_ID").append(" FROM ").append(getTableName("SESSIONS")).append(" WHERE USER_ID=?"); if (dFrom != null && dTo != null) sb.append(" AND SESSION_DATETIME>=? AND SESSION_DATETIME<=?"); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement(sb.substring(0)); stmt.setString(1, userId); if (dFrom != null && dTo != null) { stmt.setTimestamp(2, new Timestamp(dFrom.getTime())); stmt.setTimestamp(3, new Timestamp(dTo.getTime())); } ResultSet rs = stmt.executeQuery(); while (rs.next()) deleteSession(rs.getString(1)); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } } public void clearGroupReportData(String groupId, java.util.Date dFrom, java.util.Date dTo) throws Exception { Exception ex = null; StringBuilder sb = new StringBuilder(300); sb.append("SELECT SESSION_ID").append(" FROM ").append(getTableName("SESSIONS", "s")).append(", ") .append(getTableName("USERS", "u")).append(" WHERE u.GROUP_ID=?").append(" AND u.USER_ID=s.USER_ID"); if (dFrom != null && dTo != null) sb.append(" AND s.SESSION_DATETIME>=? AND s.SESSION_DATETIME<=?"); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement(sb.substring(0)); stmt.setString(1, groupId); if (dFrom != null && dTo != null) { stmt.setTimestamp(2, new Timestamp(dFrom.getTime())); stmt.setTimestamp(3, new Timestamp(dTo.getTime())); } ResultSet rs = stmt.executeQuery(); while (rs.next()) deleteSession(rs.getString(1)); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } } protected void deleteSession(String sessionId) throws Exception { Exception ex = null; ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb.getPreparedStatement("DELETE FROM " + getTableName("ACTIONS") + " WHERE SESSION_ID=?"); stmt.setString(1, sessionId); stmt.executeUpdate(); cb.closeStatement(stmt); stmt = cb.getPreparedStatement("DELETE FROM " + getTableName("ACTIVITIES") + " WHERE SESSION_ID=?"); stmt.setString(1, sessionId); stmt.executeUpdate(); cb.closeStatement(stmt); stmt = cb.getPreparedStatement("DELETE FROM " + getTableName("SESSIONS") + " WHERE SESSION_ID=?"); stmt.setString(1, sessionId); stmt.executeUpdate(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } } public void deleteUser(String userId) throws Exception { Exception ex = null; clearUserReportData(userId, null, null); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { cb.getConnection().commit(); stmt = cb.getPreparedStatement("DELETE FROM " + getTableName("USERS") + " WHERE USER_ID=?"); stmt.setString(1, userId); stmt.executeUpdate(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } } public void deleteGroup(String groupId) throws Exception { Exception ex = null; clearGroupReportData(groupId, null, null); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { cb.getConnection().commit(); stmt = cb.getPreparedStatement("DELETE FROM " + getTableName("USERS") + " WHERE GROUP_ID=?"); stmt.setString(1, groupId); stmt.executeUpdate(); cb.closeStatement(stmt); cb.getConnection().commit(); stmt = cb.getPreparedStatement("DELETE FROM " + getTableName("GROUPS") + " WHERE GROUP_ID=?"); stmt.setString(1, groupId); stmt.executeUpdate(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw ex; } } } src/report/reportServlets/edu/xtec/jclic/report/ReportUtils.java000066400000000000000000000060111335566474600255220ustar00rootroot00000000000000/* * File : ReportUtils.java * Created : 05-feb-2003 17:17 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; import java.util.StringTokenizer; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public abstract class ReportUtils { public static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd"); // Convert dates of type "yyyy/MM/dd" to Date objects public static Date strToDate(String s) throws Exception { return strToDate(s, false); } public static Date strToDate(String s, boolean atMidnight) throws Exception { GregorianCalendar gc = null; if (s.indexOf('/') > 0 || s.indexOf('-') > 0) { StringTokenizer st = new StringTokenizer(s, "/- "); gc = new GregorianCalendar(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()), atMidnight ? 23 : 0, atMidnight ? 59 : 0, atMidnight ? 59 : 0); } else if (s.length() >= 8) { gc = new GregorianCalendar(Integer.parseInt(s.substring(0, 4)), Integer.parseInt(s.substring(4, 6)) - 1, Integer.parseInt(s.substring(6, 8)), atMidnight ? 23 : 0, atMidnight ? 59 : 0, atMidnight ? 59 : 0); } else throw new Exception("Bad date: " + s); return gc.getTime(); } public static String dateToStr(Date d) throws Exception { return SDF.format(d); } public static final String ALPHANUM_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static final String VALID_URL_CHARS = "-_.!~*'()"; public static String urlEncode(String src, boolean strict, boolean spaces) { if (src == null || src.length() < 1) return src; int len = src.length(); StringBuilder sb = new StringBuilder(src.length() * 2); for (int i = 0; i < len; i++) { char ch = src.charAt(i); if (ALPHANUM_CHARS.indexOf(ch) >= 0 || (!strict && VALID_URL_CHARS.indexOf(ch) >= 0) || (spaces && ch == ' ')) sb.append(ch); else { String s = Integer.toHexString(ch); if (ch < 16) sb.append("%0").append(s); else if (ch > 255) sb.append("%26%23").append(s).append("%3B"); else sb.append("%").append(s); } } return sb.substring(0); } } src/report/reportServlets/edu/xtec/jclic/report/SessionData.java000066400000000000000000000054751335566474600254600ustar00rootroot00000000000000/* * File : SessionData.java * Created : 05-feb-2003 13:09 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class SessionData extends Object implements java.io.Serializable { public String id; public Date date; public String project; public int numActs; public int actsSolved; public int totalPrec; public int totalTime; public int sessionCount; public Set users; public List actData; /** Creates a new instance of SessionData */ public SessionData(String id, String usr, String project, Date date, int numActs, int actsSolved, int totalPrec, int totalTime) { this.id = id != null ? id.trim() : null; users = new HashSet(1); users.add(usr != null ? usr.trim() : null); this.project = project != null ? project.trim() : null; this.date = date; this.numActs = numActs; this.actsSolved = actsSolved; this.totalPrec = totalPrec; this.totalTime = Math.max(0, totalTime); sessionCount = 1; } public void acumula(SessionData d) { actsSolved += d.actsSolved; totalPrec += d.totalPrec; numActs += d.numActs; totalTime += d.totalTime; users.addAll(d.users); if (project != null && !project.equals(d.project)) project = ""; id = ""; sessionCount += d.sessionCount; if (actData == null) actData = d.actData; else if (d.actData != null) actData.addAll(d.actData); } public boolean sameDate(SessionData d) { return date != null && d != null && date.equals(d.date); } public int percentSolved() { return numActs > 0 ? (100 * actsSolved) / numActs : 0; } public int percentPrec() { return numActs > 0 ? totalPrec / numActs : 0; } public String getUsr() { String result = ""; if (users.size() > 1) result = "*"; else { Iterator it = users.iterator(); if (it.hasNext()) result = (String) it.next(); } return result; } } src/report/reportServlets/edu/xtec/jclic/report/rp/000077500000000000000000000000001335566474600230065ustar00rootroot00000000000000src/report/reportServlets/edu/xtec/jclic/report/rp/ActReport.java000066400000000000000000000057631335566474600255670ustar00rootroot00000000000000/* * File : ActReport.java * Created : 12-feb-2003 12:56 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.SessionData; import java.util.List; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class ActReport extends Report { public static String TITLE = "act_report_title"; public static String URL = "actReport"; List activities; List sessionList; public String getTitle(ResourceBundle bundle) { return bundle.getString(TITLE); } public String getUrl() { return URL; } @Override public boolean init() throws Exception { type = PRJ; if (!super.init()) return false; projects = bridge.getProjList(null, dm.dFrom, dm.dTo, kcc); if ((projectName == null || projectName.length() == 0 || projectName.equals(WILDCARD)) && projects != null && projects.size() > 0) { projectName = (String) projects.get(0); activityName = WILDCARD; } activities = bridge.getActList(projectName, dm.dFrom, dm.dTo, kcc); sessionList = getSessionList(); return true; } @Override public void body(java.io.PrintWriter out) throws Exception { super.body(out); StringBuilder sb = new StringBuilder(3000); sb.append("
\n"); zona(sb, "report_project", PROJECT, true, opcioDefecte, vectorToArray(projects, false), projectName, isEditable, 180); zona(sb, "report_activity", ACTIVITY, true, opcioDefecte, vectorToArray(activities, false, WILDCARD, "report_all_activities"), activityName, isEditable, 180); sb.append("
\n"); zonaParams(sb); sb.append("
\n"); zonaData(sb); sb.append("
\n"); sb.append("\n"); sb.append("
\n"); sb.append("

\n"); if (sessionList.isEmpty()) { sb.append(getMsg("report_no_data")).append("\n

\n"); } else { grafic(sb, Img.PROJECT_GRAPH, false, true); sb.append("\n"); grafic(sb, Img.PROJECT_GRAPH, true, true); sb.append("\n

\n"); resumGlobal(sb, sessionList, "tblA", "float: left; margin-right: 10px;"); llistaSessions(sb, sessionList, false, "tblA", null); } out.println(sb.substring(0)); } } src/report/reportServlets/edu/xtec/jclic/report/rp/Basic.java000066400000000000000000000230541335566474600246760ustar00rootroot00000000000000/* * File : Basic.java * Created : 23-jan-2003 17:41 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.*; import edu.xtec.util.CompoundObject; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public abstract class Basic extends ReportsRequestProcessor { // Messages public static final String BUNDLE = "edu.xtec.resources.messages.reportMessages"; public static final String LANG = "lang"; public static final long DEFAULT_SESSION_LIFETIME = 20L; // Parameters public static final String ACTION = "action", PWD = "pwd", RETRY = "retry", ON = "on", MAIN_FORM = "mainForm"; // Authentication cookie public static final String AUTH = "AUTH"; protected static Map localeObjects = new HashMap(); protected static Map sessions = new HashMap(); // Non-static variables protected boolean retry; protected String auth; protected ResourceBundle bundle; protected String[] months; protected DateFormat shortDateFormat, veryShortDateFormat; protected NumberFormat numberFormat; protected String lang; private static String[] F_NUMBERS; public static String[] getFormattedNumbers() { if (F_NUMBERS == null) { java.text.DecimalFormat df = new java.text.DecimalFormat("00"); List v = new ArrayList(100); for (int i = 0; i < 100; i++) v.add(df.format(i)); F_NUMBERS = (String[]) v.toArray(new String[100]); } return F_NUMBERS; } public abstract String getTitle(ResourceBundle bundle); public abstract String getUrl(); public String getMsg(String key) { return filter(bundle.getString(key)); } @Override public boolean init() throws Exception { if (!super.init()) return false; lang = getParam(LANG); if (lang == null || lang.length() != 2) lang = prop.getProperty("language", Locale.getDefault().getLanguage()); else lang = lang.toLowerCase(); Object[] obj = localeObjects.get(lang); if (obj != null) { bundle = (ResourceBundle) obj[0]; months = (String[]) obj[1]; shortDateFormat = (DateFormat) obj[2]; veryShortDateFormat = (DateFormat) obj[3]; numberFormat = (NumberFormat) obj[4]; } else { Locale l = new Locale(lang, ""); bundle = ResourceBundle.getBundle(BUNDLE, l); if (bundle == null) throw new Exception("Internal error!"); months = new String[12]; for (int i = 0; i < 12; i++) months[i] = bundle.getString("month_" + (i + 1)); shortDateFormat = DateFormat.getDateInstance(DateFormat.SHORT, l); veryShortDateFormat = new SimpleDateFormat("dd/MM", l); numberFormat = NumberFormat.getInstance(l); obj = new Object[] { bundle, months, shortDateFormat, veryShortDateFormat, numberFormat }; localeObjects.put(lang, obj); } checkAuth(); if (auth != null) setCookie(AUTH, auth); return auth != null; } protected boolean checkAuth() { auth = getCookie(AUTH); if (auth != null) { Long timeCheck = sessions.get(auth); if (timeCheck != null) { long lifeTime; try { lifeTime = Long.parseLong(prop.getProperty(SESSION_LIFETIME, Long.toString(DEFAULT_SESSION_LIFETIME))); } catch (NumberFormatException ex) { lifeTime = DEFAULT_SESSION_LIFETIME; } lifeTime = Math.max(1, lifeTime); if (timeCheck.longValue() < System.currentTimeMillis() - lifeTime * 60 * 1000) { auth = null; sessions.remove(auth); } else sessions.put(auth, new Long(System.currentTimeMillis())); } else auth = null; } if (auth == null) { boolean ok = false; try { String sPwd = bridge.getProperty("PASSWORD", null); if (sPwd != null && sPwd.length() > 0) { // PASSWORD field exists, Maybe null String sTypedPwd = getParam(PWD); if (sTypedPwd != null && sPwd.equals(edu.xtec.util.Encryption.Encrypt(sTypedPwd))) ok = true; else retry = true; } else ok = true; } catch (Exception ex) { ok = false; } if (ok) { char[] key = new char[12]; for (int i = 0; i < 12; i++) { char k = (char) (Math.random() * 36); if (k < 10) key[i] = (char) ('0' + k); else key[i] = (char) ('A' + k - 10); } auth = new String(key); sessions.put(auth, new Long(System.currentTimeMillis())); } } return auth != null; } @Override public void header(List v) { super.header(v); if (!checkAuth()) { v.add(new String[] { REDIRECT, urlParam(Login.URL, RETRY, retry ? TRUE : FALSE) }); } } @Override public void head(java.io.PrintWriter out) throws Exception { super.head(out); title(bundle.getString("jclic_reports"), getTitle(bundle), out); linkStyle(resourceUrl("basic.css"), resourceUrl("basic_print.css"), out); }; public void standardHeader(java.io.PrintWriter out, String title, String menu) throws Exception { StringBuilder sb = new StringBuilder(300); sb.append("

").append(getMsg("jclic_reports")).append("
").append(title).append("

\n"); sb.append("

").append(menu).append("

"); out.println(sb.substring(0)); } protected boolean getBoolParam(String paramStr, String expectedValue) { boolean result = false; String s = getParam(paramStr); if (s != null && s.length() > 0) { if (expectedValue == null) result = true; else result = expectedValue.toLowerCase().equals(s.trim().toLowerCase()); } return result; } public static String linkTo(String url, String text, String style) { StringBuilder sb = new StringBuilder(url.length() + text.length() + 200); sb.append(""); sb.append(filter(text)); sb.append(""); return sb.substring(0); } public static String buttonAction(String action, String text, String extra) { StringBuilder sb = new StringBuilder(text.length() + 200); sb.append(""); return sb.substring(0); } public static String buttonTo(String url, String text, String extra) { return buttonAction("window.location.href='" + escape(url) + "'", text, extra); } protected static String urlParam(String url, String key, String value) { return urlParamSb(new StringBuilder(url.length() + 100).append(url), key, value, url.indexOf('?') < 0).substring(0); } protected static StringBuilder urlParamSb(StringBuilder sb, String key, String value, boolean first) { if (value != null && value.length() > 0) { sb.append(first ? "?" : "&"); sb.append(key).append("=").append(ReportUtils.urlEncode(value, false, false)); } return sb; } protected int getAction(String[] actions, int defaultAction) { String action = getParam(ACTION); int result = defaultAction; if (action != null) { action = action.trim(); for (int i = 0; i < actions.length; i++) { if (actions[i].equals(action)) { result = i; break; } } } return result; } public String[][] vectorToArray(List v, boolean isCompoundObject) { return vectorToArray(v, isCompoundObject, null, null); } public String[][] vectorToArray(List v, boolean isCompoundObject, String wildCardKey, String wildCardMsg) { String[][] result = null; if (wildCardKey != null || (v != null && v.size() > 0)) { int l = (v != null ? v.size() : 0); result = new String[l + (wildCardKey != null ? 1 : 0)][]; int k = 0; if (wildCardKey != null) { String s = wildCardKey; if (wildCardMsg != null) s = getMsg(wildCardMsg); result[k++] = new String[] { wildCardKey, s }; } if (v != null) { for (int i = 0; i < l; i++) { String sKey, sValue; if (isCompoundObject) { CompoundObject co = (CompoundObject) v.get(i); sKey = co.getId(); sValue = co.getText(); } else { sKey = ((String) v.get(i)).trim(); sValue = sKey; } result[k++] = new String[] { sKey, sValue }; } } } return result; } } src/report/reportServlets/edu/xtec/jclic/report/rp/BasicReport.java000066400000000000000000000100671335566474600260720ustar00rootroot00000000000000/* * File : BasicReport.java * Created : 04-feb-2003 15:12 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.SessionData; import java.io.File; import java.util.ArrayList; import java.util.List; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public abstract class BasicReport extends Basic { public static final int USR = 0, GRP = 1, PRJ = 2, UNKNOWN = -1; public static final String EDIT = "edit", CHANGE = "change", NEW = "new", GROUP = "group", USER = "user", PROJECT = "project", ACTIVITY = "activity", DATE = "date", PID = "pid"; public static final String WILDCARD = "-1"; public static final String[] KCC = { "sessionKey", "sessionCode", "sessionContext" }; public static final File SDIR = new File(System.getProperty("java.io.tmpdir")); protected String groupId; protected String userId; protected String projectName; protected String activityName; protected String[] kcc; protected int type = UNKNOWN; protected String pageId; protected DateManager dm; @Override public boolean init() throws Exception { if (!super.init()) return false; dm = new DateManager(this); userId = getParamNotNull(USER); if (userId.length() > 0 && (int) userId.charAt(0) == 160) userId = userId.replace((char) 160, ' '); groupId = getParamNotNull(GROUP); projectName = getParamNotNull(PROJECT); activityName = getParamNotNull(ACTIVITY); kcc = new String[3]; for (int i = 0; i < KCC.length; i++) kcc[i] = getParam(KCC[i]); pageId = getParam(PID); if (pageId == null || pageId.length() == 0) pageId = Long.toString(100000000L + (long) (Math.random() * 100000000L)); return dm.init(); } protected List getSessionList() throws Exception { List v; switch (type) { case USR: v = bridge.getInfoSessionUser(userId, projectName, dm.dFrom, dm.dTo, kcc, false); break; case GRP: v = bridge.getInfoSessionGroup(groupId, projectName, dm.dFrom, dm.dTo, kcc, true); break; case PRJ: v = bridge.getInfoSessionAct(projectName, activityName, dm.dFrom, dm.dTo, kcc, true); break; default: v = new ArrayList(); } return v; } public String[][] vToArray(List v, String wildCardKey, String wildCardMsg) { String[][] result = null; if (wildCardKey != null || (v != null && v.size() > 0)) { int l = (v != null ? v.size() : 0); result = new String[l + (wildCardKey != null ? 1 : 0)][]; int k = 0; if (wildCardKey != null) { String s = wildCardKey; if (wildCardMsg != null) s = getMsg(wildCardMsg); result[k++] = new String[] { wildCardKey, s }; } if (v != null) { for (String s : v) { s = s.trim(); result[k++] = new String[] { s, s }; } } } return result; } public String[][] vToArray(List v, int keyIndex, int valueIndex) { String[][] result = null; if (v != null && v.size() > 0) { int l = v.size(); result = new String[l][]; for (int i = 0; i < l; i++) { Object[] o = (Object[]) v.get(i); result[i] = new String[2]; result[i][0] = ((String) o[keyIndex]).trim(); result[i][1] = ((String) o[valueIndex]).trim(); } } return result; } } src/report/reportServlets/edu/xtec/jclic/report/rp/DateManager.java000066400000000000000000000123461335566474600260270ustar00rootroot00000000000000/* * File : DateManager.java * Created : 14-feb-2003 16:38 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.ReportUtils; import java.util.Date; import java.util.GregorianCalendar; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class DateManager { public static final String FROM = "from", TO = "to"; protected Date dFrom, dTo, firstDate, today; private GregorianCalendar calendar; protected Basic rp; /** Creates a new instance of DateManager */ public DateManager(Basic rp) { this.rp = rp; } public boolean init() throws Exception { firstDate = Basic.bridge.getMinSessionDate(); today = new Date(); if (firstDate == null || firstDate.compareTo(today) > 0) firstDate = today; dFrom = rp.getDateParam(FROM, firstDate, false); dTo = rp.getDateParam(TO, today, true); if (dFrom.compareTo(dTo) > 0) dFrom = dTo; System.out.println("From: " + dFrom + " To: " + dTo); return true; } public GregorianCalendar getCalendar() { if (calendar == null) calendar = new GregorianCalendar(); return calendar; } public void writeHiddenFields(StringBuilder sb) throws Exception { sb.append("\n"); sb.append("\n"); } public void writeDateScript(StringBuilder sb) { sb.append("\n"); } protected void zonaData(StringBuilder sb, String button) { liniaData(sb, true); liniaData(sb, false); if (button != null) { sb.append("

").append(button).append("

"); } } protected void liniaData(StringBuilder sb, boolean bFrom) { String[] n = Basic.getFormattedNumbers(); String msgKey = bFrom ? "report_from" : "report_to"; String type = bFrom ? "From" : "To"; String ctrlName = Basic.MAIN_FORM + "." + type; String actionStr = "\" onChange=updateDate" + type + "()"; GregorianCalendar c = getCalendar(); c.setTime(firstDate); int firstYear = c.get(GregorianCalendar.YEAR); c.setTime(today); int currentYear = c.get(GregorianCalendar.YEAR); c.setTime(bFrom ? dFrom : dTo); sb.append("

").append(Basic.toNbsp(rp.getMsg(msgKey))).append(" "); sb.append("

\n"); } } src/report/reportServlets/edu/xtec/jclic/report/rp/DbAdmin.java000066400000000000000000000246641335566474600251630ustar00rootroot00000000000000/* * File : DbAdmin.java * Created : 24-jan-2003 12:47 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.Reporter; import edu.xtec.util.db.ConnectionBean; import edu.xtec.util.db.ConnectionBeanProvider; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Map; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public class DbAdmin extends Basic { public static String TITLE = "db_admin_title"; public static String URL = "dbAdmin"; public static final int MENU = 0, EDIT_SETTINGS = 1, UPDATE_SETTINGS = 2, EDIT_PWD = 3, UPDATE_PWD = 4; public static final String[] ACTIONS = { "", "edit", "update", "editPwd", "updatePwd" }; public static final String ALLOW_GROUP_CREATE = "agc", ALLOW_USER_CREATE = "auc", SHOW_GROUP_LIST = "shgl", SHOW_USER_LIST = "shul", USER_TABLES = "ut", TIME_LAP = "lap"; public static final String[] DB_BOOL_KEYS = { Reporter.ALLOW_CREATE_GROUPS, Reporter.ALLOW_CREATE_USERS, Reporter.SHOW_GROUP_LIST, Reporter.SHOW_USER_LIST, Reporter.USER_TABLES }; public static final String[] DB_BOOL_PARAMS = { ALLOW_GROUP_CREATE, ALLOW_USER_CREATE, SHOW_GROUP_LIST, SHOW_USER_LIST, USER_TABLES }; public static final String[] DB_LITERAL_KEYS = { Reporter.TIME_LAP }; public static final String[] DB_LITERAL_PARAMS = { TIME_LAP }; public static final int[] DB_LITERAL_PARAMS_LENGTH = { 4 }; public static final String PW_FIELD = "pw"; protected int page; public String getTitle(ResourceBundle bundle) { return bundle.getString(TITLE); } public String getUrl() { return urlParam(URL, LANG, lang); } public String getUrl(int action) { return urlParam(getUrl(), ACTION, ACTIONS[action]); } @Override public boolean init() throws Exception { if (!super.init()) return false; page = getAction(ACTIONS, MENU); switch (page) { case UPDATE_SETTINGS: updateSettings(); break; case UPDATE_PWD: updatePwd(); break; } return true; } private void updateSettings() throws Exception { Exception ex = null; boolean[] bValues = new boolean[DB_BOOL_PARAMS.length]; for (int i = 0; i < DB_BOOL_PARAMS.length; i++) bValues[i] = getBoolParam(DB_BOOL_PARAMS[i], ON); String[] sValues = new String[DB_LITERAL_PARAMS.length]; for (int i = 0; i < DB_LITERAL_PARAMS.length; i++) sValues[i] = getParam(DB_LITERAL_PARAMS[i]); ConnectionBeanProvider cbp = bridge.getConnectionBeanProvider(); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement updateStmt = null; PreparedStatement insertStmt = null; try { updateStmt = cb.getPreparedStatement( "UPDATE " + bridge.getTableName("SETTINGS") + " SET SETTING_VALUE=? WHERE SETTING_KEY=?"); insertStmt = cb.getPreparedStatement( "INSERT INTO " + bridge.getTableName("SETTINGS") + "(SETTING_KEY,SETTING_VALUE) VALUES(?,?)"); for (int i = 0; i < DB_BOOL_PARAMS.length; i++) { updateItem(DB_BOOL_KEYS[i], bValues[i] ? "true" : "false", updateStmt, insertStmt); } for (int i = 0; i < DB_LITERAL_PARAMS.length; i++) { updateItem(DB_LITERAL_KEYS[i], sValues[i], updateStmt, insertStmt); } } catch (Exception e) { ex = e; } finally { cb.closeStatement(updateStmt); cb.closeStatement(insertStmt); cbp.freeConnectionBean(cb); if (ex != null) throw (ex); } } private void updateItem(String sk, String sv, PreparedStatement updateStmt, PreparedStatement insertStmt) throws Exception { updateStmt.setString(1, sv); updateStmt.setString(2, sk); int iRecords = updateStmt.executeUpdate(); if (iRecords != 1) { if (iRecords == 0) { insertStmt.setString(1, sk); insertStmt.setString(2, sv); iRecords = insertStmt.executeUpdate(); } if (iRecords != 1) throw new Exception(bundle.getString("db_admin_settings_error")); } } private void updatePwd() throws Exception { Exception ex = null; String newPwd = getParam(PW_FIELD); String s = null; ConnectionBeanProvider cbp = bridge.getConnectionBeanProvider(); ConnectionBean cb = cbp.getConnectionBean(); PreparedStatement stmt = null; try { stmt = cb .getPreparedStatement("SELECT count(*) FROM " + bridge.getTableName("SETTINGS") + " WHERE SETTING_KEY=?"); stmt.setString(1, "PASSWORD"); ResultSet rs = stmt.executeQuery(); if (rs.next()) { newPwd = (newPwd != null) ? edu.xtec.util.Encryption.Encrypt(newPwd) : null; int iCount = rs.getInt(1); PreparedStatement stmt2; if (iCount == 0) { // PASSWORD field don't exists stmt2 = cb.getPreparedStatement( "INSERT INTO " + bridge.getTableName("SETTINGS") + " (SETTING_KEY,SETTING_VALUE) VALUES(?,?)"); stmt2.setString(1, "PASSWORD"); stmt2.setString(2, newPwd); } else { stmt2 = cb.getPreparedStatement( "UPDATE " + bridge.getTableName("SETTINGS") + " SET SETTING_VALUE=? WHERE SETTING_KEY=?"); stmt2.setString(1, newPwd); stmt2.setString(2, "PASSWORD"); } stmt2.executeUpdate(); cb.closeStatement(stmt2); } rs.close(); } catch (Exception e) { ex = e; } finally { cb.closeStatement(stmt); cbp.freeConnectionBean(cb); if (ex != null) throw (ex); } } @Override public void head(java.io.PrintWriter out) throws Exception { super.head(out); if (page == EDIT_PWD) { StringBuilder sb = new StringBuilder(500); writeEditPwdScript(sb); out.println(sb.substring(0)); } } @Override public void body(java.io.PrintWriter out) throws Exception { super.body(out); String titleKey = (page == EDIT_SETTINGS ? "db_admin_edit_title" : page == EDIT_PWD ? "db_admin_pw_edit_title" : "db_admin_title"); StringBuilder sb = new StringBuilder(3000); sb.append(linkTo(urlParam(Main.URL, LANG, lang), bundle.getString(Main.TITLE), null)); if (page != MENU) sb.append(" | ").append(linkTo(getUrl(), getTitle(bundle), null)); standardHeader(out, filter(getMsg(titleKey)), sb.substring(0)); sb.setLength(0); switch (page) { case EDIT_SETTINGS: sb.append("
\n"); sb.append("
\n"); writeAdminFields(sb, true); sb.append("

\n"); sb.append("
\n"); sb.append("
\n"); break; case EDIT_PWD: writeEditPwd(sb); break; default: sb.append("
\n"); sb.append("
\n"); writeAdminFields(sb, false); sb.append("

").append(buttonTo(getUrl(EDIT_SETTINGS), bundle.getString("db_admin_edit_btn"), null)); sb.append(" "); sb.append(buttonTo(getUrl(EDIT_PWD), bundle.getString("db_admin_pw_edit_btn"), null)).append("

"); sb.append("
\n"); sb.append("
\n"); } out.println(sb.substring(0)); }; private void writeEditPwdScript(StringBuilder sb) throws Exception { sb.append("\n"); } private void writeEditPwd(StringBuilder sb) throws Exception { sb.append("
\n"); sb.append("
\n"); sb.append("

").append(getMsg("db_admin_pw_newPwd")).append(": "); sb.append("

\n"); sb.append("

").append(getMsg("db_admin_pw_verifyPwd")).append(": "); sb.append("

\n"); sb.append("

\n"); sb.append("

\n"); sb.append("
\n"); } private void writeAdminFields(StringBuilder sb, boolean edit) throws Exception { Map settings = bridge.getProperties(); for (int i = 0; i < DB_BOOL_PARAMS.length; i++) { sb.append("

").append(filter(getMsg("db_admin_param_" + DB_BOOL_PARAMS[i]))); sb.append("

\n"); } for (int i = 0; i < DB_LITERAL_PARAMS.length; i++) { sb.append("

"); sb.append(filter(getMsg("db_admin_param_" + DB_LITERAL_PARAMS[i]))); sb.append(" "); sb.append("

\n"); } } } src/report/reportServlets/edu/xtec/jclic/report/rp/GroupAdmin.java000066400000000000000000000303401335566474600257160ustar00rootroot00000000000000/* * File : GroupAdmin.java * Created : 14-feb-2003 15:53 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.GroupData; import edu.xtec.jclic.report.UserData; import java.util.Iterator; import java.util.List; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class GroupAdmin extends Basic { public static String TITLE = "group_admin_title"; public static String URL = "groupAdmin"; public static final String GROUP = "group", ID = "id", NAME = "name", ICON = "icon"; public static final int MENU = 0, GROUP_MENU = 1, EDIT = 2, EDIT_UPDATE = 3, CREATE = 4, CREATE_UPDATE = 5, DELETE = 6, DELETE_UPDATE = 7, CLEAR = 8, CLEAR_UPDATE = 9, ERR = 10; public static final String[] ACTIONS = { "", "group", "edit", "editUpd", "create", "createUpd", "del", "delUpd", "clear", "clearUpd" }; protected int page; protected DateManager dm; protected List groups; protected List users; protected GroupData gd; protected String returnUrl; public String getTitle(ResourceBundle bundle) { StringBuilder sb = new StringBuilder(200); sb.append(bundle.getString(TITLE)); if (gd != null && gd.getText() != null && gd.getText().length() > 0) sb.append(": ").append(filter(gd.getText())); return sb.substring(0); } public String getUrl() { return urlParam(URL, LANG, lang); } public String getUrl(int action) { StringBuilder sb = new StringBuilder(300); sb.append(URL); urlParamSb(sb, LANG, lang, true); urlParamSb(sb, ACTION, ACTIONS[action], false); if (gd != null) urlParamSb(sb, GROUP, gd.getId(), false); return sb.substring(0); } @Override public boolean init() throws Exception { if (!super.init()) return false; String gId = getParamNotNull(GROUP); if (gId.length() > 0) gd = bridge.getGroupData(gId); page = getAction(ACTIONS, MENU); if (page == CLEAR || page == CLEAR_UPDATE) { dm = new DateManager(this); if (!dm.init()) return false; } switch (page) { case EDIT_UPDATE: edit(); break; case CREATE_UPDATE: create(); break; case DELETE_UPDATE: delete(); break; case CLEAR_UPDATE: clear(); break; } if (page == MENU) groups = bridge.getGroups(); else if (page == GROUP_MENU && gd != null) users = bridge.getUsers(gd.getId()); return true; } protected void edit() throws Exception { returnUrl = getUrl(GROUP_MENU); errMsg = getMsg("db_error") + "
"; String name = getParamNotNull(NAME).trim(); if (name.length() == 0) errMsg = errMsg + getMsg("group_admin_invalid_name"); else { gd.setText(name); gd.setIconUrl(getParamNotNull(ICON).trim()); try { bridge.updateGroup(gd, false); page = GROUP_MENU; } catch (Exception ex) { errMsg = errMsg + ex.getLocalizedMessage(); } } } protected void create() throws Exception { returnUrl = getUrl(MENU); errMsg = getMsg("db_error") + "
"; String name = getParamNotNull(NAME).trim(); String id = getParamNotNull(ID).trim(); String icon = getParamNotNull(ICON).trim(); if (name.length() == 0) errMsg = errMsg + getMsg("group_admin_invalid_name"); else if (id.length() == 0) errMsg = errMsg + getMsg("group_admin_invalid_id"); else { gd = bridge.getGroupData(id); if (gd != null) { returnUrl = urlParam(urlParam(getUrl(CREATE), NAME, name), ICON, icon); errMsg = errMsg + getMsg("group_admin_id_already_exists"); } else { try { gd = new GroupData(id, name, icon, null); bridge.updateGroup(gd, true); page = GROUP_MENU; } catch (Exception ex) { gd = null; errMsg = errMsg + ex.getLocalizedMessage(); } } } } protected void delete() throws Exception { returnUrl = getUrl(GROUP_MENU); try { bridge.deleteGroup(gd.getId()); gd = null; page = MENU; } catch (Exception ex) { returnUrl = getUrl(GROUP_MENU); errMsg = getMsg("db_error") + "
" + ex.getLocalizedMessage(); } } protected void clear() throws Exception { returnUrl = getUrl(GROUP_MENU); try { bridge.clearGroupReportData(gd.getId(), dm.dFrom, dm.dTo); page = GROUP_MENU; } catch (Exception ex) { errMsg = getMsg("db_error") + "
" + ex.getLocalizedMessage(); } } @Override public void head(java.io.PrintWriter out) throws Exception { super.head(out); if (page == CLEAR) { StringBuilder sb = new StringBuilder(200); dm.writeDateScript(sb); out.println(sb.substring(0)); } } @Override public void body(java.io.PrintWriter out) throws Exception { super.body(out); StringBuilder sb = new StringBuilder(2000); StringBuilder sb2 = new StringBuilder(500); Iterator it; boolean flag = false; sb.append(linkTo(urlParam(Main.URL, LANG, lang), bundle.getString(Main.TITLE), null)); if (page != MENU) sb.append(" | ").append(linkTo(getUrl(), getMsg(TITLE), null)); standardHeader(out, filter(getTitle(bundle)), sb.substring(0)); sb.setLength(0); if (gd == null && page != CREATE && page != MENU) { page = ERR; if (errMsg == null) errMsg = getMsg("bad_data"); } switch (page) { case MENU: sb.append("\n"); sb.append("\n"); it = groups.iterator(); while (it.hasNext()) { GroupData gdata = (GroupData) it.next(); String url = urlParam(getUrl(GROUP_MENU), GROUP, gdata.getId()); sb.append("\n"); } sb.append("
").append(getMsg("group_admin_groups")).append("
").append(filter(gdata.getText())); sb.append("
\n"); sb.append("
\n"); sb.append("
"); sb.append(buttonTo(getUrl(CREATE), getMsg("group_admin_new_button"), null)); sb.append("
"); break; case GROUP_MENU: sb.append("
\n"); sb.append("

").append(getMsg("group_admin_id")).append(" ").append(filter(gd.getId())) .append("

\n"); sb.append("

").append(getMsg("group_admin_name")).append(" ").append(filter(gd.getText())) .append("

\n"); sb.append("

").append(getMsg("group_admin_icon")).append(" "); if (gd.getIconUrl() != null && gd.getIconUrl().length() > 0) { sb.append(""); } else sb.append("---"); sb.append("

\n"); sb.append("

"); sb.append(buttonTo(getUrl(EDIT), getMsg("group_admin_edit_button"), null)); sb.append(buttonTo(getUrl(DELETE), getMsg("group_admin_delete_button"), null)); sb.append(buttonTo(getUrl(CLEAR), getMsg("group_admin_clear_button"), null)); sb.append("

\n"); sb.append("\n
\n"); if (users != null && users.size() > 0) { sb.append("\n"); sb.append("\n"); it = users.iterator(); while (it.hasNext()) { UserData ud = (UserData) it.next(); sb2.setLength(0); sb2.append(UserAdmin.URL); urlParamSb(sb2, LANG, lang, true); urlParamSb(sb2, GROUP, gd.getId(), false); urlParamSb(sb2, UserAdmin.USER, ud.getId(), false); sb.append("\n"); } sb.append("
").append(getMsg("group_admin_users")).append("
").append(filter(ud.getText())); sb.append("
\n"); sb.append("
"); } else { sb.append("

").append(getMsg("group_admin_no_users")).append("

\n"); } sb.append("
"); sb2.setLength(0); sb2.append(UserAdmin.URL); urlParamSb(sb2, LANG, lang, true); urlParamSb(sb2, ACTION, UserAdmin.ACTIONS[UserAdmin.CREATE], false); urlParamSb(sb2, GROUP, gd.getId(), false); sb.append(buttonTo(sb2.substring(0), getMsg("group_admin_create_user_button"), null)); sb.append("
\n"); break; case EDIT: flag = true; case CREATE: String id = (gd != null ? gd.getId() : getParamNotNull(ID).trim()); String name = (gd != null ? gd.getText() : getParamNotNull(NAME).trim()); String icon = (gd != null ? gd.getIconUrl() : getParamNotNull(ICON).trim()); sb.append("
\n"); sb.append("

").append(getMsg("group_admin_id")).append(" "); sb.append("

\n"); sb.append("

").append(getMsg("group_admin_name")).append(" "); sb.append("

\n"); sb.append("

").append(getMsg("group_admin_icon")).append(" "); sb.append("

\n"); sb.append("

"); sb.append(buttonTo(getUrl(flag ? GROUP_MENU : MENU), getMsg("cancel"), null)); sb.append("

\n"); sb.append("
\n"); sb.append("
\n"); break; case DELETE: sb.append("

").append(getMsg("group_admin_delete_group")).append(" \"").append(filter(gd.getText())) .append("\"

\n"); sb.append("

").append(getMsg("group_admin_delete_group_explain")).append("

\n"); sb.append("

").append(getMsg("report_areyousure")).append("

\n"); sb.append("
\n"); sb.append("

\n"); sb.append(buttonTo(getUrl(GROUP_MENU), getMsg("NOT"), " width=50")); sb.append("

\n"); sb.append("
\n"); break; case CLEAR: sb.append("

").append(getMsg("group_admin_clear_group")).append(" \"").append(filter(gd.getText())) .append("\"

\n"); sb.append("

").append(getMsg("group_admin_clear_group_explain")).append("

\n"); sb.append("
\n"); dm.writeHiddenFields(sb); sb2.setLength(0); sb2.append("document.").append(MAIN_FORM).append(".submit()"); dm.zonaData(sb, buttonAction(sb2.substring(0), getMsg("db_clear_reports_date"), null)); sb.append("
\n"); sb.append("
\n"); break; default: sb.append("

").append(getMsg("error")).append("

\n"); if (errMsg != null) { sb.append("

").append(errMsg).append("

\n"); } if (returnUrl != null) { sb.append("

").append(getMsg("return")).append("

\n"); } } out.println(sb.substring(0)); }; } src/report/reportServlets/edu/xtec/jclic/report/rp/GroupReport.java000066400000000000000000000055451335566474600261520ustar00rootroot00000000000000/* * File : GroupReport.java * Created : 11-feb-2003 15:33 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.SessionData; import java.util.List; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class GroupReport extends Report { public static String TITLE = "group_report_title"; public static String URL = "groupReport"; List sessionList; public String getTitle(ResourceBundle bundle) { return bundle.getString(TITLE); } public String getUrl() { return URL; } @Override public boolean init() throws Exception { type = GRP; if (!super.init()) return false; projects = bridge.getProjListGrup(groupId, dm.dFrom, dm.dTo, kcc); sessionList = getSessionList(); /* * if(session==null && sessionList!=null && sessionList.size()>0){ session=new * Object[sessionList.size()]; for(int i=0; i\n"); zona(sb, "report_group", GROUP, true, opcioDefecte, vectorToArray(groups, true), groupId, isEditable, 180); zona(sb, "report_project", PROJECT, true, opcioDefecte, vectorToArray(projects, false, WILDCARD, "report_all_projects"), projectName, isEditable, 180); sb.append("\n"); zonaParams(sb); sb.append("
\n"); zonaData(sb); sb.append("
\n"); sb.append("\n"); sb.append("
\n"); sb.append("

\n"); if (sessionList.isEmpty()) { sb.append(getMsg("report_no_data")).append("\n

\n"); } else { grafic(sb, Img.GROUP_GRAPH, false, true); sb.append("\n"); grafic(sb, Img.GROUP_GRAPH, true, true); sb.append("\n

\n"); resumGlobal(sb, sessionList, "tblA", "float: left; margin-right: 10px;"); llistaSessions(sb, sessionList, false, "tblA", null); } out.println(sb.substring(0)); } } src/report/reportServlets/edu/xtec/jclic/report/rp/Img.java000066400000000000000000000417101335566474600243700ustar00rootroot00000000000000/* * File : Img.java * Created : 03-feb-2003 16:46 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import static edu.xtec.servlet.RequestProcessor.CONTENT_TYPE; import edu.xtec.jclic.report.ActivityData; import edu.xtec.jclic.report.SessionData; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Stroke; import java.awt.image.BufferedImage; import java.text.DecimalFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.ResourceBundle; import javax.imageio.ImageIO; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class Img extends BasicReport { public static final String URL = "img"; public static final String TYPE = "type", HEADER = "header", GRAPH = "graph", TEXT = "text", DIST = "dist", WIDTH = "w", HEIGHT = "h"; public static final String USER_GRAPH = "userGraph", GROUP_GRAPH = "groupGraph", PROJECT_GRAPH = "projectGraph"; public static int DEFAULT_WIDTH = 0, DIST_WIDTH, DEFAULT_HEIGHT, DEFAULT_HEADER_HEIGHT, MRG; public static Color BG_COLOR, TEXT_COLOR, BORDER_COLOR, HEADER_BG_COLOR, HEADER_TEXT_COLOR, V1_COLOR, V2_COLOR, DIST_COLOR, ALERT_COLOR; public static Stroke THIN_STROKE, BOLD_STROKE; public static Font STD_FONT, BOLD_FONT, ALERT_FONT; public static int MARGE_X, MARGE_Y, NUM_DIVISIONS_Y, MAX_COLS; public static int M_X_DIST, M_Y_DIST; boolean withHeader, isDist; int width, height; String titleKey; static { if (DEFAULT_WIDTH == 0) { try { loadSettings(null); } catch (Exception ex) { } } } public Img() throws Exception { super(); } public String getTitle(ResourceBundle bundle) { return ""; } public String getUrl() { return URL; } @Override public boolean noCache() { return false; } public static void loadSettings(String file) throws Exception { loadProperties(file); DEFAULT_WIDTH = Integer.parseInt(prop.getProperty(GRAPH_WIDTH, "440")); DIST_WIDTH = Integer.parseInt(prop.getProperty(GRAPH_DIST_WIDTH, "192")); DEFAULT_HEIGHT = Integer.parseInt(prop.getProperty(GRAPH_HEIGHT, "155")); DEFAULT_HEADER_HEIGHT = Integer.parseInt(prop.getProperty(GRAPH_HEADER_HEIGHT, "25")); MRG = Integer.parseInt(prop.getProperty(GRAPH_MARGIN, "8")); BG_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_BG, "008080"), 16)); TEXT_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_TEXT, "FFFFFF"), 16)); HEADER_BG_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_HEADER_BG, "008080"), 16)); HEADER_TEXT_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_HEADER_TEXT, "FFFFFF"), 16)); BORDER_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_BORDER, "000000"), 16)); V1_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_V1, "00FF00"), 16)); V2_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_V2, "0000FF"), 16)); DIST_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_DIST, "0000FF"), 16)); ALERT_COLOR = new Color(Integer.parseInt(prop.getProperty(GRAPH_COLOR_ALERT, "FF0000"), 16)); BOLD_STROKE = new BasicStroke(Float.parseFloat(prop.getProperty(GRAPH_STROKE_WIDTH, "3.0"))); THIN_STROKE = new BasicStroke(1.0f); try { String fontFamily = prop.getProperty(GRAPH_FONT_FAMILY, "Dialog"); int fontSize = Integer.parseInt(prop.getProperty(GRAPH_FONT_SIZE, "11")); STD_FONT = new Font(fontFamily, Font.PLAIN, fontSize); BOLD_FONT = new Font(fontFamily, Font.BOLD, fontSize); ALERT_FONT = new Font(fontFamily, Font.BOLD, 24); } catch (Exception ex) { // no fonts!!! } MARGE_X = Integer.parseInt(prop.getProperty(GRAPH_MARGIN_X, "50")); MARGE_Y = Integer.parseInt(prop.getProperty(GRAPH_MARGIN_Y, "20")); NUM_DIVISIONS_Y = Integer.parseInt(prop.getProperty(GRAPH_DIV_Y, "4")); MAX_COLS = Integer.parseInt(prop.getProperty(GRAPH_MAX_COLS, "10")); M_X_DIST = Integer.parseInt(prop.getProperty(GRAPH_MARGIN_DIST_X, "15")); M_Y_DIST = Integer.parseInt(prop.getProperty(GRAPH_MARGIN_DIST_Y, "20")); } @Override public boolean init() throws Exception { if (!super.init()) return false; withHeader = getBoolParam(HEADER, TRUE); isDist = getBoolParam(DIST, TRUE); type = UNKNOWN; String s = getParam(TYPE); if (USER_GRAPH.equals(s)) { type = USR; titleKey = "report_user_evolution"; } else if (GROUP_GRAPH.equals(s)) { type = GRP; titleKey = "report_group_evolution"; } else if (PROJECT_GRAPH.equals(s)) { type = PRJ; titleKey = "report_project_evolution"; } else { type = UNKNOWN; errCode = HTTP_BAD_REQUEST; throw new Exception(); } if (isDist) titleKey = "report_result_distribution"; width = getIntParam(WIDTH, isDist ? DIST_WIDTH : DEFAULT_WIDTH); height = getIntParam(HEIGHT, DEFAULT_HEIGHT); if (width <= 0 || height <= 0) { System.err.println("EP!!"); } return true; }; @Override public void header(List v) { v.add(new String[] { CONTENT_TYPE, "image/png" }); } @Override public boolean usesWriter() { return false; } @Override public void process(java.io.OutputStream out) throws Exception { BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = (Graphics2D) bi.getGraphics(); int h = withHeader ? DEFAULT_HEADER_HEIGHT : 0; Rectangle allRect = new Rectangle(0, 0, width, height); Rectangle hr = new Rectangle(0, 0, width, h); Rectangle gr = new Rectangle(0, h, width, height - h); g2.setColor(BG_COLOR); g2.fill(allRect); if (withHeader) { g2.setColor(HEADER_BG_COLOR); g2.fill(hr); } g2.setColor(BORDER_COLOR); g2.draw(new Rectangle(0, 0, width - 1, height - 1)); if (withHeader) { drawHeader(g2, hr); g2.setColor(BORDER_COLOR); g2.drawLine(0, h, width, h); } if (isDist) dibuixaDistribucio(g2, getSessionList(), gr); else dibuixaImatge(g2, getSessionList(), gr); g2.dispose(); ImageIO.write(bi, "png", out); } protected void drawHeader(Graphics2D g2, Rectangle box) throws Exception { FontMetrics fm = g2.getFontMetrics(STD_FONT); int fh = fm.getHeight(); int rs = fh / 2; int dy = (box.height - fh) / 2; int dyr = (box.height - rs) / 2; if (!isDist) { String var1 = bundle.getString("report_global_precision"); String var2 = bundle.getString("report_solved_activities"); int lvar1 = fm.stringWidth(var1); int lvar2 = fm.stringWidth(var2); Rectangle r1 = new Rectangle(box.x + box.width - MRG - lvar2 - 6 - rs - 2 * MRG - lvar1 - 6 - fh, box.y + dyr, rs, rs); Rectangle r2 = new Rectangle(box.x + box.width - MRG - lvar2 - 6 - rs, box.y + dyr, rs, rs); g2.setColor(V1_COLOR); g2.fill(r1); g2.setColor(V2_COLOR); g2.fill(r2); g2.setColor(BORDER_COLOR); g2.draw(r1); g2.draw(r2); g2.setFont(STD_FONT); g2.setColor(HEADER_TEXT_COLOR); g2.drawString(var1, box.x + r1.x + rs + 6, box.y + dy + fm.getAscent()); g2.drawString(var2, box.x + r2.x + rs + 6, box.y + dy + fm.getAscent()); } g2.setColor(HEADER_TEXT_COLOR); g2.setFont(BOLD_FONT); g2.drawString(bundle.getString(titleKey), box.x + MRG, box.y + dy + fm.getAscent()); } public void dibuixaImatge(Graphics2D g2, List v, Rectangle box) throws Exception { g2.setColor(TEXT_COLOR); g2.setStroke(THIN_STROKE); int gWidth = box.width - (2 * MARGE_X); int gHeight = box.height - (2 * MARGE_Y); g2.drawRect(box.x + MARGE_X, box.y + MARGE_Y, gWidth, gHeight); if (v.size() > 0) { float lDivY = gHeight / NUM_DIVISIONS_Y; for (int i = 1; i < NUM_DIVISIONS_Y; i++) { // Posem les linies horitzontals int y = (int) (MARGE_Y + (i * lDivY)); g2.drawLine(box.x + MARGE_X, box.y + y, box.x + MARGE_X + gWidth, box.y + y); } g2.setFont(STD_FONT); FontMetrics fm = g2.getFontMetrics(); for (int i = 0; i <= NUM_DIVISIONS_Y; i++) { // Posem els valors horitzontals en % String num = Integer.toString((100 - (i * (100 / NUM_DIVISIONS_Y)))); int l = fm.stringWidth(num); g2.drawString(num, box.x + MARGE_X - 5 - l, box.y + MARGE_Y + (int) (lDivY * i) + 3); } int numArgs = v.size(); if (numArgs == 1) { // Hem de replicar el punt v.add(v.get(0)); numArgs++; } int columnesArgs = numArgs - 1; int numColumnesX = Math.min(MAX_COLS, columnesArgs); // nombre de columnes que s'acabara mostrant. float longColumnaX = gWidth / numColumnesX; // longitud horitzontal de cadascuna de les columnes float increment = (float) columnesArgs / (float) numColumnesX; int[] puntsDePas = new int[numColumnesX + 2]; int i = 0; for (float f = 0.0f; f <= columnesArgs + 1; f += increment) puntsDePas[i++] = Math.round(f); int[] abscises = new int[numArgs]; int j = 0; // j indicara quantes columnes completes hem fet for (int k = 0; k <= columnesArgs; k++) { if (puntsDePas[j] == k) { // mostrem punt i columna abscises[k] = (int) (MARGE_X + (j++ * longColumnaX)); } else { int properPunt = puntsDePas[j]; int anteriorPunt = puntsDePas[j - 1]; float x = (k - anteriorPunt) * (longColumnaX / (properPunt - anteriorPunt)); abscises[k] = (int) (MARGE_X + ((j - 1) * longColumnaX) + x); } } j = 0; Date dataFinal = null; boolean validat = true; // De moment mostrem les dades, quan trobem una a la que no te acces pararem. for (i = 0; i < columnesArgs && validat; i++) { SessionData sd1 = v.get(i); SessionData sd2 = v.get(i + 1); if (puntsDePas[j] == i) { // mostrem punt i columna g2.setColor(TEXT_COLOR); g2.setStroke(THIN_STROKE); g2.drawLine(box.x + abscises[i], box.y + MARGE_Y, box.x + abscises[i], box.y + MARGE_Y + gHeight); } g2.setStroke(BOLD_STROKE); g2.setColor(V2_COLOR); g2.drawLine(box.x + abscises[i], (int) (box.y + MARGE_Y + gHeight - ((sd1.percentSolved() * gHeight) / 100)), box.x + abscises[i + 1], (int) (box.y + MARGE_Y + gHeight - ((sd2.percentSolved() * gHeight) / 100))); g2.setColor(V1_COLOR); g2.drawLine(box.x + abscises[i], (int) (box.y + MARGE_Y + gHeight - ((sd1.percentPrec() * gHeight) / 100)), box.x + abscises[i + 1], (int) (box.y + MARGE_Y + gHeight - ((sd2.percentPrec() * gHeight) / 100))); if (puntsDePas[j] == i) { // mostrem punt i columna g2.setColor(TEXT_COLOR); g2.drawString(veryShortDateFormat.format(sd1.date), box.x + abscises[i], box.y + MARGE_Y + gHeight + 15); j++; } dataFinal = sd2.date; } g2.setColor(TEXT_COLOR); g2.drawString(veryShortDateFormat.format(dataFinal), box.x + abscises[i], box.y + MARGE_Y + gHeight + 15); } else { String noDades = bundle.getString("report_no_data"); g2.setColor(ALERT_COLOR); g2.setFont(ALERT_FONT); Rectangle r = ALERT_FONT.getStringBounds(noDades, g2.getFontRenderContext()).getBounds(); g2.drawString(noDades, box.x + MARGE_X + (gWidth - r.width) / 2, box.y + MARGE_Y + gHeight / 2 + r.height / 4); } } public static final int N_DIST_ELEMENTS = 5; public void dibuixaDistribucio(Graphics2D g2, List v, Rectangle box) { int[] dist = new int[N_DIST_ELEMENTS]; Iterator it = v.iterator(); int vc = 100 / N_DIST_ELEMENTS; while (it.hasNext()) { SessionData sd = (SessionData) it.next(); if (sd.actData != null && sd.actData.size() > 0) { Iterator it2 = sd.actData.iterator(); while (it.hasNext()) { ActivityData ad = (ActivityData) it.next(); dist[Math.min(99, ad.qualification) / vc]++; } } else { dist[Math.min(99, sd.percentPrec()) / vc] += sd.numActs; } } int leftMargin = M_X_DIST; int topMargin = M_Y_DIST; g2.setColor(TEXT_COLOR); g2.setStroke(THIN_STROKE); g2.setFont(STD_FONT); float max = 0.0f, maxOrdenades = 0.0f, maxDivisio = 0.0f; boolean data = false; for (int i = 0; i < dist.length && data == false; i++) data = (dist[i] > 0); if (data) { max = dist[0]; for (int i = 1; i < dist.length; i++) max = Math.max(max, dist[i]); maxOrdenades = getMaximOrdenades(max, false); maxDivisio = getMaximOrdenades(max, true); String sNum = formatNumber(maxDivisio); leftMargin += g2.getFontMetrics().stringWidth(sNum); } int gWidth = box.width - leftMargin - 10; // 10 pixels de marge per la dreta int gHeight = box.height - (2 * topMargin); g2.drawRect(box.x + leftMargin, box.y + topMargin, gWidth, gHeight); if (data) { int numDivisionsY = 0; for (float f = max; f > 0.01; f -= maxDivisio) numDivisionsY++; if (numDivisionsY > 0) { float longdivisioY = gHeight / numDivisionsY; for (int i = 1; i < numDivisionsY; i++) { // Posem les linies horitzontals g2.drawLine(box.x + leftMargin, box.y + topMargin + (int) (i * longdivisioY), box.x + leftMargin + gWidth, box.y + topMargin + (int) (i * longdivisioY)); } for (int i = 0; i <= numDivisionsY; i++) { // Posem els valors horitzontals en % float num = (maxDivisio * numDivisionsY) - (i * maxDivisio); String sNum = formatNumber(num); g2.drawString(sNum, box.x + leftMargin - 5 - (g2.getFontMetrics().stringWidth(sNum)), box.y + topMargin + (int) (longdivisioY * i) + 3); } } float longColumnaX = gWidth / N_DIST_ELEMENTS; // longitud horitzontal de cadascuna de les columnes for (int i = 0; i < N_DIST_ELEMENTS; i++) { g2.setColor(TEXT_COLOR); g2.setStroke(THIN_STROKE); g2.drawLine(box.x + leftMargin + (int) (i * longColumnaX), box.y + topMargin, box.x + leftMargin + (int) (i * longColumnaX), box.y + topMargin + gHeight); StringBuilder sb = new StringBuilder(Integer.toString(i * 20)); sb.append("%"); g2.drawString(sb.substring(0), box.x + leftMargin + (int) (i * longColumnaX), box.y + topMargin + gHeight + 15); g2.setColor(DIST_COLOR); int alt = ((dist[i] * 100 / (int) (maxDivisio * numDivisionsY) * gHeight) - 1) / 100; int ample = (i == (N_DIST_ELEMENTS - 1)) ? (int) (gWidth - (longColumnaX * i) - 1) : (int) (longColumnaX - 1); g2.fillRect(box.x + leftMargin + (int) (i * longColumnaX) + 1, box.y + topMargin + gHeight - alt, ample, alt); } } else { String noDades = bundle.getString("report_no_data"); g2.setColor(ALERT_COLOR); g2.setFont(STD_FONT); Rectangle r = STD_FONT.getStringBounds(noDades, g2.getFontRenderContext()).getBounds(); g2.drawString(noDades, box.x + leftMargin + (gWidth - r.width) / 2, box.y + topMargin + gHeight / 2 + r.height / 4); } } public static float getMaximOrdenades(float maxim, boolean divisio) { float f = maxim * 100; if (divisio) f /= 6; int i = (int) f; // enter entre 0 i 9 de mes a l'esquerra de f. int xifresTretes = 0; while (i > 9) { i = (int) f; f = f / 10; xifresTretes++; } if (i == 1) i = 2; else if (i > 1 && i < 5) i = 5; else i = 10; for (int k = 1; k < xifresTretes; k++) i *= 10; return ((float) i) / 100; } private static DecimalFormat DF = null; protected static String formatNumber(float n) { if (DF == null) { DF = new DecimalFormat(); DF.setMaximumFractionDigits(1); DF.setGroupingUsed(false); } return DF.format(n); } } src/report/reportServlets/edu/xtec/jclic/report/rp/JClicReportService.java000066400000000000000000000145471335566474600273650ustar00rootroot00000000000000/* * File : JClicReportService.java * Created : 26-mar-2003 16:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.ActionReg; import edu.xtec.jclic.report.ActivityReg; import edu.xtec.jclic.report.BasicJDBCBridge; import edu.xtec.jclic.report.GroupData; import edu.xtec.jclic.report.ReportServerEventMaker; import edu.xtec.jclic.report.TCPReportBean; import edu.xtec.jclic.report.UserData; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.io.InputStream; import java.util.List; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) @version(13.09.17) */ public class JClicReportService extends ReportsRequestProcessor { TCPReportBean request = null, response = null; public static ReportServerEventMaker eventMaker = new ReportServerEventMaker(); boolean trustClientDateTime = false; @Override public boolean init() throws Exception { if (!super.init()) return false; InputStream is = getInputStream(); if (is != null) { if (prop != null) { trustClientDateTime = "true".equalsIgnoreCase((String) prop.get(BasicJDBCBridge.TRUST_CLIENT_DATETIME)); } org.jdom.Document doc = JDomUtility.getSAXBuilder().build(is); request = new TCPReportBean(doc.getRootElement()); response = processRequest(request); } else response = new TCPReportBean(); return true; } @Override public boolean usesWriter() { return false; } @Override public boolean wantsInputStream() { return true; } @Override public void process(java.io.OutputStream out) throws Exception { JDomUtility.saveDocument(out, response.getJDomElement()); }; @Override public void header(List v) { super.header(v); v.add(new String[] { CONTENT_TYPE, "text/xml" }); // 8-Jun-16: Added support for Cross-Domain requests // 12-Jun-16: Support also Preflight requests sent via OPTIONS method // TODO: Allow to set specific values for CORS v.add(new String[] { EXTRA, "Access-Control-Allow-Origin", "*" }); v.add(new String[] { EXTRA, "Access-Control-Allow-Methods", "POST, OPTIONS" }); v.add(new String[] { EXTRA, "Access-Control-Allow-Headers", "Content-Type" }); v.add(new String[] { EXTRA, "Access-Control-Allow-Max-Age", "1728000" }); } private TCPReportBean processRequest(TCPReportBean bean) throws Exception { TCPReportBean result = new TCPReportBean(TCPReportBean.ERROR); String id = bean.getId(); if (TCPReportBean.MULTIPLE.equals(id)) { Domable[] beans = bean.getData(); for (int i = 0; i < beans.length; i++) result = processRequest((TCPReportBean) beans[i]); } else if (TCPReportBean.ADD_SESSION.equals(id)) { String sessionId = bridge.addSession(bean.getParam(TCPReportBean.USER), trustClientDateTime ? Long.parseLong(bean.getParam(TCPReportBean.TIME)) : System.currentTimeMillis(), bean.getParam(TCPReportBean.PROJECT), bean.getParam(TCPReportBean.CODE), bean.getParam(TCPReportBean.KEY), bean.getParam(TCPReportBean.CONTEXT)); result.setParam(TCPReportBean.SESSION, sessionId); result.setId(TCPReportBean.ADD_SESSION); } else if (TCPReportBean.ADD_ACTIVITY.equals(id)) { ActivityReg ar = (ActivityReg) bean.getSingleData(); int actId = Integer.parseInt(bean.getParam(TCPReportBean.NUM)); String sessionId = bean.getParam(TCPReportBean.SESSION); int actIdR = bridge.addActivity(actId, sessionId, ar); ActionReg actReg; for (int arc = 0; (actReg = ar.getActionReg(arc)) != null; arc++) bridge.addAction(actId, sessionId, arc, actReg); result.setParam(TCPReportBean.ACTIVITY, Integer.toString(actIdR)); result.setId(TCPReportBean.ADD_ACTIVITY); } else if (TCPReportBean.NEW_GROUP.equals(id)) { String groupId = bridge.newGroup((GroupData) bean.getSingleData()); result.setParam(TCPReportBean.GROUP, groupId); result.setId(TCPReportBean.NEW_GROUP); } else if (TCPReportBean.NEW_USER.equals(id)) { String userId = bridge.newUser((UserData) bean.getSingleData()); result.setParam(TCPReportBean.USER, userId); result.setId(TCPReportBean.NEW_USER); } else if (TCPReportBean.GET_USER_DATA.equals(id)) { result.setData(bridge.getUserData(bean.getParam(TCPReportBean.USER))); result.setId(TCPReportBean.GET_USER_DATA); } else if (TCPReportBean.GET_GROUP_DATA.equals(id)) { result.setData(bridge.getGroupData(bean.getParam(TCPReportBean.GROUP))); result.setId(TCPReportBean.GET_GROUP_DATA); } else if (TCPReportBean.GET_PROPERTY.equals(id)) { String k = bean.getParam(TCPReportBean.KEY); String dv = bean.getParam(TCPReportBean.DEFAULT); result.setParam(TCPReportBean.RESULT, bridge.getProperty(k, dv)); result.setId(TCPReportBean.GET_PROPERTY); } else if (TCPReportBean.GET_PROPERTIES.equals(id)) { Map map = bridge.getProperties(); for (String key : map.keySet()) { result.setParam(key, map.get(key)); } result.setId(TCPReportBean.GET_PROPERTIES); } else if (TCPReportBean.GET_GROUPS.equals(id)) { List v = bridge.getGroups(); result.setData((GroupData[]) v.toArray(new GroupData[v.size()])); result.setId(TCPReportBean.GET_GROUPS); } else if (TCPReportBean.GET_USERS.equals(id)) { List v = bridge.getUsers(bean.getParam(TCPReportBean.GROUP)); result.setData((UserData[]) v.toArray(new UserData[v.size()])); result.setId(TCPReportBean.GET_USERS); } else { result.setParam(TCPReportBean.ERROR, "unknown command"); } eventMaker.fireReportServerSystemEvent(id); return result; } } src/report/reportServlets/edu/xtec/jclic/report/rp/Login.java000066400000000000000000000043341335566474600247250ustar00rootroot00000000000000/* * File : Login.java * Created : 23-jan-2003 12:36 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class Login extends Basic { public static String TITLE = "login_title"; public static String URL = "login"; public Login() { super(); } public String getTitle(ResourceBundle bundle) { return bundle.getString(TITLE); } public String getUrl() { return URL; } @Override protected boolean checkAuth() { return true; } @Override public void body(java.io.PrintWriter out) throws Exception { super.body(out); standardHeader(out, getMsg("login_title"), ""); StringBuilder sb = new StringBuilder(2000); if (TRUE.equals(getParam(RETRY))) sb.append("

").append(getMsg("login_incorrect")).append("

\n"); sb.append("

").append(getMsg("login_desc")).append("

\n"); sb.append("
\n"); sb.append("\n"); sb.append("

") .append(getMsg("login_pwd")) .append("

\n"); sb.append("

\n"); sb.append("
"); out.println(sb.substring(0)); }; } src/report/reportServlets/edu/xtec/jclic/report/rp/Main.java000066400000000000000000000046341335566474600245440ustar00rootroot00000000000000/* * File : Main.java * Created : 23-jan-2003 11:43 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class Main extends Basic { public static String TITLE = "main_title"; public static String URL = "main"; public String getTitle(ResourceBundle bundle) { return bundle.getString(TITLE); } public String getUrl() { return URL; } @Override public void body(java.io.PrintWriter out) throws Exception { super.body(out); standardHeader(out, getMsg("main_title"), ""); StringBuilder sb = new StringBuilder(3000); sb.append("
    \n"); if (bridge.hasUserTables()) { sb.append("
  • ") .append(linkTo(urlParam(GroupAdmin.URL, LANG, lang), bundle.getString(GroupAdmin.TITLE), null)) .append("
  • \n"); sb.append("
  • ") .append(linkTo(urlParam(GroupReport.URL, LANG, lang), bundle.getString(GroupReport.TITLE), null)) .append("
  • \n"); sb.append("
  • ") .append(linkTo(urlParam(UserReport.URL, LANG, lang), bundle.getString(UserReport.TITLE), null)) .append("
  • \n"); } sb.append("
  • ").append(linkTo(urlParam(ActReport.URL, LANG, lang), bundle.getString(ActReport.TITLE), null)) .append("
  • \n"); sb.append("
  • ").append(linkTo(urlParam(DbAdmin.URL, LANG, lang), bundle.getString(DbAdmin.TITLE), null)) .append("
  • \n"); sb.append("
"); out.println(sb.substring(0)); }; } src/report/reportServlets/edu/xtec/jclic/report/rp/Report.java000066400000000000000000000422571335566474600251360ustar00rootroot00000000000000/* * File : Report.java * Created : 25-jan-2003 18:52 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.ActivityData; import edu.xtec.jclic.report.GroupData; import edu.xtec.jclic.report.ReportUtils; import edu.xtec.jclic.report.SessionData; import edu.xtec.jclic.report.UserData; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public abstract class Report extends BasicReport { public static final int DEFAULT_SELECT_WIDTH = 180; public static final String SESSION = "session"; protected boolean isEditable = true; protected boolean userTables = true; protected String change; protected String opcioDefecte; protected Object[] session; protected List groups; protected List users; protected List projects; @Override public boolean init() throws Exception { if (!super.init()) return false; isEditable = !(FALSE.equalsIgnoreCase(getParamNotNull(EDIT))); userTables = bridge.hasUserTables(); if (userTables) { groups = bridge.getGroups(); if (groupId.length() > 0) users = bridge.getUsers(groupId); } session = getParams(SESSION); change = getParam(CHANGE); switch (GROUP.equals(change) ? 0 : USER.equals(change) ? 1 : DATE.equals(change) ? 2 : PROJECT.equals(change) ? 3 : ACTIVITY.equals(change) ? 4 : 5) { case 0: if (users != null && users.size() > 0) userId = ((UserData) users.get(0)).getId(); else userId = ""; case 1: projectName = WILDCARD; case 2: case 3: session = null; activityName = WILDCARD; case 4: default: break; } return true; } @Override public void head(java.io.PrintWriter out) throws Exception { super.head(out); StringBuilder sb = new StringBuilder(300); writeGoScript(sb); dm.writeDateScript(sb); out.println(sb.substring(0)); } @Override public void body(java.io.PrintWriter out) throws Exception { super.body(out); StringBuilder sb = new StringBuilder(2000); if (isEditable) sb.append(linkTo(urlParam(Main.URL, LANG, lang), bundle.getString(Main.TITLE), null)); standardHeader(out, filter(getTitle(bundle)), sb.substring(0)); sb.setLength(0); sb.append("
\n"); sb.append("\n"); sb.append("\n"); dm.writeHiddenFields(sb); if (session != null) { for (int i = 0; i <= session.length; i++) { sb.append("\n"); } } if (!isEditable) sb.append("\n"); out.println(sb.substring(0)); } protected void writeGoScript(StringBuilder sb) { sb.append("\n"); } protected void writeSessionScript(StringBuilder sb) { sb.append("\n"); } protected void llista(StringBuilder sb, String selectName, boolean submitOnChange, String defaultOption, String[][] values, String selectedValue, int width) { /* * Mostra una llista desplegable (objecte SELECT) amb opcions */ sb.append("\n"); } protected void zona(StringBuilder sb, String descKey, String selectName, boolean submitOnChange, String defaultOption, String[][] values, String selectedValue, boolean showList, int width) { sb.append("

").append(filter(getMsg(descKey))).append(" "); if (showList && values != null) llista(sb, selectName, submitOnChange, defaultOption, values, selectedValue, width); else { sb.append("\n"); if (selectedValue != null && values != null) { for (int i = 0; i < values.length; i++) { if (selectedValue.equals(values[i][0])) { sb.append(filter(values[i][1])).append("\n"); break; } } } } sb.append("

\n"); } protected void zonaData(StringBuilder sb) { StringBuilder sb2 = new StringBuilder(100); sb2.append("go('").append(DATE).append("')"); dm.zonaData(sb, buttonAction(sb2.substring(0), getMsg("submit"), null)); } public static final String[] KCC_LABELS = { "report_key", "report_code", "report_context" }; protected void zonaParams(StringBuilder sb) { sb.append("
\n"); for (int i = 0; i < KCC.length; i++) { sb.append("

"); if (isEditable) sb.append(filter(getMsg(KCC_LABELS[i]))).append(" "); sb.append("

\n"); } sb.append("
\n"); } protected void grafic(StringBuilder sb, String type, boolean dist, boolean withHeader) throws Exception { int w = dist ? Img.DIST_WIDTH : Img.DEFAULT_WIDTH; int h = Img.DEFAULT_HEIGHT + Img.DEFAULT_HEADER_HEIGHT; StringBuilder urlG = new StringBuilder(300); urlG.append(Img.URL); urlParamSb(urlG, Img.TYPE, type, true); if (dist) urlParamSb(urlG, Img.DIST, TRUE, false); if (withHeader) urlParamSb(urlG, Img.HEADER, TRUE, false); urlParamSb(urlG, Img.WIDTH, Integer.toString(w), false); urlParamSb(urlG, Img.HEIGHT, Integer.toString(h), false); urlParamSb(urlG, PID, pageId, false); urlParamSb(urlG, USER, userId, false); urlParamSb(urlG, GROUP, groupId, false); if (projectName.length() > 0 && !projectName.equals(WILDCARD)) urlParamSb(urlG, PROJECT, projectName, false); if (activityName.length() > 0 && !activityName.equals(WILDCARD)) urlParamSb(urlG, ACTIVITY, activityName, false); for (int i = 0; i < KCC.length; i++) urlParamSb(urlG, KCC[i], kcc[i], false); urlParamSb(urlG, DateManager.FROM, ReportUtils.dateToStr(dm.dFrom), false); urlParamSb(urlG, DateManager.TO, ReportUtils.dateToStr(dm.dTo), false); sb.append(""); } protected void llistaSessions(StringBuilder sb, List v, boolean expandable, String className, String style) throws Exception { int n = 0; sb.append("\n"); sb.append(""); sb.append("\n"); n++; if (type == PRJ || type == GRP) { sb.append("\n"); sb.append("\n"); n += 2; } if (type == USR) { sb.append("\n"); n += 2; } sb.append("\n"); sb.append("\n"); sb.append("\n"); sb.append("\n"); n += 4; sb.append("\n"); StringBuilder sb2 = new StringBuilder(500); StringBuilder sb3 = new StringBuilder(100); int numSess = 0; Iterator it = v.iterator(); while (it.hasNext()) { SessionData sd = it.next(); sb.append("\n"); sb2.setLength(0); boolean link = expandable && sd.id != null && sd.id.length() > 0; boolean status = link && sd.actData != null; if (expandable) { if (link) { sb2.append(""); sb2.append("\"");"); sb2.append(" "); } else sb2.append("  "); } sb2.append(shortDateFormat.format(sd.date)); sb3.setLength(0); if (status) sb3.append(" valign=\"top\" rowspan=\"").append(sd.actData.size() + 2).append("\""); sb.append("\n"); if (type == GRP || type == PRJ) { String s = sd.getUsr(); if ("*".equals(s)) { sb2.setLength(0); sb2.append("(").append(numberFormat.format(sd.users.size())).append(" ") .append(bundle.getString("report_n_users")).append(")"); s = sb2.substring(0); } sb.append("\n"); sb.append("\n"); } if (type == USR) { sb.append("\n"); } sb.append("\n"); sb.append("\n"); sb.append("\n"); sb.append("\n"); sb.append("\n"); if (status) { llistaActivitats(sb, sd.actData); } numSess++; } sb.append("
").append(toNbsp(getMsg("report_header_date"))).append("").append(toNbsp(getMsg("report_header_user"))).append("").append(toNbsp(getMsg("report_header_sessions"))).append("").append(toNbsp(getMsg("report_header_project"))).append("").append(toNbsp(getMsg("report_header_numActs"))).append("").append(toNbsp(getMsg("report_header_actsSolved"))).append("").append(toNbsp(getMsg("report_header_time"))).append("").append(toNbsp(getMsg("report_header_prec"))).append("
").append(sb2.substring(0)).append("").append(filter(s)).append("").append(numberFormat.format(sd.sessionCount)).append("").append(filter(sd.project)).append("").append(numberFormat.format(sd.numActs)).append("").append(numberFormat.format(sd.actsSolved)).append(" (") .append(numberFormat.format(sd.percentSolved())).append("%)").append(formatTime(sd.totalTime)).append("").append(numberFormat.format(sd.percentPrec())).append("%
"); } protected void llistaActivitats(StringBuilder sb, List v) throws Exception { sb.append("\n"); sb.append("").append(toNbsp(getMsg("report_header_activity"))).append("\n"); if (type == PRJ || type == GRP) { sb.append("").append(toNbsp(getMsg("report_header_user"))).append("\n"); } if (type == GRP) { sb.append("").append(toNbsp(getMsg("report_header_project"))).append("\n"); } sb.append("").append(toNbsp(getMsg("report_header_solved"))).append("\n"); sb.append("").append(toNbsp(getMsg("report_header_actions"))).append("\n"); sb.append("").append(toNbsp(getMsg("report_header_score"))).append("\n"); sb.append("").append(toNbsp(getMsg("report_header_time"))).append("\n"); sb.append("").append(toNbsp(getMsg("report_header_prec"))).append("\n"); sb.append("\n"); Iterator it = v.iterator(); while (it.hasNext()) { ActivityData ad = it.next(); sb.append("\n"); sb.append("").append(filter(ad.activityName)).append("\n"); if (type == PRJ || type == GRP) { sb.append("\n"); } if (type == GRP) { sb.append("").append(filter(ad.project)).append("\n"); } sb.append(""); sb.append(getMsg(ad.solved ? "YES_SHORT" : "NOT_SHORT")).append("\n"); sb.append("").append(numberFormat.format(ad.actions)).append("\n"); sb.append("").append(numberFormat.format(ad.score)).append(" (") .append(numberFormat.format(ad.percentSolved())).append("%)\n"); sb.append("").append(formatTime(ad.time)).append("\n"); sb.append("").append(numberFormat.format(ad.qualification)).append("%\n"); sb.append("\n"); } } protected void resumGlobal(StringBuilder sb, List v, String className, String style) throws Exception { int sess = 0, usrs, numProjects = 0, act_fetes = 0, act_res = 0, temps = 0, precisio = 0; if (!projectName.equals(WILDCARD)) numProjects = 1; else if (projects != null) { numProjects = projects.size(); if (projects.size() > 0 && WILDCARD.equals(projects.get(0))) numProjects--; } Set hs = new HashSet(); Iterator it = v.iterator(); while (it.hasNext()) { SessionData sd = it.next(); act_fetes += sd.numActs; act_res += sd.actsSolved; temps += sd.totalTime; precisio += sd.totalPrec; sess += sd.sessionCount; hs.addAll(sd.users); } usrs = hs.size(); sb.append("\n"); sb.append("\n"); if (usrs > 1) resumTD(sb, getMsg("report_users"), numberFormat.format(usrs)); resumTD(sb, getMsg("report_sessions"), numberFormat.format(sess)); if (type != PRJ) resumTD(sb, getMsg("report_projects"), numberFormat.format(numProjects)); resumTD(sb, getMsg("report_actDone"), numberFormat.format(act_fetes)); StringBuilder sb2 = new StringBuilder(200); sb2.append(numberFormat.format(act_res)).append(" (") .append(numberFormat.format(act_fetes == 0 ? 0 : 100 * act_res / act_fetes)).append("%)"); resumTD(sb, getMsg("report_actSolved"), sb2.substring(0)); resumTD(sb, getMsg("report_totalTime"), formatTime(temps)); sb2.setLength(0); sb2.append(numberFormat.format(act_fetes == 0 ? 0 : precisio / act_fetes)).append("%"); resumTD(sb, getMsg("report_globalPrec"), sb2.substring(0)); sb.append("
").append(filter(getMsg("report_globalSummary"))).append("
\n"); } protected void resumTD(StringBuilder sb, String td1, String td2) { sb.append("").append(toNbsp(td1)); sb.append("").append(toNbsp(td2)).append("\n"); } public String formatTime(int secs) { secs = Math.max(0, secs); String[] n = getFormattedNumbers(); int h = secs / (60 * 60); int m = (secs - (h * 60 * 60)) / 60; int s = secs % 60; StringBuilder sb = new StringBuilder(8); if (h > 0) sb.append(h).append(":"); sb.append(n[m]).append(":").append(n[s]); return sb.substring(0); } } src/report/reportServlets/edu/xtec/jclic/report/rp/ReportsRequestProcessor.java000066400000000000000000000063701335566474600305660ustar00rootroot00000000000000/* * File : ReportsRequestProcessor.java * Created : 27-mar-2003 17:11 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import static edu.xtec.jclic.ReportServerConstants.CFG_FILE; import edu.xtec.jclic.ReportServerConstants; import edu.xtec.jclic.report.BasicJDBCBridge; import edu.xtec.jclic.report.ReportServerJDBCBridge; import edu.xtec.servlet.RequestProcessor; import edu.xtec.util.Options; import edu.xtec.util.db.*; import java.io.File; import java.io.FileInputStream; import java.util.Properties; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.16 */ public abstract class ReportsRequestProcessor extends RequestProcessor implements ReportServerConstants { protected static ReportServerJDBCBridge bridge; protected static Properties prop; public static synchronized void setProperties(Properties prop) { if (prop != null) { if (bridge != null) { bridge.end(); bridge = null; } } ReportsRequestProcessor.prop = prop; } public static synchronized Properties getProperties() { if (prop == null) prop = new Properties(); return prop; } public static synchronized void loadProperties(String file) throws Exception { if (prop == null) { prop = new Properties(); prop.load(ReportServerConstants.class.getResourceAsStream(CFG_FILE)); loadLocalProperties(file); } } public static synchronized void loadLocalProperties(String file) throws Exception { if (prop == null) prop = new Properties(); if (file == null) file = CFG_FILE; if (file != null) { File f = new File(file); if (!f.isAbsolute()) f = new File(System.getProperty("user.home"), file); if (f.exists()) { FileInputStream is = new FileInputStream(f); prop.load(is); is.close(); } } } public static synchronized void initJDBCBridge(String propFile) throws Exception { if (prop == null) loadProperties(propFile); if (bridge == null) { ConnectionBeanProvider cbp = ConnectionBeanProvider.getConnectionBeanProvider(true, Options.toStringMap(prop)); boolean createTables = !"false".equalsIgnoreCase((String) prop.get(BasicJDBCBridge.CREATE_TABLES_KEY)); String tablePrefix = (String) prop.get(BasicJDBCBridge.TABLE_PREFIX_KEY); bridge = new ReportServerJDBCBridge(cbp, createTables, tablePrefix); } } @Override public boolean init() throws Exception { if (!super.init()) return false; if (bridge == null) initJDBCBridge(null); return true; } } src/report/reportServlets/edu/xtec/jclic/report/rp/UserAdmin.java000066400000000000000000000306771335566474600255550ustar00rootroot00000000000000/* * File : UserAdmin.java * Created : 19-feb-2003 16:06 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.GroupData; import edu.xtec.jclic.report.UserData; import edu.xtec.util.StrUtils; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class UserAdmin extends Basic { public static String TITLE = "user_admin_title"; public static String URL = "userAdmin"; public static final String GROUP = "group", ID = "id", NAME = "name", ICON = "icon", USER = "user"; public static final String PASS = "pass", PASSC = "passc"; public static final int USER_MENU = 0, EDIT = 1, EDIT_UPDATE = 2, CREATE = 3, CREATE_UPDATE = 4, DELETE = 5, DELETE_UPDATE = 6, CLEAR = 7, CLEAR_UPDATE = 8, ERR = 9; public static final String[] ACTIONS = { "", "edit", "editUpd", "create", "createUpd", "del", "delUpd", "clear", "clearUpd" }; protected int page; protected DateManager dm; protected GroupData gd; protected UserData ud; protected boolean err = true; protected String returnUrl; public String getTitle(ResourceBundle bundle) { /* * StringBuilder sb=new StringBuilder(bundle.getString(TITLE)); if(ud!=null && * ud.text!=null && ud.text.length()>0) sb.append(": ").append(filter(ud.text)); * return sb.toString(); */ return bundle.getString(TITLE); } public String getUrl() { return urlParam(URL, LANG, lang); } public String getUrl(int action) { StringBuilder sb = new StringBuilder(200); sb.append(URL); urlParamSb(sb, LANG, lang, true); urlParamSb(sb, ACTION, ACTIONS[action], false); if (ud != null) urlParamSb(sb, USER, ud.getId(), false); else if (gd != null) urlParamSb(sb, GROUP, gd.getId(), false); return sb.substring(0); } @Override public boolean init() throws Exception { if (!super.init()) return false; String uId = getParamNotNull(USER); if (uId.length() > 0) ud = bridge.getUserData(uId); String gId = getParamNotNull(GROUP); if (ud != null) gId = ud.groupId; if (gId.length() > 0) gd = bridge.getGroupData(gId); page = getAction(ACTIONS, USER_MENU); if (page == CLEAR || page == CLEAR_UPDATE) { dm = new DateManager(this); if (!dm.init()) return false; } switch (page) { case EDIT_UPDATE: edit(); break; case CREATE_UPDATE: create(); break; case DELETE_UPDATE: delete(); break; case CLEAR_UPDATE: clear(); break; } return true; } protected void edit() throws Exception { returnUrl = getUrl(USER_MENU); errMsg = getMsg("db_error") + "
"; String name = getParamNotNull(NAME).trim(); String pass = StrUtils.nullableString(getParam(PASS)); String passc = StrUtils.nullableString(getParam(PASSC)); if (name.length() == 0) errMsg = errMsg + getMsg("user_admin_invalid_name"); else if (!StrUtils.compareObjects(pass, passc)) errMsg = errMsg + getMsg("user_admin_err_bad_pw"); else { ud.setText(name); ud.pwd = (pass == null ? null : edu.xtec.util.Encryption.Encrypt(pass)); ud.setIconUrl(getParamNotNull(ICON).trim()); try { bridge.updateUser(ud, false); page = USER_MENU; } catch (Exception ex) { errMsg = errMsg + ex.getLocalizedMessage(); } } } protected String getGroupUrl() { StringBuilder sb = new StringBuilder(300); sb.append(GroupAdmin.URL); urlParamSb(sb, LANG, lang, true); urlParamSb(sb, ACTION, GroupAdmin.ACTIONS[GroupAdmin.GROUP_MENU], false); urlParamSb(sb, GroupAdmin.GROUP, gd.getId(), false); return sb.substring(0); } protected void create() throws Exception { returnUrl = getGroupUrl(); errMsg = getMsg("db_error") + "
"; String name = getParamNotNull(NAME).trim(); String id = getParamNotNull(ID).trim(); String icon = getParamNotNull(ICON).trim(); String pass = StrUtils.nullableString(getParam(PASS)); String passc = StrUtils.nullableString(getParam(PASSC)); if (name.length() == 0) errMsg = errMsg + getMsg("user_admin_invalid_name"); else if (id.length() == 0) errMsg = errMsg + getMsg("user_admin_invalid_id"); else if (!StrUtils.compareObjects(pass, passc)) errMsg = errMsg + getMsg("user_admin_err_bad_pw"); else { ud = bridge.getUserData(id); if (ud != null) { returnUrl = urlParam(urlParam(getUrl(CREATE), NAME, name), ICON, icon); errMsg = errMsg + getMsg("user_admin_id_already_exists"); } else { try { ud = new UserData(id, name, icon, null, gd.getId()); ud.pwd = (pass == null ? null : edu.xtec.util.Encryption.Encrypt(pass)); bridge.updateUser(ud, true); page = USER_MENU; } catch (Exception ex) { ud = null; errMsg = errMsg + ex.getLocalizedMessage(); } } } } protected void delete() throws Exception { returnUrl = getUrl(USER_MENU); try { bridge.deleteUser(ud.getId()); ud = null; errMsg = getMsg("user_admin_user_deleted"); err = false; returnUrl = getGroupUrl(); } catch (Exception ex) { returnUrl = getUrl(USER_MENU); errMsg = getMsg("db_error") + "
" + ex.getLocalizedMessage(); } } protected void clear() throws Exception { returnUrl = getUrl(USER_MENU); try { bridge.clearUserReportData(ud.getId(), dm.dFrom, dm.dTo); page = USER_MENU; } catch (Exception ex) { errMsg = getMsg("db_error") + "
" + ex.getLocalizedMessage(); } } @Override public void head(java.io.PrintWriter out) throws Exception { super.head(out); if (page == CLEAR) { StringBuilder sb = new StringBuilder(300); dm.writeDateScript(sb); out.println(sb.substring(0)); } } @Override public void body(java.io.PrintWriter out) throws Exception { super.body(out); StringBuilder sb = new StringBuilder(3000); StringBuilder sb2 = new StringBuilder(500); boolean flag = false; sb.append(linkTo(urlParam(Main.URL, LANG, lang), bundle.getString(Main.TITLE), null)); sb.append(" | "); sb.append(linkTo(urlParam(GroupAdmin.URL, LANG, lang), bundle.getString(GroupAdmin.TITLE), null)); if (gd != null) { sb.append(" | "); sb.append(linkTo(getGroupUrl(), gd.getText(), null)); } if (page != USER_MENU && ud != null) sb.append(" | ").append(linkTo(getUrl(USER_MENU), ud.getText(), null)); standardHeader(out, filter(getTitle(bundle)), sb.substring(0)); sb.setLength(0); if (ud == null && page != CREATE && page != DELETE_UPDATE) { page = ERR; if (errMsg == null) errMsg = getMsg("bad_data"); err = true; } switch (page) { case USER_MENU: sb.append("\n"); sb.append("

").append(getMsg("user_admin_id")).append(" ").append(filter(ud.getId())) .append("

\n"); sb.append("

").append(getMsg("user_admin_name")).append(" ").append(filter(ud.getText())) .append("

\n"); sb.append("

").append(getMsg("user_admin_pw_prompt")).append(" ") .append(ud.pwd == null ? "" : "***").append("

\n"); sb.append("

").append(getMsg("user_admin_icon")).append(" "); if (ud.getIconUrl() != null && ud.getIconUrl().length() > 0) { sb.append(""); } else sb.append("---\n"); sb.append("

\n"); sb.append("

"); sb.append(buttonTo(getUrl(EDIT), getMsg("user_admin_edit_button"), null)); sb.append(buttonTo(getUrl(DELETE), getMsg("user_admin_delete_button"), null)); sb.append(buttonTo(getUrl(CLEAR), getMsg("user_admin_clear_button"), null)); sb.append("

\n"); sb.append("\n"); sb.append("
\n"); break; case EDIT: flag = true; case CREATE: String id = (ud != null ? ud.getId() : getParamNotNull(ID).trim()); String name = (ud != null ? ud.getText() : getParamNotNull(NAME).trim()); String icon = (ud != null ? ud.getIconUrl() : getParamNotNull(ICON).trim()); String pass = (ud != null ? edu.xtec.util.Encryption.Decrypt(ud.pwd) : getParam(PASS)); sb.append("
\n"); sb.append("

").append(getMsg("user_admin_id")).append(" "); sb.append("\n"); sb.append("

").append(getMsg("user_admin_name")).append(" "); sb.append("

\n"); sb.append("

").append(getMsg("user_admin_pw_prompt")).append(" "); sb.append("
\n"); sb.append("").append(getMsg("user_admin_pw_prompt_confirm")).append(" "); sb.append("

\n"); sb.append("

").append(getMsg("user_admin_icon")).append(" "); sb.append("

\n"); sb.append("

"); sb.append(buttonTo(flag ? getUrl(USER_MENU) : getGroupUrl(), getMsg("cancel"), null)).append("

\n"); sb.append("
\n"); sb.append("
\n"); break; case DELETE: sb.append("

").append(getMsg("user_admin_delete_user")).append(" \"").append(filter(ud.getText())) .append("\"

\n"); sb.append("

").append(getMsg("user_admin_delete_user_explain")).append("

\n"); sb.append("

").append(getMsg("report_areyousure")).append("

\n"); sb.append("
\n"); sb.append("

"); sb.append(buttonTo(getUrl(USER_MENU), getMsg("NOT"), "width=50")); sb.append("

\n"); sb.append("
\n"); break; case CLEAR: sb.append("

").append(getMsg("user_admin_clear_user")).append(" \"").append(filter(ud.getText())) .append("\"

\n"); sb.append("

").append(getMsg("user_admin_clear_user_explain")).append("

\n"); sb.append("
\n"); dm.writeHiddenFields(sb); sb2.setLength(0); sb2.append("document.").append(MAIN_FORM).append(".submit()"); dm.zonaData(sb, buttonAction(sb2.substring(0), getMsg("db_clear_reports_date"), null)); sb.append("
\n"); sb.append("
\n"); break; default: sb.append("

").append(getMsg(err ? "error" : "success")).append("

\n"); if (errMsg != null) sb.append("

").append(errMsg).append("

\n"); if (returnUrl != null) sb.append("

").append(getMsg("return")).append("

\n"); } out.println(sb.substring(0)); }; } src/report/reportServlets/edu/xtec/jclic/report/rp/UserReport.java000066400000000000000000000070351335566474600257700ustar00rootroot00000000000000/* * File : UserReport.java * Created : 25-jan-2003 18:52 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.SessionData; import java.util.List; import java.util.ResourceBundle; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class UserReport extends Report { public static String TITLE = "user_report_title"; public static String URL = "userReport"; List sessionList; public String getTitle(ResourceBundle bundle) { return bundle.getString(TITLE); } public String getUrl() { return URL; } @Override public boolean init() throws Exception { type = USR; if (!super.init()) return false; projects = bridge.getProjList(userId, dm.dFrom, dm.dTo, kcc); sessionList = getSessionList(); if (session == null && sessionList != null && sessionList.size() > 0) { session = new Object[sessionList.size()]; for (int i = 0; i < sessionList.size(); i++) session[i] = FALSE; } if (session != null && session.length > 0) { for (int i = 0; i < session.length; i++) { if (TRUE.equals(session[i])) { SessionData sd = (SessionData) sessionList.get(i); if (sd != null && sd.id != null && sd.id.length() > 0) sd.actData = bridge.getPacSessionList(null, null, sd.id, dm.dFrom, dm.dTo, kcc); } } } return true; } @Override public void head(java.io.PrintWriter out) throws Exception { super.head(out); StringBuilder sb = new StringBuilder(200); writeSessionScript(sb); out.println(sb.substring(0)); } @Override public void body(java.io.PrintWriter out) throws Exception { super.body(out); StringBuilder sb = new StringBuilder(3000); sb.append("
\n"); zona(sb, "report_group", GROUP, true, opcioDefecte, vectorToArray(groups, true), groupId, isEditable, 180); zona(sb, "report_user", USER, true, opcioDefecte, vectorToArray(users, true), userId, isEditable, 180); zona(sb, "report_project", PROJECT, true, opcioDefecte, vectorToArray(projects, false, WILDCARD, "report_all_projects"), projectName, isEditable, 180); sb.append("
\n"); zonaParams(sb); sb.append("
\n"); zonaData(sb); sb.append("
\n"); sb.append("\n"); sb.append("
\n"); sb.append("

\n"); if (sessionList.isEmpty()) { sb.append(getMsg("report_no_data")).append("\n

\n"); } else { grafic(sb, Img.USER_GRAPH, false, true); sb.append("\n"); grafic(sb, Img.USER_GRAPH, true, true); sb.append("\n

\n"); resumGlobal(sb, sessionList, "tblA", "float: left; margin-right: 10px;"); llistaSessions(sb, sessionList, true, "tblA", null); } out.println(sb.substring(0)); } } src/report/reportServlets/edu/xtec/resources/000077500000000000000000000000001335566474600220005ustar00rootroot00000000000000src/report/reportServlets/edu/xtec/resources/html/000077500000000000000000000000001335566474600227445ustar00rootroot00000000000000src/report/reportServlets/edu/xtec/resources/html/basic.css000066400000000000000000000036121335566474600245410ustar00rootroot00000000000000body { background-color: #FFFFFF; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; } tr, td { font-size: 10pt; } a:link { color: #006699; text-decoration: none; } a:visited { color: #006699; text-decoration: none; } a:hover { color: #dd6900; text-decoration: underline } a:active { color: #ff0000; } h1 { font-weight: bold; font-size: 14pt; color: #235A5A; background-image: url(icon_reports.gif); background-repeat: no-repeat; background-position: left bottom; padding-left: 70px; vertical-align: bottom; padding-top: 15px; padding-bottom: 4px; display: block; font-family: Arial, Helvetica, sans-serif; margin-bottom: 0px; border-bottom-width: 2px; border-bottom-style: solid; } h2 { font-weight: bold; font-size: 10pt; color: purple } .menu { font-size: 11pt; line-height: 30px; font-weight: bold; } .cap { font-size: 14pt; color: #235A5A; background-color: #EFF7DD; font-weight: bold; font-family: Arial, Helvetica, sans-serif; } .topMenu { font-size: 8pt; font-weight: bold; padding-bottom: 3px; padding-top: 3px; margin-top: 0px; margin-bottom: 30px; } .info { background-color: #FFFFCC; border: 1px solid; padding: 5px; margin-top: 10px; margin-bottom: 10px; float: left; } .tblA { border-collapse: separate; border-spacing: 1px 1px 1px 1px; } .tblA td { font-size: 8pt; background-color:#eeeeee; padding: 3px; } .tblA th { font-size: 8pt; background-color:#add8e6; padding: 3px; } #t2x td{ background-color: #f0f8ff } #t2x th{ background-color: #a6caf0; } #t2x #green{ background-color: #90ee90; text-align:center; } #t2x #red{ background-color: #ff7f50; text-align:center; } .inputForm { text-align: right; float: left; vertical-align: top; margin-right: 10px; } #compact p { margin: 2px 0px; } .inputForm p{ margin: 5px 0px; vertical-align: middle; } src/report/reportServlets/edu/xtec/resources/html/basic_print.css000066400000000000000000000033171335566474600257570ustar00rootroot00000000000000body { background-color: #FFFFFF; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; } tr, td { font-size: 10pt; } a:link { color: black; text-decoration: none; } a:active { color: black; text-decoration: none; } a:visited { color: black; text-decoration: none; } h1 { font-weight: bold; font-size: 14pt; color: #235A5A; background-image: url(icon_reports.gif); background-repeat: no-repeat; background-position: left bottom; padding-left: 70px; vertical-align: bottom; padding-top: 15px; padding-bottom: 4px; display: block; font-family: Arial, Helvetica, sans-serif; margin-bottom: 0px; border-bottom-width: 2px; border-bottom-style: solid; } h2 { font-weight: bold; font-size: 10pt; } .menu { font-size: 11pt; line-height: 30px; font-weight: bold; } .cap { font-size: 14pt; color: #235A5A; background-color: #EFF7DD; font-weight: bold; font-family: Arial, Helvetica, sans-serif; } .topMenu { display: none; } .info { background-color: #FFFFCC; border: 1px solid; padding: 5px; margin-top: 10px; margin-bottom: 10px; float: left; } .tblA { border-collapse: collapse; } .tblA td { border: 1px solid; font-size: 8pt; padding: 3px; } .tblA th { border: 1px solid; font-size: 8pt; padding: 3px; } #t2x td{ background-color: #f0f8ff } #t2x th{ background-color: #a6caf0; } #t2x #green{ background-color: #90ee90; text-align:center; } #t2x #red{ background-color: #ff7f50; text-align:center; } .inputForm { text-align: right; float: left; vertical-align: top; margin-right: 10px; margin-bottom: 10px; } #compact p { margin: 2px 0px; } .inputForm p{ margin: 5px 0px; vertical-align: middle; } #noPrint{ display: none; }src/report/reportServlets/edu/xtec/resources/html/icon_reports.gif000066400000000000000000000024671335566474600261520ustar00rootroot00000000000000GIF89a<<Tkhƨȳs(ր2vYdӹ㼠`z3=%ۨzKғ~rƧx[Ȫ}β|!áooγĥx27V` ݳ٤߳R}޵t.{͇ϺvC mhk,]˯Ԙֿğްό^c^ ySt;5ȪεXbۥן!{,<<{s4eXXq00SbeJ>\mD2o Q40>Va "[B? DG%@KF9pCȌ?F(ϼ>&(Ddt܊z@G JR]0JЫG80Ç5YA>0ₑB E6"r50!Tt-}Hp4!*M ED.]) dxmɃ&ipn 5QUT[,ҵl&#A\8cWֶ,{Ø6Րo Z\pD>`tɈװ_?y!dĆ:ma= N|8<#|Ƌ"#Nh~7]|$"Dp0B B߿@f:p "DHgO0@}xI@& "b  >DNjP\0ĄWLvi1"X !F%Zbh=Ul A频1$t|qBQ%D!t6Ve&N[ [:F +g)0Ty0(Y0Afog -h-\@V2%g8~Ip¨VX)hd:Vkebױ.6[RmRvI-ήb*eծqRJ. jR^܎k>B*޹.&{g ,nn q#2L1;ok0aHnm 2"W\ _?rĭn>w'$|-$tҢ6,FZIS$1,^Ӷd{`0 n   H 3Pqw)n'8$;src/report/reportServlets/edu/xtec/resources/html/menys.gif000066400000000000000000000000711335566474600245640ustar00rootroot00000000000000GIF89a !, ^Lye|;src/report/reportServlets/edu/xtec/resources/html/mes.gif000066400000000000000000000000711335566474600242150ustar00rootroot00000000000000GIF89a !,  "Ks,S;src/report/reportServlets/edu/xtec/resources/messages/000077500000000000000000000000001335566474600236075ustar00rootroot00000000000000src/report/reportServlets/edu/xtec/resources/messages/reportMessages.properties000066400000000000000000000114621335566474600307340ustar00rootroot00000000000000login_pwd=Password: login_desc=You need to provide a valid password in order to access the reports database. login_title=Login submit=Submit... login_incorrect=Incorrect password! main_title=Main menu users_admin_title=Users and groups admin group_report_title=Group reports user_report_title=User reports act_report_title=Activity reports db_admin_title=Database admin db_admin_settings_error=Unable to set the new database values! db_admin_param_agc=Allow users to create new groups db_admin_param_auc=Allow users to create new users db_admin_param_shgl=Select group in a list db_admin_param_shul=Select user name in a list db_admin_param_ut=Database has tables of users and groups db_admin_edit_btn=Edit settings... db_admin_pw_edit_btn=Set password... title=Title db_admin_edit_title=Edit database settings db_admin_pw_edit_title=Change system password db_admin_pw_newPwd=New password db_admin_pw_verifyPwd=Retype password db_admin_pw_noFit=Password fields don't fit! report_group=Group: report_user=User: report_project=Project: report_all_projects=All projects report_key=Key: report_code=Code: report_context=Context: report_from=From: month_1=january month_2=february month_3=march month_4=april month_5=may month_6=june month_7=july month_8=august month_9=september month_10=october month_11=november month_12=december report_to=To: report_global_precision=Global precision report_solved_activities=Solved activities report_user_evolution=User evolution report_group_evolution=Group evolution report_project_evolution=Project evolution report_result_distribution=Result distribution report_no_data=NO DATA report_users=Users: report_sessions=Sessions: report_projects=Projects: report_actDone=Activities done: report_actSolved=Activities solved: report_totalTime=Total time: report_globalPrec=Global score: report_globalSummary=Global summary report_header_date=date report_session_list=Sessions: report_header_user=user report_header_project=project report_header_numActs=activities report_header_actsSolved=acts. solved report_header_time=time report_header_prec=score report_session_detail_show=show session details report_session_detail_title=Activities done in session report_header_activity=activity report_header_actions=actions report_header_score=corrects report_header_solved=ok Y=Y N=N report_session_detail_hide=hide session details report_header_sessions=sessions report_all_activities=All activities report_activity=Activity: report_many=several report_n_users=users group_admin_title=Groups administration group_admin_new_button=New group... group_admin_groups=Groups report_actions=Actions group_admin_edit_button=Edit... user_admin_title=User admin group_admin_delete_button=Delete... group_admin_clear_button=Clear reports... group_admin_properties=Group properties group_admin_name=Name: group_admin_id=Identifier: group_admin_icon=Icon: error=ERROR return=return... group_admin_users=Users group_admin_no_users=This group has no users. group_admin_create_user_button=Create a new user... cancel=Cancel group_admin_invalid_name=Incorrect group name! group_admin_invalid_id=Incorrect group identifier! group_admin_id_already_exists=There is another group with the same identifier in the database! group_admin_delete_group=Delete group report_areyousure=Are you sure? YES=Yes NOT=Not group_admin_delete_group_explain=This operation will also delete on the database all users of this group. All data of these users will be lost. db_error=Unable to complete the task. group_admin_clear_group=Clear report data of group group_admin_clear_group_explain=This operation will clear all the reports of the activities done by the members of this group between the specified dates. db_clear_reports_date=Clear report data user_admin_invalid_name=Invalid user name. user_admin_invalid_id=Invalid user identifier user_admin_id_already_exists=There is another user with the same identifier in the database! user_admin_user_deleted=The user was successfully deleted from the database. user_admin_id=Identifier: user_admin_name=Name: user_admin_icon=Icon: user_admin_edit_button=Edit... user_admin_delete_button=Delete... user_admin_clear_button=Clear reports... user_admin_delete_user=Delete user user_admin_delete_user_explain=This operation will delete this user and his reports from the database. user_admin_clear_user=Clear report data of user user_admin_clear_user_explain=This operation will clear all the reports of the activities done by this user between the specified dates. success=Operation successful bad_data=Bad data! db_admin_param_lap=Time between connections (seconds)\: jclic_reports=JClic reports YES_SHORT=Y NOT_SHORT=N user_admin_pw_prompt=Password\: user_admin_pw_prompt_confirm=Confirm password\: user_admin_err_bad_pw=Passwords don't match\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_ar.properties000066400000000000000000000114601335566474600314140ustar00rootroot00000000000000login_pwd=Password: login_desc=You need to provide a valid password in order to access the reports database. login_title=Login submit=Submit... login_incorrect=Incorrect password! main_title=Main menu users_admin_title=Users and groups admin group_report_title=Group reports user_report_title=User reports act_report_title=Activity reports db_admin_title=Database admin db_admin_settings_error=Unable to set the new database values! db_admin_param_agc=Allow users to create new groups db_admin_param_auc=Allow users to create new users db_admin_param_shgl=Select group in a list db_admin_param_shul=Select user name in a list db_admin_param_ut=Database has tables of users and groups db_admin_edit_btn=Edit settings... db_admin_pw_edit_btn=Set password... title=Title db_admin_edit_title=Edit database settings db_admin_pw_edit_title=Change system password db_admin_pw_newPwd=New password db_admin_pw_verifyPwd=Retype password db_admin_pw_noFit=Password fields don't fit! report_group=Group: report_user=User: report_project=Project: report_all_projects=All projects report_key=Key: report_code=Code: report_context=Context: report_from=From: month_1=january month_2=february month_3=march month_4=april month_5=may month_6=june month_7=july month_8=august month_9=september month_10=october month_11=november month_12=december report_to=To: report_global_precision=Global precision report_solved_activities=Solved activities report_user_evolution=User evolution report_group_evolution=Group evolution report_project_evolution=Project evolution report_result_distribution=Result distribution report_no_data=NO DATA report_users=Users: report_sessions=Sessions: report_projects=Projects: report_actDone=Activities done: report_actSolved=Activities solved: report_totalTime=Total time: report_globalPrec=Global score: report_globalSummary=Global summary report_header_date=date report_session_list=Sessions: report_header_user=user report_header_project=project report_header_numActs=activities report_header_actsSolved=acts. solved report_header_time=time report_header_prec=score report_session_detail_show=show session details report_session_detail_title=Activities done in session report_header_activity=activity report_header_actions=actions report_header_score=corrects report_header_solved=ok Y=Y N=N report_session_detail_hide=hide session details report_header_sessions=sessions report_all_activities=All activities report_activity=Activity: report_many=several report_n_users=users group_admin_title=Groups administration group_admin_new_button=New group... group_admin_groups=Groups report_actions=Actions group_admin_edit_button=Edit... user_admin_title=User admin group_admin_delete_button=Delete... group_admin_clear_button=Clear reports... group_admin_properties=Group properties group_admin_name=Name: group_admin_id=Identifier: group_admin_icon=Icon: error=ERROR return=return... group_admin_users=Users group_admin_no_users=This group has no users. group_admin_create_user_button=Create a new user... cancel=Cancel group_admin_invalid_name=Incorrect group name! group_admin_invalid_id=Incorrect group identifier! group_admin_id_already_exists=There is another group with the same identifier in the database! group_admin_delete_group=Delete group report_areyousure=Are you sure? YES=Yes NOT=Not group_admin_delete_group_explain=This operation will also delete on the database all users of this group. All data of these users will be lost. db_error=Unable to complete the task. group_admin_clear_group=Clear report data of group group_admin_clear_group_explain=This operation will clear all the reports of the activities done by the members of this group between the specified dates. db_clear_reports_date=Clear report data user_admin_invalid_name=Invalid user name. user_admin_invalid_id=Invalid user identifier user_admin_id_already_exists=There is another user with the same identifier in the database! user_admin_user_deleted=The user was successfully deleted from the database. user_admin_id=Identifier: user_admin_name=Name: user_admin_icon=Icon: user_admin_edit_button=Edit... user_admin_delete_button=Delete... user_admin_clear_button=Clear reports... user_admin_delete_user=Delete user user_admin_delete_user_explain=This operation will delete this user and his reports from the database. user_admin_clear_user=Clear report data of user user_admin_clear_user_explain=This operation will clear all the reports of the activities done by this user between the specified dates. success=Operation successful bad_data=Bad data! db_admin_param_lap=Time between connections (seconds): jclic_reports=JClic reports YES_SHORT=Y NOT_SHORT=N user_admin_pw_prompt=Password: user_admin_pw_prompt_confirm=Confirm password: user_admin_err_bad_pw=Passwords don't match\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_ast.properties000066400000000000000000000132061335566474600316010ustar00rootroot00000000000000login_pwd=Contrase\u00F1a: login_desc=Tien d'escribir una contrase\u00F1a correuta p'acceder a la base de datos d'informes. login_title=Coneutar submit=Unviar... login_incorrect=\u00A1Contrase\u00F1a incorreuta! main_title=Men\u00FA principal users_admin_title=Alministraci\u00F3n de grupos y usuarios group_report_title=Informes de grupu user_report_title=Informes d'usuariu/a act_report_title=Informes de xera db_admin_title=Alministraci\u00F3n de la base de datos db_admin_settings_error=\u00A1Nun se pudieron camudar los valores de la base de datos! db_admin_param_agc=Permitir a los usuarios criar grupos nuevos db_admin_param_auc=Permitir a los usuarios la creaci\u00F3n de usuarios nuevos db_admin_param_shgl=Esbillar grupu d'una llista db_admin_param_shul=Esbillar el nome d'usuariu/a d'una llista db_admin_param_ut=La base de datos tien tables d'usuarios y grupos db_admin_edit_btn=Editar propiedaes... db_admin_pw_edit_btn=Afitar contrase\u00F1a... title=T\u00EDtulu db_admin_edit_title=Editar propiedaes de la base de datos db_admin_pw_edit_title=Camudar la contrase\u00F1a del sistema db_admin_pw_newPwd=Contrase\u00F1a nueva db_admin_pw_verifyPwd=Volver a escribir la contrase\u00F1a db_admin_pw_noFit=Los dos testos nun concasen! report_group=Grupu: report_user=Usuariu: report_project=Proyeutu: report_all_projects=Tolos proyeutos report_key=Contrase\u00F1a: report_code=C\u00F3digu: report_context=Contestu: report_from=Dende: month_1=xineru month_2=febreru month_3=marzu month_4=abril month_5=mayu month_6=xunu month_7=xunetu month_8=agostu month_9=setiembre month_10=ochobre month_11=payares month_12=avientu report_to=Fasta: report_global_precision=Precisi\u00F3n global report_solved_activities=Xeres resueltes report_user_evolution=Evoluci\u00F3n del usuariu/a report_group_evolution=Evoluci\u00F3n del grupu report_project_evolution=Evoluci\u00F3n del proyeutu report_result_distribution=Distribuci\u00F3n de resultaos report_no_data=ENSIN DATOS report_users=Usuarios: report_sessions=Sesiones: report_projects=Proyeutos: report_actDone=Xeres realizaes: report_actSolved=Xeres resueltes: report_totalTime=Tiempu total: report_globalPrec=Precisi\u00F3n global: report_globalSummary=Resume global report_header_date=data report_session_list=Sesiones realizaes: report_header_user=usuariu/a report_header_project=proyeutu report_header_numActs=xeres report_header_actsSolved=xeres. resueltes report_header_time=tiempu report_header_prec=precisi\u00F3n report_session_detail_show=amosar detalles de la sesi\u00F3n... report_session_detail_title=Xeres realizaes na sesi\u00F3n report_header_activity=xera report_header_actions=aiciones report_header_score=aciertos report_header_solved=bien Y=S N=N report_session_detail_hide=esconder detalles de la sesi\u00F3n report_header_sessions=sesiones report_all_activities=Toles xeres report_activity=Xera: report_many=dellos report_n_users=usuarios group_admin_title=Alministraci\u00F3n de grupos group_admin_new_button=Grupu nuevu... group_admin_groups=Grupos report_actions=Aiciones group_admin_edit_button=Camudar... user_admin_title=Alministraci\u00F3n d'usuarios group_admin_delete_button=Esborrar... group_admin_clear_button=Llimpiar informes... group_admin_properties=Propiedaes del grupu group_admin_name=Nome: group_admin_id=Identificador: group_admin_icon=Iconu: error=ERROR return=tornar... group_admin_users=Usuarios group_admin_no_users=Esti grupu nun tien usuariu/a deng\u00FAn. group_admin_create_user_button=Criar un usuariu/a nuevu... cancel=Encaboxar group_admin_invalid_name=El nome del grupu ye incorreutu! group_admin_invalid_id=L'identificador de grupu ye incorreutu. group_admin_id_already_exists=\u00A1Y\u00E1 hai un grupu con esti identificador na base de datos! group_admin_delete_group=Esborrar el grupu report_areyousure=\u00BFDe xuru? YES=S\u00ED NOT=Non group_admin_delete_group_explain=Esta operaci\u00F3n va desaniciar tami\u00E9n de la base de datos a tolos usuarios d'esti grupu. Van perdese tolos datos d'estos usuarios. db_error=Nun se pudo facer la operaci\u00F3n. group_admin_clear_group=Llimpiar los informes del grupu group_admin_clear_group_explain=Esta operaci\u00F3n va llimpiar tolos informes de les xeres realizaes polos miembros d'esti grupu ente les dates conse\u00F1aes. db_clear_reports_date=Llimpiar los datos d'informes user_admin_invalid_name=El nome d'usuariu/a ye incorreutu. user_admin_invalid_id=L'identificador d'usuariu/a ye incorreutu! user_admin_id_already_exists=Y\u00E1 hai otru usuariu/a con esti identificador na base de datos. Los nomes puen repetise (en dellos grupos) pero los identificadores tienen de ser \u00FAnicos. user_admin_user_deleted=L'usuariu/a foi esborr\u00E1u dafechu de la base de datos. user_admin_id=Identificador: user_admin_name=Nome: user_admin_icon=Iconu: user_admin_edit_button=Camudar... user_admin_delete_button=Esborrar... user_admin_clear_button=Llimpiar informes... user_admin_delete_user=Esborrar l'usuariu/a user_admin_delete_user_explain=Esta operaci\u00F3n va esborrar al usuariu/a y los sos informes de la base de datos. user_admin_clear_user=Llimpiar los informes del usuariu/a user_admin_clear_user_explain=Esta operaci\u00F3n va llimpiar los informes de les xeres realizaes por esti/a usuariu/a nel periodu especific\u00E1u. success=Operaci\u00F3n fecha con \u00E9situ bad_data=\u00A1Datos incorreutos! db_admin_param_lap=Tiempu ente conexones (segundos): jclic_reports=Informes JClic YES_SHORT=S NOT_SHORT=N user_admin_pw_prompt=Contrase\u00F1a: user_admin_pw_prompt_confirm=Confirmar contrase\u00F1a: user_admin_err_bad_pw=\u00A1Les contrase\u00F1es nun concasen\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_bs.properties000066400000000000000000000125541335566474600314230ustar00rootroot00000000000000login_pwd=Lozinka: login_desc=Morate osigurati validnu lozinku kako bi pristupili izvje\u0161\u0107u baze podataka. login_title=Prijava submit=Po\u0161alji... login_incorrect=Neta\u010Dna lozinka! main_title=Glavni izbornik users_admin_title=Administrator korisnika i grupa group_report_title=Izvje\u0161\u0107a grupa user_report_title=Izvje\u0161\u0107a korisnika act_report_title=Izvje\u0161\u0107a aktivnosti db_admin_title=Administrator baze podataka db_admin_settings_error=Nije mogu\u0107e podesiti nove vrijednosti baze podataka! db_admin_param_agc=Dopustiti korisnicima kreiranje novih grupa db_admin_param_auc=Dopustiti korisnicima kreiranje novih korisnika db_admin_param_shgl=Odaberi grupu u listi db_admin_param_shul=Odaberi korisni\u010Dko ime u listi db_admin_param_ut=Baza podataka ima tabele korisnika i grupa db_admin_edit_btn=Uredi postavke... db_admin_pw_edit_btn=Podesi lozinku... title=Naslov db_admin_edit_title=Uredi postavke baze podataka db_admin_pw_edit_title=Promjeni lozinku sistema db_admin_pw_newPwd=Nova lozinka db_admin_pw_verifyPwd=Ponovo unesite lozinku db_admin_pw_noFit=Polja lozinke se ne uklapaju! report_group=Grupa: report_user=Korisnik: report_project=Projekt: report_all_projects=Svi projekti report_key=Tipka: report_code=Kod report_context=Obja\u0161njenje: report_from=Od: month_1=januar month_2=februar month_3=mart month_4=april month_5=maj month_6=juni month_7=juli month_8=august month_9=septembar month_10=oktobar month_11=novembar month_12=decembar report_to=Do: report_global_precision=Globalna preciznost report_solved_activities=Rje\u0161ene aktivnosti report_user_evolution=Razvoj korisnika report_group_evolution=Razvoj grupe report_project_evolution=Razvoj projekta report_result_distribution=Rezultat distribucije report_no_data=NEMA PODATAKA report_users=Korisnici: report_sessions=Sesije: report_projects=Projekti: report_actDone=Ura\u0111ene aktivnosti: report_actSolved=Rje\u0161ene aktivnosti: report_totalTime=Ukupno vrijeme: report_globalPrec=Ukupan rezultat: report_globalSummary=Globalni pregled report_header_date=datum report_session_list=Sesije: report_header_user=korisnik report_header_project=projekt report_header_numActs=aktivnosti report_header_actsSolved=akt.rje\u0161ene report_header_time=vrijeme report_header_prec=rezultat report_session_detail_show=poka\u017Ei datelje sesije report_session_detail_title=Ura\u0111ene aktivnosti u sesiji report_header_activity=aktivnost report_header_actions=akcije report_header_score=ispravke report_header_solved=uredu Y=Y N=N report_session_detail_hide=sakrij detalje sesije report_header_sessions=sesije report_all_activities=Sve aktivnosti report_activity=Aktivnost: report_many=nekoliko report_n_users=korisnici group_admin_title=Administracija grupa group_admin_new_button=Nova grupa... group_admin_groups=Grupe report_actions=Akcije group_admin_edit_button=Uredi... user_admin_title=Korisnik administrator group_admin_delete_button=Obri\u0161i... group_admin_clear_button=Obri\u0161i izvje\u0161taje... group_admin_properties=Karakteristike grupe group_admin_name=Naziv: group_admin_id=Identifikator: group_admin_icon=Ikona: error=GRE\u0160KA return=vrati... group_admin_users=Korisnici group_admin_no_users=Grupa nema korisnika. group_admin_create_user_button=Kreirajte novog korisnika... cancel=Odustani group_admin_invalid_name=Neta\u010Dan naziv grupe! group_admin_invalid_id=Neta\u010Dan identifikator grupe! group_admin_id_already_exists=Postoji druga grupa s istim identifikatorom u bazi podataka! group_admin_delete_group=Obri\u0161i grupu report_areyousure=Da li ste sigurni? YES=Da NOT=Ne group_admin_delete_group_explain=Ova operacija \u0107e tako\u0111er izbrisati sve korisnike ove grupe. Svi podaci od ovih korisnika \u0107e biti izgubljeni. db_error=Nije mogu\u0107e zavr\u0161iti zadatak. group_admin_clear_group=Obri\u0161i izvje\u0161taje o podacima iz grupe group_admin_clear_group_explain=Ovaj postupak \u0107e izbrisati sve izvje\u0161taje o aktivnostima u\u010Dinjenim od strane \u010Dlanova ove grupe izme\u0111u navedenih datuma. db_clear_reports_date=Obri\u0161i izvje\u0161taje o podacima user_admin_invalid_name=Neispravno korisni\u010Dko ime. user_admin_invalid_id=Neispravan identifikator korisnika user_admin_id_already_exists=Postoji drugi korisnik s istim identifikatorom u bazi podataka! user_admin_user_deleted=Ovaj korisnik je uspje\u0161no izbrisan iz baze podataka. user_admin_id=Identifikator: user_admin_name=Naziv: user_admin_icon=Ikona: user_admin_edit_button=Uredi... user_admin_delete_button=Obri\u0161i... user_admin_clear_button=Obri\u0161i izvje\u0161taje... user_admin_delete_user=Obri\u0161i korisnika user_admin_delete_user_explain=Ovaj postupak \u0107e obrisati ovog korisnika i njegove izvje\u0161taje iz baze podataka. user_admin_clear_user=Obri\u0161i izvje\u0161\u0107a od podacima korisnika user_admin_clear_user_explain=Ovaj postupak \u0107e izbrisati sve izvje\u0161taje o aktivnostima u\u010Dinjenim od strane ovog korisnika izme\u0111u navedenih datuma. success=Operacija uspje\u0161na bad_data=Pogre\u0161an podatak! db_admin_param_lap=Vrijeme izme\u0111u konekcija (sekunde): jclic_reports=JClic izvje\u0161\u0107a YES_SHORT=Y NOT_SHORT=N user_admin_pw_prompt=Lozinka: user_admin_pw_prompt_confirm=Potvrdi lozinku: user_admin_err_bad_pw=Lozinke se ne poklapaju\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_ca.properties000066400000000000000000000133261335566474600314000ustar00rootroot00000000000000login_pwd=Contrasenya: login_desc=Heu d'escriure una contrasenya correcta per accedir a la base de dades d'informes. login_title=Connexi\u00F3 a la base de dades submit=Envia dades... login_incorrect=Contrasenya incorrecta! main_title=Men\u00FA principal users_admin_title=Administraci\u00F3 de grups i usuaris group_report_title=Informes de grup user_report_title=Informes d'usuari/a act_report_title=Informes d'activitat db_admin_title=Administraci\u00F3 de la base de dades db_admin_settings_error=Ha estat impossible fixar els nous valors per a la base de dades! db_admin_param_agc=Permetre als usuaris crear nous grups db_admin_param_auc=Permetre als usuaris la creaci\u00F3 de nous usuaris db_admin_param_shgl=Seleccionar grup en una llista db_admin_param_shul=Seleccionar el nom d'usuari/a en una llista db_admin_param_ut=La base de dades t\u00E9 taules d'usuaris i grups db_admin_edit_btn=Edita les propietats... db_admin_pw_edit_btn=Estableix la contrasenya... title=T\u00EDtol db_admin_edit_title=Edita les propietats de la base de dades db_admin_pw_edit_title=Canvia la contrasenya del sistema db_admin_pw_newPwd=Nova contrasenya db_admin_pw_verifyPwd=Torna a escriure la contrasenya db_admin_pw_noFit=Els dos texts no coincideixen! report_group=Grup: report_user=Usuari: report_project=Projecte: report_all_projects=Tots els projectes report_key=Clau: report_code=Codi: report_context=Context: report_from=Des de: month_1=gener month_2=febrer month_3=mar\u00E7 month_4=abril month_5=maig month_6=juny month_7=juliol month_8=agost month_9=setembre month_10=octubre month_11=novembre month_12=desembre report_to=Fins a: report_global_precision=Precisi\u00F3 global report_solved_activities=Activitats resoltes report_user_evolution=Evoluci\u00F3 de l'usuari/a report_group_evolution=Evoluci\u00F3 del grup report_project_evolution=Evoluci\u00F3 del projecte report_result_distribution=Distribuci\u00F3 de resultats report_no_data=SENSE DADES report_users=Usuaris: report_sessions=Sessions: report_projects=Projectes: report_actDone=Activitats fetes: report_actSolved=Activitats resoltes: report_totalTime=Temps total: report_globalPrec=Precisi\u00F3 global: report_globalSummary=Resum global report_header_date=data report_session_list=Sessions realitzades: report_header_user=usuari/a report_header_project=projecte report_header_numActs=activitats report_header_actsSolved=act. resoltes report_header_time=temps report_header_prec=precisi\u00F3 report_session_detail_show=mostrar detalls de la sessi\u00F3 report_session_detail_title=Activitats realitzades a la sessi\u00F3 report_header_activity=activitat report_header_actions=accions report_header_score=encerts report_header_solved=b\u00E9 Y=S N=N report_session_detail_hide=amaga els detalls de la sessi\u00F3 report_header_sessions=sessions report_all_activities=Totes les activitats report_activity=Activitat: report_many=diversos report_n_users=usuaris group_admin_title=Administraci\u00F3 de grups group_admin_new_button=Nou grup... group_admin_groups=Grups report_actions=Accions group_admin_edit_button=Modifica... user_admin_title=Administraci\u00F3 d'usuaris group_admin_delete_button=Elimina... group_admin_clear_button=Elimina informes... group_admin_properties=Propietats del grup group_admin_name=Nom: group_admin_id=Identificador: group_admin_icon=Icona: error=ERROR return=torna... group_admin_users=Usuaris group_admin_no_users=Aquest grup no cont\u00E9 cap usuari/a. group_admin_create_user_button=Crea un nou usuari/a... cancel=Cancel\u00B7la group_admin_invalid_name=El nom del grup \u00E9s incorrecte! group_admin_invalid_id=L'identificador de grup \u00E9s incorrecte! group_admin_id_already_exists=Ja hi ha un altre grup amb el mateix identificador a la base de dades! group_admin_delete_group=Elimina el grup report_areyousure=Segur que voleu realitzar aquesta operaci\u00F3? YES=S\u00ED NOT=No group_admin_delete_group_explain=Aquesta operaci\u00F3 tamb\u00E9 eliminar\u00E0 de la base de dades a tots els usuaris d'aquest grup. Totes les seves dades es perdran. db_error=No s'ha pogut realitzar l'operaci\u00F3. group_admin_clear_group=Esborra els informes del grup group_admin_clear_group_explain=Aquesta operaci\u00F3 esborrar\u00E0 tots els informes de les activitats realitzades pels membres d'aquest grup entre les dates indicades. db_clear_reports_date=Esborra els informes user_admin_invalid_name=El nom d'usuari/a \u00E9s incorrecte. user_admin_invalid_id=L'identificador d'usuari/a \u00E9s incorrecte! user_admin_id_already_exists=Ja hi ha un altre usuari/a amb aquest identificador a la base de dades. Els noms es poden repetir (en diferents grups), per\u00F2 els identificadors han de ser \u00FAnics. user_admin_user_deleted=L'usuari/a ha estat eliminat satisfact\u00F2riament de la base de dades. user_admin_id=Identificador: user_admin_name=Nom: user_admin_icon=Icona: user_admin_edit_button=Edita... user_admin_delete_button=Elimina... user_admin_clear_button=Elimina informes... user_admin_delete_user=Elimina l'usuari/a user_admin_delete_user_explain=Aquesta operaci\u00F3 eliminar\u00E0 aquest/a usuari/a i els seus informes de la base de dades. user_admin_clear_user=Elimina els informes de l'usuari/a user_admin_clear_user_explain=Aquesta operaci\u00F3 eliminar\u00E0 els informes de les activitats realitzades per aquest/a usuari/a en el per\u00EDode especificat. success=Operaci\u00F3 realitzada amb \u00E8xit bad_data=Dades incorrectes! db_admin_param_lap=Temps entre connexions (segons): jclic_reports=Informes JClic YES_SHORT=S NOT_SHORT=N user_admin_pw_prompt=Contrasenya: user_admin_pw_prompt_confirm=Confirmaci\u00F3 de la contrasenya: user_admin_err_bad_pw=Les contrasenyes no coincideixen\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_cs.properties000066400000000000000000000137141335566474600314230ustar00rootroot00000000000000login_pwd=Heslo: login_desc=Mus\u00EDte zadat platn\u00E9 heslo pro p\u0159\u00EDstup k datab\u00E1zi zpr\u00E1v. login_title=P\u0159ihl\u00E1\u0161en\u00ED submit=Odeslat... login_incorrect=Chybn\u00E9 heslo! main_title=Hlavn\u00ED menu users_admin_title=U\u017Eivatel\u00E9 a administr\u00E1to\u0159i skupin group_report_title=Skupinov\u00E1 sestava user_report_title=U\u017Eivatelsk\u00E1 sestava act_report_title=Sestava aktivit db_admin_title=Administr\u00E1tor datab\u00E1ze db_admin_settings_error=Nelze nastavit hodnoty pro novou datab\u00E1zi! db_admin_param_agc=Povolit u\u017Eivatel\u016Fm vytv\u00E1\u0159et nov\u00E9 skupiny db_admin_param_auc=Povolit u\u017Eivatel\u016Fm vytv\u00E1\u0159et nov\u00E9 u\u017Eivatele db_admin_param_shgl=Vybrat skupinu ze seznamu db_admin_param_shul=Vybrat u\u017Eivatele ze seznamu db_admin_param_ut=Datab\u00E1ze m\u00E1 tabulky u\u017Eivatel\u016F a skupin db_admin_edit_btn=Upravit nastaven\u00ED... db_admin_pw_edit_btn=Nastavit heslo... title=Titulek db_admin_edit_title=Upravit nastaven\u00ED datab\u00E1ze db_admin_pw_edit_title=Zm\u011Bnit heslo syst\u00E9mu db_admin_pw_newPwd=Nov\u00E9 heslo db_admin_pw_verifyPwd=Znovu zadejte heslo db_admin_pw_noFit=Hesla se neshoduj\u00ED! report_group=Skupina: report_user=U\u017Eivatel: report_project=Projekt: report_all_projects=V\u0161echny projekty report_key=Kl\u00E1vesa: report_code=K\u00F3d: report_context=Kontext: report_from=Od: month_1=leden month_2=\u00FAnor month_3=b\u0159ezen month_4=duben month_5=kv\u011Bten month_6=\u010Derven month_7=\u010Dervenec month_8=srpen month_9=z\u00E1\u0159\u00ED month_10=\u0159\u00EDjen month_11=listopad month_12=prosinec report_to=Komu: report_global_precision=Glob\u00E1ln\u00ED p\u0159esnost report_solved_activities=Vy\u0159e\u0161en\u00E9 aktivity report_user_evolution=V\u00FDvoj u\u017Eivatele report_group_evolution=V\u00FDvoj skupiny report_project_evolution=V\u00FDvoj projektu report_result_distribution=Rozd\u011Blen\u00ED v\u00FDsledk\u016F report_no_data=NO DATA report_users=U\u017Eivatel\u00E9: report_sessions=Sezen\u00ED: report_projects=Projekty: report_actDone=Vyzkou\u0161en\u00E9 aktivity: report_actSolved=Vy\u0159e\u0161en\u00E9 aktivity: report_totalTime=Celkov\u00FD \u010Das: report_globalPrec=Celkov\u00E9 sk\u00F3re: report_globalSummary=Souhrnn\u00FD p\u0159ehled report_header_date=datum report_session_list=Sezen\u00ED: report_header_user=u\u017Eivatel report_header_project=projekt report_header_numActs=aktivity report_header_actsSolved=vy\u0159e\u0161en\u00E9 aktivity report_header_time=\u010Das report_header_prec=sk\u00F3re report_session_detail_show=zobrazit podrobnosti sezen\u00ED (sessions) report_session_detail_title=Aktivity vyzkou\u0161en\u00E9 v sezen\u00ED report_header_activity=aktivita report_header_actions=akce report_header_score=spr\u00E1vn\u011B report_header_solved=ok Y=Y N=N report_session_detail_hide=skr\u00FDt detaily sezen\u00ED report_header_sessions=sezen\u00ED report_all_activities=V\u0161echny aktivity report_activity=Aktivita: report_many=n\u011Bkolik report_n_users=u\u017Eivatel\u00E9 group_admin_title=Spr\u00E1va skupin group_admin_new_button=Nov\u00E1 skupina... group_admin_groups=Skupiny report_actions=Akce group_admin_edit_button=Upravit... user_admin_title=Spr\u00E1vce group_admin_delete_button=Smazat... group_admin_clear_button=Vymazat zpr\u00E1vy ... group_admin_properties=Vlastnosti skupiny group_admin_name=Jm\u00E9no: group_admin_id=Identifik\u00E1tor: group_admin_icon=Ikona: error=CHYBA return=zp\u011Bt... group_admin_users=U\u017Eivatel\u00E9 group_admin_no_users=Tato skupina nem\u00E1 \u017E\u00E1dn\u00E9 u\u017Eivatele. group_admin_create_user_button=Vytvo\u0159it nov\u00E9ho u\u017Eivatele... cancel=Zru\u0161it group_admin_invalid_name=Chybn\u00FD n\u00E1zev skupiny! group_admin_invalid_id=Chybn\u00FD identifik\u00E1tor skupiny! group_admin_id_already_exists=V datab\u00E1zi existuje skupina se stejn\u00FDm identifik\u00E1torem! group_admin_delete_group=Smazat skupinu report_areyousure=Jste si jisti? YES=Ano NOT=Ne group_admin_delete_group_explain=Tato operace tak\u00E9 odstran\u00ED z datab\u00E1ze v\u0161echny u\u017Eivatele t\u00E9to skupiny. V\u0161echna data t\u011Bchto u\u017Eivatel\u016F budou smaz\u00E1na. db_error=Nelze dokon\u010Dit \u00FAkol. group_admin_clear_group=Vy\u010Distit hl\u00E1\u0161en\u00E1 data o skupin\u011B group_admin_clear_group_explain=Tato operace sma\u017Ee v\u0161echna hl\u00E1\u0161en\u00ED \u010Dinnost\u00ED proveden\u00FDch \u010Dleny t\u00E9to skupiny mezi zadan\u00FDmi daty. db_clear_reports_date=Vy\u010Distit hl\u00E1\u0161en\u00E1 data user_admin_invalid_name=Neplatn\u00E9 u\u017Eivatelsk\u00E9 jm\u00E9no. user_admin_invalid_id=Neplatn\u00FD identifik\u00E1tor u\u017Eivatele user_admin_id_already_exists=V datab\u00E1zi existuje u\u017Eivatel se stejn\u00FDm identifik\u00E1torem! user_admin_user_deleted=U\u017Eivatel byl \u00FAsp\u011B\u0161n\u011B smaz\u00E1n z datab\u00E1ze. user_admin_id=Identifik\u00E1tor: user_admin_name=N\u00E1zev: user_admin_icon=Ikona: user_admin_edit_button=Upravit... user_admin_delete_button=Smazat... user_admin_clear_button=Vymazat zpr\u00E1vy ... user_admin_delete_user=Vymazat u\u017Eivatele user_admin_delete_user_explain=Tato operace vyma\u017Ee tohoto u\u017Eivatele a jeho hl\u00E1\u0161en\u00ED z datab\u00E1ze. user_admin_clear_user=Vy\u010Distit datov\u00E1 hl\u00E1\u0161en\u00ED u\u017Eivatele user_admin_clear_user_explain=Tato operace sma\u017Ee v\u0161echna hl\u00E1\u0161en\u00ED \u010Dinnost\u00ED tohoto u\u017Eivatele mezi stanoven\u00FDmi term\u00EDny. success=Operace prob\u011Bhla \u00FAsp\u011B\u0161n\u011B bad_data=\u0160patn\u00E1 data! db_admin_param_lap=\u010Cas mezi p\u0159ipojen\u00EDm (sekundy): jclic_reports=JClic hl\u00E1\u0161en\u00ED YES_SHORT=A NOT_SHORT=N user_admin_pw_prompt=Heslo: user_admin_pw_prompt_confirm=Potvrzen\u00ED hesla: user_admin_err_bad_pw=Hesla se neshoduj\u00ED\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_de.properties000066400000000000000000000127721335566474600314110ustar00rootroot00000000000000login_pwd=Passwort: login_desc=Sie ben\u00F6tigen ein g\u00FCltiges Passwort, um auf die Datenbank zugreifen zu k\u00F6nnen. login_title=Login submit=Absenden... login_incorrect=Falsches Passwort! main_title=Hauptmen\u00FC users_admin_title=Benutzer- und Gruppenverwaltung group_report_title=Berichte f\u00FCr Gruppe user_report_title=Benutzerberichte act_report_title=\u00DCbungsberichte db_admin_title=Datenbankverwaltung db_admin_settings_error=Neue Werte f\u00FCr Datenbank konnten nicht \u00FCbernommen werden! db_admin_param_agc=Benutzer d\u00FCrfen neue Gruppen anlegen db_admin_param_auc=Benutzer d\u00FCrfen neue User anlegen db_admin_param_shgl=Gruppe aus Liste ausw\u00E4hlen db_admin_param_shul=Benutzername aus Liste ausw\u00E4hlen db_admin_param_ut=Datenbank beinhaltet Tabellen der Benutzer und Benutzergruppen db_admin_edit_btn=Einstellungen bearbeiten... db_admin_pw_edit_btn=Passwort festlegen... title=Titel db_admin_edit_title=Einstellungen f\u00FCr Datenbank bearbeiten db_admin_pw_edit_title=Passwort f\u00FCr System \u00E4ndern db_admin_pw_newPwd=Neues Passwort db_admin_pw_verifyPwd=Passwort wiederholen db_admin_pw_noFit=Falsches Passwort! report_group=Gruppe: report_user=Benutzer: report_project=Projekt: report_all_projects=Alle Projekte report_key=Schl\u00FCssel: report_code=Code: report_context=Context: report_from=Von: month_1=J\u00E4nner month_2=Feber month_3=M\u00E4rz month_4=April month_5=Mai month_6=Juni month_7=Juli month_8=August month_9=September month_10=Oktober month_11=November month_12=Detember report_to=Bis: report_global_precision=Gesamtpunkte report_solved_activities=Richtig gel\u00F6ste \u00DCbungen report_user_evolution=Benutzerfortschritt report_group_evolution=Fortschritt der Gruppe report_project_evolution=Projektfortschritt report_result_distribution=Ergebnisverteilung report_no_data=KEINE DATEN report_users=Benutzer: report_sessions=Sitzungen: report_projects=Projekte: report_actDone=Abgeschlossene \u00DCbungen: report_actSolved=Richtig gel\u00F6ste \u00DCbungen: report_totalTime=Gesamtzeit: report_globalPrec=Gesamtpunktestand: report_globalSummary=Gesamtergebnis report_header_date=Datum report_session_list=Sitzungen: report_header_user=Benutzer report_header_project=Projekt report_header_numActs=\u00DCbungen report_header_actsSolved=Richtig gel\u00F6ste \u00DCbungen report_header_time=Zeit report_header_prec=Punktestand report_session_detail_show=Details der Sitzung anzeigen report_session_detail_title=In der Sitzung durchgfef\u00FChrte \u00DCbungen report_header_activity=\u00DCbung report_header_actions=Aktionen report_header_score=Richtige report_header_solved=OK Y=J N=N report_session_detail_hide=Details der Sitzung nicht anzeigen report_header_sessions=Sitzungen report_all_activities=Alle \u00DCbungen report_activity=\u00DCbung: report_many=mehrere report_n_users=Benutzer group_admin_title=Gruppenverwaltung group_admin_new_button=Neue Gruppe \u2026 group_admin_groups=Gruppen report_actions=Aktionen group_admin_edit_button=Bearbeiten... user_admin_title=Benutzerverwaltung group_admin_delete_button=L\u00F6schen... group_admin_clear_button=Berichte l\u00F6schen... group_admin_properties=Gruppeneigenschaften group_admin_name=Name: group_admin_id=Benutzername: group_admin_icon=Symbol: error=ERROR return=zur\u00FCck... group_admin_users=Benutzer group_admin_no_users=Keine Benutzer in dieser Gruppe vorhanden. group_admin_create_user_button=Einen neuen Benutzer erstellen... cancel=Abbrechen group_admin_invalid_name=Falscher Gruppenname! group_admin_invalid_id=Falscher Gruppenname! group_admin_id_already_exists=Es wurde bereits eine andere Gruppe mit gleichem Namen in die Datenbank eingetragen! group_admin_delete_group=Gruppe l\u00F6schen report_areyousure=Sind Sie sicher? YES=Ja NOT=Nein group_admin_delete_group_explain=Dieser Vorgang l\u00F6scht alle User der ausgew\u00E4hlten Gruppe aus der Datenbank. Alle Daten der ausgew\u00E4hlten User werden gel\u00F6scht. db_error=Vorgang konnte nicht durchgef\u00FChrt werden. group_admin_clear_group=Daten der Gruppe l\u00F6schen group_admin_clear_group_explain=Dieser Vorgang l\u00F6scht alle \u00DCbungsberichte f\u00FCr die Mitglieder der ausgew\u00E4hlten Gruppe im angegebenen Zeitraum aus der Datenbank. db_clear_reports_date=Daten l\u00F6schen user_admin_invalid_name=Ung\u00FCltiger Benutzername. user_admin_invalid_id=Ung\u00FCltiger Benutzername user_admin_id_already_exists=Benutzername wird bereits von einem anderen Benutzer verwendet! user_admin_user_deleted=Benutzer erfolgreich aus der Datenbank gel\u00F6scht. user_admin_id=Benutzername: user_admin_name=Name: user_admin_icon=Symbol: user_admin_edit_button=Bearbeiten... user_admin_delete_button=L\u00F6schen... user_admin_clear_button=Berichte l\u00F6schen... user_admin_delete_user=Benutzer l\u00F6schen user_admin_delete_user_explain=Dieser Vorgang l\u00F6scht den ausgew\u00E4hlten Benutzer und alle dazugeh\u00F6rigen Berichte aus der Datenbank. user_admin_clear_user=Benutzerdaten l\u00F6schen user_admin_clear_user_explain=Dieser Vorgang l\u00F6scht alle Ergebnisse des ausgew\u00E4hlten Benutzers innerhalb des angegebenen Zeitraums aus der Datenbank. success=Vorgang erfolgreich abgeschlossen bad_data=Falsche Eingabe! db_admin_param_lap=Zeitabstand zwischen Verbindungen (in Sekunden): jclic_reports=JClic Reports YES_SHORT=J NOT_SHORT=N user_admin_pw_prompt=Passwort: user_admin_pw_prompt_confirm=Passwort best\u00E4tigen: user_admin_err_bad_pw=Falsches Passwort\\!\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_el.properties000066400000000000000000000453311335566474600314160ustar00rootroot00000000000000login_pwd=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2: login_desc=\u03A0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B4\u03CE\u03C3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1\u03BD \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03BA\u03C4\u03AE\u03C3\u03B5\u03C4\u03B5 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD. login_title=\u0395\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2 submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE... login_incorrect=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 main_title=\u039A\u03CD\u03C1\u03B9\u03BF \u039C\u03B5\u03BD\u03BF\u03CD users_admin_title=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD \u03BA\u03B1\u03B9 \u03BF\u03BC\u03AC\u03B4\u03C9\u03BD group_report_title=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 user_report_title=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 act_report_title=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 db_admin_title=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03B2\u03AC\u03C3\u03B7\u03C2 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD db_admin_settings_error=\u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03BF\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03BD\u03AD\u03C9\u03BD \u03C4\u03B9\u03BC\u03CE\u03BD \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD! db_admin_param_agc=\u0395\u03C0\u03B9\u03C4\u03C1\u03AD\u03C0\u03B5\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF\u03C5\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03BF\u03CD\u03BD \u03BD\u03AD\u03B5\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B5\u03C2 db_admin_param_auc=\u0395\u03C0\u03B9\u03C4\u03C1\u03AD\u03C0\u03B5\u03C4\u03B1\u03B9 \u03C3\u03C4\u03BF\u03C5\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03BF\u03CD\u03BD \u03BD\u03AD\u03BF\u03C5\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 db_admin_param_shgl=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1\u03BD \u03BA\u03B1\u03C4\u03AC\u03BB\u03BF\u03B3\u03BF db_admin_param_shul=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03BF\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1\u03BD \u03BA\u03B1\u03C4\u03AC\u03BB\u03BF\u03B3\u03BF db_admin_param_ut=\u0397 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03B4\u03B9\u03B1\u03B8\u03AD\u03C4\u03B5\u03B9 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B5\u03C2 \u03BC\u03B5 \u03C4\u03BF\u03C5\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 \u03BA\u03B1\u03B9 \u03C4\u03B9\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B5\u03C2 db_admin_edit_btn=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD db_admin_pw_edit_btn=\u039F\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2... title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2 db_admin_edit_title=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03C4\u03B7\u03C2 \u03B2\u03AC\u03C3\u03B7\u03C2 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD db_admin_pw_edit_title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03C3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 db_admin_pw_newPwd=\u039D\u03AD\u03BF\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 db_admin_pw_verifyPwd=\u03A0\u03BB\u03B7\u03BA\u03C4\u03C1\u03BF\u03BB\u03BF\u03B3\u03AE\u03C3\u03C4\u03B5 \u03BE\u03B1\u03BD\u03AC \u03C4\u03BF\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 db_admin_pw_noFit=\u039F \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B4\u03B5\u03BD \u03C4\u03B1\u03B9\u03C1\u03B9\u03AC\u03B6\u03B5\u03B9! report_group=\u039F\u03BC\u03AC\u03B4\u03B1: report_user=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2: report_project=\u0388\u03C1\u03B3\u03BF: report_all_projects=\u038C\u03BB\u03B1 \u03C4\u03B1 \u03AD\u03C1\u03B3\u03B1 report_key=\u039A\u03BB\u03B5\u03B9\u03B4\u03AF: report_code=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2: report_context=\u03A0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD: report_from=\u0391\u03C0\u03CC: month_1=\u0399\u03B1\u03BD\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2 month_2=\u03A6\u03B5\u03B2\u03C1\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2 month_3=\u039C\u03AC\u03C1\u03C4\u03B9\u03BF\u03C2 month_4=\u0391\u03C0\u03C1\u03AF\u03BB\u03B9\u03BF\u03C2 month_5=\u039C\u03AC\u03B9\u03BF\u03C2 month_6=\u0399\u03BF\u03CD\u03BD\u03B9\u03BF\u03C2 month_7=\u0399\u03BF\u03CD\u03BB\u03B9\u03BF\u03C2 month_8=\u0391\u03CD\u03B3\u03BF\u03C5\u03C3\u03C4\u03BF\u03C2 month_9=\u03A3\u03B5\u03C0\u03C4\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2 month_10=\u039F\u03BA\u03C4\u03CE\u03B2\u03C1\u03B9\u03BF\u03C2 month_11=\u039D\u03BF\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2 month_12=\u0394\u03B5\u03BA\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2 report_to=\u03A0\u03C1\u03BF\u03C2: report_global_precision=\u039A\u03B1\u03B8\u03BF\u03BB\u03B9\u03BA\u03AE \u03B1\u03BA\u03C1\u03AF\u03B2\u03B5\u03B9\u03B1 report_solved_activities=\u0395\u03C0\u03B9\u03BB\u03C5\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 report_user_evolution=\u0395\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7 \u03C4\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 report_group_evolution=\u0395\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7 \u03C4\u03B7\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 report_project_evolution=\u0395\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7 \u03C4\u03BF\u03C5 \u03AD\u03C1\u03B3\u03BF\u03C5 report_result_distribution=\u0394\u03B9\u03B1\u03BD\u03BF\u03BC\u03AE \u03B1\u03C0\u03BF\u03C4\u03B5\u03BB\u03B5\u03C3\u03BC\u03AC\u03C4\u03C9\u03BD report_no_data=\u0394\u0395\u039D \u03A5\u03A0\u0391\u03A1\u03A7\u039F\u03A5\u039D \u0394\u0395\u0394\u039F\u039C\u0395\u039D\u0391 report_users=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2; report_sessions=\u03A3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B5\u03C2: report_projects=\u0388\u03C1\u03B3\u03B1: report_actDone=\u039F\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03C9\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2: report_actSolved=\u0395\u03C0\u03B9\u03BB\u03C5\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2: report_totalTime=\u03A3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03CC\u03C2 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C2: report_globalPrec=\u03A3\u03C5\u03BD\u03BF\u03BB\u03B9\u03BA\u03AE \u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1 report_globalSummary=\u0393\u03B5\u03BD\u03B9\u03BA\u03AE \u03C3\u03CD\u03BD\u03BF\u03C8\u03B7 report_header_date=\u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 report_session_list=\u03A3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B5\u03C2: report_header_user=\u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 report_header_project=\u03AD\u03C1\u03B3\u03BF report_header_numActs=\u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 report_header_actsSolved=\u03B5\u03C0\u03B9\u03BB\u03C5\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 report_header_time=\u03C7\u03C1\u03CC\u03BD\u03BF\u03C2 report_header_prec=\u03B2\u03B1\u03B8\u03BC\u03BF\u03BB\u03BF\u03B3\u03AF\u03B1 report_session_detail_show=\u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03C3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B1\u03C2 report_session_detail_title=\u03A0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03C3\u03B5 \u03B1\u03C5\u03C4\u03AE \u03C4\u03B7 \u03C3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B1 report_header_activity=\u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 report_header_actions=\u03B5\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B5\u03C2 report_header_score=\u03B4\u03B9\u03BF\u03C1\u03B8\u03CE\u03BD\u03B5\u03B9 report_header_solved=\u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9 Y=\u039D\u03B1\u03B9 N=\u038C\u03C7\u03B9 report_session_detail_hide=\u03B1\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03BB\u03B5\u03C0\u03C4\u03BF\u03BC\u03B5\u03C1\u03B5\u03B9\u03CE\u03BD \u03C3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B1\u03C2 report_header_sessions=\u03C3\u03C5\u03BD\u03B5\u03B4\u03C1\u03AF\u03B5\u03C2 report_all_activities=\u038C\u03BB\u03B5\u03C2 \u03BF\u03B9 \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 report_activity=\u0394\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1: report_many=\u03B1\u03C1\u03BA\u03B5\u03C4\u03AC report_n_users=\u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 group_admin_title=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03BF\u03BC\u03AC\u03B4\u03C9\u03BD group_admin_new_button=\u039D\u03AD\u03B1 \u03BF\u03BC\u03AC\u03B4\u03B1... group_admin_groups=\u039F\u03BC\u03AC\u03B4\u03B5\u03C2 report_actions=\u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B5\u03C2 group_admin_edit_button=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1... user_admin_title=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 group_admin_delete_button=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE... group_admin_clear_button=\u039A\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD... group_admin_properties=\u0399\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 group_admin_name=\u038C\u03BD\u03BF\u03BC\u03B1: group_admin_id=\u0391\u03BD\u03B1\u03B3\u03BD\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC: group_admin_icon=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF: error=\u03A3\u03A6\u0391\u039B\u039C\u0391 return=\u03B5\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE group_admin_users=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 group_admin_no_users=\u0391\u03C5\u03C4\u03AE \u03B7 \u03BF\u03BC\u03AC\u03B4\u03B1 \u03B4\u03B5\u03BD \u03B4\u03B9\u03B1\u03B8\u03AD\u03C4\u03B5\u03B9 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2. group_admin_create_user_button=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03BD\u03AD\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7... cancel=\u0386\u03BA\u03C5\u03C1\u03BF group_admin_invalid_name=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2! group_admin_invalid_id=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF \u03B1\u03BD\u03B1\u03B3\u03BD\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2! group_admin_id_already_exists=\u03A5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03BC\u03B9\u03B1 \u03AC\u03BB\u03BB\u03B7 \u03BF\u03BC\u03AC\u03B4\u03B1 \u03C3\u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5 \u03C4\u03BF \u03AF\u03B4\u03B9\u03BF \u03B1\u03BD\u03B1\u03B3\u03BD\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC! group_admin_delete_group=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 report_areyousure=\u03A3\u03AF\u03B3\u03BF\u03C5\u03C1\u03B1; YES=\u039D\u03B1\u03B9 NOT=\u038C\u03C7\u03B9 group_admin_delete_group_explain=\u0391\u03C5\u03C4\u03AE \u03B7 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B8\u03B1 \u03C3\u03B2\u03AE\u03C3\u03B5\u03B9 \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 \u03B1\u03C5\u03C4\u03AE\u03C2 \u03C4\u03B7\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 \u03B1\u03C0\u03CC \u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD. \u038C\u03BB\u03B1 \u03C4\u03B1 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1 \u03B1\u03C5\u03C4\u03CE\u03BD \u03C4\u03C9\u03BD \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD \u03B8\u03B1 \u03C7\u03B1\u03B8\u03BF\u03CD\u03BD. db_error=\u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03B5\u03BA\u03C0\u03BB\u03AE\u03C1\u03C9\u03C3\u03B7\u03C2 \u03C4\u03BF\u03C5 \u03C3\u03C4\u03CC\u03C7\u03BF\u03C5. group_admin_clear_group=\u039A\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC\u03C2 \u03C4\u03B7\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 group_admin_clear_group_explain=\u0391\u03C5\u03C4\u03AE \u03B7 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B8\u03B1 \u03BA\u03B1\u03B8\u03B1\u03C1\u03AF\u03C3\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03C4\u03C9\u03BD \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03BF\u03C0\u03BF\u03B9\u03AE\u03B8\u03B7\u03BA\u03B1\u03BD \u03B1\u03C0\u03CC \u03C4\u03B1 \u03BC\u03AD\u03BB\u03B7 \u03B1\u03C5\u03C4\u03AE\u03C2 \u03C4\u03B7\u03C2 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03C4\u03C9\u03BD \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03B9\u03CE\u03BD. db_clear_reports_date=\u039A\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC\u03C2 user_admin_invalid_name=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7. user_admin_invalid_id=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF \u03B1\u03BD\u03B1\u03B3\u03BD\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7. user_admin_id_already_exists=\u03A5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03AD\u03BD\u03B1\u03C2 \u03AC\u03BB\u03BB\u03BF \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03BC\u03B5 \u03C4\u03BF \u03AF\u03B4\u03B9\u03BF \u03B1\u03BD\u03B1\u03B3\u03BD\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC \u03C3\u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD! user_admin_user_deleted=\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B1\u03C6\u03B1\u03B9\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5 \u03BC\u03B5 \u03B5\u03C0\u03B9\u03C4\u03C5\u03C7\u03AF\u03B1 \u03B1\u03C0\u03CC \u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD. user_admin_id=\u0391\u03BD\u03B1\u03B3\u03BD\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC: user_admin_name=\u038C\u03BD\u03BF\u03BC\u03B1: user_admin_icon=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF: user_admin_edit_button=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1... user_admin_delete_button=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE... user_admin_clear_button=\u039A\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD... user_admin_delete_user=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 user_admin_delete_user_explain=\u0391\u03C5\u03C4\u03AE \u03B7 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B8\u03B1 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03C8\u03B5\u03B9 \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03BA\u03B1\u03B9 \u03C4\u03B9\u03C2 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03C0\u03CC \u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD. user_admin_clear_user=\u039A\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC\u03C2 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 user_admin_clear_user_explain=\u0391\u03C5\u03C4\u03AE \u03B7 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B8\u03B1 \u03BA\u03AC\u03BD\u03B5\u03B9 \u03B5\u03BA\u03BA\u03B1\u03B8\u03AC\u03C1\u03B9\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD \u03BA\u03B1\u03B9 \u03C4\u03C9\u03BD \u03B4\u03C1\u03B1\u03C3\u03C4\u03B7\u03C1\u03B9\u03BF\u03C4\u03AE\u03C4\u03C9\u03BD \u03C0\u03BF\u03C5 \u03AD\u03B3\u03B9\u03BD\u03B1\u03BD \u03B1\u03C0\u03CC \u03B1\u03C5\u03C4\u03CC\u03BD \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03C4\u03C9\u03BD \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03B9\u03CE\u03BD. success=\u0395\u03C0\u03B9\u03C4\u03C5\u03C7\u03AE\u03C2 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 bad_data=\u039B\u03AC\u03B8\u03BF\u03C2 \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1! db_admin_param_lap=\u03A7\u03C1\u03CC\u03BD\u03BF\u03C2 \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03C4\u03C9\u03BD \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03B5\u03C9\u03BD (\u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1): jclic_reports=\u0391\u03BD\u03B1\u03C6\u03BF\u03C1\u03AD\u03C2 \u03C4\u03BF\u03C5 JClic YES_SHORT=\u039D\u03B1\u03B9 NOT_SHORT=\u038C\u03C7\u03B9 user_admin_pw_prompt=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2: user_admin_pw_prompt_confirm=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2: user_admin_err_bad_pw=\u039F \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B4\u03B5\u03BD \u03C4\u03B1\u03B9\u03C1\u03B9\u03AC\u03B6\u03B5\u03B9: src/report/reportServlets/edu/xtec/resources/messages/reportMessages_es.properties000066400000000000000000000134701335566474600314240ustar00rootroot00000000000000login_pwd=Contrase\u00F1a: login_desc=Debe escribir una contrase\u00F1a correcta para acceder a la base de datos de informes. login_title=Conexi\u00F3n a la base de datos submit=Enviar datos... login_incorrect=Contrase\u00F1a incorrecta! main_title=Men\u00FA principal users_admin_title=Administraci\u00F3n de grupos y usuarios group_report_title=Informes de grupo user_report_title=Informes de usuario/a act_report_title=Informes de actividad db_admin_title=Administraci\u00F3n de la base de datos db_admin_settings_error=\u00A1No se han podido cambiar los valores de la base de datos! db_admin_param_agc=Permitir a los usuarios crear nuevos grupos db_admin_param_auc=Permitir a los usuarios la creaci\u00F3n de nuevos usuarios db_admin_param_shgl=Seleccionar grupo en una lista db_admin_param_shul=Seleccionar el nombre de usuario/a en una lista db_admin_param_ut=La base de datos tiene tablas de usuarios y grupos db_admin_edit_btn=Editar propiedades... db_admin_pw_edit_btn=Establecer contrase\u00F1a... title=T\u00EDtulo db_admin_edit_title=Editar propiedades de la base de datos db_admin_pw_edit_title=Cambiar la contrase\u00F1a del sistema db_admin_pw_newPwd=Nueva contrase\u00F1a db_admin_pw_verifyPwd=Volver a escribir la contrase\u00F1a db_admin_pw_noFit=Los dos textos no coinciden! report_group=Grupo: report_user=Usuario: report_project=Proyecto: report_all_projects=Todos los proyectos report_key=Clave: report_code=C\u00F3digo: report_context=Contexto: report_from=Desde: month_1=enero month_2=febrero month_3=marzo month_4=abril month_5=mayo month_6=junio month_7=julio month_8=agosto month_9=septiembre month_10=octubre month_11=noviembre month_12=diciembre report_to=Hasta: report_global_precision=Precisi\u00F3n global report_solved_activities=Actividades resueltas report_user_evolution=Evoluci\u00F3n del usuario/a report_group_evolution=Evoluci\u00F3n del grupo report_project_evolution=Evoluci\u00F3n del proyecto report_result_distribution=Distribuci\u00F3n de resultados report_no_data=SIN DATOS report_users=Usuarios: report_sessions=Sessiones: report_projects=Proyectos: report_actDone=Actividades realizadas: report_actSolved=Actividades resueltas: report_totalTime=Tiempo total: report_globalPrec=Precisi\u00F3n global: report_globalSummary=Resumen global report_header_date=fecha report_session_list=Sesiones realizadas: report_header_user=usuario/a report_header_project=proyecto report_header_numActs=actividades report_header_actsSolved=act. resueltas report_header_time=tiempo report_header_prec=precisi\u00F3n report_session_detail_show=mostrar detalles de la sesi\u00F3n... report_session_detail_title=Actividades realizadas en la sesi\u00F3n report_header_activity=actividad report_header_actions=acciones report_header_score=aciertos report_header_solved=bien Y=S N=N report_session_detail_hide=esconder detalles de la sesi\u00F3n report_header_sessions=sesiones report_all_activities=Todas las actividades report_activity=Actividad: report_many=diversos report_n_users=usuarios group_admin_title=Administraci\u00F3n de grupos group_admin_new_button=Nuevo grupo... group_admin_groups=Grupos report_actions=Acciones group_admin_edit_button=Modificar... user_admin_title=Administraci\u00F3n de usuarios group_admin_delete_button=Eliminar... group_admin_clear_button=Eliminar informes... group_admin_properties=Propiedades del grupo group_admin_name=Nombre: group_admin_id=Identificador: group_admin_icon=Icono: error=ERROR return=regresar... group_admin_users=Usuarios group_admin_no_users=Este grupo no tiene ning\u00FAn usuario/a. group_admin_create_user_button=Crear un nuevo usuario/a... cancel=Cancelar group_admin_invalid_name=El nombre del grupo es incorrecto! group_admin_invalid_id=El identificador de grupo es incorrecto. group_admin_id_already_exists=\u00A1Ya existe un grupo con este identificador en la base de datos! group_admin_delete_group=Eliminar el grupo report_areyousure=\u00BFEst\u00E1 seguro? YES=S\u00ED NOT=No group_admin_delete_group_explain=Esta operaci\u00F3n eliminar\u00E1 tambi\u00E9n de la base de datos a todos los usuarios de este grupo. Todos sus datos se perder\u00E1n. db_error=No se ha podido realizar la operaci\u00F3n. group_admin_clear_group=Eliminar los informes del grupo group_admin_clear_group_explain=Esta operaci\u00F3n borrar\u00E1 todos los informes de las actividades realizadas por los miembros de este grupo entre las fechas indicadas. db_clear_reports_date=Eliminar los informes user_admin_invalid_name=El nombre de usuario/a es incorrecto. user_admin_invalid_id=El identificador de usuario/a es incorrecto! user_admin_id_already_exists=Ya existe otro usuario/a con este identificador en la base de datos. Los nombres se pueden repetir (en distintos grupos) pero los identificadores han de ser \u00FAnicos. user_admin_user_deleted=El usuario/a ha sido eliminado satisfactoriamente de la base de datos. user_admin_id=Identificador: user_admin_name=Nombre: user_admin_icon=Icono: user_admin_edit_button=Modificar... user_admin_delete_button=Eliminar... user_admin_clear_button=Eliminar informes... user_admin_delete_user=Eliminar el usuario/a user_admin_delete_user_explain=Esta operaci\u00F3n eliminar\u00E1 al usuario/a y sus informes de la base de datos. user_admin_clear_user=Eliminar los informes del usuario/a user_admin_clear_user_explain=Esta operaci\u00F3n eliminar\u00E1 los informes de las actividades realizadas por este/a usuario(a en el periodo especificado. success=Operaci\u00F3n realizada con \u00E9xito bad_data=\u00A1Datos incorrectos! db_admin_param_lap=Tiempo entre conexiones (segundos): jclic_reports=Informes JClic YES_SHORT=S NOT_SHORT=N user_admin_pw_prompt=Contrase\u00F1a: user_admin_pw_prompt_confirm=Confirmar contrase\u00F1a: user_admin_err_bad_pw=\u00A1Las contrase\u00F1as no coinciden\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_eu.properties000066400000000000000000000123761335566474600314320ustar00rootroot00000000000000login_pwd=Pasahitza: login_desc=Txostenen datu-basera sartzeko balio duen pasahitza lortu behar duzu. login_title=Saioa hasi submit=Bildatzen... login_incorrect=Pasahitza ez da zuzena! main_title=Menu nagusia users_admin_title=Erabiltzaile eta taldeen kudeaketa group_report_title=Talde-txostenak user_report_title=Erabiltzailearen txostenak act_report_title=Jarduera-txostenak db_admin_title=Datu-basearen kudeatzailea db_admin_settings_error=Datu-basearen baloreak ezin dira aldatu! db_admin_param_agc=Utzi erabiltzaileei talde berriak sortzen db_admin_param_auc=Utzi erabiltzaileei erabiltzaile berriak sortzen db_admin_param_shgl=Aukeratu taldea zerrendatik db_admin_param_shul=Aukeratu erabiltzaile-izena zerrendatik db_admin_param_ut=Datu-baseak erabiltzaile eta taldeen taulak ditu db_admin_edit_btn=Editatu ezarpenak... db_admin_pw_edit_btn=Ezarri pasahitza... title=Izenburua db_admin_edit_title=Editatu datu-basearen ezarpenak db_admin_pw_edit_title=Aldatu sistemaren pasahitza db_admin_pw_newPwd=Pasahitz berria db_admin_pw_verifyPwd=Idatzi berriz pasahitza db_admin_pw_noFit=Bi testuak ez datoz bat! report_group=Taldea: report_user=Erabiltzailea: report_project=Proiektua: report_all_projects=Proiektu guztiak report_key=Giltza: report_code=Kodea: report_context=Testuingurua: report_from=Hemendik: month_1=urtarrila month_2=otsaila month_3=martxoa month_4=apirila month_5=maiatza month_6=ekaina month_7=uztaila month_8=abuztua month_9=iraila month_10=urria month_11=azaroa month_12=abendua report_to=Hona: report_global_precision=Zehaztapen orokorra report_solved_activities=Egindako jarduerak report_user_evolution=Erabiltzailearen garapena report_group_evolution=Taldearen garapena report_project_evolution=Proiektuaren garapena report_result_distribution=Emaitzen banaketa report_no_data=DATURIK EZ report_users=Erabiltzaileak: report_sessions=Saioak: report_projects=Proiektuak: report_actDone=Burututako jarduerak: report_actSolved=Egindako jarduerak: report_totalTime=Denbora guztira: report_globalPrec=Puntuazio orokorra: report_globalSummary=Laburpen orokorra report_header_date=data report_session_list=Saioak: report_header_user=erabiltzailea report_header_project=proiektua report_header_numActs=jarduerak report_header_actsSolved=egindako jarduerak report_header_time=denbora report_header_prec=puntuazioa report_session_detail_show=erakutsi saioaren zehaztasunak report_session_detail_title=Saioan egindako jarduerak report_header_activity=jarduera report_header_actions=ekintzak report_header_score=zuzenak report_header_solved=ados Y=B N=E report_session_detail_hide=ezkutatu saioaren zehaztasunak report_header_sessions=saioak report_all_activities=Jarduera guztiak report_activity=Jarduera: report_many=gehiegi report_n_users=erabiltzaileak group_admin_title=Taldeen kudeaketa group_admin_new_button=Talde berria... group_admin_groups=Taldeak report_actions=Ekintzak group_admin_edit_button=Editatu... user_admin_title=Erabiltzaileen kudeatzailea group_admin_delete_button=Ezabatu... group_admin_clear_button=Garbitu txostenak... group_admin_properties=Taldearen propietateak group_admin_name=Izena: group_admin_id=Identifikatzailea: group_admin_icon=Ikonoa: error=ERROREA return=itzuli... group_admin_users=Erabiltzaileak group_admin_no_users=Taldeak ez du erabiltzailerik. group_admin_create_user_button=Sortu erabiltzaile berria... cancel=Utzi group_admin_invalid_name=Okerreko talde-izena! group_admin_invalid_id=Okerreko talde-identifikatzailea! group_admin_id_already_exists=Bada beste talde bat identifikatzaile bera duena datu-basean! group_admin_delete_group=Ezabatu taldea report_areyousure=Ziur al zaude? YES=Bai NOT=Ez group_admin_delete_group_explain=Eragiketa honek talde honetako erabiltzaile guztiak ere ezabatuko ditu datu-basetik . Horien datu guztiak galdu egingo dira. db_error=Ezin izan da eragiketa burutu. group_admin_clear_group=Ezabatu taldearen txostenak group_admin_clear_group_explain=Adierazitako daten artean talde honetako erabiltzaileek egindako jardueren txostenak ezabatuko ditu eragiketa honek. db_clear_reports_date=Ezabatu txostenak user_admin_invalid_name=Okerreko erabiltzaile-izena user_admin_invalid_id=Okerreko erabiltzaile-identifikatzailea user_admin_id_already_exists=Bada datu-basean identifikatzaile bera duen beste erabiltzaile bat! user_admin_user_deleted=Erabiltzailea egoki ezabatu da datu-basetik. user_admin_id=Identifikatzailea: user_admin_name=Izena: user_admin_icon=Ikonoa: user_admin_edit_button=Editatu... user_admin_delete_button=Ezabatu... user_admin_clear_button=Garbitu txostenak... user_admin_delete_user=Ezabatu erabiltzailea user_admin_delete_user_explain=Eragiketa honek erabiltzaile hau eta bere txostenak datu-basetik ezabatuko ditu. user_admin_clear_user=Ezabatu erabiltzaile-txostena user_admin_clear_user_explain=Eragiketa honek adierazitako denbora-tartean erabiltzaile honek egindako jardueren txostenak ezabatuko ditu. success=Eragiketa ondo burutu da bad_data=Datuak ez dira zuzenak! db_admin_param_lap=Konexio arteko denbora-tartea (segundutan): jclic_reports=JClic txostenak YES_SHORT=B NOT_SHORT=E user_admin_pw_prompt=Pasahitza: user_admin_pw_prompt_confirm=Konfirmatu pasahitza: user_admin_err_bad_pw=Pasahitzak ez datoz bat\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_fr.properties000066400000000000000000000135741335566474600314310ustar00rootroot00000000000000login_pwd=Mot de passe: login_desc=Vous devez donner un mot de passe valide pour acc\u00E9der \u00E0 la base de rapports. login_title=Login submit=Soumettre... login_incorrect=Mot de passe incorrect\\! main_title=Menu principal users_admin_title=Administrateur d'utilisateurs et de groupes group_report_title=Rapports de groupe user_report_title=Rapports utilisateur act_report_title=Rapports d'activit\u00E9s db_admin_title=Administrateur de la base de donn\u00E9es db_admin_settings_error=Impossible de d\u00E9finir les valeurs de la nouvelle base de donn\u00E9es\\! db_admin_param_agc=Autoriser les utilisateurs \u00E0 cr\u00E9er de nouveaux groupes db_admin_param_auc=Autoriser les utilisateurs \u00E0 cr\u00E9er de nouveaux utilisateurs db_admin_param_shgl=S\u00E9lectionner un groupe dans une liste db_admin_param_shul=S\u00E9lectionner un nom d'utilisateur dans une liste db_admin_param_ut=La base de donn\u00E9es contient des tables d'utilisateurs et de groupes db_admin_edit_btn=Editer les param\u00E8tres... db_admin_pw_edit_btn=D\u00E9finir le mot de passe... title=Titre db_admin_edit_title=Editer les param\u00E8tres de la base de donn\u00E9es db_admin_pw_edit_title=Changer le mot de passe syst\u00E8me db_admin_pw_newPwd=Nouveau mot de passe db_admin_pw_verifyPwd=Retapez le mot de passe db_admin_pw_noFit=Les champs mot de passe ne doivent pas rester vides report_group=Groupe : report_user=Utilisateur: report_project=Projet: report_all_projects=Tous les projets report_key=Cl\u00E9: report_code=Code: report_context=Contexte: report_from=DE: month_1=janvier month_2=f\u00E9vrier month_3=mars month_4=avril month_5=mai month_6=juin month_7=juillet month_8=ao\u00FBt month_9=septembre month_10=octobre month_11=novembre month_12=d\u00E9cembre report_to=A: report_global_precision=Pr\u00E9cision globale report_solved_activities=Activit\u00E9s r\u00E9solues report_user_evolution=Evolution de l'utilisateur report_group_evolution=Evolution du groupe report_project_evolution=Evolution du projet report_result_distribution=Distribution du r\u00E9sultat report_no_data=PAS DE DONN\u00C9ES report_users=Utilisateurs: report_sessions=Sessions: report_projects=Projets: report_actDone=Activit\u00E9s faites: report_actSolved=Activit\u00E9s r\u00E9solues: report_totalTime=Temps total: report_globalPrec=Score global: report_globalSummary=Sommaire g\u00E9n\u00E9ral report_header_date=date report_session_list=Sessions: report_header_user=utilisateur report_header_project=projet report_header_numActs=activit\u00E9s report_header_actsSolved=acts. r\u00E9solues report_header_time=temps report_header_prec=score report_session_detail_show=Montrer les d\u00E9tails de session report_session_detail_title=Activit\u00E9s faites pendant la session report_header_activity=activit\u00E9 report_header_actions=actions report_header_score=correctes report_header_solved=ok Y=O N=N report_session_detail_hide=Cacher les d\u00E9tails de session report_header_sessions=sessions report_all_activities=Toutes les activit\u00E9s report_activity=Activit\u00E9: report_many=plusieurs report_n_users=utilisateurs group_admin_title=Administration des groupes group_admin_new_button=Nouveau groupe... group_admin_groups=Groupes report_actions=Actions group_admin_edit_button=Editer... user_admin_title=Utilisateur admin group_admin_delete_button=Supprimer... group_admin_clear_button=Effacer rapports... group_admin_properties=Groupe propri\u00E9t\u00E9s group_admin_name=Nom\u00A0: group_admin_id=Identifiant\u00A0: group_admin_icon=Ic\u00F4ne: error=ERREUR return=retour... group_admin_users=Utilisateurs group_admin_no_users=Ce groupe n'a pas d'utilisateurs. group_admin_create_user_button=Cr\u00E9er un nouvel utilisateur... cancel=Annuler group_admin_invalid_name=Nom de groupe incorrect\\! group_admin_invalid_id=L'identifiant de groupe est incorrect\\! group_admin_id_already_exists=Il y a un autre groupe avec le m\u00EAme identifiant dans la base de donn\u00E9es\\! group_admin_delete_group=Supprimer le groupe report_areyousure=Etes-vous s\u00FBr ? YES=Oui NOT=Non group_admin_delete_group_explain=Cette op\u00E9ration effacera aussi dans la base de donn\u00E9es tous les utilisateurs de ce groupe. Toutes les donn\u00E9es de ces utilisateurs seront perdues. db_error=Impossible de terminer la t\u00E2che. group_admin_clear_group=Effacer les donn\u00E9es du rapport du groupe group_admin_clear_group_explain=Cette op\u00E9ration effacera tous les rapports d'activit\u00E9s faites par les membres de ce groupe entre deux dates sp\u00E9cifi\u00E9es. db_clear_reports_date=Effacer les donn\u00E9es du rapport. user_admin_invalid_name=Nom d'utilisateur invalide. user_admin_invalid_id=Identifiant utilisateur invalide user_admin_id_already_exists=Il y a un autre utilisateur avec le m\u00EAme identifiant dans la base de donn\u00E9es\\! user_admin_user_deleted=L'utilisateur a \u00E9t\u00E9 supprim\u00E9 de la base de donn\u00E9es. user_admin_id=Identifiant: user_admin_name=Nom\u202F: user_admin_icon=Ic\u00F4ne\u202F: user_admin_edit_button=\u00C9diter... user_admin_delete_button=Supprimer... user_admin_clear_button=Effacer les rapports... user_admin_delete_user=Supprimer l'utilisateur user_admin_delete_user_explain=Cette op\u00E9ration supprimera cet utilisateur et ses rapports de la base de donn\u00E9es. user_admin_clear_user=Effacer les donn\u00E9es du rapport de l'utilisateur user_admin_clear_user_explain=Cette op\u00E9ration effacera tous les rapports d'activit\u00E9s faites par cet utilisateur entre des dates sp\u00E9cifi\u00E9es. success=Op\u00E9ration r\u00E9ussie bad_data=Mauvaise donn\u00E9e\\! db_admin_param_lap=Temps entre les connections (secondes): jclic_reports=JClic rapports YES_SHORT=O NOT_SHORT=N user_admin_pw_prompt=Mot de passe: user_admin_pw_prompt_confirm=Confirmer mot de passe: user_admin_err_bad_pw=Les mots de passe ne coincident pas\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_gl.properties000066400000000000000000000132501335566474600314130ustar00rootroot00000000000000login_pwd=Contrasinal: login_desc=\u00C9 imprescind\u00EDbel escribir un contrasinal correcto para acceder \u00E1 base de datos de informes. login_title=Conexi\u00F3n \u00E1 base de datos submit=Enviar datos... login_incorrect=Contrasinal incorrecto! main_title=Men\u00FA principal users_admin_title=Administraci\u00F3n de grupos e usuarios group_report_title=Informes de grupo user_report_title=Informes de usuario/a act_report_title=Informes de actividade db_admin_title=Administraci\u00F3n da base de datos db_admin_settings_error=Non \u00E9 pos\u00EDbel mudar os valores na base de datos! db_admin_param_agc=Permitir aos usuarios crear novos grupos db_admin_param_auc=Permitir aos usuarios crear novos usuarios db_admin_param_shgl=Seleccionar grupo nunha lista db_admin_param_shul=Seleccionar nome de usuario/a nunha lista db_admin_param_ut=A base de datos cont\u00E9n t\u00E1boas de usuarios e grupos db_admin_edit_btn=Editar propiedades... db_admin_pw_edit_btn=Estabelecer o contrasinal... title=T\u00EDtulo db_admin_edit_title=Editar as propiedades da base de datos db_admin_pw_edit_title=Cambiar o contrasinal do sistema db_admin_pw_newPwd=Novo contrasinal db_admin_pw_verifyPwd=Escribir de novo o contrasinal db_admin_pw_noFit=Os dous contrasinais non coinciden! report_group=Grupo: report_user=Usuario: report_project=Proxecto: report_all_projects=Todos os proxectos report_key=Chave: report_code=C\u00F3digo: report_context=Contexto: report_from=Desde: month_1=xaneiro month_2=febreiro month_3=marzo month_4=abril month_5=maio month_6=xu\u00F1o month_7=xullo month_8=agosto month_9=setembro month_10=outubro month_11=novembro month_12=decembro report_to=Ata: report_global_precision=Precisi\u00F3n global report_solved_activities=Actividades resoltas: report_user_evolution=Evoluci\u00F3n do usuario report_group_evolution=Evoluci\u00F3n do grupo report_project_evolution=Evoluci\u00F3n do proxecto report_result_distribution=Distribuci\u00F3n de resultados report_no_data=SEN DATOS report_users=Usuarios: report_sessions=Sesi\u00F3ns: report_projects=Proxectos: report_actDone=Actividades feitas: report_actSolved=Actividades resoltas: report_totalTime=Tempo total: report_globalPrec=Puntuaci\u00F3n global: report_globalSummary=Resumo global report_header_date=data report_session_list=Sesi\u00F3ns: report_header_user=usuario report_header_project=proxecto report_header_numActs=actividades report_header_actsSolved=acts. resoltas report_header_time=tempo report_header_prec=puntuaci\u00F3n report_session_detail_show=mostrar detalles da sesi\u00F3n report_session_detail_title=Actividades feitas na sesi\u00F3n report_header_activity=actividade report_header_actions=acci\u00F3ns report_header_score=acertos report_header_solved=ben Y=S N=N report_session_detail_hide=agochar detalles da sesi\u00F3n report_header_sessions=sesi\u00F3ns report_all_activities=Todas as actividades report_activity=Actividade: report_many=diversos report_n_users=usuarios group_admin_title=Administraci\u00F3n de grupos group_admin_new_button=Novo grupo... group_admin_groups=Grupos report_actions=Acci\u00F3ns group_admin_edit_button=Modificar... user_admin_title=Administraci\u00F3n de usuarios group_admin_delete_button=Eliminar... group_admin_clear_button=Eliminar informes... group_admin_properties=Propiedades do grupo group_admin_name=Nome: group_admin_id=Identificador: group_admin_icon=Icona: error=ERRO return=volver... group_admin_users=Usuarios group_admin_no_users=Este grupo non ten usuarios. group_admin_create_user_button=Crear un novo usuario... cancel=Cancelar group_admin_invalid_name=Nome de grupo incorrecto! group_admin_invalid_id=Identificador de grupo incorrecto! group_admin_id_already_exists=Existe outro grupo co mesmo identificador na base de datos! group_admin_delete_group=Eliminar o grupo report_areyousure=Tes a seguridade de realizar esta operaci\u00F3n? YES=Si NOT=Non group_admin_delete_group_explain=Esta operaci\u00F3n tam\u00E9n eliminar\u00E1 da base de datos todos os usuarios deste grupo. Perderanse todos os seus datos. db_error=Non \u00E9 pos\u00EDbel completar a operaci\u00F3n. group_admin_clear_group=Eliminar os informes do grupo group_admin_clear_group_explain=Esta operaci\u00F3n eliminar\u00E1 os informes de actividade de todos os membros deste grupo entre as datas especificadas. db_clear_reports_date=Eliminar os informes user_admin_invalid_name=O nome de usuario/a \u00E9 incorrecto. user_admin_invalid_id=O identificador de usuario/a \u00E9 incorrecto! user_admin_id_already_exists=Hai outro/a usuario/a co mesmo identificador na base de datos! Os nomes poden repetirse (en grupos distintos) pero os identificadores deben ser \u00FAnicos. user_admin_user_deleted=O/a usuario/a foi eliminado/a axeitadamente da base de datos. user_admin_id=Identificador: user_admin_name=Nome: user_admin_icon=Icona: user_admin_edit_button=Modificar... user_admin_delete_button=Eliminar... user_admin_clear_button=Eliminar informes... user_admin_delete_user=Eliminar o/a usuario/a user_admin_delete_user_explain=Esta operaci\u00F3n eliminar\u00E1 o/a usuario/a e os seus informes da base de datos user_admin_clear_user=Eliminar os informes do usuario/a user_admin_clear_user_explain=Esta operaci\u00F3n eliminar\u00E1 os informes de actividades realizadas por este/a usuario/a entre as datas especificadas. success=Operaci\u00F3n realizada con \u00E9xito bad_data=Datos incorrectos! db_admin_param_lap=Tempo en segundos entre conexi\u00F3ns: jclic_reports=Informes JClic YES_SHORT=S NOT_SHORT=N user_admin_pw_prompt=Sinal: user_admin_pw_prompt_confirm=Confirmar contrasinal: user_admin_err_bad_pw=Os contrasinais non coinciden\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_it.properties000066400000000000000000000123331335566474600314260ustar00rootroot00000000000000login_pwd=Password: login_desc=Devi inserire una password valida per accedere al database dei rapporti. login_title=Login submit=Presenta... login_incorrect=Password errata! main_title=Menu principale users_admin_title=Amministratore degli utenti e dei gruppi group_report_title=Rapporti del gruppo user_report_title=Rapporti utente act_report_title=Rapporti d'attivit\u00E0 db_admin_title=Amministratore del database db_admin_settings_error=Impossibile definire i valori del nuovo database! db_admin_param_agc=Permetti agli utenti di creare nuovi gruppi db_admin_param_auc=Permetti agli utenti di creare nuovi utenti db_admin_param_shgl=Seleziona un gruppo in una lista db_admin_param_shul=Seleziona un nome utente in una lista db_admin_param_ut=Il database contiene tabelle di utenti e gruppi db_admin_edit_btn=Modifica i parametri... db_admin_pw_edit_btn=Imposta la password... title=Titolo db_admin_edit_title=Modifica la configurazione del database db_admin_pw_edit_title=Cambia la password di sistema db_admin_pw_newPwd=Nuova password db_admin_pw_verifyPwd=Riscrivi la password db_admin_pw_noFit=Le password non coincidono report_group=Gruppo: report_user=Utente: report_project=Progetto: report_all_projects=Tutti i progetti report_key=Chiave: report_code=Codice: report_context=Contesto: report_from=Da: month_1=gennaio month_2=febbraio month_3=marzo month_4=aprile month_5=maggio month_6=giugno month_7=luglio month_8=agosto month_9=settembre month_10=ottobre month_11=novembre month_12=dicembre report_to=A: report_global_precision=Precisione globale report_solved_activities=Attivit\u00E0 risolte report_user_evolution=Progressi dell'utente report_group_evolution=Progressi del gruppo report_project_evolution=Evoluzione del progetto report_result_distribution=Distribuzione dei risultati report_no_data=NESSUN DATO report_users=Utenti: report_sessions=Sessioni: report_projects=Progetti: report_actDone=Attivit\u00E0 eseguite: report_actSolved=Attivit\u00E0 risolte: report_totalTime=Tempo totale: report_globalPrec=Punteggio globale: report_globalSummary=Riassunto globale report_header_date=data report_session_list=Sessioni: report_header_user=utente report_header_project=progetto report_header_numActs=attivit\u00E0 report_header_actsSolved=att. risolte report_header_time=tempo report_header_prec=punteggio report_session_detail_show=mostra i dettagli della sessione report_session_detail_title=Attivit\u00E0 eseguite nella sessione report_header_activity=attivit\u00E0 report_header_actions=azioni report_header_score=corretti report_header_solved=ok Y=S N=N report_session_detail_hide=nascondi dettagli sessione report_header_sessions=sessioni report_all_activities=Tutte le attivit\u00E0 report_activity=Attivit\u00E0: report_many=diversi report_n_users=utenti group_admin_title=Amministrazione gruppi group_admin_new_button=Nuovo gruppo... group_admin_groups=Gruppi report_actions=Azioni group_admin_edit_button=Modifica... user_admin_title=Amministratore degli utenti group_admin_delete_button=Elimina... group_admin_clear_button=Elimina rapporti group_admin_properties=Propriet\u00E0 del gruppo group_admin_name=Nome: group_admin_id=Id. group_admin_icon=Icona: error=ERRORE return=indietro... group_admin_users=Utenti group_admin_no_users=Questo gruppo non ha utenti. group_admin_create_user_button=Crea un nuovo utente... cancel=Annulla group_admin_invalid_name=Nome del gruppo errato! group_admin_invalid_id=L'id del gruppo \u00E8 errato! group_admin_id_already_exists=Nel database c'\u00E8 un altro gruppo con lo stesso id! group_admin_delete_group=Elimina gruppo report_areyousure=Sei sicuro? YES=S\u00EC NOT=No group_admin_delete_group_explain=Questa operazione eliminer\u00E0 anche tutti gli utenti del gruppo nel database. Andranno persi tutti i dati di questi utenti. db_error=Impossibile completare l'operazione. group_admin_clear_group=Elimina i rapporti del gruppo group_admin_clear_group_explain=Questa operazione canceller\u00E0 tutti i rapporti sule attivit\u00E0 eseguite dagli utenti di questo gruppo tra le date specificate. db_clear_reports_date=Elimina i rapporti user_admin_invalid_name=Nome utente non valido. user_admin_invalid_id=User id non valido user_admin_id_already_exists=Nel database c'\u00E8 gi\u00E0 un altro utente con lo stesso id! user_admin_user_deleted=L'utente \u00E8 stato cancellato con successo dal database. user_admin_id=Id. user_admin_name=Nome: user_admin_icon=Icona: user_admin_edit_button=Modifica... user_admin_delete_button=Elimina... user_admin_clear_button=Elimina rapporti... user_admin_delete_user=Elimina l'utente user_admin_delete_user_explain=Questa operazione canceller\u00E0 l'utente e i suoi rapporti dal database. user_admin_clear_user=Elimina i rapporti dell'utente user_admin_clear_user_explain=Questa operazione canceller\u00E0 tutti i rapporti sule attivit\u00E0 eseguite dall'utente tra le date specificate. success=L'operazione ha avuto successo bad_data=Dati non corretti! db_admin_param_lap=Tempo tra le connessioni (secondi): jclic_reports=Rapporti JClic YES_SHORT=S NOT_SHORT=N user_admin_pw_prompt=Password: user_admin_pw_prompt_confirm=Conferma password: user_admin_err_bad_pw=Le password non coincidono\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_nl.properties000066400000000000000000000123121335566474600314200ustar00rootroot00000000000000login_pwd=Wachtwoord: login_desc=Je dient een geldig wachtwoord in te voeren om toegang te krijgen tot de rapporten database. login_title=Aanmelden submit=Verzenden... login_incorrect=Verkeer paswoord! main_title=Hoofdmenu users_admin_title=Gebruikers en groepen admin group_report_title=Groep rapporten user_report_title=Gebruikers rapport act_report_title=Activiteiten rapporten db_admin_title=Database admin db_admin_settings_error=Nieuwe database waarden kunnen niet ingevoerd worden! db_admin_param_agc=Laat gebruikers nieuwe groepen maken db_admin_param_auc=Laat gebruikers nieuwe gebruikers maken db_admin_param_shgl=Kies groep in een lijst db_admin_param_shul=Kies gebruikersnaam in een lijst db_admin_param_ut=Database heeft tabellen met gebruikers en groepen db_admin_edit_btn=Bewerk instellingen... db_admin_pw_edit_btn=Wachtwoord instellen... title=Titel db_admin_edit_title=Database instellingen bewerken db_admin_pw_edit_title=Verander systeem wachtwoord db_admin_pw_newPwd=Nieuw wachtwoord db_admin_pw_verifyPwd=Wachtwoord opnieuw invoeren db_admin_pw_noFit=Wachtwoorden komen niet overeen! report_group=Groep: report_user=Gebruiker: report_project=Project: report_all_projects=Alle projecten report_key=Sleutel: report_code=Code: report_context=Inhoud: report_from=Van: month_1=januari month_2=februari month_3=maart month_4=april month_5=mei month_6=juni month_7=juli month_8=augustus month_9=september month_10=oktober month_11=november month_12=december report_to=Tot: report_global_precision=Totale nauwkeurigheid report_solved_activities=Opgeloste activiteiten report_user_evolution=Vooruitgang gebruiker report_group_evolution=Vooruitgang groep report_project_evolution=Vooruitgang project report_result_distribution=Resultaat verdeling report_no_data=GEEN GEGEVENS report_users=Gebruikers: report_sessions=Reeksen: report_projects=Projecten: report_actDone=Activiteiten klaar: report_actSolved=Activiteiten opgelost: report_totalTime=Totale tijd: report_globalPrec=Puntentotaal: report_globalSummary=Samenvatting overzicht report_header_date=datum report_session_list=Reeksen: report_header_user=gebruiker report_header_project=project report_header_numActs=activiteiten report_header_actsSolved=opgeloste activiteiten report_header_time=tijd report_header_prec=punten report_session_detail_show=toon details reeks report_session_detail_title=activiteiten gedaan in reeks report_header_activity=activiteit report_header_actions=acties report_header_score=juist report_header_solved=ok Y=J N=N report_session_detail_hide=verberg details report_header_sessions=reeksen report_all_activities=Alle activiteiten report_activity=Activiteit: report_many=verschillende report_n_users=gebruikers group_admin_title=Groepen administratie group_admin_new_button=Nieuwe groep... group_admin_groups=Groepen report_actions=Acties group_admin_edit_button=Bewerken... user_admin_title=Gebruikers administratie group_admin_delete_button=Verwijder... group_admin_clear_button=Rapporten wissen... group_admin_properties=Groepseigenschappen group_admin_name=Naam: group_admin_id=Identificatie: group_admin_icon=Pictogram: error=FOUT return=verder... group_admin_users=Gebruikers group_admin_no_users=Deze groep heeft geen gebruikers group_admin_create_user_button=Maak nieuwe gebruiker... cancel=Annuleren group_admin_invalid_name=Verkeerde groepsnaam! group_admin_invalid_id=Verkeerde groepsidentificatie! group_admin_id_already_exists=Er is een andere groep met dezelfde identificatie in de database! group_admin_delete_group=Groep verwijderen report_areyousure=Weet u het zeker? YES=Ja NOT=Nee group_admin_delete_group_explain=Deze bewerking zal ook alle gebruikers van deze groep verwijderen. Alle gegevens zullen verloren gaan. db_error=Kan de opdracht niet afwerken. group_admin_clear_group=Rapport gegevens van de groep leeg maken group_admin_clear_group_explain=Deze operatie zal alle rapporten van de activiteiten van leden tussen de twee opgegeven datums van deze groep verwijderen db_clear_reports_date=Rapport gegevens verwijderen user_admin_invalid_name=Ongeldige gebruikers naam. user_admin_invalid_id=Ongeldige gebruiker identificatie user_admin_id_already_exists=Er is een andere gebruiker met dezelfde identificatie in de database! user_admin_user_deleted=De gebruiker is verwijderd uit de database. user_admin_id=Identificatie: user_admin_name=Naam: user_admin_icon=Pictogram: user_admin_edit_button=Bewerken... user_admin_delete_button=Verwijder... user_admin_clear_button=Rapporten wissen... user_admin_delete_user=Gebruiker verwijderen user_admin_delete_user_explain=Deze bewerking zal de gebruiker en zijn rapporten verwijderen uit deze database. user_admin_clear_user=Verwijder rapport gegevens van gebruiker user_admin_clear_user_explain=Deze bewerking zal alle rapporten van de activiteiten van deze gebruiker tussen de opgegeven datums verwijderen. success=Geslaagde bewerking bad_data=Verkeerde gegevens! db_admin_param_lap=Tijd tussen verbindingen (in seconden): jclic_reports=JClic rapporten YES_SHORT=J NOT_SHORT=N user_admin_pw_prompt=Wachtwoord: user_admin_pw_prompt_confirm=Bevestig wachtwoord: user_admin_err_bad_pw=Wachtwoorden komen niet overeen\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_pt.properties000066400000000000000000000131621335566474600314360ustar00rootroot00000000000000login_pwd=Palavra-chave: login_desc=\u00C9 necess\u00E1rio fornecer uma palavra-chave para ter acesso \u00E0 base de dados de relat\u00F3rios login_title=Utilizador submit=Enviar... login_incorrect=Palavra-chave incorreta main_title=Menu principal users_admin_title=Utilizadores e grupos admin group_report_title=Relat\u00F3rios do grupo user_report_title=Relat\u00F3rios do utilizador act_report_title=Relat\u00F3rios de actividades db_admin_title=Base de dados admin db_admin_settings_error=N\u00E3o foi poss\u00EDvel definir os valores da nova base de dados! db_admin_param_agc=Permitir que os utilizadores criem novos grupos db_admin_param_auc=Permitir que os utilizadores criem novos utilizadores db_admin_param_shgl=Selecione o grupo numa lista db_admin_param_shul=Escolha o nome de utilizador numa lista db_admin_param_ut=Base de dados possui tabelas de utilizadores e grupos db_admin_edit_btn=Edtiar configura\u00E7\u00F5es... db_admin_pw_edit_btn=Definir palavra-chave... title=T\u00EDtulo db_admin_edit_title=Editar configura\u00E7\u00F5es da base de dados db_admin_pw_edit_title=Alterar palavra-chave do sistema db_admin_pw_newPwd=Nova palavra-chave db_admin_pw_verifyPwd=Confirme a palavra-chave db_admin_pw_noFit=As palavras-chave s\u00E3o diferentes! report_group=Grupo: report_user=Utilizador: report_project=Projecto: report_all_projects=Todos os projectos report_key=Chave: report_code=C\u00F3digo: report_context=Contexto: report_from=De: month_1=Janeiro month_2=Fevereiro month_3=Mar\u00E7o month_4=Abril month_5=Maio month_6=Junho month_7=Julho month_8=Agosto month_9=Setembro month_10=Outubro month_11=Novembro month_12=Dezembro report_to=At\u00E9: report_global_precision=Precis\u00E3o global report_solved_activities=Actividades resolvidas report_user_evolution=Progresso do utilizador report_group_evolution=Progresso do grupo report_project_evolution=Progresso do projeto report_result_distribution=Distribui\u00E7\u00E3o do resultado report_no_data=SEM DADOS report_users=Utilizadores: report_sessions=Sess\u00F5es: report_projects=Projectos: report_actDone=Actividades realizadas: report_actSolved=Actividades resolvidas: report_totalTime=Dura\u00E7\u00E3o total: report_globalPrec=Pontua\u00E7\u00E3o global: report_globalSummary=Resumo global report_header_date=data report_session_list=Sess\u00F5es: report_header_user=Utilizador report_header_project=projecto report_header_numActs=actividades report_header_actsSolved=resolvidas report_header_time=tempo report_header_prec=acertos report_session_detail_show=mostrar pormenores da sess\u00E3o report_session_detail_title=Actividades conclu\u00EDdas na sess\u00E3o report_header_activity=actividade report_header_actions=ac\u00E7\u00F5es report_header_score=correctas report_header_solved=ok Y=S N=N report_session_detail_hide=Ocultar pomenores da sess\u00E3o report_header_sessions=sess\u00F5es report_all_activities=Todas as actividades report_activity=Actividade: report_many=v\u00E1rios report_n_users=utilizadores group_admin_title=Administra\u00E7\u00E3o de grupos group_admin_new_button=Novo grupo... group_admin_groups=Grupos report_actions=Ac\u00E7\u00F5es group_admin_edit_button=Editar... user_admin_title=Utilizador admin group_admin_delete_button=Eliminar... group_admin_clear_button=Limpar relat\u00F3rios... group_admin_properties=Propriedades de grupo group_admin_name=Nome: group_admin_id=Identificador: group_admin_icon=\u00CDcone: error=ERRO return=voltar... group_admin_users=Utilizadores group_admin_no_users=Este grupo n\u00E3o possui utilizadores group_admin_create_user_button=Criar um novo utilizador... cancel=Cancelar group_admin_invalid_name=Nome de grupo incorrecto! group_admin_invalid_id=Identificador de grupo incorrecto! group_admin_id_already_exists=H\u00E1 outro grupo com o mesmo identificador na base de dados! group_admin_delete_group=Eliminar grupo report_areyousure=Tem a certeza? YES=Sim NOT=N\u00E3o group_admin_delete_group_explain=Esta opera\u00E7\u00E3o tamb\u00E9m excluir\u00E1 da base de dados todos os utilizadores do grupo. Todos os dados desses utilizadores ser\u00E3o perdidos. db_error=Imposs\u00EDvel concluir a tarefa. group_admin_clear_group=Limpar dados dos relat\u00F3rios do grupo group_admin_clear_group_explain=Esta opera\u00E7\u00E3o elimina todos os relat\u00F3rios de actividades realizadas pelos membros do grupo entre as datas especificadas. db_clear_reports_date=Limpar dados de relat\u00F3rios user_admin_invalid_name=Nome de utilizador inv\u00E1lido. user_admin_invalid_id=Identificador de utilizador inv\u00E1lido user_admin_id_already_exists=H\u00E1 outro utilizador com o mesmo identificador na base de dados! user_admin_user_deleted=O utilizador foi exclu\u00EDdo com sucesso da base de dados. user_admin_id=Identificador: user_admin_name=Nome: user_admin_icon=\u00CDcone: user_admin_edit_button=Editar... user_admin_delete_button=Eliminar... user_admin_clear_button=Limpar relat\u00F3rios... user_admin_delete_user=Eliminar utilizador user_admin_delete_user_explain=Esta opera\u00E7\u00E3o elimina o utilizador e respectivos relat\u00F3rios na base de dados. user_admin_clear_user=Limpar os dados de relat\u00F3rios do utilizador user_admin_clear_user_explain=Esta opera\u00E7\u00E3o limpa todos os relat\u00F3rios das actividades success=Opera\u00E7\u00E3o bem sucedida! bad_data=Dados incorrectos! db_admin_param_lap=Tempo entre conex\u00F5es (segundos): jclic_reports=Relat\u00F3rios jClic YES_SHORT=S NOT_SHORT=N user_admin_pw_prompt=Palavra-chave: user_admin_pw_prompt_confirm=Confirme palavra-chave: user_admin_err_bad_pw=Palavras-chave diferentes\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_pt_BR.properties000066400000000000000000000132311335566474600320160ustar00rootroot00000000000000login_pwd=Senha : login_desc=\u00C9 necess\u00E1rio que voc\u00EA forne\u00E7a uma senha v\u00E1lida para poder acessar os relat\u00F3rios no banco de dados. login_title=Login submit=Enviar... login_incorrect=Senha incorreta! main_title=Menu principal users_admin_title=Administrador de usu\u00E1rios e grupos group_report_title=Relat\u00F3rios de grupo user_report_title=relat\u00F3rios de usu\u00E1rio act_report_title=Relat\u00F3rios de atividades db_admin_title=Administrador de BD db_admin_settings_error=N\u00E3o foi poss\u00EDvel definir os novos valores do banco de dados! db_admin_param_agc=Permitir que usu\u00E1rios criem novos grupos db_admin_param_auc=Permitir que usu\u00E1rios criem novos usu\u00E1rios db_admin_param_shgl=Selecione grupo em uma lista db_admin_param_shul=Selecione nome de usu\u00E1rio em uma lista db_admin_param_ut=Banco de dados possui tabelas de usu\u00E1rios e grupos db_admin_edit_btn=Editar prefer\u00EAncias... db_admin_pw_edit_btn=Definir senha... title=T\u00EDtulo db_admin_edit_title=Editar configura\u00E7\u00F5es do banco de dados db_admin_pw_edit_title=Alterar senha do sistema db_admin_pw_newPwd=Nova senha db_admin_pw_verifyPwd=Confirme a senha db_admin_pw_noFit=As senhas est\u00E3o diferentes! report_group=Grupo: report_user=Usu\u00E1rio: report_project=Projeto: report_all_projects=Todos os projetos report_key=Chave: report_code=C\u00F3digo: report_context=Contexto: report_from=De: month_1=janeiro month_2=fevereiro month_3=mar\u00E7o month_4=abril month_5=maio month_6=junho month_7=julho month_8=agosto month_9=setembro month_10=outubro month_11=novembro month_12=dezembro report_to=Para: report_global_precision=Precis\u00E3o global report_solved_activities=Atividades resolvidas report_user_evolution=Progresso do usu\u00E1rio report_group_evolution=Progresso do grupo report_project_evolution=Progresso do projeto report_result_distribution=Distribui\u00E7\u00E3o do resultado report_no_data=SEM DADOS report_users=Usu\u00E1rios: report_sessions=Sess\u00F5es: report_projects=Projetos: report_actDone=Atividades realizadas: report_actSolved=Atividades resolvidas: report_totalTime=Tempo total: report_globalPrec=Pontua\u00E7\u00E3o geral: report_globalSummary=Resumo geral report_header_date=Data report_session_list=Sess\u00F5es: report_header_user=usu\u00E1rio report_header_project=projeto report_header_numActs=atividades report_header_actsSolved=ativ. feitas report_header_time=tempo report_header_prec=acertos report_session_detail_show=mostrar detalhes da sess\u00E3o report_session_detail_title=Atividades feitas na sess\u00E3o report_header_activity=atividade report_header_actions=a\u00E7\u00F5es report_header_score=corretas report_header_solved=ok Y=S N=N report_session_detail_hide=ocultar detalhes da sess\u00E3o report_header_sessions=sess\u00F5es report_all_activities=Todas as atividades report_activity=Atividade: report_many=v\u00E1rios report_n_users=usu\u00E1rios group_admin_title=Administra\u00E7\u00E3o de grupos group_admin_new_button=Novo grupo... group_admin_groups=Grupos report_actions=A\u00E7\u00F5es group_admin_edit_button=Editar... user_admin_title=Administrador de usu\u00E1rio group_admin_delete_button=Excluir... group_admin_clear_button=Apagar registros... group_admin_properties=Propriedades do grupo group_admin_name=Nome: group_admin_id=Identificador: group_admin_icon=\u00CDcone: error=ERRO return=voltar... group_admin_users=Usu\u00E1rios group_admin_no_users=Esse grupo n\u00E3o cont\u00E9m usu\u00E1rios. group_admin_create_user_button=Criar um novo usu\u00E1rio... cancel=Cancelar group_admin_invalid_name=Nome de grupo incorreto! group_admin_invalid_id=Identificador de grupo incorreto! group_admin_id_already_exists=J\u00E1 existe outro grupo com o mesmo identificador no banco de dados! group_admin_delete_group=Excluir grupo report_areyousure=Voc\u00EA tem certeza? YES=Sim NOT=N\u00E3o group_admin_delete_group_explain=Essa opera\u00E7\u00E3o tamb\u00E9m excluir\u00E1 do banco todos os usu\u00E1rios desse grupo. Todos os dados desses usu\u00E1rios ser\u00E3o perdidos. db_error=N\u00E3o foi poss\u00EDvel completar a tarefa. group_admin_clear_group=Apagar dados de relat\u00F3rio do grupo group_admin_clear_group_explain=Essa opera\u00E7\u00E3o apagar\u00E1 todos os registros de atividades feitas pelos membros desse grupo dentro do intervalo de datas indicadas. db_clear_reports_date=Apagar registros de dados user_admin_invalid_name=Nome de usu\u00E1rio inv\u00E1lido. user_admin_invalid_id=Identificador de usu\u00E1rio inv\u00E1lido user_admin_id_already_exists=J\u00E1 existe outro usu\u00E1rio com o mesmo identificador no banco de dados! user_admin_user_deleted=O usu\u00E1rio foi exclu\u00EDdo com sucesso do banco de dados. user_admin_id=Identificador: user_admin_name=Nome: user_admin_icon=\u00CDcone: user_admin_edit_button=Editar... user_admin_delete_button=Eliminar... user_admin_clear_button=Apagar registros... user_admin_delete_user=Excluir usu\u00E1rio user_admin_delete_user_explain=Essa opera\u00E7\u00E3o excluir\u00E1 do banco de dados esse usu\u00E1rio e seus registros. user_admin_clear_user=Apagar registros de dados do usu\u00E1rio user_admin_clear_user_explain=Esse opera\u00E7\u00E3o apagar\u00E1 todos os registros de atividades feitas pelo usu\u00E1rio no per\u00EDodo entre as datas indicadas. success=Opera\u00E7\u00E3o bem sucedida bad_data=Dados incorretos! db_admin_param_lap=Tempo entre conex\u00F5es (segundos): jclic_reports=Relat\u00F3rios jClic YES_SHORT=S NOT_SHORT=N user_admin_pw_prompt=Senha: user_admin_pw_prompt_confirm=Confirme senha: user_admin_err_bad_pw=As senhas est\u00E3o diferentes\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_ru.properties000066400000000000000000000365361335566474600314530ustar00rootroot00000000000000login_pwd=\u041F\u0430\u0440\u043E\u043B\u044C: login_desc=\u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0432\u0432\u0435\u0441\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C \u0434\u043B\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0447\u0451\u0442\u043E\u0432. login_title=\u0412\u0445\u043E\u0434 submit=\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C... login_incorrect=\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C! main_title=\u0413\u043B\u0430\u0432\u043D\u043E\u0435 \u043C\u0435\u043D\u044E users_admin_title=\u0410\u0434\u043C. \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u0438 \u0433\u0440\u0443\u043F\u043F group_report_title=\u0413\u0440\u0443\u043F\u043F\u043E\u0432\u044B\u0435 \u043E\u0442\u0447\u0451\u0442\u044B user_report_title=\u041E\u0442\u0447\u0451\u0442\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F act_report_title=\u041E\u0442\u0447\u0451\u0442\u044B \u043E \u0437\u0430\u0434\u0430\u043D\u0438\u044F\u0445 db_admin_title=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 db_admin_settings_error=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445! db_admin_param_agc=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\u043C \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0435 \u0433\u0440\u0443\u043F\u043F\u044B db_admin_param_auc=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\u043C \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 db_admin_param_shgl=\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u0440\u0443\u043F\u043F\u0443 \u0438\u0437 \u0441\u043F\u0438\u0441\u043A\u0430 db_admin_param_shul=\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0438\u0437 \u0441\u043F\u0438\u0441\u043A\u0430 db_admin_param_ut=\u0411\u0430\u0437\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u0438 \u0433\u0440\u0443\u043F\u043F db_admin_edit_btn=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438... db_admin_pw_edit_btn=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C... title=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A db_admin_edit_title=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445 db_admin_pw_edit_title=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C db_admin_pw_newPwd=\u041D\u043E\u0432\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C db_admin_pw_verifyPwd=\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u0430\u0440\u043E\u043B\u044C db_admin_pw_noFit=\u041F\u043E\u043B\u044F \u043F\u0430\u0440\u043E\u043B\u0435\u0439 \u043D\u0435 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u044B! report_group=\u0413\u0440\u0443\u043F\u043F\u0430: report_user=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C: report_project=\u041F\u0440\u043E\u0435\u043A\u0442: report_all_projects=\u0412\u0441\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u044B report_key=\u041A\u043B\u044E\u0447: report_code=\u041A\u043E\u0434: report_context=\u041A\u043E\u043D\u0442\u0435\u043A\u0441\u0442: report_from=\u041E\u0442: month_1=\u044F\u043D\u0432\u0430\u0440\u044C month_2=\u0444\u0435\u0432\u0440\u0430\u043B\u044C month_3=\u043C\u0430\u0440\u0442 month_4=\u0430\u043F\u0440\u0435\u043B\u044C month_5=\u043C\u0430\u0439 month_6=\u0438\u044E\u043D\u044C month_7=\u0438\u044E\u043B\u044C month_8=\u0430\u0432\u0433\u0443\u0441\u0442 month_9=\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C month_10=\u043E\u043A\u0442\u044F\u0431\u0440\u044C month_11=\u043D\u043E\u044F\u0431\u0440\u044C month_12=\u0434\u0435\u043A\u0430\u0431\u0440\u044C report_to=\u041A\u043E\u043C\u0443: report_global_precision=\u041E\u0431\u0449\u0430\u044F \u0442\u043E\u0447\u043D\u043E\u0441\u0442\u044C report_solved_activities=\u0420\u0435\u0448\u0451\u043D\u043D\u044B\u0435 \u0437\u0430\u0434\u0430\u043D\u0438\u044F report_user_evolution=\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F report_group_evolution=\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B report_project_evolution=\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 report_result_distribution=\u0420\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 report_no_data=\u041D\u0415\u0422 \u0414\u0410\u041D\u041D\u042B\u0425 report_users=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 report_sessions=\u0421\u0435\u0441\u0441\u0438\u0438: report_projects=\u041F\u0440\u043E\u0435\u043A\u0442\u044B: report_actDone=\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043D\u044B\u0445 \u0437\u0430\u0434\u0430\u043D\u0438\u0439: report_actSolved=\u0420\u0435\u0448\u0451\u043D\u043D\u044B\u0445 \u0437\u0430\u0434\u0430\u043D\u0438\u0439: report_totalTime=\u041E\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F: report_globalPrec=\u041E\u0431\u0449\u0438\u0439 \u0441\u0447\u0451\u0442 report_globalSummary=\u041E\u0431\u0449\u0438\u0435 \u0438\u0442\u043E\u0433\u0438 report_header_date=\u0434\u0430\u0442\u0430 report_session_list=\u0421\u0435\u0441\u0441\u0438\u0438: report_header_user=\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C report_header_project=\u043F\u0440\u043E\u0435\u043A\u0442 report_header_numActs=\u0437\u0430\u0434\u0430\u043D\u0438\u044F report_header_actsSolved=\u0440\u0435\u0448. \u0437\u0430\u0434\u0430\u043D\u0438\u0439 report_header_time=\u0432\u0440\u0435\u043C\u044F report_header_prec=\u0441\u0447\u0451\u0442 report_session_detail_show=\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0441\u0442\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 report_session_detail_title=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044B\u0435 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 report_header_activity=\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C report_header_actions=\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F report_header_score=\u043F\u043E\u043F\u0440\u0430\u0432\u043A\u0438 report_header_solved=ok Y=Y N=N report_session_detail_hide=\u0441\u043A\u0440\u044B\u0442\u044C \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0441\u0442\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 report_header_sessions=\u0441\u0435\u0441\u0441\u0438\u0438 report_all_activities=\u0412\u0441\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C report_activity=\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C: report_many=\u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E report_n_users=\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 group_admin_title=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u0430\u043C\u0438 group_admin_new_button=\u041D\u043E\u0432\u0430\u044F \u0433\u0440\u0443\u043F\u043F\u0430... group_admin_groups=\u0413\u0440\u0443\u043F\u043F\u044B report_actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044F group_admin_edit_button=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C... user_admin_title=\u0410\u0434\u043C. \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 group_admin_delete_button=\u0423\u0434\u0430\u043B\u0438\u0442\u044C... group_admin_clear_button=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043E\u0442\u0447\u0451\u0442\u044B... group_admin_properties=\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0433\u0440\u0443\u043F\u043F\u044B: group_admin_name=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435: group_admin_id=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440: group_admin_icon=\u0417\u043D\u0430\u0447\u043E\u043A: error=\u041E\u0428\u0418\u0411\u041A\u0410 return=\u0432\u043E\u0437\u0432\u0440\u0430\u0442... group_admin_users=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 group_admin_no_users=\u0412 \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 \u043D\u0435\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439. group_admin_create_user_button=\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F... cancel=\u041E\u0442\u043C\u0435\u043D\u0430 group_admin_invalid_name=\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B! group_admin_invalid_id=\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0433\u0440\u0443\u043F\u043F\u044B! group_admin_id_already_exists=\u0412 \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 \u0438\u043C\u0435\u0435\u0442\u0441\u044F \u0433\u0440\u0443\u043F\u043F\u0430 \u0441 \u0442\u0430\u043A\u0438\u043C \u0436\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u043E\u043C. group_admin_delete_group=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443 report_areyousure=\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B? YES=\u0414\u0430 NOT=\u041D\u0435\u0442 group_admin_delete_group_explain=\u042D\u0442\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u0442\u0430\u043A\u0436\u0435 \u0443\u0434\u0430\u043B\u0438\u0442 \u0432\u0441\u0435\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u044B, \u0412\u0441\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0431 \u044D\u0442\u0438\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\u0445 \u0431\u0443\u0434\u0443\u0442 \u043F\u043E\u0442\u0435\u0440\u044F\u043D\u044B. db_error=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. group_admin_clear_group=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 \u0433\u0440\u0443\u043F\u043F\u044B group_admin_clear_group_explain=\u042D\u0442\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u0443\u0434\u0430\u043B\u0438\u0442 \u0432\u0441\u0435 \u043E\u0442\u0447\u0451\u0442\u044B \u0447\u043B\u0435\u043D\u043E\u0432 \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u044B \u043C\u0435\u0436\u0434\u0443 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u043C\u0438 \u0434\u0430\u0442\u0430\u043C\u0438. db_clear_reports_date=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 user_admin_invalid_name=\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0438\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F. user_admin_invalid_id=\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F. user_admin_id_already_exists=\u0412 \u0431\u0430\u0437\u0435 \u0434\u0430\u043D\u043D\u044B\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0441 \u0442\u0430\u043A\u0438\u043C \u0436\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u043E\u043C! user_admin_user_deleted=\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0443\u0434\u0430\u043B\u0451\u043D \u0438\u0437 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445. user_admin_id=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440: user_admin_name=\u0418\u043C\u044F: user_admin_icon=\u0417\u043D\u0430\u0447\u043E\u043A: user_admin_edit_button=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C... user_admin_delete_button=\u0423\u0434\u0430\u043B\u0438\u0442\u044C... user_admin_clear_button=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043E\u0442\u0447\u0451\u0442\u044B... user_admin_delete_user=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F user_admin_delete_user_explain=\u042D\u0442\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u0443\u0434\u0430\u043B\u0438\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0438 \u0435\u0433\u043E \u043E\u0442\u0447\u0451\u0442\u044B \u0438\u0437 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445. user_admin_clear_user=\u041E\u0447\u0438\u0441\u0442\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F user_admin_clear_user_explain=\u042D\u0442\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u0443\u0434\u0430\u043B\u0438\u0442 \u0432\u0441\u0435 \u043E\u0442\u0447\u0451\u0442\u044B \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u043C\u0435\u0436\u0434\u0443 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u043C\u0438 \u0434\u0430\u0442\u0430\u043C\u0438. success=\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430 bad_data=\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435! db_admin_param_lap=\u0412\u0440\u0435\u043C\u044F \u043C\u0435\u0436\u0434\u0443 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F\u043C\u0438 (\u0441\u0435\u043A\u0443\u043D\u0434): jclic_reports=\u041E\u0442\u0447\u0451\u0442\u044B JClic YES_SHORT=Y NOT_SHORT=N user_admin_pw_prompt=\u041F\u0430\u0440\u043E\u043B\u044C: user_admin_pw_prompt_confirm=\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u0430\u0440\u043E\u043B\u044C: user_admin_err_bad_pw=\u041F\u0430\u0440\u043E\u043B\u0438 \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_tr.properties000066400000000000000000000140751335566474600314440ustar00rootroot00000000000000login_pwd=\u015Eifre login_desc=Veritaban\u0131 raporlar\u0131na eri\u015Fim i\u00E7in ge\u00E7erli bir \u015Fifreye ihtiyac\u0131n\u0131z var. login_title=Kullan\u0131c\u0131 ad\u0131 submit=G\u00F6nder login_incorrect=Hatal\u0131 \u015Fifre! main_title=Ana men\u00FC users_admin_title=Kullan\u0131c\u0131lar ve y\u00F6neticiler group_report_title=Grup raporlar\u0131 user_report_title=Kullan\u0131c\u0131 raporlar\u0131 act_report_title=Aktivite raporlar\u0131 db_admin_title=Veritaban\u0131 y\u00F6neticisi db_admin_settings_error=Yeni veritaban\u0131 de\u011Ferleri yap\u0131land\u0131r\u0131lam\u0131yor! db_admin_param_agc=Kullan\u0131c\u0131lara yeni grup eklemelerine izin ver db_admin_param_auc=Kullan\u0131c\u0131lara yeni kullan\u0131c\u0131 olu\u015Fturma izni ver db_admin_param_shgl=Listedeki gruplar\u0131 se\u00E7 db_admin_param_shul=Listeden bir kullan\u0131c\u0131 ad\u0131 se\u00E7 db_admin_param_ut=Veritaban\u0131nda kullan\u0131c\u0131lar ve gruplar tablosu olu\u015Fturuldu db_admin_edit_btn=Ayarlar\u0131 d\u00FCzenle db_admin_pw_edit_btn=\u015Eifre belirle... title=Ba\u015Fl\u0131k db_admin_edit_title=Veritaban\u0131 ayarlar\u0131n\u0131 d\u00FCzenle db_admin_pw_edit_title=Sistem \u015Fifresini de\u011Fi\u015Ftir db_admin_pw_newPwd=Yeni parola db_admin_pw_verifyPwd=\u015Eifrenizi tekrar giriniz db_admin_pw_noFit=\u015Eifre alanlar\u0131 uyu\u015Fmuyor! report_group=Grup: report_user=Kullan\u0131c\u0131: report_project=Proje: report_all_projects=T\u00FCm projeler report_key=Anahtar: report_code=Kod: report_context=\u0130\u00E7erik: report_from=G\u00F6nderen: month_1=Ocak month_2=\u015Eubat month_3=Mart month_4=Nisan month_5=May\u0131s month_6=Haziran month_7=Temmuz month_8=A\u011Fustos month_9=Eyl\u00FCl month_10=Ekim month_11=Kas\u0131m month_12=Aral\u0131k report_to=Kime: report_global_precision=Genel hassasiyet report_solved_activities=\u00C7\u00F6z\u00FClm\u00FC\u015F aktiviteler report_user_evolution=Kullan\u0131c\u0131 geli\u015Fimi report_group_evolution=Grup geli\u015Fimi report_project_evolution=Proje geli\u015Fimi report_result_distribution=Sonu\u00E7 da\u011F\u0131l\u0131m\u0131 report_no_data=VER\u0130 YOK report_users=Kullan\u0131c\u0131lar: report_sessions=Oturumlar: report_projects=Projeler: report_actDone=Tamamlanan etkinlikler: report_actSolved=\u00C7\u00F6z\u00FClm\u00FC\u015F aktiviteler report_totalTime=Toplam s\u00FCre: report_globalPrec=Genel sonu\u00E7: report_globalSummary=Genel \u00F6zet: report_header_date=tarih report_session_list=Oturumlar: report_header_user=kullan\u0131c\u0131 report_header_project=proje report_header_numActs=aktiviteler report_header_actsSolved=\u00E7\u00F6z\u00FClm\u00FC\u015F aktiviteler report_header_time=zaman report_header_prec=sonu\u00E7 report_session_detail_show=oturum detaylar\u0131n\u0131 g\u00F6ster report_session_detail_title=Bu oturumda tamamlanan etkinlikler report_header_activity=aktivite report_header_actions=eylemler report_header_score=do\u011Frular report_header_solved=tamam Y=E N=H report_session_detail_hide=oturum detaylar\u0131n\u0131 sakla report_header_sessions=oturumlar report_all_activities=t\u00FCm aktiviteler report_activity=Aktivite: report_many=birka\u00E7 defa report_n_users=kullan\u0131c\u0131lar group_admin_title=Grup y\u00F6neticisi group_admin_new_button=Yeni grup... group_admin_groups=Gruplar report_actions=Eylemler group_admin_edit_button=D\u00FCzenle... user_admin_title=Kullan\u0131c\u0131 y\u00F6neticisi group_admin_delete_button=Sil... group_admin_clear_button=Raporlar\u0131 sil... group_admin_properties=Grup \u00F6zellikleri group_admin_name=\u0130sim: group_admin_id=Tan\u0131mlay\u0131c\u0131: group_admin_icon=Simge: error=HATA return=geri d\u00F6n... group_admin_users=Kullan\u0131c\u0131lar group_admin_no_users=Bu grupta kullan\u0131c\u0131 yok. group_admin_create_user_button=Yeni kullan\u0131c\u0131 olu\u015Ftur... cancel=\u0130ptal group_admin_invalid_name=Grup ad\u0131 hatal\u0131! group_admin_invalid_id=Grup kimli\u011Fi hatal\u0131! group_admin_id_already_exists=Veritaban\u0131nda ayn\u0131 isme sahip ba\u015Fka bir grup var! group_admin_delete_group=Grup Sil report_areyousure=Emin misiniz? YES=Evet NOT=De\u011Fil group_admin_delete_group_explain=Bu i\u015Flem bu gruptaki t\u00FCm kullan\u0131c\u0131lar\u0131 veritaban\u0131ndan silecek. Kullan\u0131c\u0131lara ait t\u00FCm veriler kaybolacak. db_error=G\u00F6rev tamamlanamad\u0131 group_admin_clear_group=Grup veri raporunu sil group_admin_clear_group_explain=Bu i\u015Flem grup \u00FCyeleri taraf\u0131ndan belirtilen tarihler aras\u0131nda yap\u0131lm\u0131\u015F aktivitelerle ilgili t\u00FCm raporlar\u0131 silecektir. db_clear_reports_date=Veri raporunu sil user_admin_invalid_name=Ge\u00E7ersiz kullan\u0131c\u0131 ad\u0131 user_admin_invalid_id=Ge\u00E7ersiz kullan\u0131c\u0131 kimli\u011Fi user_admin_id_already_exists=Veritaban\u0131nda ayn\u0131 kimli\u011Fe sahip ba\u015Fka bir kullan\u0131c\u0131 var! user_admin_user_deleted=Kullan\u0131c\u0131 ba\u015Far\u0131yla veritaban\u0131ndan silindi. user_admin_id=Tan\u0131mlay\u0131c\u0131: user_admin_name=\u0130sim: user_admin_icon=Simge: user_admin_edit_button=D\u00FCzenle... user_admin_delete_button=Sil... user_admin_clear_button=Raporlar\u0131 sil... user_admin_delete_user=Kullan\u0131c\u0131 sil user_admin_delete_user_explain=Bu i\u015Flem kullan\u0131c\u0131y\u0131 ve raporlar\u0131n\u0131 veritaban\u0131ndan silecek. user_admin_clear_user=Kullan\u0131c\u0131 veri raporunu sil user_admin_clear_user_explain=Bu i\u015Flem belirlenmi\u015F tarihler aras\u0131nda kullan\u0131c\u0131 taraf\u0131ndan yap\u0131lm\u0131\u015F etkinliklere ait raporlar\u0131n tamam\u0131n\u0131 silecek. success=\u0130\u015Flem ba\u015Far\u0131yla ger\u00E7ekle\u015Ftirildi bad_data=Hatal\u0131 veri! db_admin_param_lap=\u0130ki ba\u011Flant\u0131 aras\u0131ndaki zaman (saniye): jclic_reports=JClic raporlar\u0131 YES_SHORT=E NOT_SHORT=H user_admin_pw_prompt=\u015Eifre: user_admin_pw_prompt_confirm=\u015Eifreyi onaylay\u0131n: user_admin_err_bad_pw=\u015Eifreler uyu\u015Fmuyor. src/report/reportServlets/edu/xtec/resources/messages/reportMessages_vec.properties000066400000000000000000000127251335566474600315740ustar00rootroot00000000000000login_pwd=Password: login_desc=Te g\u00E0 da fornir na password v\u00E0\u019Aida par intrar inte 'l database de i reports. login_title=Login submit=Spedisi... login_incorrect=Password no rispondente! main_title=Menu primario users_admin_title=Ministrador de utenti e grupi group_report_title=Reports grupo user_report_title=Reports utente act_report_title=REports de ativit\u00E0 db_admin_title=Ministrador de 'l database db_admin_settings_error=No se pol inpostar i va\u019Aori niovi de 'l database! db_admin_param_agc=Cont\u00E9nteghe a i utenti de inviar grupi niovi db_admin_param_auc=Cont\u00E9nteghe a i utenti de inviar utenti niovi db_admin_param_shgl=Desernisi un grupo da na lista db_admin_param_shul=Desernisi un n\u00F2me utente da na lista db_admin_param_ut=El database el g\u00E0 tav\u00E8\u019Ae de utenti e grupi db_admin_edit_btn=Mod\u00ECfega inpostasion... db_admin_pw_edit_btn=Definisi password... title=T\u00ECto\u019Ao db_admin_edit_title=Mod\u00ECfega \u019Ae inpostasion de 'l database db_admin_pw_edit_title=Canbia \u019Aa password de 'l sist\u00E8ma db_admin_pw_newPwd=Password niova db_admin_pw_verifyPwd=Scrivi password da novo db_admin_pw_noFit=I canpi password no i conbina! report_group=Grupo: report_user=Utente: report_project=Prox\u00E8to: report_all_projects=Tuti i prox\u00E8ti report_key=Ciave: report_code=C\u00F2dexe: report_context=Contenudo: report_from=Da: month_1=xenaro month_2=febraro month_3=marso month_4=april month_5=majo month_6=xugno month_7=lujo month_8=agosto month_9=setenbre month_10=otobre month_11=novenbre month_12=desenbre report_to=A: report_global_precision=Precixion global report_solved_activities=Ativit\u00E0 resolveste report_user_evolution=Evo\u019Ausion utente report_group_evolution=Evo\u019Ausion grupo report_project_evolution=Evo\u019Ausion prox\u00E8to report_result_distribution=Destribusion de i rexultadi report_no_data=NO GHE X\u00C9 DATI report_users=Utenti: report_sessions=Sesion: report_projects=Prox\u00E8ti: report_actDone=Ativit\u00E0 concluxe: report_actSolved=Ativit\u00E0 resolveste: report_totalTime=Tenpo total: report_globalPrec=Pontexio global: report_globalSummary=Somario global report_header_date=data report_session_list=Sesion: report_header_user=utente report_header_project=prox\u00E8to report_header_numActs=ativit\u00E0 report_header_actsSolved=at. res\u00F2lte report_header_time=tenpo report_header_prec=pontexio report_session_detail_show=mostra detali sesion report_session_detail_title=Ativit\u00E0 concluxe inte \u019Aa sesion report_header_activity=ativit\u00E0 report_header_actions=asion report_header_score=cor\u00E8te report_header_solved=ok Y=S N=N report_session_detail_hide=scondi detali de sesion report_header_sessions=sesion report_all_activities=Tute \u019Ae ativit\u00E0 report_activity=Ativit\u00E0: report_many=vari report_n_users=utenti group_admin_title=Monistrasion de 'l grupo group_admin_new_button=Grupo niovo... group_admin_groups=Grupi report_actions=Asion group_admin_edit_button=Mod\u00ECfega... user_admin_title=Ministrador de i utenti group_admin_delete_button=Scans\u00E8\u019Aa... group_admin_clear_button=Sneta reports... group_admin_properties=Propiet\u00E0 grupo group_admin_name=N\u00F2me: group_admin_id=id: group_admin_icon=Icona: error=EROR return=indrio... group_admin_users=Utenti group_admin_no_users=Sto grupo no 'l g\u00E0 utenti group_admin_create_user_button=Definisi un utente niovo... cancel=Anu\u019Aa group_admin_invalid_name=N\u00F2me grupo no cor\u00E8to! group_admin_invalid_id=Id grupo no cor\u00E8to! group_admin_id_already_exists=Ghe x\u00E9 naltro grupo co'l steso idenrifegador inte 'l database! group_admin_delete_group=Scans\u00E8\u019Aa grupo report_areyousure=Sito seguro? YES=S\u00EC NOT=N\u00F2 group_admin_delete_group_explain=Sta fatura \u019Aa scanse\u019Aar\u00E0 anca tuti i utenti de sto grupo da 'l database. Tuti i dati de sti utenti i andar\u00E0 p\u00E8rsi. db_error=No se pol conpletar \u019Aa fatura group_admin_clear_group=Sneta dati report de 'l grupo group_admin_clear_group_explain=Sta fatura \u019Aa snetar\u00E0 tuti i reports de \u019Ae ativit\u00E0 fate da i menbri de sto grupo fra \u019Ae date spesifeg\u00E0e. db_clear_reports_date=Sneta dati report user_admin_invalid_name=N\u00F2me utente no v\u00E0\u019Aido. user_admin_invalid_id=Identifegaor utente inv\u00E0\u019Aido user_admin_id_already_exists=Ghe x\u00E9 naltro utente co'l steso identifegador inte 'l database! user_admin_user_deleted=El utente el x\u00E9 st\u00E0 scanse\u019A\u00E0 da 'l database. user_admin_id=Id: user_admin_name=N\u00F2me: user_admin_icon=Icona: user_admin_edit_button=Mod\u00ECfega... user_admin_delete_button=Scans\u00E8\u019Aa... user_admin_clear_button=Sneta reports... user_admin_delete_user=Scans\u00E8\u019Aa utente user_admin_delete_user_explain=Sta operasion \u019Aa scanse\u019Aar\u00E0 sto utente e i so reports da 'l database. user_admin_clear_user=Scans\u00E8\u019Aa dati report de 'l utente user_admin_clear_user_explain=Sta fatura \u019Aa scanse\u019Aar\u00E0 tuti i reports de \u019Ae ativit\u00E0 fate da sto utente fra \u019Ae date spesifeg\u00E0e. success=Operasion concluxa po\u019Aito bad_data=Dati sbali\u00E0i! db_admin_param_lap=Tenpo fra \u019Ae conesion (seondi): jclic_reports=Reports JClic YES_SHORT=S NOT_SHORT=N user_admin_pw_prompt=Password: user_admin_pw_prompt_confirm=Confirm password: user_admin_err_bad_pw=\u023De password no \u019Ae conbina\\! src/report/reportServlets/edu/xtec/resources/messages/reportMessages_zh_TW.properties000066400000000000000000000155401335566474600320500ustar00rootroot00000000000000login_pwd=\u5BC6\u78BC\uFF1A login_desc=\u4F60\u5FC5\u9808\u63D0\u4F9B\u4E00\u500B\u6709\u6548\u7684\u5BC6\u78BC\u624D\u53EF\u4EE5\u53D6\u5F97\u5831\u544A\u6578\u64DA login_title=\u767B\u5165 submit=\u9001\u51FA login_incorrect=\u5BC6\u78BC\u4E0D\u6B63\u78BA main_title=\u4E3B\u9078\u55AE users_admin_title=\u4F7F\u7528\u8005\u8207\u7FA4\u7D44\u7BA1\u7406 group_report_title=\u7FA4\u7D44\u5831 \u544A user_report_title=\u4F7F\u7528\u8005\u5831\u544A act_report_title=\u6D3B\u52D5\u5831\u544A db_admin_title=\u8CC7\u6599\u5EAB\u7BA1\u7406 db_admin_settings_error=\u7121\u6CD5\u8A2D\u7F6E\u65B0\u8CC7\u6599\u5EAB\u7684\u6578\u64DA\uFF01 db_admin_param_agc=\u5141\u8A31\u4F7F\u7528\u8005\u5EFA\u7ACB\u65B0\u7FA4\u7D44 db_admin_param_auc=\u5141\u8A31\u4F7F\u7528\u8005\u5EFA\u7ACB\u65B0\u4F7F\u7528\u8005 db_admin_param_shgl=\u5728\u5217\u8868\u4E2D\u9078\u64C7\u7FA4\u7D44 db_admin_param_shul=\u5728\u5217\u8868\u4E2D\u9078\u64C7\u4F7F\u7528\u8005 db_admin_param_ut=\u8CC7\u6599\u5EAB\u6709\u4F7F\u7528\u8005\u8207\u7FA4\u7D44\u5DE5\u4F5C\u8868 db_admin_edit_btn=\u7DE8\u8F2F\u504F\u597D\u8A2D\u5B9A... db_admin_pw_edit_btn=\u8A2D\u5B9A\u5BC6\u78BC... title=\u6A19\u984C db_admin_edit_title=\u7DE8\u8F2F\u8CC7\u6599\u5EAB\u8A2D\u5B9A db_admin_pw_edit_title=\u8B8A\u66F4\u7CFB\u7D71\u5BC6\u78BC db_admin_pw_newPwd=\u65B0\u5BC6\u78BC db_admin_pw_verifyPwd=\u518D\u4E00\u6B21\u8F38\u5165\u5BC6\u78BC db_admin_pw_noFit=\u5BC6\u78BC\u6B04\u4F4D\u4E0D\u4E00\u81F4\uFF01 report_group=\u7FA4\u7D44\uFF1A report_user=\u4F7F\u7528\u8005\uFF1A report_project=\u5C08\u6848\uFF1A report_all_projects=\u5168\u90E8\u5C08\u6848 report_key=\u91D1\u9470\uFF1A report_code=\u7DE8\u78BC\uFF1A report_context=\u4E0A\u4E0B\u6587\uFF1A report_from=\u5F9E\uFF1A month_1=\u4E00\u6708 month_2=\u4E8C\u6708 month_3=\u4E09\u6708 month_4=\u56DB\u6708 month_5=\u4E94\u6708 month_6=\u516D\u6708 month_7=\u4E03\u6708 month_8=\u516B\u6708 month_9=\u4E5D\u6708 month_10=\u5341\u6708 month_11=\u5341\u4E00\u6708 month_12=\u5341\u4E8C\u6708 report_to=\u5230\uFF1A report_global_precision=\u5168\u7403\u6E96\u78BA report_solved_activities=\u89E3\u7B54\u6D3B\u52D5 report_user_evolution=\u4F7F\u7528\u8005\u7684\u6F14\u8B8A report_group_evolution=\u7FA4\u7D44\u7684\u6F14\u8B8A report_project_evolution=\u5C08\u6848\u7684\u6F14\u9032\u904E\u7A0B report_result_distribution=\u7D50\u679C\u5206\u4F48 report_no_data=\u7121\u8CC7\u6599 report_users=\u4F7F\u7528\u8005: report_sessions=\u5340\u6BB5\uFF1A report_projects=\u5C08\u6848\uFF1A report_actDone=\u6D3B\u52D5\u7D50\u675F report_actSolved=\u5DF2\u89E3\u6C7A\u7684\u6D3B\u52D5 report_totalTime=\u5168\u90E8\u6642\u9593: report_globalPrec=\u7E3D\u6210\u7E3E report_globalSummary=\u6574\u9AD4\u7E3D\u7D50 report_header_date=\u65E5\u671F report_session_list=\u5340\u6BB5\uFF1A report_header_user=\u4F7F\u7528\u8005 report_header_project=\u5C08\u6848 report_header_numActs=\u7DE8\u8F2F report_header_actsSolved=\u884C\u52D5 . \u5DF2\u89E3\u6C7A report_header_time=\u6642\u9593 report_header_prec=\u5206\u6578 report_session_detail_show=\u986F\u793A\u7D30\u7BC0\u5340\u6BB5 report_session_detail_title=\u6B64\u5340\u57DF\u5B8C\u6210\u7684\u7DE8\u8F2F report_header_activity=\u6D3B\u52D5 report_header_actions=\u52D5\u4F5C report_header_score=\u66F4\u6B63 report_header_solved=\u78BA\u5B9A Y=Y N=N report_session_detail_hide=\u96B1\u85CF\u5340\u6BB5\u7D30\u7BC0 report_header_sessions=\u5DE5\u4F5C\u968E\u6BB5 report_all_activities=\u5168\u90E8\u6D3B\u52D5 report_activity=\u6D3B\u52D5\uFF1A report_many=\u597D\u5E7E\u500B report_n_users=\u4F7F\u7528\u8005 group_admin_title=\u7FA4\u7D44\u7BA1\u7406 group_admin_new_button=\u65B0\u7FA4\u7D44... group_admin_groups=\u7FA4\u7D44 report_actions=\u52D5\u4F5C group_admin_edit_button=\u7DE8\u8F2F\u2026 user_admin_title=\u4F7F\u7528\u8005\u7BA1\u7406 group_admin_delete_button=\u522A\u9664... group_admin_clear_button=\u6E05\u9664\u5831\u544A... group_admin_properties=\u7FA4\u7D44\u5C6C\u6027 group_admin_name=\u540D\u7A31\uFF1A group_admin_id=\u8B58\u5225\u78BC: group_admin_icon=\u5716\u793A\uFF1A error=\u932F\u8AA4 return=\u8FD4\u56DE... group_admin_users=\u4F7F\u7528\u8005 group_admin_no_users=\u9019\u500B\u7FA4\u7D44\u6C92\u6709\u4F7F\u7528\u8005\u3002 group_admin_create_user_button=\u5EFA\u7ACB\u65B0\u4F7F\u7528\u8005... cancel=\u53D6\u6D88 group_admin_invalid_name=\u4E0D\u6B63\u78BA\u7684\u7FA4\u7D44\u540D\u7A31\uFF01 group_admin_invalid_id=\u4E0D\u6B63\u78BA\u7684\u7FA4\u7D44\u8B58\u5225\u78BC\uFF01 group_admin_id_already_exists=\u6578\u64DA\u5EAB\u4E2D\u7684\u4E00\u500B\u7FA4\u7D44\u4E5F\u6709\u76F8\u540C\u7684\u6A19\u8B58\u7B26\uFF01 group_admin_delete_group=\u522A\u9664\u7FA4\u7D44 report_areyousure=\u60A8\u78BA\u5B9A\u55CE\uFF1F YES=\u78BA\u5B9A NOT=\u4E0D\u662F group_admin_delete_group_explain=\u9019\u500B\u64CD\u4F5C\u6703\u522A\u9664\u5728\u8CC7\u6599\u5EAB\u4E2D\u9019\u500B\u7FA4\u7D44\u7684\u6240\u6709\u7528\u6236\u3002\u9019\u4E9B\u7528\u6236\u7684\u6240\u6709\u8CC7\u6599\u5C07\u6703\u907A\u5931\u3002 db_error=\u7121\u6CD5\u5B8C\u6210\u5DE5\u4F5C group_admin_clear_group=\u6E05\u9664\u7FA4\u7D44\u7684\u5831\u544A\u8CC7\u6599 group_admin_clear_group_explain=\u6B64\u64CD\u4F5C\u5C07\u6E05\u9664\u9019\u500B\u7FA4\u7D44\u7684\u6307\u5B9A\u65E5\u671F\u4E4B\u9593\u7684\u6240\u6709\u6210\u54E1\u9032\u884C\u6D3B\u52D5\u7684\u5831\u544A\u3002 db_clear_reports_date=\u6E05\u9664\u5831\u544A\u8CC7\u6599 user_admin_invalid_name=\u7121\u6548\u7684\u4F7F\u7528\u8005\u540D\u7A31\u3002 user_admin_invalid_id=\u7121\u6548\u7684\u4F7F\u7528\u8005\u8B58\u5225\u78BC user_admin_id_already_exists=\u5728\u8CC7\u6599\u5EAB\u4E2D\u6709\u4E00\u500B\u76F8\u540C\u6A19\u8B58\u7B26\u7684\u7528\u6236\uFF01 user_admin_user_deleted=\u4F7F\u7528\u8005\u5DF2\u7D93\u522A\u9664\u3002 user_admin_id=\u8B58\u5225\u78BC\uFF1A user_admin_name=\u540D\u7A31\uFF1A user_admin_icon=\u5716\u793A\uFF1A user_admin_edit_button=\u7DE8\u8F2F\u2026 user_admin_delete_button=\u522A\u9664... user_admin_clear_button=\u6E05\u9664\u5831\u544A... user_admin_delete_user=\u522A\u9664\u4F7F\u7528\u8005 user_admin_delete_user_explain=\u9019\u500B\u64CD\u4F5C\u6703\u5F9E\u8CC7\u6599\u5EAB\u4E2D\u522A\u9664\u9019\u500B\u4F7F\u7528\u8005\u548C\u4ED6\u7684\u5831\u544A\u3002 user_admin_clear_user=\u6E05\u9664\u4F7F\u7528\u8005\u7684\u5831\u544A user_admin_clear_user_explain=\u9019\u500B\u64CD\u4F5C\u6703\u522A\u9664\u9019\u500B\u4F7F\u7528\u8005\u5728\u7279\u5B9A\u65E5\u671F\u4E4B\u9593\u6240\u5B8C\u6210\u7684\u6D3B\u52D5\u5831\u544A\u3002 success=\u64CD\u4F5C\u5B8C\u6210 bad_data=\u58DE\u7684\u8CC7\u6599\uFF01 db_admin_param_lap=\u4E4B\u9593\u7684\u9023\u63A5\u6642\u9593\uFF08\u79D2\uFF09\\\uFF1A jclic_reports=JClic \u5831\u544A YES_SHORT=Y NOT_SHORT=\u5426 user_admin_pw_prompt=\u5BC6\u78BC\uFF1A user_admin_pw_prompt_confirm=\u78BA\u8A8D\u5BC6\u78BC\uFF1A user_admin_err_bad_pw=\u5BC6\u78BC\u6C92\u6709\u5339\u914D\uFF01 src/report/reportServlets/edu/xtec/servlet/000077500000000000000000000000001335566474600214525ustar00rootroot00000000000000src/report/reportServlets/edu/xtec/servlet/AbstractServlet.java000066400000000000000000000127251335566474600254340ustar00rootroot00000000000000/* * File : AbstractServlet.java * Created : 23-jan-2003 12:03 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.servlet; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.*; import javax.servlet.http.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public abstract class AbstractServlet extends HttpServlet { public AbstractServlet() { super(); RequestProcessor.setDirectResources(true); } @Override public void init(ServletConfig config) throws ServletException { super.init(config); Enumeration en = config.getInitParameterNames(); if (en.hasMoreElements()) { Map map = new HashMap(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); String value = (String) config.getInitParameter(key); } RequestProcessor.config(map); } } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { RequestProcessor rp = null; try { rp = createRP(); if (rp.wantsInputStream()) rp.setInputStream(request.getInputStream()); else { Map v = new HashMap(); Map parameters = request.getParameterMap(); for (Object k : parameters.keySet()) { v.put((String) k, parameters.get(k)); } rp.setParams(v); } Cookie[] ck = request.getCookies(); if (ck != null) for (int i = 0; i < ck.length; i++) rp.setCookie(ck[i].getName(), ck[i].getValue()); Enumeration en = request.getHeaderNames(); Map map = new HashMap(); while (en.hasMoreElements()) { String name = (String) en.nextElement(); Enumeration enh = request.getHeaders(name); List v = new ArrayList(); while (enh.hasMoreElements()) v.add((String) enh.nextElement()); map.put(name.toLowerCase(), v); } rp.setHeaders(map); rp.init(); if (rp.noCache()) { response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", "0"); } List v = new ArrayList(); rp.header(v); if (!v.isEmpty()) { Iterator it = v.iterator(); while (it.hasNext() && !response.isCommitted()) { String[] h = (String[]) it.next(); if (h[0].equals(RequestProcessor.ERROR)) { int code = Integer.parseInt(h[1]); response.sendError(code, h[2]); } if (h[0].equals(RequestProcessor.REDIRECT)) { response.sendRedirect(h[1]); break; } else if (h[0].equals(RequestProcessor.CONTENT_TYPE)) response.setContentType(h[1]); else if (h[0].equals(RequestProcessor.CONTENT_LENGTH)) response.setContentLength(Integer.parseInt(h[1])); else if (h[0].equals(RequestProcessor.EXTRA)) response.setHeader(h[1], h[2]); else if (h[0].equals(RequestProcessor.COOKIE)) response.addCookie(new Cookie(h[1], h[2])); } } if (!response.isCommitted()) { if (rp.usesWriter()) { java.io.PrintWriter pw = response.getWriter(); rp.process(pw); try { pw.flush(); pw.close(); } catch (Exception ex) { // ... } } else { java.io.OutputStream os = response.getOutputStream(); rp.process(os); try { os.flush(); os.close(); } catch (Exception ex) { // ... } } } rp.end(); rp = null; } catch (Exception ex) { int errCode = rp != null && rp.errCode >= 0 ? rp.errCode : HttpServletResponse.SC_INTERNAL_SERVER_ERROR; String errMsg = rp != null && rp.errMsg != null ? rp.errMsg : ex.getMessage(); if (!response.isCommitted()) { response.sendError(errCode, errMsg); } System.err.println("ERROR " + errCode + ": " + errMsg); ex.printStackTrace(System.err); } finally { if (rp != null) rp.end(); } } protected abstract RequestProcessor createRP() throws Exception; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { processRequest(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { processRequest(request, response); } } src/report/reportServlets/edu/xtec/servlet/RequestProcessor.java000066400000000000000000000235751335566474600256610ustar00rootroot00000000000000/* * File : RequestProcessor.java * Created : 23-jan-2003 10:31 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.servlet; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.StringTokenizer; import java.util.TimeZone; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public abstract class RequestProcessor { public static final String REDIRECT = "REDIRECT", CONTENT_TYPE = "CONTENT_TYPE", CONTENT_LENGTH = "CONTENT_LENGTH", COOKIE = "COOKIE", EXTRA = "EXTRA", ERROR = "ERROR"; public static final int HTTP_NOT_FOUND = 404, HTTP_BAD_REQUEST = 400, HTTP_UNAUTHORIZED = 401; public static final String CHARSET = "ISO-8859-1"; private Map params; private Map cookies; private Map headers; private InputStream inputStream; public int errCode; public String errMsg; private static boolean DIRECT_RESOURCES; protected static Map properties = new HashMap(); /** Creates a new instance of RequestProcessor */ public RequestProcessor() { params = new HashMap(); cookies = new HashMap(); headers = new HashMap(); inputStream = null; errCode = -1; errMsg = null; } public static void config(Map prop) { if (prop != null) { properties.putAll(prop); } } public boolean init() throws Exception { return true; } public boolean usesWriter() { return true; } public boolean noCache() { return true; } public void process(java.io.OutputStream out) throws Exception { } public void process(java.io.PrintWriter out) throws Exception { startHead(out); head(out); endHead(out); startBody(out); body(out); endBody(out); } public void header(List v) { if (cookies.size() > 0) { for (String key : cookies.keySet()) { String value = (String) cookies.get(key); v.add(new String[] { COOKIE, key, value }); } } } public void end() { } public boolean wantsInputStream() { return false; } public InputStream getInputStream() { return inputStream; } public void setInputStream(InputStream is) { inputStream = is; } public int getIntParam(String name, int defaultValue) { int result = defaultValue; String s = getParam(name); if (s != null) { try { result = Integer.parseInt(s); } catch (NumberFormatException ex) { } } return result; } public Date getDateParam(String name, Date defaultValue, boolean atMidnight) { Date result = defaultValue; String s = getParam(name); if (s != null) { try { result = edu.xtec.jclic.report.ReportUtils.strToDate(s, atMidnight); } catch (Exception ex) { } } return result; } public String getParamNotNull(String name) { String result = getParam(name, 0); if (result == null) { result = ""; } return result.trim(); } public String getParam(String name) { return getParam(name, 0); } public Object[] getParams(String name) { return (Object[]) params.get(name); } public String getParam(String name, int index) { String result = null; Object[] array = (Object[]) params.get(name); if (index >= 0 && array != null && array.length > index) { result = (String) array[index]; } return result; } public void setParam(String name, String value) { params.put(name, new String[] { value }); } public void setParam(String name, String[] value) { params.put(name, value); } public void setParams(Map map) { if (map != null) { for (String s : map.keySet()) { Object val = map.get(s); if (s != null) { if (val instanceof String) { setParam(s.toString(), (String) val); } else if (val instanceof String[]) { setParam(s.toString(), (String[]) val); } } } } } public String getCookie(String name) { return (String) cookies.get(name); } public void setCookie(String name, String value) { cookies.put(name, value); } public void setCookies(Map map) { cookies.putAll(map); } public void setHeaders(Map map) { headers.putAll(map); } public java.util.Vector getHeaders(String headerName) { return (java.util.Vector) headers.get(headerName.toLowerCase()); } public String getHeader(String headerName) { String result = null; java.util.Vector v = getHeaders(headerName); if (v != null && !v.isEmpty()) { result = (String) v.get(0); } return result; } protected void startHead(java.io.PrintWriter out) { out.println(""); out.println(""); out.print(""); } protected void head(java.io.PrintWriter out) throws Exception { } protected void endHead(java.io.PrintWriter out) { out.println(""); } protected void linkStyle(String fileScreen, String filePrint, java.io.PrintWriter out) { StringBuilder sb = new StringBuilder(); sb.append("\n"); sb.append(""); } else { sb.append("\">"); } out.println(sb.substring(0)); } protected void linkScript(String file, java.io.PrintWriter out) { out.print(""); } protected void writeScript(String text, java.io.PrintWriter out) { out.println(""); } protected void title(String prefix, String title, java.io.PrintWriter out) { StringBuilder sb = new StringBuilder(200); sb.append(""); if (prefix != null) { sb.append(filter(prefix)).append(" - "); } sb.append(filter(title)); sb.append(""); out.println(sb.substring(0)); } protected void startBody(java.io.PrintWriter out) { out.println(""); } protected void body(java.io.PrintWriter out) throws Exception { } protected void endBody(java.io.PrintWriter out) { out.println(""); out.println(""); } public static String filter(String input) { String result = (input == null ? "" : input); if (input != null && input.length() > 0) { StringBuilder filtered = new StringBuilder(input.length()); char c; for (int i = 0; i < input.length(); i++) { c = input.charAt(i); String s = null; switch (c) { case '<': s = "<"; break; case '>': s = ">"; break; case '"': s = """; break; case '&': s = "&"; break; } if (s != null) { filtered.append(s); } else { filtered.append(c); } } result = filtered.substring(0); } return result; } public static String escape(String input) { String result = input; if (input != null && input.length() > 0) { StringBuilder filtered = new StringBuilder(input.length()); char c; for (int i = 0; i < input.length(); i++) { c = input.charAt(i); String s = null; switch (c) { case '\'': s = "\\'"; break; case '\\': s = "\\\\"; break; } if (s != null) { filtered.append(s); } else { filtered.append(c); } } result = filtered.substring(0); } return result; } public static String toNbsp(String src) { StringBuilder sb = new StringBuilder(src == null ? 0 : src.length() * 2); if (src != null) { StringTokenizer st = new StringTokenizer(src); if (st.hasMoreTokens()) { while (true) { sb.append(st.nextToken()); if (st.hasMoreTokens()) { sb.append(" "); } else { break; } } } } return sb.substring(0); } public static void setDirectResources(boolean v) { DIRECT_RESOURCES = v; } protected static String resourceUrl(String resource) { String result = resource; if (!DIRECT_RESOURCES) { StringBuilder sb = new StringBuilder(50); sb.append("resource?id=").append(resource); result = sb.substring(0); } return result; } private static SimpleDateFormat HTTP_DF; public static String httpDate(Date date) { if (HTTP_DF == null) { HTTP_DF = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); HTTP_DF.setTimeZone(TimeZone.getTimeZone("GMT")); } return HTTP_DF.format(date); } } src/report/reportServlets/edu/xtec/servlet/ResourceRP.java000066400000000000000000000057071335566474600243570ustar00rootroot00000000000000/* * File : ResourceRP.java * Created : 23-jan-2003 10:42 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.servlet; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class ResourceRP extends RequestProcessor { protected String objectName; protected byte[] objectData; public static final String ID = "id", LAST_MODIFIED = "Last-Modified"; public static final String RESOURCE_BASE = "html/"; protected static Map objects = new HashMap(); protected static String dateStr = httpDate(new java.util.Date()); /** Creates a new instance of ResourceRP */ public ResourceRP() { super(); } @Override public boolean noCache() { return false; } @Override public boolean init() throws Exception { objectName = getParam(ID); if (objectName != null) { objectData = (byte[]) objects.get(objectName); if (objectData == null) { try { StringBuilder sb = new StringBuilder(RESOURCE_BASE); sb.append(objectName); objectData = edu.xtec.util.ResourceManager.getResourceBytes(sb.substring(0)); objects.put(objectName, objectData); } catch (Exception ex) { errCode = HTTP_NOT_FOUND; errMsg = objectName + " not found!"; } } } else { errCode = HTTP_BAD_REQUEST; errMsg = "Unespecified object id!"; } return true; }; @Override public void header(List v) { super.header(v); if (objectData != null) { String ct = null; if (objectName.endsWith(".gif")) ct = "image/gif"; else if (objectName.endsWith(".jpg")) ct = "text/jpg"; else if (objectName.endsWith(".css")) ct = "text/css"; if (ct != null) { v.add(new String[] { CONTENT_TYPE, ct }); } v.add(new String[] { CONTENT_LENGTH, Integer.toString(objectData.length) }); v.add(new String[] { EXTRA, LAST_MODIFIED, dateStr }); } } @Override public boolean usesWriter() { return false; } @Override public void process(java.io.OutputStream out) throws Exception { if (objectData != null) out.write(objectData, 0, objectData.length); } } src/report/webApp/000077500000000000000000000000001335566474600144215ustar00rootroot00000000000000src/report/webApp/META-INF/000077500000000000000000000000001335566474600155615ustar00rootroot00000000000000src/report/webApp/META-INF/context.xml000066400000000000000000000002321335566474600177640ustar00rootroot00000000000000 src/report/webApp/WEB-INF/000077500000000000000000000000001335566474600154505ustar00rootroot00000000000000src/report/webApp/WEB-INF/classes/000077500000000000000000000000001335566474600171055ustar00rootroot00000000000000src/report/webApp/WEB-INF/classes/edu/000077500000000000000000000000001335566474600176625ustar00rootroot00000000000000src/report/webApp/WEB-INF/classes/edu/xtec/000077500000000000000000000000001335566474600206255ustar00rootroot00000000000000src/report/webApp/WEB-INF/classes/edu/xtec/jclic/000077500000000000000000000000001335566474600217115ustar00rootroot00000000000000src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/000077500000000000000000000000001335566474600232245ustar00rootroot00000000000000src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/000077500000000000000000000000001335566474600247105ustar00rootroot00000000000000src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/ActReport.java000066400000000000000000000021221335566474600274530ustar00rootroot00000000000000/* * File : ActReport.java * Created : 12-feb-2003 12:55 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class ActReport extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.ActReport(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/ContextParamsReader.java000066400000000000000000000050331335566474600314670ustar00rootroot00000000000000/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package edu.xtec.jclic.report.servlet; import edu.xtec.jclic.report.rp.ReportsRequestProcessor; import java.util.Enumeration; import java.util.Properties; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * Web application lifecycle listener. * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.09 */ public class ContextParamsReader implements ServletContextListener { public static final String PREFIX_ENV_KEY = "PREFIX_ENV_KEY"; public static final String PREFIX_KEY = "PREFIX_KEY"; public static final String PREFIX_SEP = "_"; public void contextInitialized(ServletContextEvent sce) { javax.servlet.ServletContext sc = sce.getServletContext(); try { // Read defaut values ReportsRequestProcessor.loadProperties(null); Properties prop = ReportsRequestProcessor.getProperties(); String prefixKey = null; // Try to find the name of the environment variable containing // the prefix key String prefixEnvKey = sc.getInitParameter(PREFIX_ENV_KEY); if (prefixEnvKey == null) prefixEnvKey = prop.getProperty(PREFIX_ENV_KEY); if (prefixEnvKey != null) prefixKey = System.getenv(prefixEnvKey); // No environment variable set, then try to find the prefix key // directly if (prefixKey == null) { prefixKey = sc.getInitParameter(PREFIX_KEY); if (prefixKey == null) prefixKey = prop.getProperty(PREFIX_KEY); } if (prefixKey != null && !prefixKey.endsWith(PREFIX_SEP)) prefixKey = prefixKey + PREFIX_SEP; // Read properties stored in web.xml Enumeration en = sc.getInitParameterNames(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); if (prefixKey == null || key.startsWith(prefixKey) || key.indexOf(PREFIX_SEP) < 0) { String value = sc.getInitParameter(key); if (value != null && value.length() > 0) { String realKey = prefixKey == null || key.indexOf(PREFIX_SEP) < 0 ? key : key.substring(prefixKey.length()); prop.put(realKey, value); } } } // Values stored in local properties file have always preference ReportsRequestProcessor.loadLocalProperties(null); } catch (Exception ex) { System.err.println("Error reading initial parameters: " + ex); } } public void contextDestroyed(ServletContextEvent sce) { } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/DbAdmin.java000066400000000000000000000021141335566474600270470ustar00rootroot00000000000000/* * File : DbAdmin.java * Created : 12-feb-2003 12:50 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class DbAdmin extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.DbAdmin(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/GroupAdmin.java000066400000000000000000000021251335566474600276200ustar00rootroot00000000000000/* * File : GroupAdmin.java * Created : 18-feb-2003 13:31 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class GroupAdmin extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.GroupAdmin(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/GroupReport.java000066400000000000000000000021301335566474600300370ustar00rootroot00000000000000/* * File : GroupReport.java * Created : 11-feb-2003 15:32 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class GroupReport extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.GroupReport(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/Img.java000066400000000000000000000021001335566474600262600ustar00rootroot00000000000000/* * File : Img.java * Created : 03-feb-2003 16:49 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class Img extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.Img(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/JClicReportService.java000066400000000000000000000021551335566474600312570ustar00rootroot00000000000000/* * File : JClicReportService.java * Created : 27-mar-2003 12:45 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class JClicReportService extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.JClicReportService(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/Login.java000066400000000000000000000021061335566474600266220ustar00rootroot00000000000000/* * File : Login.java * Created : 12-jan-2003 12:34 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class Login extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.Login(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/Main.java000066400000000000000000000021031335566474600264330ustar00rootroot00000000000000/* * File : Main.java * Created : 23-jan-2003 12:23 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class Main extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.Main(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/Resource.java000066400000000000000000000020701335566474600273410ustar00rootroot00000000000000/* * File : Resource.java * Created : 23-jan-2003 13:13 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class Resource extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new ResourceRP(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/UserAdmin.java000066400000000000000000000021221335566474600274370ustar00rootroot00000000000000/* * File : UserAdmin.java * Created : 19-feb-2003 19:00 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class UserAdmin extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.UserAdmin(); } } src/report/webApp/WEB-INF/classes/edu/xtec/jclic/report/servlet/UserReport.java000066400000000000000000000021251335566474600276650ustar00rootroot00000000000000/* * File : UserReport.java * Created : 25-jan-2003 18:58 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2018 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.servlet; import edu.xtec.servlet.*; /** * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class UserReport extends AbstractServlet { protected RequestProcessor createRP() throws Exception { return new edu.xtec.jclic.report.rp.UserReport(); } } src/report/webApp/WEB-INF/sun-web.xml000066400000000000000000000010021335566474600175430ustar00rootroot00000000000000 /reportsWebApp Keep a copy of the generated servlet class' java code. src/report/webApp/WEB-INF/web.xml000066400000000000000000000121641335566474600167530ustar00rootroot00000000000000 dbDriver JNDI dbServer jdbc/pool/ClicConnectionPoolDS dbMapStatements false dbLogFile jclicReportsDBConnection.log dbDebugLevel 2 dbLogAppend true tablePrefix EDU_JCLIC_ edu.xtec.jclic.report.servlet.ContextParamsReader login login edu.xtec.jclic.report.servlet.Login main main edu.xtec.jclic.report.servlet.Main resource resource edu.xtec.jclic.report.servlet.Resource dbAdmin dbAdmin edu.xtec.jclic.report.servlet.DbAdmin userReport userReport edu.xtec.jclic.report.servlet.UserReport img img img edu.xtec.jclic.report.servlet.Img groupReport edu.xtec.jclic.report.servlet.GroupReport actReport edu.xtec.jclic.report.servlet.ActReport groupAdmin edu.xtec.jclic.report.servlet.GroupAdmin userAdmin edu.xtec.jclic.report.servlet.UserAdmin JClicReportService JClicReportService edu.xtec.jclic.report.servlet.JClicReportService main /main login /login resource /resource dbAdmin /dbAdmin userReport /userReport img /img groupReport /groupReport actReport /actReport groupAdmin /groupAdmin userAdmin /userAdmin JClicReportService /JClicReportService 30 index.jsp index.html index.htm login src/report/webApp/basic.css000066400000000000000000000040031335566474600162110ustar00rootroot00000000000000body { background-color: #FFFFFF; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; } tr, td { font-size: 10pt; } a:link { color: #006699; text-decoration: none; } a:visited { color: #006699; text-decoration: none; } a:hover { color: #dd6900; text-decoration: underline } a:active { color: #ff0000; } h1 { font-weight: bold; font-size: 14pt; color: #235A5A; background-image: url(icon_reports.gif); background-repeat: no-repeat; background-position: left bottom; padding-left: 70px; vertical-align: bottom; padding-top: 15px; padding-bottom: 4px; display: block; font-family: Arial, Helvetica, sans-serif; margin-bottom: 0px; border-bottom-width: 2px; border-bottom-style: solid; } h2 { font-weight: bold; font-size: 10pt; color: purple } .menu { font-size: 11pt; line-height: 30px; font-weight: bold; } .cap { font-size: 14pt; color: #235A5A; background-color: #EFF7DD; font-weight: bold; font-family: Arial, Helvetica, sans-serif; } .topMenu { font-size: 8pt; font-weight: bold; padding-bottom: 3px; padding-top: 3px; margin-top: 0px; margin-bottom: 30px; } .info { background-color: #FFFFCC; border: 1px solid; padding: 5px; margin-top: 10px; margin-bottom: 10px; float: left; } .tblA { border-collapse: separate; border-spacing: 1px; } .tblA td { font-size: 8pt; background-color:#eeeeee; padding: 3px; } .tblA th { font-size: 8pt; background-color:#add8e6; padding: 3px; } #t2x td{ background-color: #f0f8ff } #t2x th{ background-color: #a6caf0; } #t2x #green{ background-color: #90ee90; text-align:center; } #t2x #red{ background-color: #ff7f50; text-align:center; } .inputForm { text-align: right; float: left; vertical-align: top; margin-right: 10px; } #compact p { margin: 2px 0px; } .inputForm p{ margin: 5px 0px; vertical-align: middle; } src/report/webApp/basic_print.css000066400000000000000000000033171335566474600174340ustar00rootroot00000000000000body { background-color: #FFFFFF; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; } tr, td { font-size: 10pt; } a:link { color: black; text-decoration: none; } a:active { color: black; text-decoration: none; } a:visited { color: black; text-decoration: none; } h1 { font-weight: bold; font-size: 14pt; color: #235A5A; background-image: url(icon_reports.gif); background-repeat: no-repeat; background-position: left bottom; padding-left: 70px; vertical-align: bottom; padding-top: 15px; padding-bottom: 4px; display: block; font-family: Arial, Helvetica, sans-serif; margin-bottom: 0px; border-bottom-width: 2px; border-bottom-style: solid; } h2 { font-weight: bold; font-size: 10pt; } .menu { font-size: 11pt; line-height: 30px; font-weight: bold; } .cap { font-size: 14pt; color: #235A5A; background-color: #EFF7DD; font-weight: bold; font-family: Arial, Helvetica, sans-serif; } .topMenu { display: none; } .info { background-color: #FFFFCC; border: 1px solid; padding: 5px; margin-top: 10px; margin-bottom: 10px; float: left; } .tblA { border-collapse: collapse; } .tblA td { border: 1px solid; font-size: 8pt; padding: 3px; } .tblA th { border: 1px solid; font-size: 8pt; padding: 3px; } #t2x td{ background-color: #f0f8ff } #t2x th{ background-color: #a6caf0; } #t2x #green{ background-color: #90ee90; text-align:center; } #t2x #red{ background-color: #ff7f50; text-align:center; } .inputForm { text-align: right; float: left; vertical-align: top; margin-right: 10px; margin-bottom: 10px; } #compact p { margin: 2px 0px; } .inputForm p{ margin: 5px 0px; vertical-align: middle; } #noPrint{ display: none; }src/report/webApp/icon_reports.gif000066400000000000000000000024671335566474600176270ustar00rootroot00000000000000GIF89a<<Tkhƨȳs(ր2vYdӹ㼠`z3=%ۨzKғ~rƧx[Ȫ}β|!áooγĥx27V` ݳ٤߳R}޵t.{͇ϺvC mhk,]˯Ԙֿğްό^c^ ySt;5ȪεXbۥן!{,<<{s4eXXq00SbeJ>\mD2o Q40>Va "[B? DG%@KF9pCȌ?F(ϼ>&(Ddt܊z@G JR]0JЫG80Ç5YA>0ₑB E6"r50!Tt-}Hp4!*M ED.]) dxmɃ&ipn 5QUT[,ҵl&#A\8cWֶ,{Ø6Րo Z\pD>`tɈװ_?y!dĆ:ma= N|8<#|Ƌ"#Nh~7]|$"Dp0B B߿@f:p "DHgO0@}xI@& "b  >DNjP\0ĄWLvi1"X !F%Zbh=Ul A频1$t|qBQ%D!t6Ve&N[ [:F +g)0Ty0(Y0Afog -h-\@V2%g8~Ip¨VX)hd:Vkebױ.6[RmRvI-ήb*eծqRJ. jR^܎k>B*޹.&{g ,nn q#2L1;ok0aHnm 2"W\ _?rĭn>w'$|-$tҢ6,FZIS$1,^Ӷd{`0 n   H 3Pqw)n'8$;src/report/webApp/index.html000066400000000000000000000006531335566474600164220ustar00rootroot00000000000000 JClic reports

 
JClic reports

Enter

src/report/webApp/menys.gif000066400000000000000000000000711335566474600162410ustar00rootroot00000000000000GIF89a !, ^Lye|;src/report/webApp/mes.gif000066400000000000000000000000711335566474600156720ustar00rootroot00000000000000GIF89a !,  "Ks,S;xml/000077500000000000000000000000001335566474600117015ustar00rootroot00000000000000xml/jclic.xsd000066400000000000000000001043741335566474600135160ustar00rootroot00000000000000 Main element of JClic projects Deprecated attribute. Please use imgAlign and txtAlign instead of hAlign and vAlign Deprecated attribute. Please use imgAlign and txtAlign instead of hAlign and vAlign xml/skin.dtd000066400000000000000000000050341335566474600133440ustar00rootroot00000000000000 xml/skin.xml000066400000000000000000000065631335566474600134010ustar00rootroot00000000000000 xml/skin.xsd000066400000000000000000000236641335566474600134000ustar00rootroot00000000000000